summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristian Hergert <chergert@redhat.com>2022-09-21 21:58:00 -0700
committerChristian Hergert <chergert@redhat.com>2022-09-21 21:58:00 -0700
commit10728bdd397cd8098970720d0b9a5e7ead201125 (patch)
treef4518572c10d28a1a2ff0e3835321a33262c1479
parentae049441243ec838af7869c0d55390f4f5420f92 (diff)
downloadgtksourceview-10728bdd397cd8098970720d0b9a5e7ead201125.tar.gz
hover: disable context menus from hover assistant
This is a workaround until we can be sure that we can show popovers from the hover assistants. Currently, that can break input pretty badly, so this is in place to help avoid that issue by users. This basically makes it so GtkLabel (and potentially others) cannot get their sequence event to show the context menu since we don't have other mechanisms to prevent it.
-rw-r--r--gtksourceview/gtksourcehoverassistant.c42
1 files changed, 42 insertions, 0 deletions
diff --git a/gtksourceview/gtksourcehoverassistant.c b/gtksourceview/gtksourcehoverassistant.c
index 47f43a15..6e9baff6 100644
--- a/gtksourceview/gtksourcehoverassistant.c
+++ b/gtksourceview/gtksourcehoverassistant.c
@@ -315,6 +315,32 @@ gtk_source_hover_assistant_dispose (GObject *object)
}
static void
+gtk_source_hover_assistant_click_pressed_cb (GtkSourceHoverAssistant *self,
+ int n_press,
+ double x,
+ double y,
+ GtkGestureClick *click)
+{
+ GdkEventSequence *sequence;
+ GdkEvent *event;
+
+ g_assert (GTK_SOURCE_IS_HOVER_ASSISTANT (self));
+ g_assert (GTK_IS_GESTURE_CLICK (click));
+
+ sequence = gtk_gesture_single_get_current_sequence (GTK_GESTURE_SINGLE (click));
+ event = gtk_gesture_get_last_event (GTK_GESTURE (click), sequence);
+
+ /* WORKAROUND: See comment below in gtk_source_hover_assistant_init().
+ * We have to block context menus from here until we can be sure they'll
+ * work with GtkPopover:autohide disabled.
+ */
+ if (gdk_event_triggers_context_menu (event))
+ {
+ gtk_gesture_set_state (GTK_GESTURE (click), GTK_EVENT_SEQUENCE_CLAIMED);
+ }
+}
+
+static void
gtk_source_hover_assistant_class_init (GtkSourceHoverAssistantClass *klass)
{
GObjectClass *object_class = G_OBJECT_CLASS (klass);
@@ -334,6 +360,7 @@ gtk_source_hover_assistant_class_init (GtkSourceHoverAssistantClass *klass)
static void
gtk_source_hover_assistant_init (GtkSourceHoverAssistant *self)
{
+ GtkEventController *click;
GtkEventController *scroll;
gtk_widget_add_css_class (GTK_WIDGET (self), "hover-assistant");
@@ -360,6 +387,21 @@ gtk_source_hover_assistant_init (GtkSourceHoverAssistant *self)
self,
G_CONNECT_SWAPPED);
gtk_widget_add_controller (GTK_WIDGET (self), g_object_ref (self->popover_motion));
+
+ /* WORKAROUND: Until we have a way to ensure that showing context
+ * menus from the popover won't break our popover, we need to prevent
+ * them from potentially breaking input/grabs.
+ */
+ click = GTK_EVENT_CONTROLLER (gtk_gesture_click_new ());
+ g_signal_connect_object (click,
+ "pressed",
+ G_CALLBACK (gtk_source_hover_assistant_click_pressed_cb),
+ self,
+ G_CONNECT_SWAPPED);
+ gtk_gesture_single_set_button (GTK_GESTURE_SINGLE (click), 0);
+ gtk_gesture_single_set_exclusive (GTK_GESTURE_SINGLE (click), TRUE);
+ gtk_event_controller_set_propagation_phase (GTK_EVENT_CONTROLLER (click), GTK_PHASE_CAPTURE);
+ gtk_widget_add_controller (GTK_WIDGET (self), GTK_EVENT_CONTROLLER (click));
}
GtkSourceAssistant *