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 
WinMainCRTStartup(void)9 void __cdecl WinMainCRTStartup(void) { mainCRTStartup(); }
10 
11 static void *_lib=NULL;
12 static char *_libname = NULL;
13 
_loadfunc(char * name)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 
_freelib()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;
WndProc(HWND hWnd,UINT message,UINT wParam,LONG lParam)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
hideConsole()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, "xvt%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
_register_window_class()80 _register_window_class()
81 {
82 	WNDCLASS  wc;
83 	HANDLE    curInstance = GetModuleHandleA(NULL);
84 	char app_name[40];
85 	sprintf(app_name, "xvt%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_XVT ));
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;
_set_atom(ATOM class)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;
W11AddEventHandler(Display * d,proto_W11EventHandler * ev)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;
XOpenDisplay(const char * name)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
_XIMVaToList(va_list var,XIMArg * args)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
XCreateIC(XIM im,...)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 *
XGetIMValues(XIM im,...)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"
227