[gtk: 1/2] GdkWin32: Send smooth scroll events
- From: Luca Bacci <lbacci src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk: 1/2] GdkWin32: Send smooth scroll events
- Date: Fri, 6 May 2022 14:58:33 +0000 (UTC)
commit 66a0e0a59e46986b8b11d36c94b8397aa68bf2a6
Author: Luca Bacci <luca bacci982 gmail com>
Date: Tue Apr 12 11:00:03 2022 +0200
GdkWin32: Send smooth scroll events
Bring back smooth scroll events as the issues mentioned
in [1] do not occur anymore. Also rework code style and
comments.
References:
[1] GTK4: Scrolling hides mouse on windows
https://gitlab.gnome.org/GNOME/gtk/-/issues/3581
[2] Why are mouse wheel messages delivered to the focus window
instead of the window under the mouse?
https://devblogs.microsoft.com/oldnewthing/20160420-00/?p=93325
gdk/win32/gdkevents-win32.c | 115 +++++++++++++++++---------------------------
1 file changed, 44 insertions(+), 71 deletions(-)
---
diff --git a/gdk/win32/gdkevents-win32.c b/gdk/win32/gdkevents-win32.c
index a5306a42cd..c928a14142 100644
--- a/gdk/win32/gdkevents-win32.c
+++ b/gdk/win32/gdkevents-win32.c
@@ -78,6 +78,8 @@
#include <tchar.h>
#include <tpcshrd.h>
+#include <stdint.h>
+
#define GDK_MOD2_MASK (1 << 4)
#ifndef XBUTTON1
@@ -1760,9 +1762,6 @@ gdk_event_translate (MSG *msg,
int i;
- double delta_x, delta_y;
- GdkScrollDirection direction;
-
display = gdk_display_get_default ();
win32_display = GDK_WIN32_DISPLAY (display);
@@ -2659,65 +2658,56 @@ gdk_event_translate (MSG *msg,
case WM_MOUSEWHEEL:
case WM_MOUSEHWHEEL:
+ {
+ int16_t scroll_x = 0;
+ int16_t scroll_y = 0;
+
+ char classname[64];
+
GDK_NOTE (EVENTS, g_print (" %d", (short) HIWORD (msg->wParam)));
- /* WM_MOUSEWHEEL is delivered to the focus window. Work around
- * that. Also, the position is in screen coordinates, not client
- * coordinates as with the button messages. I love the
- * consistency of Windows.
- */
+ /* On versions of Windows before Windows 10, the WM_MOUSEWHEEL
+ * is delivered to the window that has keyboard focus, not the
+ * window under the pointer. Work around that.
+ * Also, the position is in screen coordinates, not client
+ * coordinates as with the button messages. */
point.x = GET_X_LPARAM (msg->lParam);
point.y = GET_Y_LPARAM (msg->lParam);
- if ((hwnd = WindowFromPoint (point)) == NULL)
- break;
+ hwnd = WindowFromPoint (point);
+ if (!hwnd)
+ break;
- {
- char classname[64];
-
- /* The synapitics trackpad drivers have this irritating
- feature where it pops up a window right under the pointer
- when you scroll. We backtrack and to the toplevel and
- find the innermost child instead. */
- if (GetClassNameA (hwnd, classname, sizeof(classname)) &&
- strcmp (classname, SYNAPSIS_ICON_WINDOW_CLASS) == 0)
- {
- HWND hwndc;
-
- /* Find our toplevel window */
- hwnd = GetAncestor (msg->hwnd, GA_ROOT);
-
- /* Walk back up to the outermost child at the desired point */
- do {
- ScreenToClient (hwnd, &point);
- hwndc = ChildWindowFromPoint (hwnd, point);
- ClientToScreen (hwnd, &point);
- } while (hwndc != hwnd && (hwnd = hwndc, 1));
- }
- }
+ /* The synapitics trackpad drivers have this irritating
+ feature where it pops up a window right under the pointer
+ when you scroll. We backtrack and to the toplevel and
+ find the innermost child instead. */
+ if (GetClassNameA (hwnd, classname, sizeof(classname)) &&
+ strcmp (classname, SYNAPSIS_ICON_WINDOW_CLASS) == 0)
+ {
+ HWND hwndc;
- msg->hwnd = hwnd;
- if ((new_window = gdk_win32_handle_table_lookup (msg->hwnd)) == NULL)
- break;
+ /* Find our toplevel window */
+ hwnd = GetAncestor (msg->hwnd, GA_ROOT);
- if (new_window != window)
- {
- g_set_object (&window, new_window);
- }
+ /* Walk back up to the outermost child at the desired point */
+ do {
+ ScreenToClient (hwnd, &point);
+ hwndc = ChildWindowFromPoint (hwnd, point);
+ ClientToScreen (hwnd, &point);
+ } while (hwndc != hwnd && (hwnd = hwndc, 1));
+ }
- impl = GDK_WIN32_SURFACE (window);
- ScreenToClient (msg->hwnd, &point);
+ msg->hwnd = hwnd;
- delta_x = delta_y = 0.0;
+ g_set_object (&window, gdk_win32_handle_table_lookup (hwnd));
+ if (!window)
+ break;
if (msg->message == WM_MOUSEWHEEL)
- delta_y = (double) GET_WHEEL_DELTA_WPARAM (msg->wParam) / (double) WHEEL_DELTA;
+ scroll_y = GET_WHEEL_DELTA_WPARAM (msg->wParam);
else if (msg->message == WM_MOUSEHWHEEL)
- delta_x = (double) GET_WHEEL_DELTA_WPARAM (msg->wParam) / (double) WHEEL_DELTA;
- /* Positive delta scrolls up, not down,
- see API documentation for WM_MOUSEWHEEL message.
- */
- delta_y *= -1.0;
+ scroll_x = GET_WHEEL_DELTA_WPARAM (msg->wParam);
_gdk_device_virtual_set_active (_gdk_device_manager->core_pointer,
_gdk_device_manager->system_pointer);
@@ -2727,34 +2717,17 @@ gdk_event_translate (MSG *msg,
NULL,
_gdk_win32_get_next_tick (msg->time),
build_pointer_event_state (msg),
- delta_x,
- delta_y,
+ (double) scroll_x / (double) WHEEL_DELTA,
+ (double) -scroll_y / (double) WHEEL_DELTA,
FALSE,
GDK_SCROLL_UNIT_WHEEL);
- /* Append the discrete version too */
- direction = 0;
- if (msg->message == WM_MOUSEWHEEL)
- direction = (((short) HIWORD (msg->wParam)) > 0)
- ? GDK_SCROLL_UP
- : GDK_SCROLL_DOWN;
- else if (msg->message == WM_MOUSEHWHEEL)
- direction = (((short) HIWORD (msg->wParam)) > 0)
- ? GDK_SCROLL_RIGHT
- : GDK_SCROLL_LEFT;
-
- event = gdk_scroll_event_new_discrete (window,
- device_manager_win32->core_pointer,
- NULL,
- _gdk_win32_get_next_tick (msg->time),
- build_pointer_event_state (msg),
- direction,
- TRUE);
-
_gdk_win32_append_event (event);
+ *ret_valp = 0;
return_val = TRUE;
- break;
+ }
+ break;
case WM_MOUSEACTIVATE:
{
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]