]> gitweb.ps.run Git - autorec/commitdiff
Why didnt I commit these
authorPatrick <patrick.schoenberger@posteo.de>
Tue, 3 Oct 2023 18:38:21 +0000 (20:38 +0200)
committerPatrick <patrick.schoenberger@posteo.de>
Tue, 3 Oct 2023 18:38:21 +0000 (20:38 +0200)
build.cmd
src/main.cpp
src/win.h
src/ws.h

index c447ce0a739343c557434f9bec56b973499287d4..60d338064f6f4376f9b121daaa1c9b488c5a8b83 100644 (file)
--- a/build.cmd
+++ b/build.cmd
@@ -3,5 +3,5 @@
 REM cl src/mongoose.c -c\r
 REM rc res/res.rc\r
 \r
-cl /EHsc src/main.cpp mongoose.obj /link user32.lib gdi32.lib shell32.lib Shlwapi.lib ws2_32.lib res/res.res\r
-mt -manifest .\main.exe.manifest -outputresource:main.exe;1
\ No newline at end of file
+cl /EHsc src/main.cpp src/mongoose.c /Fo"./out"/ /link user32.lib gdi32.lib shell32.lib Shlwapi.lib ws2_32.lib res/res.res /out:out/main.exe\r
+REM mt -manifest res/main.exe.manifest -outputresource:main.exe;1
\ No newline at end of file
index 4f4a866863bcfac8c36a19b50a00f2fa15e3fb08..727050429e9320cdd9229d05ed8fd31fa3c6577e 100644 (file)
@@ -8,6 +8,10 @@
 #define LAY_IMPLEMENTATION\r
 #include "layout.h"\r
 \r
+#include <fstream>\r
+#include <vector>\r
+#include <string>\r
+\r
 #include <Psapi.h>\r
 #include <stdbool.h>\r
 #include <stdio.h>\r
@@ -19,6 +23,9 @@ bool recording = false;
 HANDLE process = NULL;\r
 HWND hwnd;\r
 HINSTANCE hInstance;\r
+HICON icon_white, icon_green, icon_red;\r
+\r
+std::vector<std::string> gameExes;\r
 \r
 \r
 NOTIFYICONDATAA niData = { 0 };\r
@@ -36,9 +43,8 @@ HideNotificationIcon()
   Shell_NotifyIconA(NIM_DELETE, &niData);\r
 }\r
 \r
-void changeIcon(HWND hwnd, HINSTANCE hInstance, WORD id)\r
+void changeIcon(HWND hwnd, HICON icon)\r
 {\r
-  HICON icon = LoadIcon(hInstance, MAKEINTRESOURCE(id));\r
   niData.hIcon = icon;\r
   if (! IsWindowVisible(hwnd))\r
     Shell_NotifyIconA(NIM_MODIFY, &niData);\r
@@ -52,14 +58,14 @@ void
 startRecording()\r
 {\r
   ws::sendRequest("StartRecord");\r
-  changeIcon(hwnd, hInstance, IDI_ICON_GREEN);\r
+  changeIcon(hwnd, icon_green);\r
 }\r
 \r
 void\r
 stopRecording()\r
 {\r
   ws::sendRequest("StopRecord");\r
-  changeIcon(hwnd, hInstance, IDI_ICON_RED);\r
+  changeIcon(hwnd, icon_red);\r
 }\r
 \r
 bool\r
@@ -112,13 +118,53 @@ checkForegroundProcess(std::string exeName)
   HWND fgHwnd = GetForegroundWindow();\r
   HANDLE fgHandle = getHwndProcess(fgHwnd);\r
 \r
-  char filename[1024];\r
-  int len = GetModuleFileNameExA(fgHandle, NULL, filename, 1024);\r
+  char filename[MAX_PATH];\r
+  int len = GetModuleFileNameExA(fgHandle, NULL, filename, MAX_PATH);\r
+\r
+  if (strcmp(filename, exeName.c_str()) == 0)\r
+    return true;\r
+\r
   PathStripPathA(filename);\r
 \r
   return strcmp(filename, exeName.c_str()) == 0;\r
 }\r
 \r
