/** * WinPR: Windows Portable Runtime * Window Notification System * * Copyright 2014 Marc-Andre Moreau * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include #include #include #ifndef _WIN32 #include "wnd.h" /** * Custom Functions */ static wArrayList* g_WindowClasses = NULL; static BOOL InitializeWindowClasses(void) { if (g_WindowClasses) return TRUE; g_WindowClasses = ArrayList_New(TRUE); return g_WindowClasses != NULL; } static WNDCLASSEXA* CloneWindowClass(CONST WNDCLASSEXA* lpwcx) { WNDCLASSEXA* _lpwcx = NULL; _lpwcx = malloc(sizeof(WNDCLASSEXA)); if (!_lpwcx) return NULL; CopyMemory(_lpwcx, lpwcx, sizeof(WNDCLASSEXA)); _lpwcx->lpszClassName = _strdup(lpwcx->lpszClassName); _lpwcx->lpszMenuName = _strdup(lpwcx->lpszMenuName); if (!_lpwcx->lpszClassName || !_lpwcx->lpszMenuName) { free((LPSTR)_lpwcx->lpszClassName); free((LPSTR)_lpwcx->lpszMenuName); free(_lpwcx); return NULL; } return _lpwcx; } static WNDCLASSEXA* FindWindowClass(LPCSTR lpClassName) { int index; int count; BOOL found = FALSE; WNDCLASSEXA* lpwcx = NULL; ArrayList_Lock(g_WindowClasses); count = ArrayList_Count(g_WindowClasses); for (index = 0; index < count; index++) { lpwcx = (WNDCLASSEXA*)ArrayList_GetItem(g_WindowClasses, index); if (strcmp(lpClassName, lpwcx->lpszClassName) == 0) { found = TRUE; break; } } ArrayList_Unlock(g_WindowClasses); return (found) ? lpwcx : NULL; } /** * Standard Functions */ WORD WINAPI GetWindowWord(HWND hWnd, int nIndex) { return 0; } WORD WINAPI SetWindowWord(HWND hWnd, int nIndex, WORD wNewWord) { return 0; } LONG WINAPI GetWindowLongA(HWND hWnd, int nIndex) { return 0; } LONG WINAPI GetWindowLongW(HWND hWnd, int nIndex) { return 0; } LONG WINAPI SetWindowLongA(HWND hWnd, int nIndex, LONG dwNewLong) { return 0; } LONG WINAPI SetWindowLongW(HWND hWnd, int nIndex, LONG dwNewLong) { return 0; } LONG_PTR WINAPI GetWindowLongPtrA(HWND hWnd, int nIndex) { return 0; } LONG_PTR WINAPI GetWindowLongPtrW(HWND hWnd, int nIndex) { return 0; } LONG_PTR WINAPI SetWindowLongPtrA(HWND hWnd, int nIndex, LONG_PTR dwNewLong) { return 0; } LONG_PTR WINAPI SetWindowLongPtrW(HWND hWnd, int nIndex, LONG_PTR dwNewLong) { return 0; } BOOL WINAPI DestroyWindow(HWND hWnd) { WINPR_WND* pWnd; pWnd = (WINPR_WND*)hWnd; if (!pWnd) return FALSE; free(pWnd->lpClassName); free(pWnd->lpWindowName); free(pWnd); return TRUE; } VOID WINAPI PostQuitMessage(int nExitCode) { } ATOM WINAPI RegisterClassA(CONST WNDCLASSA* lpWndClass) { return 1; } ATOM WINAPI RegisterClassW(CONST WNDCLASSW* lpWndClass) { return 1; } ATOM WINAPI RegisterClassExA(CONST WNDCLASSEXA* lpwcx) { WNDCLASSEXA* _lpwcx; if (!InitializeWindowClasses()) return 0; _lpwcx = CloneWindowClass(lpwcx); return ArrayList_Append(g_WindowClasses, (void*)_lpwcx); } ATOM WINAPI RegisterClassExW(CONST WNDCLASSEXW* lpwcx) { return 1; } BOOL WINAPI UnregisterClassA(LPCSTR lpClassName, HINSTANCE hInstance) { return TRUE; } BOOL WINAPI UnregisterClassW(LPCWSTR lpClassName, HINSTANCE hInstance) { return TRUE; } HWND WINAPI 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) { HWND hWnd; WINPR_WND* pWnd; WNDCLASSEXA* lpwcx; InitializeWindowClasses(); if (!lpClassName) return NULL; lpwcx = FindWindowClass(lpClassName); if (!lpwcx) return NULL; pWnd = (WINPR_WND*)calloc(1, sizeof(WINPR_WND)); if (!pWnd) return NULL; hWnd = (HWND)pWnd; pWnd->X = X; pWnd->Y = Y; pWnd->nWidth = nWidth; pWnd->nHeight = nHeight; pWnd->lpClassName = _strdup(lpClassName); if (!pWnd->lpClassName) goto out_fail; if (lpWindowName) { pWnd->lpWindowName = _strdup(lpWindowName); if (!pWnd->lpWindowName) goto out_fail; } pWnd->hWndParent = hWndParent; pWnd->hMenu = hMenu; pWnd->hInstance = hInstance; pWnd->lpParam = lpParam; pWnd->lpwcx = lpwcx; return hWnd; out_fail: free(pWnd->lpClassName); free(pWnd->lpWindowName); free(pWnd); return NULL; } HWND WINAPI 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) { return NULL; } HWND WINAPI FindWindowA(LPCSTR lpClassName, LPCSTR lpWindowName) { return NULL; } HWND WINAPI FindWindowW(LPCWSTR lpClassName, LPCWSTR lpWindowName) { return NULL; } HWND WINAPI FindWindowExA(HWND hWndParent, HWND hWndChildAfter, LPCSTR lpszClass, LPCSTR lpszWindow) { return NULL; } HWND WINAPI FindWindowExW(HWND hWndParent, HWND hWndChildAfter, LPCWSTR lpszClass, LPCWSTR lpszWindow) { return NULL; } BOOL WINAPI GetMessageA(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax) { return TRUE; } BOOL WINAPI GetMessageW(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax) { return TRUE; } DWORD WINAPI GetMessagePos(VOID) { return 0; } LONG WINAPI GetMessageTime(VOID) { return 0; } LPARAM WINAPI GetMessageExtraInfo(VOID) { return 0; } LPARAM WINAPI SetMessageExtraInfo(LPARAM lParam) { return 0; } BOOL WINAPI SetMessageQueue(int cMessagesMax) { return TRUE; } LRESULT WINAPI SendMessageA(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam) { LRESULT status; WINPR_WND* pWnd; WNDPROC lpfnWndProc; pWnd = (WINPR_WND*)hWnd; if (!pWnd) return 0; lpfnWndProc = pWnd->lpwcx->lpfnWndProc; if (!lpfnWndProc) return 0; status = lpfnWndProc(hWnd, Msg, wParam, lParam); return status; } LRESULT WINAPI SendMessageW(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam) { return 0; } LRESULT WINAPI SendMessageTimeoutA(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam, UINT fuFlags, UINT uTimeout, PDWORD_PTR lpdwResult) { return 0; } LRESULT WINAPI SendMessageTimeoutW(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam, UINT fuFlags, UINT uTimeout, PDWORD_PTR lpdwResult) { return 0; } BOOL WINAPI SendNotifyMessageA(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam) { return TRUE; } BOOL WINAPI SendNotifyMessageW(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam) { return TRUE; } BOOL WINAPI SendMessageCallbackA(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam, SENDASYNCPROC lpResultCallBack, ULONG_PTR dwData) { return TRUE; } BOOL WINAPI SendMessageCallbackW(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam, SENDASYNCPROC lpResultCallBack, ULONG_PTR dwData) { return TRUE; } BOOL WINAPI TranslateMessage(CONST MSG* lpMsg) { return TRUE; } LRESULT WINAPI DispatchMessageA(CONST MSG* lpMsg) { return 0; } LRESULT WINAPI DispatchMessageW(CONST MSG* lpMsg) { return 0; } BOOL WINAPI PeekMessageA(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax, UINT wRemoveMsg) { return TRUE; } BOOL WINAPI PeekMessageW(LPMSG lpMsg, HWND hWnd, UINT wMsgFilterMin, UINT wMsgFilterMax, UINT wRemoveMsg) { return TRUE; } BOOL WINAPI ReplyMessage(LRESULT lResult) { return TRUE; } BOOL WINAPI WaitMessage(VOID) { return TRUE; } LRESULT WINAPI CallWindowProcA(WNDPROC lpPrevWndFunc, HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam) { return 0; } LRESULT WINAPI CallWindowProcW(WNDPROC lpPrevWndFunc, HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam) { return 0; } LRESULT WINAPI DefWindowProcA(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam) { return 0; } LRESULT WINAPI DefWindowProcW(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam) { return 0; } #endif