1 /**
2  * WinPR: Windows Portable Runtime
3  * Window Notification System
4  *
5  * Copyright 2014 Marc-Andre Moreau <marcandre.moreau@gmail.com>
6  *
7  * Licensed under the Apache License, Version 2.0 (the "License");
8  * you may not use this file except in compliance with the License.
9  * You may obtain a copy of the License at
10  *
11  *     http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing, software
14  * distributed under the License is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18  */
19 
20 #ifdef HAVE_CONFIG_H
21 #include "config.h"
22 #endif
23 
24 #include <winpr/crt.h>
25 #include <winpr/collections.h>
26 
27 #include <winpr/wnd.h>
28 
29 #ifndef _WIN32
30 
31 #include "wnd.h"
32 
33 /**
34  * Custom Functions
35  */
36 
37 static wArrayList* g_WindowClasses = NULL;
38 
InitializeWindowClasses(void)39 static BOOL InitializeWindowClasses(void)
40 {
41 	if (g_WindowClasses)
42 		return TRUE;
43 
44 	g_WindowClasses = ArrayList_New(TRUE);
45 	return g_WindowClasses != NULL;
46 }
47 
CloneWindowClass(CONST WNDCLASSEXA * lpwcx)48 static WNDCLASSEXA* CloneWindowClass(CONST WNDCLASSEXA* lpwcx)
49 {
50 	WNDCLASSEXA* _lpwcx = NULL;
51 
52 	_lpwcx = malloc(sizeof(WNDCLASSEXA));
53 
54 	if (!_lpwcx)
55 		return NULL;
56 
57 	CopyMemory(_lpwcx, lpwcx, sizeof(WNDCLASSEXA));
58 
59 	_lpwcx->lpszClassName = _strdup(lpwcx->lpszClassName);
60 	_lpwcx->lpszMenuName = _strdup(lpwcx->lpszMenuName);
61 	if (!_lpwcx->lpszClassName || !_lpwcx->lpszMenuName)
62 	{
63 		free((LPSTR)_lpwcx->lpszClassName);
64 		free((LPSTR)_lpwcx->lpszMenuName);
65 		free(_lpwcx);
66 		return NULL;
67 	}
68 
69 	return _lpwcx;
70 }
71 
FindWindowClass(LPCSTR lpClassName)72 static WNDCLASSEXA* FindWindowClass(LPCSTR lpClassName)
73 {
74 	int index;
75 	int count;
76 	BOOL found = FALSE;
77 	WNDCLASSEXA* lpwcx = NULL;
78 
79 	ArrayList_Lock(g_WindowClasses);
80 
81 	count = ArrayList_Count(g_WindowClasses);
82 
83 	for (index = 0; index < count; index++)
84 	{
85 		lpwcx = (WNDCLASSEXA*)ArrayList_GetItem(g_WindowClasses, index);
86 
87 		if (strcmp(lpClassName, lpwcx->lpszClassName) == 0)
88 		{
89 			found = TRUE;
90 			break;
91 		}
92 	}
93 
94 	ArrayList_Unlock(g_WindowClasses);
95 
96 	return (found) ? lpwcx : NULL;
97 }
98 
99 /**
100  * Standard Functions
101  */
102 
GetWindowWord(HWND hWnd,int nIndex)103 WORD WINAPI GetWindowWord(HWND hWnd, int nIndex)
104 {
105 	return 0;
106 }
107 
SetWindowWord(HWND hWnd,int nIndex,WORD wNewWord)108 WORD WINAPI SetWindowWord(HWND hWnd, int nIndex, WORD wNewWord)
109 {
110 	return 0;
111 }
112 
GetWindowLongA(HWND hWnd,int nIndex)113 LONG WINAPI GetWindowLongA(HWND hWnd, int nIndex)
114 {
115 	return 0;
116 }
117 
GetWindowLongW(HWND hWnd,int nIndex)118 LONG WINAPI GetWindowLongW(HWND hWnd, int nIndex)
119 {
120 	return 0;
121 }
122 
SetWindowLongA(HWND hWnd,int nIndex,LONG dwNewLong)123 LONG WINAPI SetWindowLongA(HWND hWnd, int nIndex, LONG dwNewLong)
124 {
125 	return 0;
126 }
127 
SetWindowLongW(HWND hWnd,int nIndex,LONG dwNewLong)128 LONG WINAPI SetWindowLongW(HWND hWnd, int nIndex, LONG dwNewLong)
129 {
130 	return 0;
131 }
132 
GetWindowLongPtrA(HWND hWnd,int nIndex)133 LONG_PTR WINAPI GetWindowLongPtrA(HWND hWnd, int nIndex)
134 {
135 	return 0;
136 }
137 
GetWindowLongPtrW(HWND hWnd,int nIndex)138 LONG_PTR WINAPI GetWindowLongPtrW(HWND hWnd, int nIndex)
139 {
140 	return 0;
141 }
142 
SetWindowLongPtrA(HWND hWnd,int nIndex,LONG_PTR dwNewLong)143 LONG_PTR WINAPI SetWindowLongPtrA(HWND hWnd, int nIndex, LONG_PTR dwNewLong)
144 {
145 	return 0;
146 }
147 
SetWindowLongPtrW(HWND hWnd,int nIndex,LONG_PTR dwNewLong)148 LONG_PTR WINAPI SetWindowLongPtrW(HWND hWnd, int nIndex, LONG_PTR dwNewLong)
149 {
150 	return 0;
151 }
152 
DestroyWindow(HWND hWnd)153 BOOL WINAPI DestroyWindow(HWND hWnd)
154 {
155 	WINPR_WND* pWnd;
156 
157 	pWnd = (WINPR_WND*)hWnd;
158 
159 	if (!pWnd)
160 		return FALSE;
161 
162 	free(pWnd->lpClassName);
163 
164 	free(pWnd->lpWindowName);
165 
166 	free(pWnd);
167 
168 	return TRUE;
169 }
170 
PostQuitMessage(int nExitCode)171 VOID WINAPI PostQuitMessage(int nExitCode)
172 {
173 }
174 
RegisterClassA(CONST WNDCLASSA * lpWndClass)175 ATOM WINAPI RegisterClassA(CONST WNDCLASSA* lpWndClass)
176 {
177 	return 1;
178 }
179 
RegisterClassW(CONST WNDCLASSW * lpWndClass)180 ATOM WINAPI RegisterClassW(CONST WNDCLASSW* lpWndClass)
181 {
182 	return 1;
183 }
184 
RegisterClassExA(CONST WNDCLASSEXA * lpwcx)185 ATOM WINAPI RegisterClassExA(CONST WNDCLASSEXA* lpwcx)
186 {
187 	WNDCLASSEXA* _lpwcx;
188 
189 	if (!InitializeWindowClasses())
190 		return 0;
191 
192 	_lpwcx = CloneWindowClass(lpwcx);
193 
194 	return ArrayList_Add(g_WindowClasses, (void*)_lpwcx) >= 0;
195 }
196 
RegisterClassExW(CONST WNDCLASSEXW * lpwcx)197 ATOM WINAPI RegisterClassExW(CONST WNDCLASSEXW* lpwcx)
198 {
199 	return 1;
200 }
201 
UnregisterClassA(LPCSTR lpClassName,HINSTANCE hInstance)202 BOOL WINAPI UnregisterClassA(LPCSTR lpClassName, HINSTANCE hInstance)
203 {
204 	return TRUE;
205 }
206 
UnregisterClassW(LPCWSTR lpClassName,HINSTANCE hInstance)207 BOOL WINAPI UnregisterClassW(LPCWSTR lpClassName, HINSTANCE hInstance)
208 {
209 	return TRUE;
210 }
211 
CreateWindowExA(DWORD dwExStyle,LPCSTR lpClassName,LPCSTR lpWindowName,DWORD dwStyle,int X,int Y,int nWidth,int nHeight,HWND hWndParent,HMENU hMenu,HINSTANCE hInstance,LPVOID lpParam)212 HWND WINAPI CreateWindowExA(DWORD dwExStyle, LPCSTR lpClassName, LPCSTR lpWindowName, DWORD dwStyle,
213                             int X, int Y, int nWidth, int nHeight, HWND hWndParent, HMENU hMenu,
214                             HINSTANCE hInstance, LPVOID lpParam)
215 {
216 	HWND hWnd;
217 	WINPR_WND* pWnd;
218 	WNDCLASSEXA* lpwcx;
219 
220 	InitializeWindowClasses();
221 
222 	if (!lpClassName)
223 		return NULL;
224 
225 	lpwcx = FindWindowClass(lpClassName);
226 
227 	if (!lpwcx)
228 		return NULL;
229 
230 	pWnd = (WINPR_WND*)calloc(1, sizeof(WINPR_WND));
231 
232 	if (!pWnd)
233 		return NULL;
234 
235 	hWnd = (HWND)pWnd;
236 
237 	pWnd->X = X;
238 	pWnd->Y = Y;
239 	pWnd->nWidth = nWidth;
240 	pWnd->nHeight = nHeight;
241 	pWnd->lpClassName = _strdup(lpClassName);
242 	if (!pWnd->lpClassName)
243 		goto out_fail;
244 
245 	if (lpWindowName)
246 	{
247 		pWnd->lpWindowName = _strdup(lpWindowName);
248 		if (!pWnd->lpWindowName)
249 			goto out_fail;
250 	}
251 
252 	pWnd->hWndParent = hWndParent;
253 	pWnd->hMenu = hMenu;
254 	pWnd->hInstance = hInstance;
255 	pWnd->lpParam = lpParam;
256 	pWnd->lpwcx = lpwcx;
257 
258 	return hWnd;
259 
260 out_fail:
261 	free(pWnd->lpClassName);
262 	free(pWnd->lpWindowName);
263 	free(pWnd);
264 	return NULL;
265 }
266 
CreateWindowExW(DWORD dwExStyle,LPCWSTR lpClassName,LPCWSTR lpWindowName,DWORD dwStyle,int X,int Y,int nWidth,int nHeight,HWND hWndParent,HMENU hMenu,HINSTANCE hInstance,LPVOID lpParam)267 HWND WINAPI CreateWindowExW(DWORD dwExStyle, LPCWSTR lpClassName, LPCWSTR lpWindowName,
268                             DWORD dwStyle, int X, int Y, int nWidth, int nHeight, HWND hWndParent,
269                             HMENU hMenu, HINSTANCE hInstance, LPVOID lpParam)
270 {
271 	return NULL;
272 }
273 
FindWindowA(LPCSTR lpClassName,LPCSTR lpWindowName)274 HWND WINAPI FindWindowA(LPCSTR lpClassName, LPCSTR lpWindowName)
275 {
276 	return NULL;
277 }
278 
FindWindowW(LPCWSTR lpClassName,LPCWSTR lpWindowName)279 HWND WINAPI FindWindowW(LPCWSTR lpClassName, LPCWSTR lpWindowName)
280 {
281 	return NULL;
282 }
283 
FindWindowExA(HWND hWndParent,HWND hWndChildAfter,LPCSTR lpszClass,LPCSTR lpszWindow)284 HWND WINAPI FindWindowExA(HWND hWndParent, HWND hWndChildAfter, LPCSTR lpszClass, LPCSTR lpszWindow)
285 {
286 	return NULL;
287 }
288 
FindWindowExW(HWND hWndParent,HWND hWndChildAfter,LPCWSTR lpszClass,LPCWSTR lpszWindow)289 HWND WINAPI FindWindowExW(HWND hWndParent, HWND hWndChildAfter, LPCWSTR lpszClass,
290                           LPCWSTR lpszWindow)
291 {
292 	return NULL;
293 }
294 
GetMessageA(LPMSG lpMsg,HWND hWnd,UINT wMsgFilterMin,UINT wMsgFilterMax)295 BOOL WINAPI GetMessageA(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax)
296 {
297 	return TRUE;
298 }
299 
GetMessageW(LPMSG lpMsg,HWND hWnd,UINT wMsgFilterMin,UINT wMsgFilterMax)300 BOOL WINAPI GetMessageW(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax)
301 {
302 	return TRUE;
303 }
304 
GetMessagePos(VOID)305 DWORD WINAPI GetMessagePos(VOID)
306 {
307 	return 0;
308 }
309 
GetMessageTime(VOID)310 LONG WINAPI GetMessageTime(VOID)
311 {
312 	return 0;
313 }
314 
GetMessageExtraInfo(VOID)315 LPARAM WINAPI GetMessageExtraInfo(VOID)
316 {
317 	return 0;
318 }
319 
SetMessageExtraInfo(LPARAM lParam)320 LPARAM WINAPI SetMessageExtraInfo(LPARAM lParam)
321 {
322 	return 0;
323 }
324 
SetMessageQueue(int cMessagesMax)325 BOOL WINAPI SetMessageQueue(int cMessagesMax)
326 {
327 	return TRUE;
328 }
329 
SendMessageA(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam)330 LRESULT WINAPI SendMessageA(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
331 {
332 	LRESULT status;
333 	WINPR_WND* pWnd;
334 	WNDPROC lpfnWndProc;
335 
336 	pWnd = (WINPR_WND*)hWnd;
337 
338 	if (!pWnd)
339 		return 0;
340 
341 	lpfnWndProc = pWnd->lpwcx->lpfnWndProc;
342 
343 	if (!lpfnWndProc)
344 		return 0;
345 
346 	status = lpfnWndProc(hWnd, Msg, wParam, lParam);
347 
348 	return status;
349 }
350 
SendMessageW(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam)351 LRESULT WINAPI SendMessageW(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
352 {
353 	return 0;
354 }
355 
SendMessageTimeoutA(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam,UINT fuFlags,UINT uTimeout,PDWORD_PTR lpdwResult)356 LRESULT WINAPI SendMessageTimeoutA(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam, UINT fuFlags,
357                                    UINT uTimeout, PDWORD_PTR lpdwResult)
358 {
359 	return 0;
360 }
361 
SendMessageTimeoutW(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam,UINT fuFlags,UINT uTimeout,PDWORD_PTR lpdwResult)362 LRESULT WINAPI SendMessageTimeoutW(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam, UINT fuFlags,
363                                    UINT uTimeout, PDWORD_PTR lpdwResult)
364 {
365 	return 0;
366 }
367 
SendNotifyMessageA(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam)368 BOOL WINAPI SendNotifyMessageA(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
369 {
370 	return TRUE;
371 }
372 
SendNotifyMessageW(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam)373 BOOL WINAPI SendNotifyMessageW(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
374 {
375 	return TRUE;
376 }
377 
SendMessageCallbackA(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam,SENDASYNCPROC lpResultCallBack,ULONG_PTR dwData)378 BOOL WINAPI SendMessageCallbackA(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam,
379                                  SENDASYNCPROC lpResultCallBack, ULONG_PTR dwData)
380 {
381 	return TRUE;
382 }
383 
SendMessageCallbackW(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam,SENDASYNCPROC lpResultCallBack,ULONG_PTR dwData)384 BOOL WINAPI SendMessageCallbackW(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam,
385                                  SENDASYNCPROC lpResultCallBack, ULONG_PTR dwData)
386 {
387 	return TRUE;
388 }
389 
TranslateMessage(CONST MSG * lpMsg)390 BOOL WINAPI TranslateMessage(CONST MSG* lpMsg)
391 {
392 	return TRUE;
393 }
394 
DispatchMessageA(CONST MSG * lpMsg)395 LRESULT WINAPI DispatchMessageA(CONST MSG* lpMsg)
396 {
397 	return 0;
398 }
399 
DispatchMessageW(CONST MSG * lpMsg)400 LRESULT WINAPI DispatchMessageW(CONST MSG* lpMsg)
401 {
402 	return 0;
403 }
404 
PeekMessageA(LPMSG lpMsg,HWND hWnd,UINT wMsgFilterMin,UINT wMsgFilterMax,UINT wRemoveMsg)405 BOOL WINAPI PeekMessageA(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax,
406                          UINT wRemoveMsg)
407 {
408 	return TRUE;
409 }
410 
PeekMessageW(LPMSG lpMsg,HWND hWnd,UINT wMsgFilterMin,UINT wMsgFilterMax,UINT wRemoveMsg)411 BOOL WINAPI PeekMessageW(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax,
412                          UINT wRemoveMsg)
413 {
414 	return TRUE;
415 }
416 
ReplyMessage(LRESULT lResult)417 BOOL WINAPI ReplyMessage(LRESULT lResult)
418 {
419 	return TRUE;
420 }
421 
WaitMessage(VOID)422 BOOL WINAPI WaitMessage(VOID)
423 {
424 	return TRUE;
425 }
426 
CallWindowProcA(WNDPROC lpPrevWndFunc,HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam)427 LRESULT WINAPI CallWindowProcA(WNDPROC lpPrevWndFunc, HWND hWnd, UINT Msg, WPARAM wParam,
428                                LPARAM lParam)
429 {
430 	return 0;
431 }
432 
CallWindowProcW(WNDPROC lpPrevWndFunc,HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam)433 LRESULT WINAPI CallWindowProcW(WNDPROC lpPrevWndFunc, HWND hWnd, UINT Msg, WPARAM wParam,
434                                LPARAM lParam)
435 {
436 	return 0;
437 }
438 
DefWindowProcA(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam)439 LRESULT WINAPI DefWindowProcA(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
440 {
441 	return 0;
442 }
443 
DefWindowProcW(HWND hWnd,UINT Msg,WPARAM wParam,LPARAM lParam)444 LRESULT WINAPI DefWindowProcW(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
445 {
446 	return 0;
447 }
448 
449 #endif
450