From 419238c2a3dcba7db7555adf4603850a9cc4270e Mon Sep 17 00:00:00 2001 From: Marvin Lehmann Date: Sat, 18 Nov 2017 22:35:19 +0100 Subject: [PATCH] Initial release --- .gitattributes | 63 +++ Mouse Debouncer/Mouse Debouncer.rc | Bin 0 -> 6572 bytes Mouse Debouncer/Mouse Debouncer.sln | 31 + Mouse Debouncer/Mouse Debouncer.vcxproj | 129 +++++ .../Mouse Debouncer.vcxproj.filters | 43 ++ Mouse Debouncer/icon.ico | Bin 0 -> 318748 bytes Mouse Debouncer/main.c | 531 ++++++++++++++++++ Mouse Debouncer/notify.ico | Bin 0 -> 5430 bytes Mouse Debouncer/optparse.h | 414 ++++++++++++++ Mouse Debouncer/resource.h | 17 + 10 files changed, 1228 insertions(+) create mode 100644 .gitattributes create mode 100644 Mouse Debouncer/Mouse Debouncer.rc create mode 100644 Mouse Debouncer/Mouse Debouncer.sln create mode 100644 Mouse Debouncer/Mouse Debouncer.vcxproj create mode 100644 Mouse Debouncer/Mouse Debouncer.vcxproj.filters create mode 100644 Mouse Debouncer/icon.ico create mode 100644 Mouse Debouncer/main.c create mode 100644 Mouse Debouncer/notify.ico create mode 100644 Mouse Debouncer/optparse.h create mode 100644 Mouse Debouncer/resource.h diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..1ff0c42 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,63 @@ +############################################################################### +# Set default behavior to automatically normalize line endings. +############################################################################### +* text=auto + +############################################################################### +# Set default behavior for command prompt diff. +# +# This is need for earlier builds of msysgit that does not have it on by +# default for csharp files. +# Note: This is only used by command line +############################################################################### +#*.cs diff=csharp + +############################################################################### +# Set the merge driver for project and solution files +# +# Merging from the command prompt will add diff markers to the files if there +# are conflicts (Merging from VS is not affected by the settings below, in VS +# the diff markers are never inserted). Diff markers may cause the following +# file extensions to fail to load in VS. An alternative would be to treat +# these files as binary and thus will always conflict and require user +# intervention with every merge. To do so, just uncomment the entries below +############################################################################### +#*.sln merge=binary +#*.csproj merge=binary +#*.vbproj merge=binary +#*.vcxproj merge=binary +#*.vcproj merge=binary +#*.dbproj merge=binary +#*.fsproj merge=binary +#*.lsproj merge=binary +#*.wixproj merge=binary +#*.modelproj merge=binary +#*.sqlproj merge=binary +#*.wwaproj merge=binary + +############################################################################### +# behavior for image files +# +# image files are treated as binary by default. +############################################################################### +#*.jpg binary +#*.png binary +#*.gif binary + +############################################################################### +# diff behavior for common document formats +# +# Convert binary document formats to text before diffing them. This feature +# is only available from the command line. Turn it on by uncommenting the +# entries below. +############################################################################### +#*.doc diff=astextplain +#*.DOC diff=astextplain +#*.docx diff=astextplain +#*.DOCX diff=astextplain +#*.dot diff=astextplain +#*.DOT diff=astextplain +#*.pdf diff=astextplain +#*.PDF diff=astextplain +#*.rtf diff=astextplain +#*.RTF diff=astextplain diff --git a/Mouse Debouncer/Mouse Debouncer.rc b/Mouse Debouncer/Mouse Debouncer.rc new file mode 100644 index 0000000000000000000000000000000000000000..ca525a0d3f24c66b368988a366d0bdb604b7b3e0 GIT binary patch literal 6572 zcmdUzTTdHD6vxkVrGAI0c}dg?OcSZ%F+y4GD zKCIVXJK$E;M%H?EXXf0mGk^cJV>=e?#BS}QjcjORp1w_(yI^i?Q@gS|z7Fhre!*_6 zX9J!Q^ApBv=0=QyoAUON_rRC1-P!|tw(VQ{1}Zyo++udX>K(hUmOmAG4w zTXA1M!U^{~JF}Lxtz$K7*r|2x-0IBMcyHRV{mM*>{}bD1=9qVs4@a{%Tp z-gC_FHF*Ev7gj>H!Eug{c7bXF|2k4VX12*}hw&)-q0gj!N8oM{i$B{B;BK*RpP2;H z1+vae8@%tBmBcP}xoqLwICnlOTPi1xvCR-G`MgFw7f9UYzm9~hn6;XGD{>F9fuQGC zd|r@&9Sw9+U)U3@iYE7XG*%;(KxRA#UkzOzpv^qiVhG267_D&xcPH4OW$&R}wa@kj zKS~x+=I%d5n*61X4Levn&u4}yVc30w@8P>+^t66|b#A{RTU7H9r|_3>zlBHr-p*h$ zZMCTYXKu^@P z5|rSIuw|>qSj@2|Y4)N-ANWsI(D(Yd9;5HNh_Td(I;cQF)#HJxJ+Mdo?uxG-_!W&6 zY<`6_zejljy6ll(?&IFU3Lc87xF%{~nC}5nRAkiDE65W9UevP>@TM%T-eI&6y?pdJ zohrS@9*@RVx-6DMmQ;5$VpRXLtgm$vYy1v(r(X>^mEk&o;)*c8=c?4+K2KGu}MRU-l(AV2UrvB+u0vohWm zzUZ0Py;YU(xgCgC$?}bo&Y$ve=NyScy$5`&MM0JXTOA^%{S{d%vsia4AEu=-5xod6k_SM2NTt=(7b7lh99SvCmqd!Da!dQgp5jvoV= z_*Mri?7}J7H>z`O&}--l^Y+q1Xq zZop|bp{SGaAzj}({Oi^h>FT?J^h5NZ9`q4;rB(0mWb@UTa`VXbEKt7DGpBod`8X6u z&Rx1k8O{3Gz}Z*#D*pXgirlGu_nZ^7PSocy!kV#~FP@+0*WF6_^V;&wh+_4ExOorm z)WMX~p7S=%Y+HQ$yoo)UW+jUuPi?8 + + + + Debug + Win32 + + + Release + Win32 + + + Debug + x64 + + + Release + x64 + + + + 15.0 + {9B364F75-77C2-439E-BCF3-8366AF5BCB0B} + MouseDebouncer + 10.0.16299.0 + + + + Application + true + v141 + Unicode + + + Application + false + v141 + true + Unicode + + + Application + true + v141 + Unicode + + + Application + false + v141 + true + Unicode + + + + + + + + + + + + + + + + + + + + + + Level3 + Disabled + true + + + + + Level3 + Disabled + true + + + + + Level3 + MaxSpeed + true + true + true + + + true + true + + + + + Level3 + MaxSpeed + true + true + true + + + true + true + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/Mouse Debouncer/Mouse Debouncer.vcxproj.filters b/Mouse Debouncer/Mouse Debouncer.vcxproj.filters new file mode 100644 index 0000000..0e8e068 --- /dev/null +++ b/Mouse Debouncer/Mouse Debouncer.vcxproj.filters @@ -0,0 +1,43 @@ + + + + + {4FC737F1-C7A5-4376-A066-2A32D752A2FF} + cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx + + + {93995380-89BD-4b04-88EB-625FBE52EBFB} + h;hh;hpp;hxx;hm;inl;inc;xsd + + + {67DA6AB6-F800-4c08-8B7A-83BB121AAD01} + rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms + + + + + Source Files + + + + + Header Files + + + Header Files + + + + + Resource Files + + + + + Resource Files + + + Resource Files + + + \ No newline at end of file diff --git a/Mouse Debouncer/icon.ico b/Mouse Debouncer/icon.ico new file mode 100644 index 0000000000000000000000000000000000000000..f2818b99dc59353e3746a2c5c25402a2d5a80313 GIT binary patch literal 318748 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

