From 11b7ff55b020573b3ecf4e841c2b1d60ca74f4b8 Mon Sep 17 00:00:00 2001 From: osch Date: Fri, 17 May 2019 16:38:20 +0200 Subject: alt+tab popup: follow mouse while mouse button is pressed --- src/core/display-private.h | 2 ++ src/core/display.c | 25 ++++++++++++++++++++++++- 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/src/core/display-private.h b/src/core/display-private.h index fe8b948e..586ed26e 100644 --- a/src/core/display-private.h +++ b/src/core/display-private.h @@ -128,6 +128,8 @@ struct _MetaDisplay { guint static_gravity_works: 1; + guint tab_popup_mouse_pressed : 1; + /*< private-ish >*/ guint error_trap_synced_at_last_pop: 1; MetaEventQueue* events; diff --git a/src/core/display.c b/src/core/display.c index 055c15d1..65ae1885 100644 --- a/src/core/display.c +++ b/src/core/display.c @@ -388,6 +388,8 @@ meta_display_open (void) /* FIXME copy the checks from GDK probably */ the_display->static_gravity_works = g_getenv ("MARCO_USE_STATIC_GRAVITY") != NULL; + the_display->tab_popup_mouse_pressed = FALSE; + meta_bell_init (the_display); meta_display_init_keys (the_display); @@ -1847,7 +1849,10 @@ static gboolean event_callback(XEvent* event, gpointer data) &popup_x, &popup_y); if (is_in_tab_popup && event->xbutton.button == Button1) - meta_ui_tab_popup_mouse_press(screen->tab_popup, popup_x, popup_y); + { + display->tab_popup_mouse_pressed = TRUE; + meta_ui_tab_popup_mouse_press(screen->tab_popup, popup_x, popup_y); + } } if (!is_in_tab_popup) { @@ -2039,11 +2044,27 @@ static gboolean event_callback(XEvent* event, gpointer data) if (display->grab_window == window && grab_op_is_mouse (display->grab_op)) meta_window_handle_mouse_grab_op_event (window, event); + if (event->xbutton.button == Button1) + display->tab_popup_mouse_pressed = FALSE; break; case MotionNotify: if (display->grab_window == window && grab_op_is_mouse (display->grab_op)) meta_window_handle_mouse_grab_op_event (window, event); + else if (grab_op_is_keyboard (display->grab_op) && display->tab_popup_mouse_pressed) + { + MetaScreen *screen = meta_display_screen_for_root (display, event->xany.window); + int popup_x, popup_y; + gboolean is_in_tab_popup = mouse_event_is_in_tab_popup (display, + screen, + event->xany.window, + event->xbutton.x, + event->xbutton.y, + &popup_x, + &popup_y); + if (is_in_tab_popup) + meta_ui_tab_popup_mouse_press (screen->tab_popup, popup_x, popup_y); + } break; case EnterNotify: if (display->grab_window == window && @@ -3604,6 +3625,7 @@ meta_display_begin_grab_op (MetaDisplay *display, } } + display->tab_popup_mouse_pressed = FALSE; display->grab_op = op; display->grab_window = window; display->grab_screen = screen; @@ -3832,6 +3854,7 @@ meta_display_end_grab_op (MetaDisplay *display, { meta_ui_tab_popup_free (display->grab_screen->tab_popup); display->grab_screen->tab_popup = NULL; + display->tab_popup_mouse_pressed = FALSE; /* If the ungrab here causes an EnterNotify, ignore it for * sloppy focus -- cgit v1.2.1