*** empty log message ***
[dana/urxvt.git] / W11 / wrap / wrap.c
1
2 #include <X11/Xlib.h>
3 #include <windows.h>
4 #include <stdio.h>
5 #include <stdlib.h>
6 #include <malloc.h>
7 #include "wrap.h"
8
9 void __cdecl WinMainCRTStartup(void) { mainCRTStartup(); }
10
11 static void *_lib=NULL;
12 static char *_libname = NULL;
13
14 static void *_loadfunc(char *name)
15 {
16         void *f = NULL;
17         if (_lib==NULL) {
18                 if (_libname==NULL) {
19                         fprintf(stderr,"%s called before XOpenDisplay!\n",name);
20                         exit(3);
21                 }
22                 _lib = LoadLibrary(_libname);
23                 if (_lib == NULL) {
24                         fprintf(stderr,"failed to load %s.dll\n",_libname);
25                         exit(1);
26                 }
27         }
28         f = GetProcAddress(_lib,name);
29         if (f==NULL) {
30                 fprintf(stderr,"failed to find %s\n",name);
31                 exit(2);
32         }       
33         return f;
34 }
35
36 static void _freelib()
37 {
38         FreeLibrary(_lib);
39         _lib=NULL;
40 }
41 typedef LONG (proto_WndProc)(HWND hWnd,UINT message,UINT wParam,LONG lParam);
42 static proto_WndProc *func_WndProc = NULL;
43 LONG __stdcall WndProc(HWND hWnd,UINT message,UINT wParam,LONG lParam)
44 {
45         if (!func_WndProc) func_WndProc=(proto_WndProc *)_loadfunc("NT_handleMsg");
46         return (func_WndProc)(hWnd,message,wParam,lParam);
47 }
48
49 static void
50 hideConsole()
51 {
52         HWND conwin;
53         HANDLE hConsole;
54         CONSOLE_SCREEN_BUFFER_INFO buffInfo;
55         SECURITY_ATTRIBUTES  sa;
56
57         char app_name[40];
58         sprintf(app_name, "rxvt%08x", (unsigned int)GetCurrentThreadId());
59         /* from eConsole source */
60         sa.nLength = sizeof(sa);
61         sa.bInheritHandle = TRUE;
62         sa.lpSecurityDescriptor = NULL; 
63         hConsole = CreateFile( "CONOUT$", GENERIC_WRITE | GENERIC_READ,
64                                                    FILE_SHARE_READ | FILE_SHARE_WRITE, &sa,     
65                                                    OPEN_EXISTING, 0, 0 );
66         if (GetConsoleScreenBufferInfo(hConsole,&buffInfo) &&
67                 buffInfo.dwCursorPosition.X==0 &&
68                 buffInfo.dwCursorPosition.Y==0)
69         {
70                 /* find the console window, from eConsole source */
71                 SetConsoleTitle( app_name );
72                 while ((conwin = FindWindow( NULL, app_name))==NULL)
73                         Sleep( 40 );
74                 ShowWindowAsync(conwin, SW_HIDE);
75         }
76 }
77
78
79 ATOM
80 _register_window_class()
81 {
82         WNDCLASS  wc;
83         HANDLE    curInstance = GetModuleHandleA(NULL);
84         char app_name[40];
85         sprintf(app_name, "rxvt%08x", (unsigned int)GetCurrentThreadId());      
86         hideConsole();
87         wc.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC; /* CS_OWNDC */
88         wc.lpfnWndProc = WndProc;
89         wc.cbClsExtra = 0;
90         wc.cbWndExtra = 0;
91         wc.hInstance = curInstance;
92         wc.hIcon = LoadIcon(curInstance, MAKEINTRESOURCE( IDI_RXVT ));
93         wc.hCursor =  LoadCursor(NULL, IDC_ARROW);
94         wc.hbrBackground = NULL;
95         wc.lpszMenuName =  NULL;
96         wc.lpszClassName = app_name;
97         return RegisterClass(&wc);
98 }
99
100 typedef void (proto_NT_SetAtom)(ATOM class);
101 static proto_NT_SetAtom *func_NT_SetAtom = NULL;
102 void _set_atom(ATOM class)
103 {
104         if (!func_NT_SetAtom) func_NT_SetAtom=(proto_NT_SetAtom *)_loadfunc("NT_SetAtom");
105         (func_NT_SetAtom)(class);
106 }
107
108 typedef void (proto_W11AddEventHandler)(Display *d, proto_W11EventHandler *ev);
109 static proto_W11AddEventHandler *func_W11AddEventHandler = NULL;
110 void W11AddEventHandler(Display *d, proto_W11EventHandler *ev)
111 {
112         if (func_W11AddEventHandler) 
113             (func_W11AddEventHandler)(d,ev);
114 }
115
116 typedef Display * (proto_XOpenDisplay)(const char *name);
117 static proto_XOpenDisplay *func_XOpenDisplay = NULL;
118 Display * XOpenDisplay(const char *name) {
119     ATOM class;
120     char *env_var=NULL;
121     if (_libname==NULL)
122     {
123         env_var = getenv("W11_LIBRARY");
124         if (env_var!=NULL) _libname = strdup(env_var);
125         else if (name==NULL || !strcmp(name,":0")) {
126             _libname="libW11";
127             class = _register_window_class();
128             _set_atom(class);
129             func_W11AddEventHandler=(proto_W11AddEventHandler *)_loadfunc("W11AddEventHandler");
130         }       
131         else _libname="libX11";
132     }
133     if (!func_XOpenDisplay) func_XOpenDisplay=(proto_XOpenDisplay *)_loadfunc("XOpenDisplay");
134     return (func_XOpenDisplay)(name);
135 }
136
137 typedef struct {
138     char    *name;
139     XPointer value;
140 } XIMArg;
141
142 static void
143 _XIMVaToList(va_list var, XIMArg *args)
144 {
145     char   *attr;
146         int i = 0;
147     if (!args) return;
148     for (attr = va_arg(var, char*); attr && i<11; attr = va_arg(var, char*)) {
149             args->name = attr;
150             args->value = va_arg(var, XPointer);
151             args++;
152                 i++;
153     }
154         for(;i<11;i++) {
155                 args->name=NULL;
156                 args->value=NULL;
157                 args++;
158         }
159 }
160
161 typedef XIC (proto_XCreateIC)(XIM im, ...);
162 static proto_XCreateIC *func_XCreateIC = NULL;
163 XIC
164 XCreateIC(XIM im, ...)
165 {
166     va_list var;
167     XIMArg a[11];
168
169     va_start(var, im);
170     _XIMVaToList(var, a);
171     va_end(var);
172         
173         if (a[10].name!=NULL) {
174                 fprintf(stderr,"call to XCreateIC with more than 20 args\n");
175                 exit(5);
176         }
177         
178         if (!func_XCreateIC) func_XCreateIC=(proto_XCreateIC *)_loadfunc("XCreateIC");
179         return (func_XCreateIC)(im,
180                                                    a[0].name, a[0].value,
181                                                    a[1].name, a[1].value,
182                                                    a[2].name, a[2].value,
183                                                    a[3].name, a[3].value,
184                                                    a[4].name, a[4].value,
185                                                    a[5].name, a[5].value,
186                                                    a[6].name, a[6].value,
187                                                    a[7].name, a[7].value,
188                                                    a[8].name, a[8].value,
189                                                    a[9].name, a[9].value,
190                                                    NULL);
191 }
192
193 typedef char * (proto_XGetIMValues)(XIM im, ...);
194 static proto_XGetIMValues *func_XGetIMValues = NULL;
195 char *
196 XGetIMValues(XIM im, ...)
197 {
198     va_list var;
199     XIMArg a[11];
200
201     va_start(var, im);
202     _XIMVaToList(var, a);
203     va_end(var);
204         
205         if (a[10].name!=NULL) {
206                 fprintf(stderr,"call to XGetIMValues with more than 20 args\n");
207                 exit(5);
208         }
209
210         if (!func_XGetIMValues) func_XGetIMValues=(proto_XGetIMValues *)_loadfunc("XGetIMValues");
211         return (func_XGetIMValues)(im,
212                                                    a[0].name, a[0].value,
213                                                    a[1].name, a[1].value,
214                                                    a[2].name, a[2].value,
215                                                    a[3].name, a[3].value,
216                                                    a[4].name, a[4].value,
217                                                    a[5].name, a[5].value,
218                                                    a[6].name, a[6].value,
219                                                    a[7].name, a[7].value,
220                                                    a[8].name, a[8].value,
221                                                    a[9].name, a[9].value,
222                                                    NULL);
223 }
224
225
226 #include "xwrappers.gen"