From fed7ee70a662f7c44a7d8faa3b00dd74bc6d5f03 Mon Sep 17 00:00:00 2001 From: Katayama Hirofumi MZ Date: Sat, 16 Dec 2023 20:46:40 +0900 Subject: [PATCH] [SHIMGVW] Enable middle button dragging (#6173) --- dll/win32/shimgvw/CMakeLists.txt | 3 ++ dll/win32/shimgvw/res/handdrag.cur | Bin 0 -> 326 bytes dll/win32/shimgvw/resource.h | 3 ++ dll/win32/shimgvw/shimgvw.c | 70 ++++++++++++++++++++++++++++- dll/win32/shimgvw/shimgvw.rc | 2 + 5 files changed, 76 insertions(+), 2 deletions(-) create mode 100644 dll/win32/shimgvw/res/handdrag.cur diff --git a/dll/win32/shimgvw/CMakeLists.txt b/dll/win32/shimgvw/CMakeLists.txt index 3c2f5a1f3c3..1a4589abd43 100644 --- a/dll/win32/shimgvw/CMakeLists.txt +++ b/dll/win32/shimgvw/CMakeLists.txt @@ -9,6 +9,9 @@ list(APPEND SOURCE ${CMAKE_CURRENT_BINARY_DIR}/shimgvw_stubs.c ${CMAKE_CURRENT_BINARY_DIR}/shimgvw.def) +file(GLOB_RECURSE shimgvw_rc_deps res/*.*) +add_rc_deps(shimgvw.rc ${shimgvw_rc_deps}) + add_library(shimgvw MODULE ${SOURCE}) set_module_type(shimgvw win32dll UNICODE) target_link_libraries(shimgvw wine) diff --git a/dll/win32/shimgvw/res/handdrag.cur b/dll/win32/shimgvw/res/handdrag.cur new file mode 100644 index 0000000000000000000000000000000000000000..74e5ba6b9c2b8e84d7696ce289ed5ba5296f4efa GIT binary patch literal 326 zcmZ|Ku?@m75CzchP*9;z(c+Sl4Zm_nMouseDownMsg = uMsg; + pData->m_ptOrigin.x = GET_X_LPARAM(lParam); + pData->m_ptOrigin.y = GET_Y_LPARAM(lParam); + SetCapture(hwnd); + SetCursor(LoadCursorW(g_hInstance, MAKEINTRESOURCEW(IDC_HANDDRAG))); +} + +static VOID +ZoomWnd_OnMouseMove(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) +{ + PPREVIEW_DATA pData = Preview_GetData(hwnd); + POINT pt = { GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam) }; + + if (pData->m_nMouseDownMsg == WM_MBUTTONDOWN) + { + INT x = GetScrollPos(hwnd, SB_HORZ) - (pt.x - pData->m_ptOrigin.x); + INT y = GetScrollPos(hwnd, SB_VERT) - (pt.y - pData->m_ptOrigin.y); + SendMessageW(hwnd, WM_HSCROLL, MAKEWPARAM(SB_THUMBPOSITION, x), 0); + SendMessageW(hwnd, WM_VSCROLL, MAKEWPARAM(SB_THUMBPOSITION, y), 0); + pData->m_ptOrigin = pt; + } +} + +static BOOL +ZoomWnd_OnSetCursor(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) +{ + PPREVIEW_DATA pData = Preview_GetData(hwnd); + if (pData->m_nMouseDownMsg == WM_MBUTTONDOWN) + { + SetCursor(LoadCursorW(g_hInstance, MAKEINTRESOURCEW(IDC_HANDDRAG))); + return TRUE; + } + return FALSE; +} + +static VOID +ZoomWnd_OnButtonUp(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) +{ + PPREVIEW_DATA pData = Preview_GetData(hwnd); + pData->m_nMouseDownMsg = 0; + ReleaseCapture(); } static VOID @@ -995,6 +1044,23 @@ ZoomWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) ZoomWnd_OnButtonDown(hwnd, uMsg, wParam, lParam); break; } + case WM_MOUSEMOVE: + { + ZoomWnd_OnMouseMove(hwnd, uMsg, wParam, lParam); + break; + } + case WM_SETCURSOR: + { + if (!ZoomWnd_OnSetCursor(hwnd, uMsg, wParam, lParam)) + return DefWindowProcW(hwnd, uMsg, wParam, lParam); + } + case WM_LBUTTONUP: + case WM_MBUTTONUP: + case WM_RBUTTONUP: + { + ZoomWnd_OnButtonUp(hwnd, uMsg, wParam, lParam); + break; + } case WM_PAINT: { ZoomWnd_OnPaint(pData, hwnd); diff --git a/dll/win32/shimgvw/shimgvw.rc b/dll/win32/shimgvw/shimgvw.rc index 58684a5d95b..f42c29154cd 100644 --- a/dll/win32/shimgvw/shimgvw.rc +++ b/dll/win32/shimgvw/shimgvw.rc @@ -17,6 +17,8 @@ IDI_APP_ICON ICON "res/main.ico" IDI_BMP_ICON ICON "res/bmp.ico" IDI_PNG_ICON ICON "res/png.ico" +IDC_HANDDRAG CURSOR "res/handdrag.cur" + IDB_PREV_PIC BITMAP "res/prev.bmp" IDB_NEXT_PIC BITMAP "res/next.bmp" IDB_BEST_FIT BITMAP "res/best_fit.bmp"