[gtk/global-coords: 3/3] menu: Bring back the scroll keybindings



commit 3901c61c3dc6e42fc3d56a4b0a5678e3263b5d21
Author: Matthias Clasen <mclasen redhat com>
Date:   Fri May 31 20:55:55 2019 +0000

    menu: Bring back the scroll keybindings
    
    Home, End, Page Up/Down, work again.

 gtk/gtkmenu.c | 119 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
 1 file changed, 118 insertions(+), 1 deletion(-)
---
diff --git a/gtk/gtkmenu.c b/gtk/gtkmenu.c
index 2f240edbf5..e9ca37efb8 100644
--- a/gtk/gtkmenu.c
+++ b/gtk/gtkmenu.c
@@ -142,6 +142,7 @@ struct _GtkMenuPopdownData
 };
 
 enum {
+  MOVE_SCROLL,
   POPPED_UP,
   LAST_SIGNAL
 };
@@ -197,6 +198,8 @@ static gboolean gtk_menu_focus             (GtkWidget        *widget,
 static gint     gtk_menu_get_popup_delay   (GtkMenuShell     *menu_shell);
 static void     gtk_menu_move_current      (GtkMenuShell     *menu_shell,
                                             GtkMenuDirectionType direction);
+static void     gtk_menu_real_move_scroll  (GtkMenu          *menu,
+                                            GtkScrollType     type);
 
 static void gtk_menu_deactivate     (GtkMenuShell      *menu_shell);
 static void gtk_menu_position       (GtkMenu           *menu);
@@ -288,6 +291,21 @@ gtk_menu_class_init (GtkMenuClass *class)
   menu_shell_class->move_current = gtk_menu_move_current;
   menu_shell_class->get_items = gtk_menu_get_items;
 
+  /**
+   * GtkMenu::move-scroll:
+   * @menu: a #GtkMenu
+   * @scroll_type: a #GtkScrollType
+   */
+  menu_signals[MOVE_SCROLL] =
+    g_signal_new_class_handler (I_("move-scroll"),
+                                G_OBJECT_CLASS_TYPE (gobject_class),
+                                G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION,
+                                G_CALLBACK (gtk_menu_real_move_scroll),
+                                NULL, NULL,
+                                NULL,
+                                G_TYPE_NONE, 1,
+                                GTK_TYPE_SCROLL_TYPE);
+
   /**
    * GtkMenu::popped-up:
    * @menu: the #GtkMenu that popped up
@@ -570,6 +588,46 @@ gtk_menu_class_init (GtkMenuClass *class)
                                 "move-current", 1,
                                 GTK_TYPE_MENU_DIRECTION_TYPE,
                                 GTK_MENU_DIR_CHILD);
+  gtk_binding_entry_add_signal (binding_set,
+                                GDK_KEY_Home, 0,
+                                "move-scroll", 1,
+                                GTK_TYPE_SCROLL_TYPE,
+                                GTK_SCROLL_START);
+  gtk_binding_entry_add_signal (binding_set,
+                                GDK_KEY_KP_Home, 0,
+                                "move-scroll", 1,
+                                GTK_TYPE_SCROLL_TYPE,
+                                GTK_SCROLL_START);
+  gtk_binding_entry_add_signal (binding_set,
+                                GDK_KEY_End, 0,
+                                "move-scroll", 1,
+                                GTK_TYPE_SCROLL_TYPE,
+                                GTK_SCROLL_END);
+  gtk_binding_entry_add_signal (binding_set,
+                                GDK_KEY_KP_End, 0,
+                                "move-scroll", 1,
+                                GTK_TYPE_SCROLL_TYPE,
+                                GTK_SCROLL_END);
+  gtk_binding_entry_add_signal (binding_set,
+                                GDK_KEY_Page_Up, 0,
+                                "move-scroll", 1,
+                                GTK_TYPE_SCROLL_TYPE,
+                                GTK_SCROLL_PAGE_UP);
+  gtk_binding_entry_add_signal (binding_set,
+                                GDK_KEY_KP_Page_Up, 0,
+                                "move-scroll", 1,
+                                GTK_TYPE_SCROLL_TYPE,
+                                GTK_SCROLL_PAGE_UP);
+  gtk_binding_entry_add_signal (binding_set,
+                                GDK_KEY_Page_Down, 0,
+                                "move-scroll", 1,
+                                GTK_TYPE_SCROLL_TYPE,
+                                GTK_SCROLL_PAGE_DOWN);
+  gtk_binding_entry_add_signal (binding_set,
+                                GDK_KEY_KP_Page_Down, 0,
+                                "move-scroll", 1,
+                                GTK_TYPE_SCROLL_TYPE,
+                                GTK_SCROLL_PAGE_DOWN);
 
   gtk_widget_class_set_accessible_type (widget_class, GTK_TYPE_MENU_ACCESSIBLE);
   gtk_widget_class_set_css_name (widget_class, I_("menu"));
@@ -2380,7 +2438,8 @@ gtk_menu_scroll_item_visible (GtkMenuShell *menu_shell,
   GtkAdjustment *adj;
   double value, page;
 
-  gtk_widget_compute_bounds (menu_item, priv->box, &rect);
+  if (!gtk_widget_compute_bounds (menu_item, priv->box, &rect))
+    return;
 
   adj = gtk_scrolled_window_get_vadjustment (GTK_SCROLLED_WINDOW (priv->swin));
 
@@ -2435,6 +2494,64 @@ gtk_menu_move_current (GtkMenuShell         *menu_shell,
   GTK_MENU_SHELL_CLASS (gtk_menu_parent_class)->move_current (menu_shell, direction);
 }
 
+static void
+gtk_menu_real_move_scroll (GtkMenu       *menu,
+                           GtkScrollType  type)
+{
+  GtkMenuPrivate *priv = menu->priv;
+  GtkMenuShell *menu_shell = GTK_MENU_SHELL (menu);
+  int menu_size, item_size;
+  int dist;
+  int i;
+  GtkWidget *item, *next;
+
+  if (menu_shell->priv->active_menu_item)
+    item = menu_shell->priv->active_menu_item;
+  else
+    item = gtk_widget_get_first_child (priv->box);
+
+  menu_size = gtk_widget_get_allocated_height (GTK_WIDGET (menu));
+  item_size = gtk_widget_get_allocated_height (GTK_WIDGET (item));
+
+  dist = menu_size / item_size;
+
+  switch ((guint) type)
+    {
+    case GTK_SCROLL_PAGE_UP:
+      i = 0;
+      while (i < dist)
+        {
+          next = gtk_widget_get_prev_sibling (item);
+          if (next == NULL)
+            break;
+          i++;
+          item = next;
+        }
+      break;
+    case GTK_SCROLL_PAGE_DOWN:
+      i = 0;
+      while (i < dist)
+        {
+          next = gtk_widget_get_next_sibling (item);
+          if (next == NULL)
+            break;
+          i++;
+          item = next;
+        }
+      break;
+    case GTK_SCROLL_START:
+      item = gtk_widget_get_first_child (priv->box);
+      break;
+    case GTK_SCROLL_END:
+      item = gtk_widget_get_last_child (priv->box);
+      break;
+    default:
+      return;
+    }
+
+  gtk_menu_shell_select_item (menu_shell, item);
+}
+
 /**
  * gtk_menu_set_monitor:
  * @menu: a #GtkMenu


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