]> gitweb.ps.run Git - autorec/commitdiff
Icons
authorPatrick Schönberger <patrick.schoenberger@posteo.de>
Mon, 10 Jan 2022 13:58:11 +0000 (14:58 +0100)
committerPatrick Schönberger <patrick.schoenberger@posteo.de>
Mon, 10 Jan 2022 13:58:11 +0000 (14:58 +0100)
res/msys2.ico [deleted file]
res/res.rc
res/res.res
res/resource.h
src/main.cpp
src/win.h
src/ws.h

diff --git a/res/msys2.ico b/res/msys2.ico
deleted file mode 100644 (file)
index ee73a7d..0000000
Binary files a/res/msys2.ico and /dev/null differ
index 9369509be905c2a76d60cffc3f059b9e5311ff44..f510d18f5ea5b76901f40793e3ec6bf966170fb5 100644 (file)
@@ -1,3 +1,5 @@
 #include "resource.h"\r
 \r
-IDI_MY_ICON ICON "msys2.ico"
\ No newline at end of file
+IDI_ICON_WHITE ICON "icon_white.ico"\r
+IDI_ICON_GREEN ICON "icon_green.ico"\r
+IDI_ICON_RED   ICON "icon_red.ico"
\ No newline at end of file
index 77bdd8c154308ee0657a9c97ca971f11bf3c3c5a..089198693c4edb41d8d06fbd8cdaa6eb59b6912c 100644 (file)
Binary files a/res/res.res and b/res/res.res differ
index dd1af7b192977da65ca9bf35ebb8d471783a3977..a046be66d813e8fb139faa6740c35549735857dc 100644 (file)
@@ -1,4 +1,6 @@
-#define IDI_MY_ICON 101\r
+#define IDI_ICON_WHITE 101\r
+#define IDI_ICON_GREEN 102\r
+#define IDI_ICON_RED   103\r
 \r
 \r
 \r
index 73661042121148a8461e966a4b740bb6d9b36c8c..d89c1991ea6a0ebc9eb3c5296e895fcb18a8c57e 100644 (file)
 #include <windows.h>\r
 #include <shlwapi.h>\r
 \r
+bool recording = false;\r
+HANDLE process = NULL;\r
+HWND hwnd;\r
+HINSTANCE hInstance;\r
+\r
+\r
+NOTIFYICONDATAA niData = { 0 };\r
+const UINT ICON_MSG = WM_APP+1;\r
+void\r
+ShowNotificationIcon()\r
+{\r
+  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
+void changeIcon(HWND hwnd, HINSTANCE hInstance, WORD id)\r
+{\r
+  HICON icon = LoadIcon(hInstance, MAKEINTRESOURCE(id));\r
+  HideNotificationIcon();\r
+  niData.hIcon = icon;\r
+  if (! IsWindowVisible(hwnd))\r
+    ShowNotificationIcon();\r
+  SendMessage(hwnd, WM_SETICON, 0, (LPARAM)icon);\r
+  SendMessage(hwnd, WM_SETICON, 1, (LPARAM)icon);\r
+}\r
+\r
+\r
+\r
 void\r
 startRecording()\r
 {\r
   ws::sendRequest("StartRecord");\r
+  changeIcon(hwnd, hInstance, IDI_ICON_GREEN);\r
 }\r
 \r
 void\r
 stopRecording()\r
 {\r
   ws::sendRequest("StopRecord");\r
+  changeIcon(hwnd, hInstance, IDI_ICON_RED);\r
 }\r
 \r
 bool\r
@@ -84,19 +120,49 @@ checkForegroundProcess(std::string exeName)
   return strcmp(filename, exeName.c_str()) == 0;\r
 }\r
 \r
