[gtk/wip/matthiasc/shortcut-4: 54/85] placesview: Stop using ::popup-menu



commit 9d84996fea9a022955c4daec1825f7c6881d3758
Author: Matthias Clasen <mclasen redhat com>
Date:   Thu Mar 19 00:52:05 2020 -0400

    placesview: Stop using ::popup-menu
    
    This signal is going away.

 gtk/gtkplacesview.c        | 62 +++++++++++++++++++++++++++++++++++++---------
 gtk/gtkplacesviewrow.c     | 30 +++++++++++-----------
 gtk/ui/gtkplacesviewrow.ui |  6 -----
 3 files changed, 66 insertions(+), 32 deletions(-)
---
diff --git a/gtk/gtkplacesview.c b/gtk/gtkplacesview.c
index b7b431a944..61938f345c 100644
--- a/gtk/gtkplacesview.c
+++ b/gtk/gtkplacesview.c
@@ -106,7 +106,15 @@ static void        mount_volume                                  (GtkPlacesView
 static void        on_eject_button_clicked                       (GtkWidget        *widget,
                                                                   GtkPlacesViewRow *row);
 
-static gboolean    on_row_popup_menu                             (GtkPlacesViewRow *row);
+static gboolean on_row_popup_menu (GtkWidget *widget,
+                                   GVariant  *args,
+                                   gpointer   user_data);
+
+static void click_cb (GtkGesture *gesture,
+                      int         n_press,
+                      double      x,
+                      double      y,
+                      gpointer    user_data);
 
 static void        populate_servers                              (GtkPlacesView *view);
 
@@ -673,12 +681,28 @@ insert_row (GtkPlacesView *view,
             gboolean       is_network)
 {
   GtkPlacesViewPrivate *priv;
+  GtkEventController *controller;
+  GtkShortcutTrigger *trigger;
+  GtkShortcutAction *action;
+  GtkShortcut *shortcut;
+  GtkGesture *gesture;
 
   priv = gtk_places_view_get_instance_private (view);
 
   g_object_set_data (G_OBJECT (row), "is-network", GINT_TO_POINTER (is_network));
 
-  g_signal_connect (row, "popup-menu", G_CALLBACK (on_row_popup_menu), row);
+  controller = gtk_shortcut_controller_new ();
+  trigger = gtk_alternative_trigger_new (gtk_keyval_trigger_new (GDK_KEY_F10, GDK_SHIFT_MASK),
+                                         gtk_keyval_trigger_new (GDK_KEY_Menu, 0));
+  action = gtk_callback_action_new (on_row_popup_menu, row, NULL);
+  shortcut = gtk_shortcut_new (trigger, action);
+  gtk_shortcut_controller_add_shortcut (GTK_SHORTCUT_CONTROLLER (controller), shortcut);
+  gtk_widget_add_controller (GTK_WIDGET (row), controller);
+
+  gesture = gtk_gesture_click_new ();
+  gtk_gesture_single_set_button (GTK_GESTURE_SINGLE (gesture), GDK_BUTTON_SECONDARY);
+  g_signal_connect (gesture, "pressed", G_CALLBACK (click_cb), row);
+  gtk_widget_add_controller (row, GTK_EVENT_CONTROLLER (gesture));
 
   g_signal_connect (gtk_places_view_row_get_eject_button (GTK_PLACES_VIEW_ROW (row)),
                     "clicked",
@@ -1699,10 +1723,12 @@ get_menu_model (void)
   return G_MENU_MODEL (menu);
 }
 
-static void
-popup_menu (GtkPlacesViewRow *row,
-            GdkEventButton   *event)
+static gboolean
+on_row_popup_menu (GtkWidget *widget,
+                   GVariant  *args,
+                   gpointer   user_data)
 {
+  GtkPlacesViewRow *row = GTK_PLACES_VIEW_ROW (widget);
   GtkPlacesViewPrivate *priv;
   GtkWidget *view;
   GMount *mount;
@@ -1730,27 +1756,39 @@ popup_menu (GtkPlacesViewRow *row,
       GMenuModel *model = get_menu_model ();
 
       priv->popup_menu = gtk_popover_menu_new_from_model (model);
-      gtk_widget_set_parent (priv->popup_menu, GTK_WIDGET (view));
       gtk_popover_set_position (GTK_POPOVER (priv->popup_menu), GTK_POS_BOTTOM);
 
       gtk_popover_set_has_arrow (GTK_POPOVER (priv->popup_menu), FALSE);
-      gtk_widget_set_halign (priv->popup_menu, GTK_ALIGN_START);
+      gtk_widget_set_halign (priv->popup_menu, GTK_ALIGN_CENTER);
 
       g_object_unref (model);
     }
 
-  gtk_widget_set_halign (priv->popup_menu, GTK_ALIGN_CENTER);
+  if (priv->row_for_action)
+    g_object_set_data (G_OBJECT (priv->row_for_action), "menu", NULL);
+
+  g_object_ref (priv->popup_menu);
+  gtk_widget_unparent (priv->popup_menu);
   gtk_widget_set_parent (priv->popup_menu, GTK_WIDGET (row));
+  g_object_unref (priv->popup_menu);
 
   priv->row_for_action = row;
+  if (priv->row_for_action)
+    g_object_set_data (G_OBJECT (priv->row_for_action), "menu", priv->popup_menu);
+
   gtk_popover_popup (GTK_POPOVER (priv->popup_menu));
+
+  return TRUE;
 }
 
-static gboolean
-on_row_popup_menu (GtkPlacesViewRow *row)
+static void
+click_cb (GtkGesture *gesture,
+          int         n_press,
+          double      x,
+          double      y,
+          gpointer    user_data)
 {
-  popup_menu (row, NULL);
-  return TRUE;
+  on_row_popup_menu (GTK_WIDGET (user_data), NULL, NULL);
 }
 
 static gboolean
diff --git a/gtk/gtkplacesviewrow.c b/gtk/gtkplacesviewrow.c
index 3df575aa42..e3deff9a84 100644
--- a/gtk/gtkplacesviewrow.c
+++ b/gtk/gtkplacesviewrow.c
@@ -35,6 +35,7 @@
 #include "gtkspinner.h"
 #include "gtkstack.h"
 #include "gtktypebuiltins.h"
+#include "gtknative.h"
 #else
 #include <gtk/gtk.h>
 #endif
@@ -193,18 +194,6 @@ measure_available_space (GtkPlacesViewRow *row)
     }
 }
 
