From 7f8c13ae098372f4ccd3e25d24b2d977dfda88e7 Mon Sep 17 00:00:00 2001 From: twinaphex Date: Fri, 13 Mar 2020 02:20:31 +0100 Subject: [PATCH] (GDI/Win32) Refactor code - handle doubleclick press on title bar inside DInput driver --- gfx/common/win32_common.c | 72 ++++++++++++++--------------------- gfx/drivers_context/gdi_ctx.c | 2 +- gfx/drivers_context/wgl_ctx.c | 4 +- input/drivers/dinput.c | 20 +++++----- 4 files changed, 42 insertions(+), 56 deletions(-) diff --git a/gfx/common/win32_common.c b/gfx/common/win32_common.c index ff0e3fc02f..83bf4e71cf 100644 --- a/gfx/common/win32_common.c +++ b/gfx/common/win32_common.c @@ -115,11 +115,6 @@ static HDEVNOTIFY notification_handler; #ifdef HAVE_DINPUT extern bool dinput_handle_message(void *dinput, UINT message, WPARAM wParam, LPARAM lParam); -#ifdef HAVE_GDI -extern void *dinput_gdi; -#endif -extern void *dinput_wgl; -extern void *dinput; #endif typedef struct DISPLAYCONFIG_RATIONAL_CUSTOM { @@ -219,7 +214,6 @@ typedef LONG (WINAPI *QUERYDISPLAYCONFIG)(UINT32, UINT32*, DISPLAYCONFIG_PATH_IN typedef LONG (WINAPI *GETDISPLAYCONFIGBUFFERSIZES)(UINT32, UINT32*, UINT32*); bool g_win32_restore_desktop = false; -static bool doubleclick_on_titlebar = false; static bool taskbar_is_created = false; bool g_win32_inited = false; @@ -307,16 +301,6 @@ bool win32_taskbar_is_created(void) return taskbar_is_created; } -bool doubleclick_on_titlebar_pressed(void) -{ - return doubleclick_on_titlebar; -} - -void unset_doubleclick_on_titlebar(void) -{ - doubleclick_on_titlebar = false; -} - static INT_PTR_COMPAT CALLBACK PickCoreProc( HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) @@ -848,7 +832,19 @@ static LRESULT CALLBACK WndProcCommon(bool *quit, HWND hwnd, UINT message, switch (message) { case WM_NCLBUTTONDBLCLK: - doubleclick_on_titlebar = true; +#if _WIN32_WINNT >= 0x0500 /* 2K */ + if (g_win32->taskbar_message && message == g_win32->taskbar_message) + taskbar_is_created = true; +#endif +#ifdef HAVE_DINPUT + if (input_get_ptr() == &input_dinput) + { + void* input_data = input_get_data(); + if (input_data && dinput_handle_message(input_data, + message, wparam, lparam)) + return 0; + } +#endif break; case WM_SYSCOMMAND: /* Prevent screensavers, etc, while running. */ @@ -1004,6 +1000,7 @@ LRESULT CALLBACK WndProcD3D(HWND hwnd, UINT message, case WM_DEVICECHANGE: case WM_MOUSEWHEEL: case WM_MOUSEHWHEEL: + case WM_NCLBUTTONDBLCLK: #if _WIN32_WINNT >= 0x0500 /* 2K */ if (g_win32->taskbar_message && message == g_win32->taskbar_message) taskbar_is_created = true; @@ -1016,13 +1013,6 @@ LRESULT CALLBACK WndProcD3D(HWND hwnd, UINT message, message, wparam, lparam)) return 0; } -#endif - break; - case WM_NCLBUTTONDBLCLK: - doubleclick_on_titlebar = true; -#if _WIN32_WINNT >= 0x0500 /* 2K */ - if (g_win32->taskbar_message && message == g_win32->taskbar_message) - taskbar_is_created = true; #endif break; case WM_DROPFILES: @@ -1075,21 +1065,18 @@ LRESULT CALLBACK WndProcWGL(HWND hwnd, UINT message, case WM_DEVICECHANGE: case WM_MOUSEWHEEL: case WM_MOUSEHWHEEL: + case WM_NCLBUTTONDBLCLK: #if _WIN32_WINNT >= 0x0500 /* 2K */ if (g_win32->taskbar_message && message == g_win32->taskbar_message) taskbar_is_created = true; #endif #ifdef HAVE_DINPUT - if (dinput_wgl && dinput_handle_message(dinput_wgl, - message, wparam, lparam)) - return 0; -#endif - break; - case WM_NCLBUTTONDBLCLK: - doubleclick_on_titlebar = true; -#if _WIN32_WINNT >= 0x0500 /* 2K */ - if (g_win32->taskbar_message && message == g_win32->taskbar_message) - taskbar_is_created = true; + { + void* input_data = input_get_data(); + if (input_data && dinput_handle_message(input_data, + message, wparam, lparam)) + return 0; + } #endif break; case WM_DROPFILES: @@ -1142,21 +1129,18 @@ LRESULT CALLBACK WndProcGDI(HWND hwnd, UINT message, case WM_DEVICECHANGE: case WM_MOUSEWHEEL: case WM_MOUSEHWHEEL: + case WM_NCLBUTTONDBLCLK: #if _WIN32_WINNT >= 0x0500 /* 2K */ if (g_win32->taskbar_message && message == g_win32->taskbar_message) taskbar_is_created = true; #endif #ifdef HAVE_DINPUT - if (dinput_gdi && dinput_handle_message(dinput_gdi, - message, wparam, lparam)) - return 0; -#endif - break; - case WM_NCLBUTTONDBLCLK: - doubleclick_on_titlebar = true; -#if _WIN32_WINNT >= 0x0500 /* 2K */ - if (g_win32->taskbar_message && message == g_win32->taskbar_message) - taskbar_is_created = true; + { + void* input_data = input_get_data(); + if (input_data && dinput_handle_message(input_data, + message, wparam, lparam)) + return 0; + } #endif break; case WM_PAINT: diff --git a/gfx/drivers_context/gdi_ctx.c b/gfx/drivers_context/gdi_ctx.c index 816f191325..0025b38c89 100644 --- a/gfx/drivers_context/gdi_ctx.c +++ b/gfx/drivers_context/gdi_ctx.c @@ -54,7 +54,7 @@ typedef struct gfx_ctx_gdi_data void *empty; } gfx_ctx_gdi_data_t; -void *dinput_gdi; +static void *dinput_gdi; static void gfx_ctx_gdi_check_window(void *data, bool *quit, bool *resize, unsigned *width, unsigned *height) diff --git a/gfx/drivers_context/wgl_ctx.c b/gfx/drivers_context/wgl_ctx.c index 6d26f3306f..d501833968 100644 --- a/gfx/drivers_context/wgl_ctx.c +++ b/gfx/drivers_context/wgl_ctx.c @@ -114,6 +114,8 @@ static gfx_ctx_vulkan_data_t win32_vk; static egl_ctx_data_t win32_egl; #endif +static void *dinput_wgl = NULL; + static unsigned win32_major = 0; static unsigned win32_minor = 0; static int win32_interval = 0; @@ -466,8 +468,6 @@ void create_graphics_context(HWND hwnd, bool *quit) } } -void *dinput_wgl; - static void gfx_ctx_wgl_swap_interval(void *data, int interval) { (void)data; diff --git a/input/drivers/dinput.c b/input/drivers/dinput.c index e155e9d58b..0aae49cb4c 100644 --- a/input/drivers/dinput.c +++ b/input/drivers/dinput.c @@ -84,6 +84,7 @@ struct dinput_input int mouse_rel_y; int mouse_x; int mouse_y; + bool doubleclick_on_titlebar; bool mouse_l, mouse_r, mouse_m, mouse_b4, mouse_b5, mouse_wu, mouse_wd, mouse_hwu, mouse_hwd; struct pointer_status pointer_head; /* dummy head for easier iteration */ }; @@ -190,9 +191,6 @@ static void *dinput_init(const char *joypad_driver) return di; } -bool doubleclick_on_titlebar_pressed(void); -void unset_doubleclick_on_titlebar(void); - static void dinput_poll(void *data) { struct dinput_input *di = (struct dinput_input*)data; @@ -236,8 +234,8 @@ static void dinput_poll(void *data) di->mouse_rel_y = mouse_state.lY; if (!mouse_state.rgbButtons[0]) - unset_doubleclick_on_titlebar(); - if (doubleclick_on_titlebar_pressed()) + di->doubleclick_on_titlebar = false; + if (di->doubleclick_on_titlebar) di->mouse_l = 0; else di->mouse_l = mouse_state.rgbButtons[0]; @@ -581,7 +579,7 @@ static int16_t dinput_input_state(void *data, if (binds[port][i].valid) { - /* Auto-binds are per joypad, not per user. */ + /* Auto-binds are per joypad, not per user. */ const uint64_t joykey = (binds[port][i].joykey != NO_BTN) ? binds[port][i].joykey : joypad_info->auto_binds[i].joykey; const uint32_t joyaxis = (binds[port][i].joyaxis != AXIS_NONE) @@ -623,7 +621,7 @@ static int16_t dinput_input_state(void *data, } if (binds[port][id].valid) { - /* Auto-binds are per joypad, not per user. */ + /* Auto-binds are per joypad, not per user. */ const uint64_t joykey = (binds[port][id].joykey != NO_BTN) ? binds[port][id].joykey : joypad_info->auto_binds[id].joykey; const uint32_t joyaxis = (binds[port][id].joyaxis != AXIS_NONE) @@ -735,7 +733,7 @@ static int16_t dinput_input_state(void *data, } if (binds[port][new_id].valid) { - /* Auto-binds are per joypad, not per user. */ + /* Auto-binds are per joypad, not per user. */ const uint64_t joykey = (binds[port][new_id].joykey != NO_BTN) ? binds[port][new_id].joykey : joypad_info->auto_binds[new_id].joykey; const uint32_t joyaxis = (binds[port][new_id].joyaxis != AXIS_NONE) @@ -852,7 +850,8 @@ static void dinput_clear_pointers(struct dinput_input *di) } } -bool dinput_handle_message(void *data, UINT message, WPARAM wParam, LPARAM lParam) +bool dinput_handle_message(void *data, + UINT message, WPARAM wParam, LPARAM lParam) { struct dinput_input *di = (struct dinput_input *)data; /* WM_POINTERDOWN : Arrives for each new touch event @@ -865,6 +864,9 @@ bool dinput_handle_message(void *data, UINT message, WPARAM wParam, LPARAM lPara switch (message) { + case WM_NCLBUTTONDBLCLK: + di->doubleclick_on_titlebar = true; + break; case WM_MOUSEMOVE: di->window_pos_x = GET_X_LPARAM(lParam); di->window_pos_y = GET_Y_LPARAM(lParam);