-bool recording = false;\r
-HANDLE process = NULL;\r
-\r
-// int WINAPI\r
-// WinMain(HINSTANCE hInstance,\r
-//         HINSTANCE hPrevInstance,\r
-//         LPSTR lpCmdLine,\r
-//         int nCmdShow)\r
-int main(int argc, char **argv)\r
+int WINAPI\r
+WinMain(HINSTANCE hInstance,\r
+        HINSTANCE hPrevInstance,\r
+        LPSTR lpCmdLine,\r
+        int nCmdShow)\r
+//int main(int argc, char **argv)\r
 {\r
+  hInstance = GetModuleHandle(0);\r
+\r
+  win::Window window("Title", "MyWindowClass", hInstance);\r
+  hwnd = window.hwnd;\r
+\r
+  niData.cbSize = sizeof(niData);\r
+  niData.uID = 12345;\r
+  niData.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP;\r
+  niData.hIcon = LoadIconA(hInstance, MAKEINTRESOURCEA(IDI_ICON_WHITE));\r
+  niData.hWnd = window.hwnd;\r
+  niData.uCallbackMessage = ICON_MSG;\r
+  niData.uVersion = NOTIFYICON_VERSION_4;\r
+\r
+  window.handlers[WM_SIZE].push_back([](HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) {\r
+    if (wParam == SIZE_MINIMIZED) {\r
+      ShowNotificationIcon();\r
+      ShowWindow(hwnd, false);\r
+    }\r
+  });\r
+  window.handlers[WM_DESTROY].push_back([](HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) {\r
+    HideNotificationIcon();\r
+  });  \r
+  window.handlers[ICON_MSG].push_back([](HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) {\r
+    if (LOWORD(lParam) == NIN_SELECT) {\r
+      HideNotificationIcon();\r
+      ShowWindow(hwnd, true);\r
+      SetForegroundWindow(hwnd);\r
+      SetActiveWindow(hwnd);\r
+    }\r
+  });\r
 \r
-  //win::Window window("Title", "MyWindowClass", hInstance);\r
-  win::Window window("Title", "MyWindowClass", GetModuleHandle(0));\r
+  window.handlers[WM_GETMINMAXINFO].push_back([](HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) {\r
+          MINMAXINFO *mmInfo = (MINMAXINFO*)lParam;\r
+          mmInfo->ptMinTrackSize.x = 400;\r
+          mmInfo->ptMinTrackSize.y = 200;\r
+  });\r
 \r
   lay_context *ctx = &window.ctx;\r
   lay_id root = window.lId;\r
@@ -113,14 +179,19 @@ int main(int argc, char **argv)
   btnConnect.onClick([&]() {\r
     ws::connect("ws://127.0.0.1:4444");\r
   });\r
+  win::Button btnTest(&window, "Test", row1, 100, 25, 0, 0);\r
+  btnTest.onClick([&]() {\r
+    changeIcon(window.hwnd, hInstance, IDI_ICON_GREEN);\r
+  });\r
 \r
   win::ListBox lstActiveProcesses(&window, row2, 0, 0, 0, LAY_FILL);\r
   \r
   lay_id col1 = win::createLayId(&window.ctx, row2, 80, 0, LAY_COLUMN, LAY_VCENTER);\r
+  lstActiveProcesses.addStyle(WS_VSCROLL);\r
+  \r
   lay_set_margins_ltrb(ctx, col1, 5, 0, 5, 0);\r
 \r
   win::ListBox lstMonitoredProcesses(&window, row2, 0, 0, 0, LAY_FILL);\r
-  lstActiveProcesses.addStyle(WS_VSCROLL);\r
   lstMonitoredProcesses.addStyle(WS_VSCROLL);\r
 \r
   win::Button btnUpdateWindows(&window, "Update", col1, 85, 25, 0, 0);\r
@@ -173,12 +244,16 @@ int main(int argc, char **argv)
   });\r
 \r
   window.show();\r
+  window.setDefaultFont();\r
 \r
