[gnome-builder] libide/terminal: add example to show popover from click gesture



commit 43cbca2a3e11820efb73ff1c6ebc22406c5c6baf
Author: Christian Hergert <chergert redhat com>
Date:   Wed Jul 20 17:31:33 2022 -0700

    libide/terminal: add example to show popover from click gesture

 src/libide/terminal/ide-terminal.c | 66 ++++++++++++++++++--------------------
 1 file changed, 31 insertions(+), 35 deletions(-)
---
diff --git a/src/libide/terminal/ide-terminal.c b/src/libide/terminal/ide-terminal.c
index 4f1d5c836..aec3559ae 100644
--- a/src/libide/terminal/ide-terminal.c
+++ b/src/libide/terminal/ide-terminal.c
@@ -34,11 +34,11 @@
 
 typedef struct
 {
-  GtkWidget *popup_menu;
-  GSettings *settings;
-  gchar     *url;
-  GdkRGBA    bg;
-  GdkRGBA    fg;
+  GtkPopover *popover;
+  GSettings  *settings;
+  char       *url;
+  GdkRGBA     bg;
+  GdkRGBA     fg;
 } IdeTerminalPrivate;
 
 typedef struct
@@ -211,40 +211,31 @@ popup_targets_received (GtkClipboard     *clipboard,
 
   g_slice_free (PopupInfo, popup_info);
 }
+#endif
 
 static void
-ide_terminal_do_popup (IdeTerminal    *self,
-                       const GdkEvent *event)
+ide_terminal_popup (IdeTerminal *self,
+                    double       x,
+                    double       y)
 {
-  PopupInfo *popup_info;
-  GtkClipboard *clipboard;
+  IdeTerminalPrivate *priv = ide_terminal_get_instance_private (self);
 
   g_assert (IDE_IS_TERMINAL (self));
 
-  popup_info = g_slice_new0 (PopupInfo);
-  popup_info->event = event ? gdk_event_copy (event) : gtk_get_current_event ();
-  popup_info->terminal = g_object_ref (self);
-
-  clipboard = gtk_widget_get_clipboard (GTK_WIDGET (self), GDK_SELECTION_CLIPBOARD);
-
-  gtk_clipboard_request_contents (clipboard,
-                                  gdk_atom_intern_static_string ("TARGETS"),
-                                  popup_targets_received,
-                                  popup_info);
-}
-
-static gboolean
-ide_terminal_popup_menu (GtkWidget *widget)
-{
-  IdeTerminal *self = (IdeTerminal *)widget;
+  if (priv->popover == NULL)
+    {
+      GMenu *menu = ide_application_get_menu_by_id (IDE_APPLICATION_DEFAULT, "ide-terminal-page-popup-menu");
 
-  g_assert (IDE_IS_TERMINAL (self));
+      priv->popover = GTK_POPOVER (gtk_popover_menu_new_from_model (G_MENU_MODEL (menu)));
+      gtk_popover_set_has_arrow (priv->popover, FALSE);
+      gtk_widget_set_parent (GTK_WIDGET (priv->popover), GTK_WIDGET (self));
+    }
 
-  ide_terminal_do_popup (self, NULL);
+  gtk_popover_set_pointing_to (priv->popover,
+                               &(GdkRectangle) { x, y, 1, 1 });
 
-  return TRUE;
+  gtk_popover_popup (priv->popover);
 }
-#endif
 
 static void
 ide_terminal_click_pressed_cb (IdeTerminal     *self,
@@ -295,15 +286,15 @@ ide_terminal_click_pressed_cb (IdeTerminal     *self,
             gtk_gesture_set_state (GTK_GESTURE (click), GTK_EVENT_SEQUENCE_CLAIMED);
         }
     }
-#if 0
   else if (button == 3)
     {
       if (!gtk_widget_has_focus (GTK_WIDGET (self)))
         gtk_widget_grab_focus (GTK_WIDGET (self));
 
-      ide_terminal_do_popup (self, (GdkEvent *)button);
+      ide_terminal_popup (self, x, y);
+
+      gtk_gesture_set_state (GTK_GESTURE (click), GTK_EVENT_SEQUENCE_CLAIMED);
     }
-#endif
 
   IDE_EXIT;
 }
@@ -478,14 +469,12 @@ ide_terminal_size_allocate (GtkWidget *widget,
                             int        baseline)
 {
   IdeTerminal *self = (IdeTerminal *)widget;
+  IdeTerminalPrivate *priv = ide_terminal_get_instance_private (self);
   int char_width, char_height;
   int columns, rows;
 
   GTK_WIDGET_CLASS (ide_terminal_parent_class)->size_allocate (widget, width, height, baseline);
 
-  if (width == 0 || height == 0)
-    return;
-
   char_width = vte_terminal_get_char_width (VTE_TERMINAL (self));
   char_height = vte_terminal_get_char_height (VTE_TERMINAL (self));
   if (char_width == 0 || char_height == 0)
@@ -497,6 +486,9 @@ ide_terminal_size_allocate (GtkWidget *widget,
     return;
 
   vte_terminal_set_size (VTE_TERMINAL (self), columns, rows);
+
+  if (priv->popover)
+    gtk_popover_present (priv->popover);
 }
 
 static void
@@ -565,6 +557,8 @@ ide_terminal_dispose (GObject *object)
   IdeTerminal *self = (IdeTerminal *)object;
   IdeTerminalPrivate *priv = ide_terminal_get_instance_private (self);
 
+  g_clear_pointer ((GtkWidget **)&priv->popover, gtk_widget_unparent);
+
   g_clear_object (&priv->settings);
   g_clear_pointer (&priv->url, g_free);
 
@@ -650,6 +644,8 @@ ide_terminal_init (IdeTerminal *self)
   GtkEventController *gesture;
 
   gesture = GTK_EVENT_CONTROLLER (gtk_gesture_click_new ());
+  gtk_gesture_single_set_button (GTK_GESTURE_SINGLE (gesture), 0);
+  gtk_event_controller_set_propagation_phase (gesture, GTK_PHASE_CAPTURE);
   g_signal_connect_object (gesture,
                            "pressed",
                            G_CALLBACK (ide_terminal_click_pressed_cb),


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]