- Shell_NotifyIconA(NIM_ADD, &_::niData);\r
- Shell_NotifyIconA(NIM_SETVERSION, &_::niData);\r
-}\r
-\r
-void\r
-HideNotificationIcon()\r
-{\r
- Shell_NotifyIconA(NIM_DELETE, &_::niData);\r
-}\r
-\r
-lay_context ctx;\r
-lay_id root;\r
-\r
-LRESULT CALLBACK\r
-WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)\r
-{\r
- switch (msg) {\r
- case WM_CLOSE:\r
- DestroyWindow(hwnd);\r
- break;\r
- case WM_DESTROY:\r
- Shell_NotifyIconA(NIM_DELETE, &niData);\r
- lay_destroy_context(&ctx);\r
- PostQuitMessage(0);\r
- break;\r
- case WM_SIZE:\r
- if (wParam == SIZE_MINIMIZED) {\r
- ShowNotificationIcon();\r
- ShowWindow(hwnd, false);\r
- }\r
- else {\r
- lay_set_size_xy(&_::ctx, _::root, LOWORD(lParam), HIWORD(lParam));\r
- lay_run_context(&_::ctx);\r
-\r
- for (auto &lId : lIds) {\r
- lay_vec4 rect = lay_get_rect(&_::ctx, lId.second);\r
- SetWindowPos(lId.first, HWND_TOP,\r
- rect[0],\r
- rect[1],\r
- rect[2],\r
- rect[3],\r
- SWP_NOZORDER\r
- );\r
- }\r
- RedrawWindow(hwnd, 0, 0, RDW_ERASE | RDW_INVALIDATE | RDW_ALLCHILDREN);\r
- }\r
- break;\r
- case WM_COMMAND:\r
- if (handlers.find((HWND)lParam) != handlers.end()) {\r
- auto handler = handlers[(HWND)lParam];\r
- if (handler.find(HIWORD(wParam)) != handler.end()) {\r
- auto cb = handler[HIWORD(wParam)];\r
- cb();\r
+ struct Window;\r
+ struct Hwnd\r
+ {\r
+ HWND hwnd;\r
+ lay_id lId;\r
+ Window *window;\r
+\r
+ Hwnd() {}\r
+ Hwnd(Window *window, LPCSTR className, LPCSTR windowName, lay_id parent, lay_scalar w, lay_scalar h, uint32_t contain, uint32_t behave);\r
+\r
+ void setStyle(DWORD style)\r
+ {\r
+ SetWindowLongPtrA(hwnd, GWL_STYLE, style);\r
+ }\r
+ DWORD getStyle()\r
+ {\r
+ return GetWindowLongPtrA(hwnd, GWL_STYLE);\r
+ }\r
+ void addStyle(DWORD style)\r
+ {\r
+ SetWindowLongPtrA(hwnd, GWL_STYLE, getStyle() | style);\r
+ }\r
+ void removeStyle(DWORD style)\r
+ {\r
+ SetWindowLongPtrA(hwnd, GWL_STYLE, getStyle() & (~style));\r
+ }\r
+ };\r
+ struct Window : Hwnd\r
+ {\r
+ private:\r
+ NOTIFYICONDATAA niData = { 0 };\r
+\r
+ static LRESULT CALLBACK\r
+ WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)\r
+ {\r
+ Window *window = (Window*)GetWindowLongPtrA(hwnd, 0);\r
+ if (window == nullptr)\r
+ return DefWindowProc(hwnd, msg, wParam, lParam);\r
+\r
+ bool defaultHandler = false;\r
+\r
+ switch (msg) {\r
+ case WM_CLOSE:\r
+ DestroyWindow(hwnd);\r
+ break;\r
+ case WM_DESTROY:\r
+ Shell_NotifyIconA(NIM_DELETE, &window->niData);\r
+ lay_destroy_context(&window->ctx);\r
+ PostQuitMessage(0);\r
+ break;\r
+ case WM_SIZE:\r
+ if (wParam == SIZE_MINIMIZED) {\r
+ //TODO: auslagen\r
+ //ShowNotificationIcon();\r
+ ShowWindow(hwnd, false);\r
+ }\r
+ else {\r
+ lay_set_size_xy(&window->ctx, window->lId, LOWORD(lParam), HIWORD(lParam));\r
+ lay_run_context(&window->ctx);\r
+\r
+ //RedrawWindow(hwnd, 0, 0, RDW_ERASE | RDW_INVALIDATE | RDW_ALLCHILDREN);\r
+ }\r
+ break;\r
+ case WM_NOTIFY:\r
+ break;\r
+ case WM_APP + 1:\r
+ if (LOWORD(lParam) == NIN_SELECT) {\r
+ //TODO: auslagern\r
+ //HideNotificationIcon();\r
+ ShowWindow(hwnd, true);\r
+ SetForegroundWindow(hwnd);\r
+ SetActiveWindow(hwnd);\r
+ }\r
+ break;\r
+ case WM_CTLCOLORSTATIC:\r
+ return (LONG)GetStockObject(WHITE_BRUSH);\r
+ case WM_GETMINMAXINFO: {\r
+ MINMAXINFO *mmInfo = (MINMAXINFO*)lParam;\r
+ mmInfo->ptMinTrackSize.x = 400;\r
+ mmInfo->ptMinTrackSize.y = 200;\r
+ break;\r