+  ws::onConnect = [&]() {\r
+    changeIcon(window.hwnd, hInstance, IDI_ICON_RED);\r
+  };\r
   ws::init();\r
 \r
   SetTimer(window.hwnd, 10123, 100, [](HWND, UINT, UINT_PTR, DWORD) {\r
     if (!recording) {\r
-      if (checkForegroundProcess("League of Legends.exe")) {\r
+      if (checkForegroundProcess("notepad.exe")) {\r
         recording = true;\r
         process = getHwndProcess(GetForegroundWindow());\r
         startRecording();\r
index 1e761b6e72893a9948da3431480938cce4633818..b8763ea54ffc09ad85fae46fae61c2fe753205c1 100644 (file)
--- a/src/win.h
+++ b/src/win.h
@@ -46,7 +46,6 @@ namespace win
   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
@@ -62,17 +61,11 @@ namespace win
           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
+          if (wParam != SIZE_MINIMIZED) {\r
             lay_set_size_xy(&window->ctx, window->lId, LOWORD(lParam), HIWORD(lParam));\r
             lay_run_context(&window->ctx);\r
 \r
@@ -81,23 +74,8 @@ namespace win
           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
-        }\r
+          return (LONG_PTR)GetStockObject(WHITE_BRUSH);\r
         default:\r
           defaultHandler = true;\r
           break;\r
@@ -126,12 +104,12 @@ namespace win
       wc.cbClsExtra = 0;\r
       wc.cbWndExtra = sizeof(Window*);\r
       wc.hInstance = hInstance;\r
-      wc.hIcon = LoadIcon(nullptr, IDI_APPLICATION);\r
-      wc.hCursor = LoadCursor(nullptr, IDC_ARROW);\r
+      wc.hIcon = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_ICON_WHITE));\r
+      wc.hCursor = LoadCursor(hInstance, IDC_ARROW);\r
       wc.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);\r
       wc.lpszMenuName = nullptr;\r
       wc.lpszClassName = className.c_str();\r
-      wc.hIconSm = LoadIcon(nullptr, IDI_APPLICATION);\r
+      wc.hIconSm = LoadIcon(hInstance, MAKEINTRESOURCE(IDI_ICON_WHITE));\r
       RegisterClassExA(&wc);\r
 \r
       lay_init_context(&ctx);\r
@@ -151,15 +129,6 @@ namespace win
                           nullptr);\r
 \r
       SetWindowLongPtrA(hwnd, 0, (LONG_PTR)this);\r
-      \r
-                          \r
-      niData.cbSize = sizeof(niData);\r
-      niData.uID = 12345;\r
-      niData.uFlags = NIF_ICON | NIF_MESSAGE | NIF_TIP;\r
-      niData.hIcon = LoadIconA(hInstance, MAKEINTRESOURCEA(IDI_MY_ICON));\r
-      niData.hWnd = hwnd;\r
-      niData.uCallbackMessage = WM_APP+1;\r
-      niData.uVersion = NOTIFYICON_VERSION_4;\r
     }\r
     bool update()\r
     {\r
@@ -174,7 +143,9 @@ namespace win
     void show()\r
     {\r
       ShowWindow(hwnd, true);\r
-\r
+    }\r
+    void setDefaultFont()\r
+    {\r
       EnumChildWindows(\r
         hwnd,\r
         [](HWND hwnd, LPARAM lParam) -> BOOL {\r
index ecc88b3b042c4db79be2d32143e852980ab49fe7..058f69b707f776d84e95cdaa11c2128697909f1b 100644 (file)
--- a/src/ws.h
+++ b/src/ws.h
@@ -4,6 +4,7 @@
 using json = nlohmann::json;\r
 \r
 #include <string>\r
+#include <functional>\r
 \r
 namespace ws\r
 {\r
@@ -12,10 +13,14 @@ namespace ws
 \r
   bool done = false;\r
 \r
+  std::function<void()> onConnect;\r
+\r
   static void cb(struct mg_connection *c, int ev, void *ev_data, void *fn_data) {\r
     if (ev == MG_EV_WS_OPEN) {\r
+      puts("Open");\r
     } else if (ev == MG_EV_WS_MSG) {\r
       struct mg_ws_message *wm = (struct mg_ws_message *) ev_data;\r
+      printf("Msg: %.*s\n", (int)wm->data.len, wm->data.ptr);\r
       std::string jsonStr(wm->data.ptr, wm->data.len);\r
       auto msg = json::parse(jsonStr);\r
       int op = msg["op"].get<int>();\r
@@ -32,16 +37,18 @@ namespace ws
       }\r
       else if (op == 2)\r
       {\r
-        MessageBoxA(NULL, "hura", "connected", MB_OK);\r
+        puts("Connected");\r
+        if (onConnect)\r
+          onConnect();\r
       }\r
     }\r
 \r
     if (ev == MG_EV_ERROR) {\r
-      MessageBoxA(NULL, "", "Error", MB_OK);\r
+      puts("Error");\r
       done = true;\r
     }\r
     if (ev == MG_EV_CLOSE) {\r
-      MessageBoxA(NULL, "", "Close", MB_OK);\r
+      puts("Close");\r
       done = true;\r
     }\r
   }\r