[gtk/global-coords: 21/24] More menu work
- From: Matthias Clasen <matthiasc src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk/global-coords: 21/24] More menu work
- Date: Fri, 31 May 2019 23:38:19 +0000 (UTC)
commit 8ba3c7568264214bd8a069dc6a9d5d01f943dc38
Author: Matthias Clasen <mclasen redhat com>
Date: Fri May 31 03:20:50 2019 +0000
More menu work
gtk/gtkcombobox.c | 13 +++++---
gtk/gtkmenu.c | 44 +++++++++++++++++----------
gtk/gtkmenubar.c | 31 +++++++++++++++++--
gtk/gtkmenuitem.c | 2 +-
gtk/gtkmenuitemprivate.h | 3 ++
gtk/gtkmenushell.c | 69 +++++-------------------------------------
gtk/gtkmenushell.h | 1 +
gtk/gtkmenushellprivate.h | 3 +-
gtk/gtktreemenu.c | 14 ++++++---
gtk/theme/Adwaita/_common.scss | 2 +-
10 files changed, 90 insertions(+), 92 deletions(-)
---
diff --git a/gtk/gtkcombobox.c b/gtk/gtkcombobox.c
index 3d8afc863b..ea8c1f6968 100644
--- a/gtk/gtkcombobox.c
+++ b/gtk/gtkcombobox.c
@@ -1228,7 +1228,7 @@ update_menu_sensitivity (GtkComboBox *combo_box,
if (!priv->model)
return;
- children = gtk_container_get_children (GTK_CONTAINER (menu));
+ children = gtk_menu_shell_get_items (GTK_MENU_SHELL (menu));
for (child = children; child; child = child->next)
{
@@ -1321,20 +1321,24 @@ gtk_combo_box_menu_popup (GtkComboBox *combo_box)
if (!(active && gtk_widget_get_visible (active)))
{
- for (i = GTK_MENU_SHELL (priv->popup_widget)->priv->children; i && !active; i = i->next)
+ GList *children;
+ children = gtk_menu_shell_get_items (GTK_MENU_SHELL (priv->popup_widget));
+ for (i = children; i && !active; i = i->next)
{
child = i->data;
if (child && gtk_widget_get_visible (child))
active = child;
}
+ g_list_free (children);
}
if (active)
{
gint child_height;
-
- for (i = GTK_MENU_SHELL (priv->popup_widget)->priv->children; i && i->data != active; i = i->next)
+ GList *children;
+ children = gtk_menu_shell_get_items (GTK_MENU_SHELL (priv->popup_widget));
+ for (i = children; i && i->data != active; i = i->next)
{
child = i->data;
@@ -1345,6 +1349,7 @@ gtk_combo_box_menu_popup (GtkComboBox *combo_box)
rect_anchor_dy -= child_height;
}
}
+ g_list_free (children);
gtk_widget_measure (active, GTK_ORIENTATION_VERTICAL, -1,
&child_height, NULL, NULL, NULL);
diff --git a/gtk/gtkmenu.c b/gtk/gtkmenu.c
index 98f1541184..fe69fc88cf 100644
--- a/gtk/gtkmenu.c
+++ b/gtk/gtkmenu.c
@@ -652,7 +652,11 @@ gtk_menu_get_property (GObject *object,
switch (prop_id)
{
case PROP_ACTIVE:
- g_value_set_int (value, g_list_index (GTK_MENU_SHELL (menu)->priv->children, gtk_menu_get_active
(menu)));
+ {
+ GList *children = gtk_menu_shell_get_items (GTK_MENU_SHELL (menu));
+ g_value_set_int (value, g_list_index (children, gtk_menu_get_active (menu)));
+ g_list_free (children);
+ }
break;
case PROP_ACCEL_GROUP:
g_value_set_object (value, gtk_menu_get_accel_group (menu));
@@ -1015,6 +1019,8 @@ gtk_menu_remove (GtkContainer *container,
gtk_container_remove (GTK_CONTAINER (priv->box), widget);
+ GTK_CONTAINER_CLASS (gtk_menu_parent_class)->remove (container, widget);
+
menu_queue_resize (menu);
}
@@ -1040,6 +1046,7 @@ gtk_menu_real_insert (GtkMenuShell *menu_shell,
GtkMenuPrivate *priv = menu->priv;
gtk_container_add (GTK_CONTAINER (priv->box), child);
+ gtk_menu_reorder_child (menu, child, position);
menu_queue_resize (menu);
}
@@ -1639,7 +1646,7 @@ gtk_menu_get_active (GtkMenu *menu)
{
GtkMenuPrivate *priv;
GtkWidget *child;
- GList *children;
+ GList *children, *l;
g_return_val_if_fail (GTK_IS_MENU (menu), NULL);
@@ -1647,18 +1654,16 @@ gtk_menu_get_active (GtkMenu *menu)
if (!priv->old_active_menu_item)
{
- child = NULL;
- children = GTK_MENU_SHELL (menu)->priv->children;
-
- while (children)
+ children = gtk_menu_shell_get_items (GTK_MENU_SHELL (menu));
+ for (l = children; l; l = l->next)
{
- child = children->data;
- children = children->next;
+ child = l->data;
if (gtk_bin_get_child (GTK_BIN (child)))
break;
child = NULL;
}
+ g_list_free (children);
priv->old_active_menu_item = child;
if (priv->old_active_menu_item)
@@ -1683,13 +1688,15 @@ gtk_menu_set_active (GtkMenu *menu,
{
GtkMenuPrivate *priv;
GtkWidget *child;
+ GList *children;
GList *tmp_list;
g_return_if_fail (GTK_IS_MENU (menu));
priv = menu->priv;
- tmp_list = g_list_nth (GTK_MENU_SHELL (menu)->priv->children, index);
+ children = gtk_menu_shell_get_items (GTK_MENU_SHELL (menu));
+ tmp_list = g_list_nth (children, index);
if (tmp_list)
{
child = tmp_list->data;
@@ -1702,6 +1709,7 @@ gtk_menu_set_active (GtkMenu *menu,
}
}
g_object_notify (G_OBJECT (menu), "active");
+ g_list_free (children);
}
/**
@@ -1904,20 +1912,24 @@ gtk_menu_reorder_child (GtkMenu *menu,
GtkWidget *child,
gint position)
{
- GtkMenuShell *menu_shell;
+ GtkWidget *sibling = NULL;
+ int i;
g_return_if_fail (GTK_IS_MENU (menu));
g_return_if_fail (GTK_IS_MENU_ITEM (child));
- menu_shell = GTK_MENU_SHELL (menu);
+ if (position < 0)
+ sibling = gtk_widget_get_last_child (menu->priv->box);
- if (g_list_find (menu_shell->priv->children, child))
+ for (i = 0; i < position; i++)
{
- menu_shell->priv->children = g_list_remove (menu_shell->priv->children, child);
- menu_shell->priv->children = g_list_insert (menu_shell->priv->children, child, position);
-
- menu_queue_resize (menu);
+ if (sibling == NULL)
+ sibling = gtk_widget_get_first_child (menu->priv->box);
+ else
+ sibling = gtk_widget_get_next_sibling (sibling);
}
+
+ gtk_box_reorder_child_after (GTK_BOX (menu->priv->box), child, sibling);
}
static gboolean
diff --git a/gtk/gtkmenubar.c b/gtk/gtkmenubar.c
index 165412318f..ce9a868d0b 100644
--- a/gtk/gtkmenubar.c
+++ b/gtk/gtkmenubar.c
@@ -351,9 +351,11 @@ _gtk_menu_bar_cycle_focus (GtkMenuBar *menubar,
{
GtkWidget *next = g_ptr_array_index (menubars, index + 1);
GtkMenuShell *new_menushell = GTK_MENU_SHELL (next);
+ GList *children = gtk_menu_shell_get_items (new_menushell);
- if (new_menushell->priv->children)
- to_activate = new_menushell->priv->children->data;
+ if (children)
+ to_activate = children->data;
+ g_list_free (children);
}
g_ptr_array_free (menubars, TRUE);
@@ -440,6 +442,30 @@ gtk_menu_bar_remove (GtkContainer *container,
GtkMenuBar *menu_bar = GTK_MENU_BAR (container);
gtk_container_remove (GTK_CONTAINER (menu_bar->box), widget);
+
+ GTK_CONTAINER_CLASS (gtk_menu_bar_parent_class)->remove (container, widget);
+}
+
+static void
+gtk_menu_bar_reorder_child (GtkMenuBar *menu_bar,
+ GtkWidget *child,
+ gint position)
+{
+ GtkWidget *sibling = NULL;
+ int i;
+
+ if (position < 0)
+ sibling = gtk_widget_get_last_child (menu_bar->box);
+
+ for (i = 0; i < position; i++)
+ {
+ if (sibling == NULL)
+ sibling = gtk_widget_get_first_child (menu_bar->box);
+ else
+ sibling = gtk_widget_get_next_sibling (sibling);
+ }
+
+ gtk_box_reorder_child_after (GTK_BOX (menu_bar->box), child, sibling);
}
static void
@@ -450,4 +476,5 @@ gtk_menu_bar_insert (GtkMenuShell *menu_shell,
GtkMenuBar *menu_bar = GTK_MENU_BAR (menu_shell);
gtk_container_add (GTK_CONTAINER (menu_bar->box), child);
+ gtk_menu_bar_reorder_child (menu_bar, child, position);
}
diff --git a/gtk/gtkmenuitem.c b/gtk/gtkmenuitem.c
index c0d46800a6..549c9b479c 100644
--- a/gtk/gtkmenuitem.c
+++ b/gtk/gtkmenuitem.c
@@ -262,7 +262,7 @@ gtk_menu_item_actionable_interface_init (GtkActionableInterface *iface)
iface->get_action_target_value = gtk_menu_item_get_action_target_value;
}
-static GtkMenuShell *
+GtkMenuShell *
gtk_menu_item_get_menu_shell (GtkMenuItem *item)
{
return GTK_MENU_SHELL (gtk_widget_get_ancestor (GTK_WIDGET (item), GTK_TYPE_MENU_SHELL));
diff --git a/gtk/gtkmenuitemprivate.h b/gtk/gtkmenuitemprivate.h
index 0008c1f187..7b461f100e 100644
--- a/gtk/gtkmenuitemprivate.h
+++ b/gtk/gtkmenuitemprivate.h
@@ -19,6 +19,7 @@
#define __GTK_MENU_ITEM_PRIVATE_H__
#include <gtk/gtkmenuitem.h>
+#include <gtk/gtkmenushell.h>
#include <gtk/gtkactionhelperprivate.h>
#include <gtk/gtkcssnodeprivate.h>
#include <gtk/gtkeventcontrollermotion.h>
@@ -56,6 +57,8 @@ gboolean _gtk_menu_item_is_selectable (GtkWidget *menu_item);
void _gtk_menu_item_popup_submenu (GtkWidget *menu_item,
gboolean with_delay);
void _gtk_menu_item_popdown_submenu (GtkWidget *menu_item);
+GtkMenuShell *
+ gtk_menu_item_get_menu_shell (GtkMenuItem *menu_item);
G_END_DECLS
diff --git a/gtk/gtkmenushell.c b/gtk/gtkmenushell.c
index 7ae0a0a1d5..4ed273df34 100644
--- a/gtk/gtkmenushell.c
+++ b/gtk/gtkmenushell.c
@@ -137,12 +137,6 @@ static void gtk_menu_shell_add (GtkContainer *container,
GtkWidget *widget);
static void gtk_menu_shell_remove (GtkContainer *container,
GtkWidget *widget);
-static void gtk_menu_shell_forall (GtkContainer *container,
- GtkCallback callback,
- gpointer callback_data);
-static void gtk_menu_shell_real_insert (GtkMenuShell *menu_shell,
- GtkWidget *child,
- gint position);
static void gtk_real_menu_shell_deactivate (GtkMenuShell *menu_shell);
static GType gtk_menu_shell_child_type (GtkContainer *container);
static void gtk_menu_shell_real_select_item (GtkMenuShell *menu_shell,
@@ -191,7 +185,6 @@ gtk_menu_shell_class_init (GtkMenuShellClass *klass)
container_class->add = gtk_menu_shell_add;
container_class->remove = gtk_menu_shell_remove;
- container_class->forall = gtk_menu_shell_forall;
container_class->child_type = gtk_menu_shell_child_type;
klass->submenu_placement = GTK_TOP_BOTTOM;
@@ -201,7 +194,6 @@ gtk_menu_shell_class_init (GtkMenuShellClass *klass)
klass->activate_current = gtk_real_menu_shell_activate_current;
klass->cancel = gtk_real_menu_shell_cancel;
klass->select_item = gtk_menu_shell_real_select_item;
- klass->insert = gtk_menu_shell_real_insert;
klass->move_selected = gtk_menu_shell_real_move_selected;
/**
@@ -555,19 +547,6 @@ gtk_menu_shell_insert (GtkMenuShell *menu_shell,
g_signal_emit (menu_shell, menu_shell_signals[INSERT], 0, child, position);
}
-static void
-gtk_menu_shell_real_insert (GtkMenuShell *menu_shell,
- GtkWidget *child,
- gint position)
-{
- GtkMenuShellPrivate *priv = menu_shell->priv;
-
- priv->children = g_list_insert (priv->children, child, position);
-
- if (gtk_widget_get_parent (child) == NULL)
- gtk_widget_set_parent (child, GTK_WIDGET (menu_shell));
-}
-
/**
* gtk_menu_shell_deactivate:
* @menu_shell: a #GtkMenuShell
@@ -656,16 +635,16 @@ click_pressed (GtkGestureClick *gesture,
GtkMenuShellPrivate *priv = menu_shell->priv;
GtkWidget *menu_item;
GdkEvent *event;
- GtkWidget *item_shell;
+ GtkMenuShell *item_shell;
event = gtk_get_current_event ();
menu_item = gtk_get_event_target_with_type (event, GTK_TYPE_MENU_ITEM);
if (menu_item)
- item_shell = gtk_widget_get_ancestor (GTK_WIDGET (menu_item), GTK_TYPE_MENU_SHELL);
+ item_shell = gtk_menu_item_get_menu_shell (GTK_MENU_ITEM (menu_item));
if (menu_item &&
_gtk_menu_item_is_selectable (menu_item) &&
- item_shell == GTK_WIDGET (menu_shell))
+ item_shell == menu_shell)
{
if (menu_item != menu_shell->priv->active_menu_item)
{
@@ -702,7 +681,7 @@ click_pressed (GtkGestureClick *gesture,
if (menu_item)
{
if (_gtk_menu_item_is_selectable (menu_item) &&
- item_shell == GTK_WIDGET (menu_shell) &&
+ item_shell == menu_shell &&
menu_item != priv->active_menu_item)
{
priv->active = TRUE;
@@ -798,7 +777,7 @@ click_released (GtkGestureClick *gesture,
if (menu_item)
{
GtkWidget *submenu = GTK_MENU_ITEM (menu_item)->priv->submenu;
- GtkWidget *parent_menu_item_shell = gtk_widget_get_parent (menu_item);
+ GtkMenuShell *parent_menu_item_shell = gtk_menu_item_get_menu_shell (GTK_MENU_ITEM (menu_item));
if (!_gtk_menu_item_is_selectable (GTK_WIDGET (menu_item)))
return;
@@ -967,46 +946,14 @@ gtk_menu_shell_remove (GtkContainer *container,
{
GtkMenuShell *menu_shell = GTK_MENU_SHELL (container);
GtkMenuShellPrivate *priv = menu_shell->priv;
- gint was_visible;
-
- was_visible = gtk_widget_get_visible (widget);
- priv->children = g_list_remove (priv->children, widget);
if (widget == priv->active_menu_item)
{
g_signal_emit_by_name (priv->active_menu_item, "deselect");
priv->active_menu_item = NULL;
}
-
- gtk_widget_unparent (widget);
-
- /* Queue resize regardless of gtk_widget_get_visible (container),
- * since that's what is needed by toplevels.
- */
- if (was_visible)
- gtk_widget_queue_resize (GTK_WIDGET (container));
}
-static void
-gtk_menu_shell_forall (GtkContainer *container,
- GtkCallback callback,
- gpointer callback_data)
-{
- GtkMenuShell *menu_shell = GTK_MENU_SHELL (container);
- GtkWidget *child;
- GList *children;
-
- children = menu_shell->priv->children;
- while (children)
- {
- child = children->data;
- children = children->next;
-
- (* callback) (child, callback_data);
- }
-}
-
-
static void
gtk_real_menu_shell_deactivate (GtkMenuShell *menu_shell)
{
@@ -1197,7 +1144,7 @@ gtk_menu_shell_activate_item (GtkMenuShell *menu_shell,
g_object_unref (menu_item);
}
-static GList *
+GList *
gtk_menu_shell_get_items (GtkMenuShell *menu_shell)
{
return GTK_MENU_SHELL_GET_CLASS (menu_shell)->get_items (menu_shell);
@@ -1440,13 +1387,13 @@ gtk_real_menu_shell_move_current (GtkMenuShell *menu_shell,
case GTK_MENU_DIR_PREV:
gtk_menu_shell_move_selected (menu_shell, -1);
- if (!had_selection && !priv->active_menu_item && priv->children)
+ if (!had_selection && !priv->active_menu_item)
_gtk_menu_shell_select_last (menu_shell, TRUE);
break;
case GTK_MENU_DIR_NEXT:
gtk_menu_shell_move_selected (menu_shell, 1);
- if (!had_selection && !priv->active_menu_item && priv->children)
+ if (!had_selection && !priv->active_menu_item)
gtk_menu_shell_select_first (menu_shell, TRUE);
break;
diff --git a/gtk/gtkmenushell.h b/gtk/gtkmenushell.h
index 58b635def0..10274da35f 100644
--- a/gtk/gtkmenushell.h
+++ b/gtk/gtkmenushell.h
@@ -75,6 +75,7 @@ struct _GtkMenuShellClass
gint (*get_popup_delay) (GtkMenuShell *menu_shell);
gboolean (*move_selected) (GtkMenuShell *menu_shell,
gint distance);
+ GList * (*get_items) (GtkMenuShell *menu_shell);
/*< private >*/
gpointer padding[8];
diff --git a/gtk/gtkmenushellprivate.h b/gtk/gtkmenushellprivate.h
index 9ea3fa281f..0c42c4d50d 100644
--- a/gtk/gtkmenushellprivate.h
+++ b/gtk/gtkmenushellprivate.h
@@ -36,8 +36,6 @@ typedef enum
struct _GtkMenuShellPrivate
{
- GList *children;
-
GtkWidget *active_menu_item; /* This is not an "active" menu item
* (there is no such thing) but rather,
* the selected menu item in that MenuShell,
@@ -92,6 +90,7 @@ void _gtk_menu_shell_update_mnemonics (GtkMenuShell *menu_shell);
void _gtk_menu_shell_set_keyboard_mode (GtkMenuShell *menu_shell,
gboolean keyboard_mode);
gboolean _gtk_menu_shell_get_keyboard_mode (GtkMenuShell *menu_shell);
+GList *gtk_menu_shell_get_items (GtkMenuShell *menu_shell);
G_END_DECLS
diff --git a/gtk/gtktreemenu.c b/gtk/gtktreemenu.c
index f3f728f9ee..28a8ace5ca 100644
--- a/gtk/gtktreemenu.c
+++ b/gtk/gtktreemenu.c
@@ -800,6 +800,7 @@ row_changed_cb (GtkTreeModel *model,
GtkTreeMenuPrivate *priv = menu->priv;
gboolean is_separator = FALSE;
GtkWidget *item;
+ GList *children;
item = gtk_tree_menu_get_path_item (menu, path);
@@ -814,7 +815,9 @@ row_changed_cb (GtkTreeModel *model,
{
/* Destroy the header item and then the following separator */
gtk_widget_destroy (item);
- gtk_widget_destroy (GTK_MENU_SHELL (menu)->priv->children->data);
+ children = gtk_menu_shell_get_items (GTK_MENU_SHELL (menu));
+ gtk_widget_destroy (children->data);
+ g_list_free (children);
priv->menu_with_header = FALSE;
}
@@ -885,6 +888,7 @@ area_apply_attributes_cb (GtkCellArea *area,
GtkWidget *item;
gboolean is_header;
gboolean sensitive;
+ GList *children;
path = gtk_tree_model_get_path (tree_model, iter);
@@ -905,14 +909,14 @@ area_apply_attributes_cb (GtkCellArea *area,
/* For header items we need to set the sensitivity
* of the following separator item
*/
- if (GTK_MENU_SHELL (menu)->priv->children &&
- GTK_MENU_SHELL (menu)->priv->children->next)
+ children = gtk_menu_shell_get_items (GTK_MENU_SHELL (menu));
+ if (children && children->next)
{
- GtkWidget *separator =
- GTK_MENU_SHELL (menu)->priv->children->next->data;
+ GtkWidget *separator = children->next->data;
gtk_widget_set_sensitive (separator, sensitive);
}
+ g_list_free (children);
}
}
}
diff --git a/gtk/theme/Adwaita/_common.scss b/gtk/theme/Adwaita/_common.scss
index ecdaeccaaf..3c0759b135 100644
--- a/gtk/theme/Adwaita/_common.scss
+++ b/gtk/theme/Adwaita/_common.scss
@@ -2025,7 +2025,7 @@ menubar,
&:backdrop { background-color: $backdrop_bg_color; }
- > menuitem {
+ > box > menuitem {
min-height: 16px;
padding: 4px 8px;
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]