[mutter] events: Move window button handling to window.c
- From: Jasper St. Pierre <jstpierre src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [mutter] events: Move window button handling to window.c
- Date: Thu, 8 May 2014 19:35:48 +0000 (UTC)
commit 7a109a18affe6de25ade043e72f8bc3da739f233
Author: Jasper St. Pierre <jstpierre mecheye net>
Date: Thu May 8 15:12:58 2014 -0400
events: Move window button handling to window.c
Look at how clean GCD is now!!!
src/core/events.c | 143 +----------------------------------------
src/core/window-private.h | 3 +
src/core/window.c | 153 +++++++++++++++++++++++++++++++++++++++++++++
3 files changed, 160 insertions(+), 139 deletions(-)
---
diff --git a/src/core/events.c b/src/core/events.c
index e68914c..6ff7d65 100644
--- a/src/core/events.c
+++ b/src/core/events.c
@@ -1926,155 +1926,18 @@ meta_display_handle_event (MetaDisplay *display,
goto out;
}
- if (window && event->type == CLUTTER_BUTTON_PRESS && display->grab_op == META_GRAB_OP_NONE)
+ if (window)
{
- ClutterModifierType grab_mask;
- gboolean unmodified;
- gboolean fully_modified;
- gboolean handled = FALSE;
-
- grab_mask = display->window_grab_modifiers;
- if (g_getenv ("MUTTER_DEBUG_BUTTON_GRABS"))
- grab_mask |= CLUTTER_CONTROL_MASK;
-
/* Swallow all events on windows that come our way. */
bypass_clutter = TRUE;
- /* We have three passive button grabs:
- * - on any button, without modifiers => focuses and maybe raises the window
- * - on resize button, with modifiers => start an interactive resizing
- * (normally <Super>middle)
- * - on move button, with modifiers => start an interactive move
- * (normally <Super>left)
- * - on menu button, with modifiers => show the window menu
- * (normally <Super>right)
- *
- * We may get here because we actually have a button
- * grab on the window, or because we're a wayland
- * compositor and thus we see all the events, so we
- * need to check if the event is interesting.
- * We want an event that is not modified for a window.
- *
- * We may have other events on the window, for example
- * a click on a frame button, but that's not for us to
- * care about. Just let the event through.
- */
- unmodified = (event->button.modifier_state & grab_mask) == 0;
- fully_modified = grab_mask && (event->button.modifier_state & grab_mask) == grab_mask;
-
- if (unmodified)
- {
- if (meta_prefs_get_raise_on_click ())
- meta_window_raise (window);
- else
- meta_topic (META_DEBUG_FOCUS,
- "Not raising window on click due to don't-raise-on-click option\n");
-
- /* Don't focus panels--they must explicitly request focus.
- * See bug 160470
- */
- if (window->type != META_WINDOW_DOCK)
- {
- meta_topic (META_DEBUG_FOCUS,
- "Focusing %s due to unmodified button %u press (display.c)\n",
- window->desc, event->button.button);
- meta_window_focus (window, event->any.time);
- }
- else
- /* However, do allow terminals to lose focus due to new
- * window mappings after the user clicks on a panel.
- */
- display->allow_terminal_deactivation = TRUE;
-
- /* Don't handle the event so it's sent back to clients. */
- }
- else if (fully_modified && (int) event->button.button == meta_prefs_get_mouse_button_resize ())
- {
- if (window->has_resize_func)
- {
- gboolean north, south;
- gboolean west, east;
- MetaRectangle frame_rect;
- MetaGrabOp op;
-
- meta_window_get_frame_rect (window, &frame_rect);
-
- west = event->button.x < (frame_rect.x + 1 * frame_rect.width / 3);
- east = event->button.x > (frame_rect.x + 2 * frame_rect.width / 3);
- north = event->button.y < (frame_rect.y + 1 * frame_rect.height / 3);
- south = event->button.y > (frame_rect.y + 2 * frame_rect.height / 3);
-
- if (north && west)
- op = META_GRAB_OP_RESIZING_NW;
- else if (north && east)
- op = META_GRAB_OP_RESIZING_NE;
- else if (south && west)
- op = META_GRAB_OP_RESIZING_SW;
- else if (south && east)
- op = META_GRAB_OP_RESIZING_SE;
- else if (north)
- op = META_GRAB_OP_RESIZING_N;
- else if (west)
- op = META_GRAB_OP_RESIZING_W;
- else if (east)
- op = META_GRAB_OP_RESIZING_E;
- else if (south)
- op = META_GRAB_OP_RESIZING_S;
- else /* Middle region is no-op to avoid user triggering wrong action */
- op = META_GRAB_OP_NONE;
-
- if (op != META_GRAB_OP_NONE)
- meta_display_begin_grab_op (display,
- window->screen,
- window,
- op,
- TRUE,
- FALSE,
- event->button.button,
- 0,
- event->any.time,
- event->button.x,
- event->button.y);
- }
- handled = TRUE;
- }
- else if (fully_modified && (int) event->button.button == meta_prefs_get_mouse_button_menu ())
- {
- if (meta_prefs_get_raise_on_click ())
- meta_window_raise (window);
- meta_window_show_menu (window,
- event->button.x,
- event->button.y,
- event->button.button,
- event->any.time);
- handled = TRUE;
- }
- else if (fully_modified && (int) event->button.button == 1)
- {
- if (window->has_move_func)
- {
- meta_display_begin_grab_op (display,
- window->screen,
- window,
- META_GRAB_OP_MOVING,
- TRUE,
- FALSE,
- event->button.button,
- 0,
- event->any.time,
- event->button.x,
- event->button.y);
- }
- handled = TRUE;
- }
-
/* Under X11, we have a Sync grab and in order to send it back to
* clients, we have to explicitly replay it.
*
* Under Wayland, we retrieve all events and we have to make sure
* to filter them out from Wayland clients.
*/
- if (handled)
+ if (meta_window_handle_ungrabbed_event (window, event))
{
bypass_wayland = TRUE;
}
@@ -2090,6 +1953,8 @@ meta_display_handle_event (MetaDisplay *display,
XIReplayDevice, event->button.time);
}
}
+
+ goto out;
}
out:
diff --git a/src/core/window-private.h b/src/core/window-private.h
index de73544..77b8c39 100644
--- a/src/core/window-private.h
+++ b/src/core/window-private.h
@@ -713,6 +713,9 @@ void meta_window_handle_enter (MetaWindow *window,
guint root_x,
guint root_y);
+gboolean meta_window_handle_ungrabbed_event (MetaWindow *window,
+ const ClutterEvent *event);
+
void meta_window_set_surface_mapped (MetaWindow *window,
gboolean surface_mapped);
diff --git a/src/core/window.c b/src/core/window.c
index 69bad65..b832da4 100644
--- a/src/core/window.c
+++ b/src/core/window.c
@@ -8273,6 +8273,159 @@ meta_window_handle_enter (MetaWindow *window,
}
}
+gboolean
+meta_window_handle_ungrabbed_event (MetaWindow *window,
+ const ClutterEvent *event)
+{
+ MetaDisplay *display = window->display;
+ ClutterModifierType grab_mask;
+ gboolean unmodified;
+ gboolean fully_modified;
+
+ if (event->type != CLUTTER_BUTTON_PRESS)
+ return FALSE;
+
+ if (display->grab_op != META_GRAB_OP_NONE)
+ return FALSE;
+
+ /* We have three passive button grabs:
+ * - on any button, without modifiers => focuses and maybe raises the window
+ * - on resize button, with modifiers => start an interactive resizing
+ * (normally <Super>middle)
+ * - on move button, with modifiers => start an interactive move
+ * (normally <Super>left)
+ * - on menu button, with modifiers => show the window menu
+ * (normally <Super>right)
+ *
+ * We may get here because we actually have a button
+ * grab on the window, or because we're a wayland
+ * compositor and thus we see all the events, so we
+ * need to check if the event is interesting.
+ * We want an event that is not modified for a window.
+ *
+ * We may have other events on the window, for example
+ * a click on a frame button, but that's not for us to
+ * care about. Just let the event through.
+ */
+
+ grab_mask = display->window_grab_modifiers;
+ if (g_getenv ("MUTTER_DEBUG_BUTTON_GRABS"))
+ grab_mask |= CLUTTER_CONTROL_MASK;
+
+ unmodified = (event->button.modifier_state & grab_mask) == 0;
+ fully_modified = grab_mask && (event->button.modifier_state & grab_mask) == grab_mask;
+
+ if (unmodified)
+ {
+ if (meta_prefs_get_raise_on_click ())
+ meta_window_raise (window);
+ else
+ meta_topic (META_DEBUG_FOCUS,
+ "Not raising window on click due to don't-raise-on-click option\n");
+
+ /* Don't focus panels--they must explicitly request focus.
+ * See bug 160470
+ */
+ if (window->type != META_WINDOW_DOCK)
+ {
+ meta_topic (META_DEBUG_FOCUS,
+ "Focusing %s due to unmodified button %u press (display.c)\n",
+ window->desc, event->button.button);
+ meta_window_focus (window, event->any.time);
+ }
+ else
+ /* However, do allow terminals to lose focus due to new
+ * window mappings after the user clicks on a panel.
+ */
+ display->allow_terminal_deactivation = TRUE;
+
+ meta_verbose ("Allowing events time %u\n",
+ (unsigned int)event->button.time);
+ return FALSE;
+ }
+ else if (fully_modified && (int) event->button.button == meta_prefs_get_mouse_button_resize ())
+ {
+ if (window->has_resize_func)
+ {
+ gboolean north, south;
+ gboolean west, east;
+ MetaRectangle frame_rect;
+ MetaGrabOp op;
+
+ meta_window_get_frame_rect (window, &frame_rect);
+
+ west = event->button.x < (frame_rect.x + 1 * frame_rect.width / 3);
+ east = event->button.x > (frame_rect.x + 2 * frame_rect.width / 3);
+ north = event->button.y < (frame_rect.y + 1 * frame_rect.height / 3);
+ south = event->button.y > (frame_rect.y + 2 * frame_rect.height / 3);
+
+ if (north && west)
+ op = META_GRAB_OP_RESIZING_NW;
+ else if (north && east)
+ op = META_GRAB_OP_RESIZING_NE;
+ else if (south && west)
+ op = META_GRAB_OP_RESIZING_SW;
+ else if (south && east)
+ op = META_GRAB_OP_RESIZING_SE;
+ else if (north)
+ op = META_GRAB_OP_RESIZING_N;
+ else if (west)
+ op = META_GRAB_OP_RESIZING_W;
+ else if (east)
+ op = META_GRAB_OP_RESIZING_E;
+ else if (south)
+ op = META_GRAB_OP_RESIZING_S;
+ else /* Middle region is no-op to avoid user triggering wrong action */
+ op = META_GRAB_OP_NONE;
+
+ if (op != META_GRAB_OP_NONE)
+ meta_display_begin_grab_op (display,
+ window->screen,
+ window,
+ op,
+ TRUE,
+ FALSE,
+ event->button.button,
+ 0,
+ event->any.time,
+ event->button.x,
+ event->button.y);
+ }
+ return TRUE;
+ }
+ else if (fully_modified && (int) event->button.button == meta_prefs_get_mouse_button_menu ())
+ {
+ if (meta_prefs_get_raise_on_click ())
+ meta_window_raise (window);
+ meta_window_show_menu (window,
+ event->button.x,
+ event->button.y,
+ event->button.button,
+ event->any.time);
+ return TRUE;
+ }
+ else if (fully_modified && (int) event->button.button == 1)
+ {
+ if (window->has_move_func)
+ {
+ meta_display_begin_grab_op (display,
+ window->screen,
+ window,
+ META_GRAB_OP_MOVING,
+ TRUE,
+ FALSE,
+ event->button.button,
+ 0,
+ event->any.time,
+ event->button.x,
+ event->button.y);
+ }
+ return TRUE;
+ }
+
+ return TRUE;
+}
+
void
meta_window_set_surface_mapped (MetaWindow *window,
gboolean surface_mapped)
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]