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