mirror of
https://gitlab.gnome.org/GNOME/gtk.git
synced 2024-11-12 20:00:09 +00:00
window: Move F10 handling to popover menubars
This commit is contained in:
parent
0cf1e1e106
commit
3d4acf6360
@ -49,6 +49,7 @@
|
||||
#include "config.h"
|
||||
|
||||
#include "gtkpopovermenubar.h"
|
||||
#include "gtkpopovermenubarprivate.h"
|
||||
#include "gtkpopovermenu.h"
|
||||
|
||||
#include "gtkboxlayout.h"
|
||||
@ -470,7 +471,6 @@ gtk_popover_menu_bar_get_property (GObject *object,
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
gtk_popover_menu_bar_dispose (GObject *object)
|
||||
{
|
||||
@ -486,6 +486,90 @@ gtk_popover_menu_bar_dispose (GObject *object)
|
||||
G_OBJECT_CLASS (gtk_popover_menu_bar_parent_class)->dispose (object);
|
||||
}
|
||||
|
||||
static GList *
|
||||
get_menu_bars (GtkWindow *window)
|
||||
{
|
||||
return g_object_get_data (G_OBJECT (window), "gtk-menu-bar-list");
|
||||
}
|
||||
|
||||
GList *
|
||||
gtk_popover_menu_bar_get_viewable_menu_bars (GtkWindow *window)
|
||||
{
|
||||
GList *menu_bars;
|
||||
GList *viewable_menu_bars = NULL;
|
||||
|
||||
for (menu_bars = get_menu_bars (window);
|
||||
menu_bars;
|
||||
menu_bars = menu_bars->next)
|
||||
{
|
||||
GtkWidget *widget = menu_bars->data;
|
||||
gboolean viewable = TRUE;
|
||||
|
||||
while (widget)
|
||||
{
|
||||
if (!gtk_widget_get_mapped (widget))
|
||||
viewable = FALSE;
|
||||
|
||||
widget = gtk_widget_get_parent (widget);
|
||||
}
|
||||
|
||||
if (viewable)
|
||||
viewable_menu_bars = g_list_prepend (viewable_menu_bars, menu_bars->data);
|
||||
}
|
||||
|
||||
return g_list_reverse (viewable_menu_bars);
|
||||
}
|
||||
|
||||
static void
|
||||
set_menu_bars (GtkWindow *window,
|
||||
GList *menubars)
|
||||
{
|
||||
g_object_set_data (G_OBJECT (window), I_("gtk-menu-bar-list"), menubars);
|
||||
}
|
||||
|
||||
static void
|
||||
add_to_window (GtkWindow *window,
|
||||
GtkPopoverMenuBar *bar)
|
||||
{
|
||||
GList *menubars = get_menu_bars (window);
|
||||
|
||||
set_menu_bars (window, g_list_prepend (menubars, bar));
|
||||
}
|
||||
|
||||
static void
|
||||
remove_from_window (GtkWindow *window,
|
||||
GtkPopoverMenuBar *bar)
|
||||
{
|
||||
GList *menubars = get_menu_bars (window);
|
||||
|
||||
menubars = g_list_remove (menubars, bar);
|
||||
set_menu_bars (window, menubars);
|
||||
}
|
||||
|
||||
static void
|
||||
gtk_popover_menu_bar_root (GtkWidget *widget)
|
||||
{
|
||||
GtkPopoverMenuBar *bar = GTK_POPOVER_MENU_BAR (widget);
|
||||
GtkWidget *toplevel;
|
||||
|
||||
GTK_WIDGET_CLASS (gtk_popover_menu_bar_parent_class)->root (widget);
|
||||
|
||||
toplevel = GTK_WIDGET (gtk_widget_get_root (widget));
|
||||
add_to_window (GTK_WINDOW (toplevel), bar);
|
||||
}
|
||||
|
||||
static void
|
||||
gtk_popover_menu_bar_unroot (GtkWidget *widget)
|
||||
{
|
||||
GtkPopoverMenuBar *bar = GTK_POPOVER_MENU_BAR (widget);
|
||||
GtkWidget *toplevel;
|
||||
|
||||
toplevel = GTK_WIDGET (gtk_widget_get_root (widget));
|
||||
remove_from_window (GTK_WINDOW (toplevel), bar);
|
||||
|
||||
GTK_WIDGET_CLASS (gtk_popover_menu_bar_parent_class)->unroot (widget);
|
||||
}
|
||||
|
||||
static void
|
||||
gtk_popover_menu_bar_class_init (GtkPopoverMenuBarClass *klass)
|
||||
{
|
||||
@ -496,6 +580,8 @@ gtk_popover_menu_bar_class_init (GtkPopoverMenuBarClass *klass)
|
||||
object_class->set_property = gtk_popover_menu_bar_set_property;
|
||||
object_class->get_property = gtk_popover_menu_bar_get_property;
|
||||
|
||||
widget_class->root = gtk_popover_menu_bar_root;
|
||||
widget_class->unroot = gtk_popover_menu_bar_unroot;
|
||||
widget_class->focus = gtk_popover_menu_bar_focus;
|
||||
|
||||
/**
|
||||
@ -604,3 +690,12 @@ gtk_popover_menu_bar_get_menu_model (GtkPopoverMenuBar *bar)
|
||||
|
||||
return bar->model;
|
||||
}
|
||||
|
||||
void
|
||||
gtk_popover_menu_bar_select_first (GtkPopoverMenuBar *bar)
|
||||
{
|
||||
GtkPopoverMenuBarItem *item;
|
||||
|
||||
item = GTK_POPOVER_MENU_BAR_ITEM (gtk_widget_get_first_child (GTK_WIDGET (bar)));
|
||||
set_active_item (bar, item, TRUE);
|
||||
}
|
||||
|
31
gtk/gtkpopovermenubarprivate.h
Normal file
31
gtk/gtkpopovermenubarprivate.h
Normal file
@ -0,0 +1,31 @@
|
||||
/* GTK - The GIMP Toolkit
|
||||
* Copyright © 2019 Carlos Garnacho <carlosg@gnome.org>
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef __GTK_POPOVER_MENU_BAR_PRIVATE_H__
|
||||
#define __GTK_POPOVER_MENU_BAR_PRIVATE_H__
|
||||
|
||||
#include "gtkpopovermenubar.h"
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
void gtk_popover_menu_bar_select_first (GtkPopoverMenuBar *bar);
|
||||
GList* gtk_popover_menu_bar_get_viewable_menu_bars (GtkWindow *window);
|
||||
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
#endif /* __GTK_POPOVER_PRIVATE_H__ */
|
@ -67,6 +67,7 @@
|
||||
#include "gtktypebuiltins.h"
|
||||
#include "gtkwidgetprivate.h"
|
||||
#include "gtkwindowgroup.h"
|
||||
#include "gtkpopovermenubarprivate.h"
|
||||
|
||||
#include "a11y/gtkwindowaccessibleprivate.h"
|
||||
#include "a11y/gtkcontaineraccessibleprivate.h"
|
||||
@ -8262,7 +8263,6 @@ gtk_window_activate_menubar (GtkWindow *window,
|
||||
{
|
||||
GList *tmp_menubars, *l;
|
||||
GPtrArray *menubars;
|
||||
GtkMenuShell *menu_shell;
|
||||
GtkWidget *focus;
|
||||
GtkWidget *first;
|
||||
|
||||
@ -8273,7 +8273,7 @@ gtk_window_activate_menubar (GtkWindow *window,
|
||||
gtk_widget_child_focus (priv->title_box, GTK_DIR_TAB_FORWARD))
|
||||
return TRUE;
|
||||
|
||||
tmp_menubars = _gtk_menu_bar_get_viewable_menu_bars (window);
|
||||
tmp_menubars = gtk_popover_menu_bar_get_viewable_menu_bars (window);
|
||||
if (tmp_menubars == NULL)
|
||||
return FALSE;
|
||||
|
||||
@ -8286,10 +8286,7 @@ gtk_window_activate_menubar (GtkWindow *window,
|
||||
gtk_widget_focus_sort (GTK_WIDGET (window), GTK_DIR_TAB_FORWARD, menubars);
|
||||
|
||||
first = g_ptr_array_index (menubars, 0);
|
||||
menu_shell = GTK_MENU_SHELL (first);
|
||||
|
||||
_gtk_menu_shell_set_keyboard_mode (menu_shell, TRUE);
|
||||
gtk_menu_shell_select_first (menu_shell, FALSE);
|
||||
gtk_popover_menu_bar_select_first (GTK_POPOVER_MENU_BAR (first));
|
||||
|
||||
g_ptr_array_free (menubars, TRUE);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user