C5 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%0AXgy)S$*ARyWPeM6c{FAY6Y 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 to~X^WTU{6C8i0IvW5 literal 0 HcmV?d00001 diff --git a/Mouse Debouncer/main.c b/Mouse Debouncer/main.c new file mode 100644 index 0000000..62a3d80 --- /dev/null +++ b/Mouse Debouncer/main.c @@ -0,0 +1,531 @@ +#pragma comment(lib, "comctl32.lib") +#pragma comment(lib, "Winmm.lib") +#pragma comment(linker,"/manifestdependency:\"type='win32' name='Microsoft.Windows.Common-Controls' version='6.0.0.0' processorArchitecture='*' publicKeyToken='6595b64144ccf1df' language='*'\"") +#define STRICT +#define OPTPARSE_IMPLEMENTATION +#define OPTPARSE_API static +#include +#include +#include +#include +#include +#include +#include +#include +#include "optparse.h" +#include "resource.h" + +#if defined (DEBUG) | defined (_DEBUG) +#define DEBUG_PRINTF(fmt, ...) \ + { \ + WCHAR buffer[1024]; \ + StringCchPrintf(buffer, ARRAYSIZE(buffer), fmt, __VA_ARGS__); \ + OutputDebugString(buffer); \ + } +#else +#define DEBUG_PRINTF(fmt, ...) +#endif + +#define WM_NOTIFYICON (WM_USER + 1) +#define IDM_EXIT (WM_USER + 2) + + +typedef enum +{ + MOUSE_BUTTON_UNKNOWN = -1, + MOUSE_BUTTON_LEFT, + MOUSE_BUTTON_RIGHT, + MOUSE_BUTTON_MIDDLE, + MOUSE_BUTTON_X1, + MOUSE_BUTTON_X2, + MOUSE_BUTTON_COUNT +} MouseButton; + +typedef struct +{ + bool isMonitored; + bool isBlocked; + uint32_t blocks; + uint64_t previousTime; + uint64_t threshold; + uint32_t thresholdMs; +} MOUSEBUTTONDATA; + +static LRESULT CALLBACK WindowProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam); +static LRESULT CALLBACK LowLevelMouseProc(int nCode, WPARAM wParam, LPARAM lParam); +static inline bool RegisterInvisibleClass(const HINSTANCE hInstance); +static bool AddNotifyIcon(const HINSTANCE hInstance, const HWND hWnd, const bool restore); +static void RemoveNotifyIcon(); +static bool InstallMSLLHook(); +static void UninstallMSLLHook(); +static void ProcessCommandLineArgs(); +static void PrepareMouseButtonData(); +static void SetDoubleClickThreshold(const int threshold, const MouseButton button); +static void ShowContextMenu(const HWND hWnd, const int x, const int y); +static void CDECL ShowErrorMessageBox(LPCWSTR message, ...); +static MouseButton GetButtonByWParam(const WPARAM wParam, const PMSLLHOOKSTRUCT pdata); +static LPCWSTR GetButtonName(const MouseButton button); + +static LPCWSTR APPNAME = L"Mouse Debouncer"; +static LPCWSTR CLASSNAME = L"MouseDebouncerWndClass"; + +static HHOOK msll_hook = NULL; +static NOTIFYICONDATA notify_icon_data; +static MOUSEBUTTONDATA mouse_button_data[MOUSE_BUTTON_COUNT]; +static int32_t double_click_threshold_ms_max = 500; +static int32_t double_click_threshold_ms_min = 1; +static uint32_t double_click_threshold_ms = 60; +static uint64_t double_click_threshold; +static uint64_t counts_per_second; +static bool use_qpc; + +int CALLBACK WinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ LPSTR lpCmdLine, _In_ int nCmdShow) +{ + // Limit the application to one instance. + const HANDLE mutex = CreateMutex(NULL, TRUE, L"{05B95384-625D-491A-A326-94758957C021}"); + if (!mutex) + { + ShowErrorMessageBox(L"The mutex could not be created!"); + return EXIT_FAILURE; + } + if (GetLastError() == ERROR_ALREADY_EXISTS || GetLastError() == ERROR_ACCESS_DENIED) + { + ShowErrorMessageBox(L"Only one instance at a time!"); + return EXIT_SUCCESS; + } + + ProcessCommandLineArgs(); + PrepareMouseButtonData(); + + const ATOM atom = RegisterInvisibleClass(hInstance); + if (atom) + { + // hWndParent is not HWND_MESSAGE because message-only windows don't receive broadcast messages like TaskbarCreated. + if (!CreateWindow(CLASSNAME, APPNAME, 0, 0, 0, 0, 0, NULL, NULL, hInstance, NULL)) + { + ShowErrorMessageBox(L"The window couldn't be created."); + PostQuitMessage(1); + } + } + else + { + ShowErrorMessageBox(L"The window class couldn't be registered."); + PostQuitMessage(1); + } + + // Start the message loop. + // Set hWnd to NULL because WM_QUIT will be sent to the message loop thread, not to any particular window. + // If the function retrieves WM_QUIT, the return value is zero. + MSG msg; + BOOL ret; + while ((ret = GetMessage(&msg, NULL, 0, 0)) != 0) + { + if (ret != -1) + { + TranslateMessage(&msg); + DispatchMessage(&msg); + } + else + { + // It's extremely unlikely that GetMessage() will return -1 but just in case try to release the important stuff. + ShowErrorMessageBox(L"An unknown error occured: 0x%lx", GetLastError()); + UninstallMSLLHook(); + ReleaseMutex(mutex); + CloseHandle(mutex); + return GetLastError(); + } + } + + if (atom) UnregisterClass(CLASSNAME, hInstance); + ReleaseMutex(mutex); + CloseHandle(mutex); + + // Return the exit code given in PostQuitMessage() function. + return (int)msg.wParam; +} + +static LRESULT CALLBACK WindowProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) +{ + // This message is needed for restoring the notification icon after a explorer crash. + static UINT wm_taskbarcreated; + + switch (uMsg) + { + case WM_CREATE: + // Add NotifyIcon to the taskbar ("system tray") and install the hook. + if (!AddNotifyIcon(((LPCREATESTRUCT)lParam)->hInstance, hWnd, false) || !InstallMSLLHook()) + return -1; // destroy the window + wm_taskbarcreated = RegisterWindowMessage(L"TaskbarCreated"); + return 0; + case WM_NOTIFYICON: + // With NOTIFYICON_VERSION_4 LOWORD(lParam) contains notification events (WM_CONTEXTMENU, ..). + switch (LOWORD(lParam)) + { + case WM_CONTEXTMENU: + ShowContextMenu(hWnd, GET_X_LPARAM(wParam), GET_Y_LPARAM(wParam)); + return 0; + default: ; + } + break; + case WM_COMMAND: + // If the message source is a menu, the lower word of wParam contains the menu identifier (IDM_*). + switch (LOWORD(wParam)) + { + case IDM_EXIT: + PostMessage(hWnd, WM_CLOSE, 0, 0); + return 0; + default: ; + } + break; + case WM_CLOSE: + // Destroy the window and send WM_DESTROY to deactivate it. + DestroyWindow(hWnd); + break; + case WM_DESTROY: + // Free the icon and post a WM_QUIT message to the thread's message queue. + UninstallMSLLHook(); + RemoveNotifyIcon(); + PostQuitMessage(0); + return 0; + default: + if (uMsg == wm_taskbarcreated) + AddNotifyIcon((HINSTANCE)GetModuleHandle(NULL), hWnd, true); + break; + } + + // Pass all unhandled messages to DefWindowProc. + return DefWindowProc(hWnd, uMsg, wParam, lParam); +} + +static LRESULT CALLBACK LowLevelMouseProc(int nCode, WPARAM wParam, LPARAM lParam) +{ + if (nCode == HC_ACTION && wParam != WM_MOUSEMOVE) + { + // MSLLHOOKSTRUCT is needed to differentiate between XBUTTON1 & XBUTTON2 and to get the message's time stamp. + const PMSLLHOOKSTRUCT pdata = (PMSLLHOOKSTRUCT)lParam; + const MouseButton pressedButton = GetButtonByWParam(wParam, pdata); + + if (pressedButton >= 0 && mouse_button_data[pressedButton].isMonitored) + { + uint64_t currentTime; + if (use_qpc) + // Casting should be fine because LARGE_INTEGER is a union containing LONGLONG next to the parts struct, + // so the memory layout will not be a problem (?) - otherwise QuadPart of a temporal LI has to be used. + QueryPerformanceCounter((LARGE_INTEGER*)¤tTime); + else + currentTime = pdata->time; + + switch (wParam) + { + case WM_LBUTTONDOWN: case WM_RBUTTONDOWN: case WM_MBUTTONDOWN: case WM_XBUTTONDOWN: + { + const uint64_t elapsedTime = currentTime - mouse_button_data[pressedButton].previousTime; + if (!mouse_button_data[pressedButton].isBlocked && elapsedTime <= double_click_threshold) + { + mouse_button_data[pressedButton].isBlocked = true; + mouse_button_data[pressedButton].blocks++; + DEBUG_PRINTF(L"blocked 0x%04X (%I64u)\n", wParam, elapsedTime); + // Return nonzero value to prevent the system from passing the message to the rest of the hook chain. + return 1; + } + break; + } + case WM_LBUTTONUP: case WM_RBUTTONUP: case WM_MBUTTONUP: case WM_XBUTTONUP: + { + // The corresponding button up event should be blocked too.. + if (mouse_button_data[pressedButton].isBlocked) + { + mouse_button_data[pressedButton].isBlocked = false; + return 1; + } + + mouse_button_data[pressedButton].previousTime = currentTime; + break; + } + default: ; + } + } + } + // First parameter is optional and apparently ignored anyway. + return CallNextHookEx(msll_hook, nCode, wParam, lParam); +} + +static bool RegisterInvisibleClass(const HINSTANCE hInstance) +{ + // Set the few window class information required for creating an invisible window. + WNDCLASSEX wc = { 0 }; + wc.cbSize = sizeof(WNDCLASSEX); + wc.lpfnWndProc = (WNDPROC)WindowProc; + wc.hInstance = hInstance; + wc.lpszClassName = CLASSNAME; + + // Register the window class for subsequent use of CreateWindow. + return RegisterClassEx(&wc); +} + +static bool AddNotifyIcon(const HINSTANCE hInstance, const HWND hWnd, const bool restore) +{ + if (!restore) + { + notify_icon_data.cbSize = sizeof(NOTIFYICONDATA); + notify_icon_data.hWnd = hWnd; + // Using uID instead of guidItem because GUIDs are such a hassle (dependent on path, ..). + notify_icon_data.uID = IDI_MAINICON; + notify_icon_data.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP | NIF_SHOWTIP; + notify_icon_data.uCallbackMessage = WM_NOTIFYICON; + // Using NOTIFYICON_VERSION_4 because it's recommended for Windows Vista and later. + notify_icon_data.uVersion = NOTIFYICON_VERSION_4; + + StringCchCopy(notify_icon_data.szTip, wcslen(APPNAME) + 1, APPNAME); + + // Using LoadIconMetric to ensure that the correct icon is loaded and scaled appropriately. + if (FAILED(LoadIconMetric(hInstance, MAKEINTRESOURCE(IDI_NOTIFYICON), LIM_SMALL, ¬ify_icon_data.hIcon))) + { + ShowErrorMessageBox(L"The icon couldn't be loaded."); + return false; + } + } + + // Try to add the icon to the notification area... + if (!Shell_NotifyIcon(NIM_ADD, ¬ify_icon_data)) + { + ShowErrorMessageBox(L"The notify icon couldn't be added."); + return false; + } + + // ...and to set it's version. + if (!Shell_NotifyIcon(NIM_SETVERSION, ¬ify_icon_data)) + { + ShowErrorMessageBox(L"The requested NOTIFYICON_VERSION_4 isn't supported."); + return false; + } + + return true; +} + +static void RemoveNotifyIcon() +{ + // Remove the icon from the notification area. + Shell_NotifyIcon(NIM_DELETE, ¬ify_icon_data); + // The icon has to be destroyed because it was retrieved by LoadIconMetric. + DestroyIcon(notify_icon_data.hIcon); +} + +static bool InstallMSLLHook() +{ + msll_hook = SetWindowsHookEx(WH_MOUSE_LL, LowLevelMouseProc, NULL, 0); + if (!msll_hook) + { + ShowErrorMessageBox(L"The mouse hook couldn't be installed."); + return false; + } + return true; +} + +static void UninstallMSLLHook() +{ + if (msll_hook) UnhookWindowsHookEx(msll_hook); +} + +// ToDo: Add optparse wchar support to switch to wWinMain and replace atoi? +static void ProcessCommandLineArgs() +{ + struct optparse_long longopts[] = + { + { "qpc", 'q', OPTPARSE_NONE }, + { "threshold", 't', OPTPARSE_REQUIRED }, + { "left", 'l', OPTPARSE_OPTIONAL }, + { "right", 'r', OPTPARSE_OPTIONAL }, + { "middle", 'm', OPTPARSE_OPTIONAL }, + { "four", 'b', OPTPARSE_OPTIONAL }, + { "five", 'f', OPTPARSE_OPTIONAL }, + { 0 } + }; + + int option; + struct optparse options; + + optparse_init(&options, __argv); + + while ((option = optparse_long(&options, longopts, NULL)) != -1) + { + switch (option) + { + case 'q': + use_qpc = true; + break; + case 't': + SetDoubleClickThreshold(atoi(options.optarg), MOUSE_BUTTON_COUNT); + break; + case 'l': + mouse_button_data[MOUSE_BUTTON_LEFT].isMonitored = true; + if (options.optarg) SetDoubleClickThreshold(atoi(options.optarg), MOUSE_BUTTON_LEFT); + break; + case 'r': + mouse_button_data[MOUSE_BUTTON_RIGHT].isMonitored = true; + if (options.optarg) SetDoubleClickThreshold(atoi(options.optarg), MOUSE_BUTTON_RIGHT); + break; + case 'm': + mouse_button_data[MOUSE_BUTTON_MIDDLE].isMonitored = true; + if (options.optarg) SetDoubleClickThreshold(atoi(options.optarg), MOUSE_BUTTON_MIDDLE); + break; + case 'b': + mouse_button_data[MOUSE_BUTTON_X1].isMonitored = true; + if (options.optarg) SetDoubleClickThreshold(atoi(options.optarg), MOUSE_BUTTON_X1); + break; + case 'f': + mouse_button_data[MOUSE_BUTTON_X2].isMonitored = true; + if (options.optarg) SetDoubleClickThreshold(atoi(options.optarg), MOUSE_BUTTON_X2); + break; + default:; + } + } +} + +static void PrepareMouseButtonData() +{ + if (use_qpc && !QueryPerformanceFrequency((LARGE_INTEGER*)&counts_per_second)) + { + // That shouldn't happen for systems that run on Windows XP or later. + ShowErrorMessageBox( + L"Apparently your system doesn't support the high-resolution performance counter." + L"Please remove -q; --qpc from the command line parameters." + L"Switching to the ordinary timing method now."); + use_qpc = false; + } + + if (use_qpc) + // double_click_threshold : counts per x ms + // Setting it like that will safe time in the hook callback because we do not have to convert the counts to ms everytime. + double_click_threshold = double_click_threshold_ms * counts_per_second / 1000; + else + double_click_threshold = double_click_threshold_ms; + + // Set the individual button thresholds to the global threshold if they weren't specified in the launch options. + bool isButtonSpecified = false; + for (int i = MOUSE_BUTTON_COUNT; i--;) + { + if (!mouse_button_data[i].thresholdMs) + { + mouse_button_data[i].threshold = double_click_threshold_ms; + mouse_button_data[i].thresholdMs = double_click_threshold_ms; + } + + if (use_qpc) + mouse_button_data[i].threshold *= counts_per_second / 1000; + + if (mouse_button_data[i].isMonitored) + isButtonSpecified = true; + } + + // Default the monitored button to the left one if none were specified in the launch options. + if (!isButtonSpecified) + mouse_button_data[MOUSE_BUTTON_LEFT].isMonitored = true; +} + +static void SetDoubleClickThreshold(const int threshold, const MouseButton button) +{ + // Set double click threshold for passed button if in value range. + if (threshold >= double_click_threshold_ms_min && threshold <= double_click_threshold_ms_max) + { + // Exception: Set the general threshold if MOUSE_BUTTON_COUNT was passed. + if (button == MOUSE_BUTTON_COUNT) + double_click_threshold_ms = threshold; + else + mouse_button_data[button].thresholdMs = threshold; + } + else + ShowErrorMessageBox(L"Invalid threshold for '%s Mouse Button': %d (min: %I32ums max: %I32ums)", + GetButtonName(button), threshold, double_click_threshold_ms_min, double_click_threshold_ms_max); +} + +static void ShowContextMenu(const HWND hWnd, const int x, const int y) +{ + // The current window must be the foreground window before calling TrackPopupMenu. + // Otherwise, the menu will not disappear when the user clicks outside of the menu. + SetForegroundWindow(hWnd); + + const HMENU hMenu = CreatePopupMenu(); + if (hMenu) + { + WCHAR buffer[64]; + uint32_t totalblocks = 0; + + // Calculate total blocked clicks. + for (int i = MOUSE_BUTTON_COUNT; i--;) + totalblocks += mouse_button_data[i].blocks; + + // Add general information. + StringCchPrintf(buffer, 64, L"General\t%6I32u blocks %03I32u ms", totalblocks, double_click_threshold_ms); + InsertMenu(hMenu, -1, MF_BYPOSITION | MF_STRING | MF_GRAYED, 0, buffer); + InsertMenu(hMenu, -1, MF_BYPOSITION | MF_SEPARATOR, 0, NULL); + + // Add individual button information. + for (int i = 0; i < MOUSE_BUTTON_COUNT; i++) + { + if (mouse_button_data[i].isMonitored) + { + StringCchPrintf(buffer, 64, L"%s Mouse Button\t%6I32u blocks %03I32u ms", + GetButtonName(i), mouse_button_data[i].blocks, mouse_button_data[i].thresholdMs); + InsertMenu(hMenu, -1, MF_BYPOSITION | MF_STRING | MF_GRAYED, 0, buffer); + } + } + + // Add exit item. + InsertMenu(hMenu, -1, MF_BYPOSITION | MF_SEPARATOR, 0, NULL); + InsertMenu(hMenu, -1, MF_BYPOSITION | MF_STRING, IDM_EXIT, L"Exit"); + + // The window does not receive a WM_COMMAND message from the menu until the function returns. + TrackPopupMenu(hMenu, TPM_BOTTOMALIGN, x, y, 0, hWnd, NULL); + DestroyMenu(hMenu); + } + else + { + ShowErrorMessageBox(L"The popup menu couldn't be created. Exiting now.."); + PostMessage(hWnd, WM_CLOSE, 0, 0); + } +} + +static void CDECL ShowErrorMessageBox(LPCWSTR message, ...) +{ + WCHAR buffer[1024]; + va_list args; + va_start(args, message); + StringCchVPrintf(buffer, ARRAYSIZE(buffer), message, args); + va_end(args); + + // Set hWnd to NULL, so the message box will not have a owner window, + // which is invisible anyway. With NULL it'll also show up in the taskbar. + MessageBox(NULL, buffer, APPNAME, MB_OK | MB_ICONEXCLAMATION); +} + +static inline MouseButton GetButtonByWParam(const WPARAM wParam, const PMSLLHOOKSTRUCT pdata) +{ + switch (wParam) + { + case WM_LBUTTONDOWN: case WM_LBUTTONUP: + return MOUSE_BUTTON_LEFT; + case WM_RBUTTONDOWN: case WM_RBUTTONUP: + return MOUSE_BUTTON_RIGHT; + case WM_MBUTTONDOWN: case WM_MBUTTONUP: + return MOUSE_BUTTON_MIDDLE; + case WM_XBUTTONDOWN: case WM_XBUTTONUP: + return HIWORD(pdata->mouseData) == XBUTTON1 ? MOUSE_BUTTON_X1 : MOUSE_BUTTON_X2; + default: + return MOUSE_BUTTON_UNKNOWN; // That shouldn't happen.. + } +} + +static LPCWSTR GetButtonName(const MouseButton button) +{ + switch (button) + { + case MOUSE_BUTTON_LEFT: return L"Left"; + case MOUSE_BUTTON_RIGHT: return L"Right"; + case MOUSE_BUTTON_MIDDLE: return L"Middle"; + case MOUSE_BUTTON_X1: return L"4th"; + case MOUSE_BUTTON_X2: return L"5th"; + case MOUSE_BUTTON_COUNT: return L"Every"; + default: return NULL; + } +} diff --git a/Mouse Debouncer/notify.ico b/Mouse Debouncer/notify.ico new file mode 100644 index 0000000000000000000000000000000000000000..2a54ae51063ce10d6726fe0ee19af5673ce97e1f GIT binary patch literal 5430 zcmdUvJ&qGW5QS?I5+Qp4q;Z5e0ukmGT!BNN_4oqh8#(0$q(p26OGLy^wntzrSsto- z`Wy9>x~B(wk)WmW>#lnBUiDaNkqdbsmzSbzC9fZfJhk0wIKR{UTg^Swqfsn<5q@=} z`O@n9UNl;bxn=dNgy!iDoZH)5Nh7W21fprS7acT8{gzj5p9JR-&8O6FrPynjhG~ZL z!hU8*^@7HNeth9i#$C{lcj%|t?q;jjZ@fy(eLs`0E@nzGHU)3;ma}~X=9=?|1CITs z5#w+6w~3GWd4H>y{6kI4K_lKf?H}uWACIxuEJ|zCruXM#k((Ql&vznUUWt5tKj61t ziW)yOK0Ffnu1I`R?nmvhUVCR&8ZR}*cP6||ny4%tQY>sKa=+5-bNM!EjCyviE%T0X zjyH3e#wq^ZJLvG<%%S>adu#WmUh1Fo^tGG@`Zd(vbS=JjZHAgJ^~46;wh z)i?tjQLXX6K);6g!&6Q4JXZZ}9rEQk}rAqiZ;7xWp(XtF0wrI z(61r9@6Q}(;Hm!hc7`|L3^a|fxL*z7-#6BLso%FR zdg#{>zGC?PIex4`UBt`j$*VSOg2!Qz}^OEF?w^2_D5XSUzfjT^j8%hmK)en)fO5PGpF~y4fE$yIgd~P19XnHQkFh&Ed)OwRxKNZ?1g1?f?J) literal 0 HcmV?d00001 diff --git a/Mouse Debouncer/optparse.h b/Mouse Debouncer/optparse.h new file mode 100644 index 0000000..ed5c220 --- /dev/null +++ b/Mouse Debouncer/optparse.h @@ -0,0 +1,414 @@ +/* Optparse --- portable, reentrant, embeddable, getopt-like option parser +* +* This is free and unencumbered software released into the public domain. +* +* To get the implementation, define OPTPARSE_IMPLEMENTATION. +* Optionally define OPTPARSE_API to control the API's visibility +* and/or linkage (static, __attribute__, __declspec). +* +* The POSIX getopt() option parser has three fatal flaws. These flaws +* are solved by Optparse. +* +* 1) Parser state is stored entirely in global variables, some of +* which are static and inaccessible. This means only one thread can +* use getopt(). It also means it's not possible to recursively parse +* nested sub-arguments while in the middle of argument parsing. +* Optparse fixes this by storing all state on a local struct. +* +* 2) The POSIX standard provides no way to properly reset the parser. +* This means for portable code that getopt() is only good for one +* run, over one argv with one option string. It also means subcommand +* options cannot be processed with getopt(). Most implementations +* provide a method to reset the parser, but it's not portable. +* Optparse provides an optparse_arg() function for stepping over +* subcommands and continuing parsing of options with another option +* string. The Optparse struct itself can be passed around to +* subcommand handlers for additional subcommand option parsing. A +* full reset can be achieved by with an additional optparse_init(). +* +* 3) Error messages are printed to stderr. This can be disabled with +* opterr, but the messages themselves are still inaccessible. +* Optparse solves this by writing an error message in its errmsg +* field. The downside to Optparse is that this error message will +* always be in English rather than the current locale. +* +* Optparse should be familiar with anyone accustomed to getopt(), and +* it could be a nearly drop-in replacement. The option string is the +* same and the fields have the same names as the getopt() global +* variables (optarg, optind, optopt). +* +* Optparse also supports GNU-style long options with optparse_long(). +* The interface is slightly different and simpler than getopt_long(). +* +* By default, argv is permuted as it is parsed, moving non-option +* arguments to the end. This can be disabled by setting the `permute` +* field to 0 after initialization. +*/ +#ifndef OPTPARSE_H +#define OPTPARSE_H + +#ifndef OPTPARSE_API +# define OPTPARSE_API +#endif + +struct optparse { + char **argv; + int permute; + int optind; + int optopt; + char *optarg; + char errmsg[64]; + int subopt; +}; + +enum optparse_argtype { + OPTPARSE_NONE, + OPTPARSE_REQUIRED, + OPTPARSE_OPTIONAL +}; + +struct optparse_long { + const char *longname; + int shortname; + enum optparse_argtype argtype; +}; + +/** +* Initializes the parser state. +*/ +OPTPARSE_API +void optparse_init(struct optparse *options, char **argv); + +/** +* Read the next option in the argv array. +* @param optstring a getopt()-formatted option string. +* @return the next option character, -1 for done, or '?' for error +* +* Just like getopt(), a character followed by no colons means no +* argument. One colon means the option has a required argument. Two +* colons means the option takes an optional argument. +*/ +OPTPARSE_API +int optparse(struct optparse *options, const char *optstring); + +/** +* Handles GNU-style long options in addition to getopt() options. +* This works a lot like GNU's getopt_long(). The last option in +* longopts must be all zeros, marking the end of the array. The +* longindex argument may be NULL. +*/ +OPTPARSE_API +int optparse_long(struct optparse *options, + const struct optparse_long *longopts, + int *longindex); + +/** +* Used for stepping over non-option arguments. +* @return the next non-option argument, or NULL for no more arguments +* +* Argument parsing can continue with optparse() after using this +* function. That would be used to parse the options for the +* subcommand returned by optparse_arg(). This function allows you to +* ignore the value of optind. +*/ +OPTPARSE_API +char *optparse_arg(struct optparse *options); + +/* Implementation */ +#ifdef OPTPARSE_IMPLEMENTATION + +#define OPTPARSE_MSG_INVALID "invalid option" +#define OPTPARSE_MSG_MISSING "option requires an argument" +#define OPTPARSE_MSG_TOOMANY "option takes no arguments" + +static int +optparse_error(struct optparse *options, const char *msg, const char *data) +{ + unsigned p = 0; + const char *sep = " -- '"; + while (*msg) + options->errmsg[p++] = *msg++; + while (*sep) + options->errmsg[p++] = *sep++; + while (p < sizeof(options->errmsg) - 2 && *data) + options->errmsg[p++] = *data++; + options->errmsg[p++] = '\''; + options->errmsg[p++] = '\0'; + return '?'; +} + +OPTPARSE_API +void +optparse_init(struct optparse *options, char **argv) +{ + options->argv = argv; + options->permute = 1; + options->optind = 1; + options->subopt = 0; + options->optarg = 0; + options->errmsg[0] = '\0'; +} + +static int +optparse_is_dashdash(const char *arg) +{ + return arg != 0 && arg[0] == '-' && arg[1] == '-' && arg[2] == '\0'; +} + +static int +optparse_is_shortopt(const char *arg) +{ + return arg != 0 && arg[0] == '-' && arg[1] != '-' && arg[1] != '\0'; +} + +static int +optparse_is_longopt(const char *arg) +{ + return arg != 0 && arg[0] == '-' && arg[1] == '-' && arg[2] != '\0'; +} + +static void +optparse_permute(struct optparse *options, int index) +{ + char *nonoption = options->argv[index]; + int i; + for (i = index; i < options->optind - 1; i++) + options->argv[i] = options->argv[i + 1]; + options->argv[options->optind - 1] = nonoption; +} + +static int +optparse_argtype(const char *optstring, char c) +{ + int count = OPTPARSE_NONE; + if (c == ':') + return -1; + for (; *optstring && c != *optstring; optstring++); + if (!*optstring) + return -1; + if (optstring[1] == ':') + count += optstring[2] == ':' ? 2 : 1; + return count; +} + +OPTPARSE_API +int +optparse(struct optparse *options, const char *optstring) +{ + int type; + char *next; + char *option = options->argv[options->optind]; + options->errmsg[0] = '\0'; + options->optopt = 0; + options->optarg = 0; + if (option == 0) { + return -1; + } + else if (optparse_is_dashdash(option)) { + options->optind++; /* consume "--" */ + return -1; + } + else if (!optparse_is_shortopt(option)) { + if (options->permute) { + int index = options->optind++; + int r = optparse(options, optstring); + optparse_permute(options, index); + options->optind--; + return r; + } + else { + return -1; + } + } + option += options->subopt + 1; + options->optopt = option[0]; + type = optparse_argtype(optstring, option[0]); + next = options->argv[options->optind + 1]; + switch (type) { + case -1: { + char str[2] = { 0, 0 }; + str[0] = option[0]; + options->optind++; + return optparse_error(options, OPTPARSE_MSG_INVALID, str); + } + case OPTPARSE_NONE: + if (option[1]) { + options->subopt++; + } + else { + options->subopt = 0; + options->optind++; + } + return option[0]; + case OPTPARSE_REQUIRED: + options->subopt = 0; + options->optind++; + if (option[1]) { + options->optarg = option + 1; + } + else if (next != 0) { + options->optarg = next; + options->optind++; + } + else { + char str[2] = { 0, 0 }; + str[0] = option[0]; + options->optarg = 0; + return optparse_error(options, OPTPARSE_MSG_MISSING, str); + } + return option[0]; + case OPTPARSE_OPTIONAL: + options->subopt = 0; + options->optind++; + if (option[1]) + options->optarg = option + 1; + else + options->optarg = 0; + return option[0]; + } + return 0; +} + +OPTPARSE_API +char * +optparse_arg(struct optparse *options) +{ + char *option = options->argv[options->optind]; + options->subopt = 0; + if (option != 0) + options->optind++; + return option; +} + +static int +optparse_longopts_end(const struct optparse_long *longopts, int i) +{ + return !longopts[i].longname && !longopts[i].shortname; +} + +static void +optparse_from_long(const struct optparse_long *longopts, char *optstring) +{ + char *p = optstring; + int i; + for (i = 0; !optparse_longopts_end(longopts, i); i++) { + if (longopts[i].shortname) { + int a; + *p++ = longopts[i].shortname; + for (a = 0; a < (int)longopts[i].argtype; a++) + *p++ = ':'; + } + } + *p = '\0'; +} + +/* Unlike strcmp(), handles options containing "=". */ +static int +optparse_longopts_match(const char *longname, const char *option) +{ + const char *a = option, *n = longname; + if (longname == 0) + return 0; + for (; *a && *n && *a != '='; a++, n++) + if (*a != *n) + return 0; + return *n == '\0' && (*a == '\0' || *a == '='); +} + +/* Return the part after "=", or NULL. */ +static char * +optparse_longopts_arg(char *option) +{ + for (; *option && *option != '='; option++); + if (*option == '=') + return option + 1; + else + return 0; +} + +static int +optparse_long_fallback(struct optparse *options, + const struct optparse_long *longopts, + int *longindex) +{ + int result; + char optstring[96 * 3 + 1]; /* 96 ASCII printable characters */ + optparse_from_long(longopts, optstring); + result = optparse(options, optstring); + if (longindex != 0) { + *longindex = -1; + if (result != -1) { + int i; + for (i = 0; !optparse_longopts_end(longopts, i); i++) + if (longopts[i].shortname == options->optopt) + *longindex = i; + } + } + return result; +} + +OPTPARSE_API +int +optparse_long(struct optparse *options, + const struct optparse_long *longopts, + int *longindex) +{ + int i; + char *option = options->argv[options->optind]; + if (option == 0) { + return -1; + } + else if (optparse_is_dashdash(option)) { + options->optind++; /* consume "--" */ + return -1; + } + else if (optparse_is_shortopt(option)) { + return optparse_long_fallback(options, longopts, longindex); + } + else if (!optparse_is_longopt(option)) { + if (options->permute) { + int index = options->optind++; + int r = optparse_long(options, longopts, longindex); + optparse_permute(options, index); + options->optind--; + return r; + } + else { + return -1; + } + } + + /* Parse as long option. */ + options->errmsg[0] = '\0'; + options->optopt = 0; + options->optarg = 0; + option += 2; /* skip "--" */ + options->optind++; + for (i = 0; !optparse_longopts_end(longopts, i); i++) { + const char *name = longopts[i].longname; + if (optparse_longopts_match(name, option)) { + char *arg; + if (longindex) + *longindex = i; + options->optopt = longopts[i].shortname; + arg = optparse_longopts_arg(option); + if (longopts[i].argtype == OPTPARSE_NONE && arg != 0) { + return optparse_error(options, OPTPARSE_MSG_TOOMANY, name); + } if (arg != 0) { + options->optarg = arg; + } + else if (longopts[i].argtype == OPTPARSE_REQUIRED) { + options->optarg = options->argv[options->optind]; + if (options->optarg == 0) + return optparse_error(options, OPTPARSE_MSG_MISSING, name); + else + options->optind++; + } + return options->optopt; + } + } + return optparse_error(options, OPTPARSE_MSG_INVALID, option); +} + +#endif /* OPTPARSE_IMPLEMENTATION */ +#endif /* OPTPARSE_H */ \ No newline at end of file diff --git a/Mouse Debouncer/resource.h b/Mouse Debouncer/resource.h new file mode 100644 index 0000000..8c38c2a --- /dev/null +++ b/Mouse Debouncer/resource.h @@ -0,0 +1,17 @@ +//{{NO_DEPENDENCIES}} +// Microsoft Visual C++ generated include file. +// Used by Mouse Debouncer.rc +// +#define IDI_MAINICON 101 +#define IDI_NOTIFYICON 102 + +// Next default values for new objects +// +#ifdef APSTUDIO_INVOKED +#ifndef APSTUDIO_READONLY_SYMBOLS +#define _APS_NEXT_RESOURCE_VALUE 103 +#define _APS_NEXT_COMMAND_VALUE 40001 +#define _APS_NEXT_CONTROL_VALUE 1001 +#define _APS_NEXT_SYMED_VALUE 101 +#endif +#endif