-static void
-pressed_cb (GtkGesture       *gesture,
-            int               n_pressed,
-            double            x,
-            double            y,
-            GtkPlacesViewRow *row)
-{
-  gboolean menu_activated;
-
-  g_signal_emit_by_name (row, "popup-menu", &menu_activated);
-}
-
 static void
 gtk_places_view_row_finalize (GObject *object)
 {
@@ -320,6 +309,19 @@ gtk_places_view_row_set_property (GObject      *object,
     }
 }
 
+static void
+gtk_places_view_row_size_allocate (GtkWidget *widget,
+                                   int        width,
+                                   int        height,
+                                   int        baseline)
+{
+  GtkWidget *menu = GTK_WIDGET (g_object_get_data (G_OBJECT (widget), "menu"));
+
+  GTK_WIDGET_CLASS (gtk_places_view_row_parent_class)->size_allocate (widget, width, height, baseline);
+  if (menu)
+    gtk_native_check_resize (GTK_NATIVE (menu));
+}
+
 static void
 gtk_places_view_row_class_init (GtkPlacesViewRowClass *klass)
 {
@@ -330,6 +332,8 @@ gtk_places_view_row_class_init (GtkPlacesViewRowClass *klass)
   object_class->get_property = gtk_places_view_row_get_property;
   object_class->set_property = gtk_places_view_row_set_property;
 
+  widget_class->size_allocate = gtk_places_view_row_size_allocate;
+
   properties[PROP_ICON] =
           g_param_spec_object ("icon",
                                P_("Icon of the row"),
@@ -391,8 +395,6 @@ gtk_places_view_row_class_init (GtkPlacesViewRowClass *klass)
   gtk_widget_class_bind_template_child (widget_class, GtkPlacesViewRow, icon_image);
   gtk_widget_class_bind_template_child (widget_class, GtkPlacesViewRow, name_label);
   gtk_widget_class_bind_template_child (widget_class, GtkPlacesViewRow, path_label);
-
-  gtk_widget_class_bind_template_callback (widget_class, pressed_cb);
 }
 
 static void
diff --git a/gtk/ui/gtkplacesviewrow.ui b/gtk/ui/gtkplacesviewrow.ui
index 31b1473c8d..1177326b40 100644
--- a/gtk/ui/gtkplacesviewrow.ui
+++ b/gtk/ui/gtkplacesviewrow.ui
@@ -81,11 +81,5 @@
         </child>
       </object>
     </child>
-    <child>
-      <object class="GtkGestureClick">
-        <property name="button">3</property>
-        <signal name="pressed" handler="pressed_cb" swapped="no"/>
-      </object>
-    </child>
   </template>
 </interface>


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