| 238 | } |
| 239 | |
| 240 | LRESULT CALLBACK WndProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) { |
| 241 | switch (msg) { |
| 242 | case WM_TRAYICON: |
| 243 | if (lParam == WM_RBUTTONDOWN) { |
| 244 | POINT curPoint; |
| 245 | GetCursorPos(&curPoint); |
| 246 | SetForegroundWindow(hwnd); |
| 247 | |
| 248 | HMENU hMenu = CreatePopupMenu(); |
| 249 | AppendMenu(hMenu, MF_STRING, ID_TRAY_REBIND_KEYS, TEXT("Rebind Keys")); |
| 250 | |
| 251 | // submenu layouts |
| 252 | HMENU hSubMenu = CreatePopupMenu(); |
| 253 | vector<string> layouts = ListLayouts(); |
| 254 | if (!layouts.empty()) { |
| 255 | int id = 0; |
| 256 | for (auto& layout : layouts) { |
| 257 | AppendMenuA(hSubMenu, MF_STRING, ID_LAYOUT_BASE + id, layout.c_str()); |
| 258 | id++; |
| 259 | } |
| 260 | } else { |
| 261 | AppendMenu(hSubMenu, MF_GRAYED, 0, TEXT("No layouts found")); |
| 262 | } |
| 263 | AppendMenu(hMenu, MF_POPUP, (UINT_PTR)hSubMenu, TEXT("Select Profile")); |
| 264 | |
| 265 | AppendMenu(hMenu, MF_STRING, ID_TRAY_RESTART_SNAPKEY, TEXT("Restart SnapKey")); |
| 266 | AppendMenu(hMenu, MF_STRING, ID_TRAY_LOCK_FUNCTION, isLocked ? TEXT("Enable SnapKey") : TEXT("Disable SnapKey")); |
| 267 | AppendMenu(hMenu, MF_SEPARATOR, 0, NULL); |
| 268 | AppendMenu(hMenu, MF_STRING, ID_TRAY_HELP, TEXT("Get Help")); |
| 269 | AppendMenu(hMenu, MF_STRING, ID_TRAY_CHECKUPDATE, TEXT("Check Updates")); |
| 270 | AppendMenu(hMenu, MF_STRING, ID_TRAY_VERSION_INFO, TEXT("Version Info (1.2.9)")); |
| 271 | AppendMenu(hMenu, MF_SEPARATOR, 0, NULL); |
| 272 | AppendMenu(hMenu, MF_STRING, ID_TRAY_EXIT_CONTEXT_MENU_ITEM, TEXT("Exit SnapKey")); |
| 273 | |
| 274 | TrackPopupMenu(hMenu, TPM_BOTTOMALIGN | TPM_LEFTALIGN, curPoint.x, curPoint.y, 0, hwnd, NULL); |
| 275 | DestroyMenu(hMenu); |
| 276 | } |
| 277 | else if (lParam == WM_LBUTTONDBLCLK) { |
| 278 | isLocked = !isLocked; |
| 279 | HICON hIcon = isLocked |
| 280 | ? (HICON)LoadImage(NULL, TEXT("icon_off.ico"), IMAGE_ICON, 0, 0, LR_LOADFROMFILE) |
| 281 | : (HICON)LoadImage(NULL, TEXT("icon.ico"), IMAGE_ICON, 0, 0, LR_LOADFROMFILE); |
| 282 | if (hIcon) { |
| 283 | nid.hIcon = hIcon; |
| 284 | Shell_NotifyIcon(NIM_MODIFY, &nid); |
| 285 | DestroyIcon(hIcon); |
| 286 | } |
| 287 | } |
| 288 | break; |
| 289 | |
| 290 | case WM_COMMAND: |
| 291 | if (LOWORD(wParam) >= ID_LAYOUT_BASE) { |
| 292 | int layoutIndex = LOWORD(wParam) - ID_LAYOUT_BASE; |
| 293 | vector<string> layouts = ListLayouts(); |
| 294 | if (layoutIndex >= 0 && layoutIndex < (int)layouts.size()) { |
| 295 | ApplyLayout(layouts[layoutIndex]); |
| 296 | RestartSnapKey(); // restart after applying layout |
| 297 | } |
nothing calls this directly
no test coverage detected