+void ReadGameExes()\r
+{\r
+  std::ifstream ifs("games.txt");\r
+\r
+  gameExes.clear();\r
+\r
+  while (ifs) {\r
+    std::string str;\r
+    std::getline(ifs, str);\r
+    if (! str.empty())\r
+      gameExes.push_back(str);\r
+  }\r
+\r
+  ifs.close();\r
+}\r
+\r
+void WriteGameExes()\r
+{\r
+  std::ofstream ofs("games.txt", std::ios::trunc);\r
+\r
+  for (const auto &exe : gameExes)\r
+  {\r
+    ofs.write(exe.c_str(), exe.size());\r
+    ofs.write("\n", 1);\r
+  }\r
+\r
+  ofs.close();\r
+}\r
+\r
+/*\r
+TODO:\r
+  - Disconnect while recording\r
+*/\r
+\r
+\r
+\r
 int WINAPI\r
 WinMain(HINSTANCE hInstance,\r
         HINSTANCE hPrevInstance,\r
@@ -128,13 +174,17 @@ WinMain(HINSTANCE hInstance,
 {\r
   hInstance = GetModuleHandle(0);\r
 \r
+  icon_white = LoadIconA(hInstance, MAKEINTRESOURCEA(IDI_ICON_WHITE));\r
+  icon_green = LoadIconA(hInstance, MAKEINTRESOURCEA(IDI_ICON_GREEN));\r
+  icon_red = LoadIconA(hInstance, MAKEINTRESOURCEA(IDI_ICON_RED));\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.hIcon = icon_white;\r
   niData.hWnd = window.hwnd;\r
   niData.uCallbackMessage = ICON_MSG;\r
   niData.uVersion = NOTIFYICON_VERSION_4;\r
@@ -176,11 +226,8 @@ WinMain(HINSTANCE hInstance,
 \r
   win::Button btnConnect(&window, "Connect", row1, 100, 25, 0, 0);\r
   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
+    if (! ws::isConnected)\r
+      ws::connect("ws://127.0.0.1:4455");\r
   });\r
 \r
   win::ListBox lstActiveProcesses(&window, row2, 0, 0, 0, LAY_FILL);\r
@@ -193,6 +240,10 @@ WinMain(HINSTANCE hInstance,
   win::ListBox lstMonitoredProcesses(&window, row2, 0, 0, 0, LAY_FILL);\r
   lstMonitoredProcesses.addStyle(WS_VSCROLL);\r
 \r
+  ReadGameExes();\r
+  for (const auto &exe : gameExes)\r
+    lstMonitoredProcesses.addString(exe);\r
+\r
   win::Button btnUpdateWindows(&window, "Update", col1, 85, 25, 0, 0);\r
   win::Button btnStartMonitoringName(&window, "Exe name >>", col1, 85, 25, 0, 0);\r
   win::Button btnStartMonitoringPath(&window, "Full path >>", col1, 85, 25, 0, 0);\r
@@ -220,12 +271,19 @@ WinMain(HINSTANCE hInstance,
 \r
     std::string selStr = lstActiveProcesses.getText(sel);\r
     \r
-    char *filename = new char[selStr.size()];\r
+    char *filename = new char[selStr.size()+1];\r
     std::memcpy(filename, selStr.c_str(), selStr.size());\r
+    filename[selStr.size()] = '\0';\r
     PathStripPathA(filename);\r
 \r
-    if (lstMonitoredProcesses.findString(std::string(filename)) == LB_ERR)\r
-      lstMonitoredProcesses.addString(std::string(filename));\r
+    std::string filenameStr(filename);\r
+\r
+    if (lstMonitoredProcesses.findString(filenameStr) == LB_ERR)\r
+    {\r
+      lstMonitoredProcesses.addString(filenameStr);\r
+      gameExes.push_back(filenameStr);\r
+      WriteGameExes();\r
+    }\r
 \r
     delete[] filename;\r
   });\r
@@ -234,28 +292,47 @@ WinMain(HINSTANCE hInstance,
     if (sel < 0) return;\r
     std::string selStr = lstActiveProcesses.getText(sel);\r
     if (lstMonitoredProcesses.findString(selStr) == LB_ERR)\r
-    lstMonitoredProcesses.addString(selStr);\r
+    {\r
+      lstMonitoredProcesses.addString(selStr);\r
+      gameExes.push_back(selStr);\r
+      WriteGameExes();  \r
+    }\r
   });\r
   btnStopMonitoring.onClick([&]() {\r
     int sel = lstMonitoredProcesses.getSelectedIndex();\r
     if (sel < 0) return;\r
     lstMonitoredProcesses.remove(sel);\r
+    gameExes.erase(gameExes.begin() + sel);\r
+    WriteGameExes();\r
   });\r
 \r
   window.show();\r
   window.setDefaultFont();\r
 \r
   ws::onConnect = [&]() {\r
-    changeIcon(window.hwnd, hInstance, IDI_ICON_RED);\r
+    changeIcon(window.hwnd, icon_red);\r
+    btnConnect.setActive(false);\r
   };\r
+  ws::onClose = [&]() {\r
+    changeIcon(window.hwnd, icon_white);\r
+    btnConnect.setActive(true);\r
+  };\r
+  ws::onError = ws::onClose;\r
   ws::init();\r
 \r
-  SetTimer(window.hwnd, 10123, 100, [](HWND, UINT, UINT_PTR, DWORD) {\r
+  window.setTimer(1000, [&btnConnect]() {\r
+    if (! ws::isConnected)\r
+      ws::connect("ws://127.0.0.1:4455");\r
+  });\r
+\r
+  window.setTimer(100, []() {\r
     if (!recording) {\r
-      if (checkForegroundProcess("League of Legends.exe")) {\r
-        recording = true;\r
-        process = getHwndProcess(GetForegroundWindow());\r
-        startRecording();\r
+      for (auto exe : gameExes) {\r
+        if (checkForegroundProcess(exe)) {\r
+          recording = true;\r
+          process = getHwndProcess(GetForegroundWindow());\r
+          startRecording();\r
+        } \r
       }\r
     } else {\r
       if (!checkProcessRunning(process)) {\r
index b8763ea54ffc09ad85fae46fae61c2fe753205c1..0a734c95da3d4c2dadfa725d8211003dfbba9362 100644 (file)
--- a/src/win.h
+++ b/src/win.h
@@ -1,7 +1,3 @@
-#pragma comment(linker, "\"/manifestdependency:type='win32' \\r
-name='Microsoft.Windows.Common-Controls' version='6.0.0.0' \\r
-processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"")\r
-\r
 #include <windows.h>\r
 #include <CommCtrl.h>\r
 \r
@@ -42,6 +38,10 @@ namespace win
     {\r
       SetWindowLongPtrA(hwnd, GWL_STYLE, getStyle() & (~style));\r
     }\r
+    void setActive(bool active)\r
+    {\r
+      EnableWindow(hwnd, active);\r
+    }\r
   };\r
   struct Window : Hwnd\r
   {\r
@@ -95,6 +95,12 @@ namespace win
       std::vector<\r
         std::function<void(HWND, UINT, WPARAM, LPARAM)>>> handlers;\r
 \r
+    struct Timer {\r
+      bool active = true;\r
+      std::function<void()> f;\r
+    };\r
+    std::vector<Timer> timers;\r
+\r
     Window(std::string title, std::string className, HINSTANCE hInstance)\r
     {\r
       WNDCLASSEXA wc;\r
@@ -155,6 +161,19 @@ namespace win
         },\r
         0);\r
     }\r
+    void setTimer(UINT interval, std::function<void()> cb)\r
+    {\r
+      SetTimer(this->hwnd, timers.size() + 1000, interval, [](HWND hwnd, UINT uMsg, UINT_PTR uIdEvent, DWORD dwTime) {\r
+        Window *window = (Window*)GetWindowLongPtrA(hwnd, 0);\r
+        if (window == nullptr)\r
+          return;\r
+\r
+        window->timers[uIdEvent-1000].f();\r
+      });\r
+      Timer t;\r
+      t.f = cb;\r
+      timers.push_back(t);\r
+    }\r
   };\r
 \r
   struct Button : Hwnd\r
index 4bebc1fb22bb0481f33a27a0a0d3bc68dc76e01e..d3acb2763f99fe5753a005999dea650c562c2ba3 100644 (file)
--- a/src/ws.h
+++ b/src/ws.h
@@ -11,13 +11,16 @@ namespace ws
   mg_mgr mgr;\r
   mg_connection *c = nullptr;\r
 \r
-  bool done = false;\r
+  bool isConnected = false;\r
 \r
   std::function<void()> onConnect;\r
+  std::function<void()> onClose;\r
+  std::function<void()> onError;\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
+      isConnected = true;\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
@@ -45,11 +48,15 @@ namespace ws
 \r
     if (ev == MG_EV_ERROR) {\r
       printf("Error: %s\n", (char*)ev_data);\r
-      done = true;\r
+      isConnected = false;\r
+      if (onError)\r
+          onError();\r
     }\r
     if (ev == MG_EV_CLOSE) {\r
       puts("Close");\r
-      done = true;\r
+      isConnected = false;\r
+      if (onClose)\r
+        onClose();\r
     }\r
   }\r
 \r
@@ -65,7 +72,7 @@ namespace ws
 \r
   void update()\r
   {\r
-    if (c && !done)\r
+    if (c)\r
       mg_mgr_poll(&mgr, 10);\r
   }\r
 \r