Compare commits
157 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 025e4721ba | |||
| ab24a46310 | |||
| c7b5e75377 | |||
| 130c8b1b7b | |||
| 2a76337c82 | |||
| b38f0f67c8 | |||
| 9aebb66755 | |||
| da36d0502f | |||
| bf56f1a8c5 | |||
| 8cf231c3b7 | |||
| 2cd739ae23 | |||
| 5b39a06032 | |||
| 532a1c6d0d | |||
| d1691c5a48 | |||
| 2002d49871 | |||
| 14fd2ccca5 | |||
| 1c34d79a53 | |||
| 3a139453c4 | |||
| 3fcfcf51f6 | |||
| aa04678239 | |||
| 0dccb3de40 | |||
| f9c670b7c6 | |||
| e40758ec26 | |||
| ce19f5a282 | |||
| b050572918 | |||
| f6f8f4b742 | |||
| 318ac2f823 | |||
| af689a2a5c | |||
| caf73e7211 | |||
| fca13bd00c | |||
| 6d4fcd9633 | |||
| dfd20e037b | |||
| d9b771aa7f | |||
| 7873f5c4eb | |||
| 60479bedae | |||
| 6b632ca139 | |||
| a92ab66024 | |||
| 8ab76574cd | |||
| 21e9fc054e | |||
| 1cbb2099a2 | |||
| 7ed27ef574 | |||
| 9039d0b0c1 | |||
| 00e68fcae2 | |||
| 9038b7a8c5 | |||
| 0a7f5f1be1 | |||
| 70597de0a5 | |||
| 75b19169cf | |||
| 390ba974df | |||
| d9167fc8d6 | |||
| d000bed15f | |||
| b1ac7b667c | |||
| b89dee2f56 | |||
| 0f75f33857 | |||
| f41931f527 | |||
| fa8ffa6d6c | |||
| b2be6db1ed | |||
| 949afa598a | |||
| 56bc921586 | |||
| d0509d5afc | |||
| a9c0548179 | |||
| 79c5398690 | |||
| 26d310fb07 | |||
| 1787bf5471 | |||
| 2ace9aef5f | |||
| b46e7f1108 | |||
| cedb413600 | |||
| f0b41b181d | |||
| 9c46eb4398 | |||
| 2aa9c0ddc1 | |||
| ba9fc7aead | |||
| 0a77a4a264 | |||
| 0b21d6a01c | |||
| 21e4f5353b | |||
| 16583da221 | |||
| ee88c6863e | |||
| 112a8d1037 | |||
| 28a1e44833 | |||
| d273fb63ec | |||
| 4ac2f95688 | |||
| d38791473a | |||
| c5b2bb06be | |||
| 6a75fdf732 | |||
| dd1b65d522 | |||
| 40264629f7 | |||
| 740fe4f7ce | |||
| 7fffbccbde | |||
| 10ff0bc959 | |||
| c336ebdaae | |||
| 4d6d5d3fe5 | |||
| edf1023f5c | |||
| 41a9786b51 | |||
| 97cdd92233 | |||
| ba70b22ab1 | |||
| 500bee4a25 | |||
| c551279ec7 | |||
| 6b4b1a0ba3 | |||
| 635299fff1 | |||
| 46179898cf | |||
| d977797d87 | |||
| d9320b923d | |||
| bd2dc9f299 | |||
| d1711f4953 | |||
| 8462b4f322 | |||
| cee07a218d | |||
| 8270a0c751 | |||
| 4bbeb36afe | |||
| 9acfc58fc4 | |||
| 757ccb65df | |||
| fd0a0c0da6 | |||
| 7685d8fdd8 | |||
| 8a0607bc4e | |||
| 0aa6898e54 | |||
| b0f971b45a | |||
| b902beaf42 | |||
| 6f57b1fb5f | |||
| 0a1b472b40 | |||
| 5172ccaf64 | |||
| e623561d94 | |||
| 5a1719c719 | |||
| 58c3be5dfb | |||
| a3cb40832e | |||
| 603da7b432 | |||
| 95c7669a96 | |||
| 2774f9ab9f | |||
| 0e875859aa | |||
| 042ad688eb | |||
| 25519ae3fa | |||
| 484a20709e | |||
| c1f6dd6f0a | |||
| b10e31985a | |||
| a55af731f0 | |||
| 52ff060527 | |||
| 11e132d8e0 | |||
| da0465ec27 | |||
| 27a60f76fc | |||
| 232f4a8503 | |||
| bb0343ecc8 | |||
| f8638c7fc9 | |||
| 571320a198 | |||
| 8c256ab36a | |||
| dfba621d80 | |||
| 80ecccf6ba | |||
| 47d348a6de | |||
| 778a60fa2c | |||
| fbaba0026a | |||
| e8aba7d8b9 | |||
| fc9ff92096 | |||
| f80d664c0d | |||
| ec641ebcab | |||
| 8b96ce4e8b | |||
| 504e203a1d | |||
| 435ff1012f | |||
| 83bfc8d9f2 | |||
| 0e4bbb18f3 | |||
| 935c03c8a0 | |||
| 77ef644c7c | |||
| fd9d7c67d5 |
+18
-43
@@ -31,17 +31,27 @@ about_activate (GSimpleAction *action,
|
||||
}
|
||||
|
||||
static void
|
||||
help_activate (GSimpleAction *action,
|
||||
menu_activate (GSimpleAction *action,
|
||||
GVariant *parameter,
|
||||
gpointer user_data)
|
||||
{
|
||||
g_print ("Help not available\n");
|
||||
g_print ("%s action not available\n", g_action_get_name (G_ACTION (action)));
|
||||
}
|
||||
|
||||
static GActionEntry win_entries[] = {
|
||||
{ "quit", quit_activate, NULL, NULL, NULL },
|
||||
{ "about", about_activate, NULL, NULL, NULL },
|
||||
{ "help", help_activate, NULL, NULL, NULL }
|
||||
{ "help", menu_activate, NULL, NULL, NULL }
|
||||
};
|
||||
|
||||
static GActionEntry menu_entries[] = {
|
||||
{ "new", menu_activate, NULL, NULL, NULL },
|
||||
{ "open", menu_activate, NULL, NULL, NULL },
|
||||
{ "save", menu_activate, NULL, NULL, NULL },
|
||||
{ "save_as", menu_activate, NULL, NULL, NULL },
|
||||
{ "copy", menu_activate, NULL, NULL, NULL },
|
||||
{ "cut", menu_activate, NULL, NULL, NULL },
|
||||
{ "paste", menu_activate, NULL, NULL, NULL },
|
||||
};
|
||||
|
||||
GtkWidget *
|
||||
@@ -50,8 +60,6 @@ do_builder (GtkWidget *do_widget)
|
||||
static GtkWidget *window = NULL;
|
||||
GtkWidget *toolbar;
|
||||
GActionGroup *actions;
|
||||
GtkAccelGroup *accel_group;
|
||||
GtkWidget *item;
|
||||
|
||||
if (!window)
|
||||
{
|
||||
@@ -73,44 +81,11 @@ do_builder (GtkWidget *do_widget)
|
||||
win_entries, G_N_ELEMENTS (win_entries),
|
||||
window);
|
||||
gtk_widget_insert_action_group (window, "win", actions);
|
||||
accel_group = gtk_accel_group_new ();
|
||||
gtk_window_add_accel_group (GTK_WINDOW (window), accel_group);
|
||||
|
||||
item = (GtkWidget*)gtk_builder_get_object (builder, "new_item");
|
||||
gtk_widget_add_accelerator (item, "activate", accel_group,
|
||||
GDK_KEY_n, GDK_CONTROL_MASK, GTK_ACCEL_VISIBLE);
|
||||
|
||||
item = (GtkWidget*)gtk_builder_get_object (builder, "open_item");
|
||||
gtk_widget_add_accelerator (item, "activate", accel_group,
|
||||
GDK_KEY_o, GDK_CONTROL_MASK, GTK_ACCEL_VISIBLE);
|
||||
|
||||
item = (GtkWidget*)gtk_builder_get_object (builder, "save_item");
|
||||
gtk_widget_add_accelerator (item, "activate", accel_group,
|
||||
GDK_KEY_s, GDK_CONTROL_MASK, GTK_ACCEL_VISIBLE);
|
||||
|
||||
item = (GtkWidget*)gtk_builder_get_object (builder, "quit_item");
|
||||
gtk_widget_add_accelerator (item, "activate", accel_group,
|
||||
GDK_KEY_q, GDK_CONTROL_MASK, GTK_ACCEL_VISIBLE);
|
||||
|
||||
item = (GtkWidget*)gtk_builder_get_object (builder, "copy_item");
|
||||
gtk_widget_add_accelerator (item, "activate", accel_group,
|
||||
GDK_KEY_c, GDK_CONTROL_MASK, GTK_ACCEL_VISIBLE);
|
||||
|
||||
item = (GtkWidget*)gtk_builder_get_object (builder, "cut_item");
|
||||
gtk_widget_add_accelerator (item, "activate", accel_group,
|
||||
GDK_KEY_x, GDK_CONTROL_MASK, GTK_ACCEL_VISIBLE);
|
||||
|
||||
item = (GtkWidget*)gtk_builder_get_object (builder, "paste_item");
|
||||
gtk_widget_add_accelerator (item, "activate", accel_group,
|
||||
GDK_KEY_v, GDK_CONTROL_MASK, GTK_ACCEL_VISIBLE);
|
||||
|
||||
item = (GtkWidget*)gtk_builder_get_object (builder, "help_item");
|
||||
gtk_widget_add_accelerator (item, "activate", accel_group,
|
||||
GDK_KEY_F1, 0, GTK_ACCEL_VISIBLE);
|
||||
|
||||
item = (GtkWidget*)gtk_builder_get_object (builder, "about_item");
|
||||
gtk_widget_add_accelerator (item, "activate", accel_group,
|
||||
GDK_KEY_F7, 0, GTK_ACCEL_VISIBLE);
|
||||
actions = (GActionGroup*)g_simple_action_group_new ();
|
||||
g_action_map_add_action_entries (G_ACTION_MAP (actions),
|
||||
menu_entries, G_N_ELEMENTS (menu_entries),
|
||||
window);
|
||||
gtk_widget_insert_action_group (window, "menu", actions);
|
||||
|
||||
g_object_set_data_full (G_OBJECT(window), "builder", builder, g_object_unref);
|
||||
}
|
||||
|
||||
@@ -204,6 +204,7 @@
|
||||
<file>search_entry.c</file>
|
||||
<file>search_entry2.c</file>
|
||||
<file>shortcuts.c</file>
|
||||
<file>shortcut_triggers.c</file>
|
||||
<file>sizegroup.c</file>
|
||||
<file>sidebar.c</file>
|
||||
<file>sliding_puzzle.c</file>
|
||||
|
||||
+73
-1
@@ -33,6 +33,72 @@
|
||||
<property name="default-height">250</property>
|
||||
<property name="default-width">440</property>
|
||||
<property name="title" translatable="yes">Builder</property>
|
||||
<child>
|
||||
<object class="GtkShortcutController" id="controller1">
|
||||
<property name="scope">global</property>
|
||||
<property name="propagation-phase">capture</property>
|
||||
<child>
|
||||
<object class="GtkShortcut">
|
||||
<property name="trigger"><Primary>n</property>
|
||||
<property name="action">action(menu.new)</property>
|
||||
</object>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkShortcut">
|
||||
<property name="trigger"><Primary>o</property>
|
||||
<property name="action">action(menu.open)</property>
|
||||
</object>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkShortcut">
|
||||
<property name="trigger"><Primary>s</property>
|
||||
<property name="action">action(menu.save)</property>
|
||||
</object>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkShortcut">
|
||||
<property name="trigger"><Primary><Shift>s</property>
|
||||
<property name="action">action(menu.save_as)</property>
|
||||
</object>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkShortcut">
|
||||
<property name="trigger"><Primary>q</property>
|
||||
<property name="action">action(win.quit)</property>
|
||||
</object>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkShortcut">
|
||||
<property name="trigger"><Primary>c</property>
|
||||
<property name="action">action(menu.copy)</property>
|
||||
</object>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkShortcut">
|
||||
<property name="trigger"><Primary>x</property>
|
||||
<property name="action">action(menu.cut)</property>
|
||||
</object>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkShortcut">
|
||||
<property name="trigger"><Primary>v</property>
|
||||
<property name="action">action(menu.paste)</property>
|
||||
</object>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkShortcut">
|
||||
<property name="trigger">F1</property>
|
||||
<property name="action">action(win.help)</property>
|
||||
</object>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkShortcut">
|
||||
<property name="trigger">F7</property>
|
||||
<property name="action">action(win.about)</property>
|
||||
</object>
|
||||
</child>
|
||||
</object>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkBox" id="vbox1">
|
||||
<property name="orientation">vertical</property>
|
||||
@@ -53,25 +119,28 @@
|
||||
<object class="GtkMenuItem" id="new_item">
|
||||
<property name="label" translatable="yes">_New</property>
|
||||
<property name="use-underline">1</property>
|
||||
<property name="action-name">menu.new</property>
|
||||
</object>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkMenuItem" id="open_item">
|
||||
<property name="label" translatable="yes">_Open</property>
|
||||
<property name="use-underline">1</property>
|
||||
<property name="action-name">menu.open</property>
|
||||
</object>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkMenuItem" id="save_item">
|
||||
<property name="label" translatable="yes">_Save</property>
|
||||
<property name="use-underline">1</property>
|
||||
<property name="action-name">menu.save</property>
|
||||
</object>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkMenuItem" id="save_as_item">
|
||||
<property name="label" translatable="yes">Save _As</property>
|
||||
<property name="use-underline">1</property>
|
||||
<accelerator key="s" modifiers="primary | shift-mask" signal="activate"/>
|
||||
<property name="action-name">menu.save_as</property>
|
||||
</object>
|
||||
</child>
|
||||
<child>
|
||||
@@ -98,18 +167,21 @@
|
||||
<object class="GtkMenuItem" id="copy_item">
|
||||
<property name="label" translatable="yes">_Copy</property>
|
||||
<property name="use-underline">1</property>
|
||||
<property name="action-name">menu.copy</property>
|
||||
</object>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkMenuItem" id="cut_item">
|
||||
<property name="label" translatable="yes">_Cut</property>
|
||||
<property name="use-underline">1</property>
|
||||
<property name="action-name">menu.cut</property>
|
||||
</object>
|
||||
</child>
|
||||
<child>
|
||||
<object class="GtkMenuItem" id="paste_item">
|
||||
<property name="label" translatable="yes">_Paste</property>
|
||||
<property name="use-underline">1</property>
|
||||
<property name="action-name">menu.paste</property>
|
||||
</object>
|
||||
</child>
|
||||
</object>
|
||||
|
||||
@@ -310,7 +310,6 @@ static gchar *types[] =
|
||||
"GtkIconView ",
|
||||
"GtkCellRendererText ",
|
||||
"GtkContainer ",
|
||||
"GtkAccelGroup ",
|
||||
"GtkPaned ",
|
||||
"GtkPrintOperation ",
|
||||
"GtkPrintContext ",
|
||||
|
||||
@@ -87,7 +87,6 @@ do_menus (GtkWidget *do_widget)
|
||||
GtkWidget *menubar;
|
||||
GtkWidget *menu;
|
||||
GtkWidget *menuitem;
|
||||
GtkAccelGroup *accel_group;
|
||||
|
||||
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
|
||||
gtk_window_set_display (GTK_WINDOW (window),
|
||||
@@ -96,9 +95,6 @@ do_menus (GtkWidget *do_widget)
|
||||
g_signal_connect (window, "destroy",
|
||||
G_CALLBACK(gtk_widget_destroyed), &window);
|
||||
|
||||
accel_group = gtk_accel_group_new ();
|
||||
gtk_window_add_accel_group (GTK_WINDOW (window), accel_group);
|
||||
|
||||
box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
|
||||
gtk_container_add (GTK_CONTAINER (window), box);
|
||||
|
||||
|
||||
@@ -59,6 +59,7 @@ demos = files([
|
||||
'search_entry.c',
|
||||
'search_entry2.c',
|
||||
'shortcuts.c',
|
||||
'shortcut_triggers.c',
|
||||
'sidebar.c',
|
||||
'sizegroup.c',
|
||||
'sliding_puzzle.c',
|
||||
|
||||
@@ -0,0 +1,91 @@
|
||||
/* Shortcuts
|
||||
*
|
||||
* GtkShortcut is the abstraction used by GTK to handle shortcuts from
|
||||
* keyboard or other input devices.
|
||||
*
|
||||
* Shortcut triggers can be used to weave complex sequences of key
|
||||
* presses into sophisticated mechanisms to activate shortcuts.
|
||||
*
|
||||
* This demo code shows creative ways to do that.
|
||||
*/
|
||||
|
||||
#include <gtk/gtk.h>
|
||||
|
||||
static GtkWidget *window = NULL;
|
||||
|
||||
static gboolean
|
||||
shortcut_activated (GtkWidget *window,
|
||||
GVariant *unused,
|
||||
gpointer row)
|
||||
{
|
||||
g_print ("activated %s\n", gtk_label_get_label (row));
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static GtkShortcutTrigger *
|
||||
create_ctrl_g (void)
|
||||
{
|
||||
return gtk_keyval_trigger_new (GDK_KEY_g, GDK_CONTROL_MASK);
|
||||
}
|
||||
|
||||
static GtkShortcutTrigger *
|
||||
create_x (void)
|
||||
{
|
||||
return gtk_keyval_trigger_new (GDK_KEY_x, 0);
|
||||
}
|
||||
|
||||
struct {
|
||||
char *description;
|
||||
GtkShortcutTrigger * (* create_trigger_func) (void);
|
||||
} shortcuts[] = {
|
||||
{ "Press Ctrl-G", create_ctrl_g },
|
||||
{ "Press X", create_x },
|
||||
};
|
||||
|
||||
GtkWidget *
|
||||
do_shortcut_triggers (GtkWidget *do_widget)
|
||||
{
|
||||
guint i;
|
||||
|
||||
if (!window)
|
||||
{
|
||||
GtkWidget *list;
|
||||
GtkEventController *controller;
|
||||
|
||||
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
|
||||
gtk_window_set_display (GTK_WINDOW (window),
|
||||
gtk_widget_get_display (do_widget));
|
||||
gtk_window_set_title (GTK_WINDOW (window), "Shortcuts");
|
||||
|
||||
g_signal_connect (window, "destroy",
|
||||
G_CALLBACK (gtk_widget_destroyed), &window);
|
||||
|
||||
list = gtk_list_box_new ();
|
||||
g_object_set (list, "margin", 6, NULL);
|
||||
gtk_container_add (GTK_CONTAINER (window), list);
|
||||
|
||||
for (i = 0; i < G_N_ELEMENTS (shortcuts); i++)
|
||||
{
|
||||
GtkShortcut *shortcut;
|
||||
GtkWidget *row;
|
||||
|
||||
row = gtk_label_new (shortcuts[i].description);
|
||||
gtk_container_add (GTK_CONTAINER (list), row);
|
||||
|
||||
controller = gtk_shortcut_controller_new ();
|
||||
gtk_shortcut_controller_set_scope (GTK_SHORTCUT_CONTROLLER (controller), GTK_SHORTCUT_SCOPE_GLOBAL);
|
||||
gtk_widget_add_controller (row, controller);
|
||||
|
||||
shortcut = gtk_shortcut_new (shortcuts[i].create_trigger_func(),
|
||||
gtk_callback_action_new (shortcut_activated, row, NULL));
|
||||
gtk_shortcut_controller_add_shortcut (GTK_SHORTCUT_CONTROLLER (controller), shortcut);
|
||||
}
|
||||
}
|
||||
|
||||
if (!gtk_widget_get_visible (window))
|
||||
gtk_widget_show (window);
|
||||
else
|
||||
gtk_widget_destroy (window);
|
||||
|
||||
return window;
|
||||
}
|
||||
@@ -160,47 +160,13 @@ check_solved (GtkWidget *grid)
|
||||
}
|
||||
|
||||
static gboolean
|
||||
puzzle_key_pressed (GtkEventControllerKey *controller,
|
||||
guint keyval,
|
||||
guint keycode,
|
||||
GdkModifierType state,
|
||||
GtkWidget *grid)
|
||||
puzzle_key_pressed (GtkWidget *grid,
|
||||
GVariant *args,
|
||||
gpointer unused)
|
||||
{
|
||||
int dx, dy;
|
||||
|
||||
dx = 0;
|
||||
dy = 0;
|
||||
|
||||
switch (keyval)
|
||||
{
|
||||
case GDK_KEY_KP_Left:
|
||||
case GDK_KEY_Left:
|
||||
/* left */
|
||||
dx = -1;
|
||||
break;
|
||||
|
||||
case GDK_KEY_KP_Up:
|
||||
case GDK_KEY_Up:
|
||||
/* up */
|
||||
dy = -1;
|
||||
break;
|
||||
|
||||
case GDK_KEY_KP_Right:
|
||||
case GDK_KEY_Right:
|
||||
/* right */
|
||||
dx = 1;
|
||||
break;
|
||||
|
||||
case GDK_KEY_KP_Down:
|
||||
case GDK_KEY_Down:
|
||||
/* down */
|
||||
dy = 1;
|
||||
break;
|
||||
|
||||
default:
|
||||
/* We return FALSE here because we didn't handle the key that was pressed */
|
||||
return FALSE;
|
||||
}
|
||||
g_variant_get (args, "(ii)", &dx, &dy);
|
||||
|
||||
if (!move_puzzle (grid, dx, dy))
|
||||
{
|
||||
@@ -276,6 +242,24 @@ puzzle_button_pressed (GtkGestureClick *gesture,
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
add_move_binding (GtkShortcutController *controller,
|
||||
guint keyval,
|
||||
guint kp_keyval,
|
||||
int dx,
|
||||
int dy)
|
||||
{
|
||||
GtkShortcut *shortcut;
|
||||
|
||||
shortcut = gtk_shortcut_new_with_arguments (
|
||||
gtk_alternative_trigger_new (gtk_keyval_trigger_new (keyval, 0),
|
||||
gtk_keyval_trigger_new (kp_keyval, 0)),
|
||||
gtk_callback_action_new (puzzle_key_pressed, NULL, NULL),
|
||||
"(ii)", dx, dy);
|
||||
gtk_shortcut_controller_add_shortcut (controller, shortcut);
|
||||
g_object_unref (shortcut);
|
||||
}
|
||||
|
||||
static void
|
||||
start_puzzle (GdkPaintable *puzzle)
|
||||
{
|
||||
@@ -298,12 +282,21 @@ start_puzzle (GdkPaintable *puzzle)
|
||||
aspect_ratio = 1.0;
|
||||
gtk_aspect_frame_set (GTK_ASPECT_FRAME (frame), 0.5, 0.5, aspect_ratio, FALSE);
|
||||
|
||||
/* Add a key event controller so people can use the arrow
|
||||
/* Add shortcuts so people can use the arrow
|
||||
* keys to move the puzzle */
|
||||
controller = gtk_event_controller_key_new ();
|
||||
g_signal_connect (controller, "key-pressed",
|
||||
G_CALLBACK (puzzle_key_pressed),
|
||||
grid);
|
||||
controller = gtk_shortcut_controller_new ();
|
||||
add_move_binding (GTK_SHORTCUT_CONTROLLER (controller),
|
||||
GDK_KEY_Left, GDK_KEY_KP_Left,
|
||||
-1, 0);
|
||||
add_move_binding (GTK_SHORTCUT_CONTROLLER (controller),
|
||||
GDK_KEY_Right, GDK_KEY_KP_Right,
|
||||
1, 0);
|
||||
add_move_binding (GTK_SHORTCUT_CONTROLLER (controller),
|
||||
GDK_KEY_Up, GDK_KEY_KP_Up,
|
||||
0, -1);
|
||||
add_move_binding (GTK_SHORTCUT_CONTROLLER (controller),
|
||||
GDK_KEY_Down, GDK_KEY_KP_Down,
|
||||
0, 1);
|
||||
gtk_widget_add_controller (GTK_WIDGET (grid), controller);
|
||||
|
||||
controller = GTK_EVENT_CONTROLLER (gtk_gesture_click_new ());
|
||||
|
||||
@@ -1050,25 +1050,33 @@ row_activated (GtkListBox *box, GtkListBoxRow *row)
|
||||
}
|
||||
}
|
||||
|
||||
typedef struct {
|
||||
const gchar *action_and_target;
|
||||
const gchar *accelerators[2];
|
||||
} Accel;
|
||||
|
||||
static void
|
||||
set_accel (GtkApplication *app, GtkWidget *widget)
|
||||
set_accel (GtkWidget *widget, Accel *accels, int n_accels)
|
||||
{
|
||||
GtkWidget *accel_label;
|
||||
const gchar *action;
|
||||
gchar **accels;
|
||||
guint key;
|
||||
GdkModifierType mods;
|
||||
int i;
|
||||
|
||||
accel_label = gtk_bin_get_child (GTK_BIN (widget));
|
||||
g_assert (GTK_IS_ACCEL_LABEL (accel_label));
|
||||
|
||||
action = gtk_actionable_get_action_name (GTK_ACTIONABLE (widget));
|
||||
accels = gtk_application_get_accels_for_action (app, action);
|
||||
|
||||
gtk_accelerator_parse (accels[0], &key, &mods);
|
||||
gtk_accel_label_set_accel (GTK_ACCEL_LABEL (accel_label), key, mods);
|
||||
|
||||
g_strfreev (accels);
|
||||
for (i = 0; i < n_accels; i++)
|
||||
{
|
||||
if (strcmp (accels[i].action_and_target, action) == 0)
|
||||
{
|
||||
if (gtk_accelerator_parse (accels[i].accelerators[0], &key, &mods))
|
||||
gtk_accel_label_set_accel (GTK_ACCEL_LABEL (accel_label), key, mods);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
typedef struct
|
||||
@@ -1679,10 +1687,7 @@ activate (GApplication *app)
|
||||
{ "record", activate_record, NULL, NULL, NULL },
|
||||
{ "lock", activate_lock, NULL, NULL, NULL },
|
||||
};
|
||||
struct {
|
||||
const gchar *action_and_target;
|
||||
const gchar *accelerators[2];
|
||||
} accels[] = {
|
||||
Accel accels[] = {
|
||||
{ "app.about", { "F1", NULL } },
|
||||
{ "app.quit", { "<Primary>q", NULL } },
|
||||
{ "app.open-in", { "<Primary>n", NULL } },
|
||||
@@ -1700,6 +1705,7 @@ activate (GApplication *app)
|
||||
gint i;
|
||||
GPermission *permission;
|
||||
GAction *action;
|
||||
GtkEventController *controller;
|
||||
|
||||
g_type_ensure (my_text_view_get_type ());
|
||||
|
||||
@@ -1734,8 +1740,27 @@ activate (GApplication *app)
|
||||
win_entries, G_N_ELEMENTS (win_entries),
|
||||
window);
|
||||
|
||||
controller = gtk_shortcut_controller_new ();
|
||||
gtk_shortcut_controller_set_scope (GTK_SHORTCUT_CONTROLLER (controller),
|
||||
GTK_SHORTCUT_SCOPE_GLOBAL);
|
||||
|
||||
for (i = 0; i < G_N_ELEMENTS (accels); i++)
|
||||
gtk_application_set_accels_for_action (GTK_APPLICATION (app), accels[i].action_and_target, accels[i].accelerators);
|
||||
{
|
||||
GtkShortcutTrigger *trigger;
|
||||
GtkShortcutAction *action;
|
||||
GtkShortcut *shortcut;
|
||||
guint keyval;
|
||||
GdkModifierType modifiers;
|
||||
|
||||
gtk_accelerator_parse (accels[i].accelerators[0], &keyval, &modifiers);
|
||||
trigger = gtk_keyval_trigger_new (keyval, modifiers);
|
||||
action = gtk_action_action_new (accels[i].action_and_target);
|
||||
shortcut = gtk_shortcut_new (trigger, action);
|
||||
gtk_shortcut_controller_add_shortcut (GTK_SHORTCUT_CONTROLLER (controller), shortcut);
|
||||
g_object_unref (shortcut);
|
||||
}
|
||||
|
||||
gtk_widget_add_controller (GTK_WIDGET (window), controller);
|
||||
|
||||
widget = (GtkWidget *)gtk_builder_get_object (builder, "statusbar");
|
||||
gtk_statusbar_push (GTK_STATUSBAR (widget), 0, "All systems are operating normally.");
|
||||
@@ -1855,12 +1880,12 @@ activate (GApplication *app)
|
||||
g_object_set_data (G_OBJECT (widget2), "range_to_spin", widget3);
|
||||
g_object_set_data (G_OBJECT (widget), "print_button", widget4);
|
||||
|
||||
set_accel (GTK_APPLICATION (app), GTK_WIDGET (gtk_builder_get_object (builder, "quitmenuitem")));
|
||||
set_accel (GTK_APPLICATION (app), GTK_WIDGET (gtk_builder_get_object (builder, "deletemenuitem")));
|
||||
set_accel (GTK_APPLICATION (app), GTK_WIDGET (gtk_builder_get_object (builder, "searchmenuitem")));
|
||||
set_accel (GTK_APPLICATION (app), GTK_WIDGET (gtk_builder_get_object (builder, "darkmenuitem")));
|
||||
set_accel (GTK_APPLICATION (app), GTK_WIDGET (gtk_builder_get_object (builder, "aboutmenuitem")));
|
||||
set_accel (GTK_APPLICATION (app), GTK_WIDGET (gtk_builder_get_object (builder, "bgmenuitem")));
|
||||
set_accel (GTK_WIDGET (gtk_builder_get_object (builder, "quitmenuitem")), accels, G_N_ELEMENTS (accels));
|
||||
set_accel (GTK_WIDGET (gtk_builder_get_object (builder, "deletemenuitem")), accels, G_N_ELEMENTS (accels));
|
||||
set_accel (GTK_WIDGET (gtk_builder_get_object (builder, "searchmenuitem")), accels, G_N_ELEMENTS (accels));
|
||||
set_accel (GTK_WIDGET (gtk_builder_get_object (builder, "darkmenuitem")), accels, G_N_ELEMENTS (accels));
|
||||
set_accel (GTK_WIDGET (gtk_builder_get_object (builder, "aboutmenuitem")), accels, G_N_ELEMENTS (accels));
|
||||
set_accel (GTK_WIDGET (gtk_builder_get_object (builder, "bgmenuitem")), accels, G_N_ELEMENTS (accels));
|
||||
|
||||
widget2 = (GtkWidget *)gtk_builder_get_object (builder, "tooltextview");
|
||||
|
||||
|
||||
@@ -342,17 +342,21 @@
|
||||
<xi:include href="xml/gtkpadcontroller.xml" />
|
||||
</chapter>
|
||||
|
||||
<chapter>
|
||||
<title>Keyboard shortcuts</title>
|
||||
<xi:include href="xml/gtkshortcutcontroller.xml" />
|
||||
<xi:include href="xml/gtkshortcut.xml" />
|
||||
<xi:include href="xml/gtkshortcuttrigger.xml" />
|
||||
<xi:include href="xml/gtkshortcutaction.xml" />
|
||||
</chapter>
|
||||
</part>
|
||||
|
||||
<part id="gtkbase">
|
||||
<title>GTK Core Reference</title>
|
||||
<xi:include href="xml/gtkmain.xml" />
|
||||
<xi:include href="xml/gtkfeatures.xml" />
|
||||
<xi:include href="xml/gtkaccelgroup.xml" />
|
||||
<xi:include href="xml/gtkaccelmap.xml" />
|
||||
<xi:include href="xml/gtkdnd.xml" />
|
||||
<xi:include href="xml/gtksettings.xml" />
|
||||
<xi:include href="xml/gtkbindings.xml" />
|
||||
<xi:include href="xml/gtkenums.xml" />
|
||||
<xi:include href="xml/gtkselection.xml" />
|
||||
<xi:include href="xml/gtktesting.xml" />
|
||||
|
||||
@@ -53,26 +53,6 @@ gtk_about_dialog_get_type
|
||||
<SECTION>
|
||||
<FILE>gtkaccelgroup</FILE>
|
||||
<TITLE>Keyboard Accelerators</TITLE>
|
||||
GtkAccelGroup
|
||||
GtkAccelGroupClass
|
||||
gtk_accel_group_new
|
||||
GtkAccelFlags
|
||||
gtk_accel_group_connect
|
||||
gtk_accel_group_connect_by_path
|
||||
GtkAccelGroupActivate
|
||||
GtkAccelGroupFindFunc
|
||||
gtk_accel_group_disconnect
|
||||
gtk_accel_group_disconnect_key
|
||||
gtk_accel_group_activate
|
||||
gtk_accel_group_lock
|
||||
gtk_accel_group_unlock
|
||||
gtk_accel_group_get_is_locked
|
||||
gtk_accel_group_from_accel_closure
|
||||
gtk_accel_group_get_modifier_mask
|
||||
gtk_accel_groups_activate
|
||||
gtk_accel_groups_from_object
|
||||
gtk_accel_group_find
|
||||
GtkAccelKey
|
||||
gtk_accelerator_valid
|
||||
gtk_accelerator_parse
|
||||
gtk_accelerator_name
|
||||
@@ -82,52 +62,6 @@ gtk_accelerator_name_with_keycode
|
||||
gtk_accelerator_get_label_with_keycode
|
||||
gtk_accelerator_set_default_mod_mask
|
||||
gtk_accelerator_get_default_mod_mask
|
||||
|
||||
<SUBSECTION Standard>
|
||||
GTK_TYPE_ACCEL_GROUP
|
||||
GTK_ACCEL_GROUP
|
||||
GTK_IS_ACCEL_GROUP
|
||||
GTK_ACCEL_GROUP_CLASS
|
||||
GTK_IS_ACCEL_GROUP_CLASS
|
||||
GTK_ACCEL_GROUP_GET_CLASS
|
||||
|
||||
<SUBSECTION Private>
|
||||
GTK_ACCEL_GROUP_GET_PRIVATE
|
||||
GtkAccelGroupPrivate
|
||||
GtkAccelGroupEntry
|
||||
gtk_accel_group_query
|
||||
gtk_accel_group_get_type
|
||||
</SECTION>
|
||||
|
||||
<SECTION>
|
||||
<FILE>gtkaccelmap</FILE>
|
||||
<TITLE>Accelerator Maps</TITLE>
|
||||
GtkAccelMap
|
||||
GtkAccelMapForeach
|
||||
gtk_accel_map_add_entry
|
||||
gtk_accel_map_lookup_entry
|
||||
gtk_accel_map_change_entry
|
||||
gtk_accel_map_load
|
||||
gtk_accel_map_save
|
||||
gtk_accel_map_foreach
|
||||
gtk_accel_map_load_fd
|
||||
gtk_accel_map_save_fd
|
||||
gtk_accel_map_load_scanner
|
||||
gtk_accel_map_add_filter
|
||||
gtk_accel_map_foreach_unfiltered
|
||||
gtk_accel_map_get
|
||||
gtk_accel_map_lock_path
|
||||
gtk_accel_map_unlock_path
|
||||
<SUBSECTION Standard>
|
||||
GTK_ACCEL_MAP
|
||||
GTK_TYPE_ACCEL_MAP
|
||||
GTK_IS_ACCEL_MAP
|
||||
GTK_ACCEL_MAP_CLASS
|
||||
GTK_IS_ACCEL_MAP_CLASS
|
||||
GTK_ACCEL_MAP_GET_CLASS
|
||||
GtkAccelMapClass
|
||||
<SUBSECTION Private>
|
||||
gtk_accel_map_get_type
|
||||
</SECTION>
|
||||
|
||||
<SECTION>
|
||||
@@ -135,9 +69,6 @@ gtk_accel_map_get_type
|
||||
<TITLE>GtkAccelLabel</TITLE>
|
||||
GtkAccelLabel
|
||||
gtk_accel_label_new
|
||||
gtk_accel_label_set_accel_closure
|
||||
gtk_accel_label_get_accel_widget
|
||||
gtk_accel_label_set_accel_widget
|
||||
gtk_accel_label_get_accel_width
|
||||
gtk_accel_label_set_accel
|
||||
gtk_accel_label_get_accel
|
||||
@@ -1790,10 +1721,6 @@ gtk_menu_reorder_child
|
||||
gtk_menu_popup_at_rect
|
||||
gtk_menu_popup_at_widget
|
||||
gtk_menu_popup_at_pointer
|
||||
gtk_menu_set_accel_group
|
||||
gtk_menu_get_accel_group
|
||||
gtk_menu_set_accel_path
|
||||
gtk_menu_get_accel_path
|
||||
gtk_menu_set_monitor
|
||||
gtk_menu_get_monitor
|
||||
gtk_menu_place_on_monitor
|
||||
@@ -1891,8 +1818,6 @@ gtk_menu_item_get_use_underline
|
||||
gtk_menu_item_set_use_underline
|
||||
gtk_menu_item_set_submenu
|
||||
gtk_menu_item_get_submenu
|
||||
gtk_menu_item_set_accel_path
|
||||
gtk_menu_item_get_accel_path
|
||||
gtk_menu_item_select
|
||||
gtk_menu_item_deselect
|
||||
gtk_menu_item_activate
|
||||
@@ -4441,10 +4366,10 @@ gtk_widget_add_tick_callback
|
||||
gtk_widget_remove_tick_callback
|
||||
gtk_widget_size_allocate
|
||||
gtk_widget_allocate
|
||||
gtk_widget_add_accelerator
|
||||
gtk_widget_remove_accelerator
|
||||
gtk_widget_set_accel_path
|
||||
gtk_widget_list_accel_closures
|
||||
gtk_widget_class_add_shortcut
|
||||
gtk_widget_class_add_binding
|
||||
gtk_widget_class_add_binding_signal
|
||||
gtk_widget_class_bind_action
|
||||
gtk_widget_can_activate_accel
|
||||
gtk_widget_event
|
||||
gtk_widget_activate
|
||||
@@ -4661,8 +4586,6 @@ gtk_window_new
|
||||
gtk_window_set_title
|
||||
gtk_window_set_resizable
|
||||
gtk_window_get_resizable
|
||||
gtk_window_add_accel_group
|
||||
gtk_window_remove_accel_group
|
||||
gtk_window_set_modal
|
||||
gtk_window_set_default_size
|
||||
gtk_window_set_hide_on_close
|
||||
@@ -4675,11 +4598,6 @@ gtk_window_is_active
|
||||
gtk_window_is_maximized
|
||||
gtk_window_get_toplevels
|
||||
gtk_window_list_toplevels
|
||||
gtk_window_add_mnemonic
|
||||
gtk_window_remove_mnemonic
|
||||
gtk_window_mnemonic_activate
|
||||
gtk_window_activate_key
|
||||
gtk_window_propagate_key_event
|
||||
gtk_window_get_focus
|
||||
gtk_window_set_focus
|
||||
gtk_window_get_default_widget
|
||||
@@ -4702,7 +4620,6 @@ gtk_window_begin_resize_drag
|
||||
gtk_window_begin_move_drag
|
||||
gtk_window_set_decorated
|
||||
gtk_window_set_deletable
|
||||
gtk_window_set_mnemonic_modifier
|
||||
gtk_window_set_type_hint
|
||||
gtk_window_set_accept_focus
|
||||
gtk_window_set_focus_on_map
|
||||
@@ -4713,7 +4630,6 @@ gtk_window_get_default_icon_name
|
||||
gtk_window_get_default_size
|
||||
gtk_window_get_destroy_with_parent
|
||||
gtk_window_get_icon_name
|
||||
gtk_window_get_mnemonic_modifier
|
||||
gtk_window_get_modal
|
||||
gtk_window_get_size
|
||||
gtk_window_get_title
|
||||
@@ -5195,25 +5111,6 @@ gtk_drag_source_add_image_targets
|
||||
gtk_drag_source_add_uri_targets
|
||||
</SECTION>
|
||||
|
||||
<SECTION>
|
||||
<FILE>gtkbindings</FILE>
|
||||
<TITLE>Bindings</TITLE>
|
||||
GtkBindingSet
|
||||
GtkBindingEntry
|
||||
GtkBindingSignal
|
||||
GtkBindingArg
|
||||
gtk_binding_set_new
|
||||
gtk_binding_set_by_class
|
||||
gtk_binding_set_find
|
||||
gtk_bindings_activate
|
||||
gtk_bindings_activate_event
|
||||
gtk_binding_set_activate
|
||||
gtk_binding_entry_add_signal
|
||||
gtk_binding_entry_add_signal_from_string
|
||||
gtk_binding_entry_skip
|
||||
gtk_binding_entry_remove
|
||||
</SECTION>
|
||||
|
||||
<SECTION>
|
||||
<FILE>gtkenums</FILE>
|
||||
<TITLE>Standard Enumerations</TITLE>
|
||||
@@ -6690,6 +6587,137 @@ GTK_EVENT_CONTROLLER_MOTION_GET_CLASS
|
||||
gtk_event_controller_motion_get_type
|
||||
</SECTION>
|
||||
|
||||
<SECTION>
|
||||
<FILE>gtkshortcuttrigger</FILE>
|
||||
<TITLE>GtkShortcutTrigger</TITLE>
|
||||
GtkShortcutTrigger
|
||||
gtk_shortcut_trigger_ref
|
||||
gtk_shortcut_trigger_unref
|
||||
GtkShortcutTriggerType
|
||||
gtk_shortcut_trigger_get_trigger_type
|
||||
gtk_shortcut_trigger_parse_string
|
||||
gtk_shortcut_trigger_trigger
|
||||
gtk_shortcut_trigger_hash
|
||||
gtk_shortcut_trigger_equal
|
||||
gtk_shortcut_trigger_compare
|
||||
gtk_shortcut_trigger_to_string
|
||||
gtk_shortcut_trigger_print
|
||||
gtk_shortcut_trigger_to_label
|
||||
gtk_shortcut_trigger_print_label
|
||||
|
||||
<SUBSECTION>
|
||||
gtk_keyval_trigger_new
|
||||
gtk_keyval_trigger_get_modifiers
|
||||
gtk_keyval_trigger_get_keyval
|
||||
|
||||
<SUBSECTION>
|
||||
gtk_mnemonic_trigger_new
|
||||
gtk_mnemonic_trigger_get_keyval
|
||||
|
||||
<SUBSECTION Private>
|
||||
gtk_shortcut_trigger_get_type
|
||||
</SECTION>
|
||||
|
||||
<SECTION>
|
||||
<FILE>gtkshortcutaction</FILE>
|
||||
<TITLE>GtkShortcutAction</TITLE>
|
||||
GtkShortcutAction
|
||||
gtk_shortcut_action_ref
|
||||
gtk_shortcut_action_unref
|
||||
GtkShortcutActionType
|
||||
gtk_shortcut_action_get_action_type
|
||||
gtk_shortcut_action_to_string
|
||||
gtk_shortcut_action_print
|
||||
gtk_shortcut_action_activate
|
||||
|
||||
<SUBSECTION>
|
||||
gtk_nothing_action_new
|
||||
|
||||
<SUBSECTION>
|
||||
gtk_callback_action_new
|
||||
|
||||
<SUBSECTION>
|
||||
gtk_mnemonic_action_new
|
||||
|
||||
<SUBSECTION>
|
||||
gtk_activate_action_new
|
||||
|
||||
<SUBSECTION>
|
||||
gtk_signal_action_new
|
||||
gtk_signal_action_get_signal_name
|
||||
|
||||
<SUBSECTION>
|
||||
gtk_action_action_new
|
||||
gtk_action_action_get_name
|
||||
|
||||
<SUBSECTION>
|
||||
gtk_gaction_action_new
|
||||
gtk_gaction_action_get_gaction
|
||||
|
||||
<SUBSECTION Private>
|
||||
gtk_shortcut_action_get_type
|
||||
</SECTION>
|
||||
|
||||
<SECTION>
|
||||
<FILE>gtkshortcut</FILE>
|
||||
<TITLE>GtkShortcut</TITLE>
|
||||
GtkShortcut
|
||||
gtk_shortcut_new
|
||||
gtk_shortcut_new_with_arguments
|
||||
gtk_shortcut_get_trigger
|
||||
gtk_shortcut_set_trigger
|
||||
gtk_shortcut_get_action
|
||||
gtk_shortcut_set_action
|
||||
gtk_shortcut_get_arguments
|
||||
gtk_shortcut_set_arguments
|
||||
|
||||
<SUBSECTION Standard>
|
||||
GTK_TYPE_SHORTCUT
|
||||
GTK_SHORTCUT
|
||||
GTK_SHORTCUT_CLASS
|
||||
GTK_IS_SHORTCUT
|
||||
GTK_IS_SHORTCUT_CLASS
|
||||
GTK_SHORTCUT_GET_CLASS
|
||||
|
||||
<SUBSECTION Private>
|
||||
gtk_shortcut_get_type
|
||||
</SECTION>
|
||||
|
||||
<SECTION>
|
||||
<FILE>gtkshortcutcontroller</FILE>
|
||||
<TITLE>GtkShortcutController</TITLE>
|
||||
GtkShortcutController
|
||||
gtk_shortcut_controller_new
|
||||
gtk_shortcut_controller_new_with_model
|
||||
GtkShortcutScope
|
||||
GtkShortcutManager
|
||||
GtkShortcutManagerInterface
|
||||
gtk_shortcut_controller_set_mnemonics_modifiers
|
||||
gtk_shortcut_controller_get_mnemonics_modifiers
|
||||
gtk_shortcut_controller_set_scope
|
||||
gtk_shortcut_controller_get_scope
|
||||
gtk_shortcut_controller_add_shortcut
|
||||
gtk_shortcut_controller_remove_shortcut
|
||||
|
||||
<SUBSECTION Standard>
|
||||
GTK_TYPE_SHORTCUT_CONTROLLER
|
||||
GTK_SHORTCUT_CONTROLLER
|
||||
GTK_SHORTCUT_CONTROLLER_CLASS
|
||||
GTK_IS_SHORTCUT_CONTROLLER
|
||||
GTK_IS_SHORTCUT_CONTROLLER_CLASS
|
||||
GTK_SHORTCUT_CONTROLLER_GET_CLASS
|
||||
GTK_TYPE_SHORTCUT_MANAGER
|
||||
GTK_SHORTCUT_MANAGER
|
||||
GTK_SHORTCUT_MANAGER_CLASS
|
||||
GTK_IS_SHORTCUT_MANAGER
|
||||
GTK_IS_SHORTCUT_MANAGER_CLASS
|
||||
GTK_SHORTCUT_MANAGER_GET_CLASS
|
||||
|
||||
<SUBSECTION Private>
|
||||
gtk_shortcut_controller_get_type
|
||||
gtk_shortcut_manager_get_type
|
||||
</SECTION>
|
||||
|
||||
<SECTION>
|
||||
<FILE>gtkeventcontrollerkey</FILE>
|
||||
<TITLE>GtkEventControllerKey</TITLE>
|
||||
|
||||
@@ -2,9 +2,7 @@
|
||||
#include <gtk/gtkunixprint.h>
|
||||
|
||||
gtk_about_dialog_get_type
|
||||
gtk_accel_group_get_type
|
||||
gtk_accel_label_get_type
|
||||
gtk_accel_map_get_type
|
||||
gtk_accessible_get_type
|
||||
gtk_actionable_get_type
|
||||
gtk_action_bar_get_type
|
||||
@@ -160,7 +158,12 @@ gtk_separator_get_type
|
||||
gtk_separator_menu_item_get_type
|
||||
gtk_separator_tool_item_get_type
|
||||
gtk_settings_get_type
|
||||
gtk_shortcut_action_get_type
|
||||
gtk_shortcut_controller_get_type
|
||||
gtk_shortcut_get_type
|
||||
gtk_shortcut_label_get_type
|
||||
gtk_shortcut_manager_get_type
|
||||
gtk_shortcut_trigger_get_type
|
||||
gtk_shortcuts_window_get_type
|
||||
gtk_shortcuts_section_get_type
|
||||
gtk_shortcuts_group_get_type
|
||||
|
||||
+2
-12
@@ -280,27 +280,17 @@ static WidgetInfo *
|
||||
create_accel_label (void)
|
||||
{
|
||||
WidgetInfo *info;
|
||||
GtkWidget *widget, *button, *box;
|
||||
GtkAccelGroup *accel_group;
|
||||
GtkWidget *widget, *box;
|
||||
|
||||
widget = gtk_accel_label_new ("Accel Label");
|
||||
|
||||
button = gtk_button_new_with_label ("Quit");
|
||||
gtk_accel_label_set_accel_widget (GTK_ACCEL_LABEL (widget), button);
|
||||
gtk_widget_hide (button);
|
||||
|
||||
box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
|
||||
gtk_container_add (GTK_CONTAINER (box), widget);
|
||||
gtk_container_add (GTK_CONTAINER (box), button);
|
||||
|
||||
gtk_accel_label_set_accel_widget (GTK_ACCEL_LABEL (widget), button);
|
||||
accel_group = gtk_accel_group_new();
|
||||
gtk_accel_label_set_accel (GTK_ACCEL_LABEL (widget), GDK_KEY_Q, GDK_CONTROL_MASK);
|
||||
|
||||
info = new_widget_info ("accel-label", box, SMALL);
|
||||
|
||||
gtk_widget_add_accelerator (button, "activate", accel_group, GDK_KEY_Q, GDK_CONTROL_MASK,
|
||||
GTK_ACCEL_VISIBLE | GTK_ACCEL_LOCKED);
|
||||
|
||||
return info;
|
||||
}
|
||||
|
||||
|
||||
@@ -91,7 +91,6 @@ const GDK_BUTTON5_MASK = 1 << 12;
|
||||
const GDK_SUPER_MASK = 1 << 26;
|
||||
const GDK_HYPER_MASK = 1 << 27;
|
||||
const GDK_META_MASK = 1 << 28;
|
||||
const GDK_RELEASE_MASK = 1 << 30;
|
||||
|
||||
|
||||
var useDataUrls = window.location.search.includes("datauri");
|
||||
|
||||
+1
-1
@@ -738,7 +738,7 @@ gdk_keymap_get_modifier_mask (GdkKeymap *keymap,
|
||||
* of the key, or %NULL if @keyval is not a valid key. The string
|
||||
* should not be modified.
|
||||
*/
|
||||
gchar *
|
||||
const gchar *
|
||||
gdk_keyval_name (guint keyval)
|
||||
{
|
||||
return _gdk_keyval_name (keyval);
|
||||
|
||||
+1
-1
@@ -133,7 +133,7 @@ GdkModifierType gdk_keymap_get_modifier_mask (GdkKeymap *keymap,
|
||||
/* Key values
|
||||
*/
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
gchar* gdk_keyval_name (guint keyval) G_GNUC_CONST;
|
||||
const gchar*gdk_keyval_name (guint keyval) G_GNUC_CONST;
|
||||
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
guint gdk_keyval_from_name (const gchar *keyval_name);
|
||||
|
||||
+4
-6
@@ -200,8 +200,7 @@ typedef enum
|
||||
* @GDK_HYPER_MASK: the Hyper modifier
|
||||
* @GDK_META_MASK: the Meta modifier
|
||||
* @GDK_MODIFIER_RESERVED_29_MASK: A reserved bit flag; do not use in your own code
|
||||
* @GDK_RELEASE_MASK: not used in GDK itself. GTK uses it to differentiate
|
||||
* between (keyval, modifiers) pairs from key press and release events.
|
||||
* @GDK_MODIFIER_RESERVED_30_MASK: A reserved bit flag; do not use in your own code
|
||||
* @GDK_MODIFIER_MASK: a mask covering all modifier types.
|
||||
*
|
||||
* A set of bit-flags to indicate the state of modifier keys and mouse buttons
|
||||
@@ -262,12 +261,11 @@ typedef enum
|
||||
GDK_META_MASK = 1 << 28,
|
||||
|
||||
GDK_MODIFIER_RESERVED_29_MASK = 1 << 29,
|
||||
|
||||
GDK_RELEASE_MASK = 1 << 30,
|
||||
GDK_MODIFIER_RESERVED_30_MASK = 1 << 30,
|
||||
|
||||
/* Combination of GDK_SHIFT_MASK..GDK_BUTTON5_MASK + GDK_SUPER_MASK
|
||||
+ GDK_HYPER_MASK + GDK_META_MASK + GDK_RELEASE_MASK */
|
||||
GDK_MODIFIER_MASK = 0x5c001fff
|
||||
+ GDK_HYPER_MASK + GDK_META_MASK */
|
||||
GDK_MODIFIER_MASK = 0x1c001fff
|
||||
} GdkModifierType;
|
||||
|
||||
/**
|
||||
|
||||
@@ -131,7 +131,7 @@ atk_key_event_from_gdk_event_key (GdkEventKey *key,
|
||||
|
||||
event->state = state;
|
||||
event->keyval = keyval;
|
||||
event->string = gdk_keyval_name (keyval);
|
||||
event->string = (char *) gdk_keyval_name (keyval);
|
||||
event->length = strlen (event->string);
|
||||
event->keycode = keycode;
|
||||
event->timestamp = gdk_event_get_time ((GdkEvent *)key);
|
||||
|
||||
@@ -446,25 +446,6 @@ gtk_menu_item_accessible_action_get_description (AtkAction *action,
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
find_accel_by_widget (GtkAccelKey *key,
|
||||
GClosure *closure,
|
||||
gpointer data)
|
||||
{
|
||||
/* We assume that closure->data points to the widget
|
||||
* pending gtk_widget_get_accel_closures being made public
|
||||
*/
|
||||
return data == (gpointer) closure->data;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
find_accel_by_closure (GtkAccelKey *key,
|
||||
GClosure *closure,
|
||||
gpointer data)
|
||||
{
|
||||
return data == (gpointer) closure;
|
||||
}
|
||||
|
||||
static GtkWidget *
|
||||
find_item_label (GtkWidget *item)
|
||||
{
|
||||
@@ -520,7 +501,6 @@ gtk_menu_item_accessible_get_keybinding (AtkAction *action,
|
||||
temp_item = item;
|
||||
while (TRUE)
|
||||
{
|
||||
GdkModifierType mnemonic_modifier = 0;
|
||||
guint key_val;
|
||||
gchar *key, *temp_keybinding;
|
||||
|
||||
@@ -532,22 +512,13 @@ gtk_menu_item_accessible_get_keybinding (AtkAction *action,
|
||||
/* parent can be NULL when activating a window from the panel */
|
||||
return NULL;
|
||||
|
||||
if (GTK_IS_MENU_BAR (parent))
|
||||
{
|
||||
GtkRoot *root;
|
||||
|
||||
root = gtk_widget_get_root (parent);
|
||||
if (root && GTK_IS_WINDOW (root))
|
||||
mnemonic_modifier = gtk_window_get_mnemonic_modifier (GTK_WINDOW (root));
|
||||
}
|
||||
|
||||
child = find_item_label (temp_item);
|
||||
if (GTK_IS_LABEL (child))
|
||||
{
|
||||
key_val = gtk_label_get_mnemonic_keyval (GTK_LABEL (child));
|
||||
if (key_val != GDK_KEY_VoidSymbol)
|
||||
{
|
||||
key = gtk_accelerator_name (key_val, mnemonic_modifier);
|
||||
key = gtk_accelerator_name (key_val, GDK_MOD1_MASK);
|
||||
if (full_keybinding)
|
||||
temp_keybinding = g_strconcat (key, ":", full_keybinding, NULL);
|
||||
else
|
||||
@@ -603,30 +574,19 @@ gtk_menu_item_accessible_get_keybinding (AtkAction *action,
|
||||
|
||||
if (!accelerator)
|
||||
{
|
||||
GtkAccelGroup *group;
|
||||
GtkAccelKey *key = NULL;
|
||||
guint key = 0;
|
||||
GdkModifierType modifiers = 0;
|
||||
|
||||
group = gtk_menu_get_accel_group (GTK_MENU (parent));
|
||||
if (group)
|
||||
key = gtk_accel_group_find (group, find_accel_by_widget, item);
|
||||
else if (GTK_IS_ACCEL_LABEL (child))
|
||||
if (GTK_IS_ACCEL_LABEL (child))
|
||||
{
|
||||
GtkAccelLabel *accel_label;
|
||||
GClosure *accel_closure;
|
||||
|
||||
accel_label = GTK_ACCEL_LABEL (child);
|
||||
g_object_get (accel_label, "accel-closure", &accel_closure, NULL);
|
||||
if (accel_closure)
|
||||
{
|
||||
key = gtk_accel_group_find (gtk_accel_group_from_accel_closure (accel_closure),
|
||||
find_accel_by_closure,
|
||||
accel_closure);
|
||||
g_closure_unref (accel_closure);
|
||||
}
|
||||
gtk_accel_label_get_accel (accel_label, &key, &modifiers);
|
||||
}
|
||||
|
||||
if (key)
|
||||
accelerator = gtk_accelerator_name (key->accel_key, key->accel_mods);
|
||||
accelerator = gtk_accelerator_name (key, modifiers);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -34,7 +34,6 @@
|
||||
#include <gtk/gtkaboutdialog.h>
|
||||
#include <gtk/gtkaccelgroup.h>
|
||||
#include <gtk/gtkaccellabel.h>
|
||||
#include <gtk/gtkaccelmap.h>
|
||||
#include <gtk/gtkaccessible.h>
|
||||
#include <gtk/gtkactionable.h>
|
||||
#include <gtk/gtkactionbar.h>
|
||||
@@ -49,7 +48,6 @@
|
||||
#include <gtk/gtkassistant.h>
|
||||
#include <gtk/gtkbin.h>
|
||||
#include <gtk/gtkbinlayout.h>
|
||||
#include <gtk/gtkbindings.h>
|
||||
#include <gtk/gtkborder.h>
|
||||
#include <gtk/gtkboxlayout.h>
|
||||
#include <gtk/gtkbox.h>
|
||||
@@ -201,11 +199,16 @@
|
||||
#include <gtk/gtkseparatormenuitem.h>
|
||||
#include <gtk/gtkseparatortoolitem.h>
|
||||
#include <gtk/gtksettings.h>
|
||||
#include <gtk/gtkshortcut.h>
|
||||
#include <gtk/gtkshortcutaction.h>
|
||||
#include <gtk/gtkshortcutcontroller.h>
|
||||
#include <gtk/gtkshortcutlabel.h>
|
||||
#include <gtk/gtkshortcutmanager.h>
|
||||
#include <gtk/gtkshortcutsgroup.h>
|
||||
#include <gtk/gtkshortcutssection.h>
|
||||
#include <gtk/gtkshortcutsshortcut.h>
|
||||
#include <gtk/gtkshortcutswindow.h>
|
||||
#include <gtk/gtkshortcuttrigger.h>
|
||||
#include <gtk/gtkshow.h>
|
||||
#include <gtk/gtksingleselection.h>
|
||||
#include <gtk/gtkslicelistmodel.h>
|
||||
|
||||
+332
-925
File diff suppressed because it is too large
Load Diff
+3
-173
@@ -36,172 +36,17 @@
|
||||
G_BEGIN_DECLS
|
||||
|
||||
|
||||
/* --- type macros --- */
|
||||
#define GTK_TYPE_ACCEL_GROUP (gtk_accel_group_get_type ())
|
||||
#define GTK_ACCEL_GROUP(object) (G_TYPE_CHECK_INSTANCE_CAST ((object), GTK_TYPE_ACCEL_GROUP, GtkAccelGroup))
|
||||
#define GTK_ACCEL_GROUP_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GTK_TYPE_ACCEL_GROUP, GtkAccelGroupClass))
|
||||
#define GTK_IS_ACCEL_GROUP(object) (G_TYPE_CHECK_INSTANCE_TYPE ((object), GTK_TYPE_ACCEL_GROUP))
|
||||
#define GTK_IS_ACCEL_GROUP_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GTK_TYPE_ACCEL_GROUP))
|
||||
#define GTK_ACCEL_GROUP_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GTK_TYPE_ACCEL_GROUP, GtkAccelGroupClass))
|
||||
|
||||
|
||||
/* --- accel flags --- */
|
||||
/**
|
||||
* GtkAccelFlags:
|
||||
* @GTK_ACCEL_VISIBLE: Accelerator is visible
|
||||
* @GTK_ACCEL_LOCKED: Accelerator not removable
|
||||
* @GTK_ACCEL_MASK: Mask
|
||||
*
|
||||
* Accelerator flags used with gtk_accel_group_connect().
|
||||
*/
|
||||
typedef enum
|
||||
{
|
||||
GTK_ACCEL_VISIBLE = 1 << 0,
|
||||
GTK_ACCEL_LOCKED = 1 << 1,
|
||||
GTK_ACCEL_MASK = 0x07
|
||||
} GtkAccelFlags;
|
||||
|
||||
|
||||
/* --- typedefs & structures --- */
|
||||
typedef struct _GtkAccelGroup GtkAccelGroup;
|
||||
typedef struct _GtkAccelGroupClass GtkAccelGroupClass;
|
||||
typedef struct _GtkAccelGroupPrivate GtkAccelGroupPrivate;
|
||||
typedef struct _GtkAccelKey GtkAccelKey;
|
||||
typedef struct _GtkAccelGroupEntry GtkAccelGroupEntry;
|
||||
typedef gboolean (*GtkAccelGroupActivate) (GtkAccelGroup *accel_group,
|
||||
GObject *acceleratable,
|
||||
guint keyval,
|
||||
GdkModifierType modifier);
|
||||
|
||||
/**
|
||||
* GtkAccelGroupFindFunc:
|
||||
* @key:
|
||||
* @closure:
|
||||
* @data: (closure):
|
||||
*/
|
||||
typedef gboolean (*GtkAccelGroupFindFunc) (GtkAccelKey *key,
|
||||
GClosure *closure,
|
||||
gpointer data);
|
||||
|
||||
/**
|
||||
* GtkAccelGroup:
|
||||
*
|
||||
* An object representing and maintaining a group of accelerators.
|
||||
*/
|
||||
struct _GtkAccelGroup
|
||||
{
|
||||
GObject parent;
|
||||
GtkAccelGroupPrivate *priv;
|
||||
};
|
||||
|
||||
/**
|
||||
* GtkAccelGroupClass:
|
||||
* @parent_class: The parent class.
|
||||
* @accel_changed: Signal emitted when an entry is added to or removed
|
||||
* from the accel group.
|
||||
*/
|
||||
struct _GtkAccelGroupClass
|
||||
{
|
||||
GObjectClass parent_class;
|
||||
|
||||
/*< public >*/
|
||||
|
||||
void (*accel_changed) (GtkAccelGroup *accel_group,
|
||||
guint keyval,
|
||||
GdkModifierType modifier,
|
||||
GClosure *accel_closure);
|
||||
|
||||
/*< private >*/
|
||||
|
||||
/* Padding for future expansion */
|
||||
void (*_gtk_reserved1) (void);
|
||||
void (*_gtk_reserved2) (void);
|
||||
void (*_gtk_reserved3) (void);
|
||||
void (*_gtk_reserved4) (void);
|
||||
};
|
||||
|
||||
/**
|
||||
* GtkAccelKey:
|
||||
* @accel_key: The accelerator keyval
|
||||
* @accel_mods:The accelerator modifiers
|
||||
* @accel_flags: The accelerator flags
|
||||
*/
|
||||
struct _GtkAccelKey
|
||||
{
|
||||
guint accel_key;
|
||||
GdkModifierType accel_mods;
|
||||
guint accel_flags : 16;
|
||||
};
|
||||
|
||||
|
||||
/* -- Accelerator Groups --- */
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
GType gtk_accel_group_get_type (void) G_GNUC_CONST;
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
GtkAccelGroup* gtk_accel_group_new (void);
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
gboolean gtk_accel_group_get_is_locked (GtkAccelGroup *accel_group);
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
GdkModifierType
|
||||
gtk_accel_group_get_modifier_mask (GtkAccelGroup *accel_group);
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
void gtk_accel_group_lock (GtkAccelGroup *accel_group);
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
void gtk_accel_group_unlock (GtkAccelGroup *accel_group);
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
void gtk_accel_group_connect (GtkAccelGroup *accel_group,
|
||||
guint accel_key,
|
||||
GdkModifierType accel_mods,
|
||||
GtkAccelFlags accel_flags,
|
||||
GClosure *closure);
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
void gtk_accel_group_connect_by_path (GtkAccelGroup *accel_group,
|
||||
const gchar *accel_path,
|
||||
GClosure *closure);
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
gboolean gtk_accel_group_disconnect (GtkAccelGroup *accel_group,
|
||||
GClosure *closure);
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
gboolean gtk_accel_group_disconnect_key (GtkAccelGroup *accel_group,
|
||||
guint accel_key,
|
||||
GdkModifierType accel_mods);
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
gboolean gtk_accel_group_activate (GtkAccelGroup *accel_group,
|
||||
GQuark accel_quark,
|
||||
GObject *acceleratable,
|
||||
guint accel_key,
|
||||
GdkModifierType accel_mods);
|
||||
|
||||
|
||||
/* --- GtkActivatable glue --- */
|
||||
void _gtk_accel_group_attach (GtkAccelGroup *accel_group,
|
||||
GObject *object);
|
||||
void _gtk_accel_group_detach (GtkAccelGroup *accel_group,
|
||||
GObject *object);
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
gboolean gtk_accel_groups_activate (GObject *object,
|
||||
guint accel_key,
|
||||
GdkModifierType accel_mods);
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
GSList* gtk_accel_groups_from_object (GObject *object);
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
GtkAccelKey* gtk_accel_group_find (GtkAccelGroup *accel_group,
|
||||
GtkAccelGroupFindFunc find_func,
|
||||
gpointer data);
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
GtkAccelGroup* gtk_accel_group_from_accel_closure (GClosure *closure);
|
||||
|
||||
|
||||
/* --- Accelerators--- */
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
gboolean gtk_accelerator_valid (guint keyval,
|
||||
GdkModifierType modifiers) G_GNUC_CONST;
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
void gtk_accelerator_parse (const gchar *accelerator,
|
||||
gboolean gtk_accelerator_parse (const gchar *accelerator,
|
||||
guint *accelerator_key,
|
||||
GdkModifierType *accelerator_mods);
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
void gtk_accelerator_parse_with_keycode (const gchar *accelerator,
|
||||
gboolean gtk_accelerator_parse_with_keycode (const gchar *accelerator,
|
||||
GdkDisplay *display,
|
||||
guint *accelerator_key,
|
||||
guint **accelerator_codes,
|
||||
GdkModifierType *accelerator_mods);
|
||||
@@ -227,21 +72,6 @@ GDK_AVAILABLE_IN_ALL
|
||||
GdkModifierType
|
||||
gtk_accelerator_get_default_mod_mask (void);
|
||||
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
GtkAccelGroupEntry* gtk_accel_group_query (GtkAccelGroup *accel_group,
|
||||
guint accel_key,
|
||||
GdkModifierType accel_mods,
|
||||
guint *n_entries);
|
||||
|
||||
struct _GtkAccelGroupEntry
|
||||
{
|
||||
GtkAccelKey key;
|
||||
GClosure *closure;
|
||||
GQuark accel_path_quark;
|
||||
};
|
||||
|
||||
G_DEFINE_AUTOPTR_CLEANUP_FUNC(GtkAccelGroup, g_object_unref)
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
#endif /* __GTK_ACCEL_GROUP_H__ */
|
||||
|
||||
@@ -25,19 +25,9 @@
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
struct _GtkAccelGroupPrivate
|
||||
{
|
||||
guint lock_count;
|
||||
GdkModifierType modifier_mask;
|
||||
GSList *acceleratables;
|
||||
guint n_accels;
|
||||
GtkAccelGroupEntry *priv_accels;
|
||||
};
|
||||
|
||||
void _gtk_accel_group_reconnect (GtkAccelGroup *accel_group,
|
||||
GQuark accel_path_quark);
|
||||
GSList* _gtk_accel_group_get_accelerables (GtkAccelGroup *accel_group);
|
||||
|
||||
void gtk_accelerator_print_label (GString *gstring,
|
||||
guint accelerator_key,
|
||||
GdkModifierType accelerator_mods);
|
||||
G_END_DECLS
|
||||
|
||||
#endif /* __GTK_ACCEL_GROUP_PRIVATE_H__ */
|
||||
|
||||
+2
-570
@@ -31,7 +31,6 @@
|
||||
#include "gtklabel.h"
|
||||
#include "gtkaccellabel.h"
|
||||
#include "gtkaccellabelprivate.h"
|
||||
#include "gtkaccelmap.h"
|
||||
#include "gtkintl.h"
|
||||
#include "gtkmain.h"
|
||||
#include "gtkprivate.h"
|
||||
@@ -79,23 +78,10 @@
|
||||
* GtkWidget *window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
|
||||
* GtkWidget *menu = gtk_menu_new ();
|
||||
* GtkWidget *save_item;
|
||||
* GtkAccelGroup *accel_group;
|
||||
*
|
||||
* // Create a GtkAccelGroup and add it to the window.
|
||||
* accel_group = gtk_accel_group_new ();
|
||||
* gtk_window_add_accel_group (GTK_WINDOW (window), accel_group);
|
||||
*
|
||||
* // Create the menu item using the convenience function.
|
||||
* save_item = gtk_menu_item_new_with_label ("Save");
|
||||
* gtk_container_add (GTK_CONTAINER (menu), save_item);
|
||||
*
|
||||
* // Now add the accelerator to the GtkMenuItem. Note that since we
|
||||
* // called gtk_menu_item_new_with_label() to create the GtkMenuItem
|
||||
* // the GtkAccelLabel is automatically set up to display the
|
||||
* // GtkMenuItem accelerators. We just need to make sure we use
|
||||
* // GTK_ACCEL_VISIBLE here.
|
||||
* gtk_widget_add_accelerator (save_item, "activate", accel_group,
|
||||
* GDK_KEY_s, GDK_CONTROL_MASK, GTK_ACCEL_VISIBLE);
|
||||
* ]|
|
||||
*
|
||||
* # CSS nodes
|
||||
@@ -112,8 +98,6 @@
|
||||
|
||||
enum {
|
||||
PROP_0,
|
||||
PROP_ACCEL_CLOSURE,
|
||||
PROP_ACCEL_WIDGET,
|
||||
PROP_LABEL,
|
||||
PROP_USE_UNDERLINE,
|
||||
LAST_PROP
|
||||
@@ -140,10 +124,6 @@ struct _GtkAccelLabelPrivate
|
||||
GtkWidget *text_label;
|
||||
GtkWidget *accel_label;
|
||||
|
||||
GtkWidget *accel_widget; /* done */
|
||||
GClosure *accel_closure; /* has set function */
|
||||
GtkAccelGroup *accel_group; /* set by set_accel_closure() */
|
||||
|
||||
guint accel_key; /* manual accel key specification if != 0 */
|
||||
GdkModifierType accel_mods;
|
||||
};
|
||||
@@ -158,7 +138,6 @@ static void gtk_accel_label_get_property (GObject *object,
|
||||
guint prop_id,
|
||||
GValue *value,
|
||||
GParamSpec *pspec);
|
||||
static void gtk_accel_label_destroy (GtkWidget *widget);
|
||||
static void gtk_accel_label_finalize (GObject *object);
|
||||
|
||||
G_DEFINE_TYPE_WITH_PRIVATE (GtkAccelLabel, gtk_accel_label, GTK_TYPE_WIDGET)
|
||||
@@ -173,56 +152,8 @@ gtk_accel_label_class_init (GtkAccelLabelClass *class)
|
||||
gobject_class->set_property = gtk_accel_label_set_property;
|
||||
gobject_class->get_property = gtk_accel_label_get_property;
|
||||
|
||||
widget_class->destroy = gtk_accel_label_destroy;
|
||||
|
||||
gtk_widget_class_set_accessible_role (widget_class, ATK_ROLE_ACCEL_LABEL);
|
||||
|
||||
#ifndef GDK_WINDOWING_QUARTZ
|
||||
/* This is the text that should appear next to menu accelerators
|
||||
* that use the shift key. If the text on this key isn't typically
|
||||
* translated on keyboards used for your language, don't translate
|
||||
* this.
|
||||
*/
|
||||
class->mod_name_shift = g_strdup (C_("keyboard label", "Shift"));
|
||||
/* This is the text that should appear next to menu accelerators
|
||||
* that use the control key. If the text on this key isn't typically
|
||||
* translated on keyboards used for your language, don't translate
|
||||
* this.
|
||||
*/
|
||||
class->mod_name_control = g_strdup (C_("keyboard label", "Ctrl"));
|
||||
/* This is the text that should appear next to menu accelerators
|
||||
* that use the alt key. If the text on this key isn't typically
|
||||
* translated on keyboards used for your language, don't translate
|
||||
* this.
|
||||
*/
|
||||
class->mod_name_alt = g_strdup (C_("keyboard label", "Alt"));
|
||||
class->mod_separator = g_strdup ("+");
|
||||
#else /* GDK_WINDOWING_QUARTZ */
|
||||
|
||||
/* U+21E7 UPWARDS WHITE ARROW */
|
||||
class->mod_name_shift = g_strdup ("\xe2\x87\xa7");
|
||||
/* U+2303 UP ARROWHEAD */
|
||||
class->mod_name_control = g_strdup ("\xe2\x8c\x83");
|
||||
/* U+2325 OPTION KEY */
|
||||
class->mod_name_alt = g_strdup ("\xe2\x8c\xa5");
|
||||
class->mod_separator = g_strdup ("");
|
||||
|
||||
#endif /* GDK_WINDOWING_QUARTZ */
|
||||
|
||||
props[PROP_ACCEL_CLOSURE] =
|
||||
g_param_spec_boxed ("accel-closure",
|
||||
P_("Accelerator Closure"),
|
||||
P_("The closure to be monitored for accelerator changes"),
|
||||
G_TYPE_CLOSURE,
|
||||
GTK_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY);
|
||||
|
||||
props[PROP_ACCEL_WIDGET] =
|
||||
g_param_spec_object ("accel-widget",
|
||||
P_("Accelerator Widget"),
|
||||
P_("The widget to be monitored for accelerator changes"),
|
||||
GTK_TYPE_WIDGET,
|
||||
GTK_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY);
|
||||
|
||||
props[PROP_LABEL] =
|
||||
g_param_spec_string ("label",
|
||||
P_("Label"),
|
||||
@@ -255,12 +186,6 @@ gtk_accel_label_set_property (GObject *object,
|
||||
|
||||
switch (prop_id)
|
||||
{
|
||||
case PROP_ACCEL_CLOSURE:
|
||||
gtk_accel_label_set_accel_closure (accel_label, g_value_get_boxed (value));
|
||||
break;
|
||||
case PROP_ACCEL_WIDGET:
|
||||
gtk_accel_label_set_accel_widget (accel_label, g_value_get_object (value));
|
||||
break;
|
||||
case PROP_LABEL:
|
||||
gtk_accel_label_set_label (accel_label, g_value_get_string (value));
|
||||
break;
|
||||
@@ -280,16 +205,9 @@ gtk_accel_label_get_property (GObject *object,
|
||||
GParamSpec *pspec)
|
||||
{
|
||||
GtkAccelLabel *accel_label = GTK_ACCEL_LABEL (object);
|
||||
GtkAccelLabelPrivate *priv = gtk_accel_label_get_instance_private (accel_label);
|
||||
|
||||
switch (prop_id)
|
||||
{
|
||||
case PROP_ACCEL_CLOSURE:
|
||||
g_value_set_boxed (value, priv->accel_closure);
|
||||
break;
|
||||
case PROP_ACCEL_WIDGET:
|
||||
g_value_set_object (value, priv->accel_widget);
|
||||
break;
|
||||
case PROP_LABEL:
|
||||
g_value_set_string (value, gtk_accel_label_get_label (accel_label));
|
||||
break;
|
||||
@@ -307,10 +225,6 @@ gtk_accel_label_init (GtkAccelLabel *accel_label)
|
||||
{
|
||||
GtkAccelLabelPrivate *priv = gtk_accel_label_get_instance_private (accel_label);
|
||||
|
||||
priv->accel_widget = NULL;
|
||||
priv->accel_closure = NULL;
|
||||
priv->accel_group = NULL;
|
||||
|
||||
priv->text_label = gtk_label_new ("");
|
||||
gtk_widget_set_hexpand (priv->text_label, TRUE);
|
||||
gtk_label_set_xalign (GTK_LABEL (priv->text_label), 0.0f);
|
||||
@@ -343,17 +257,6 @@ gtk_accel_label_new (const gchar *string)
|
||||
return GTK_WIDGET (accel_label);
|
||||
}
|
||||
|
||||
static void
|
||||
gtk_accel_label_destroy (GtkWidget *widget)
|
||||
{
|
||||
GtkAccelLabel *accel_label = GTK_ACCEL_LABEL (widget);
|
||||
|
||||
gtk_accel_label_set_accel_widget (accel_label, NULL);
|
||||
gtk_accel_label_set_accel_closure (accel_label, NULL);
|
||||
|
||||
GTK_WIDGET_CLASS (gtk_accel_label_parent_class)->destroy (widget);
|
||||
}
|
||||
|
||||
static void
|
||||
gtk_accel_label_finalize (GObject *object)
|
||||
{
|
||||
@@ -366,25 +269,6 @@ gtk_accel_label_finalize (GObject *object)
|
||||
G_OBJECT_CLASS (gtk_accel_label_parent_class)->finalize (object);
|
||||
}
|
||||
|
||||
/**
|
||||
* gtk_accel_label_get_accel_widget:
|
||||
* @accel_label: a #GtkAccelLabel
|
||||
*
|
||||
* Fetches the widget monitored by this accelerator label. See
|
||||
* gtk_accel_label_set_accel_widget().
|
||||
*
|
||||
* Returns: (nullable) (transfer none): the object monitored by the accelerator label, or %NULL.
|
||||
**/
|
||||
GtkWidget *
|
||||
gtk_accel_label_get_accel_widget (GtkAccelLabel *accel_label)
|
||||
{
|
||||
GtkAccelLabelPrivate *priv = gtk_accel_label_get_instance_private (accel_label);
|
||||
|
||||
g_return_val_if_fail (GTK_IS_ACCEL_LABEL (accel_label), NULL);
|
||||
|
||||
return priv->accel_widget;
|
||||
}
|
||||
|
||||
/**
|
||||
* gtk_accel_label_get_accel_width:
|
||||
* @accel_label: a #GtkAccelLabel.
|
||||
@@ -409,443 +293,12 @@ gtk_accel_label_get_accel_width (GtkAccelLabel *accel_label)
|
||||
return min;
|
||||
}
|
||||
|
||||
static void
|
||||
refetch_widget_accel_closure (GtkAccelLabel *accel_label)
|
||||
{
|
||||
GtkAccelLabelPrivate *priv = gtk_accel_label_get_instance_private (accel_label);
|
||||
GClosure *closure = NULL;
|
||||
GList *clist, *list;
|
||||
|
||||
g_return_if_fail (GTK_IS_ACCEL_LABEL (accel_label));
|
||||
g_return_if_fail (GTK_IS_WIDGET (priv->accel_widget));
|
||||
|
||||
clist = gtk_widget_list_accel_closures (priv->accel_widget);
|
||||
for (list = clist; list; list = list->next)
|
||||
{
|
||||
/* we just take the first closure used */
|
||||
closure = list->data;
|
||||
break;
|
||||
}
|
||||
|
||||
g_list_free (clist);
|
||||
gtk_accel_label_set_accel_closure (accel_label, closure);
|
||||
}
|
||||
|
||||
static void
|
||||
accel_widget_weak_ref_cb (GtkAccelLabel *accel_label,
|
||||
GtkWidget *old_accel_widget)
|
||||
{
|
||||
GtkAccelLabelPrivate *priv = gtk_accel_label_get_instance_private (accel_label);
|
||||
|
||||
g_return_if_fail (GTK_IS_ACCEL_LABEL (accel_label));
|
||||
g_return_if_fail (GTK_IS_WIDGET (priv->accel_widget));
|
||||
|
||||
g_signal_handlers_disconnect_by_func (priv->accel_widget,
|
||||
refetch_widget_accel_closure,
|
||||
accel_label);
|
||||
priv->accel_widget = NULL;
|
||||
g_object_notify_by_pspec (G_OBJECT (accel_label), props[PROP_ACCEL_WIDGET]);
|
||||
}
|
||||
|
||||
/**
|
||||
* gtk_accel_label_set_accel_widget:
|
||||
* @accel_label: a #GtkAccelLabel
|
||||
* @accel_widget: (nullable): the widget to be monitored, or %NULL
|
||||
*
|
||||
* Sets the widget to be monitored by this accelerator label. Passing %NULL for
|
||||
* @accel_widget will dissociate @accel_label from its current widget, if any.
|
||||
*/
|
||||
void
|
||||
gtk_accel_label_set_accel_widget (GtkAccelLabel *accel_label,
|
||||
GtkWidget *accel_widget)
|
||||
{
|
||||
GtkAccelLabelPrivate *priv = gtk_accel_label_get_instance_private (accel_label);
|
||||
|
||||
g_return_if_fail (GTK_IS_ACCEL_LABEL (accel_label));
|
||||
|
||||
if (accel_widget)
|
||||
g_return_if_fail (GTK_IS_WIDGET (accel_widget));
|
||||
|
||||
if (accel_widget != priv->accel_widget)
|
||||
{
|
||||
if (priv->accel_widget)
|
||||
{
|
||||
gtk_accel_label_set_accel_closure (accel_label, NULL);
|
||||
g_signal_handlers_disconnect_by_func (priv->accel_widget,
|
||||
refetch_widget_accel_closure,
|
||||
accel_label);
|
||||
g_object_weak_unref (G_OBJECT (priv->accel_widget),
|
||||
(GWeakNotify) accel_widget_weak_ref_cb, accel_label);
|
||||
}
|
||||
|
||||
priv->accel_widget = accel_widget;
|
||||
|
||||
if (priv->accel_widget)
|
||||
{
|
||||
g_object_weak_ref (G_OBJECT (priv->accel_widget),
|
||||
(GWeakNotify) accel_widget_weak_ref_cb, accel_label);
|
||||
g_signal_connect_object (priv->accel_widget, "accel-closures-changed",
|
||||
G_CALLBACK (refetch_widget_accel_closure),
|
||||
accel_label, G_CONNECT_SWAPPED);
|
||||
refetch_widget_accel_closure (accel_label);
|
||||
}
|
||||
|
||||
g_object_notify_by_pspec (G_OBJECT (accel_label), props[PROP_ACCEL_WIDGET]);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
gtk_accel_label_reset (GtkAccelLabel *accel_label)
|
||||
{
|
||||
gtk_accel_label_refetch (accel_label);
|
||||
}
|
||||
|
||||
static void
|
||||
check_accel_changed (GtkAccelGroup *accel_group,
|
||||
guint keyval,
|
||||
GdkModifierType modifier,
|
||||
GClosure *accel_closure,
|
||||
GtkAccelLabel *accel_label)
|
||||
{
|
||||
GtkAccelLabelPrivate *priv = gtk_accel_label_get_instance_private (accel_label);
|
||||
|
||||
if (accel_closure == priv->accel_closure)
|
||||
gtk_accel_label_reset (accel_label);
|
||||
}
|
||||
|
||||
/**
|
||||
* gtk_accel_label_set_accel_closure:
|
||||
* @accel_label: a #GtkAccelLabel
|
||||
* @accel_closure: (nullable): the closure to monitor for accelerator changes,
|
||||
* or %NULL
|
||||
*
|
||||
* Sets the closure to be monitored by this accelerator label. The closure
|
||||
* must be connected to an accelerator group; see gtk_accel_group_connect().
|
||||
* Passing %NULL for @accel_closure will dissociate @accel_label from its
|
||||
* current closure, if any.
|
||||
**/
|
||||
void
|
||||
gtk_accel_label_set_accel_closure (GtkAccelLabel *accel_label,
|
||||
GClosure *accel_closure)
|
||||
{
|
||||
GtkAccelLabelPrivate *priv = gtk_accel_label_get_instance_private (accel_label);
|
||||
|
||||
g_return_if_fail (GTK_IS_ACCEL_LABEL (accel_label));
|
||||
|
||||
if (accel_closure)
|
||||
g_return_if_fail (gtk_accel_group_from_accel_closure (accel_closure) != NULL);
|
||||
|
||||
if (accel_closure != priv->accel_closure)
|
||||
{
|
||||
if (priv->accel_closure)
|
||||
{
|
||||
g_signal_handlers_disconnect_by_func (priv->accel_group,
|
||||
check_accel_changed,
|
||||
accel_label);
|
||||
priv->accel_group = NULL;
|
||||
g_closure_unref (priv->accel_closure);
|
||||
}
|
||||
|
||||
priv->accel_closure = accel_closure;
|
||||
|
||||
if (priv->accel_closure)
|
||||
{
|
||||
g_closure_ref (priv->accel_closure);
|
||||
priv->accel_group = gtk_accel_group_from_accel_closure (accel_closure);
|
||||
g_signal_connect_object (priv->accel_group, "accel-changed", G_CALLBACK (check_accel_changed),
|
||||
accel_label, 0);
|
||||
}
|
||||
|
||||
gtk_accel_label_reset (accel_label);
|
||||
g_object_notify_by_pspec (G_OBJECT (accel_label), props[PROP_ACCEL_CLOSURE]);
|
||||
}
|
||||
}
|
||||
|
||||
static gboolean
|
||||
find_accel (GtkAccelKey *key,
|
||||
GClosure *closure,
|
||||
gpointer data)
|
||||
{
|
||||
return data == (gpointer) closure;
|
||||
}
|
||||
|
||||
/* Underscores in key names are better displayed as spaces
|
||||
* E.g., Page_Up should be “Page Up”.
|
||||
*
|
||||
* Some keynames also have prefixes that are not suitable
|
||||
* for display, e.g XF86AudioMute, so strip those out, too.
|
||||
*
|
||||
* This function is only called on untranslated keynames,
|
||||
* so no need to be UTF-8 safe.
|
||||
*/
|
||||
static void
|
||||
append_without_underscores (GString *s,
|
||||
gchar *str)
|
||||
{
|
||||
gchar *p;
|
||||
|
||||
if (g_str_has_prefix (str, "XF86"))
|
||||
p = str + 4;
|
||||
else if (g_str_has_prefix (str, "ISO_"))
|
||||
p = str + 4;
|
||||
else
|
||||
p = str;
|
||||
|
||||
for ( ; *p; p++)
|
||||
{
|
||||
if (*p == '_')
|
||||
g_string_append_c (s, ' ');
|
||||
else
|
||||
g_string_append_c (s, *p);
|
||||
}
|
||||
}
|
||||
|
||||
/* On Mac, if the key has symbolic representation (e.g. arrow keys),
|
||||
* append it to gstring and return TRUE; otherwise return FALSE.
|
||||
* See http://docs.info.apple.com/article.html?path=Mac/10.5/en/cdb_symbs.html
|
||||
* for the list of special keys. */
|
||||
static gboolean
|
||||
append_keyval_symbol (guint accelerator_key,
|
||||
GString *gstring)
|
||||
{
|
||||
#ifdef GDK_WINDOWING_QUARTZ
|
||||
switch (accelerator_key)
|
||||
{
|
||||
case GDK_KEY_Return:
|
||||
/* U+21A9 LEFTWARDS ARROW WITH HOOK */
|
||||
g_string_append (gstring, "\xe2\x86\xa9");
|
||||
return TRUE;
|
||||
|
||||
case GDK_KEY_ISO_Enter:
|
||||
/* U+2324 UP ARROWHEAD BETWEEN TWO HORIZONTAL BARS */
|
||||
g_string_append (gstring, "\xe2\x8c\xa4");
|
||||
return TRUE;
|
||||
|
||||
case GDK_KEY_Left:
|
||||
/* U+2190 LEFTWARDS ARROW */
|
||||
g_string_append (gstring, "\xe2\x86\x90");
|
||||
return TRUE;
|
||||
|
||||
case GDK_KEY_Up:
|
||||
/* U+2191 UPWARDS ARROW */
|
||||
g_string_append (gstring, "\xe2\x86\x91");
|
||||
return TRUE;
|
||||
|
||||
case GDK_KEY_Right:
|
||||
/* U+2192 RIGHTWARDS ARROW */
|
||||
g_string_append (gstring, "\xe2\x86\x92");
|
||||
return TRUE;
|
||||
|
||||
case GDK_KEY_Down:
|
||||
/* U+2193 DOWNWARDS ARROW */
|
||||
g_string_append (gstring, "\xe2\x86\x93");
|
||||
return TRUE;
|
||||
|
||||
case GDK_KEY_Page_Up:
|
||||
/* U+21DE UPWARDS ARROW WITH DOUBLE STROKE */
|
||||
g_string_append (gstring, "\xe2\x87\x9e");
|
||||
return TRUE;
|
||||
|
||||
case GDK_KEY_Page_Down:
|
||||
/* U+21DF DOWNWARDS ARROW WITH DOUBLE STROKE */
|
||||
g_string_append (gstring, "\xe2\x87\x9f");
|
||||
return TRUE;
|
||||
|
||||
case GDK_KEY_Home:
|
||||
/* U+2196 NORTH WEST ARROW */
|
||||
g_string_append (gstring, "\xe2\x86\x96");
|
||||
return TRUE;
|
||||
|
||||
case GDK_KEY_End:
|
||||
/* U+2198 SOUTH EAST ARROW */
|
||||
g_string_append (gstring, "\xe2\x86\x98");
|
||||
return TRUE;
|
||||
|
||||
case GDK_KEY_Escape:
|
||||
/* U+238B BROKEN CIRCLE WITH NORTHWEST ARROW */
|
||||
g_string_append (gstring, "\xe2\x8e\x8b");
|
||||
return TRUE;
|
||||
|
||||
case GDK_KEY_BackSpace:
|
||||
/* U+232B ERASE TO THE LEFT */
|
||||
g_string_append (gstring, "\xe2\x8c\xab");
|
||||
return TRUE;
|
||||
|
||||
case GDK_KEY_Delete:
|
||||
/* U+2326 ERASE TO THE RIGHT */
|
||||
g_string_append (gstring, "\xe2\x8c\xa6");
|
||||
return TRUE;
|
||||
|
||||
default:
|
||||
return FALSE;
|
||||
}
|
||||
#else /* !GDK_WINDOWING_QUARTZ */
|
||||
return FALSE;
|
||||
#endif
|
||||
}
|
||||
|
||||
gchar *
|
||||
_gtk_accel_label_class_get_accelerator_label (GtkAccelLabelClass *klass,
|
||||
guint accelerator_key,
|
||||
GdkModifierType accelerator_mods)
|
||||
{
|
||||
GString *gstring;
|
||||
gboolean seen_mod = FALSE;
|
||||
gunichar ch;
|
||||
|
||||
gstring = g_string_sized_new (10); /* ~len('backspace') */
|
||||
|
||||
if (accelerator_mods & GDK_SHIFT_MASK)
|
||||
{
|
||||
g_string_append (gstring, klass->mod_name_shift);
|
||||
seen_mod = TRUE;
|
||||
}
|
||||
|
||||
if (accelerator_mods & GDK_CONTROL_MASK)
|
||||
{
|
||||
if (seen_mod)
|
||||
g_string_append (gstring, klass->mod_separator);
|
||||
g_string_append (gstring, klass->mod_name_control);
|
||||
seen_mod = TRUE;
|
||||
}
|
||||
|
||||
if (accelerator_mods & GDK_MOD1_MASK)
|
||||
{
|
||||
if (seen_mod)
|
||||
g_string_append (gstring, klass->mod_separator);
|
||||
g_string_append (gstring, klass->mod_name_alt);
|
||||
seen_mod = TRUE;
|
||||
}
|
||||
|
||||
if (accelerator_mods & GDK_MOD2_MASK)
|
||||
{
|
||||
if (seen_mod)
|
||||
g_string_append (gstring, klass->mod_separator);
|
||||
|
||||
g_string_append (gstring, "Mod2");
|
||||
seen_mod = TRUE;
|
||||
}
|
||||
|
||||
if (accelerator_mods & GDK_MOD3_MASK)
|
||||
{
|
||||
if (seen_mod)
|
||||
g_string_append (gstring, klass->mod_separator);
|
||||
|
||||
g_string_append (gstring, "Mod3");
|
||||
seen_mod = TRUE;
|
||||
}
|
||||
|
||||
if (accelerator_mods & GDK_MOD4_MASK)
|
||||
{
|
||||
if (seen_mod)
|
||||
g_string_append (gstring, klass->mod_separator);
|
||||
|
||||
g_string_append (gstring, "Mod4");
|
||||
seen_mod = TRUE;
|
||||
}
|
||||
|
||||
if (accelerator_mods & GDK_MOD5_MASK)
|
||||
{
|
||||
if (seen_mod)
|
||||
g_string_append (gstring, klass->mod_separator);
|
||||
|
||||
g_string_append (gstring, "Mod5");
|
||||
seen_mod = TRUE;
|
||||
}
|
||||
|
||||
if (accelerator_mods & GDK_SUPER_MASK)
|
||||
{
|
||||
if (seen_mod)
|
||||
g_string_append (gstring, klass->mod_separator);
|
||||
|
||||
/* This is the text that should appear next to menu accelerators
|
||||
* that use the super key. If the text on this key isn't typically
|
||||
* translated on keyboards used for your language, don't translate
|
||||
* this.
|
||||
*/
|
||||
g_string_append (gstring, C_("keyboard label", "Super"));
|
||||
seen_mod = TRUE;
|
||||
}
|
||||
|
||||
if (accelerator_mods & GDK_HYPER_MASK)
|
||||
{
|
||||
if (seen_mod)
|
||||
g_string_append (gstring, klass->mod_separator);
|
||||
|
||||
/* This is the text that should appear next to menu accelerators
|
||||
* that use the hyper key. If the text on this key isn't typically
|
||||
* translated on keyboards used for your language, don't translate
|
||||
* this.
|
||||
*/
|
||||
g_string_append (gstring, C_("keyboard label", "Hyper"));
|
||||
seen_mod = TRUE;
|
||||
}
|
||||
|
||||
if (accelerator_mods & GDK_META_MASK)
|
||||
{
|
||||
if (seen_mod)
|
||||
g_string_append (gstring, klass->mod_separator);
|
||||
|
||||
#ifndef GDK_WINDOWING_QUARTZ
|
||||
/* This is the text that should appear next to menu accelerators
|
||||
* that use the meta key. If the text on this key isn't typically
|
||||
* translated on keyboards used for your language, don't translate
|
||||
* this.
|
||||
*/
|
||||
g_string_append (gstring, C_("keyboard label", "Meta"));
|
||||
#else
|
||||
/* Command key symbol U+2318 PLACE OF INTEREST SIGN */
|
||||
g_string_append (gstring, "\xe2\x8c\x98");
|
||||
#endif
|
||||
seen_mod = TRUE;
|
||||
}
|
||||
|
||||
ch = gdk_keyval_to_unicode (accelerator_key);
|
||||
if (ch && (ch == ' ' || g_unichar_isgraph (ch)))
|
||||
{
|
||||
if (seen_mod)
|
||||
g_string_append (gstring, klass->mod_separator);
|
||||
|
||||
switch (ch)
|
||||
{
|
||||
case ' ':
|
||||
g_string_append (gstring, C_("keyboard label", "Space"));
|
||||
break;
|
||||
case '\\':
|
||||
g_string_append (gstring, C_("keyboard label", "Backslash"));
|
||||
break;
|
||||
default:
|
||||
g_string_append_unichar (gstring, g_unichar_toupper (ch));
|
||||
break;
|
||||
}
|
||||
}
|
||||
else if (!append_keyval_symbol (accelerator_key, gstring))
|
||||
{
|
||||
gchar *tmp;
|
||||
|
||||
tmp = gdk_keyval_name (gdk_keyval_to_lower (accelerator_key));
|
||||
if (tmp != NULL)
|
||||
{
|
||||
if (seen_mod)
|
||||
g_string_append (gstring, klass->mod_separator);
|
||||
|
||||
if (tmp[0] != 0 && tmp[1] == 0)
|
||||
g_string_append_c (gstring, g_ascii_toupper (tmp[0]));
|
||||
else
|
||||
{
|
||||
const gchar *str;
|
||||
str = g_dpgettext2 (GETTEXT_PACKAGE, "keyboard label", tmp);
|
||||
if (str == tmp)
|
||||
append_without_underscores (gstring, tmp);
|
||||
else
|
||||
g_string_append (gstring, str);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return g_string_free (gstring, FALSE);
|
||||
}
|
||||
|
||||
/**
|
||||
* gtk_accel_label_refetch:
|
||||
* @accel_label: a #GtkAccelLabel.
|
||||
@@ -869,7 +322,7 @@ gtk_accel_label_refetch (GtkAccelLabel *accel_label)
|
||||
"gtk-enable-accels", &enable_accels,
|
||||
NULL);
|
||||
|
||||
if (enable_accels && (priv->accel_closure || priv->accel_key))
|
||||
if (enable_accels && priv->accel_key)
|
||||
{
|
||||
gboolean have_accel = FALSE;
|
||||
guint accel_key;
|
||||
@@ -883,30 +336,9 @@ gtk_accel_label_refetch (GtkAccelLabel *accel_label)
|
||||
have_accel = TRUE;
|
||||
}
|
||||
|
||||
/* If we don't have a hardcoded value, check the accel group */
|
||||
if (!have_accel)
|
||||
{
|
||||
GtkAccelKey *key;
|
||||
|
||||
key = gtk_accel_group_find (priv->accel_group, find_accel, priv->accel_closure);
|
||||
|
||||
if (key && key->accel_flags & GTK_ACCEL_VISIBLE)
|
||||
{
|
||||
accel_key = key->accel_key;
|
||||
accel_mods = key->accel_mods;
|
||||
have_accel = TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
/* If we found a key using either method, set it */
|
||||
if (have_accel)
|
||||
{
|
||||
GtkAccelLabelClass *klass;
|
||||
|
||||
klass = GTK_ACCEL_LABEL_GET_CLASS (accel_label);
|
||||
accel_string = _gtk_accel_label_class_get_accelerator_label (klass, accel_key, accel_mods);
|
||||
}
|
||||
|
||||
accel_string = gtk_accelerator_get_label (accel_key, accel_mods);
|
||||
else
|
||||
/* Otherwise we have a closure with no key. Show "-/-". */
|
||||
accel_string = g_strdup ("-/-");
|
||||
|
||||
@@ -46,16 +46,8 @@ GType gtk_accel_label_get_type (void) G_GNUC_CONST;
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
GtkWidget* gtk_accel_label_new (const gchar *string);
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
GtkWidget* gtk_accel_label_get_accel_widget (GtkAccelLabel *accel_label);
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
guint gtk_accel_label_get_accel_width (GtkAccelLabel *accel_label);
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
void gtk_accel_label_set_accel_widget (GtkAccelLabel *accel_label,
|
||||
GtkWidget *accel_widget);
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
void gtk_accel_label_set_accel_closure (GtkAccelLabel *accel_label,
|
||||
GClosure *accel_closure);
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
gboolean gtk_accel_label_refetch (GtkAccelLabel *accel_label);
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
void gtk_accel_label_set_accel (GtkAccelLabel *accel_label,
|
||||
|
||||
-1069
File diff suppressed because it is too large
Load Diff
@@ -1,109 +0,0 @@
|
||||
/* GTK - The GIMP Toolkit
|
||||
* Copyright (C) 1998, 2001 Tim Janik
|
||||
*
|
||||
* 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_ACCEL_MAP_H__
|
||||
#define __GTK_ACCEL_MAP_H__
|
||||
|
||||
|
||||
#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION)
|
||||
#error "Only <gtk/gtk.h> can be included directly."
|
||||
#endif
|
||||
|
||||
#include <gtk/gtkaccelgroup.h>
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
/* --- global GtkAccelMap object --- */
|
||||
#define GTK_TYPE_ACCEL_MAP (gtk_accel_map_get_type ())
|
||||
#define GTK_ACCEL_MAP(accel_map) (G_TYPE_CHECK_INSTANCE_CAST ((accel_map), GTK_TYPE_ACCEL_MAP, GtkAccelMap))
|
||||
#define GTK_ACCEL_MAP_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GTK_TYPE_ACCEL_MAP, GtkAccelMapClass))
|
||||
#define GTK_IS_ACCEL_MAP(accel_map) (G_TYPE_CHECK_INSTANCE_TYPE ((accel_map), GTK_TYPE_ACCEL_MAP))
|
||||
#define GTK_IS_ACCEL_MAP_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GTK_TYPE_ACCEL_MAP))
|
||||
#define GTK_ACCEL_MAP_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GTK_TYPE_ACCEL_MAP, GtkAccelMapClass))
|
||||
|
||||
typedef struct _GtkAccelMap GtkAccelMap;
|
||||
typedef struct _GtkAccelMapClass GtkAccelMapClass;
|
||||
|
||||
/* --- notifier --- */
|
||||
/**
|
||||
* GtkAccelMapForeach:
|
||||
* @data: User data passed to gtk_accel_map_foreach() or
|
||||
* gtk_accel_map_foreach_unfiltered()
|
||||
* @accel_path: Accel path of the current accelerator
|
||||
* @accel_key: Key of the current accelerator
|
||||
* @accel_mods: Modifiers of the current accelerator
|
||||
* @changed: Changed flag of the accelerator (if %TRUE, accelerator has changed
|
||||
* during runtime and would need to be saved during an accelerator dump)
|
||||
*/
|
||||
typedef void (*GtkAccelMapForeach) (gpointer data,
|
||||
const gchar *accel_path,
|
||||
guint accel_key,
|
||||
GdkModifierType accel_mods,
|
||||
gboolean changed);
|
||||
|
||||
|
||||
/* --- public API --- */
|
||||
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
void gtk_accel_map_add_entry (const gchar *accel_path,
|
||||
guint accel_key,
|
||||
GdkModifierType accel_mods);
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
gboolean gtk_accel_map_lookup_entry (const gchar *accel_path,
|
||||
GtkAccelKey *key);
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
gboolean gtk_accel_map_change_entry (const gchar *accel_path,
|
||||
guint accel_key,
|
||||
GdkModifierType accel_mods,
|
||||
gboolean replace);
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
void gtk_accel_map_load (const gchar *file_name);
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
void gtk_accel_map_save (const gchar *file_name);
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
void gtk_accel_map_foreach (gpointer data,
|
||||
GtkAccelMapForeach foreach_func);
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
void gtk_accel_map_load_fd (gint fd);
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
void gtk_accel_map_load_scanner (GScanner *scanner);
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
void gtk_accel_map_save_fd (gint fd);
|
||||
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
void gtk_accel_map_lock_path (const gchar *accel_path);
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
void gtk_accel_map_unlock_path (const gchar *accel_path);
|
||||
|
||||
/* --- filter functions --- */
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
void gtk_accel_map_add_filter (const gchar *filter_pattern);
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
void gtk_accel_map_foreach_unfiltered (gpointer data,
|
||||
GtkAccelMapForeach foreach_func);
|
||||
|
||||
/* --- notification --- */
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
GType gtk_accel_map_get_type (void) G_GNUC_CONST;
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
GtkAccelMap *gtk_accel_map_get (void);
|
||||
|
||||
G_DEFINE_AUTOPTR_CLEANUP_FUNC(GtkAccelMap, g_object_unref)
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
#endif /* __GTK_ACCEL_MAP_H__ */
|
||||
@@ -1,39 +0,0 @@
|
||||
/* GTK - The GIMP Toolkit
|
||||
* Copyright (C) 1998, 2001 Tim Janik
|
||||
*
|
||||
* 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_ACCEL_MAP_PRIVATE_H__
|
||||
#define __GTK_ACCEL_MAP_PRIVATE_H__
|
||||
|
||||
|
||||
#include <gtk/gtkaccelmap.h>
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
void _gtk_accel_map_init (void);
|
||||
|
||||
void _gtk_accel_map_add_group (const gchar *accel_path,
|
||||
GtkAccelGroup *accel_group);
|
||||
void _gtk_accel_map_remove_group (const gchar *accel_path,
|
||||
GtkAccelGroup *accel_group);
|
||||
gboolean _gtk_accel_path_is_valid (const gchar *accel_path);
|
||||
|
||||
gchar * _gtk_accel_path_for_action (const gchar *action_name,
|
||||
GVariant *parameter);
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
#endif /* __GTK_ACCEL_MAP_PRIVATE_H__ */
|
||||
+224
-38
@@ -27,6 +27,10 @@
|
||||
#include "gtkmarshalers.h"
|
||||
#include "gtkwidget.h"
|
||||
#include "gsettings-mapping.h"
|
||||
#include "gtkshortcut.h"
|
||||
#include "gtkshortcuttrigger.h"
|
||||
#include "gtkshortcutaction.h"
|
||||
#include "gtkconcatmodelprivate.h"
|
||||
|
||||
#include <string.h>
|
||||
|
||||
@@ -75,6 +79,8 @@ struct _GtkActionMuxer
|
||||
GtkWidget *widget;
|
||||
GPtrArray *widget_actions;
|
||||
gboolean *widget_actions_enabled;
|
||||
|
||||
GListModel *shortcuts;
|
||||
};
|
||||
|
||||
G_DEFINE_TYPE_WITH_CODE (GtkActionMuxer, gtk_action_muxer, G_TYPE_OBJECT,
|
||||
@@ -415,6 +421,9 @@ gtk_action_muxer_primary_accel_changed (GtkActionMuxer *muxer,
|
||||
g_signal_emit (muxer, accel_signal, 0, action_name, action_and_target);
|
||||
}
|
||||
|
||||
static const char * find_primary_accel (GtkActionMuxer *muxer,
|
||||
const char *action_and_target);
|
||||
|
||||
static void
|
||||
gtk_action_muxer_parent_primary_accel_changed (GtkActionMuxer *parent,
|
||||
const gchar *action_name,
|
||||
@@ -424,7 +433,7 @@ gtk_action_muxer_parent_primary_accel_changed (GtkActionMuxer *parent,
|
||||
GtkActionMuxer *muxer = user_data;
|
||||
|
||||
/* If it's in our table then don't let the parent one filter through */
|
||||
if (muxer->primary_accels && g_hash_table_lookup (muxer->primary_accels, action_and_target))
|
||||
if (find_primary_accel (muxer, action_and_target))
|
||||
return;
|
||||
|
||||
gtk_action_muxer_primary_accel_changed (muxer, action_name, action_and_target);
|
||||
@@ -810,6 +819,8 @@ gtk_action_muxer_finalize (GObject *object)
|
||||
if (muxer->primary_accels)
|
||||
g_hash_table_unref (muxer->primary_accels);
|
||||
|
||||
g_clear_object (&muxer->shortcuts);
|
||||
|
||||
G_OBJECT_CLASS (gtk_action_muxer_parent_class)
|
||||
->finalize (object);
|
||||
}
|
||||
@@ -1095,25 +1106,8 @@ gtk_action_muxer_get_parent (GtkActionMuxer *muxer)
|
||||
return muxer->parent;
|
||||
}
|
||||
|
||||
static void
|
||||
emit_changed_accels (GtkActionMuxer *muxer,
|
||||
GtkActionMuxer *parent)
|
||||
{
|
||||
while (parent)
|
||||
{
|
||||
if (parent->primary_accels)
|
||||
{
|
||||
GHashTableIter iter;
|
||||
gpointer key;
|
||||
|
||||
g_hash_table_iter_init (&iter, parent->primary_accels);
|
||||
while (g_hash_table_iter_next (&iter, &key, NULL))
|
||||
gtk_action_muxer_primary_accel_changed (muxer, NULL, key);
|
||||
}
|
||||
|
||||
parent = parent->parent;
|
||||
}
|
||||
}
|
||||
static void emit_changed_accels (GtkActionMuxer *muxer,
|
||||
GtkActionMuxer *parent);
|
||||
|
||||
/*< private >
|
||||
* gtk_action_muxer_set_parent:
|
||||
@@ -1184,40 +1178,143 @@ gtk_action_muxer_set_parent (GtkActionMuxer *muxer,
|
||||
g_object_notify_by_pspec (G_OBJECT (muxer), properties[PROP_PARENT]);
|
||||
}
|
||||
|
||||
typedef struct {
|
||||
char *action_and_target;
|
||||
char *primary_accel;
|
||||
int shortcut_position;
|
||||
} Accel;
|
||||
|
||||
static Accel *
|
||||
accel_new (const char *action_and_target,
|
||||
const char *primary_accel,
|
||||
int shortcut_position)
|
||||
{
|
||||
Accel *accel = g_new (Accel, 1);
|
||||
accel->action_and_target = g_strdup (action_and_target);
|
||||
accel->primary_accel = g_strdup (primary_accel);
|
||||
accel->shortcut_position = -1;
|
||||
|
||||
return accel;
|
||||
}
|
||||
|
||||
static void
|
||||
accel_free (gpointer data)
|
||||
{
|
||||
Accel *accel = data;
|
||||
|
||||
g_free (accel->action_and_target);
|
||||
g_free (accel->primary_accel);
|
||||
g_free (accel);
|
||||
}
|
||||
|
||||
static guint
|
||||
accel_hash (gconstpointer v)
|
||||
{
|
||||
const Accel *accel = v;
|
||||
|
||||
return g_str_hash (accel->action_and_target);
|
||||
}
|
||||
|
||||
static gboolean
|
||||
accel_equal (gconstpointer v1,
|
||||
gconstpointer v2)
|
||||
{
|
||||
const Accel *a1 = v1;
|
||||
const Accel *a2 = v2;
|
||||
|
||||
return g_str_equal (a1->action_and_target, a2->action_and_target);
|
||||
}
|
||||
|
||||
static void
|
||||
emit_changed_accels (GtkActionMuxer *muxer,
|
||||
GtkActionMuxer *parent)
|
||||
{
|
||||
while (parent)
|
||||
{
|
||||
if (parent->primary_accels)
|
||||
{
|
||||
GHashTableIter iter;
|
||||
Accel *accel;
|
||||
|
||||
g_hash_table_iter_init (&iter, parent->primary_accels);
|
||||
while (g_hash_table_iter_next (&iter, (gpointer *)&accel, NULL))
|
||||
gtk_action_muxer_primary_accel_changed (muxer, NULL, accel->action_and_target);
|
||||
}
|
||||
|
||||
parent = parent->parent;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
set_primary_accel (GtkActionMuxer *muxer,
|
||||
const char *action_and_target,
|
||||
const char *primary_accel,
|
||||
int shortcut_position)
|
||||
{
|
||||
if (!muxer->primary_accels)
|
||||
muxer->primary_accels = g_hash_table_new_full (accel_hash, accel_equal, accel_free, NULL);
|
||||
|
||||
if (primary_accel)
|
||||
{
|
||||
Accel *accel = accel_new (action_and_target, primary_accel, shortcut_position);
|
||||
g_hash_table_add (muxer->primary_accels, accel);
|
||||
}
|
||||
else
|
||||
{
|
||||
Accel accel;
|
||||
accel.action_and_target = (char *)action_and_target;
|
||||
accel.primary_accel = NULL;
|
||||
accel.shortcut_position = -1;
|
||||
g_hash_table_remove (muxer->primary_accels, &accel);
|
||||
}
|
||||
|
||||
gtk_action_muxer_primary_accel_changed (muxer, NULL, action_and_target);
|
||||
}
|
||||
|
||||
void
|
||||
gtk_action_muxer_set_primary_accel (GtkActionMuxer *muxer,
|
||||
const gchar *action_and_target,
|
||||
const gchar *primary_accel)
|
||||
{
|
||||
if (!muxer->primary_accels)
|
||||
muxer->primary_accels = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free);
|
||||
set_primary_accel (muxer, action_and_target, primary_accel, -1);
|
||||
}
|
||||
|
||||
if (primary_accel)
|
||||
g_hash_table_insert (muxer->primary_accels, g_strdup (action_and_target), g_strdup (primary_accel));
|
||||
else
|
||||
g_hash_table_remove (muxer->primary_accels, action_and_target);
|
||||
static const char *
|
||||
find_primary_accel (GtkActionMuxer *muxer,
|
||||
const char *action_and_target)
|
||||
{
|
||||
if (muxer->primary_accels)
|
||||
{
|
||||
Accel key;
|
||||
Accel *value;
|
||||
|
||||
gtk_action_muxer_primary_accel_changed (muxer, NULL, action_and_target);
|
||||
key.action_and_target = (char *)action_and_target;
|
||||
key.primary_accel = NULL;
|
||||
key.shortcut_position = -1;
|
||||
|
||||
value = g_hash_table_lookup (muxer->primary_accels, &key);
|
||||
|
||||
if (value)
|
||||
return value->primary_accel;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
const gchar *
|
||||
gtk_action_muxer_get_primary_accel (GtkActionMuxer *muxer,
|
||||
const gchar *action_and_target)
|
||||
{
|
||||
if (muxer->primary_accels)
|
||||
{
|
||||
const gchar *primary_accel;
|
||||
const char *accel;
|
||||
|
||||
primary_accel = g_hash_table_lookup (muxer->primary_accels, action_and_target);
|
||||
accel = find_primary_accel (muxer, action_and_target);
|
||||
if (accel)
|
||||
return accel;
|
||||
|
||||
if (primary_accel)
|
||||
return primary_accel;
|
||||
}
|
||||
if (muxer->parent)
|
||||
return gtk_action_muxer_get_primary_accel (muxer->parent, action_and_target);
|
||||
|
||||
if (!muxer->parent)
|
||||
return NULL;
|
||||
|
||||
return gtk_action_muxer_get_primary_accel (muxer->parent, action_and_target);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
gchar *
|
||||
@@ -1268,3 +1365,92 @@ gtk_normalise_detailed_action_name (const gchar *detailed_action_name)
|
||||
return action_and_target;
|
||||
}
|
||||
|
||||
static void
|
||||
gtk_action_muxer_set_primary_accel_from_shortcut (GtkActionMuxer *muxer,
|
||||
GtkShortcut *shortcut,
|
||||
int position)
|
||||
{
|
||||
GtkShortcutAction *action = gtk_shortcut_get_action (shortcut);
|
||||
GtkShortcutTrigger *trigger = gtk_shortcut_get_trigger (shortcut);
|
||||
GVariant *arguments = gtk_shortcut_get_arguments (shortcut);
|
||||
const char *name;
|
||||
char *action_and_target;
|
||||
char *accel;
|
||||
|
||||
if (gtk_shortcut_action_get_action_type (action) != GTK_SHORTCUT_ACTION_ACTION)
|
||||
return;
|
||||
|
||||
name = gtk_action_action_get_name (action);
|
||||
action_and_target = gtk_print_action_and_target (NULL, name, arguments);
|
||||
if (find_primary_accel (muxer, action_and_target))
|
||||
{
|
||||
g_free (action_and_target);
|
||||
return;
|
||||
}
|
||||
|
||||
/* FIXME: which display */
|
||||
accel = gtk_shortcut_trigger_to_label (trigger, gdk_display_get_default ());
|
||||
|
||||
set_primary_accel (muxer, action_and_target, accel, position);
|
||||
|
||||
g_free (action_and_target);
|
||||
g_free (accel);
|
||||
}
|
||||
|
||||
static void
|
||||
shortcut_items_changed (GListModel *model,
|
||||
guint position,
|
||||
guint removed,
|
||||
guint added,
|
||||
GtkActionMuxer *muxer)
|
||||
{
|
||||
if (removed && muxer->primary_accels)
|
||||
{
|
||||
GHashTableIter iter;
|
||||
Accel *accel;
|
||||
|
||||
g_hash_table_iter_init (&iter, muxer->primary_accels);
|
||||
while (g_hash_table_iter_next (&iter, (gpointer*)&accel, NULL))
|
||||
{
|
||||
if (accel->shortcut_position >= position &&
|
||||
accel->shortcut_position < position + removed)
|
||||
{
|
||||
gtk_action_muxer_primary_accel_changed (muxer, NULL, accel->action_and_target);
|
||||
g_hash_table_iter_remove (&iter);
|
||||
}
|
||||
else if (accel->shortcut_position >= position + removed)
|
||||
{
|
||||
accel->shortcut_position = accel->shortcut_position - removed + added;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (added)
|
||||
{
|
||||
guint i;
|
||||
|
||||
for (i = 0; i < added; i++)
|
||||
{
|
||||
GtkShortcut *shortcut = g_list_model_get_item (model, position + i);
|
||||
gtk_action_muxer_set_primary_accel_from_shortcut (muxer,
|
||||
shortcut,
|
||||
position + i);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
gtk_action_muxer_add_shortcuts (GtkActionMuxer *muxer,
|
||||
GListModel *shortcuts)
|
||||
{
|
||||
g_return_if_fail (g_list_model_get_item_type (shortcuts) == GTK_TYPE_SHORTCUT);
|
||||
|
||||
if (muxer->shortcuts == NULL)
|
||||
{
|
||||
muxer->shortcuts = G_LIST_MODEL (gtk_concat_model_new (GTK_TYPE_SHORTCUT));
|
||||
g_signal_connect (muxer->shortcuts, "items-changed",
|
||||
G_CALLBACK (shortcut_items_changed), muxer);
|
||||
}
|
||||
|
||||
gtk_concat_model_append (GTK_CONCAT_MODEL (muxer->shortcuts), shortcuts);
|
||||
}
|
||||
|
||||
@@ -86,6 +86,9 @@ gchar * gtk_print_action_and_target (const g
|
||||
|
||||
gchar * gtk_normalise_detailed_action_name (const gchar *detailed_action_name);
|
||||
|
||||
void gtk_action_muxer_add_shortcuts (GtkActionMuxer *muxer,
|
||||
GListModel *shortcuts);
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
#endif /* __GTK_ACTION_MUXER_H__ */
|
||||
|
||||
@@ -37,7 +37,6 @@
|
||||
#include "gtkmarshalers.h"
|
||||
#include "gtkmain.h"
|
||||
#include "gtkrecentmanager.h"
|
||||
#include "gtkaccelmapprivate.h"
|
||||
#include "gtkicontheme.h"
|
||||
#include "gtkbuilder.h"
|
||||
#include "gtkshortcutswindow.h"
|
||||
|
||||
+188
-338
@@ -22,135 +22,28 @@
|
||||
#include "config.h"
|
||||
|
||||
#include "gtkapplicationaccelsprivate.h"
|
||||
|
||||
#include "gtkactionmuxerprivate.h"
|
||||
|
||||
#include <string.h>
|
||||
|
||||
typedef struct
|
||||
{
|
||||
guint key;
|
||||
GdkModifierType modifier;
|
||||
} AccelKey;
|
||||
#include "gtkshortcut.h"
|
||||
#include "gtkshortcutaction.h"
|
||||
#include "gtkshortcuttrigger.h"
|
||||
|
||||
struct _GtkApplicationAccels
|
||||
{
|
||||
GObject parent;
|
||||
|
||||
GHashTable *action_to_accels;
|
||||
GHashTable *accel_to_actions;
|
||||
GListModel *shortcuts;
|
||||
};
|
||||
|
||||
G_DEFINE_TYPE (GtkApplicationAccels, gtk_application_accels, G_TYPE_OBJECT)
|
||||
|
||||
static AccelKey *
|
||||
accel_key_copy (const AccelKey *source)
|
||||
{
|
||||
AccelKey *dest;
|
||||
|
||||
dest = g_slice_new (AccelKey);
|
||||
dest->key = source->key;
|
||||
dest->modifier = source->modifier;
|
||||
|
||||
return dest;
|
||||
}
|
||||
|
||||
static void
|
||||
accel_key_free (gpointer data)
|
||||
{
|
||||
AccelKey *key = data;
|
||||
|
||||
g_slice_free (AccelKey, key);
|
||||
}
|
||||
|
||||
static guint
|
||||
accel_key_hash (gconstpointer data)
|
||||
{
|
||||
const AccelKey *key = data;
|
||||
|
||||
return key->key + (key->modifier << 16);
|
||||
}
|
||||
|
||||
static gboolean
|
||||
accel_key_equal (gconstpointer a,
|
||||
gconstpointer b)
|
||||
{
|
||||
const AccelKey *ak = a;
|
||||
const AccelKey *bk = b;
|
||||
|
||||
return ak->key == bk->key && ak->modifier == bk->modifier;
|
||||
}
|
||||
|
||||
static void
|
||||
add_entry (GtkApplicationAccels *accels,
|
||||
AccelKey *key,
|
||||
const gchar *action_and_target)
|
||||
{
|
||||
const gchar **old;
|
||||
const gchar **new;
|
||||
gint n;
|
||||
|
||||
old = g_hash_table_lookup (accels->accel_to_actions, key);
|
||||
if (old != NULL)
|
||||
for (n = 0; old[n]; n++) /* find the length */
|
||||
;
|
||||
else
|
||||
n = 0;
|
||||
|
||||
new = g_new (const gchar *, n + 1 + 1);
|
||||
memcpy (new, old, n * sizeof (const gchar *));
|
||||
new[n] = action_and_target;
|
||||
new[n + 1] = NULL;
|
||||
|
||||
g_hash_table_insert (accels->accel_to_actions, accel_key_copy (key), new);
|
||||
}
|
||||
|
||||
static void
|
||||
remove_entry (GtkApplicationAccels *accels,
|
||||
AccelKey *key,
|
||||
const gchar *action_and_target)
|
||||
{
|
||||
const gchar **old;
|
||||
const gchar **new;
|
||||
gint n, i;
|
||||
|
||||
/* if we can't find the entry then something has gone very wrong... */
|
||||
old = g_hash_table_lookup (accels->accel_to_actions, key);
|
||||
g_assert (old != NULL);
|
||||
|
||||
for (n = 0; old[n]; n++) /* find the length */
|
||||
;
|
||||
g_assert_cmpint (n, >, 0);
|
||||
|
||||
if (n == 1)
|
||||
{
|
||||
/* The simple case of removing the last action for an accel. */
|
||||
g_assert_cmpstr (old[0], ==, action_and_target);
|
||||
g_hash_table_remove (accels->accel_to_actions, key);
|
||||
return;
|
||||
}
|
||||
|
||||
for (i = 0; i < n; i++)
|
||||
if (g_str_equal (old[i], action_and_target))
|
||||
break;
|
||||
|
||||
/* We must have found it... */
|
||||
g_assert_cmpint (i, <, n);
|
||||
|
||||
new = g_new (const gchar *, n - 1 + 1);
|
||||
memcpy (new, old, i * sizeof (const gchar *));
|
||||
memcpy (new + i, old + i + 1, (n - (i + 1)) * sizeof (const gchar *));
|
||||
new[n - 1] = NULL;
|
||||
|
||||
g_hash_table_insert (accels->accel_to_actions, accel_key_copy (key), new);
|
||||
}
|
||||
|
||||
static void
|
||||
gtk_application_accels_finalize (GObject *object)
|
||||
{
|
||||
GtkApplicationAccels *accels = GTK_APPLICATION_ACCELS (object);
|
||||
|
||||
g_hash_table_unref (accels->accel_to_actions);
|
||||
g_hash_table_unref (accels->action_to_accels);
|
||||
g_list_store_remove_all (G_LIST_STORE (accels->shortcuts));
|
||||
g_object_unref (accels->shortcuts);
|
||||
|
||||
G_OBJECT_CLASS (gtk_application_accels_parent_class)->finalize (object);
|
||||
}
|
||||
@@ -166,9 +59,7 @@ gtk_application_accels_class_init (GtkApplicationAccelsClass *klass)
|
||||
static void
|
||||
gtk_application_accels_init (GtkApplicationAccels *accels)
|
||||
{
|
||||
accels->accel_to_actions = g_hash_table_new_full (accel_key_hash, accel_key_equal,
|
||||
accel_key_free, g_free);
|
||||
accels->action_to_accels = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free);
|
||||
accels->shortcuts = G_LIST_MODEL (g_list_store_new (GTK_TYPE_SHORTCUT));
|
||||
}
|
||||
|
||||
GtkApplicationAccels *
|
||||
@@ -182,54 +73,99 @@ gtk_application_accels_set_accels_for_action (GtkApplicationAccels *accels,
|
||||
const gchar *detailed_action_name,
|
||||
const gchar * const *accelerators)
|
||||
{
|
||||
gchar *action_and_target;
|
||||
AccelKey *keys, *old_keys;
|
||||
gint i, n;
|
||||
gchar *action_name;
|
||||
GVariant *target;
|
||||
GtkShortcut *shortcut;
|
||||
GtkShortcutTrigger *trigger = NULL;
|
||||
GError *error = NULL;
|
||||
guint i;
|
||||
|
||||
action_and_target = gtk_normalise_detailed_action_name (detailed_action_name);
|
||||
|
||||
n = accelerators ? g_strv_length ((gchar **) accelerators) : 0;
|
||||
|
||||
if (n > 0)
|
||||
if (!g_action_parse_detailed_name (detailed_action_name, &action_name, &target, &error))
|
||||
{
|
||||
keys = g_new0 (AccelKey, n + 1);
|
||||
g_critical ("Error parsing action name: %s", error->message);
|
||||
g_error_free (error);
|
||||
return;
|
||||
}
|
||||
|
||||
for (i = 0; i < n; i++)
|
||||
/* remove the accelerator if it already exists */
|
||||
for (i = 0; i < g_list_model_get_n_items (accels->shortcuts); i++)
|
||||
{
|
||||
GtkShortcut *s = g_list_model_get_item (accels->shortcuts, i);
|
||||
GtkShortcutAction *action = gtk_shortcut_get_action (s);
|
||||
GVariant *args = gtk_shortcut_get_arguments (s);
|
||||
|
||||
g_object_unref (s);
|
||||
|
||||
if (gtk_shortcut_action_get_action_type (action) != GTK_SHORTCUT_ACTION_ACTION ||
|
||||
!g_str_equal (gtk_action_action_get_name (action), action_name))
|
||||
continue;
|
||||
|
||||
if ((target == NULL && args != NULL) ||
|
||||
(target != NULL && (args == NULL || !g_variant_equal (target, args))))
|
||||
continue;
|
||||
|
||||
g_list_store_remove (G_LIST_STORE (accels->shortcuts), i);
|
||||
break;
|
||||
}
|
||||
|
||||
if (accelerators == NULL)
|
||||
goto out;
|
||||
|
||||
for (i = 0; accelerators[i]; i++)
|
||||
{
|
||||
GtkShortcutTrigger *new_trigger;
|
||||
guint key, modifier;
|
||||
|
||||
if (!gtk_accelerator_parse (accelerators[i], &key, &modifier))
|
||||
{
|
||||
gtk_accelerator_parse (accelerators[i], &keys[i].key, &keys[i].modifier);
|
||||
|
||||
if (keys[i].key == 0)
|
||||
{
|
||||
g_warning ("Unable to parse accelerator '%s': ignored request to install %d accelerators",
|
||||
accelerators[i], n);
|
||||
g_free (action_and_target);
|
||||
g_free (keys);
|
||||
return;
|
||||
}
|
||||
g_critical ("Unable to parse accelerator '%s': ignored request to install accelerators",
|
||||
accelerators[i]);
|
||||
if (trigger)
|
||||
gtk_shortcut_trigger_unref (trigger);
|
||||
goto out;;
|
||||
}
|
||||
new_trigger = gtk_keyval_trigger_new (key, modifier);
|
||||
if (trigger)
|
||||
trigger = gtk_alternative_trigger_new (trigger, new_trigger);
|
||||
else
|
||||
trigger = new_trigger;
|
||||
}
|
||||
else
|
||||
keys = NULL;
|
||||
if (trigger == NULL)
|
||||
goto out;
|
||||
|
||||
old_keys = g_hash_table_lookup (accels->action_to_accels, action_and_target);
|
||||
if (old_keys)
|
||||
{
|
||||
/* We need to remove accel entries from existing keys */
|
||||
for (i = 0; old_keys[i].key; i++)
|
||||
remove_entry (accels, &old_keys[i], action_and_target);
|
||||
}
|
||||
shortcut = gtk_shortcut_new (trigger, gtk_action_action_new (action_name));
|
||||
gtk_shortcut_set_arguments (shortcut, target);
|
||||
g_list_store_append (G_LIST_STORE (accels->shortcuts), shortcut);
|
||||
g_object_unref (shortcut);
|
||||
|
||||
if (keys)
|
||||
{
|
||||
g_hash_table_replace (accels->action_to_accels, action_and_target, keys);
|
||||
out:
|
||||
g_free (action_name);
|
||||
if (target)
|
||||
g_variant_unref (target);
|
||||
}
|
||||
|
||||
for (i = 0; i < n; i++)
|
||||
add_entry (accels, &keys[i], action_and_target);
|
||||
}
|
||||
else
|
||||
static void
|
||||
append_accelerators (GPtrArray *accels,
|
||||
GtkShortcutTrigger *trigger)
|
||||
{
|
||||
switch (gtk_shortcut_trigger_get_trigger_type (trigger))
|
||||
{
|
||||
g_hash_table_remove (accels->action_to_accels, action_and_target);
|
||||
g_free (action_and_target);
|
||||
case GTK_SHORTCUT_TRIGGER_KEYVAL:
|
||||
g_ptr_array_add (accels,
|
||||
gtk_accelerator_name (gtk_keyval_trigger_get_keyval (trigger),
|
||||
gtk_keyval_trigger_get_modifiers (trigger)));
|
||||
return;
|
||||
|
||||
case GTK_SHORTCUT_TRIGGER_ALTERNATIVE:
|
||||
append_accelerators (accels, gtk_alternative_trigger_get_first (trigger));
|
||||
append_accelerators (accels, gtk_alternative_trigger_get_second (trigger));
|
||||
return;
|
||||
|
||||
case GTK_SHORTCUT_TRIGGER_MNEMONIC:
|
||||
case GTK_SHORTCUT_TRIGGER_NEVER:
|
||||
default:
|
||||
/* not an accelerator */
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -237,223 +173,137 @@ gchar **
|
||||
gtk_application_accels_get_accels_for_action (GtkApplicationAccels *accels,
|
||||
const gchar *detailed_action_name)
|
||||
{
|
||||
gchar *action_and_target;
|
||||
AccelKey *keys;
|
||||
gchar **result;
|
||||
gint n, i = 0;
|
||||
GPtrArray *result;
|
||||
char *action_name;
|
||||
GVariant *target;
|
||||
GError *error = NULL;
|
||||
guint i;
|
||||
|
||||
action_and_target = gtk_normalise_detailed_action_name (detailed_action_name);
|
||||
result = g_ptr_array_new ();
|
||||
|
||||
keys = g_hash_table_lookup (accels->action_to_accels, action_and_target);
|
||||
if (!keys)
|
||||
if (!g_action_parse_detailed_name (detailed_action_name, &action_name, &target, &error))
|
||||
{
|
||||
g_free (action_and_target);
|
||||
return g_new0 (gchar *, 0 + 1);
|
||||
g_critical ("Error parsing action name: %s", error->message);
|
||||
g_error_free (error);
|
||||
g_ptr_array_add (result, NULL);
|
||||
return (gchar **) g_ptr_array_free (result, FALSE);
|
||||
}
|
||||
|
||||
for (n = 0; keys[n].key; n++)
|
||||
;
|
||||
for (i = 0; i < g_list_model_get_n_items (accels->shortcuts); i++)
|
||||
{
|
||||
GtkShortcut *shortcut = g_list_model_get_item (accels->shortcuts, i);
|
||||
GtkShortcutAction *action = gtk_shortcut_get_action (shortcut);
|
||||
GVariant *args = gtk_shortcut_get_arguments (shortcut);
|
||||
|
||||
result = g_new0 (gchar *, n + 1);
|
||||
if (gtk_shortcut_action_get_action_type (action) != GTK_SHORTCUT_ACTION_ACTION ||
|
||||
!g_str_equal (gtk_action_action_get_name (action), action_name))
|
||||
continue;
|
||||
|
||||
for (i = 0; i < n; i++)
|
||||
result[i] = gtk_accelerator_name (keys[i].key, keys[i].modifier);
|
||||
if ((target == NULL && args != NULL) ||
|
||||
(target != NULL && (args == NULL || !g_variant_equal (target, args))))
|
||||
continue;
|
||||
|
||||
g_free (action_and_target);
|
||||
return result;
|
||||
append_accelerators (result, gtk_shortcut_get_trigger (shortcut));
|
||||
break;
|
||||
}
|
||||
|
||||
g_free (action_name);
|
||||
if (target)
|
||||
g_variant_unref (target);
|
||||
g_ptr_array_add (result, NULL);
|
||||
return (gchar **) g_ptr_array_free (result, FALSE);
|
||||
}
|
||||
|
||||
static gboolean
|
||||
trigger_matches_accel (GtkShortcutTrigger *trigger,
|
||||
guint keyval,
|
||||
GdkModifierType modifiers)
|
||||
{
|
||||
switch (gtk_shortcut_trigger_get_trigger_type (trigger))
|
||||
{
|
||||
case GTK_SHORTCUT_TRIGGER_KEYVAL:
|
||||
return gtk_keyval_trigger_get_keyval (trigger) == keyval
|
||||
&& gtk_keyval_trigger_get_modifiers (trigger) == modifiers;
|
||||
|
||||
case GTK_SHORTCUT_TRIGGER_ALTERNATIVE:
|
||||
return trigger_matches_accel (gtk_alternative_trigger_get_first (trigger), keyval, modifiers)
|
||||
|| trigger_matches_accel (gtk_alternative_trigger_get_second (trigger), keyval, modifiers);
|
||||
|
||||
case GTK_SHORTCUT_TRIGGER_MNEMONIC:
|
||||
case GTK_SHORTCUT_TRIGGER_NEVER:
|
||||
default:
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
static char *
|
||||
get_detailed_name_for_shortcut (GtkShortcut *shortcut)
|
||||
{
|
||||
GtkShortcutAction *action = gtk_shortcut_get_action (shortcut);
|
||||
|
||||
if (gtk_shortcut_action_get_action_type (action) != GTK_SHORTCUT_ACTION_ACTION)
|
||||
return NULL;
|
||||
|
||||
return g_action_print_detailed_name (gtk_action_action_get_name (action), gtk_shortcut_get_arguments (shortcut));
|
||||
}
|
||||
|
||||
gchar **
|
||||
gtk_application_accels_get_actions_for_accel (GtkApplicationAccels *accels,
|
||||
const gchar *accel)
|
||||
{
|
||||
const gchar * const *actions_and_targets;
|
||||
gchar **detailed_actions;
|
||||
AccelKey accel_key;
|
||||
guint i, n;
|
||||
GPtrArray *result;
|
||||
guint key, modifiers;
|
||||
guint i;
|
||||
|
||||
gtk_accelerator_parse (accel, &accel_key.key, &accel_key.modifier);
|
||||
|
||||
if (accel_key.key == 0)
|
||||
if (!gtk_accelerator_parse (accel, &key, &modifiers))
|
||||
{
|
||||
g_critical ("invalid accelerator string '%s'", accel);
|
||||
g_return_val_if_fail (accel_key.key != 0, NULL);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
actions_and_targets = g_hash_table_lookup (accels->accel_to_actions, &accel_key);
|
||||
n = actions_and_targets ? g_strv_length ((gchar **) actions_and_targets) : 0;
|
||||
|
||||
detailed_actions = g_new0 (gchar *, n + 1);
|
||||
|
||||
for (i = 0; i < n; i++)
|
||||
result = g_ptr_array_new ();
|
||||
|
||||
for (i = 0; i < g_list_model_get_n_items (accels->shortcuts); i++)
|
||||
{
|
||||
const gchar *action_and_target = actions_and_targets[i];
|
||||
const gchar *sep;
|
||||
GVariant *target;
|
||||
GtkShortcut *shortcut = g_list_model_get_item (accels->shortcuts, i);
|
||||
char *detailed_name;
|
||||
|
||||
sep = strrchr (action_and_target, '|');
|
||||
target = g_variant_parse (NULL, action_and_target, sep, NULL, NULL);
|
||||
detailed_actions[i] = g_action_print_detailed_name (sep + 1, target);
|
||||
if (target)
|
||||
g_variant_unref (target);
|
||||
if (!trigger_matches_accel (gtk_shortcut_get_trigger (shortcut), key, modifiers))
|
||||
continue;
|
||||
|
||||
detailed_name = get_detailed_name_for_shortcut (shortcut);
|
||||
if (detailed_name)
|
||||
g_ptr_array_add (result, detailed_name);
|
||||
}
|
||||
|
||||
detailed_actions[n] = NULL;
|
||||
|
||||
return detailed_actions;
|
||||
g_ptr_array_add (result, NULL);
|
||||
return (gchar **) g_ptr_array_free (result, FALSE);
|
||||
}
|
||||
|
||||
gchar **
|
||||
gtk_application_accels_list_action_descriptions (GtkApplicationAccels *accels)
|
||||
{
|
||||
GHashTableIter iter;
|
||||
gchar **result;
|
||||
gint n, i = 0;
|
||||
gpointer key;
|
||||
GPtrArray *result;
|
||||
guint i;
|
||||
|
||||
n = g_hash_table_size (accels->action_to_accels);
|
||||
result = g_new (gchar *, n + 1);
|
||||
|
||||
g_hash_table_iter_init (&iter, accels->action_to_accels);
|
||||
while (g_hash_table_iter_next (&iter, &key, NULL))
|
||||
result = g_ptr_array_new ();
|
||||
|
||||
for (i = 0; i < g_list_model_get_n_items (accels->shortcuts); i++)
|
||||
{
|
||||
const gchar *action_and_target = key;
|
||||
const gchar *sep;
|
||||
GVariant *target;
|
||||
GtkShortcut *shortcut = g_list_model_get_item (accels->shortcuts, i);
|
||||
char *detailed_name;
|
||||
|
||||
sep = strrchr (action_and_target, '|');
|
||||
target = g_variant_parse (NULL, action_and_target, sep, NULL, NULL);
|
||||
result[i++] = g_action_print_detailed_name (sep + 1, target);
|
||||
if (target)
|
||||
g_variant_unref (target);
|
||||
detailed_name = get_detailed_name_for_shortcut (shortcut);
|
||||
if (detailed_name)
|
||||
g_ptr_array_add (result, detailed_name);
|
||||
}
|
||||
g_assert_cmpint (i, ==, n);
|
||||
result[i] = NULL;
|
||||
|
||||
return result;
|
||||
g_ptr_array_add (result, NULL);
|
||||
return (gchar **) g_ptr_array_free (result, FALSE);
|
||||
}
|
||||
|
||||
void
|
||||
gtk_application_accels_foreach_key (GtkApplicationAccels *accels,
|
||||
GtkWindow *window,
|
||||
GtkWindowKeysForeachFunc callback,
|
||||
gpointer user_data)
|
||||
GListModel *
|
||||
gtk_application_accels_get_shortcuts (GtkApplicationAccels *accels)
|
||||
{
|
||||
GHashTableIter iter;
|
||||
gpointer key;
|
||||
|
||||
g_hash_table_iter_init (&iter, accels->accel_to_actions);
|
||||
while (g_hash_table_iter_next (&iter, &key, NULL))
|
||||
{
|
||||
AccelKey *accel_key = key;
|
||||
|
||||
(* callback) (window, accel_key->key, accel_key->modifier, FALSE, user_data);
|
||||
}
|
||||
}
|
||||
|
||||
gboolean
|
||||
gtk_application_accels_activate (GtkApplicationAccels *accels,
|
||||
GActionGroup *action_group,
|
||||
guint key,
|
||||
GdkModifierType modifier)
|
||||
{
|
||||
AccelKey accel_key = { key, modifier };
|
||||
const gchar **actions;
|
||||
gint i;
|
||||
|
||||
actions = g_hash_table_lookup (accels->accel_to_actions, &accel_key);
|
||||
|
||||
if (actions == NULL)
|
||||
return FALSE;
|
||||
|
||||
/* We may have more than one action on a given accel. This could be
|
||||
* the case if we have different types of windows with different
|
||||
* actions in each.
|
||||
*
|
||||
* Find the first one that will successfully activate and use it.
|
||||
*/
|
||||
for (i = 0; actions[i]; i++)
|
||||
{
|
||||
const GVariantType *parameter_type;
|
||||
const gchar *action_name;
|
||||
const gchar *sep;
|
||||
gboolean enabled;
|
||||
GVariant *target;
|
||||
|
||||
sep = strrchr (actions[i], '|');
|
||||
action_name = sep + 1;
|
||||
|
||||
if (!g_action_group_query_action (action_group, action_name, &enabled, ¶meter_type, NULL, NULL, NULL))
|
||||
continue;
|
||||
|
||||
if (!enabled)
|
||||
continue;
|
||||
|
||||
/* We found an action with the correct name and it's enabled.
|
||||
* This is the action that we are going to try to invoke.
|
||||
*
|
||||
* There is still the possibility that the target value doesn't
|
||||
* match the expected parameter type. In that case, we will print
|
||||
* a warning.
|
||||
*
|
||||
* Note: we want to hold a ref on the target while we're invoking
|
||||
* the action to prevent trouble if someone uninstalls the accel
|
||||
* from the handler. That's not a problem since we're parsing it.
|
||||
*/
|
||||
if (actions[i] != sep) /* if it has a target... */
|
||||
{
|
||||
GError *error = NULL;
|
||||
|
||||
if (parameter_type == NULL)
|
||||
{
|
||||
gchar *accel_str = gtk_accelerator_name (key, modifier);
|
||||
g_warning ("Accelerator '%s' tries to invoke action '%s' with target, but action has no parameter",
|
||||
accel_str, action_name);
|
||||
g_free (accel_str);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
target = g_variant_parse (NULL, actions[i], sep, NULL, &error);
|
||||
g_assert_no_error (error);
|
||||
g_assert (target);
|
||||
|
||||
if (!g_variant_is_of_type (target, parameter_type))
|
||||
{
|
||||
gchar *accel_str = gtk_accelerator_name (key, modifier);
|
||||
gchar *typestr = g_variant_type_dup_string (parameter_type);
|
||||
gchar *targetstr = g_variant_print (target, TRUE);
|
||||
g_warning ("Accelerator '%s' tries to invoke action '%s' with target '%s',"
|
||||
" but action expects parameter with type '%s'", accel_str, action_name, targetstr, typestr);
|
||||
g_variant_unref (target);
|
||||
g_free (targetstr);
|
||||
g_free (accel_str);
|
||||
g_free (typestr);
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (parameter_type != NULL)
|
||||
{
|
||||
gchar *accel_str = gtk_accelerator_name (key, modifier);
|
||||
gchar *typestr = g_variant_type_dup_string (parameter_type);
|
||||
g_warning ("Accelerator '%s' tries to invoke action '%s' without target,"
|
||||
" but action expects parameter with type '%s'", accel_str, action_name, typestr);
|
||||
g_free (accel_str);
|
||||
g_free (typestr);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
target = NULL;
|
||||
}
|
||||
|
||||
g_action_group_activate_action (action_group, action_name, target);
|
||||
|
||||
if (target)
|
||||
g_variant_unref (target);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
return accels->shortcuts;
|
||||
}
|
||||
|
||||
@@ -47,15 +47,7 @@ gchar ** gtk_application_accels_get_actions_for_accel (GtkApplicat
|
||||
|
||||
gchar ** gtk_application_accels_list_action_descriptions (GtkApplicationAccels *accels);
|
||||
|
||||
void gtk_application_accels_foreach_key (GtkApplicationAccels *accels,
|
||||
GtkWindow *window,
|
||||
GtkWindowKeysForeachFunc callback,
|
||||
gpointer user_data);
|
||||
|
||||
gboolean gtk_application_accels_activate (GtkApplicationAccels *accels,
|
||||
GActionGroup *action_group,
|
||||
guint key,
|
||||
GdkModifierType modifier);
|
||||
GListModel * gtk_application_accels_get_shortcuts (GtkApplicationAccels *accels);
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
|
||||
+4
-4
@@ -65,7 +65,6 @@
|
||||
|
||||
#include "gtkassistant.h"
|
||||
|
||||
#include "gtkbindings.h"
|
||||
#include "gtkbox.h"
|
||||
#include "gtkbuildable.h"
|
||||
#include "gtkbutton.h"
|
||||
@@ -510,7 +509,6 @@ gtk_assistant_class_init (GtkAssistantClass *class)
|
||||
GtkWidgetClass *widget_class;
|
||||
GtkContainerClass *container_class;
|
||||
GtkWindowClass *window_class;
|
||||
GtkBindingSet *binding_set;
|
||||
|
||||
gobject_class = (GObjectClass *) class;
|
||||
widget_class = (GtkWidgetClass *) class;
|
||||
@@ -619,8 +617,10 @@ gtk_assistant_class_init (GtkAssistantClass *class)
|
||||
NULL,
|
||||
G_TYPE_NONE, 0);
|
||||
|
||||
binding_set = gtk_binding_set_by_class (class);
|
||||
gtk_binding_entry_add_signal (binding_set, GDK_KEY_Escape, 0, "escape", 0);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_Escape, 0,
|
||||
"escape",
|
||||
NULL);
|
||||
|
||||
/**
|
||||
* GtkAssistant:use-header-bar:
|
||||
|
||||
-1543
File diff suppressed because it is too large
Load Diff
@@ -1,87 +0,0 @@
|
||||
/* GTK - The GIMP Toolkit
|
||||
* Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
|
||||
*
|
||||
* GtkBindingSet: Keybinding manager for GObjects.
|
||||
* Copyright (C) 1998 Tim Janik
|
||||
*
|
||||
* 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/>.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Modified by the GTK+ Team and others 1997-2000. See the AUTHORS
|
||||
* file for a list of people on the GTK+ Team. See the ChangeLog
|
||||
* files for a list of changes. These files are distributed with
|
||||
* GTK+ at ftp://ftp.gtk.org/pub/gtk/.
|
||||
*/
|
||||
|
||||
#ifndef __GTK_BINDINGS_H__
|
||||
#define __GTK_BINDINGS_H__
|
||||
|
||||
|
||||
#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION)
|
||||
#error "Only <gtk/gtk.h> can be included directly."
|
||||
#endif
|
||||
|
||||
#include <gdk/gdk.h>
|
||||
#include <gtk/gtkenums.h>
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
typedef struct _GtkBindingSet GtkBindingSet;
|
||||
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
GtkBindingSet *gtk_binding_set_new (const gchar *set_name);
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
GtkBindingSet *gtk_binding_set_by_class (gpointer object_class);
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
GtkBindingSet *gtk_binding_set_find (const gchar *set_name);
|
||||
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
gboolean gtk_bindings_activate (GObject *object,
|
||||
guint keyval,
|
||||
GdkModifierType modifiers);
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
gboolean gtk_bindings_activate_event (GObject *object,
|
||||
GdkEventKey *event);
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
gboolean gtk_binding_set_activate (GtkBindingSet *binding_set,
|
||||
guint keyval,
|
||||
GdkModifierType modifiers,
|
||||
GObject *object);
|
||||
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
void gtk_binding_entry_skip (GtkBindingSet *binding_set,
|
||||
guint keyval,
|
||||
GdkModifierType modifiers);
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
void gtk_binding_entry_add_signal (GtkBindingSet *binding_set,
|
||||
guint keyval,
|
||||
GdkModifierType modifiers,
|
||||
const gchar *signal_name,
|
||||
guint n_args,
|
||||
...);
|
||||
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
GTokenType gtk_binding_entry_add_signal_from_string
|
||||
(GtkBindingSet *binding_set,
|
||||
const gchar *signal_desc);
|
||||
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
void gtk_binding_entry_remove (GtkBindingSet *binding_set,
|
||||
guint keyval,
|
||||
GdkModifierType modifiers);
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
#endif /* __GTK_BINDINGS_H__ */
|
||||
@@ -210,8 +210,12 @@
|
||||
#include "gtkbuilderprivate.h"
|
||||
#include "gtkdebug.h"
|
||||
#include "gtkmain.h"
|
||||
#include "gtkicontheme.h"
|
||||
#include "gtkintl.h"
|
||||
#include "gtkprivate.h"
|
||||
#include "gtkshortcutactionprivate.h"
|
||||
#include "gtkshortcuttrigger.h"
|
||||
#include "gtktestutils.h"
|
||||
#include "gtktypebuiltins.h"
|
||||
#include "gtkicontheme.h"
|
||||
#include "gtktestutils.h"
|
||||
@@ -2091,6 +2095,29 @@ gtk_builder_value_from_string_type (GtkBuilder *builder,
|
||||
ret = FALSE;
|
||||
}
|
||||
}
|
||||
else if (G_VALUE_HOLDS (value, GTK_TYPE_SHORTCUT_TRIGGER))
|
||||
{
|
||||
GtkShortcutTrigger *trigger = gtk_shortcut_trigger_parse_string (string);
|
||||
|
||||
if (trigger)
|
||||
g_value_take_boxed (value, trigger);
|
||||
else
|
||||
{
|
||||
g_set_error (error,
|
||||
GTK_BUILDER_ERROR,
|
||||
GTK_BUILDER_ERROR_INVALID_VALUE,
|
||||
"Could not parse shortcut trigger '%s'",
|
||||
string);
|
||||
ret = FALSE;
|
||||
}
|
||||
}
|
||||
else if (G_VALUE_HOLDS (value, GTK_TYPE_SHORTCUT_ACTION))
|
||||
{
|
||||
GtkShortcutAction *action = gtk_shortcut_action_parse_builder (builder, string, error);
|
||||
|
||||
/* Works for success and failure (NULL) case */
|
||||
g_value_take_boxed (value, action);
|
||||
}
|
||||
else if (G_VALUE_HOLDS (value, G_TYPE_STRV))
|
||||
{
|
||||
gchar **vector = g_strsplit (string, "\n", 0);
|
||||
|
||||
@@ -188,16 +188,18 @@ dismiss_current_popup (GtkColorEditor *editor)
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
popup_edit (GtkWidget *widget,
|
||||
GtkColorEditor *editor)
|
||||
void
|
||||
gtk_color_editor_popup_menu (GtkWidget *widget)
|
||||
{
|
||||
GtkColorEditor *editor;
|
||||
GtkWidget *popup = NULL;
|
||||
GtkRoot *root;
|
||||
GtkWidget *focus;
|
||||
gint position;
|
||||
gint s, e;
|
||||
|
||||
editor = GTK_COLOR_EDITOR (gtk_widget_get_ancestor (widget, GTK_TYPE_COLOR_EDITOR));
|
||||
|
||||
if (widget == editor->priv->sv_plane)
|
||||
{
|
||||
popup = editor->priv->sv_popup;
|
||||
@@ -546,7 +548,6 @@ gtk_color_editor_class_init (GtkColorEditorClass *class)
|
||||
gtk_widget_class_bind_template_callback (widget_class, entry_text_changed);
|
||||
gtk_widget_class_bind_template_callback (widget_class, entry_apply);
|
||||
gtk_widget_class_bind_template_callback (widget_class, entry_focus_changed);
|
||||
gtk_widget_class_bind_template_callback (widget_class, popup_edit);
|
||||
gtk_widget_class_bind_template_callback (widget_class, pick_color);
|
||||
}
|
||||
|
||||
|
||||
@@ -56,6 +56,8 @@ struct _GtkColorEditorClass
|
||||
GType gtk_color_editor_get_type (void) G_GNUC_CONST;
|
||||
GtkWidget * gtk_color_editor_new (void);
|
||||
|
||||
void gtk_color_editor_popup_menu (GtkWidget *control);
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
#endif /* __GTK_COLOR_EDITOR_H__ */
|
||||
|
||||
+18
-3
@@ -28,6 +28,7 @@
|
||||
#include "gtksnapshot.h"
|
||||
#include "gtkprivate.h"
|
||||
#include "gtkeventcontrollerkey.h"
|
||||
#include "gtkcoloreditorprivate.h"
|
||||
|
||||
struct _GtkColorPlanePrivate
|
||||
{
|
||||
@@ -244,11 +245,18 @@ static void
|
||||
hold_action (GtkGestureLongPress *gesture,
|
||||
gdouble x,
|
||||
gdouble y,
|
||||
GtkColorPlane *plane)
|
||||
GtkWidget *plane)
|
||||
{
|
||||
gboolean handled;
|
||||
gtk_color_editor_popup_menu (plane);
|
||||
}
|
||||
|
||||
g_signal_emit_by_name (plane, "popup-menu", &handled);
|
||||
static gboolean
|
||||
popup_menu (GtkWidget *widget,
|
||||
GVariant *args,
|
||||
gpointer user_data)
|
||||
{
|
||||
gtk_color_editor_popup_menu (widget);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -530,6 +538,13 @@ gtk_color_plane_class_init (GtkColorPlaneClass *class)
|
||||
GTK_TYPE_ADJUSTMENT,
|
||||
GTK_PARAM_WRITABLE |
|
||||
G_PARAM_CONSTRUCT_ONLY));
|
||||
|
||||
gtk_widget_class_add_binding (GTK_WIDGET_CLASS (class),
|
||||
GDK_KEY_F10, GDK_SHIFT_MASK,
|
||||
popup_menu, NULL);
|
||||
gtk_widget_class_add_binding (GTK_WIDGET_CLASS (class),
|
||||
GDK_KEY_Menu, 0,
|
||||
popup_menu, NULL);
|
||||
}
|
||||
|
||||
GtkWidget *
|
||||
|
||||
+19
-4
@@ -29,6 +29,7 @@
|
||||
#include "gtkprivate.h"
|
||||
#include "gtkintl.h"
|
||||
#include "gtksnapshot.h"
|
||||
#include "gtkcoloreditorprivate.h"
|
||||
|
||||
#include <math.h>
|
||||
|
||||
@@ -48,7 +49,7 @@ enum
|
||||
static void hold_action (GtkGestureLongPress *gesture,
|
||||
gdouble x,
|
||||
gdouble y,
|
||||
GtkColorScale *scale);
|
||||
GtkWidget *scale);
|
||||
|
||||
G_DEFINE_TYPE_WITH_PRIVATE (GtkColorScale, gtk_color_scale, GTK_TYPE_SCALE)
|
||||
|
||||
@@ -250,11 +251,18 @@ static void
|
||||
hold_action (GtkGestureLongPress *gesture,
|
||||
gdouble x,
|
||||
gdouble y,
|
||||
GtkColorScale *scale)
|
||||
GtkWidget *scale)
|
||||
{
|
||||
gboolean handled;
|
||||
gtk_color_editor_popup_menu (scale);
|
||||
}
|
||||
|
||||
g_signal_emit_by_name (scale, "popup-menu", &handled);
|
||||
static gboolean
|
||||
popup_menu (GtkWidget *widget,
|
||||
GVariant *args,
|
||||
gpointer user_data)
|
||||
{
|
||||
gtk_color_editor_popup_menu (widget);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -280,6 +288,13 @@ gtk_color_scale_class_init (GtkColorScaleClass *class)
|
||||
g_param_spec_int ("scale-type", P_("Scale type"), P_("Scale type"),
|
||||
0, 1, 0,
|
||||
GTK_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY));
|
||||
|
||||
gtk_widget_class_add_binding (GTK_WIDGET_CLASS (class),
|
||||
GDK_KEY_F10, GDK_SHIFT_MASK,
|
||||
popup_menu, NULL);
|
||||
gtk_widget_class_add_binding (GTK_WIDGET_CLASS (class),
|
||||
GDK_KEY_Menu, 0,
|
||||
popup_menu, NULL);
|
||||
}
|
||||
|
||||
void
|
||||
|
||||
+11
-4
@@ -422,10 +422,10 @@ gtk_color_swatch_measure (GtkWidget *widget,
|
||||
*natural = MAX (*natural, min);
|
||||
}
|
||||
|
||||
|
||||
|
||||
static gboolean
|
||||
swatch_popup_menu (GtkWidget *widget)
|
||||
gtk_color_swatch_popup_menu (GtkWidget *widget,
|
||||
GVariant *args,
|
||||
gpointer user_data)
|
||||
{
|
||||
do_popup (GTK_COLOR_SWATCH (widget));
|
||||
return TRUE;
|
||||
@@ -551,7 +551,6 @@ gtk_color_swatch_class_init (GtkColorSwatchClass *class)
|
||||
widget_class->drag_begin = swatch_drag_begin;
|
||||
widget_class->drag_data_get = swatch_drag_data_get;
|
||||
widget_class->drag_data_received = swatch_drag_data_received;
|
||||
widget_class->popup_menu = swatch_popup_menu;
|
||||
widget_class->size_allocate = swatch_size_allocate;
|
||||
widget_class->state_flags_changed = swatch_state_flags_changed;
|
||||
|
||||
@@ -565,6 +564,14 @@ gtk_color_swatch_class_init (GtkColorSwatchClass *class)
|
||||
g_param_spec_boolean ("has-menu", P_("Has Menu"), P_("Whether the swatch should offer customization"),
|
||||
TRUE, GTK_PARAM_READWRITE));
|
||||
|
||||
/* Context menu */
|
||||
gtk_widget_class_add_binding (widget_class,
|
||||
GDK_KEY_F10, GDK_SHIFT_MASK,
|
||||
gtk_color_swatch_popup_menu, NULL);
|
||||
gtk_widget_class_add_binding (widget_class,
|
||||
GDK_KEY_Menu, 0,
|
||||
gtk_color_swatch_popup_menu, NULL);
|
||||
|
||||
gtk_widget_class_set_accessible_type (widget_class, GTK_TYPE_COLOR_SWATCH_ACCESSIBLE);
|
||||
gtk_widget_class_set_css_name (widget_class, I_("colorswatch"));
|
||||
}
|
||||
|
||||
+86
-63
@@ -19,12 +19,12 @@
|
||||
|
||||
#include "gtkcomboboxprivate.h"
|
||||
|
||||
#include "gtkbindings.h"
|
||||
#include "gtkbox.h"
|
||||
#include "gtkcellareabox.h"
|
||||
#include "gtkcelllayout.h"
|
||||
#include "gtkcellrenderertext.h"
|
||||
#include "gtkcellview.h"
|
||||
#include "gtkeventcontrollerkey.h"
|
||||
#include "gtkeventcontrollerscroll.h"
|
||||
#include "gtkframe.h"
|
||||
#include "gtkiconprivate.h"
|
||||
@@ -36,10 +36,11 @@
|
||||
#include "gtkmenuprivate.h"
|
||||
#include "gtkmenushellprivate.h"
|
||||
#include "gtkprivate.h"
|
||||
#include "gtkshortcutcontroller.h"
|
||||
#include "gtktogglebutton.h"
|
||||
#include "gtktreemenu.h"
|
||||
#include "gtktypebuiltins.h"
|
||||
#include "gtkeventcontrollerkey.h"
|
||||
#include "gtkwidgetprivate.h"
|
||||
|
||||
#include "a11y/gtkcomboboxaccessible.h"
|
||||
|
||||
@@ -416,7 +417,6 @@ gtk_combo_box_class_init (GtkComboBoxClass *klass)
|
||||
GObjectClass *object_class;
|
||||
GtkContainerClass *container_class;
|
||||
GtkWidgetClass *widget_class;
|
||||
GtkBindingSet *binding_set;
|
||||
|
||||
container_class = (GtkContainerClass *)klass;
|
||||
container_class->forall = gtk_combo_box_forall;
|
||||
@@ -567,57 +567,77 @@ gtk_combo_box_class_init (GtkComboBoxClass *klass)
|
||||
G_TYPE_STRING, 1, G_TYPE_STRING);
|
||||
|
||||
/* key bindings */
|
||||
binding_set = gtk_binding_set_by_class (widget_class);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_Down, GDK_MOD1_MASK,
|
||||
"popup",
|
||||
NULL);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_KP_Down, GDK_MOD1_MASK,
|
||||
"popup",
|
||||
NULL);
|
||||
|
||||
gtk_binding_entry_add_signal (binding_set, GDK_KEY_Down, GDK_MOD1_MASK,
|
||||
"popup", 0);
|
||||
gtk_binding_entry_add_signal (binding_set, GDK_KEY_KP_Down, GDK_MOD1_MASK,
|
||||
"popup", 0);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_Up, GDK_MOD1_MASK,
|
||||
"popdown",
|
||||
NULL);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_KP_Up, GDK_MOD1_MASK,
|
||||
"popdown",
|
||||
NULL);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_Escape, 0,
|
||||
"popdown",
|
||||
NULL);
|
||||
|
||||
gtk_binding_entry_add_signal (binding_set, GDK_KEY_Up, GDK_MOD1_MASK,
|
||||
"popdown", 0);
|
||||
gtk_binding_entry_add_signal (binding_set, GDK_KEY_KP_Up, GDK_MOD1_MASK,
|
||||
"popdown", 0);
|
||||
gtk_binding_entry_add_signal (binding_set, GDK_KEY_Escape, 0,
|
||||
"popdown", 0);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_Up, 0,
|
||||
"move-active",
|
||||
"(i)", GTK_SCROLL_STEP_UP);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_KP_Up, 0,
|
||||
"move-active",
|
||||
"(i)", GTK_SCROLL_STEP_UP);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_Page_Up, 0,
|
||||
"move-active",
|
||||
"(i)", GTK_SCROLL_PAGE_UP);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_KP_Page_Up, 0,
|
||||
"move-active",
|
||||
"(i)", GTK_SCROLL_PAGE_UP);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_Home, 0,
|
||||
"move-active",
|
||||
"(i)", GTK_SCROLL_START);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_KP_Home, 0,
|
||||
"move-active",
|
||||
"(i)", GTK_SCROLL_START);
|
||||
|
||||
gtk_binding_entry_add_signal (binding_set, GDK_KEY_Up, 0,
|
||||
"move-active", 1,
|
||||
GTK_TYPE_SCROLL_TYPE, GTK_SCROLL_STEP_UP);
|
||||
gtk_binding_entry_add_signal (binding_set, GDK_KEY_KP_Up, 0,
|
||||
"move-active", 1,
|
||||
GTK_TYPE_SCROLL_TYPE, GTK_SCROLL_STEP_UP);
|
||||
gtk_binding_entry_add_signal (binding_set, GDK_KEY_Page_Up, 0,
|
||||
"move-active", 1,
|
||||
GTK_TYPE_SCROLL_TYPE, GTK_SCROLL_PAGE_UP);
|
||||
gtk_binding_entry_add_signal (binding_set, GDK_KEY_KP_Page_Up, 0,
|
||||
"move-active", 1,
|
||||
GTK_TYPE_SCROLL_TYPE, GTK_SCROLL_PAGE_UP);
|
||||
gtk_binding_entry_add_signal (binding_set, GDK_KEY_Home, 0,
|
||||
"move-active", 1,
|
||||
GTK_TYPE_SCROLL_TYPE, GTK_SCROLL_START);
|
||||
gtk_binding_entry_add_signal (binding_set, GDK_KEY_KP_Home, 0,
|
||||
"move-active", 1,
|
||||
GTK_TYPE_SCROLL_TYPE, GTK_SCROLL_START);
|
||||
|
||||
gtk_binding_entry_add_signal (binding_set, GDK_KEY_Down, 0,
|
||||
"move-active", 1,
|
||||
GTK_TYPE_SCROLL_TYPE, GTK_SCROLL_STEP_DOWN);
|
||||
gtk_binding_entry_add_signal (binding_set, GDK_KEY_KP_Down, 0,
|
||||
"move-active", 1,
|
||||
GTK_TYPE_SCROLL_TYPE, GTK_SCROLL_STEP_DOWN);
|
||||
gtk_binding_entry_add_signal (binding_set, GDK_KEY_Page_Down, 0,
|
||||
"move-active", 1,
|
||||
GTK_TYPE_SCROLL_TYPE, GTK_SCROLL_PAGE_DOWN);
|
||||
gtk_binding_entry_add_signal (binding_set, GDK_KEY_KP_Page_Down, 0,
|
||||
"move-active", 1,
|
||||
GTK_TYPE_SCROLL_TYPE, GTK_SCROLL_PAGE_DOWN);
|
||||
gtk_binding_entry_add_signal (binding_set, GDK_KEY_End, 0,
|
||||
"move-active", 1,
|
||||
GTK_TYPE_SCROLL_TYPE, GTK_SCROLL_END);
|
||||
gtk_binding_entry_add_signal (binding_set, GDK_KEY_KP_End, 0,
|
||||
"move-active", 1,
|
||||
GTK_TYPE_SCROLL_TYPE, GTK_SCROLL_END);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_Down, 0,
|
||||
"move-active",
|
||||
"(i)", GTK_SCROLL_STEP_DOWN);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_KP_Down, 0,
|
||||
"move-active",
|
||||
"(i)", GTK_SCROLL_STEP_DOWN);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_Page_Down, 0,
|
||||
"move-active",
|
||||
"(i)", GTK_SCROLL_PAGE_DOWN);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_KP_Page_Down, 0,
|
||||
"move-active",
|
||||
"(i)", GTK_SCROLL_PAGE_DOWN);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_End, 0,
|
||||
"move-active",
|
||||
"(i)", GTK_SCROLL_END);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_KP_End, 0,
|
||||
"move-active",
|
||||
"(i)", GTK_SCROLL_END);
|
||||
|
||||
/* properties */
|
||||
g_object_class_override_property (object_class,
|
||||
@@ -835,6 +855,7 @@ gtk_combo_box_init (GtkComboBox *combo_box)
|
||||
GtkStyleContext *context;
|
||||
GtkTreeMenu *menu;
|
||||
GtkEventController *controller;
|
||||
GList *controllers, *list;
|
||||
|
||||
priv->active = -1;
|
||||
priv->active_row = NULL;
|
||||
@@ -874,6 +895,19 @@ gtk_combo_box_init (GtkComboBox *combo_box)
|
||||
G_CALLBACK (gtk_combo_box_scroll_controller_scroll),
|
||||
combo_box);
|
||||
gtk_widget_add_controller (GTK_WIDGET (combo_box), controller);
|
||||
|
||||
controllers = _gtk_widget_list_controllers (priv->popup_widget, GTK_PHASE_BUBBLE);
|
||||
for (list = controllers; list; list = list->next)
|
||||
{
|
||||
if (GTK_IS_SHORTCUT_CONTROLLER (list->data))
|
||||
{
|
||||
g_object_ref (list->data);
|
||||
gtk_widget_remove_controller (priv->popup_widget, list->data);
|
||||
gtk_widget_add_controller (priv->popup_widget, list->data);
|
||||
break;
|
||||
}
|
||||
}
|
||||
g_list_free (controllers);
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -1850,18 +1884,7 @@ gtk_combo_box_menu_key (GtkEventControllerKey *key,
|
||||
GdkModifierType modifiers,
|
||||
GtkComboBox *combo_box)
|
||||
{
|
||||
GtkWidget *widget;
|
||||
GdkEvent *event;
|
||||
|
||||
widget = gtk_event_controller_get_widget (GTK_EVENT_CONTROLLER (key));
|
||||
event = gtk_get_current_event ();
|
||||
|
||||
if (!gtk_bindings_activate_event (G_OBJECT (widget), (GdkEventKey *)event))
|
||||
{
|
||||
gtk_event_controller_key_forward (key, GTK_WIDGET (combo_box));
|
||||
}
|
||||
|
||||
g_object_unref (event);
|
||||
gtk_event_controller_key_forward (key, GTK_WIDGET (combo_box));
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,254 @@
|
||||
/*
|
||||
* Copyright © 2018 Benjamin Otte
|
||||
*
|
||||
* 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.1 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/>.
|
||||
*
|
||||
* Authors: Benjamin Otte <otte@gnome.org>
|
||||
*/
|
||||
|
||||
|
||||
/*
|
||||
* SECTION:gtkconcatmodel
|
||||
* @Short_description: concatenation list model
|
||||
* @Title: GtkConcatModel
|
||||
* @See_also: #GListModel
|
||||
*
|
||||
* #GtkConcatModel is a #GListModel implementation that takes a list of list models
|
||||
* and presents them as one concatenated list.
|
||||
*
|
||||
* Node that all the types of the passed in list models must match the concat model's
|
||||
* type. If they are not, you must use a common ancestor type for the #GtkConcatModel,
|
||||
* %G_TYPE_OBJECT being the ultimate option.
|
||||
**/
|
||||
|
||||
#include "config.h"
|
||||
|
||||
#include "gtkconcatmodelprivate.h"
|
||||
|
||||
struct _GtkConcatModel
|
||||
{
|
||||
GObject parent_instance;
|
||||
|
||||
GType item_type;
|
||||
guint n_items;
|
||||
|
||||
GList *models;
|
||||
};
|
||||
|
||||
struct _GtkConcatModelClass
|
||||
{
|
||||
GObjectClass parent_class;
|
||||
};
|
||||
|
||||
static GType
|
||||
gtk_concat_model_list_model_get_item_type (GListModel *list)
|
||||
{
|
||||
GtkConcatModel *self = GTK_CONCAT_MODEL (list);
|
||||
|
||||
return self->item_type;
|
||||
}
|
||||
|
||||
static guint
|
||||
gtk_concat_model_list_model_get_n_items (GListModel *list)
|
||||
{
|
||||
GtkConcatModel *self = GTK_CONCAT_MODEL (list);
|
||||
|
||||
return self->n_items;
|
||||
}
|
||||
|
||||
static gpointer
|
||||
gtk_concat_model_list_model_get_item (GListModel *list,
|
||||
guint position)
|
||||
{
|
||||
GtkConcatModel *self = GTK_CONCAT_MODEL (list);
|
||||
GList *l;
|
||||
|
||||
/* FIXME: Use an RBTree to make this O(log N) */
|
||||
for (l = self->models; l; l = l->next)
|
||||
{
|
||||
guint n = g_list_model_get_n_items (l->data);
|
||||
|
||||
if (position < n)
|
||||
return g_list_model_get_item (l->data, position);
|
||||
|
||||
position -= n;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static void
|
||||
gtk_concat_model_list_model_init (GListModelInterface *iface)
|
||||
{
|
||||
iface->get_item_type = gtk_concat_model_list_model_get_item_type;
|
||||
iface->get_n_items = gtk_concat_model_list_model_get_n_items;
|
||||
iface->get_item = gtk_concat_model_list_model_get_item;
|
||||
}
|
||||
|
||||
G_DEFINE_TYPE_WITH_CODE (GtkConcatModel, gtk_concat_model,
|
||||
G_TYPE_OBJECT,
|
||||
G_IMPLEMENT_INTERFACE (G_TYPE_LIST_MODEL, gtk_concat_model_list_model_init))
|
||||
|
||||
static void
|
||||
gtk_concat_model_items_changed (GListModel *model,
|
||||
guint position,
|
||||
guint removed,
|
||||
guint added,
|
||||
GtkConcatModel *self)
|
||||
{
|
||||
GList *l;
|
||||
|
||||
for (l = self->models; l; l = l->next)
|
||||
{
|
||||
if (l->data == model)
|
||||
break;
|
||||
|
||||
position += g_list_model_get_n_items (l->data);
|
||||
}
|
||||
|
||||
self->n_items -= removed;
|
||||
self->n_items += added;
|
||||
|
||||
g_list_model_items_changed (G_LIST_MODEL (self),
|
||||
position,
|
||||
removed,
|
||||
added);
|
||||
}
|
||||
|
||||
static void
|
||||
gtk_concat_model_remove_internal (GtkConcatModel *self,
|
||||
GListModel *model,
|
||||
gboolean emit_signals)
|
||||
{
|
||||
guint n_items, position;
|
||||
GList *l;
|
||||
|
||||
position = 0;
|
||||
for (l = self->models; l; l = l->next)
|
||||
{
|
||||
if (l->data == model)
|
||||
break;
|
||||
|
||||
position += g_list_model_get_n_items (l->data);
|
||||
}
|
||||
|
||||
g_return_if_fail (l != NULL);
|
||||
|
||||
self->models = g_list_delete_link (self->models, l);
|
||||
n_items = g_list_model_get_n_items (model);
|
||||
self->n_items -= n_items;
|
||||
g_signal_handlers_disconnect_by_func (model, gtk_concat_model_items_changed, self);
|
||||
g_object_unref (model);
|
||||
|
||||
if (n_items && emit_signals)
|
||||
g_list_model_items_changed (G_LIST_MODEL (self),
|
||||
position,
|
||||
n_items,
|
||||
0);
|
||||
}
|
||||
|
||||
static void
|
||||
gtk_concat_model_dispose (GObject *object)
|
||||
{
|
||||
GtkConcatModel *self = GTK_CONCAT_MODEL (object);
|
||||
|
||||
/* FIXME: Make this work without signal emissions */
|
||||
while (self->models)
|
||||
gtk_concat_model_remove_internal (self, self->models->data, FALSE);
|
||||
|
||||
G_OBJECT_CLASS (gtk_concat_model_parent_class)->dispose (object);
|
||||
}
|
||||
|
||||
static void
|
||||
gtk_concat_model_class_init (GtkConcatModelClass *klass)
|
||||
{
|
||||
GObjectClass *object_class = G_OBJECT_CLASS (klass);
|
||||
|
||||
object_class->dispose = gtk_concat_model_dispose;
|
||||
}
|
||||
|
||||
static void
|
||||
gtk_concat_model_init (GtkConcatModel *self)
|
||||
{
|
||||
}
|
||||
|
||||
GtkConcatModel *
|
||||
gtk_concat_model_new (GType item_type)
|
||||
{
|
||||
GtkConcatModel *self;
|
||||
|
||||
g_return_val_if_fail (g_type_is_a (item_type, G_TYPE_OBJECT), NULL);
|
||||
|
||||
self = g_object_new (GTK_TYPE_CONCAT_MODEL, NULL);
|
||||
|
||||
self->item_type = item_type;
|
||||
|
||||
return self;
|
||||
}
|
||||
|
||||
void
|
||||
gtk_concat_model_append (GtkConcatModel *self,
|
||||
GListModel *model)
|
||||
{
|
||||
guint n_items;
|
||||
|
||||
g_return_if_fail (GTK_IS_CONCAT_MODEL (self));
|
||||
g_return_if_fail (G_IS_LIST_MODEL (model));
|
||||
g_return_if_fail (g_type_is_a (g_list_model_get_item_type (model), self->item_type));
|
||||
|
||||
g_object_ref (model);
|
||||
g_signal_connect (model, "items-changed", G_CALLBACK (gtk_concat_model_items_changed), self);
|
||||
self->models = g_list_append (self->models, model);
|
||||
n_items = g_list_model_get_n_items (model);
|
||||
self->n_items += n_items;
|
||||
|
||||
if (n_items)
|
||||
g_list_model_items_changed (G_LIST_MODEL (self),
|
||||
self->n_items - n_items,
|
||||
0,
|
||||
n_items);
|
||||
}
|
||||
|
||||
void
|
||||
gtk_concat_model_remove (GtkConcatModel *self,
|
||||
GListModel *model)
|
||||
{
|
||||
g_return_if_fail (GTK_IS_CONCAT_MODEL (self));
|
||||
g_return_if_fail (G_IS_LIST_MODEL (model));
|
||||
|
||||
gtk_concat_model_remove_internal (self, model, TRUE);
|
||||
}
|
||||
|
||||
GListModel *
|
||||
gtk_concat_model_get_model_for_item (GtkConcatModel *self,
|
||||
guint position)
|
||||
{
|
||||
GList *l;
|
||||
|
||||
g_return_val_if_fail (GTK_IS_CONCAT_MODEL (self), NULL);
|
||||
|
||||
/* FIXME: Use an RBTree to make this O(log N) */
|
||||
for (l = self->models; l; l = l->next)
|
||||
{
|
||||
guint n = g_list_model_get_n_items (l->data);
|
||||
|
||||
if (position < n)
|
||||
return l->data;
|
||||
|
||||
position -= n;
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,52 @@
|
||||
/*
|
||||
* Copyright © 2018 Benjamin Otte
|
||||
*
|
||||
* 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.1 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/>.
|
||||
*
|
||||
* Authors: Benjamin Otte <otte@gnome.org>
|
||||
*/
|
||||
|
||||
|
||||
#ifndef __GTK_CONCAT_MODEL_H__
|
||||
#define __GTK_CONCAT_MODEL_H__
|
||||
|
||||
#include <gio/gio.h>
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
#define GTK_TYPE_CONCAT_MODEL (gtk_concat_model_get_type ())
|
||||
#define GTK_CONCAT_MODEL(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), GTK_TYPE_CONCAT_MODEL, GtkConcatModel))
|
||||
#define GTK_CONCAT_MODEL_CLASS(k) (G_TYPE_CHECK_CLASS_CAST ((k), GTK_TYPE_CONCAT_MODEL, GtkConcatModelClass))
|
||||
#define GTK_IS_CONCAT_MODEL(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), GTK_TYPE_CONCAT_MODEL))
|
||||
#define GTK_IS_CONCAT_MODEL_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), GTK_TYPE_CONCAT_MODEL))
|
||||
#define GTK_CONCAT_MODEL_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), GTK_TYPE_CONCAT_MODEL, GtkConcatModelClass))
|
||||
|
||||
typedef struct _GtkConcatModel GtkConcatModel;
|
||||
typedef struct _GtkConcatModelClass GtkConcatModelClass;
|
||||
|
||||
GType gtk_concat_model_get_type (void) G_GNUC_CONST;
|
||||
|
||||
GtkConcatModel * gtk_concat_model_new (GType item_type);
|
||||
|
||||
void gtk_concat_model_append (GtkConcatModel *self,
|
||||
GListModel *model);
|
||||
void gtk_concat_model_remove (GtkConcatModel *self,
|
||||
GListModel *model);
|
||||
|
||||
GListModel * gtk_concat_model_get_model_for_item (GtkConcatModel *self,
|
||||
guint position);
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
#endif /* __GTK_CONCAT_MODEL_H__ */
|
||||
@@ -32,7 +32,6 @@
|
||||
#include "gtkstylepropertyprivate.h"
|
||||
#include "gtkstyleproviderprivate.h"
|
||||
#include "gtkwidgetpath.h"
|
||||
#include "gtkbindings.h"
|
||||
#include "gtkmarshalers.h"
|
||||
#include "gtkprivate.h"
|
||||
#include "gtkintl.h"
|
||||
|
||||
@@ -35,7 +35,6 @@
|
||||
#include "fallback-c89.c"
|
||||
|
||||
/* the actual parsers we have */
|
||||
#include "gtkbindings.h"
|
||||
#include "gtkcssarrayvalueprivate.h"
|
||||
#include "gtkcssbgsizevalueprivate.h"
|
||||
#include "gtkcssbordervalueprivate.h"
|
||||
|
||||
+1
-4
@@ -38,7 +38,6 @@
|
||||
#include "gtkcontainerprivate.h"
|
||||
#include "gtkmain.h"
|
||||
#include "gtkintl.h"
|
||||
#include "gtkbindings.h"
|
||||
#include "gtkprivate.h"
|
||||
#include "gtkbuildable.h"
|
||||
#include "gtkbuilderprivate.h"
|
||||
@@ -491,7 +490,6 @@ gtk_dialog_class_init (GtkDialogClass *class)
|
||||
GObjectClass *gobject_class;
|
||||
GtkWidgetClass *widget_class;
|
||||
GtkWindowClass *window_class;
|
||||
GtkBindingSet *binding_set;
|
||||
|
||||
gobject_class = G_OBJECT_CLASS (class);
|
||||
widget_class = GTK_WIDGET_CLASS (class);
|
||||
@@ -566,8 +564,7 @@ gtk_dialog_class_init (GtkDialogClass *class)
|
||||
-1, 1, -1,
|
||||
GTK_PARAM_READWRITE|G_PARAM_CONSTRUCT_ONLY));
|
||||
|
||||
binding_set = gtk_binding_set_by_class (class);
|
||||
gtk_binding_entry_add_signal (binding_set, GDK_KEY_Escape, 0, "close", 0);
|
||||
gtk_widget_class_add_binding_signal (widget_class, GDK_KEY_Escape, 0, "close", NULL);
|
||||
|
||||
/* Bind class to template
|
||||
*/
|
||||
|
||||
+47
-12
@@ -31,7 +31,6 @@
|
||||
#include "gtkentryprivate.h"
|
||||
|
||||
#include "gtkadjustment.h"
|
||||
#include "gtkbindings.h"
|
||||
#include "gtkbox.h"
|
||||
#include "gtkbutton.h"
|
||||
#include "gtkcelleditable.h"
|
||||
@@ -163,6 +162,7 @@ struct _GtkEntryPrivate
|
||||
GtkWidget *progress_widget;
|
||||
GtkWidget *emoji_chooser;
|
||||
|
||||
guint activates_default : 1;
|
||||
guint show_emoji_icon : 1;
|
||||
guint editing_canceled : 1; /* Only used by GtkCellRendererText */
|
||||
};
|
||||
@@ -289,6 +289,10 @@ static GtkEntryBuffer *get_buffer (GtkEntry *entry);
|
||||
static void set_show_emoji_icon (GtkEntry *entry,
|
||||
gboolean value);
|
||||
|
||||
static void gtk_entry_activate (GtkWidget *widget,
|
||||
const char *action_name,
|
||||
GVariant *parameters);
|
||||
|
||||
static void gtk_entry_measure (GtkWidget *widget,
|
||||
GtkOrientation orientation,
|
||||
int for_size,
|
||||
@@ -345,7 +349,7 @@ gtk_entry_class_init (GtkEntryClass *class)
|
||||
widget_class->direction_changed = gtk_entry_direction_changed;
|
||||
widget_class->grab_focus = gtk_entry_grab_focus;
|
||||
widget_class->mnemonic_activate = gtk_entry_mnemonic_activate;
|
||||
|
||||
|
||||
quark_entry_completion = g_quark_from_static_string ("gtk-entry-completion-key");
|
||||
|
||||
entry_props[PROP_BUFFER] =
|
||||
@@ -850,7 +854,7 @@ gtk_entry_class_init (GtkEntryClass *class)
|
||||
signals[ACTIVATE] =
|
||||
g_signal_new (I_("activate"),
|
||||
G_OBJECT_CLASS_TYPE (gobject_class),
|
||||
G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION,
|
||||
G_SIGNAL_RUN_LAST,
|
||||
G_STRUCT_OFFSET (GtkEntryClass, activate),
|
||||
NULL, NULL,
|
||||
NULL,
|
||||
@@ -892,6 +896,16 @@ gtk_entry_class_init (GtkEntryClass *class)
|
||||
G_TYPE_NONE, 1,
|
||||
GTK_TYPE_ENTRY_ICON_POSITION);
|
||||
|
||||
gtk_widget_class_install_action (widget_class, "activate", NULL,
|
||||
gtk_entry_activate);
|
||||
|
||||
gtk_widget_class_bind_action (widget_class, GDK_KEY_Return, 0,
|
||||
"activate", NULL);
|
||||
gtk_widget_class_bind_action (widget_class, GDK_KEY_ISO_Enter, 0,
|
||||
"activate", NULL);
|
||||
gtk_widget_class_bind_action (widget_class, GDK_KEY_KP_Enter, 0,
|
||||
"activate", NULL);
|
||||
|
||||
gtk_widget_class_set_accessible_type (widget_class, GTK_TYPE_ENTRY_ACCESSIBLE);
|
||||
gtk_widget_class_set_css_name (widget_class, I_("entry"));
|
||||
}
|
||||
@@ -936,7 +950,6 @@ gtk_entry_set_property (GObject *object,
|
||||
case PROP_VISIBILITY:
|
||||
case PROP_INVISIBLE_CHAR:
|
||||
case PROP_INVISIBLE_CHAR_SET:
|
||||
case PROP_ACTIVATES_DEFAULT:
|
||||
case PROP_TRUNCATE_MULTILINE:
|
||||
case PROP_OVERWRITE_MODE:
|
||||
case PROP_PLACEHOLDER_TEXT:
|
||||
@@ -949,6 +962,10 @@ gtk_entry_set_property (GObject *object,
|
||||
g_object_set_property (G_OBJECT (priv->text), pspec->name, value);
|
||||
break;
|
||||
|
||||
case PROP_ACTIVATES_DEFAULT:
|
||||
gtk_entry_set_activates_default (entry, g_value_get_boolean (value));
|
||||
break;
|
||||
|
||||
case PROP_HAS_FRAME:
|
||||
gtk_entry_set_has_frame (entry, g_value_get_boolean (value));
|
||||
break;
|
||||
@@ -1091,7 +1108,6 @@ gtk_entry_get_property (GObject *object,
|
||||
case PROP_VISIBILITY:
|
||||
case PROP_INVISIBLE_CHAR:
|
||||
case PROP_INVISIBLE_CHAR_SET:
|
||||
case PROP_ACTIVATES_DEFAULT:
|
||||
case PROP_SCROLL_OFFSET:
|
||||
case PROP_TRUNCATE_MULTILINE:
|
||||
case PROP_OVERWRITE_MODE:
|
||||
@@ -1104,6 +1120,10 @@ gtk_entry_get_property (GObject *object,
|
||||
g_object_get_property (G_OBJECT (priv->text), pspec->name, value);
|
||||
break;
|
||||
|
||||
case PROP_ACTIVATES_DEFAULT:
|
||||
g_value_set_boolean (value, gtk_entry_get_activates_default (entry));
|
||||
break;
|
||||
|
||||
case PROP_HAS_FRAME:
|
||||
g_value_set_boolean (value, gtk_entry_get_has_frame (entry));
|
||||
break;
|
||||
@@ -1232,9 +1252,21 @@ gtk_entry_get_property (GObject *object,
|
||||
}
|
||||
|
||||
static void
|
||||
activate_cb (GtkText *text, GtkEntry *entry)
|
||||
gtk_entry_activate (GtkWidget *widget,
|
||||
const char *action_name,
|
||||
GVariant *parameters)
|
||||
{
|
||||
g_signal_emit (entry, signals[ACTIVATE], 0);
|
||||
GtkEntry *entry = GTK_ENTRY (widget);
|
||||
GtkEntryPrivate *priv = gtk_entry_get_instance_private (entry);
|
||||
GtkEntryCompletion *completion = gtk_entry_get_completion (entry);
|
||||
|
||||
if (completion && _gtk_entry_completion_accept (completion))
|
||||
return;
|
||||
|
||||
if (priv->activates_default)
|
||||
gtk_widget_activate_default (widget);
|
||||
else
|
||||
g_signal_emit (entry, signals[ACTIVATE], 0);
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -1258,7 +1290,6 @@ connect_text_signals (GtkEntry *entry)
|
||||
{
|
||||
GtkEntryPrivate *priv = gtk_entry_get_instance_private (entry);
|
||||
|
||||
g_signal_connect (priv->text, "activate", G_CALLBACK (activate_cb), entry);
|
||||
g_signal_connect (priv->text, "notify", G_CALLBACK (notify_cb), entry);
|
||||
}
|
||||
|
||||
@@ -1267,7 +1298,6 @@ disconnect_text_signals (GtkEntry *entry)
|
||||
{
|
||||
GtkEntryPrivate *priv = gtk_entry_get_instance_private (entry);
|
||||
|
||||
g_signal_handlers_disconnect_by_func (priv->text, activate_cb, entry);
|
||||
g_signal_handlers_disconnect_by_func (priv->text, notify_cb, entry);
|
||||
}
|
||||
|
||||
@@ -2142,7 +2172,12 @@ gtk_entry_set_activates_default (GtkEntry *entry,
|
||||
|
||||
g_return_if_fail (GTK_IS_ENTRY (entry));
|
||||
|
||||
gtk_text_set_activates_default (GTK_TEXT (priv->text), setting);
|
||||
if (priv->activates_default == setting)
|
||||
return;
|
||||
|
||||
priv->activates_default = setting;
|
||||
|
||||
g_object_notify_by_pspec (G_OBJECT (entry), entry_props[PROP_ACTIVATES_DEFAULT]);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -2160,7 +2195,7 @@ gtk_entry_get_activates_default (GtkEntry *entry)
|
||||
|
||||
g_return_val_if_fail (GTK_IS_ENTRY (entry), FALSE);
|
||||
|
||||
return gtk_text_get_activates_default (GTK_TEXT (priv->text));
|
||||
return priv->activates_default;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -3559,7 +3594,7 @@ gtk_entry_set_extra_menu (GtkEntry *entry,
|
||||
|
||||
/**
|
||||
* gtk_entry_get_extra_menu:
|
||||
* @self: a #GtkText
|
||||
* @entry: a #GtkText
|
||||
*
|
||||
* Gets the menu model set with gtk_entry_set_extra_menu().
|
||||
*
|
||||
|
||||
+1
-27
@@ -78,33 +78,7 @@ struct _GtkEntry
|
||||
* GtkEntryClass:
|
||||
* @parent_class: The parent class.
|
||||
* @activate: Class handler for the #GtkEntry::activate signal. The default
|
||||
* implementation activates the gtk.activate-default action.
|
||||
* @move_cursor: Class handler for the #GtkEntry::move-cursor signal. The
|
||||
* default implementation specifies the standard #GtkEntry cursor movement
|
||||
* behavior.
|
||||
* @insert_at_cursor: Class handler for the #GtkEntry::insert-at-cursor signal.
|
||||
* The default implementation inserts text at the cursor.
|
||||
* @delete_from_cursor: Class handler for the #GtkEntry::delete-from-cursor
|
||||
* signal. The default implementation deletes the selection or the specified
|
||||
* number of characters or words.
|
||||
* @backspace: Class handler for the #GtkEntry::backspace signal. The default
|
||||
* implementation deletes the selection or a single character or word.
|
||||
* @cut_clipboard: Class handler for the #GtkEntry::cut-clipboard signal. The
|
||||
* default implementation cuts the selection, if one exists.
|
||||
* @copy_clipboard: Class handler for the #GtkEntry::copy-clipboard signal. The
|
||||
* default implementation copies the selection, if one exists.
|
||||
* @paste_clipboard: Class handler for the #GtkEntry::paste-clipboard signal.
|
||||
* The default implementation pastes at the current cursor position or over
|
||||
* the current selection if one exists.
|
||||
* @toggle_overwrite: Class handler for the #GtkEntry::toggle-overwrite signal.
|
||||
* The default implementation toggles overwrite mode and blinks the cursor.
|
||||
* @insert_emoji: Class handler for the #GtkEntry::insert-emoji signal.
|
||||
*
|
||||
* Class structure for #GtkEntry. All virtual functions have a default
|
||||
* implementation. Derived classes may set the virtual function pointers for the
|
||||
* signal handlers to %NULL, but must keep @get_text_area_size and
|
||||
* @get_frame_size non-%NULL; either use the default implementation, or provide
|
||||
* a custom one.
|
||||
* implementation activates the default.activate action.
|
||||
*/
|
||||
struct _GtkEntryClass
|
||||
{
|
||||
|
||||
@@ -2294,8 +2294,8 @@ clear_completion_callback (GObject *text,
|
||||
completion->priv->has_completion = FALSE;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
accept_completion_callback (GtkEntryCompletion *completion)
|
||||
gboolean
|
||||
_gtk_entry_completion_accept (GtkEntryCompletion *completion)
|
||||
{
|
||||
if (!completion->priv->inline_completion)
|
||||
return FALSE;
|
||||
@@ -2313,7 +2313,7 @@ text_focus_out (GtkEntryCompletion *completion)
|
||||
if (gtk_widget_get_mapped (completion->priv->popup_window))
|
||||
return FALSE;
|
||||
|
||||
return accept_completion_callback (completion);
|
||||
return _gtk_entry_completion_accept (completion);
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -2358,7 +2358,6 @@ connect_completion_signals (GtkEntryCompletion *completion)
|
||||
completion->priv->insert_text_id =
|
||||
g_signal_connect (text, "insert-text", G_CALLBACK (completion_insert_text_callback), completion);
|
||||
g_signal_connect (text, "notify", G_CALLBACK (clear_completion_callback), completion);
|
||||
g_signal_connect_swapped (text, "activate", G_CALLBACK (accept_completion_callback), completion);
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -2412,7 +2411,6 @@ disconnect_completion_signals (GtkEntryCompletion *completion)
|
||||
}
|
||||
g_signal_handlers_disconnect_by_func (text, G_CALLBACK (completion_insert_text_callback), completion);
|
||||
g_signal_handlers_disconnect_by_func (text, G_CALLBACK (clear_completion_callback), completion);
|
||||
g_signal_handlers_disconnect_by_func (text, G_CALLBACK (accept_completion_callback), completion);
|
||||
}
|
||||
|
||||
void
|
||||
|
||||
@@ -112,6 +112,7 @@ void _gtk_entry_completion_popdown (GtkEntryCompletion *completion);
|
||||
void _gtk_entry_completion_connect (GtkEntryCompletion *completion,
|
||||
GtkEntry *entry);
|
||||
void _gtk_entry_completion_disconnect (GtkEntryCompletion *completion);
|
||||
gboolean _gtk_entry_completion_accept (GtkEntryCompletion *completion);
|
||||
|
||||
GtkIMContext* _gtk_entry_get_im_context (GtkEntry *entry);
|
||||
void gtk_entry_enter_text (GtkEntry *entry,
|
||||
|
||||
@@ -1016,6 +1016,25 @@ typedef enum
|
||||
GTK_PAN_DIRECTION_DOWN
|
||||
} GtkPanDirection;
|
||||
|
||||
/**
|
||||
* GtkShortcutScope:
|
||||
* @GTK_SHORTCUT_SCOPE_LOCAL: Shortcuts are handled inside
|
||||
* the widget the controller belongs to.
|
||||
* @GTK_SHORTCUT_SCOPE_MANAGED: Shortcuts are handled by
|
||||
* the first ancestor that is a #GtkShortcutManager
|
||||
* @GTK_SHORTCUT_SCOPE_GLOBAL: Shortcuts are handled by
|
||||
* the root widget.
|
||||
*
|
||||
* Describes where #GtkShortcuts added to a
|
||||
* #GtkShortcutController get handled.
|
||||
*/
|
||||
typedef enum
|
||||
{
|
||||
GTK_SHORTCUT_SCOPE_LOCAL,
|
||||
GTK_SHORTCUT_SCOPE_MANAGED,
|
||||
GTK_SHORTCUT_SCOPE_GLOBAL
|
||||
} GtkShortcutScope;
|
||||
|
||||
/**
|
||||
* GtkPopoverConstraint:
|
||||
* @GTK_POPOVER_CONSTRAINT_NONE: Don't constrain the popover position
|
||||
|
||||
@@ -35,7 +35,6 @@
|
||||
#include "gtkwidgetprivate.h"
|
||||
#include "gtkeventcontrollerprivate.h"
|
||||
#include "gtkeventcontrollerkey.h"
|
||||
#include "gtkbindings.h"
|
||||
#include "gtkenums.h"
|
||||
#include "gtkmain.h"
|
||||
|
||||
@@ -508,9 +507,6 @@ gtk_event_controller_key_forward (GtkEventControllerKey *controller,
|
||||
GTK_PHASE_BUBBLE))
|
||||
return TRUE;
|
||||
|
||||
if (gtk_bindings_activate_event (G_OBJECT (widget), (GdkEventKey *)controller->current_event))
|
||||
return TRUE;
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
|
||||
+111
-140
@@ -22,7 +22,6 @@
|
||||
#include "gtkfilechooserwidget.h"
|
||||
#include "gtkfilechooserwidgetprivate.h"
|
||||
|
||||
#include "gtkbindings.h"
|
||||
#include "gtkbutton.h"
|
||||
#include "gtkcelllayout.h"
|
||||
#include "gtkcellrendererpixbuf.h"
|
||||
@@ -84,6 +83,10 @@
|
||||
#include "gtkentryprivate.h"
|
||||
#include "gtkroot.h"
|
||||
#include "gtkbinlayout.h"
|
||||
#include "gtkshortcutcontroller.h"
|
||||
#include "gtkshortcuttrigger.h"
|
||||
#include "gtkshortcutaction.h"
|
||||
#include "gtkshortcut.h"
|
||||
|
||||
#include <cairo-gobject.h>
|
||||
|
||||
@@ -1260,56 +1263,22 @@ places_sidebar_show_error_message_cb (GtkPlacesSidebar *sidebar,
|
||||
}
|
||||
|
||||
static gboolean
|
||||
key_is_left_or_right (guint keyval,
|
||||
guint state)
|
||||
{
|
||||
guint modifiers;
|
||||
|
||||
modifiers = gtk_accelerator_get_default_mod_mask ();
|
||||
|
||||
return ((keyval == GDK_KEY_Right
|
||||
|| keyval == GDK_KEY_KP_Right
|
||||
|| keyval == GDK_KEY_Left
|
||||
|| keyval == GDK_KEY_KP_Left)
|
||||
&& (state & modifiers) == 0);
|
||||
}
|
||||
|
||||
static gboolean
|
||||
should_trigger_location_entry (GtkFileChooserWidget *impl,
|
||||
guint keyval,
|
||||
GdkModifierType state,
|
||||
const char **string)
|
||||
trigger_location_entry (GtkWidget *widget,
|
||||
GVariant *arguments,
|
||||
gpointer unused)
|
||||
{
|
||||
GtkFileChooserWidget *impl = GTK_FILE_CHOOSER_WIDGET (widget);
|
||||
GtkFileChooserWidgetPrivate *priv = gtk_file_chooser_widget_get_instance_private (impl);
|
||||
GdkModifierType no_text_input_mask;
|
||||
|
||||
if (priv->operation_mode == OPERATION_MODE_SEARCH)
|
||||
return FALSE;
|
||||
|
||||
no_text_input_mask =
|
||||
gtk_widget_get_modifier_mask (GTK_WIDGET (impl), GDK_MODIFIER_INTENT_NO_TEXT_INPUT);
|
||||
|
||||
if (state & no_text_input_mask)
|
||||
if (priv->action != GTK_FILE_CHOOSER_ACTION_OPEN &&
|
||||
priv->action != GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER)
|
||||
return FALSE;
|
||||
|
||||
switch (keyval)
|
||||
{
|
||||
case GDK_KEY_slash:
|
||||
case GDK_KEY_KP_Divide:
|
||||
*string = "/";
|
||||
return TRUE;
|
||||
|
||||
case GDK_KEY_period:
|
||||
*string = ".";
|
||||
return TRUE;
|
||||
|
||||
case GDK_KEY_asciitilde:
|
||||
*string = "~";
|
||||
return TRUE;
|
||||
|
||||
default:
|
||||
return FALSE;
|
||||
}
|
||||
location_popup_handler (impl, g_variant_get_string (arguments, NULL));
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/* Handles key press events on the file list, so that we can trap Enter to
|
||||
@@ -1325,21 +1294,6 @@ key_press_cb (GtkEventControllerKey *controller,
|
||||
{
|
||||
GtkFileChooserWidget *impl = (GtkFileChooserWidget *) data;
|
||||
GtkFileChooserWidgetPrivate *priv = gtk_file_chooser_widget_get_instance_private (impl);
|
||||
const char *string;
|
||||
|
||||
if (should_trigger_location_entry (impl, keyval, state, &string) &&
|
||||
(priv->action == GTK_FILE_CHOOSER_ACTION_OPEN ||
|
||||
priv->action == GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER))
|
||||
{
|
||||
location_popup_handler (impl, string);
|
||||
return GDK_EVENT_STOP;
|
||||
}
|
||||
|
||||
if (key_is_left_or_right (keyval, state))
|
||||
{
|
||||
if (gtk_widget_child_focus (priv->places_sidebar, GTK_DIR_LEFT))
|
||||
return GDK_EVENT_STOP;
|
||||
}
|
||||
|
||||
if ((keyval == GDK_KEY_Return
|
||||
|| keyval == GDK_KEY_ISO_Enter
|
||||
@@ -1374,28 +1328,15 @@ widget_key_press_cb (GtkEventControllerKey *controller,
|
||||
GtkFileChooserWidget *impl = (GtkFileChooserWidget *) data;
|
||||
GtkFileChooserWidgetPrivate *priv = gtk_file_chooser_widget_get_instance_private (impl);
|
||||
gboolean handled = FALSE;
|
||||
const char *string;
|
||||
|
||||
if (should_trigger_location_entry (impl, keyval, state, &string))
|
||||
priv->starting_search = TRUE;
|
||||
if (gtk_event_controller_key_forward (controller, priv->search_entry))
|
||||
{
|
||||
if (priv->action == GTK_FILE_CHOOSER_ACTION_OPEN ||
|
||||
priv->action == GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER)
|
||||
{
|
||||
location_popup_handler (impl, string);
|
||||
handled = TRUE;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
priv->starting_search = TRUE;
|
||||
if (gtk_event_controller_key_forward (controller, priv->search_entry))
|
||||
{
|
||||
if (priv->operation_mode != OPERATION_MODE_SEARCH &&
|
||||
priv->starting_search)
|
||||
operation_mode_set (impl, OPERATION_MODE_SEARCH);
|
||||
if (priv->operation_mode != OPERATION_MODE_SEARCH &&
|
||||
priv->starting_search)
|
||||
operation_mode_set (impl, OPERATION_MODE_SEARCH);
|
||||
|
||||
handled = TRUE;
|
||||
}
|
||||
handled = TRUE;
|
||||
}
|
||||
|
||||
return handled;
|
||||
@@ -2297,9 +2238,11 @@ file_list_show_popover (GtkFileChooserWidget *impl,
|
||||
|
||||
/* Callback used for the GtkWidget::popup-menu signal of the file list */
|
||||
static gboolean
|
||||
list_popup_menu_cb (GtkWidget *widget,
|
||||
GtkFileChooserWidget *impl)
|
||||
list_popup_menu_cb (GtkWidget *widget,
|
||||
GVariant *args,
|
||||
gpointer data)
|
||||
{
|
||||
GtkFileChooserWidget *impl = GTK_FILE_CHOOSER_WIDGET (data);
|
||||
GtkFileChooserWidgetPrivate *priv = gtk_file_chooser_widget_get_instance_private (impl);
|
||||
graphene_rect_t bounds;
|
||||
|
||||
@@ -8058,18 +8001,20 @@ show_hidden_handler (GtkFileChooserWidget *impl)
|
||||
}
|
||||
|
||||
static void
|
||||
add_normal_and_shifted_binding (GtkBindingSet *binding_set,
|
||||
add_normal_and_shifted_binding (GtkWidgetClass *widget_class,
|
||||
guint keyval,
|
||||
GdkModifierType modifiers,
|
||||
const gchar *signal_name)
|
||||
{
|
||||
gtk_binding_entry_add_signal (binding_set,
|
||||
keyval, modifiers,
|
||||
signal_name, 0);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
keyval, modifiers,
|
||||
signal_name,
|
||||
NULL);
|
||||
|
||||
gtk_binding_entry_add_signal (binding_set,
|
||||
keyval, modifiers | GDK_SHIFT_MASK,
|
||||
signal_name, 0);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
keyval, modifiers | GDK_SHIFT_MASK,
|
||||
signal_name,
|
||||
NULL);
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -8080,7 +8025,6 @@ gtk_file_chooser_widget_class_init (GtkFileChooserWidgetClass *class)
|
||||
};
|
||||
GObjectClass *gobject_class = G_OBJECT_CLASS (class);
|
||||
GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (class);
|
||||
GtkBindingSet *binding_set;
|
||||
gint i;
|
||||
|
||||
gobject_class->finalize = gtk_file_chooser_widget_finalize;
|
||||
@@ -8362,71 +8306,84 @@ gtk_file_chooser_widget_class_init (GtkFileChooserWidgetClass *class)
|
||||
NULL,
|
||||
G_TYPE_NONE, 0);
|
||||
|
||||
binding_set = gtk_binding_set_by_class (class);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_l, GDK_CONTROL_MASK,
|
||||
"location-toggle-popup",
|
||||
NULL);
|
||||
|
||||
gtk_binding_entry_add_signal (binding_set,
|
||||
GDK_KEY_l, GDK_CONTROL_MASK,
|
||||
"location-toggle-popup",
|
||||
0);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_v, GDK_CONTROL_MASK,
|
||||
"location-popup-on-paste",
|
||||
NULL);
|
||||
|
||||
gtk_binding_entry_add_signal (binding_set,
|
||||
GDK_KEY_v, GDK_CONTROL_MASK,
|
||||
"location-popup-on-paste",
|
||||
0);
|
||||
|
||||
add_normal_and_shifted_binding (binding_set,
|
||||
add_normal_and_shifted_binding (widget_class,
|
||||
GDK_KEY_Up, GDK_MOD1_MASK,
|
||||
"up-folder");
|
||||
|
||||
add_normal_and_shifted_binding (binding_set,
|
||||
add_normal_and_shifted_binding (widget_class,
|
||||
GDK_KEY_KP_Up, GDK_MOD1_MASK,
|
||||
"up-folder");
|
||||
|
||||
add_normal_and_shifted_binding (binding_set,
|
||||
add_normal_and_shifted_binding (widget_class,
|
||||
GDK_KEY_Down, GDK_MOD1_MASK,
|
||||
"down-folder");
|
||||
add_normal_and_shifted_binding (binding_set,
|
||||
add_normal_and_shifted_binding (widget_class,
|
||||
GDK_KEY_KP_Down, GDK_MOD1_MASK,
|
||||
"down-folder");
|
||||
|
||||
gtk_binding_entry_add_signal (binding_set,
|
||||
GDK_KEY_Home, GDK_MOD1_MASK,
|
||||
"home-folder",
|
||||
0);
|
||||
gtk_binding_entry_add_signal (binding_set,
|
||||
GDK_KEY_KP_Home, GDK_MOD1_MASK,
|
||||
"home-folder",
|
||||
0);
|
||||
gtk_binding_entry_add_signal (binding_set,
|
||||
GDK_KEY_d, GDK_MOD1_MASK,
|
||||
"desktop-folder",
|
||||
0);
|
||||
gtk_binding_entry_add_signal (binding_set,
|
||||
GDK_KEY_h, GDK_CONTROL_MASK,
|
||||
"show-hidden",
|
||||
0);
|
||||
gtk_binding_entry_add_signal (binding_set,
|
||||
GDK_KEY_s, GDK_MOD1_MASK,
|
||||
"search-shortcut",
|
||||
0);
|
||||
gtk_binding_entry_add_signal (binding_set,
|
||||
GDK_KEY_f, GDK_CONTROL_MASK,
|
||||
"search-shortcut",
|
||||
0);
|
||||
gtk_binding_entry_add_signal (binding_set,
|
||||
GDK_KEY_r, GDK_MOD1_MASK,
|
||||
"recent-shortcut",
|
||||
0);
|
||||
gtk_binding_entry_add_signal (binding_set,
|
||||
GDK_KEY_p, GDK_MOD1_MASK,
|
||||
"places-shortcut",
|
||||
0);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_Home, GDK_MOD1_MASK,
|
||||
"home-folder",
|
||||
NULL);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_KP_Home, GDK_MOD1_MASK,
|
||||
"home-folder",
|
||||
NULL);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_d, GDK_MOD1_MASK,
|
||||
"desktop-folder",
|
||||
NULL);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_h, GDK_CONTROL_MASK,
|
||||
"show-hidden",
|
||||
NULL);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_s, GDK_MOD1_MASK,
|
||||
"search-shortcut",
|
||||
NULL);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_f, GDK_CONTROL_MASK,
|
||||
"search-shortcut",
|
||||
NULL);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_r, GDK_MOD1_MASK,
|
||||
"recent-shortcut",
|
||||
NULL);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_p, GDK_MOD1_MASK,
|
||||
"places-shortcut",
|
||||
NULL);
|
||||
gtk_widget_class_add_binding (widget_class,
|
||||
GDK_KEY_slash, 0,
|
||||
trigger_location_entry,
|
||||
"s", "/");
|
||||
gtk_widget_class_add_binding (widget_class,
|
||||
GDK_KEY_KP_Divide, 0,
|
||||
trigger_location_entry,
|
||||
"s", "/");
|
||||
gtk_widget_class_add_binding (widget_class,
|
||||
GDK_KEY_period, 0,
|
||||
trigger_location_entry,
|
||||
"s", ".");
|
||||
gtk_widget_class_add_binding (widget_class,
|
||||
GDK_KEY_asciitilde, 0,
|
||||
trigger_location_entry,
|
||||
"s", "~");
|
||||
|
||||
for (i = 0; i < 10; i++)
|
||||
gtk_binding_entry_add_signal (binding_set,
|
||||
quick_bookmark_keyvals[i], GDK_MOD1_MASK,
|
||||
"quick-bookmark",
|
||||
1, G_TYPE_INT, i);
|
||||
for (i = 0; i < G_N_ELEMENTS (quick_bookmark_keyvals); i++)
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
quick_bookmark_keyvals[i], GDK_MOD1_MASK,
|
||||
"quick-bookmark",
|
||||
"(i)", i);
|
||||
|
||||
g_object_class_install_property (gobject_class, PROP_SEARCH_MODE,
|
||||
g_param_spec_boolean ("search-mode",
|
||||
@@ -8494,7 +8451,6 @@ gtk_file_chooser_widget_class_init (GtkFileChooserWidgetClass *class)
|
||||
/* And a *lot* of callbacks to bind ... */
|
||||
gtk_widget_class_bind_template_callback (widget_class, file_list_drag_drop_cb);
|
||||
gtk_widget_class_bind_template_callback (widget_class, file_list_drag_data_received_cb);
|
||||
gtk_widget_class_bind_template_callback (widget_class, list_popup_menu_cb);
|
||||
gtk_widget_class_bind_template_callback (widget_class, file_list_query_tooltip_cb);
|
||||
gtk_widget_class_bind_template_callback (widget_class, list_row_activated);
|
||||
gtk_widget_class_bind_template_callback (widget_class, file_list_drag_begin_cb);
|
||||
@@ -8534,8 +8490,23 @@ post_process_ui (GtkFileChooserWidget *impl)
|
||||
GtkCellRenderer *cell;
|
||||
GList *cells;
|
||||
GFile *file;
|
||||
GtkEventController *controller;
|
||||
GtkShortcutTrigger *trigger;
|
||||
GtkShortcutAction *action;
|
||||
GtkShortcut *shortcut;
|
||||
|
||||
/* Setup file list treeview */
|
||||
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 (list_popup_menu_cb, impl, NULL);
|
||||
shortcut = gtk_shortcut_new (trigger, action);
|
||||
gtk_shortcut_controller_add_shortcut (GTK_SHORTCUT_CONTROLLER (controller),
|
||||
shortcut);
|
||||
g_object_unref (shortcut);
|
||||
gtk_widget_add_controller (priv->browse_files_tree_view, controller);
|
||||
|
||||
selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (priv->browse_files_tree_view));
|
||||
gtk_tree_selection_set_select_function (selection,
|
||||
list_select_func,
|
||||
|
||||
+54
-48
@@ -78,7 +78,6 @@
|
||||
#include "gtkflowbox.h"
|
||||
|
||||
#include "gtkadjustment.h"
|
||||
#include "gtkbindings.h"
|
||||
#include "gtkcontainerprivate.h"
|
||||
#include "gtkcssnodeprivate.h"
|
||||
#include "gtkgesturedrag.h"
|
||||
@@ -2987,7 +2986,7 @@ gtk_flow_box_focus (GtkWidget *widget,
|
||||
}
|
||||
|
||||
static void
|
||||
gtk_flow_box_add_move_binding (GtkBindingSet *binding_set,
|
||||
gtk_flow_box_add_move_binding (GtkWidgetClass *widget_class,
|
||||
guint keyval,
|
||||
GdkModifierType modmask,
|
||||
GtkMovementStep step,
|
||||
@@ -3005,27 +3004,28 @@ gtk_flow_box_add_move_binding (GtkBindingSet *binding_set,
|
||||
modify_mod_mask = gdk_keymap_get_modifier_mask (gdk_display_get_keymap (display),
|
||||
GDK_MODIFIER_INTENT_MODIFY_SELECTION);
|
||||
}
|
||||
else
|
||||
{
|
||||
extend_mod_mask = GDK_SHIFT_MASK;
|
||||
modify_mod_mask = GDK_CONTROL_MASK;
|
||||
}
|
||||
|
||||
gtk_binding_entry_add_signal (binding_set, keyval, modmask,
|
||||
"move-cursor", 2,
|
||||
GTK_TYPE_MOVEMENT_STEP, step,
|
||||
G_TYPE_INT, count,
|
||||
NULL);
|
||||
gtk_binding_entry_add_signal (binding_set, keyval, modmask | extend_mod_mask,
|
||||
"move-cursor", 2,
|
||||
GTK_TYPE_MOVEMENT_STEP, step,
|
||||
G_TYPE_INT, count,
|
||||
NULL);
|
||||
gtk_binding_entry_add_signal (binding_set, keyval, modmask | modify_mod_mask,
|
||||
"move-cursor", 2,
|
||||
GTK_TYPE_MOVEMENT_STEP, step,
|
||||
G_TYPE_INT, count,
|
||||
NULL);
|
||||
gtk_binding_entry_add_signal (binding_set, keyval, modmask | extend_mod_mask | modify_mod_mask,
|
||||
"move-cursor", 2,
|
||||
GTK_TYPE_MOVEMENT_STEP, step,
|
||||
G_TYPE_INT, count,
|
||||
NULL);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
keyval, modmask,
|
||||
"move-cursor",
|
||||
"(ii)", step, count);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
keyval, modmask | extend_mod_mask,
|
||||
"move-cursor",
|
||||
"(ii)", step, count);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
keyval, modmask | modify_mod_mask,
|
||||
"move-cursor",
|
||||
"(ii)", step, count);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
keyval, modmask | extend_mod_mask | modify_mod_mask,
|
||||
"move-cursor",
|
||||
"(ii)", step, count);
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -3387,7 +3387,6 @@ gtk_flow_box_class_init (GtkFlowBoxClass *class)
|
||||
GObjectClass *object_class = G_OBJECT_CLASS (class);
|
||||
GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (class);
|
||||
GtkContainerClass *container_class = GTK_CONTAINER_CLASS (class);
|
||||
GtkBindingSet *binding_set;
|
||||
|
||||
object_class->finalize = gtk_flow_box_finalize;
|
||||
object_class->get_property = gtk_flow_box_get_property;
|
||||
@@ -3664,50 +3663,57 @@ gtk_flow_box_class_init (GtkFlowBoxClass *class)
|
||||
|
||||
widget_class->activate_signal = signals[ACTIVATE_CURSOR_CHILD];
|
||||
|
||||
binding_set = gtk_binding_set_by_class (class);
|
||||
gtk_flow_box_add_move_binding (binding_set, GDK_KEY_Home, 0,
|
||||
gtk_flow_box_add_move_binding (widget_class, GDK_KEY_Home, 0,
|
||||
GTK_MOVEMENT_BUFFER_ENDS, -1);
|
||||
gtk_flow_box_add_move_binding (binding_set, GDK_KEY_KP_Home, 0,
|
||||
gtk_flow_box_add_move_binding (widget_class, GDK_KEY_KP_Home, 0,
|
||||
GTK_MOVEMENT_BUFFER_ENDS, -1);
|
||||
gtk_flow_box_add_move_binding (binding_set, GDK_KEY_End, 0,
|
||||
gtk_flow_box_add_move_binding (widget_class, GDK_KEY_End, 0,
|
||||
GTK_MOVEMENT_BUFFER_ENDS, 1);
|
||||
gtk_flow_box_add_move_binding (binding_set, GDK_KEY_KP_End, 0,
|
||||
gtk_flow_box_add_move_binding (widget_class, GDK_KEY_KP_End, 0,
|
||||
GTK_MOVEMENT_BUFFER_ENDS, 1);
|
||||
gtk_flow_box_add_move_binding (binding_set, GDK_KEY_Up, 0,
|
||||
gtk_flow_box_add_move_binding (widget_class, GDK_KEY_Up, 0,
|
||||
GTK_MOVEMENT_DISPLAY_LINES, -1);
|
||||
gtk_flow_box_add_move_binding (binding_set, GDK_KEY_KP_Up, 0,
|
||||
gtk_flow_box_add_move_binding (widget_class, GDK_KEY_KP_Up, 0,
|
||||
GTK_MOVEMENT_DISPLAY_LINES, -1);
|
||||
gtk_flow_box_add_move_binding (binding_set, GDK_KEY_Down, 0,
|
||||
gtk_flow_box_add_move_binding (widget_class, GDK_KEY_Down, 0,
|
||||
GTK_MOVEMENT_DISPLAY_LINES, 1);
|
||||
gtk_flow_box_add_move_binding (binding_set, GDK_KEY_KP_Down, 0,
|
||||
gtk_flow_box_add_move_binding (widget_class, GDK_KEY_KP_Down, 0,
|
||||
GTK_MOVEMENT_DISPLAY_LINES, 1);
|
||||
gtk_flow_box_add_move_binding (binding_set, GDK_KEY_Page_Up, 0,
|
||||
gtk_flow_box_add_move_binding (widget_class, GDK_KEY_Page_Up, 0,
|
||||
GTK_MOVEMENT_PAGES, -1);
|
||||
gtk_flow_box_add_move_binding (binding_set, GDK_KEY_KP_Page_Up, 0,
|
||||
gtk_flow_box_add_move_binding (widget_class, GDK_KEY_KP_Page_Up, 0,
|
||||
GTK_MOVEMENT_PAGES, -1);
|
||||
gtk_flow_box_add_move_binding (binding_set, GDK_KEY_Page_Down, 0,
|
||||
gtk_flow_box_add_move_binding (widget_class, GDK_KEY_Page_Down, 0,
|
||||
GTK_MOVEMENT_PAGES, 1);
|
||||
gtk_flow_box_add_move_binding (binding_set, GDK_KEY_KP_Page_Down, 0,
|
||||
gtk_flow_box_add_move_binding (widget_class, GDK_KEY_KP_Page_Down, 0,
|
||||
GTK_MOVEMENT_PAGES, 1);
|
||||
|
||||
gtk_flow_box_add_move_binding (binding_set, GDK_KEY_Right, 0,
|
||||
gtk_flow_box_add_move_binding (widget_class, GDK_KEY_Right, 0,
|
||||
GTK_MOVEMENT_VISUAL_POSITIONS, 1);
|
||||
gtk_flow_box_add_move_binding (binding_set, GDK_KEY_KP_Right, 0,
|
||||
gtk_flow_box_add_move_binding (widget_class, GDK_KEY_KP_Right, 0,
|
||||
GTK_MOVEMENT_VISUAL_POSITIONS, 1);
|
||||
gtk_flow_box_add_move_binding (binding_set, GDK_KEY_Left, 0,
|
||||
gtk_flow_box_add_move_binding (widget_class, GDK_KEY_Left, 0,
|
||||
GTK_MOVEMENT_VISUAL_POSITIONS, -1);
|
||||
gtk_flow_box_add_move_binding (binding_set, GDK_KEY_KP_Left, 0,
|
||||
gtk_flow_box_add_move_binding (widget_class, GDK_KEY_KP_Left, 0,
|
||||
GTK_MOVEMENT_VISUAL_POSITIONS, -1);
|
||||
|
||||
gtk_binding_entry_add_signal (binding_set, GDK_KEY_space, GDK_CONTROL_MASK,
|
||||
"toggle-cursor-child", 0, NULL);
|
||||
gtk_binding_entry_add_signal (binding_set, GDK_KEY_KP_Space, GDK_CONTROL_MASK,
|
||||
"toggle-cursor-child", 0, NULL);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_space, GDK_CONTROL_MASK,
|
||||
"toggle-cursor-child",
|
||||
NULL);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_KP_Space, GDK_CONTROL_MASK,
|
||||
"toggle-cursor-child",
|
||||
NULL);
|
||||
|
||||
gtk_binding_entry_add_signal (binding_set, GDK_KEY_a, GDK_CONTROL_MASK,
|
||||
"select-all", 0);
|
||||
gtk_binding_entry_add_signal (binding_set, GDK_KEY_a, GDK_CONTROL_MASK | GDK_SHIFT_MASK,
|
||||
"unselect-all", 0);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_a, GDK_CONTROL_MASK,
|
||||
"select-all",
|
||||
NULL);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_a, GDK_CONTROL_MASK | GDK_SHIFT_MASK,
|
||||
"unselect-all",
|
||||
NULL);
|
||||
|
||||
gtk_widget_class_set_accessible_type (widget_class, GTK_TYPE_FLOW_BOX_ACCESSIBLE);
|
||||
gtk_widget_class_set_css_name (widget_class, I_("flowbox"));
|
||||
|
||||
+75
-65
@@ -21,7 +21,6 @@
|
||||
|
||||
#include "gtkaccessible.h"
|
||||
#include "gtkadjustmentprivate.h"
|
||||
#include "gtkbindings.h"
|
||||
#include "gtkcellareabox.h"
|
||||
#include "gtkcellareacontext.h"
|
||||
#include "gtkcelllayout.h"
|
||||
@@ -235,7 +234,7 @@ static gboolean gtk_icon_view_unselect_all_internal (GtkIco
|
||||
static void gtk_icon_view_update_rubberband (GtkIconView *icon_view);
|
||||
static void gtk_icon_view_item_invalidate_size (GtkIconViewItem *item);
|
||||
static void gtk_icon_view_invalidate_sizes (GtkIconView *icon_view);
|
||||
static void gtk_icon_view_add_move_binding (GtkBindingSet *binding_set,
|
||||
static void gtk_icon_view_add_move_binding (GtkWidgetClass *widget_class,
|
||||
guint keyval,
|
||||
guint modmask,
|
||||
GtkMovementStep step,
|
||||
@@ -338,16 +337,9 @@ G_DEFINE_TYPE_WITH_CODE (GtkIconView, gtk_icon_view, GTK_TYPE_CONTAINER,
|
||||
static void
|
||||
gtk_icon_view_class_init (GtkIconViewClass *klass)
|
||||
{
|
||||
GObjectClass *gobject_class;
|
||||
GtkWidgetClass *widget_class;
|
||||
GtkContainerClass *container_class;
|
||||
GtkBindingSet *binding_set;
|
||||
|
||||
binding_set = gtk_binding_set_by_class (klass);
|
||||
|
||||
gobject_class = (GObjectClass *) klass;
|
||||
widget_class = (GtkWidgetClass *) klass;
|
||||
container_class = (GtkContainerClass *) klass;
|
||||
GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
|
||||
GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
|
||||
GtkContainerClass *container_class = GTK_CONTAINER_CLASS (klass);
|
||||
|
||||
gobject_class->constructed = gtk_icon_view_constructed;
|
||||
gobject_class->dispose = gtk_icon_view_dispose;
|
||||
@@ -822,70 +814,88 @@ gtk_icon_view_class_init (GtkIconViewClass *klass)
|
||||
_gtk_marshal_BOOLEAN__ENUM_INTv);
|
||||
|
||||
/* Key bindings */
|
||||
gtk_binding_entry_add_signal (binding_set, GDK_KEY_a, GDK_CONTROL_MASK,
|
||||
"select-all", 0);
|
||||
gtk_binding_entry_add_signal (binding_set, GDK_KEY_a, GDK_CONTROL_MASK | GDK_SHIFT_MASK,
|
||||
"unselect-all", 0);
|
||||
gtk_binding_entry_add_signal (binding_set, GDK_KEY_space, GDK_CONTROL_MASK,
|
||||
"toggle-cursor-item", 0);
|
||||
gtk_binding_entry_add_signal (binding_set, GDK_KEY_KP_Space, GDK_CONTROL_MASK,
|
||||
"toggle-cursor-item", 0);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_a, GDK_CONTROL_MASK,
|
||||
"select-all",
|
||||
NULL);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_a, GDK_CONTROL_MASK | GDK_SHIFT_MASK,
|
||||
"unselect-all",
|
||||
NULL);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_space, GDK_CONTROL_MASK,
|
||||
"toggle-cursor-item",
|
||||
NULL);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_KP_Space, GDK_CONTROL_MASK,
|
||||
"toggle-cursor-item",
|
||||
NULL);
|
||||
|
||||
gtk_binding_entry_add_signal (binding_set, GDK_KEY_space, 0,
|
||||
"activate-cursor-item", 0);
|
||||
gtk_binding_entry_add_signal (binding_set, GDK_KEY_KP_Space, 0,
|
||||
"activate-cursor-item", 0);
|
||||
gtk_binding_entry_add_signal (binding_set, GDK_KEY_Return, 0,
|
||||
"activate-cursor-item", 0);
|
||||
gtk_binding_entry_add_signal (binding_set, GDK_KEY_ISO_Enter, 0,
|
||||
"activate-cursor-item", 0);
|
||||
gtk_binding_entry_add_signal (binding_set, GDK_KEY_KP_Enter, 0,
|
||||
"activate-cursor-item", 0);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_space, 0,
|
||||
"activate-cursor-item",
|
||||
NULL);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_KP_Space, 0,
|
||||
"activate-cursor-item",
|
||||
NULL);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_Return, 0,
|
||||
"activate-cursor-item",
|
||||
NULL);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_ISO_Enter, 0,
|
||||
"activate-cursor-item",
|
||||
NULL);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_KP_Enter, 0,
|
||||
"activate-cursor-item",
|
||||
NULL);
|
||||
|
||||
gtk_icon_view_add_move_binding (binding_set, GDK_KEY_Up, 0,
|
||||
gtk_icon_view_add_move_binding (widget_class, GDK_KEY_Up, 0,
|
||||
GTK_MOVEMENT_DISPLAY_LINES, -1);
|
||||
gtk_icon_view_add_move_binding (binding_set, GDK_KEY_KP_Up, 0,
|
||||
gtk_icon_view_add_move_binding (widget_class, GDK_KEY_KP_Up, 0,
|
||||
GTK_MOVEMENT_DISPLAY_LINES, -1);
|
||||
|
||||
gtk_icon_view_add_move_binding (binding_set, GDK_KEY_Down, 0,
|
||||
gtk_icon_view_add_move_binding (widget_class, GDK_KEY_Down, 0,
|
||||
GTK_MOVEMENT_DISPLAY_LINES, 1);
|
||||
gtk_icon_view_add_move_binding (binding_set, GDK_KEY_KP_Down, 0,
|
||||
gtk_icon_view_add_move_binding (widget_class, GDK_KEY_KP_Down, 0,
|
||||
GTK_MOVEMENT_DISPLAY_LINES, 1);
|
||||
|
||||
gtk_icon_view_add_move_binding (binding_set, GDK_KEY_p, GDK_CONTROL_MASK,
|
||||
gtk_icon_view_add_move_binding (widget_class, GDK_KEY_p, GDK_CONTROL_MASK,
|
||||
GTK_MOVEMENT_DISPLAY_LINES, -1);
|
||||
|
||||
gtk_icon_view_add_move_binding (binding_set, GDK_KEY_n, GDK_CONTROL_MASK,
|
||||
gtk_icon_view_add_move_binding (widget_class, GDK_KEY_n, GDK_CONTROL_MASK,
|
||||
GTK_MOVEMENT_DISPLAY_LINES, 1);
|
||||
|
||||
gtk_icon_view_add_move_binding (binding_set, GDK_KEY_Home, 0,
|
||||
gtk_icon_view_add_move_binding (widget_class, GDK_KEY_Home, 0,
|
||||
GTK_MOVEMENT_BUFFER_ENDS, -1);
|
||||
gtk_icon_view_add_move_binding (binding_set, GDK_KEY_KP_Home, 0,
|
||||
gtk_icon_view_add_move_binding (widget_class, GDK_KEY_KP_Home, 0,
|
||||
GTK_MOVEMENT_BUFFER_ENDS, -1);
|
||||
|
||||
gtk_icon_view_add_move_binding (binding_set, GDK_KEY_End, 0,
|
||||
gtk_icon_view_add_move_binding (widget_class, GDK_KEY_End, 0,
|
||||
GTK_MOVEMENT_BUFFER_ENDS, 1);
|
||||
gtk_icon_view_add_move_binding (binding_set, GDK_KEY_KP_End, 0,
|
||||
gtk_icon_view_add_move_binding (widget_class, GDK_KEY_KP_End, 0,
|
||||
GTK_MOVEMENT_BUFFER_ENDS, 1);
|
||||
|
||||
gtk_icon_view_add_move_binding (binding_set, GDK_KEY_Page_Up, 0,
|
||||
gtk_icon_view_add_move_binding (widget_class, GDK_KEY_Page_Up, 0,
|
||||
GTK_MOVEMENT_PAGES, -1);
|
||||
gtk_icon_view_add_move_binding (binding_set, GDK_KEY_KP_Page_Up, 0,
|
||||
gtk_icon_view_add_move_binding (widget_class, GDK_KEY_KP_Page_Up, 0,
|
||||
GTK_MOVEMENT_PAGES, -1);
|
||||
|
||||
gtk_icon_view_add_move_binding (binding_set, GDK_KEY_Page_Down, 0,
|
||||
gtk_icon_view_add_move_binding (widget_class, GDK_KEY_Page_Down, 0,
|
||||
GTK_MOVEMENT_PAGES, 1);
|
||||
gtk_icon_view_add_move_binding (binding_set, GDK_KEY_KP_Page_Down, 0,
|
||||
gtk_icon_view_add_move_binding (widget_class, GDK_KEY_KP_Page_Down, 0,
|
||||
GTK_MOVEMENT_PAGES, 1);
|
||||
|
||||
gtk_icon_view_add_move_binding (binding_set, GDK_KEY_Right, 0,
|
||||
gtk_icon_view_add_move_binding (widget_class, GDK_KEY_Right, 0,
|
||||
GTK_MOVEMENT_VISUAL_POSITIONS, 1);
|
||||
gtk_icon_view_add_move_binding (binding_set, GDK_KEY_Left, 0,
|
||||
gtk_icon_view_add_move_binding (widget_class, GDK_KEY_Left, 0,
|
||||
GTK_MOVEMENT_VISUAL_POSITIONS, -1);
|
||||
|
||||
gtk_icon_view_add_move_binding (binding_set, GDK_KEY_KP_Right, 0,
|
||||
gtk_icon_view_add_move_binding (widget_class, GDK_KEY_KP_Right, 0,
|
||||
GTK_MOVEMENT_VISUAL_POSITIONS, 1);
|
||||
gtk_icon_view_add_move_binding (binding_set, GDK_KEY_KP_Left, 0,
|
||||
gtk_icon_view_add_move_binding (widget_class, GDK_KEY_KP_Left, 0,
|
||||
GTK_MOVEMENT_VISUAL_POSITIONS, -1);
|
||||
|
||||
gtk_widget_class_set_accessible_type (widget_class, GTK_TYPE_ICON_VIEW_ACCESSIBLE);
|
||||
@@ -3410,35 +3420,35 @@ gtk_icon_view_build_items (GtkIconView *icon_view)
|
||||
}
|
||||
|
||||
static void
|
||||
gtk_icon_view_add_move_binding (GtkBindingSet *binding_set,
|
||||
gtk_icon_view_add_move_binding (GtkWidgetClass *widget_class,
|
||||
guint keyval,
|
||||
guint modmask,
|
||||
GtkMovementStep step,
|
||||
gint count)
|
||||
{
|
||||
|
||||
gtk_binding_entry_add_signal (binding_set, keyval, modmask,
|
||||
I_("move-cursor"), 2,
|
||||
G_TYPE_ENUM, step,
|
||||
G_TYPE_INT, count);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
keyval, modmask,
|
||||
I_("move-cursor"),
|
||||
"(ii)", step, count);
|
||||
|
||||
gtk_binding_entry_add_signal (binding_set, keyval, GDK_SHIFT_MASK,
|
||||
"move-cursor", 2,
|
||||
G_TYPE_ENUM, step,
|
||||
G_TYPE_INT, count);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
keyval, GDK_SHIFT_MASK,
|
||||
"move-cursor",
|
||||
"(ii)", step, count);
|
||||
|
||||
if ((modmask & GDK_CONTROL_MASK) == GDK_CONTROL_MASK)
|
||||
return;
|
||||
|
||||
gtk_binding_entry_add_signal (binding_set, keyval, GDK_CONTROL_MASK | GDK_SHIFT_MASK,
|
||||
"move-cursor", 2,
|
||||
G_TYPE_ENUM, step,
|
||||
G_TYPE_INT, count);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
keyval, GDK_CONTROL_MASK | GDK_SHIFT_MASK,
|
||||
"move-cursor",
|
||||
"(ii)", step, count);
|
||||
|
||||
gtk_binding_entry_add_signal (binding_set, keyval, GDK_CONTROL_MASK,
|
||||
"move-cursor", 2,
|
||||
G_TYPE_ENUM, step,
|
||||
G_TYPE_INT, count);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
keyval, GDK_CONTROL_MASK,
|
||||
"move-cursor",
|
||||
"(ii)", step, count);
|
||||
}
|
||||
|
||||
static gboolean
|
||||
|
||||
+6
-10
@@ -39,7 +39,6 @@
|
||||
#include "gtklabel.h"
|
||||
#include "gtkbutton.h"
|
||||
#include "gtkenums.h"
|
||||
#include "gtkbindings.h"
|
||||
#include "gtkdialog.h"
|
||||
#include "gtkrevealer.h"
|
||||
#include "gtkintl.h"
|
||||
@@ -323,12 +322,8 @@ gtk_info_bar_close (GtkInfoBar *info_bar)
|
||||
static void
|
||||
gtk_info_bar_class_init (GtkInfoBarClass *klass)
|
||||
{
|
||||
GtkWidgetClass *widget_class;
|
||||
GObjectClass *object_class;
|
||||
GtkBindingSet *binding_set;
|
||||
|
||||
widget_class = GTK_WIDGET_CLASS (klass);
|
||||
object_class = G_OBJECT_CLASS (klass);
|
||||
GObjectClass *object_class = G_OBJECT_CLASS (klass);
|
||||
GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
|
||||
|
||||
object_class->get_property = gtk_info_bar_get_property;
|
||||
object_class->set_property = gtk_info_bar_set_property;
|
||||
@@ -407,9 +402,10 @@ gtk_info_bar_class_init (GtkInfoBarClass *klass)
|
||||
NULL,
|
||||
G_TYPE_NONE, 0);
|
||||
|
||||
binding_set = gtk_binding_set_by_class (klass);
|
||||
|
||||
gtk_binding_entry_add_signal (binding_set, GDK_KEY_Escape, 0, "close", 0);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_Escape, 0,
|
||||
"close",
|
||||
NULL);
|
||||
|
||||
/* Bind class to template
|
||||
*/
|
||||
|
||||
+261
-316
@@ -26,7 +26,6 @@
|
||||
|
||||
#include "gtklabelprivate.h"
|
||||
|
||||
#include "gtkbindings.h"
|
||||
#include "gtkbuildable.h"
|
||||
#include "gtkbuilderprivate.h"
|
||||
#include "gtkcssnodeprivate.h"
|
||||
@@ -42,11 +41,13 @@
|
||||
#include "gtkmain.h"
|
||||
#include "gtkmarshalers.h"
|
||||
#include "gtkmenuitem.h"
|
||||
#include "gtkmenushellprivate.h"
|
||||
#include "gtknotebook.h"
|
||||
#include "gtkpango.h"
|
||||
#include "gtkprivate.h"
|
||||
#include "gtkseparatormenuitem.h"
|
||||
#include "gtkshortcut.h"
|
||||
#include "gtkshortcutcontroller.h"
|
||||
#include "gtkshortcuttrigger.h"
|
||||
#include "gtkshow.h"
|
||||
#include "gtksnapshot.h"
|
||||
#include "gtkstylecontextprivate.h"
|
||||
@@ -265,12 +266,6 @@ struct _GtkLabelClass
|
||||
{
|
||||
GtkWidgetClass parent_class;
|
||||
|
||||
void (* move_cursor) (GtkLabel *label,
|
||||
GtkMovementStep step,
|
||||
gint count,
|
||||
gboolean extend_selection);
|
||||
void (* copy_clipboard) (GtkLabel *label);
|
||||
|
||||
gboolean (*activate_link) (GtkLabel *label,
|
||||
const gchar *uri);
|
||||
};
|
||||
@@ -279,7 +274,7 @@ struct _GtkLabelPrivate
|
||||
{
|
||||
GtkLabelSelectionInfo *select_info;
|
||||
GtkWidget *mnemonic_widget;
|
||||
GtkWindow *mnemonic_window;
|
||||
GtkEventController *mnemonic_controller;
|
||||
|
||||
PangoAttrList *attrs;
|
||||
PangoAttrList *markup_attrs;
|
||||
@@ -378,10 +373,7 @@ struct _GtkLabelSelectionInfo
|
||||
};
|
||||
|
||||
enum {
|
||||
MOVE_CURSOR,
|
||||
COPY_CLIPBOARD,
|
||||
ACTIVATE_LINK,
|
||||
ACTIVATE_CURRENT_LINK,
|
||||
LAST_SIGNAL
|
||||
};
|
||||
|
||||
@@ -417,7 +409,6 @@ static GParamSpec *label_props[NUM_PROPERTIES] = { NULL, };
|
||||
static guint signals[LAST_SIGNAL] = { 0 };
|
||||
|
||||
static GQuark quark_shortcuts_connected;
|
||||
static GQuark quark_mnemonic_menu;
|
||||
static GQuark quark_mnemonics_visible_connected;
|
||||
static GQuark quark_gtk_signal;
|
||||
static GQuark quark_link;
|
||||
@@ -482,8 +473,11 @@ static void gtk_label_set_markup_internal (GtkLabel *label,
|
||||
gboolean with_uline);
|
||||
static void gtk_label_recalculate (GtkLabel *label);
|
||||
static void gtk_label_root (GtkWidget *widget);
|
||||
static void gtk_label_unroot (GtkWidget *widget);
|
||||
static gboolean gtk_label_popup_menu (GtkWidget *widget);
|
||||
static void gtk_label_map (GtkWidget *widget);
|
||||
static void gtk_label_unmap (GtkWidget *widget);
|
||||
static gboolean gtk_label_popup_menu (GtkWidget *widget,
|
||||
GVariant *args,
|
||||
gpointer user_data);
|
||||
static void gtk_label_do_popup (GtkLabel *label,
|
||||
double x,
|
||||
double y);
|
||||
@@ -504,9 +498,7 @@ static void gtk_label_update_active_link (GtkWidget *widget,
|
||||
|
||||
static gboolean gtk_label_mnemonic_activate (GtkWidget *widget,
|
||||
gboolean group_cycling);
|
||||
static void gtk_label_setup_mnemonic (GtkLabel *label,
|
||||
GtkWidget *toplevel,
|
||||
guint last_key);
|
||||
static void gtk_label_setup_mnemonic (GtkLabel *label);
|
||||
static void gtk_label_drag_data_get (GtkWidget *widget,
|
||||
GdkDrag *drag,
|
||||
GtkSelectionData *selection_data);
|
||||
@@ -549,7 +541,6 @@ static gint gtk_label_move_backward_word (GtkLabel *label,
|
||||
static void gtk_label_clear_links (GtkLabel *label);
|
||||
static gboolean gtk_label_activate_link (GtkLabel *label,
|
||||
const gchar *uri);
|
||||
static void gtk_label_activate_current_link (GtkLabel *label);
|
||||
static GtkLabelLink *gtk_label_get_current_link (GtkLabel *label);
|
||||
static void emit_activate_link (GtkLabel *label,
|
||||
GtkLabelLink *link);
|
||||
@@ -588,6 +579,9 @@ static void gtk_label_activate_link_open (GtkWidget *label,
|
||||
static void gtk_label_activate_link_copy (GtkWidget *label,
|
||||
const char *name,
|
||||
GVariant *parameter);
|
||||
static void gtk_label_activate_edit_move_cursor (GtkWidget *label,
|
||||
const char *name,
|
||||
GVariant *parameter);
|
||||
static void gtk_label_nop (GtkWidget *label,
|
||||
const char *name,
|
||||
GVariant *parameter);
|
||||
@@ -613,7 +607,7 @@ G_DEFINE_TYPE_WITH_CODE (GtkLabel, gtk_label, GTK_TYPE_WIDGET,
|
||||
gtk_label_buildable_interface_init))
|
||||
|
||||
static void
|
||||
add_move_binding (GtkBindingSet *binding_set,
|
||||
add_move_binding (GtkWidgetClass *widget_class,
|
||||
guint keyval,
|
||||
guint modmask,
|
||||
GtkMovementStep step,
|
||||
@@ -621,18 +615,16 @@ add_move_binding (GtkBindingSet *binding_set,
|
||||
{
|
||||
g_return_if_fail ((modmask & GDK_SHIFT_MASK) == 0);
|
||||
|
||||
gtk_binding_entry_add_signal (binding_set, keyval, modmask,
|
||||
"move-cursor", 3,
|
||||
G_TYPE_ENUM, step,
|
||||
G_TYPE_INT, count,
|
||||
G_TYPE_BOOLEAN, FALSE);
|
||||
gtk_widget_class_bind_action (widget_class,
|
||||
keyval, modmask,
|
||||
"edit.move-cursor", "(iib)",
|
||||
step, count, FALSE);
|
||||
|
||||
/* Selection-extending version */
|
||||
gtk_binding_entry_add_signal (binding_set, keyval, modmask | GDK_SHIFT_MASK,
|
||||
"move-cursor", 3,
|
||||
G_TYPE_ENUM, step,
|
||||
G_TYPE_INT, count,
|
||||
G_TYPE_BOOLEAN, TRUE);
|
||||
gtk_widget_class_bind_action (widget_class,
|
||||
keyval, modmask | GDK_SHIFT_MASK,
|
||||
"edit.move-cursor", "(iib)",
|
||||
step, count, TRUE);
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -640,7 +632,6 @@ gtk_label_class_init (GtkLabelClass *class)
|
||||
{
|
||||
GObjectClass *gobject_class = G_OBJECT_CLASS (class);
|
||||
GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (class);
|
||||
GtkBindingSet *binding_set;
|
||||
|
||||
gobject_class->set_property = gtk_label_set_property;
|
||||
gobject_class->get_property = gtk_label_get_property;
|
||||
@@ -655,96 +646,17 @@ gtk_label_class_init (GtkLabelClass *class)
|
||||
widget_class->realize = gtk_label_realize;
|
||||
widget_class->unrealize = gtk_label_unrealize;
|
||||
widget_class->root = gtk_label_root;
|
||||
widget_class->unroot = gtk_label_unroot;
|
||||
widget_class->map = gtk_label_map;
|
||||
widget_class->unmap = gtk_label_unmap;
|
||||
widget_class->mnemonic_activate = gtk_label_mnemonic_activate;
|
||||
widget_class->popup_menu = gtk_label_popup_menu;
|
||||
widget_class->drag_data_get = gtk_label_drag_data_get;
|
||||
widget_class->grab_focus = gtk_label_grab_focus;
|
||||
widget_class->focus = gtk_label_focus;
|
||||
widget_class->get_request_mode = gtk_label_get_request_mode;
|
||||
widget_class->measure = gtk_label_measure;
|
||||
|
||||
class->move_cursor = gtk_label_move_cursor;
|
||||
class->copy_clipboard = gtk_label_copy_clipboard;
|
||||
class->activate_link = gtk_label_activate_link;
|
||||
|
||||
/**
|
||||
* GtkLabel::move-cursor:
|
||||
* @entry: the object which received the signal
|
||||
* @step: the granularity of the move, as a #GtkMovementStep
|
||||
* @count: the number of @step units to move
|
||||
* @extend_selection: %TRUE if the move should extend the selection
|
||||
*
|
||||
* The ::move-cursor signal is a
|
||||
* [keybinding signal][GtkBindingSignal]
|
||||
* which gets emitted when the user initiates a cursor movement.
|
||||
* If the cursor is not visible in @entry, this signal causes
|
||||
* the viewport to be moved instead.
|
||||
*
|
||||
* Applications should not connect to it, but may emit it with
|
||||
* g_signal_emit_by_name() if they need to control the cursor
|
||||
* programmatically.
|
||||
*
|
||||
* The default bindings for this signal come in two variants,
|
||||
* the variant with the Shift modifier extends the selection,
|
||||
* the variant without the Shift modifer does not.
|
||||
* There are too many key combinations to list them all here.
|
||||
* - Arrow keys move by individual characters/lines
|
||||
* - Ctrl-arrow key combinations move by words/paragraphs
|
||||
* - Home/End keys move to the ends of the buffer
|
||||
*/
|
||||
signals[MOVE_CURSOR] =
|
||||
g_signal_new (I_("move-cursor"),
|
||||
G_OBJECT_CLASS_TYPE (gobject_class),
|
||||
G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION,
|
||||
G_STRUCT_OFFSET (GtkLabelClass, move_cursor),
|
||||
NULL, NULL,
|
||||
_gtk_marshal_VOID__ENUM_INT_BOOLEAN,
|
||||
G_TYPE_NONE, 3,
|
||||
GTK_TYPE_MOVEMENT_STEP,
|
||||
G_TYPE_INT,
|
||||
G_TYPE_BOOLEAN);
|
||||
|
||||
/**
|
||||
* GtkLabel::copy-clipboard:
|
||||
* @label: the object which received the signal
|
||||
*
|
||||
* The ::copy-clipboard signal is a
|
||||
* [keybinding signal][GtkBindingSignal]
|
||||
* which gets emitted to copy the selection to the clipboard.
|
||||
*
|
||||
* The default binding for this signal is Ctrl-c.
|
||||
*/
|
||||
signals[COPY_CLIPBOARD] =
|
||||
g_signal_new (I_("copy-clipboard"),
|
||||
G_OBJECT_CLASS_TYPE (gobject_class),
|
||||
G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION,
|
||||
G_STRUCT_OFFSET (GtkLabelClass, copy_clipboard),
|
||||
NULL, NULL,
|
||||
NULL,
|
||||
G_TYPE_NONE, 0);
|
||||
|
||||
/**
|
||||
* GtkLabel::activate-current-link:
|
||||
* @label: The label on which the signal was emitted
|
||||
*
|
||||
* A [keybinding signal][GtkBindingSignal]
|
||||
* which gets emitted when the user activates a link in the label.
|
||||
*
|
||||
* Applications may also emit the signal with g_signal_emit_by_name()
|
||||
* if they need to control activation of URIs programmatically.
|
||||
*
|
||||
* The default bindings for this signal are all forms of the Enter key.
|
||||
*/
|
||||
signals[ACTIVATE_CURRENT_LINK] =
|
||||
g_signal_new_class_handler (I_("activate-current-link"),
|
||||
G_TYPE_FROM_CLASS (gobject_class),
|
||||
G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION,
|
||||
G_CALLBACK (gtk_label_activate_current_link),
|
||||
NULL, NULL,
|
||||
NULL,
|
||||
G_TYPE_NONE, 0);
|
||||
|
||||
/**
|
||||
* GtkLabel::activate-link:
|
||||
* @label: The label on which the signal was emitted
|
||||
@@ -1035,145 +947,191 @@ gtk_label_class_init (GtkLabelClass *class)
|
||||
|
||||
g_object_class_install_properties (gobject_class, NUM_PROPERTIES, label_props);
|
||||
|
||||
/*
|
||||
* Key bindings
|
||||
*/
|
||||
binding_set = gtk_binding_set_by_class (class);
|
||||
|
||||
/* Moving the insertion point */
|
||||
add_move_binding (binding_set, GDK_KEY_Right, 0,
|
||||
GTK_MOVEMENT_VISUAL_POSITIONS, 1);
|
||||
|
||||
add_move_binding (binding_set, GDK_KEY_Left, 0,
|
||||
GTK_MOVEMENT_VISUAL_POSITIONS, -1);
|
||||
|
||||
add_move_binding (binding_set, GDK_KEY_KP_Right, 0,
|
||||
GTK_MOVEMENT_VISUAL_POSITIONS, 1);
|
||||
|
||||
add_move_binding (binding_set, GDK_KEY_KP_Left, 0,
|
||||
GTK_MOVEMENT_VISUAL_POSITIONS, -1);
|
||||
|
||||
add_move_binding (binding_set, GDK_KEY_f, GDK_CONTROL_MASK,
|
||||
GTK_MOVEMENT_LOGICAL_POSITIONS, 1);
|
||||
|
||||
add_move_binding (binding_set, GDK_KEY_b, GDK_CONTROL_MASK,
|
||||
GTK_MOVEMENT_LOGICAL_POSITIONS, -1);
|
||||
|
||||
add_move_binding (binding_set, GDK_KEY_Right, GDK_CONTROL_MASK,
|
||||
GTK_MOVEMENT_WORDS, 1);
|
||||
|
||||
add_move_binding (binding_set, GDK_KEY_Left, GDK_CONTROL_MASK,
|
||||
GTK_MOVEMENT_WORDS, -1);
|
||||
|
||||
add_move_binding (binding_set, GDK_KEY_KP_Right, GDK_CONTROL_MASK,
|
||||
GTK_MOVEMENT_WORDS, 1);
|
||||
|
||||
add_move_binding (binding_set, GDK_KEY_KP_Left, GDK_CONTROL_MASK,
|
||||
GTK_MOVEMENT_WORDS, -1);
|
||||
|
||||
/* select all */
|
||||
gtk_binding_entry_add_signal (binding_set, GDK_KEY_a, GDK_CONTROL_MASK,
|
||||
"move-cursor", 3,
|
||||
G_TYPE_ENUM, GTK_MOVEMENT_PARAGRAPH_ENDS,
|
||||
G_TYPE_INT, -1,
|
||||
G_TYPE_BOOLEAN, FALSE);
|
||||
|
||||
gtk_binding_entry_add_signal (binding_set, GDK_KEY_a, GDK_CONTROL_MASK,
|
||||
"move-cursor", 3,
|
||||
G_TYPE_ENUM, GTK_MOVEMENT_PARAGRAPH_ENDS,
|
||||
G_TYPE_INT, 1,
|
||||
G_TYPE_BOOLEAN, TRUE);
|
||||
|
||||
gtk_binding_entry_add_signal (binding_set, GDK_KEY_slash, GDK_CONTROL_MASK,
|
||||
"move-cursor", 3,
|
||||
G_TYPE_ENUM, GTK_MOVEMENT_PARAGRAPH_ENDS,
|
||||
G_TYPE_INT, -1,
|
||||
G_TYPE_BOOLEAN, FALSE);
|
||||
|
||||
gtk_binding_entry_add_signal (binding_set, GDK_KEY_slash, GDK_CONTROL_MASK,
|
||||
"move-cursor", 3,
|
||||
G_TYPE_ENUM, GTK_MOVEMENT_PARAGRAPH_ENDS,
|
||||
G_TYPE_INT, 1,
|
||||
G_TYPE_BOOLEAN, TRUE);
|
||||
|
||||
/* unselect all */
|
||||
gtk_binding_entry_add_signal (binding_set, GDK_KEY_a, GDK_SHIFT_MASK | GDK_CONTROL_MASK,
|
||||
"move-cursor", 3,
|
||||
G_TYPE_ENUM, GTK_MOVEMENT_PARAGRAPH_ENDS,
|
||||
G_TYPE_INT, 0,
|
||||
G_TYPE_BOOLEAN, FALSE);
|
||||
|
||||
gtk_binding_entry_add_signal (binding_set, GDK_KEY_backslash, GDK_CONTROL_MASK,
|
||||
"move-cursor", 3,
|
||||
G_TYPE_ENUM, GTK_MOVEMENT_PARAGRAPH_ENDS,
|
||||
G_TYPE_INT, 0,
|
||||
G_TYPE_BOOLEAN, FALSE);
|
||||
|
||||
add_move_binding (binding_set, GDK_KEY_f, GDK_MOD1_MASK,
|
||||
GTK_MOVEMENT_WORDS, 1);
|
||||
|
||||
add_move_binding (binding_set, GDK_KEY_b, GDK_MOD1_MASK,
|
||||
GTK_MOVEMENT_WORDS, -1);
|
||||
|
||||
add_move_binding (binding_set, GDK_KEY_Home, 0,
|
||||
GTK_MOVEMENT_DISPLAY_LINE_ENDS, -1);
|
||||
|
||||
add_move_binding (binding_set, GDK_KEY_End, 0,
|
||||
GTK_MOVEMENT_DISPLAY_LINE_ENDS, 1);
|
||||
|
||||
add_move_binding (binding_set, GDK_KEY_KP_Home, 0,
|
||||
GTK_MOVEMENT_DISPLAY_LINE_ENDS, -1);
|
||||
|
||||
add_move_binding (binding_set, GDK_KEY_KP_End, 0,
|
||||
GTK_MOVEMENT_DISPLAY_LINE_ENDS, 1);
|
||||
|
||||
add_move_binding (binding_set, GDK_KEY_Home, GDK_CONTROL_MASK,
|
||||
GTK_MOVEMENT_BUFFER_ENDS, -1);
|
||||
|
||||
add_move_binding (binding_set, GDK_KEY_End, GDK_CONTROL_MASK,
|
||||
GTK_MOVEMENT_BUFFER_ENDS, 1);
|
||||
|
||||
add_move_binding (binding_set, GDK_KEY_KP_Home, GDK_CONTROL_MASK,
|
||||
GTK_MOVEMENT_BUFFER_ENDS, -1);
|
||||
|
||||
add_move_binding (binding_set, GDK_KEY_KP_End, GDK_CONTROL_MASK,
|
||||
GTK_MOVEMENT_BUFFER_ENDS, 1);
|
||||
|
||||
/* copy */
|
||||
gtk_binding_entry_add_signal (binding_set, GDK_KEY_c, GDK_CONTROL_MASK,
|
||||
"copy-clipboard", 0);
|
||||
|
||||
gtk_binding_entry_add_signal (binding_set, GDK_KEY_Return, 0,
|
||||
"activate-current-link", 0);
|
||||
gtk_binding_entry_add_signal (binding_set, GDK_KEY_ISO_Enter, 0,
|
||||
"activate-current-link", 0);
|
||||
gtk_binding_entry_add_signal (binding_set, GDK_KEY_KP_Enter, 0,
|
||||
"activate-current-link", 0);
|
||||
|
||||
gtk_widget_class_set_accessible_type (widget_class, GTK_TYPE_LABEL_ACCESSIBLE);
|
||||
|
||||
gtk_widget_class_set_css_name (widget_class, I_("label"));
|
||||
|
||||
quark_shortcuts_connected = g_quark_from_static_string ("gtk-label-shortcuts-connected");
|
||||
quark_mnemonic_menu = g_quark_from_static_string ("gtk-mnemonic-menu");
|
||||
quark_mnemonics_visible_connected = g_quark_from_static_string ("gtk-label-mnemonics-visible-connected");
|
||||
quark_gtk_signal = g_quark_from_static_string ("gtk-signal");
|
||||
quark_link = g_quark_from_static_string ("link");
|
||||
/* Actions */
|
||||
|
||||
gtk_widget_class_install_action (widget_class, "clipboard.cut", NULL,
|
||||
gtk_label_nop);
|
||||
|
||||
/**
|
||||
* GtkLabel|clipboard.copy:
|
||||
*
|
||||
* The clipboard.copy action puts the current selection
|
||||
* on the clipboard. It is enabled when the selection is nonempty.
|
||||
*
|
||||
* The default binding for this action is Ctrl-c.
|
||||
*/
|
||||
gtk_widget_class_install_action (widget_class, "clipboard.copy", NULL,
|
||||
gtk_label_activate_clipboard_copy);
|
||||
gtk_widget_class_install_action (widget_class, "clipboard.paste", NULL,
|
||||
gtk_label_nop);
|
||||
gtk_widget_class_install_action (widget_class, "selection.delete", NULL,
|
||||
gtk_label_nop);
|
||||
|
||||
/**
|
||||
* GtkLabel|selection.select-all:
|
||||
*
|
||||
* The selection.select-all action selects all the text.
|
||||
* It is enabled when the GtkLabel contains text.
|
||||
*
|
||||
* The default binding for this action is Ctrl-a.
|
||||
*/
|
||||
gtk_widget_class_install_action (widget_class, "selection.select-all", NULL,
|
||||
gtk_label_activate_selection_select_all);
|
||||
|
||||
/**
|
||||
* GtkLabel|link.open:
|
||||
*
|
||||
* The link.open action calls gtk_show_uri() on the currently
|
||||
* focused link. It is enabled when a link is focused and there
|
||||
* is no selection.
|
||||
*/
|
||||
gtk_widget_class_install_action (widget_class, "link.open", NULL,
|
||||
gtk_label_activate_link_open);
|
||||
|
||||
/**
|
||||
* GtkLabel|link.copy:
|
||||
*
|
||||
* The link.copy action copies the currently focused link to
|
||||
* the clipboard. It is enabled when a link is focused and
|
||||
* there is no selection.
|
||||
*/
|
||||
gtk_widget_class_install_action (widget_class, "link.copy", NULL,
|
||||
gtk_label_activate_link_copy);
|
||||
|
||||
/**
|
||||
* GtkLabel|edit.move-cursor:
|
||||
* @granularity: a #GtkMovementStep defining the granularity of movement
|
||||
* @count: the number of steps to move the cursor
|
||||
* @extend: %TRUE to extend the selection
|
||||
*
|
||||
* The edit.move-cursor action changes the position of the
|
||||
* text caret in the text, and may extend the selection while
|
||||
* doing so.
|
||||
*
|
||||
* The default bindings for this action include
|
||||
* the Left and Right arrow keys, Home and End.
|
||||
*
|
||||
* All bindings can be used with the Shift modifier
|
||||
* to extend the selection.
|
||||
*/
|
||||
gtk_widget_class_install_action (widget_class, "edit.move-cursor", "(iib)",
|
||||
gtk_label_activate_edit_move_cursor);
|
||||
|
||||
/*
|
||||
* Key bindings
|
||||
*/
|
||||
|
||||
/* Moving the insertion point */
|
||||
add_move_binding (widget_class, GDK_KEY_Right, 0,
|
||||
GTK_MOVEMENT_VISUAL_POSITIONS, 1);
|
||||
|
||||
add_move_binding (widget_class, GDK_KEY_Left, 0,
|
||||
GTK_MOVEMENT_VISUAL_POSITIONS, -1);
|
||||
|
||||
add_move_binding (widget_class, GDK_KEY_KP_Right, 0,
|
||||
GTK_MOVEMENT_VISUAL_POSITIONS, 1);
|
||||
|
||||
add_move_binding (widget_class, GDK_KEY_KP_Left, 0,
|
||||
GTK_MOVEMENT_VISUAL_POSITIONS, -1);
|
||||
|
||||
add_move_binding (widget_class, GDK_KEY_f, GDK_CONTROL_MASK,
|
||||
GTK_MOVEMENT_LOGICAL_POSITIONS, 1);
|
||||
|
||||
add_move_binding (widget_class, GDK_KEY_b, GDK_CONTROL_MASK,
|
||||
GTK_MOVEMENT_LOGICAL_POSITIONS, -1);
|
||||
|
||||
add_move_binding (widget_class, GDK_KEY_Right, GDK_CONTROL_MASK,
|
||||
GTK_MOVEMENT_WORDS, 1);
|
||||
|
||||
add_move_binding (widget_class, GDK_KEY_Left, GDK_CONTROL_MASK,
|
||||
GTK_MOVEMENT_WORDS, -1);
|
||||
|
||||
add_move_binding (widget_class, GDK_KEY_KP_Right, GDK_CONTROL_MASK,
|
||||
GTK_MOVEMENT_WORDS, 1);
|
||||
|
||||
add_move_binding (widget_class, GDK_KEY_KP_Left, GDK_CONTROL_MASK,
|
||||
GTK_MOVEMENT_WORDS, -1);
|
||||
|
||||
/* select all */
|
||||
gtk_widget_class_bind_action (widget_class,
|
||||
GDK_KEY_a, GDK_CONTROL_MASK,
|
||||
"selection.select-all", NULL);
|
||||
gtk_widget_class_bind_action (widget_class,
|
||||
GDK_KEY_slash, GDK_CONTROL_MASK,
|
||||
"selection.select-all", NULL);
|
||||
|
||||
/* unselect all */
|
||||
gtk_widget_class_bind_action (widget_class,
|
||||
GDK_KEY_a, GDK_SHIFT_MASK | GDK_CONTROL_MASK,
|
||||
"edit.move-cursor", "(iib)",
|
||||
GTK_MOVEMENT_PARAGRAPH_ENDS, 0, FALSE);
|
||||
|
||||
gtk_widget_class_bind_action (widget_class,
|
||||
GDK_KEY_backslash, GDK_CONTROL_MASK,
|
||||
"edit.move-cursor", "(iib)",
|
||||
GTK_MOVEMENT_PARAGRAPH_ENDS, 0, FALSE);
|
||||
|
||||
add_move_binding (widget_class, GDK_KEY_f, GDK_MOD1_MASK,
|
||||
GTK_MOVEMENT_WORDS, 1);
|
||||
|
||||
add_move_binding (widget_class, GDK_KEY_b, GDK_MOD1_MASK,
|
||||
GTK_MOVEMENT_WORDS, -1);
|
||||
|
||||
add_move_binding (widget_class, GDK_KEY_Home, 0,
|
||||
GTK_MOVEMENT_DISPLAY_LINE_ENDS, -1);
|
||||
|
||||
add_move_binding (widget_class, GDK_KEY_End, 0,
|
||||
GTK_MOVEMENT_DISPLAY_LINE_ENDS, 1);
|
||||
|
||||
add_move_binding (widget_class, GDK_KEY_KP_Home, 0,
|
||||
GTK_MOVEMENT_DISPLAY_LINE_ENDS, -1);
|
||||
|
||||
add_move_binding (widget_class, GDK_KEY_KP_End, 0,
|
||||
GTK_MOVEMENT_DISPLAY_LINE_ENDS, 1);
|
||||
|
||||
add_move_binding (widget_class, GDK_KEY_Home, GDK_CONTROL_MASK,
|
||||
GTK_MOVEMENT_BUFFER_ENDS, -1);
|
||||
|
||||
add_move_binding (widget_class, GDK_KEY_End, GDK_CONTROL_MASK,
|
||||
GTK_MOVEMENT_BUFFER_ENDS, 1);
|
||||
|
||||
add_move_binding (widget_class, GDK_KEY_KP_Home, GDK_CONTROL_MASK,
|
||||
GTK_MOVEMENT_BUFFER_ENDS, -1);
|
||||
|
||||
add_move_binding (widget_class, GDK_KEY_KP_End, GDK_CONTROL_MASK,
|
||||
GTK_MOVEMENT_BUFFER_ENDS, 1);
|
||||
|
||||
/* copy */
|
||||
gtk_widget_class_bind_action (widget_class,
|
||||
GDK_KEY_c, GDK_CONTROL_MASK,
|
||||
"clipboard.copy", NULL);
|
||||
|
||||
gtk_widget_class_bind_action (widget_class,
|
||||
GDK_KEY_Return, 0,
|
||||
"link.open", NULL);
|
||||
gtk_widget_class_bind_action (widget_class,
|
||||
GDK_KEY_ISO_Enter, 0,
|
||||
"link.open", NULL);
|
||||
gtk_widget_class_bind_action (widget_class,
|
||||
GDK_KEY_KP_Enter, 0,
|
||||
"link.open", NULL);
|
||||
|
||||
/* Context menu */
|
||||
gtk_widget_class_add_binding (widget_class,
|
||||
GDK_KEY_F10, GDK_SHIFT_MASK,
|
||||
gtk_label_popup_menu, NULL);
|
||||
gtk_widget_class_add_binding (widget_class,
|
||||
GDK_KEY_Menu, 0,
|
||||
gtk_label_popup_menu, NULL);
|
||||
|
||||
gtk_widget_class_set_accessible_type (widget_class, GTK_TYPE_LABEL_ACCESSIBLE);
|
||||
|
||||
gtk_widget_class_set_css_name (widget_class, I_("label"));
|
||||
|
||||
quark_shortcuts_connected = g_quark_from_static_string ("gtk-label-shortcuts-connected");
|
||||
quark_mnemonics_visible_connected = g_quark_from_static_string ("gtk-label-mnemonics-visible-connected");
|
||||
quark_gtk_signal = g_quark_from_static_string ("gtk-signal");
|
||||
quark_link = g_quark_from_static_string ("link");
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -1358,7 +1316,6 @@ gtk_label_init (GtkLabel *label)
|
||||
priv->attrs = NULL;
|
||||
|
||||
priv->mnemonic_widget = NULL;
|
||||
priv->mnemonic_window = NULL;
|
||||
|
||||
priv->mnemonics_visible = FALSE;
|
||||
}
|
||||
@@ -1798,65 +1755,44 @@ gtk_label_mnemonic_activate (GtkWidget *widget,
|
||||
}
|
||||
|
||||
static void
|
||||
gtk_label_setup_mnemonic (GtkLabel *label,
|
||||
GtkWidget *toplevel,
|
||||
guint last_key)
|
||||
gtk_label_setup_mnemonic (GtkLabel *label)
|
||||
{
|
||||
GtkLabelPrivate *priv = gtk_label_get_instance_private (label);
|
||||
GtkWidget *widget = GTK_WIDGET (label);
|
||||
GtkWidget *mnemonic_menu;
|
||||
GtkShortcut *shortcut;
|
||||
|
||||
mnemonic_menu = g_object_get_qdata (G_OBJECT (label), quark_mnemonic_menu);
|
||||
|
||||
if (last_key != GDK_KEY_VoidSymbol)
|
||||
if (!gtk_widget_get_mapped (GTK_WIDGET (label)) ||
|
||||
priv->mnemonic_keyval == GDK_KEY_VoidSymbol)
|
||||
{
|
||||
if (priv->mnemonic_window)
|
||||
{
|
||||
gtk_window_remove_mnemonic (priv->mnemonic_window,
|
||||
last_key,
|
||||
widget);
|
||||
priv->mnemonic_window = NULL;
|
||||
}
|
||||
if (mnemonic_menu)
|
||||
{
|
||||
_gtk_menu_shell_remove_mnemonic (GTK_MENU_SHELL (mnemonic_menu),
|
||||
last_key,
|
||||
widget);
|
||||
mnemonic_menu = NULL;
|
||||
}
|
||||
if (priv->mnemonic_controller)
|
||||
{
|
||||
gtk_widget_remove_controller (widget, priv->mnemonic_controller);
|
||||
priv->mnemonic_controller = NULL;
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
if (priv->mnemonic_keyval == GDK_KEY_VoidSymbol)
|
||||
goto done;
|
||||
if (priv->mnemonic_controller == NULL)
|
||||
{
|
||||
priv->mnemonic_controller = gtk_shortcut_controller_new ();
|
||||
gtk_event_controller_set_name (priv->mnemonic_controller, "mnemonic");
|
||||
gtk_event_controller_set_propagation_phase (priv->mnemonic_controller, GTK_PHASE_CAPTURE);
|
||||
gtk_shortcut_controller_set_scope (GTK_SHORTCUT_CONTROLLER (priv->mnemonic_controller), GTK_SHORTCUT_SCOPE_MANAGED);
|
||||
|
||||
shortcut = gtk_shortcut_new (gtk_mnemonic_trigger_new (priv->mnemonic_keyval),
|
||||
gtk_mnemonic_action_new ());
|
||||
gtk_shortcut_controller_add_shortcut (GTK_SHORTCUT_CONTROLLER (priv->mnemonic_controller), shortcut);
|
||||
gtk_widget_add_controller (GTK_WIDGET (label), priv->mnemonic_controller);
|
||||
g_object_unref (shortcut);
|
||||
}
|
||||
else
|
||||
{
|
||||
shortcut = g_list_model_get_item (G_LIST_MODEL (priv->mnemonic_controller), 0);
|
||||
gtk_shortcut_set_trigger (shortcut, gtk_mnemonic_trigger_new (priv->mnemonic_keyval));
|
||||
g_object_unref (shortcut);
|
||||
}
|
||||
|
||||
connect_mnemonics_visible_notify (GTK_LABEL (widget));
|
||||
|
||||
if (GTK_IS_WINDOW (toplevel))
|
||||
{
|
||||
GtkWidget *menu_shell;
|
||||
|
||||
menu_shell = gtk_widget_get_ancestor (widget,
|
||||
GTK_TYPE_MENU_SHELL);
|
||||
|
||||
if (menu_shell)
|
||||
{
|
||||
_gtk_menu_shell_add_mnemonic (GTK_MENU_SHELL (menu_shell),
|
||||
priv->mnemonic_keyval,
|
||||
widget);
|
||||
mnemonic_menu = menu_shell;
|
||||
}
|
||||
|
||||
if (!GTK_IS_MENU (menu_shell))
|
||||
{
|
||||
gtk_window_add_mnemonic (GTK_WINDOW (toplevel),
|
||||
priv->mnemonic_keyval,
|
||||
widget);
|
||||
priv->mnemonic_window = GTK_WINDOW (toplevel);
|
||||
}
|
||||
}
|
||||
|
||||
done:
|
||||
g_object_set_qdata (G_OBJECT (label), quark_mnemonic_menu, mnemonic_menu);
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -1899,16 +1835,13 @@ static void
|
||||
gtk_label_root (GtkWidget *widget)
|
||||
{
|
||||
GtkLabel *label = GTK_LABEL (widget);
|
||||
GtkLabelPrivate *priv = gtk_label_get_instance_private (label);
|
||||
GtkSettings *settings;
|
||||
gboolean shortcuts_connected;
|
||||
|
||||
GTK_WIDGET_CLASS (gtk_label_parent_class)->root (widget);
|
||||
|
||||
gtk_label_setup_mnemonic (label, GTK_WIDGET (gtk_widget_get_root (widget)), priv->mnemonic_keyval);
|
||||
|
||||
/* The PangoContext is replaced when the display changes, so clear the layouts */
|
||||
gtk_label_clear_layout (GTK_LABEL (widget));
|
||||
gtk_label_clear_layout (label);
|
||||
|
||||
settings = gtk_widget_get_settings (widget);
|
||||
|
||||
@@ -1925,18 +1858,27 @@ gtk_label_root (GtkWidget *widget)
|
||||
GINT_TO_POINTER (TRUE));
|
||||
}
|
||||
|
||||
label_shortcut_setting_apply (GTK_LABEL (widget));
|
||||
label_shortcut_setting_apply (label);
|
||||
}
|
||||
|
||||
static void
|
||||
gtk_label_unroot (GtkWidget *widget)
|
||||
gtk_label_map (GtkWidget *widget)
|
||||
{
|
||||
GtkLabel *label = GTK_LABEL (widget);
|
||||
GtkLabelPrivate *priv = gtk_label_get_instance_private (label);
|
||||
|
||||
gtk_label_setup_mnemonic (label, NULL, priv->mnemonic_keyval);
|
||||
GTK_WIDGET_CLASS (gtk_label_parent_class)->map (widget);
|
||||
|
||||
GTK_WIDGET_CLASS (gtk_label_parent_class)->unroot (widget);
|
||||
gtk_label_setup_mnemonic (label);
|
||||
}
|
||||
|
||||
static void
|
||||
gtk_label_unmap (GtkWidget *widget)
|
||||
{
|
||||
GtkLabel *label = GTK_LABEL (widget);
|
||||
|
||||
GTK_WIDGET_CLASS (gtk_label_parent_class)->unmap (widget);
|
||||
|
||||
gtk_label_setup_mnemonic (label);
|
||||
}
|
||||
|
||||
void
|
||||
@@ -2182,7 +2124,7 @@ gtk_label_recalculate (GtkLabel *label)
|
||||
|
||||
if (keyval != priv->mnemonic_keyval)
|
||||
{
|
||||
gtk_label_setup_mnemonic (label, GTK_WIDGET (gtk_widget_get_root (GTK_WIDGET (label))), keyval);
|
||||
gtk_label_setup_mnemonic (label);
|
||||
g_object_notify_by_pspec (G_OBJECT (label), label_props[PROP_MNEMONIC_KEYVAL]);
|
||||
}
|
||||
|
||||
@@ -6037,7 +5979,7 @@ gtk_label_activate_clipboard_copy (GtkWidget *widget,
|
||||
const char *name,
|
||||
GVariant *parameter)
|
||||
{
|
||||
g_signal_emit_by_name (widget, "copy-clipboard");
|
||||
gtk_label_copy_clipboard (GTK_LABEL (widget));
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -6048,6 +5990,23 @@ gtk_label_activate_selection_select_all (GtkWidget *widget,
|
||||
gtk_label_select_all (GTK_LABEL (widget));
|
||||
}
|
||||
|
||||
static void
|
||||
gtk_label_activate_edit_move_cursor (GtkWidget *widget,
|
||||
const char *name,
|
||||
GVariant *parameter)
|
||||
{
|
||||
GtkMovementStep step;
|
||||
int count;
|
||||
gboolean extend;
|
||||
|
||||
g_variant_get (parameter, "(iib)", &step, &count, &extend);
|
||||
|
||||
step = CLAMP (step, GTK_MOVEMENT_LOGICAL_POSITIONS,
|
||||
GTK_MOVEMENT_HORIZONTAL_PAGES);
|
||||
|
||||
gtk_label_move_cursor (GTK_LABEL (widget), step, count, extend);
|
||||
}
|
||||
|
||||
static void
|
||||
gtk_label_nop (GtkWidget *widget,
|
||||
const char *name,
|
||||
@@ -6163,11 +6122,11 @@ gtk_label_do_popup (GtkLabel *label,
|
||||
}
|
||||
|
||||
static gboolean
|
||||
gtk_label_popup_menu (GtkWidget *widget)
|
||||
gtk_label_popup_menu (GtkWidget *widget,
|
||||
GVariant *args,
|
||||
gpointer user_data)
|
||||
{
|
||||
GtkLabel *label = GTK_LABEL (widget);
|
||||
|
||||
gtk_label_do_popup (label, -1, -1);
|
||||
gtk_label_do_popup (GTK_LABEL (widget), -1, -1);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
@@ -6232,20 +6191,6 @@ emit_activate_link (GtkLabel *label,
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
gtk_label_activate_current_link (GtkLabel *label)
|
||||
{
|
||||
GtkLabelLink *link;
|
||||
GtkWidget *widget = GTK_WIDGET (label);
|
||||
|
||||
link = gtk_label_get_focus_link (label);
|
||||
|
||||
if (link)
|
||||
emit_activate_link (label, link);
|
||||
else
|
||||
gtk_widget_activate_default (widget);
|
||||
}
|
||||
|
||||
static GtkLabelLink *
|
||||
gtk_label_get_current_link (GtkLabel *label)
|
||||
{
|
||||
|
||||
+17
-7
@@ -123,7 +123,9 @@ static void gtk_link_button_set_property (GObject *object,
|
||||
const GValue *value,
|
||||
GParamSpec *pspec);
|
||||
static void gtk_link_button_clicked (GtkButton *button);
|
||||
static gboolean gtk_link_button_popup_menu (GtkWidget *widget);
|
||||
static gboolean gtk_link_button_popup_menu (GtkWidget *widget,
|
||||
GVariant *args,
|
||||
gpointer user_data);
|
||||
static void gtk_link_button_drag_data_get_cb (GtkWidget *widget,
|
||||
GdkDrag *drag,
|
||||
GtkSelectionData *selection,
|
||||
@@ -173,8 +175,6 @@ gtk_link_button_class_init (GtkLinkButtonClass *klass)
|
||||
gobject_class->get_property = gtk_link_button_get_property;
|
||||
gobject_class->finalize = gtk_link_button_finalize;
|
||||
|
||||
widget_class->popup_menu = gtk_link_button_popup_menu;
|
||||
|
||||
button_class->clicked = gtk_link_button_clicked;
|
||||
|
||||
klass->activate_link = gtk_link_button_activate_link;
|
||||
@@ -229,11 +229,19 @@ gtk_link_button_class_init (GtkLinkButtonClass *klass)
|
||||
_gtk_marshal_BOOLEAN__VOID,
|
||||
G_TYPE_BOOLEAN, 0);
|
||||
|
||||
gtk_widget_class_set_accessible_type (widget_class, GTK_TYPE_LINK_BUTTON_ACCESSIBLE);
|
||||
gtk_widget_class_set_css_name (widget_class, I_("button"));
|
||||
|
||||
gtk_widget_class_install_action (widget_class, "clipboard.copy", NULL,
|
||||
gtk_link_button_activate_clipboard_copy);
|
||||
|
||||
/* Context menu */
|
||||
gtk_widget_class_add_binding (widget_class,
|
||||
GDK_KEY_F10, GDK_SHIFT_MASK,
|
||||
gtk_link_button_popup_menu, NULL);
|
||||
gtk_widget_class_add_binding (widget_class,
|
||||
GDK_KEY_Menu, 0,
|
||||
gtk_link_button_popup_menu, NULL);
|
||||
|
||||
gtk_widget_class_set_accessible_type (widget_class, GTK_TYPE_LINK_BUTTON_ACCESSIBLE);
|
||||
gtk_widget_class_set_css_name (widget_class, I_("button"));
|
||||
}
|
||||
|
||||
static GMenuModel *
|
||||
@@ -443,7 +451,9 @@ gtk_link_button_clicked (GtkButton *button)
|
||||
}
|
||||
|
||||
static gboolean
|
||||
gtk_link_button_popup_menu (GtkWidget *widget)
|
||||
gtk_link_button_popup_menu (GtkWidget *widget,
|
||||
GVariant *args,
|
||||
gpointer user_data)
|
||||
{
|
||||
gtk_link_button_do_popup (GTK_LINK_BUTTON (widget), -1, -1);
|
||||
return TRUE;
|
||||
|
||||
+48
-47
@@ -21,7 +21,6 @@
|
||||
|
||||
#include "gtkactionhelperprivate.h"
|
||||
#include "gtkadjustmentprivate.h"
|
||||
#include "gtkbindings.h"
|
||||
#include "gtkbuildable.h"
|
||||
#include "gtkcontainerprivate.h"
|
||||
#include "gtkcssnodeprivate.h"
|
||||
@@ -233,7 +232,7 @@ static GSequenceIter * gtk_list_box_get_next_visible (GtkListBo
|
||||
GSequenceIter *iter);
|
||||
static void gtk_list_box_apply_filter (GtkListBox *box,
|
||||
GtkListBoxRow *row);
|
||||
static void gtk_list_box_add_move_binding (GtkBindingSet *binding_set,
|
||||
static void gtk_list_box_add_move_binding (GtkWidgetClass *widget_class,
|
||||
guint keyval,
|
||||
GdkModifierType modmask,
|
||||
GtkMovementStep step,
|
||||
@@ -439,9 +438,6 @@ gtk_list_box_class_init (GtkListBoxClass *klass)
|
||||
GObjectClass *object_class = G_OBJECT_CLASS (klass);
|
||||
GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
|
||||
GtkContainerClass *container_class = GTK_CONTAINER_CLASS (klass);
|
||||
GtkBindingSet *binding_set;
|
||||
|
||||
gtk_widget_class_set_accessible_type (widget_class, GTK_TYPE_LIST_BOX_ACCESSIBLE);
|
||||
|
||||
object_class->get_property = gtk_list_box_get_property;
|
||||
object_class->set_property = gtk_list_box_set_property;
|
||||
@@ -615,43 +611,52 @@ gtk_list_box_class_init (GtkListBoxClass *klass)
|
||||
|
||||
widget_class->activate_signal = signals[ACTIVATE_CURSOR_ROW];
|
||||
|
||||
binding_set = gtk_binding_set_by_class (klass);
|
||||
gtk_list_box_add_move_binding (binding_set, GDK_KEY_Home, 0,
|
||||
gtk_list_box_add_move_binding (widget_class, GDK_KEY_Home, 0,
|
||||
GTK_MOVEMENT_BUFFER_ENDS, -1);
|
||||
gtk_list_box_add_move_binding (binding_set, GDK_KEY_KP_Home, 0,
|
||||
gtk_list_box_add_move_binding (widget_class, GDK_KEY_KP_Home, 0,
|
||||
GTK_MOVEMENT_BUFFER_ENDS, -1);
|
||||
gtk_list_box_add_move_binding (binding_set, GDK_KEY_End, 0,
|
||||
gtk_list_box_add_move_binding (widget_class, GDK_KEY_End, 0,
|
||||
GTK_MOVEMENT_BUFFER_ENDS, 1);
|
||||
gtk_list_box_add_move_binding (binding_set, GDK_KEY_KP_End, 0,
|
||||
gtk_list_box_add_move_binding (widget_class, GDK_KEY_KP_End, 0,
|
||||
GTK_MOVEMENT_BUFFER_ENDS, 1);
|
||||
gtk_list_box_add_move_binding (binding_set, GDK_KEY_Up, 0,
|
||||
gtk_list_box_add_move_binding (widget_class, GDK_KEY_Up, 0,
|
||||
GTK_MOVEMENT_DISPLAY_LINES, -1);
|
||||
gtk_list_box_add_move_binding (binding_set, GDK_KEY_KP_Up, 0,
|
||||
gtk_list_box_add_move_binding (widget_class, GDK_KEY_KP_Up, 0,
|
||||
GTK_MOVEMENT_DISPLAY_LINES, -1);
|
||||
gtk_list_box_add_move_binding (binding_set, GDK_KEY_Down, 0,
|
||||
gtk_list_box_add_move_binding (widget_class, GDK_KEY_Down, 0,
|
||||
GTK_MOVEMENT_DISPLAY_LINES, 1);
|
||||
gtk_list_box_add_move_binding (binding_set, GDK_KEY_KP_Down, 0,
|
||||
gtk_list_box_add_move_binding (widget_class, GDK_KEY_KP_Down, 0,
|
||||
GTK_MOVEMENT_DISPLAY_LINES, 1);
|
||||
gtk_list_box_add_move_binding (binding_set, GDK_KEY_Page_Up, 0,
|
||||
gtk_list_box_add_move_binding (widget_class, GDK_KEY_Page_Up, 0,
|
||||
GTK_MOVEMENT_PAGES, -1);
|
||||
gtk_list_box_add_move_binding (binding_set, GDK_KEY_KP_Page_Up, 0,
|
||||
gtk_list_box_add_move_binding (widget_class, GDK_KEY_KP_Page_Up, 0,
|
||||
GTK_MOVEMENT_PAGES, -1);
|
||||
gtk_list_box_add_move_binding (binding_set, GDK_KEY_Page_Down, 0,
|
||||
gtk_list_box_add_move_binding (widget_class, GDK_KEY_Page_Down, 0,
|
||||
GTK_MOVEMENT_PAGES, 1);
|
||||
gtk_list_box_add_move_binding (binding_set, GDK_KEY_KP_Page_Down, 0,
|
||||
gtk_list_box_add_move_binding (widget_class, GDK_KEY_KP_Page_Down, 0,
|
||||
GTK_MOVEMENT_PAGES, 1);
|
||||
|
||||
gtk_binding_entry_add_signal (binding_set, GDK_KEY_space, GDK_CONTROL_MASK,
|
||||
"toggle-cursor-row", 0, NULL);
|
||||
gtk_binding_entry_add_signal (binding_set, GDK_KEY_KP_Space, GDK_CONTROL_MASK,
|
||||
"toggle-cursor-row", 0, NULL);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_space, GDK_CONTROL_MASK,
|
||||
"toggle-cursor-row",
|
||||
NULL);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_KP_Space, GDK_CONTROL_MASK,
|
||||
"toggle-cursor-row",
|
||||
NULL);
|
||||
|
||||
gtk_binding_entry_add_signal (binding_set, GDK_KEY_a, GDK_CONTROL_MASK,
|
||||
"select-all", 0);
|
||||
gtk_binding_entry_add_signal (binding_set, GDK_KEY_a, GDK_CONTROL_MASK | GDK_SHIFT_MASK,
|
||||
"unselect-all", 0);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_a, GDK_CONTROL_MASK,
|
||||
"select-all",
|
||||
NULL);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_a, GDK_CONTROL_MASK | GDK_SHIFT_MASK,
|
||||
"unselect-all",
|
||||
NULL);
|
||||
|
||||
gtk_widget_class_set_css_name (widget_class, I_("list"));
|
||||
|
||||
gtk_widget_class_set_accessible_type (widget_class, GTK_TYPE_LIST_BOX_ACCESSIBLE);
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -1439,7 +1444,7 @@ gtk_list_box_set_accept_unpaired_release (GtkListBox *box,
|
||||
}
|
||||
|
||||
static void
|
||||
gtk_list_box_add_move_binding (GtkBindingSet *binding_set,
|
||||
gtk_list_box_add_move_binding (GtkWidgetClass *widget_class,
|
||||
guint keyval,
|
||||
GdkModifierType modmask,
|
||||
GtkMovementStep step,
|
||||
@@ -1458,26 +1463,22 @@ gtk_list_box_add_move_binding (GtkBindingSet *binding_set,
|
||||
GDK_MODIFIER_INTENT_MODIFY_SELECTION);
|
||||
}
|
||||
|
||||
gtk_binding_entry_add_signal (binding_set, keyval, modmask,
|
||||
"move-cursor", 2,
|
||||
GTK_TYPE_MOVEMENT_STEP, step,
|
||||
G_TYPE_INT, count,
|
||||
NULL);
|
||||
gtk_binding_entry_add_signal (binding_set, keyval, modmask | extend_mod_mask,
|
||||
"move-cursor", 2,
|
||||
GTK_TYPE_MOVEMENT_STEP, step,
|
||||
G_TYPE_INT, count,
|
||||
NULL);
|
||||
gtk_binding_entry_add_signal (binding_set, keyval, modmask | modify_mod_mask,
|
||||
"move-cursor", 2,
|
||||
GTK_TYPE_MOVEMENT_STEP, step,
|
||||
G_TYPE_INT, count,
|
||||
NULL);
|
||||
gtk_binding_entry_add_signal (binding_set, keyval, modmask | extend_mod_mask | modify_mod_mask,
|
||||
"move-cursor", 2,
|
||||
GTK_TYPE_MOVEMENT_STEP, step,
|
||||
G_TYPE_INT, count,
|
||||
NULL);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
keyval, modmask,
|
||||
"move-cursor",
|
||||
"(ii)", step, count);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
keyval, modmask | extend_mod_mask,
|
||||
"move-cursor",
|
||||
"(ii)", step, count);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
keyval, modmask | modify_mod_mask,
|
||||
"move-cursor",
|
||||
"(ii)", step, count);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
keyval, modmask | extend_mod_mask | modify_mod_mask,
|
||||
"move-cursor",
|
||||
"(ii)", step, count);
|
||||
}
|
||||
|
||||
static void
|
||||
|
||||
+1
-11
@@ -113,7 +113,6 @@
|
||||
|
||||
#include "gtkintl.h"
|
||||
|
||||
#include "gtkaccelmapprivate.h"
|
||||
#include "gtkbox.h"
|
||||
#include "gtkdebug.h"
|
||||
#include "gtkdndprivate.h"
|
||||
@@ -665,8 +664,6 @@ do_post_parse_initialization (void)
|
||||
gsk_ensure_resources ();
|
||||
_gtk_ensure_resources ();
|
||||
|
||||
_gtk_accel_map_init ();
|
||||
|
||||
gtk_initialized = TRUE;
|
||||
|
||||
#ifdef G_OS_UNIX
|
||||
@@ -1893,14 +1890,7 @@ gtk_main_do_event (GdkEvent *event)
|
||||
if (is_pointing_event (event))
|
||||
target_widget = handle_pointing_event (event);
|
||||
else if (is_key_event (event))
|
||||
{
|
||||
if (event->any.type == GDK_KEY_PRESS &&
|
||||
GTK_IS_WINDOW (target_widget) &&
|
||||
gtk_window_activate_key (GTK_WINDOW (target_widget), (GdkEventKey *) event))
|
||||
goto cleanup;
|
||||
|
||||
target_widget = handle_key_event (event);
|
||||
}
|
||||
target_widget = handle_key_event (event);
|
||||
else if (is_focus_event (event))
|
||||
{
|
||||
if (!GTK_IS_WINDOW (target_widget))
|
||||
|
||||
+84
-295
@@ -86,9 +86,7 @@
|
||||
#include "gtkmenuprivate.h"
|
||||
|
||||
#include "gtkaccellabel.h"
|
||||
#include "gtkaccelmap.h"
|
||||
#include "gtkadjustment.h"
|
||||
#include "gtkbindings.h"
|
||||
#include "gtkbox.h"
|
||||
#include "gtkscrolledwindow.h"
|
||||
#include "gtkcheckmenuitemprivate.h"
|
||||
@@ -105,7 +103,7 @@
|
||||
#include "gtkprivate.h"
|
||||
#include "gtkscrollbar.h"
|
||||
#include "gtksettings.h"
|
||||
#include "gtksnapshot.h"
|
||||
#include "gtkshortcutmanager.h"
|
||||
#include "gtkstylecontextprivate.h"
|
||||
#include "gtktypebuiltins.h"
|
||||
#include "gtkwidgetpath.h"
|
||||
@@ -150,8 +148,6 @@ enum {
|
||||
enum {
|
||||
PROP_0,
|
||||
PROP_ACTIVE,
|
||||
PROP_ACCEL_GROUP,
|
||||
PROP_ACCEL_PATH,
|
||||
PROP_ATTACH_WIDGET,
|
||||
PROP_TEAROFF_STATE,
|
||||
PROP_TEAROFF_TITLE,
|
||||
@@ -180,7 +176,6 @@ static void gtk_menu_size_allocate (GtkWidget *widget,
|
||||
int widget_width,
|
||||
int widget_height,
|
||||
int baseline);
|
||||
static void gtk_menu_show (GtkWidget *widget);
|
||||
static void gtk_menu_motion (GtkEventController *controller,
|
||||
double x,
|
||||
double y,
|
||||
@@ -214,8 +209,6 @@ static GdkSurface *menu_grab_transfer_surface_get (GtkMenu *menu);
|
||||
|
||||
static gboolean gtk_menu_real_can_activate_accel (GtkWidget *widget,
|
||||
guint signal_id);
|
||||
static void _gtk_menu_refresh_accel_paths (GtkMenu *menu,
|
||||
gboolean group_changed);
|
||||
static void gtk_menu_measure (GtkWidget *widget,
|
||||
GtkOrientation orientation,
|
||||
int for_size,
|
||||
@@ -239,7 +232,15 @@ static const gchar attach_data_key[] = "gtk-menu-attach-data";
|
||||
|
||||
static guint menu_signals[LAST_SIGNAL] = { 0 };
|
||||
|
||||
G_DEFINE_TYPE_WITH_PRIVATE (GtkMenu, gtk_menu, GTK_TYPE_MENU_SHELL)
|
||||
static void
|
||||
gtk_menu_shortcut_manager_interface_init (GtkShortcutManagerInterface *iface)
|
||||
{
|
||||
}
|
||||
|
||||
G_DEFINE_TYPE_WITH_CODE (GtkMenu, gtk_menu, GTK_TYPE_MENU_SHELL,
|
||||
G_ADD_PRIVATE (GtkMenu)
|
||||
G_IMPLEMENT_INTERFACE (GTK_TYPE_SHORTCUT_MANAGER,
|
||||
gtk_menu_shortcut_manager_interface_init))
|
||||
|
||||
static void
|
||||
update_scrollbars (GtkMenu *menu)
|
||||
@@ -301,7 +302,6 @@ gtk_menu_class_init (GtkMenuClass *class)
|
||||
GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (class);
|
||||
GtkContainerClass *container_class = GTK_CONTAINER_CLASS (class);
|
||||
GtkMenuShellClass *menu_shell_class = GTK_MENU_SHELL_CLASS (class);
|
||||
GtkBindingSet *binding_set;
|
||||
|
||||
gobject_class->set_property = gtk_menu_set_property;
|
||||
gobject_class->get_property = gtk_menu_get_property;
|
||||
@@ -312,7 +312,6 @@ gtk_menu_class_init (GtkMenuClass *class)
|
||||
widget_class->realize = gtk_menu_realize;
|
||||
widget_class->unrealize = gtk_menu_unrealize;
|
||||
widget_class->size_allocate = gtk_menu_size_allocate;
|
||||
widget_class->show = gtk_menu_show;
|
||||
widget_class->focus = gtk_menu_focus;
|
||||
widget_class->can_activate_accel = gtk_menu_real_can_activate_accel;
|
||||
widget_class->grab_notify = gtk_menu_grab_notify;
|
||||
@@ -407,32 +406,6 @@ gtk_menu_class_init (GtkMenuClass *class)
|
||||
-1, G_MAXINT, -1,
|
||||
GTK_PARAM_READWRITE));
|
||||
|
||||
/**
|
||||
* GtkMenu:accel-group:
|
||||
*
|
||||
* The accel group holding accelerators for the menu.
|
||||
**/
|
||||
g_object_class_install_property (gobject_class,
|
||||
PROP_ACCEL_GROUP,
|
||||
g_param_spec_object ("accel-group",
|
||||
P_("Accel Group"),
|
||||
P_("The accel group holding accelerators for the menu"),
|
||||
GTK_TYPE_ACCEL_GROUP,
|
||||
GTK_PARAM_READWRITE));
|
||||
|
||||
/**
|
||||
* GtkMenu:accel-path:
|
||||
*
|
||||
* An accel path used to conveniently construct accel paths of child items.
|
||||
**/
|
||||
g_object_class_install_property (gobject_class,
|
||||
PROP_ACCEL_PATH,
|
||||
g_param_spec_string ("accel-path",
|
||||
P_("Accel Path"),
|
||||
P_("An accel path used to conveniently construct accel paths of child items"),
|
||||
NULL,
|
||||
GTK_PARAM_READWRITE));
|
||||
|
||||
/**
|
||||
* GtkMenu:attach-widget:
|
||||
*
|
||||
@@ -586,87 +559,70 @@ gtk_menu_class_init (GtkMenuClass *class)
|
||||
G_PARAM_STATIC_BLURB |
|
||||
G_PARAM_EXPLICIT_NOTIFY));
|
||||
|
||||
binding_set = gtk_binding_set_by_class (class);
|
||||
gtk_binding_entry_add_signal (binding_set,
|
||||
GDK_KEY_Up, 0,
|
||||
I_("move-current"), 1,
|
||||
GTK_TYPE_MENU_DIRECTION_TYPE,
|
||||
GTK_MENU_DIR_PREV);
|
||||
gtk_binding_entry_add_signal (binding_set,
|
||||
GDK_KEY_KP_Up, 0,
|
||||
"move-current", 1,
|
||||
GTK_TYPE_MENU_DIRECTION_TYPE,
|
||||
GTK_MENU_DIR_PREV);
|
||||
gtk_binding_entry_add_signal (binding_set,
|
||||
GDK_KEY_Down, 0,
|
||||
"move-current", 1,
|
||||
GTK_TYPE_MENU_DIRECTION_TYPE,
|
||||
GTK_MENU_DIR_NEXT);
|
||||
gtk_binding_entry_add_signal (binding_set,
|
||||
GDK_KEY_KP_Down, 0,
|
||||
"move-current", 1,
|
||||
GTK_TYPE_MENU_DIRECTION_TYPE,
|
||||
GTK_MENU_DIR_NEXT);
|
||||
gtk_binding_entry_add_signal (binding_set,
|
||||
GDK_KEY_Left, 0,
|
||||
"move-current", 1,
|
||||
GTK_TYPE_MENU_DIRECTION_TYPE,
|
||||
GTK_MENU_DIR_PARENT);
|
||||
gtk_binding_entry_add_signal (binding_set,
|
||||
GDK_KEY_KP_Left, 0,
|
||||
"move-current", 1,
|
||||
GTK_TYPE_MENU_DIRECTION_TYPE,
|
||||
GTK_MENU_DIR_PARENT);
|
||||
gtk_binding_entry_add_signal (binding_set,
|
||||
GDK_KEY_Right, 0,
|
||||
"move-current", 1,
|
||||
GTK_TYPE_MENU_DIRECTION_TYPE,
|
||||
GTK_MENU_DIR_CHILD);
|
||||
gtk_binding_entry_add_signal (binding_set,
|
||||
GDK_KEY_KP_Right, 0,
|
||||
"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_add_binding_signal (widget_class,
|
||||
GDK_KEY_Up, 0,
|
||||
I_("move-current"),
|
||||
"(i)", GTK_MENU_DIR_PREV);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_KP_Up, 0,
|
||||
"move-current",
|
||||
"(i)", GTK_MENU_DIR_PREV);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_Down, 0,
|
||||
"move-current",
|
||||
"(i)", GTK_MENU_DIR_NEXT);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_KP_Down, 0,
|
||||
"move-current",
|
||||
"(i)", GTK_MENU_DIR_NEXT);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_Left, 0,
|
||||
"move-current",
|
||||
"(i)", GTK_MENU_DIR_PARENT);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_KP_Left, 0,
|
||||
"move-current",
|
||||
"(i)", GTK_MENU_DIR_PARENT);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_Right, 0,
|
||||
"move-current",
|
||||
"(i)", GTK_MENU_DIR_CHILD);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_KP_Right, 0,
|
||||
"move-current",
|
||||
"(i)", GTK_MENU_DIR_CHILD);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_Home, 0,
|
||||
"move-scroll",
|
||||
"(i)", GTK_SCROLL_START);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_KP_Home, 0,
|
||||
"move-scroll",
|
||||
"(i)", GTK_SCROLL_START);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_End, 0,
|
||||
"move-scroll",
|
||||
"(i)", GTK_SCROLL_END);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_KP_End, 0,
|
||||
"move-scroll",
|
||||
"(i)", GTK_SCROLL_END);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_Page_Up, 0,
|
||||
"move-scroll",
|
||||
"(i)", GTK_SCROLL_PAGE_UP);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_KP_Page_Up, 0,
|
||||
"move-scroll",
|
||||
"(i)", GTK_SCROLL_PAGE_UP);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_Page_Down, 0,
|
||||
"move-scroll",
|
||||
"(i)", GTK_SCROLL_PAGE_DOWN);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_KP_Page_Down, 0,
|
||||
"move-scroll",
|
||||
"(i)", 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"));
|
||||
@@ -686,12 +642,6 @@ gtk_menu_set_property (GObject *object,
|
||||
case PROP_ACTIVE:
|
||||
gtk_menu_set_active (menu, g_value_get_int (value));
|
||||
break;
|
||||
case PROP_ACCEL_GROUP:
|
||||
gtk_menu_set_accel_group (menu, g_value_get_object (value));
|
||||
break;
|
||||
case PROP_ACCEL_PATH:
|
||||
gtk_menu_set_accel_path (menu, g_value_get_string (value));
|
||||
break;
|
||||
case PROP_ATTACH_WIDGET:
|
||||
{
|
||||
GtkWidget *widget;
|
||||
@@ -762,12 +712,6 @@ gtk_menu_get_property (GObject *object,
|
||||
g_list_free (children);
|
||||
}
|
||||
break;
|
||||
case PROP_ACCEL_GROUP:
|
||||
g_value_set_object (value, gtk_menu_get_accel_group (menu));
|
||||
break;
|
||||
case PROP_ACCEL_PATH:
|
||||
g_value_set_string (value, gtk_menu_get_accel_path (menu));
|
||||
break;
|
||||
case PROP_ATTACH_WIDGET:
|
||||
g_value_set_object (value, gtk_menu_get_attach_widget (menu));
|
||||
break;
|
||||
@@ -801,6 +745,7 @@ gtk_menu_init (GtkMenu *menu)
|
||||
GtkMenuPrivate *priv;
|
||||
GtkGesture *gesture;
|
||||
GtkEventController *controller;
|
||||
GList *l, *controllers;
|
||||
|
||||
priv = gtk_menu_get_instance_private (menu);
|
||||
|
||||
@@ -811,7 +756,6 @@ gtk_menu_init (GtkMenu *menu)
|
||||
g_signal_connect (priv->toplevel, "destroy", G_CALLBACK (gtk_widget_destroyed), &priv->toplevel);
|
||||
|
||||
gtk_window_set_resizable (GTK_WINDOW (priv->toplevel), FALSE);
|
||||
gtk_window_set_mnemonic_modifier (GTK_WINDOW (priv->toplevel), 0);
|
||||
|
||||
_gtk_window_request_csd (GTK_WINDOW (priv->toplevel));
|
||||
gtk_style_context_add_class (gtk_widget_get_style_context (priv->toplevel),
|
||||
@@ -854,6 +798,15 @@ gtk_menu_init (GtkMenu *menu)
|
||||
controller = gtk_event_controller_motion_new ();
|
||||
g_signal_connect (controller, "motion", G_CALLBACK (gtk_menu_motion), menu);
|
||||
gtk_widget_add_controller (GTK_WIDGET (menu), controller);
|
||||
|
||||
/* Trigger mnemonics without Alt */
|
||||
controllers = _gtk_widget_list_controllers (GTK_WIDGET (menu), GTK_PHASE_CAPTURE);
|
||||
for (l = controllers; l; l = l->next)
|
||||
{
|
||||
if (GTK_IS_SHORTCUT_CONTROLLER (l->data))
|
||||
gtk_shortcut_controller_set_mnemonics_modifiers (l->data, 0);
|
||||
}
|
||||
g_list_free (controllers);
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -893,8 +846,6 @@ gtk_menu_destroy (GtkWidget *widget)
|
||||
g_object_ref (widget);
|
||||
}
|
||||
|
||||
g_clear_object (&priv->accel_group);
|
||||
|
||||
if (priv->toplevel)
|
||||
{
|
||||
g_signal_handlers_disconnect_by_func (priv->toplevel, moved_to_rect_cb, menu);
|
||||
@@ -1824,57 +1775,6 @@ gtk_menu_set_active (GtkMenu *menu,
|
||||
g_list_free (children);
|
||||
}
|
||||
|
||||
/**
|
||||
* gtk_menu_set_accel_group:
|
||||
* @menu: a #GtkMenu
|
||||
* @accel_group: (allow-none): the #GtkAccelGroup to be associated
|
||||
* with the menu.
|
||||
*
|
||||
* Set the #GtkAccelGroup which holds global accelerators for the
|
||||
* menu. This accelerator group needs to also be added to all windows
|
||||
* that this menu is being used in with gtk_window_add_accel_group(),
|
||||
* in order for those windows to support all the accelerators
|
||||
* contained in this group.
|
||||
*/
|
||||
void
|
||||
gtk_menu_set_accel_group (GtkMenu *menu,
|
||||
GtkAccelGroup *accel_group)
|
||||
{
|
||||
GtkMenuPrivate *priv;
|
||||
|
||||
g_return_if_fail (GTK_IS_MENU (menu));
|
||||
g_return_if_fail (GTK_IS_ACCEL_GROUP (accel_group));
|
||||
|
||||
priv = menu->priv;
|
||||
|
||||
if (priv->accel_group != accel_group)
|
||||
{
|
||||
if (priv->accel_group)
|
||||
g_object_unref (priv->accel_group);
|
||||
priv->accel_group = accel_group;
|
||||
if (priv->accel_group)
|
||||
g_object_ref (priv->accel_group);
|
||||
_gtk_menu_refresh_accel_paths (menu, TRUE);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* gtk_menu_get_accel_group:
|
||||
* @menu: a #GtkMenu
|
||||
*
|
||||
* Gets the #GtkAccelGroup which holds global accelerators for the
|
||||
* menu. See gtk_menu_set_accel_group().
|
||||
*
|
||||
* Returns: (transfer none): the #GtkAccelGroup associated with the menu
|
||||
*/
|
||||
GtkAccelGroup*
|
||||
gtk_menu_get_accel_group (GtkMenu *menu)
|
||||
{
|
||||
g_return_val_if_fail (GTK_IS_MENU (menu), NULL);
|
||||
|
||||
return menu->priv->accel_group;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
gtk_menu_real_can_activate_accel (GtkWidget *widget,
|
||||
guint signal_id)
|
||||
@@ -1893,107 +1793,6 @@ gtk_menu_real_can_activate_accel (GtkWidget *widget,
|
||||
return gtk_widget_is_sensitive (widget);
|
||||
}
|
||||
|
||||
/**
|
||||
* gtk_menu_set_accel_path:
|
||||
* @menu: a valid #GtkMenu
|
||||
* @accel_path: (nullable): a valid accelerator path, or %NULL to unset the path
|
||||
*
|
||||
* Sets an accelerator path for this menu from which accelerator paths
|
||||
* for its immediate children, its menu items, can be constructed.
|
||||
* The main purpose of this function is to spare the programmer the
|
||||
* inconvenience of having to call gtk_menu_item_set_accel_path() on
|
||||
* each menu item that should support runtime user changable accelerators.
|
||||
* Instead, by just calling gtk_menu_set_accel_path() on their parent,
|
||||
* each menu item of this menu, that contains a label describing its
|
||||
* purpose, automatically gets an accel path assigned.
|
||||
*
|
||||
* For example, a menu containing menu items “New” and “Exit”, will, after
|
||||
* `gtk_menu_set_accel_path (menu, "<Gnumeric-Sheet>/File");` has been
|
||||
* called, assign its items the accel paths: `"<Gnumeric-Sheet>/File/New"`
|
||||
* and `"<Gnumeric-Sheet>/File/Exit"`.
|
||||
*
|
||||
* Assigning accel paths to menu items then enables the user to change
|
||||
* their accelerators at runtime. More details about accelerator paths
|
||||
* and their default setups can be found at gtk_accel_map_add_entry().
|
||||
*
|
||||
* Note that @accel_path string will be stored in a #GQuark. Therefore,
|
||||
* if you pass a static string, you can save some memory by interning
|
||||
* it first with g_intern_static_string().
|
||||
*/
|
||||
void
|
||||
gtk_menu_set_accel_path (GtkMenu *menu,
|
||||
const gchar *accel_path)
|
||||
{
|
||||
GtkMenuPrivate *priv;
|
||||
|
||||
g_return_if_fail (GTK_IS_MENU (menu));
|
||||
|
||||
priv = menu->priv;
|
||||
|
||||
if (accel_path)
|
||||
g_return_if_fail (accel_path[0] == '<' && strchr (accel_path, '/')); /* simplistic check */
|
||||
|
||||
priv->accel_path = g_intern_string (accel_path);
|
||||
if (priv->accel_path)
|
||||
_gtk_menu_refresh_accel_paths (menu, FALSE);
|
||||
}
|
||||
|
||||
/**
|
||||
* gtk_menu_get_accel_path:
|
||||
* @menu: a valid #GtkMenu
|
||||
*
|
||||
* Retrieves the accelerator path set on the menu.
|
||||
*
|
||||
* Returns: the accelerator path set on the menu.
|
||||
*/
|
||||
const gchar*
|
||||
gtk_menu_get_accel_path (GtkMenu *menu)
|
||||
{
|
||||
g_return_val_if_fail (GTK_IS_MENU (menu), NULL);
|
||||
|
||||
return menu->priv->accel_path;
|
||||
}
|
||||
|
||||
typedef struct {
|
||||
GtkMenu *menu;
|
||||
gboolean group_changed;
|
||||
} AccelPropagation;
|
||||
|
||||
static void
|
||||
refresh_accel_paths_foreach (GtkWidget *widget,
|
||||
gpointer data)
|
||||
{
|
||||
GtkMenuPrivate *priv;
|
||||
AccelPropagation *prop = data;
|
||||
|
||||
if (GTK_IS_MENU_ITEM (widget)) /* should always be true */
|
||||
{
|
||||
priv = prop->menu->priv;
|
||||
_gtk_menu_item_refresh_accel_path (GTK_MENU_ITEM (widget),
|
||||
priv->accel_path,
|
||||
priv->accel_group,
|
||||
prop->group_changed);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
_gtk_menu_refresh_accel_paths (GtkMenu *menu,
|
||||
gboolean group_changed)
|
||||
{
|
||||
GtkMenuPrivate *priv = menu->priv;
|
||||
|
||||
if (priv->accel_path && priv->accel_group)
|
||||
{
|
||||
AccelPropagation prop;
|
||||
|
||||
prop.menu = menu;
|
||||
prop.group_changed = group_changed;
|
||||
gtk_container_foreach (GTK_CONTAINER (menu),
|
||||
refresh_accel_paths_foreach,
|
||||
&prop);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* gtk_menu_reposition:
|
||||
* @menu: a #GtkMenu
|
||||
@@ -2130,16 +1929,6 @@ gtk_menu_size_allocate (GtkWidget *widget,
|
||||
baseline);
|
||||
}
|
||||
|
||||
static void
|
||||
gtk_menu_show (GtkWidget *widget)
|
||||
{
|
||||
GtkMenu *menu = GTK_MENU (widget);
|
||||
|
||||
_gtk_menu_refresh_accel_paths (menu, FALSE);
|
||||
|
||||
GTK_WIDGET_CLASS (gtk_menu_parent_class)->show (widget);
|
||||
}
|
||||
|
||||
static void
|
||||
gtk_menu_measure (GtkWidget *widget,
|
||||
GtkOrientation orientation,
|
||||
|
||||
@@ -88,17 +88,6 @@ GDK_AVAILABLE_IN_ALL
|
||||
void gtk_menu_set_active (GtkMenu *menu,
|
||||
guint index);
|
||||
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
void gtk_menu_set_accel_group (GtkMenu *menu,
|
||||
GtkAccelGroup *accel_group);
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
GtkAccelGroup* gtk_menu_get_accel_group (GtkMenu *menu);
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
void gtk_menu_set_accel_path (GtkMenu *menu,
|
||||
const gchar *accel_path);
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
const gchar* gtk_menu_get_accel_path (GtkMenu *menu);
|
||||
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
void gtk_menu_attach_to_widget (GtkMenu *menu,
|
||||
GtkWidget *attach_widget,
|
||||
|
||||
+40
-59
@@ -42,7 +42,6 @@
|
||||
#include "gtkmenubar.h"
|
||||
#include "gtkmenubarprivate.h"
|
||||
|
||||
#include "gtkbindings.h"
|
||||
#include "gtkmain.h"
|
||||
#include "gtkmarshalers.h"
|
||||
#include "gtkmenuitemprivate.h"
|
||||
@@ -113,12 +112,6 @@ gtk_menu_bar_get_items (GtkMenuShell *menu_shell)
|
||||
return gtk_container_get_children (GTK_CONTAINER (menu_bar->box));
|
||||
}
|
||||
|
||||
static void
|
||||
gtk_menu_bar_finalize (GObject *object)
|
||||
{
|
||||
G_OBJECT_CLASS (gtk_menu_bar_parent_class)->finalize (object);
|
||||
}
|
||||
|
||||
static void
|
||||
gtk_menu_bar_dispose (GObject *object)
|
||||
{
|
||||
@@ -148,9 +141,6 @@ gtk_menu_bar_class_init (GtkMenuBarClass *class)
|
||||
GtkContainerClass *container_class = GTK_CONTAINER_CLASS (class);
|
||||
GtkMenuShellClass *menu_shell_class = GTK_MENU_SHELL_CLASS (class);
|
||||
|
||||
GtkBindingSet *binding_set;
|
||||
|
||||
object_class->finalize = gtk_menu_bar_finalize;
|
||||
object_class->dispose = gtk_menu_bar_dispose;
|
||||
|
||||
widget_class->measure = gtk_menu_bar_measure;
|
||||
@@ -168,47 +158,38 @@ gtk_menu_bar_class_init (GtkMenuBarClass *class)
|
||||
menu_shell_class->move_current = gtk_menu_bar_move_current;
|
||||
menu_shell_class->get_items = gtk_menu_bar_get_items;
|
||||
|
||||
binding_set = gtk_binding_set_by_class (class);
|
||||
gtk_binding_entry_add_signal (binding_set,
|
||||
GDK_KEY_Left, 0,
|
||||
"move-current", 1,
|
||||
GTK_TYPE_MENU_DIRECTION_TYPE,
|
||||
GTK_MENU_DIR_PREV);
|
||||
gtk_binding_entry_add_signal (binding_set,
|
||||
GDK_KEY_KP_Left, 0,
|
||||
"move-current", 1,
|
||||
GTK_TYPE_MENU_DIRECTION_TYPE,
|
||||
GTK_MENU_DIR_PREV);
|
||||
gtk_binding_entry_add_signal (binding_set,
|
||||
GDK_KEY_Right, 0,
|
||||
"move-current", 1,
|
||||
GTK_TYPE_MENU_DIRECTION_TYPE,
|
||||
GTK_MENU_DIR_NEXT);
|
||||
gtk_binding_entry_add_signal (binding_set,
|
||||
GDK_KEY_KP_Right, 0,
|
||||
"move-current", 1,
|
||||
GTK_TYPE_MENU_DIRECTION_TYPE,
|
||||
GTK_MENU_DIR_NEXT);
|
||||
gtk_binding_entry_add_signal (binding_set,
|
||||
GDK_KEY_Up, 0,
|
||||
"move-current", 1,
|
||||
GTK_TYPE_MENU_DIRECTION_TYPE,
|
||||
GTK_MENU_DIR_PARENT);
|
||||
gtk_binding_entry_add_signal (binding_set,
|
||||
GDK_KEY_KP_Up, 0,
|
||||
"move-current", 1,
|
||||
GTK_TYPE_MENU_DIRECTION_TYPE,
|
||||
GTK_MENU_DIR_PARENT);
|
||||
gtk_binding_entry_add_signal (binding_set,
|
||||
GDK_KEY_Down, 0,
|
||||
"move-current", 1,
|
||||
GTK_TYPE_MENU_DIRECTION_TYPE,
|
||||
GTK_MENU_DIR_CHILD);
|
||||
gtk_binding_entry_add_signal (binding_set,
|
||||
GDK_KEY_KP_Down, 0,
|
||||
"move-current", 1,
|
||||
GTK_TYPE_MENU_DIRECTION_TYPE,
|
||||
GTK_MENU_DIR_CHILD);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_Left, 0,
|
||||
"move-current",
|
||||
"(i)", GTK_MENU_DIR_PREV);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_KP_Left, 0,
|
||||
"move-current",
|
||||
"(i)", GTK_MENU_DIR_PREV);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_Right, 0,
|
||||
"move-current",
|
||||
"(i)", GTK_MENU_DIR_NEXT);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_KP_Right, 0,
|
||||
"move-current",
|
||||
"(i)", GTK_MENU_DIR_NEXT);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_Up, 0,
|
||||
"move-current",
|
||||
"(i)", GTK_MENU_DIR_PARENT);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_KP_Up, 0,
|
||||
"move-current",
|
||||
"(i)", GTK_MENU_DIR_PARENT);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_Down, 0,
|
||||
"move-current",
|
||||
"(i)", GTK_MENU_DIR_CHILD);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_KP_Down, 0,
|
||||
"move-current",
|
||||
"(i)", GTK_MENU_DIR_CHILD);
|
||||
|
||||
gtk_widget_class_set_accessible_role (widget_class, ATK_ROLE_MENU_BAR);
|
||||
gtk_widget_class_set_css_name (widget_class, I_("menubar"));
|
||||
@@ -285,15 +266,15 @@ _gtk_menu_bar_get_viewable_menu_bars (GtkWindow *window)
|
||||
gboolean viewable = TRUE;
|
||||
|
||||
while (widget)
|
||||
{
|
||||
if (!gtk_widget_get_mapped (widget))
|
||||
viewable = FALSE;
|
||||
{
|
||||
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);
|
||||
viewable_menu_bars = g_list_prepend (viewable_menu_bars, menu_bars->data);
|
||||
}
|
||||
|
||||
return g_list_reverse (viewable_menu_bars);
|
||||
@@ -301,7 +282,7 @@ _gtk_menu_bar_get_viewable_menu_bars (GtkWindow *window)
|
||||
|
||||
static void
|
||||
set_menu_bars (GtkWindow *window,
|
||||
GList *menubars)
|
||||
GList *menubars)
|
||||
{
|
||||
g_object_set_data (G_OBJECT (window), I_("gtk-menu-bar-list"), menubars);
|
||||
}
|
||||
@@ -358,7 +339,7 @@ gtk_menu_bar_unroot (GtkWidget *widget)
|
||||
**/
|
||||
void
|
||||
_gtk_menu_bar_cycle_focus (GtkMenuBar *menubar,
|
||||
GtkDirectionType dir)
|
||||
GtkDirectionType dir)
|
||||
{
|
||||
GtkWidget *toplevel = GTK_WIDGET (gtk_widget_get_root (GTK_WIDGET (menubar)));
|
||||
GtkMenuItem *to_activate = NULL;
|
||||
@@ -408,7 +389,7 @@ gtk_menu_bar_get_popup_delay (GtkMenuShell *menu_shell)
|
||||
|
||||
static void
|
||||
gtk_menu_bar_move_current (GtkMenuShell *menu_shell,
|
||||
GtkMenuDirectionType direction)
|
||||
GtkMenuDirectionType direction)
|
||||
{
|
||||
GtkMenuBar *menubar = GTK_MENU_BAR (menu_shell);
|
||||
|
||||
|
||||
@@ -125,7 +125,6 @@ enum {
|
||||
enum {
|
||||
PROP_0,
|
||||
PROP_SUBMENU,
|
||||
PROP_ACCEL_PATH,
|
||||
PROP_LABEL,
|
||||
PROP_USE_UNDERLINE,
|
||||
|
||||
@@ -193,11 +192,6 @@ static void gtk_menu_item_buildable_add_child (GtkBuildable *buildab
|
||||
GtkBuilder *builder,
|
||||
GObject *child,
|
||||
const gchar *type);
|
||||
static void gtk_menu_item_buildable_custom_finished(GtkBuildable *buildable,
|
||||
GtkBuilder *builder,
|
||||
GObject *child,
|
||||
const gchar *tagname,
|
||||
gpointer user_data);
|
||||
|
||||
static void gtk_menu_item_actionable_interface_init (GtkActionableInterface *iface);
|
||||
|
||||
@@ -607,20 +601,6 @@ gtk_menu_item_class_init (GtkMenuItemClass *klass)
|
||||
GTK_TYPE_MENU,
|
||||
GTK_PARAM_READWRITE);
|
||||
|
||||
/**
|
||||
* GtkMenuItem:accel-path:
|
||||
*
|
||||
* Sets the accelerator path of the menu item, through which runtime
|
||||
* changes of the menu item's accelerator caused by the user can be
|
||||
* identified and saved to persistant storage.
|
||||
*/
|
||||
menu_item_props[PROP_ACCEL_PATH] =
|
||||
g_param_spec_string ("accel-path",
|
||||
P_("Accel Path"),
|
||||
P_("Sets the accelerator path of the menu item"),
|
||||
NULL,
|
||||
GTK_PARAM_READWRITE);
|
||||
|
||||
/**
|
||||
* GtkMenuItem:label:
|
||||
*
|
||||
@@ -760,9 +740,6 @@ gtk_menu_item_set_property (GObject *object,
|
||||
case PROP_SUBMENU:
|
||||
gtk_menu_item_set_submenu (menu_item, g_value_get_object (value));
|
||||
break;
|
||||
case PROP_ACCEL_PATH:
|
||||
gtk_menu_item_set_accel_path (menu_item, g_value_get_string (value));
|
||||
break;
|
||||
case PROP_LABEL:
|
||||
gtk_menu_item_set_label (menu_item, g_value_get_string (value));
|
||||
break;
|
||||
@@ -795,9 +772,6 @@ gtk_menu_item_get_property (GObject *object,
|
||||
case PROP_SUBMENU:
|
||||
g_value_set_object (value, gtk_menu_item_get_submenu (menu_item));
|
||||
break;
|
||||
case PROP_ACCEL_PATH:
|
||||
g_value_set_string (value, gtk_menu_item_get_accel_path (menu_item));
|
||||
break;
|
||||
case PROP_LABEL:
|
||||
g_value_set_string (value, gtk_menu_item_get_label (menu_item));
|
||||
break;
|
||||
@@ -846,7 +820,6 @@ gtk_menu_item_buildable_interface_init (GtkBuildableIface *iface)
|
||||
{
|
||||
parent_buildable_iface = g_type_interface_peek_parent (iface);
|
||||
iface->add_child = gtk_menu_item_buildable_add_child;
|
||||
iface->custom_finished = gtk_menu_item_buildable_custom_finished;
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -862,46 +835,6 @@ gtk_menu_item_buildable_add_child (GtkBuildable *buildable,
|
||||
parent_buildable_iface->add_child (buildable, builder, child, type);
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
gtk_menu_item_buildable_custom_finished (GtkBuildable *buildable,
|
||||
GtkBuilder *builder,
|
||||
GObject *child,
|
||||
const gchar *tagname,
|
||||
gpointer user_data)
|
||||
{
|
||||
GtkWidget *toplevel;
|
||||
|
||||
if (strcmp (tagname, "accelerator") == 0)
|
||||
{
|
||||
GtkMenuShell *menu_shell;
|
||||
GtkWidget *attach;
|
||||
|
||||
menu_shell = gtk_menu_item_get_menu_shell (GTK_MENU_ITEM (buildable));
|
||||
if (menu_shell)
|
||||
{
|
||||
while (GTK_IS_MENU (menu_shell) &&
|
||||
(attach = gtk_menu_get_attach_widget (GTK_MENU (menu_shell))) != NULL)
|
||||
menu_shell = GTK_MENU_SHELL (gtk_widget_get_parent (attach));
|
||||
|
||||
toplevel = GTK_WIDGET (gtk_widget_get_root (GTK_WIDGET (menu_shell)));
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Fall back to something ... */
|
||||
toplevel = GTK_WIDGET (gtk_widget_get_root (GTK_WIDGET (buildable)));
|
||||
|
||||
g_warning ("found a GtkMenuItem '%s' without a parent GtkMenuShell, assigned accelerators wont work.",
|
||||
gtk_buildable_get_name (buildable));
|
||||
}
|
||||
|
||||
/* Feed the correct toplevel to the GtkWidget accelerator parsing code */
|
||||
_gtk_widget_buildable_finish_accelerator (GTK_WIDGET (buildable), toplevel, user_data);
|
||||
}
|
||||
else
|
||||
parent_buildable_iface->custom_finished (buildable, builder, child, tagname, user_data);
|
||||
}
|
||||
|
||||
static void
|
||||
update_arrow_classes (GtkMenuItem *menu_item)
|
||||
{
|
||||
@@ -1600,44 +1533,12 @@ gtk_menu_item_can_activate_accel (GtkWidget *widget,
|
||||
menu_shell && gtk_widget_can_activate_accel (GTK_WIDGET (menu_shell), signal_id));
|
||||
}
|
||||
|
||||
static void
|
||||
gtk_menu_item_accel_name_foreach (GtkWidget *widget,
|
||||
gpointer data)
|
||||
{
|
||||
const gchar **path_p = data;
|
||||
|
||||
if (!*path_p)
|
||||
{
|
||||
if (GTK_IS_LABEL (widget))
|
||||
{
|
||||
*path_p = gtk_label_get_text (GTK_LABEL (widget));
|
||||
if (*path_p && (*path_p)[0] == 0)
|
||||
*path_p = NULL;
|
||||
}
|
||||
else if (GTK_IS_CONTAINER (widget))
|
||||
gtk_container_foreach (GTK_CONTAINER (widget),
|
||||
gtk_menu_item_accel_name_foreach,
|
||||
data);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
gtk_menu_item_parent_cb (GObject *object,
|
||||
GParamSpec *pspec,
|
||||
gpointer user_data)
|
||||
{
|
||||
GtkMenuItem *menu_item = GTK_MENU_ITEM (object);
|
||||
GtkMenu *menu;
|
||||
GtkMenuShell *menu_shell;
|
||||
|
||||
menu_shell = gtk_menu_item_get_menu_shell (menu_item);
|
||||
menu = GTK_IS_MENU (menu_shell) ? GTK_MENU (menu_shell) : NULL;
|
||||
|
||||
if (menu)
|
||||
_gtk_menu_item_refresh_accel_path (menu_item,
|
||||
menu->priv->accel_path,
|
||||
menu->priv->accel_group,
|
||||
TRUE);
|
||||
|
||||
update_arrow_widget (menu_item);
|
||||
}
|
||||
@@ -1653,133 +1554,6 @@ gtk_menu_item_direction_changed (GtkWidget *widget,
|
||||
GTK_WIDGET_CLASS (gtk_menu_item_parent_class)->direction_changed (widget, previous_dir);
|
||||
}
|
||||
|
||||
void
|
||||
_gtk_menu_item_refresh_accel_path (GtkMenuItem *menu_item,
|
||||
const gchar *prefix,
|
||||
GtkAccelGroup *accel_group,
|
||||
gboolean group_changed)
|
||||
{
|
||||
GtkMenuItemPrivate *priv = menu_item->priv;
|
||||
const gchar *path;
|
||||
GtkWidget *widget;
|
||||
|
||||
g_return_if_fail (GTK_IS_MENU_ITEM (menu_item));
|
||||
g_return_if_fail (!accel_group || GTK_IS_ACCEL_GROUP (accel_group));
|
||||
|
||||
widget = GTK_WIDGET (menu_item);
|
||||
|
||||
if (!accel_group)
|
||||
{
|
||||
gtk_widget_set_accel_path (widget, NULL, NULL);
|
||||
return;
|
||||
}
|
||||
|
||||
path = _gtk_widget_get_accel_path (widget, NULL);
|
||||
if (!path) /* no active accel_path yet */
|
||||
{
|
||||
path = priv->accel_path;
|
||||
if (!path && prefix)
|
||||
{
|
||||
const gchar *postfix = NULL;
|
||||
gchar *new_path;
|
||||
|
||||
/* try to construct one from label text */
|
||||
gtk_container_foreach (GTK_CONTAINER (menu_item),
|
||||
gtk_menu_item_accel_name_foreach,
|
||||
&postfix);
|
||||
if (postfix)
|
||||
{
|
||||
new_path = g_strconcat (prefix, "/", postfix, NULL);
|
||||
path = priv->accel_path = g_intern_string (new_path);
|
||||
g_free (new_path);
|
||||
}
|
||||
}
|
||||
if (path)
|
||||
gtk_widget_set_accel_path (widget, path, accel_group);
|
||||
}
|
||||
else if (group_changed) /* reinstall accelerators */
|
||||
gtk_widget_set_accel_path (widget, path, accel_group);
|
||||
}
|
||||
|
||||
/**
|
||||
* gtk_menu_item_set_accel_path:
|
||||
* @menu_item: a valid #GtkMenuItem
|
||||
* @accel_path: (allow-none): accelerator path, corresponding to this menu
|
||||
* item’s functionality, or %NULL to unset the current path.
|
||||
*
|
||||
* Set the accelerator path on @menu_item, through which runtime
|
||||
* changes of the menu item’s accelerator caused by the user can be
|
||||
* identified and saved to persistent storage (see gtk_accel_map_save()
|
||||
* on this). To set up a default accelerator for this menu item, call
|
||||
* gtk_accel_map_add_entry() with the same @accel_path. See also
|
||||
* gtk_accel_map_add_entry() on the specifics of accelerator paths,
|
||||
* and gtk_menu_set_accel_path() for a more convenient variant of
|
||||
* this function.
|
||||
*
|
||||
* This function is basically a convenience wrapper that handles
|
||||
* calling gtk_widget_set_accel_path() with the appropriate accelerator
|
||||
* group for the menu item.
|
||||
*
|
||||
* Note that you do need to set an accelerator on the parent menu with
|
||||
* gtk_menu_set_accel_group() for this to work.
|
||||
*
|
||||
* Note that @accel_path string will be stored in a #GQuark.
|
||||
* Therefore, if you pass a static string, you can save some memory
|
||||
* by interning it first with g_intern_static_string().
|
||||
*/
|
||||
void
|
||||
gtk_menu_item_set_accel_path (GtkMenuItem *menu_item,
|
||||
const gchar *accel_path)
|
||||
{
|
||||
GtkMenuItemPrivate *priv = menu_item->priv;
|
||||
GtkWidget *widget;
|
||||
GtkMenuShell *menu_shell;
|
||||
|
||||
g_return_if_fail (GTK_IS_MENU_ITEM (menu_item));
|
||||
g_return_if_fail (accel_path == NULL ||
|
||||
(accel_path[0] == '<' && strchr (accel_path, '/')));
|
||||
|
||||
widget = GTK_WIDGET (menu_item);
|
||||
|
||||
/* store new path */
|
||||
priv->accel_path = g_intern_string (accel_path);
|
||||
|
||||
/* forget accelerators associated with old path */
|
||||
gtk_widget_set_accel_path (widget, NULL, NULL);
|
||||
|
||||
/* install accelerators associated with new path */
|
||||
menu_shell = gtk_menu_item_get_menu_shell (menu_item);
|
||||
if (GTK_IS_MENU (menu_shell))
|
||||
{
|
||||
GtkMenu *menu = GTK_MENU (menu_shell);
|
||||
|
||||
if (menu->priv->accel_group)
|
||||
_gtk_menu_item_refresh_accel_path (GTK_MENU_ITEM (widget),
|
||||
NULL,
|
||||
menu->priv->accel_group,
|
||||
FALSE);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* gtk_menu_item_get_accel_path:
|
||||
* @menu_item: a valid #GtkMenuItem
|
||||
*
|
||||
* Retrieve the accelerator path that was previously set on @menu_item.
|
||||
*
|
||||
* See gtk_menu_item_set_accel_path() for details.
|
||||
*
|
||||
* Returns: (nullable) (transfer none): the accelerator path corresponding to
|
||||
* this menu item’s functionality, or %NULL if not set
|
||||
*/
|
||||
const gchar *
|
||||
gtk_menu_item_get_accel_path (GtkMenuItem *menu_item)
|
||||
{
|
||||
g_return_val_if_fail (GTK_IS_MENU_ITEM (menu_item), NULL);
|
||||
|
||||
return menu_item->priv->accel_path;
|
||||
}
|
||||
|
||||
static void
|
||||
gtk_menu_item_forall (GtkContainer *container,
|
||||
GtkCallback callback,
|
||||
@@ -1820,8 +1594,6 @@ gtk_menu_item_ensure_label (GtkMenuItem *menu_item)
|
||||
gtk_widget_set_valign (accel_label, GTK_ALIGN_CENTER);
|
||||
|
||||
gtk_container_add (GTK_CONTAINER (menu_item), accel_label);
|
||||
gtk_accel_label_set_accel_widget (GTK_ACCEL_LABEL (accel_label),
|
||||
GTK_WIDGET (menu_item));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -129,11 +129,6 @@ void gtk_menu_item_toggle_size_request (GtkMenuItem *menu_item,
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
void gtk_menu_item_toggle_size_allocate (GtkMenuItem *menu_item,
|
||||
gint allocation);
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
void gtk_menu_item_set_accel_path (GtkMenuItem *menu_item,
|
||||
const gchar *accel_path);
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
const gchar * gtk_menu_item_get_accel_path (GtkMenuItem *menu_item);
|
||||
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
void gtk_menu_item_set_label (GtkMenuItem *menu_item,
|
||||
|
||||
@@ -35,8 +35,6 @@ struct _GtkMenuItemPrivate
|
||||
|
||||
guint timer;
|
||||
|
||||
const char *accel_path;
|
||||
|
||||
GtkActionHelper *action_helper;
|
||||
|
||||
GtkWidget *arrow_widget;
|
||||
@@ -49,10 +47,6 @@ struct _GtkMenuItemPrivate
|
||||
guint reserve_indicator : 1;
|
||||
};
|
||||
|
||||
void _gtk_menu_item_refresh_accel_path (GtkMenuItem *menu_item,
|
||||
const gchar *prefix,
|
||||
GtkAccelGroup *accel_group,
|
||||
gboolean group_changed);
|
||||
gboolean _gtk_menu_item_is_selectable (GtkWidget *menu_item);
|
||||
void _gtk_menu_item_popup_submenu (GtkWidget *menu_item,
|
||||
gboolean with_delay);
|
||||
|
||||
@@ -51,9 +51,6 @@ struct _GtkMenuPrivate
|
||||
GtkWidget *parent_menu_item;
|
||||
GtkWidget *old_active_menu_item;
|
||||
|
||||
GtkAccelGroup *accel_group;
|
||||
const char *accel_path;
|
||||
|
||||
gint position_x;
|
||||
gint position_y;
|
||||
|
||||
|
||||
+36
-203
@@ -59,7 +59,6 @@
|
||||
|
||||
#include "gtkmenushellprivate.h"
|
||||
|
||||
#include "gtkbindings.h"
|
||||
#include "gtkintl.h"
|
||||
#include "gtkkeyhash.h"
|
||||
#include "gtklabelprivate.h"
|
||||
@@ -67,7 +66,6 @@
|
||||
#include "gtkmarshalers.h"
|
||||
#include "gtkmenubarprivate.h"
|
||||
#include "gtkmenuitemprivate.h"
|
||||
#include "gtkmnemonichash.h"
|
||||
#include "gtkmodelmenuitemprivate.h"
|
||||
#include "gtkprivate.h"
|
||||
#include "gtkseparatormenuitem.h"
|
||||
@@ -111,14 +109,12 @@ static void gtk_menu_shell_get_property (GObject *object,
|
||||
guint prop_id,
|
||||
GValue *value,
|
||||
GParamSpec *pspec);
|
||||
static void gtk_menu_shell_finalize (GObject *object);
|
||||
static void gtk_menu_shell_dispose (GObject *object);
|
||||
static gboolean gtk_menu_shell_key_press (GtkEventControllerKey *key,
|
||||
guint keyval,
|
||||
guint keycode,
|
||||
GdkModifierType modifiers,
|
||||
GtkWidget *widget);
|
||||
static void gtk_menu_shell_root (GtkWidget *widget);
|
||||
static void click_pressed (GtkGestureClick *gesture,
|
||||
gint n_press,
|
||||
gdouble x,
|
||||
@@ -151,11 +147,6 @@ static void gtk_real_menu_shell_cancel (GtkMenuShell *menu_shell)
|
||||
static void gtk_real_menu_shell_cycle_focus (GtkMenuShell *menu_shell,
|
||||
GtkDirectionType dir);
|
||||
|
||||
static void gtk_menu_shell_reset_key_hash (GtkMenuShell *menu_shell);
|
||||
static gboolean gtk_menu_shell_activate_mnemonic (GtkMenuShell *menu_shell,
|
||||
guint keycode,
|
||||
GdkModifierType state,
|
||||
guint group);
|
||||
static gboolean gtk_menu_shell_real_move_selected (GtkMenuShell *menu_shell,
|
||||
gint distance);
|
||||
|
||||
@@ -166,23 +157,14 @@ G_DEFINE_ABSTRACT_TYPE_WITH_PRIVATE (GtkMenuShell, gtk_menu_shell, GTK_TYPE_CONT
|
||||
static void
|
||||
gtk_menu_shell_class_init (GtkMenuShellClass *klass)
|
||||
{
|
||||
GObjectClass *object_class;
|
||||
GtkWidgetClass *widget_class;
|
||||
GtkContainerClass *container_class;
|
||||
|
||||
GtkBindingSet *binding_set;
|
||||
|
||||
object_class = (GObjectClass*) klass;
|
||||
widget_class = (GtkWidgetClass*) klass;
|
||||
container_class = (GtkContainerClass*) klass;
|
||||
GObjectClass *object_class = G_OBJECT_CLASS (klass);
|
||||
GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
|
||||
GtkContainerClass *container_class = GTK_CONTAINER_CLASS (klass);
|
||||
|
||||
object_class->set_property = gtk_menu_shell_set_property;
|
||||
object_class->get_property = gtk_menu_shell_get_property;
|
||||
object_class->finalize = gtk_menu_shell_finalize;
|
||||
object_class->dispose = gtk_menu_shell_dispose;
|
||||
|
||||
widget_class->root = gtk_menu_shell_root;
|
||||
|
||||
container_class->add = gtk_menu_shell_add;
|
||||
container_class->remove = gtk_menu_shell_remove;
|
||||
container_class->child_type = gtk_menu_shell_child_type;
|
||||
@@ -343,43 +325,38 @@ gtk_menu_shell_class_init (GtkMenuShellClass *klass)
|
||||
_gtk_marshal_VOID__OBJECT_INTv);
|
||||
|
||||
|
||||
binding_set = gtk_binding_set_by_class (klass);
|
||||
gtk_binding_entry_add_signal (binding_set,
|
||||
GDK_KEY_Escape, 0,
|
||||
"cancel", 0);
|
||||
gtk_binding_entry_add_signal (binding_set,
|
||||
GDK_KEY_Return, 0,
|
||||
"activate-current", 1,
|
||||
G_TYPE_BOOLEAN,
|
||||
TRUE);
|
||||
gtk_binding_entry_add_signal (binding_set,
|
||||
GDK_KEY_ISO_Enter, 0,
|
||||
"activate-current", 1,
|
||||
G_TYPE_BOOLEAN,
|
||||
TRUE);
|
||||
gtk_binding_entry_add_signal (binding_set,
|
||||
GDK_KEY_KP_Enter, 0,
|
||||
"activate-current", 1,
|
||||
G_TYPE_BOOLEAN,
|
||||
TRUE);
|
||||
gtk_binding_entry_add_signal (binding_set,
|
||||
GDK_KEY_space, 0,
|
||||
"activate-current", 1,
|
||||
G_TYPE_BOOLEAN,
|
||||
FALSE);
|
||||
gtk_binding_entry_add_signal (binding_set,
|
||||
GDK_KEY_KP_Space, 0,
|
||||
"activate-current", 1,
|
||||
G_TYPE_BOOLEAN,
|
||||
FALSE);
|
||||
gtk_binding_entry_add_signal (binding_set,
|
||||
GDK_KEY_F10, 0,
|
||||
"cycle-focus", 1,
|
||||
GTK_TYPE_DIRECTION_TYPE, GTK_DIR_TAB_FORWARD);
|
||||
gtk_binding_entry_add_signal (binding_set,
|
||||
GDK_KEY_F10, GDK_SHIFT_MASK,
|
||||
"cycle-focus", 1,
|
||||
GTK_TYPE_DIRECTION_TYPE, GTK_DIR_TAB_BACKWARD);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_Escape, 0,
|
||||
"cancel",
|
||||
NULL);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_Return, 0,
|
||||
"activate-current",
|
||||
"(b)", TRUE);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_ISO_Enter, 0,
|
||||
"activate-current",
|
||||
"(b)", TRUE);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_KP_Enter, 0,
|
||||
"activate-current",
|
||||
"(b)", TRUE);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_space, 0,
|
||||
"activate-current",
|
||||
"(b)", FALSE);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_KP_Space, 0,
|
||||
"activate-current",
|
||||
"(b)", FALSE);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_F10, 0,
|
||||
"cycle-focus",
|
||||
"(i)", GTK_DIR_TAB_FORWARD);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_F10, GDK_SHIFT_MASK,
|
||||
"cycle-focus",
|
||||
"(i)", GTK_DIR_TAB_BACKWARD);
|
||||
|
||||
/**
|
||||
* GtkMenuShell:take-focus:
|
||||
@@ -470,21 +447,6 @@ gtk_menu_shell_get_property (GObject *object,
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
gtk_menu_shell_finalize (GObject *object)
|
||||
{
|
||||
GtkMenuShell *menu_shell = GTK_MENU_SHELL (object);
|
||||
GtkMenuShellPrivate *priv = menu_shell->priv;
|
||||
|
||||
if (priv->mnemonic_hash)
|
||||
_gtk_mnemonic_hash_free (priv->mnemonic_hash);
|
||||
if (priv->key_hash)
|
||||
_gtk_key_hash_free (priv->key_hash);
|
||||
|
||||
G_OBJECT_CLASS (gtk_menu_shell_parent_class)->finalize (object);
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
gtk_menu_shell_dispose (GObject *object)
|
||||
{
|
||||
@@ -921,16 +883,7 @@ gtk_menu_shell_key_press (GtkEventControllerKey *key,
|
||||
priv->parent_menu_shell)
|
||||
return gtk_event_controller_key_forward (key, priv->parent_menu_shell);
|
||||
|
||||
return gtk_menu_shell_activate_mnemonic (menu_shell, keycode, modifiers,
|
||||
gtk_event_controller_key_get_group (key));
|
||||
}
|
||||
|
||||
static void
|
||||
gtk_menu_shell_root (GtkWidget *widget)
|
||||
{
|
||||
GTK_WIDGET_CLASS (gtk_menu_shell_parent_class)->root (widget);
|
||||
|
||||
gtk_menu_shell_reset_key_hash (GTK_MENU_SHELL (widget));
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -1478,126 +1431,6 @@ gtk_menu_shell_cancel (GtkMenuShell *menu_shell)
|
||||
g_signal_emit (menu_shell, menu_shell_signals[CANCEL], 0);
|
||||
}
|
||||
|
||||
static GtkMnemonicHash *
|
||||
gtk_menu_shell_get_mnemonic_hash (GtkMenuShell *menu_shell,
|
||||
gboolean create)
|
||||
{
|
||||
GtkMenuShellPrivate *priv = menu_shell->priv;
|
||||
|
||||
if (!priv->mnemonic_hash && create)
|
||||
priv->mnemonic_hash = _gtk_mnemonic_hash_new ();
|
||||
|
||||
return priv->mnemonic_hash;
|
||||
}
|
||||
|
||||
static void
|
||||
menu_shell_add_mnemonic_foreach (guint keyval,
|
||||
GSList *targets,
|
||||
gpointer data)
|
||||
{
|
||||
GtkKeyHash *key_hash = data;
|
||||
|
||||
_gtk_key_hash_add_entry (key_hash, keyval, 0, GUINT_TO_POINTER (keyval));
|
||||
}
|
||||
|
||||
static GtkKeyHash *
|
||||
gtk_menu_shell_get_key_hash (GtkMenuShell *menu_shell,
|
||||
gboolean create)
|
||||
{
|
||||
GtkMenuShellPrivate *priv = menu_shell->priv;
|
||||
GtkWidget *widget = GTK_WIDGET (menu_shell);
|
||||
|
||||
if (!priv->key_hash && create)
|
||||
{
|
||||
GtkMnemonicHash *mnemonic_hash = gtk_menu_shell_get_mnemonic_hash (menu_shell, FALSE);
|
||||
GdkKeymap *keymap = gdk_display_get_keymap (gtk_widget_get_display (widget));
|
||||
|
||||
if (!mnemonic_hash)
|
||||
return NULL;
|
||||
|
||||
priv->key_hash = _gtk_key_hash_new (keymap, NULL);
|
||||
|
||||
_gtk_mnemonic_hash_foreach (mnemonic_hash,
|
||||
menu_shell_add_mnemonic_foreach,
|
||||
priv->key_hash);
|
||||
}
|
||||
|
||||
return priv->key_hash;
|
||||
}
|
||||
|
||||
static void
|
||||
gtk_menu_shell_reset_key_hash (GtkMenuShell *menu_shell)
|
||||
{
|
||||
GtkMenuShellPrivate *priv = menu_shell->priv;
|
||||
|
||||
if (priv->key_hash)
|
||||
{
|
||||
_gtk_key_hash_free (priv->key_hash);
|
||||
priv->key_hash = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
static gboolean
|
||||
gtk_menu_shell_activate_mnemonic (GtkMenuShell *menu_shell,
|
||||
guint keycode,
|
||||
GdkModifierType state,
|
||||
guint group)
|
||||
{
|
||||
GtkMnemonicHash *mnemonic_hash;
|
||||
GtkKeyHash *key_hash;
|
||||
GSList *entries;
|
||||
gboolean result = FALSE;
|
||||
|
||||
mnemonic_hash = gtk_menu_shell_get_mnemonic_hash (menu_shell, FALSE);
|
||||
if (!mnemonic_hash)
|
||||
return FALSE;
|
||||
|
||||
key_hash = gtk_menu_shell_get_key_hash (menu_shell, TRUE);
|
||||
if (!key_hash)
|
||||
return FALSE;
|
||||
|
||||
entries = _gtk_key_hash_lookup (key_hash,
|
||||
keycode,
|
||||
state,
|
||||
gtk_accelerator_get_default_mod_mask (),
|
||||
group);
|
||||
|
||||
if (entries)
|
||||
{
|
||||
result = _gtk_mnemonic_hash_activate (mnemonic_hash,
|
||||
GPOINTER_TO_UINT (entries->data));
|
||||
g_slist_free (entries);
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
void
|
||||
_gtk_menu_shell_add_mnemonic (GtkMenuShell *menu_shell,
|
||||
guint keyval,
|
||||
GtkWidget *target)
|
||||
{
|
||||
g_return_if_fail (GTK_IS_MENU_SHELL (menu_shell));
|
||||
g_return_if_fail (GTK_IS_WIDGET (target));
|
||||
|
||||
_gtk_mnemonic_hash_add (gtk_menu_shell_get_mnemonic_hash (menu_shell, TRUE),
|
||||
keyval, target);
|
||||
gtk_menu_shell_reset_key_hash (menu_shell);
|
||||
}
|
||||
|
||||
void
|
||||
_gtk_menu_shell_remove_mnemonic (GtkMenuShell *menu_shell,
|
||||
guint keyval,
|
||||
GtkWidget *target)
|
||||
{
|
||||
g_return_if_fail (GTK_IS_MENU_SHELL (menu_shell));
|
||||
g_return_if_fail (GTK_IS_WIDGET (target));
|
||||
|
||||
_gtk_mnemonic_hash_remove (gtk_menu_shell_get_mnemonic_hash (menu_shell, TRUE),
|
||||
keyval, target);
|
||||
gtk_menu_shell_reset_key_hash (menu_shell);
|
||||
}
|
||||
|
||||
void
|
||||
_gtk_menu_shell_set_grab_device (GtkMenuShell *menu_shell,
|
||||
GdkDevice *device)
|
||||
|
||||
@@ -20,7 +20,6 @@
|
||||
|
||||
|
||||
#include <gtk/gtkmenushell.h>
|
||||
#include <gtk/gtkmnemonichash.h>
|
||||
#include <gtk/gtkkeyhash.h>
|
||||
#include <gtk/gtkmenutrackerprivate.h>
|
||||
#include <gtk/gtkeventcontroller.h>
|
||||
@@ -65,9 +64,6 @@ struct _GtkMenuShellPrivate
|
||||
* signal is coming soon (when checked
|
||||
* from inside of a "hide" handler).
|
||||
*/
|
||||
GtkMnemonicHash *mnemonic_hash;
|
||||
GtkKeyHash *key_hash;
|
||||
|
||||
GdkDevice *grab_pointer;
|
||||
GtkEventController *key_controller;
|
||||
};
|
||||
@@ -79,13 +75,6 @@ void _gtk_menu_shell_set_grab_device (GtkMenuShell *menu_shell,
|
||||
GdkDevice *device);
|
||||
GdkDevice *_gtk_menu_shell_get_grab_device (GtkMenuShell *menu_shell);
|
||||
|
||||
void _gtk_menu_shell_add_mnemonic (GtkMenuShell *menu_shell,
|
||||
guint keyval,
|
||||
GtkWidget *target);
|
||||
void _gtk_menu_shell_remove_mnemonic (GtkMenuShell *menu_shell,
|
||||
guint keyval,
|
||||
GtkWidget *target);
|
||||
|
||||
void _gtk_menu_shell_update_mnemonics (GtkMenuShell *menu_shell);
|
||||
void _gtk_menu_shell_set_keyboard_mode (GtkMenuShell *menu_shell,
|
||||
gboolean keyboard_mode);
|
||||
|
||||
@@ -1,201 +0,0 @@
|
||||
/* gtkmnemonichash.c: Sets of mnemonics with cycling
|
||||
*
|
||||
* GTK - The GIMP Toolkit
|
||||
* Copyright (C) 2002, Red Hat Inc.
|
||||
*
|
||||
* 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/>.
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
|
||||
#include "gtkmnemonichash.h"
|
||||
#include "gtknative.h"
|
||||
|
||||
struct _GtkMnemnonicHash
|
||||
{
|
||||
GHashTable *hash;
|
||||
};
|
||||
|
||||
|
||||
GtkMnemonicHash *
|
||||
_gtk_mnemonic_hash_new (void)
|
||||
{
|
||||
GtkMnemonicHash *mnemonic_hash = g_new (GtkMnemonicHash, 1);
|
||||
|
||||
mnemonic_hash->hash = g_hash_table_new (g_direct_hash, NULL);
|
||||
|
||||
return mnemonic_hash;
|
||||
}
|
||||
|
||||
static void
|
||||
mnemonic_hash_free_foreach (gpointer key,
|
||||
gpointer value,
|
||||
gpointer user)
|
||||
{
|
||||
guint keyval = GPOINTER_TO_UINT (key);
|
||||
GSList *targets = value;
|
||||
|
||||
gchar *name = gtk_accelerator_name (keyval, 0);
|
||||
|
||||
g_warning ("mnemonic \"%s\" wasn't removed for widget (%p)",
|
||||
name, targets->data);
|
||||
g_free (name);
|
||||
|
||||
g_slist_free (targets);
|
||||
}
|
||||
|
||||
void
|
||||
_gtk_mnemonic_hash_free (GtkMnemonicHash *mnemonic_hash)
|
||||
{
|
||||
g_hash_table_foreach (mnemonic_hash->hash,
|
||||
mnemonic_hash_free_foreach,
|
||||
NULL);
|
||||
|
||||
g_hash_table_destroy (mnemonic_hash->hash);
|
||||
g_free (mnemonic_hash);
|
||||
}
|
||||
|
||||
void
|
||||
_gtk_mnemonic_hash_add (GtkMnemonicHash *mnemonic_hash,
|
||||
guint keyval,
|
||||
GtkWidget *target)
|
||||
{
|
||||
gpointer key = GUINT_TO_POINTER (keyval);
|
||||
GSList *targets, *new_targets;
|
||||
|
||||
g_return_if_fail (GTK_IS_WIDGET (target));
|
||||
|
||||
targets = g_hash_table_lookup (mnemonic_hash->hash, key);
|
||||
g_return_if_fail (g_slist_find (targets, target) == NULL);
|
||||
|
||||
new_targets = g_slist_append (targets, target);
|
||||
if (new_targets != targets)
|
||||
g_hash_table_insert (mnemonic_hash->hash, key, new_targets);
|
||||
}
|
||||
|
||||
void
|
||||
_gtk_mnemonic_hash_remove (GtkMnemonicHash *mnemonic_hash,
|
||||
guint keyval,
|
||||
GtkWidget *target)
|
||||
{
|
||||
gpointer key = GUINT_TO_POINTER (keyval);
|
||||
GSList *targets, *new_targets;
|
||||
|
||||
g_return_if_fail (GTK_IS_WIDGET (target));
|
||||
|
||||
targets = g_hash_table_lookup (mnemonic_hash->hash, key);
|
||||
|
||||
g_return_if_fail (targets && g_slist_find (targets, target) != NULL);
|
||||
|
||||
new_targets = g_slist_remove (targets, target);
|
||||
if (new_targets != targets)
|
||||
{
|
||||
if (new_targets == NULL)
|
||||
g_hash_table_remove (mnemonic_hash->hash, key);
|
||||
else
|
||||
g_hash_table_insert (mnemonic_hash->hash, key, new_targets);
|
||||
}
|
||||
}
|
||||
|
||||
gboolean
|
||||
_gtk_mnemonic_hash_activate (GtkMnemonicHash *mnemonic_hash,
|
||||
guint keyval)
|
||||
{
|
||||
GSList *list, *targets;
|
||||
GtkWidget *widget, *chosen_widget;
|
||||
GdkSurface *surface;
|
||||
gboolean overloaded;
|
||||
|
||||
targets = g_hash_table_lookup (mnemonic_hash->hash,
|
||||
GUINT_TO_POINTER (keyval));
|
||||
if (!targets)
|
||||
return FALSE;
|
||||
|
||||
overloaded = FALSE;
|
||||
chosen_widget = NULL;
|
||||
for (list = targets; list; list = list->next)
|
||||
{
|
||||
widget = GTK_WIDGET (list->data);
|
||||
surface = gtk_native_get_surface (gtk_widget_get_native (widget));
|
||||
|
||||
if (gtk_widget_is_sensitive (widget) &&
|
||||
gtk_widget_get_mapped (widget) &&
|
||||
surface && gdk_surface_is_viewable (surface))
|
||||
{
|
||||
if (chosen_widget)
|
||||
{
|
||||
overloaded = TRUE;
|
||||
break;
|
||||
}
|
||||
else
|
||||
chosen_widget = widget;
|
||||
}
|
||||
}
|
||||
|
||||
if (chosen_widget)
|
||||
{
|
||||
/* For round robin we put the activated entry on
|
||||
* the end of the list after activation
|
||||
*/
|
||||
targets = g_slist_remove (targets, chosen_widget);
|
||||
targets = g_slist_append (targets, chosen_widget);
|
||||
g_hash_table_insert (mnemonic_hash->hash,
|
||||
GUINT_TO_POINTER (keyval),
|
||||
targets);
|
||||
|
||||
return gtk_widget_mnemonic_activate (chosen_widget, overloaded);
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
GSList *
|
||||
_gtk_mnemonic_hash_lookup (GtkMnemonicHash *mnemonic_hash,
|
||||
guint keyval)
|
||||
{
|
||||
return g_hash_table_lookup (mnemonic_hash->hash, GUINT_TO_POINTER (keyval));
|
||||
}
|
||||
|
||||
static void
|
||||
mnemonic_hash_foreach_func (gpointer key,
|
||||
gpointer value,
|
||||
gpointer data)
|
||||
{
|
||||
struct {
|
||||
GtkMnemonicHashForeach func;
|
||||
gpointer func_data;
|
||||
} *info = data;
|
||||
|
||||
guint keyval = GPOINTER_TO_UINT (key);
|
||||
GSList *targets = value;
|
||||
|
||||
(*info->func) (keyval, targets, info->func_data);
|
||||
}
|
||||
|
||||
void
|
||||
_gtk_mnemonic_hash_foreach (GtkMnemonicHash *mnemonic_hash,
|
||||
GtkMnemonicHashForeach func,
|
||||
gpointer func_data)
|
||||
{
|
||||
struct {
|
||||
GtkMnemonicHashForeach func;
|
||||
gpointer func_data;
|
||||
} info;
|
||||
|
||||
info.func = func;
|
||||
info.func_data = func_data;
|
||||
|
||||
g_hash_table_foreach (mnemonic_hash->hash,
|
||||
mnemonic_hash_foreach_func,
|
||||
&info);
|
||||
}
|
||||
@@ -1,52 +0,0 @@
|
||||
/* gtkmnemonichash.h: Sets of mnemonics with cycling
|
||||
*
|
||||
* GTK - The GIMP Toolkit
|
||||
* Copyright (C) 2002, Red Hat Inc.
|
||||
*
|
||||
* 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_MNEMONIC_HASH_H__
|
||||
#define __GTK_MNEMONIC_HASH_H__
|
||||
|
||||
#include <gdk/gdk.h>
|
||||
#include <gtk/gtkwidget.h>
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
typedef struct _GtkMnemnonicHash GtkMnemonicHash;
|
||||
|
||||
typedef void (*GtkMnemonicHashForeach) (guint keyval,
|
||||
GSList *targets,
|
||||
gpointer data);
|
||||
|
||||
GtkMnemonicHash *_gtk_mnemonic_hash_new (void);
|
||||
void _gtk_mnemonic_hash_free (GtkMnemonicHash *mnemonic_hash);
|
||||
void _gtk_mnemonic_hash_add (GtkMnemonicHash *mnemonic_hash,
|
||||
guint keyval,
|
||||
GtkWidget *target);
|
||||
void _gtk_mnemonic_hash_remove (GtkMnemonicHash *mnemonic_hash,
|
||||
guint keyval,
|
||||
GtkWidget *target);
|
||||
gboolean _gtk_mnemonic_hash_activate (GtkMnemonicHash *mnemonic_hash,
|
||||
guint keyval);
|
||||
GSList * _gtk_mnemonic_hash_lookup (GtkMnemonicHash *mnemonic_hash,
|
||||
guint keyval);
|
||||
void _gtk_mnemonic_hash_foreach (GtkMnemonicHash *mnemonic_hash,
|
||||
GtkMnemonicHashForeach func,
|
||||
gpointer func_data);
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
#endif /* __GTK_MNEMONIC_HASH_H__ */
|
||||
+1
-53
@@ -39,7 +39,6 @@
|
||||
#include "gtkcontainerprivate.h"
|
||||
#include "gtkiconprivate.h"
|
||||
#include "gtksizegroup.h"
|
||||
#include "gtkaccellabelprivate.h"
|
||||
#include "gtkactionable.h"
|
||||
#include "gtkeventcontrollermotion.h"
|
||||
#include "gtkeventcontrollerkey.h"
|
||||
@@ -525,19 +524,7 @@ update_accel (GtkModelButton *button,
|
||||
{
|
||||
if (accel)
|
||||
{
|
||||
guint key;
|
||||
GdkModifierType mods;
|
||||
GtkAccelLabelClass *accel_class;
|
||||
char *str;
|
||||
|
||||
gtk_accelerator_parse (accel, &key, &mods);
|
||||
|
||||
accel_class = g_type_class_ref (GTK_TYPE_ACCEL_LABEL);
|
||||
str = _gtk_accel_label_class_get_accelerator_label (accel_class, key, mods);
|
||||
gtk_label_set_label (GTK_LABEL (button->accel_label), str);
|
||||
g_free (str);
|
||||
g_type_class_unref (accel_class);
|
||||
|
||||
gtk_label_set_label (GTK_LABEL (button->accel_label), accel);
|
||||
gtk_widget_show (button->accel_label);
|
||||
}
|
||||
else
|
||||
@@ -919,44 +906,6 @@ gtk_model_button_finalize (GObject *object)
|
||||
G_OBJECT_CLASS (gtk_model_button_parent_class)->finalize (object);
|
||||
}
|
||||
|
||||
static void
|
||||
gtk_model_button_map (GtkWidget *widget)
|
||||
{
|
||||
GtkModelButton *button = GTK_MODEL_BUTTON (widget);
|
||||
GtkWindow *window;
|
||||
GtkApplication *app;
|
||||
const char *action_name;
|
||||
GVariant *action_target;
|
||||
|
||||
GTK_WIDGET_CLASS (gtk_model_button_parent_class)->map (widget);
|
||||
|
||||
if (button->accel)
|
||||
return;
|
||||
|
||||
window = GTK_WINDOW (gtk_widget_get_root (widget));
|
||||
app = gtk_window_get_application (window);
|
||||
|
||||
if (!app)
|
||||
return;
|
||||
|
||||
action_name = gtk_actionable_get_action_name (GTK_ACTIONABLE (widget));
|
||||
action_target = gtk_actionable_get_action_target_value (GTK_ACTIONABLE (widget));
|
||||
|
||||
if (action_name)
|
||||
{
|
||||
char *detailed;
|
||||
char **accels;
|
||||
|
||||
detailed = g_action_print_detailed_name (action_name, action_target);
|
||||
accels = gtk_application_get_accels_for_action (app, detailed);
|
||||
|
||||
update_accel (button, accels[0]);
|
||||
|
||||
g_strfreev (accels);
|
||||
g_free (detailed);
|
||||
}
|
||||
}
|
||||
|
||||
static gboolean
|
||||
gtk_model_button_focus (GtkWidget *widget,
|
||||
GtkDirectionType direction)
|
||||
@@ -1003,7 +952,6 @@ gtk_model_button_class_init (GtkModelButtonClass *class)
|
||||
widget_class->measure = gtk_model_button_measure;
|
||||
widget_class->size_allocate = gtk_model_button_size_allocate;
|
||||
widget_class->destroy = gtk_model_button_destroy;
|
||||
widget_class->map = gtk_model_button_map;
|
||||
widget_class->state_flags_changed = gtk_model_button_state_flags_changed;
|
||||
widget_class->direction_changed = gtk_model_button_direction_changed;
|
||||
widget_class->focus = gtk_model_button_focus;
|
||||
|
||||
@@ -310,9 +310,10 @@ gtk_model_menu_item_set_accel (GtkModelMenuItem *item,
|
||||
|
||||
if (accel)
|
||||
{
|
||||
gtk_accelerator_parse (accel, &key, &modifiers);
|
||||
if (!key)
|
||||
modifiers = 0;
|
||||
if (!gtk_accelerator_parse (accel, &key, &modifiers))
|
||||
{
|
||||
g_warning ("\"%s\" is not a valida accelerator, ignoring", accel);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
+18
-3
@@ -53,6 +53,10 @@
|
||||
#include "gtkstylecontextprivate.h"
|
||||
#include "gtkdialogprivate.h"
|
||||
#include "gtkgestureclick.h"
|
||||
#include "gtkshortcutcontroller.h"
|
||||
#include "gtkshortcuttrigger.h"
|
||||
#include "gtkshortcutaction.h"
|
||||
#include "gtkshortcut.h"
|
||||
|
||||
#include <glib/gprintf.h>
|
||||
|
||||
@@ -1335,6 +1339,7 @@ do_popup_menu_for_process_tree_view (GtkWidget *widget,
|
||||
|
||||
static gboolean
|
||||
on_popup_menu_for_process_tree_view (GtkWidget *widget,
|
||||
GVariant *args,
|
||||
gpointer user_data)
|
||||
{
|
||||
GtkMountOperation *op = GTK_MOUNT_OPERATION (user_data);
|
||||
@@ -1380,6 +1385,10 @@ create_show_processes_dialog (GtkMountOperation *op,
|
||||
gchar *s;
|
||||
gboolean use_header;
|
||||
GtkGesture *gesture;
|
||||
GtkEventController *controller;
|
||||
GtkShortcutTrigger *trigger;
|
||||
GtkShortcutAction *action;
|
||||
GtkShortcut *shortcut;
|
||||
|
||||
priv = op->priv;
|
||||
|
||||
@@ -1466,9 +1475,15 @@ create_show_processes_dialog (GtkMountOperation *op,
|
||||
gtk_container_add (GTK_CONTAINER (scrolled_window), tree_view);
|
||||
gtk_container_add (GTK_CONTAINER (vbox), scrolled_window);
|
||||
|
||||
g_signal_connect (tree_view, "popup-menu",
|
||||
G_CALLBACK (on_popup_menu_for_process_tree_view),
|
||||
op);
|
||||
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_popup_menu_for_process_tree_view, op, NULL);
|
||||
shortcut = gtk_shortcut_new (trigger, action);
|
||||
gtk_shortcut_controller_add_shortcut (GTK_SHORTCUT_CONTROLLER (controller),
|
||||
shortcut);
|
||||
g_object_unref (shortcut);
|
||||
gtk_widget_add_controller (tree_view, controller);
|
||||
|
||||
gesture = gtk_gesture_click_new ();
|
||||
gtk_gesture_single_set_button (GTK_GESTURE_SINGLE (gesture), GDK_BUTTON_SECONDARY);
|
||||
|
||||
+97
-84
@@ -27,7 +27,6 @@
|
||||
|
||||
#include "gtknotebook.h"
|
||||
|
||||
#include "gtkbindings.h"
|
||||
#include "gtkbox.h"
|
||||
#include "gtkbuildable.h"
|
||||
#include "gtkbutton.h"
|
||||
@@ -693,7 +692,9 @@ static void gtk_notebook_size_allocate (GtkWidget *widget,
|
||||
int width,
|
||||
int height,
|
||||
int baseline);
|
||||
static gboolean gtk_notebook_popup_menu (GtkWidget *widget);
|
||||
static gboolean gtk_notebook_popup_menu (GtkWidget *widget,
|
||||
GVariant *args,
|
||||
gpointer user_data);
|
||||
static void gtk_notebook_motion (GtkEventController *controller,
|
||||
double x,
|
||||
double y,
|
||||
@@ -864,49 +865,53 @@ G_DEFINE_TYPE_WITH_CODE (GtkNotebook, gtk_notebook, GTK_TYPE_CONTAINER,
|
||||
gtk_notebook_buildable_init))
|
||||
|
||||
static void
|
||||
add_tab_bindings (GtkBindingSet *binding_set,
|
||||
add_tab_bindings (GtkWidgetClass *widget_class,
|
||||
GdkModifierType modifiers,
|
||||
GtkDirectionType direction)
|
||||
{
|
||||
gtk_binding_entry_add_signal (binding_set, GDK_KEY_Tab, modifiers,
|
||||
"move_focus_out", 1,
|
||||
GTK_TYPE_DIRECTION_TYPE, direction);
|
||||
gtk_binding_entry_add_signal (binding_set, GDK_KEY_KP_Tab, modifiers,
|
||||
"move_focus_out", 1,
|
||||
GTK_TYPE_DIRECTION_TYPE, direction);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_Tab, modifiers,
|
||||
"move_focus_out",
|
||||
"(i)", direction);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_KP_Tab, modifiers,
|
||||
"move_focus_out",
|
||||
"(i)", direction);
|
||||
}
|
||||
|
||||
static void
|
||||
add_arrow_bindings (GtkBindingSet *binding_set,
|
||||
add_arrow_bindings (GtkWidgetClass *widget_class,
|
||||
guint keysym,
|
||||
GtkDirectionType direction)
|
||||
{
|
||||
guint keypad_keysym = keysym - GDK_KEY_Left + GDK_KEY_KP_Left;
|
||||
|
||||
gtk_binding_entry_add_signal (binding_set, keysym, GDK_CONTROL_MASK,
|
||||
"move_focus_out", 1,
|
||||
GTK_TYPE_DIRECTION_TYPE, direction);
|
||||
gtk_binding_entry_add_signal (binding_set, keypad_keysym, GDK_CONTROL_MASK,
|
||||
"move_focus_out", 1,
|
||||
GTK_TYPE_DIRECTION_TYPE, direction);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
keysym, GDK_CONTROL_MASK,
|
||||
"move_focus_out",
|
||||
"(i)", direction);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
keypad_keysym, GDK_CONTROL_MASK,
|
||||
"move_focus_out",
|
||||
"(i)", direction);
|
||||
}
|
||||
|
||||
static void
|
||||
add_reorder_bindings (GtkBindingSet *binding_set,
|
||||
add_reorder_bindings (GtkWidgetClass *widget_class,
|
||||
guint keysym,
|
||||
GtkDirectionType direction,
|
||||
gboolean move_to_last)
|
||||
{
|
||||
guint keypad_keysym = keysym - GDK_KEY_Left + GDK_KEY_KP_Left;
|
||||
|
||||
gtk_binding_entry_add_signal (binding_set, keysym, GDK_MOD1_MASK,
|
||||
"reorder_tab", 2,
|
||||
GTK_TYPE_DIRECTION_TYPE, direction,
|
||||
G_TYPE_BOOLEAN, move_to_last);
|
||||
gtk_binding_entry_add_signal (binding_set, keypad_keysym, GDK_MOD1_MASK,
|
||||
"reorder_tab", 2,
|
||||
GTK_TYPE_DIRECTION_TYPE, direction,
|
||||
G_TYPE_BOOLEAN, move_to_last);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
keysym, GDK_MOD1_MASK,
|
||||
"reorder_tab",
|
||||
"(ib)", direction, move_to_last);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
keypad_keysym, GDK_MOD1_MASK,
|
||||
"reorder_tab",
|
||||
"(ib)", direction, move_to_last);
|
||||
}
|
||||
|
||||
static gboolean
|
||||
@@ -964,7 +969,6 @@ gtk_notebook_class_init (GtkNotebookClass *class)
|
||||
GObjectClass *gobject_class = G_OBJECT_CLASS (class);
|
||||
GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (class);
|
||||
GtkContainerClass *container_class = GTK_CONTAINER_CLASS (class);
|
||||
GtkBindingSet *binding_set;
|
||||
|
||||
gobject_class->set_property = gtk_notebook_set_property;
|
||||
gobject_class->get_property = gtk_notebook_get_property;
|
||||
@@ -975,7 +979,6 @@ gtk_notebook_class_init (GtkNotebookClass *class)
|
||||
widget_class->unmap = gtk_notebook_unmap;
|
||||
widget_class->measure = gtk_notebook_measure;
|
||||
widget_class->size_allocate = gtk_notebook_size_allocate;
|
||||
widget_class->popup_menu = gtk_notebook_popup_menu;
|
||||
widget_class->grab_notify = gtk_notebook_grab_notify;
|
||||
widget_class->state_flags_changed = gtk_notebook_state_flags_changed;
|
||||
widget_class->focus = gtk_notebook_focus;
|
||||
@@ -1246,67 +1249,74 @@ gtk_notebook_class_init (GtkNotebookClass *class)
|
||||
G_TYPE_FROM_CLASS (gobject_class),
|
||||
_gtk_marshal_OBJECT__OBJECTv);
|
||||
|
||||
binding_set = gtk_binding_set_by_class (class);
|
||||
gtk_binding_entry_add_signal (binding_set,
|
||||
GDK_KEY_space, 0,
|
||||
"select-page", 1,
|
||||
G_TYPE_BOOLEAN, FALSE);
|
||||
gtk_binding_entry_add_signal (binding_set,
|
||||
GDK_KEY_KP_Space, 0,
|
||||
"select-page", 1,
|
||||
G_TYPE_BOOLEAN, FALSE);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_space, 0,
|
||||
"select-page",
|
||||
"(b)", FALSE);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_KP_Space, 0,
|
||||
"select-page",
|
||||
"(b)", FALSE);
|
||||
|
||||
gtk_binding_entry_add_signal (binding_set,
|
||||
GDK_KEY_Home, 0,
|
||||
"focus-tab", 1,
|
||||
GTK_TYPE_NOTEBOOK_TAB, GTK_NOTEBOOK_TAB_FIRST);
|
||||
gtk_binding_entry_add_signal (binding_set,
|
||||
GDK_KEY_KP_Home, 0,
|
||||
"focus-tab", 1,
|
||||
GTK_TYPE_NOTEBOOK_TAB, GTK_NOTEBOOK_TAB_FIRST);
|
||||
gtk_binding_entry_add_signal (binding_set,
|
||||
GDK_KEY_End, 0,
|
||||
"focus-tab", 1,
|
||||
GTK_TYPE_NOTEBOOK_TAB, GTK_NOTEBOOK_TAB_LAST);
|
||||
gtk_binding_entry_add_signal (binding_set,
|
||||
GDK_KEY_KP_End, 0,
|
||||
"focus-tab", 1,
|
||||
GTK_TYPE_NOTEBOOK_TAB, GTK_NOTEBOOK_TAB_LAST);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_Home, 0,
|
||||
"focus-tab",
|
||||
"(i)", GTK_NOTEBOOK_TAB_FIRST);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_KP_Home, 0,
|
||||
"focus-tab",
|
||||
"(i)", GTK_NOTEBOOK_TAB_FIRST);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_End, 0,
|
||||
"focus-tab",
|
||||
"(i)", GTK_NOTEBOOK_TAB_LAST);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_KP_End, 0,
|
||||
"focus-tab",
|
||||
"(i)", GTK_NOTEBOOK_TAB_LAST);
|
||||
|
||||
gtk_binding_entry_add_signal (binding_set,
|
||||
GDK_KEY_Page_Up, GDK_CONTROL_MASK,
|
||||
"change-current-page", 1,
|
||||
G_TYPE_INT, -1);
|
||||
gtk_binding_entry_add_signal (binding_set,
|
||||
GDK_KEY_Page_Down, GDK_CONTROL_MASK,
|
||||
"change-current-page", 1,
|
||||
G_TYPE_INT, 1);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_Page_Up, GDK_CONTROL_MASK,
|
||||
"change-current-page",
|
||||
"(i)", -1);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_Page_Down, GDK_CONTROL_MASK,
|
||||
"change-current-page",
|
||||
"(i)", 1);
|
||||
|
||||
gtk_binding_entry_add_signal (binding_set,
|
||||
GDK_KEY_Page_Up, GDK_CONTROL_MASK | GDK_MOD1_MASK,
|
||||
"change-current-page", 1,
|
||||
G_TYPE_INT, -1);
|
||||
gtk_binding_entry_add_signal (binding_set,
|
||||
GDK_KEY_Page_Down, GDK_CONTROL_MASK | GDK_MOD1_MASK,
|
||||
"change-current-page", 1,
|
||||
G_TYPE_INT, 1);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_Page_Up, GDK_CONTROL_MASK | GDK_MOD1_MASK,
|
||||
"change-current-page",
|
||||
"(i)", -1);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_Page_Down, GDK_CONTROL_MASK | GDK_MOD1_MASK,
|
||||
"change-current-page",
|
||||
"(i)", 1);
|
||||
|
||||
add_arrow_bindings (binding_set, GDK_KEY_Up, GTK_DIR_UP);
|
||||
add_arrow_bindings (binding_set, GDK_KEY_Down, GTK_DIR_DOWN);
|
||||
add_arrow_bindings (binding_set, GDK_KEY_Left, GTK_DIR_LEFT);
|
||||
add_arrow_bindings (binding_set, GDK_KEY_Right, GTK_DIR_RIGHT);
|
||||
add_arrow_bindings (widget_class, GDK_KEY_Up, GTK_DIR_UP);
|
||||
add_arrow_bindings (widget_class, GDK_KEY_Down, GTK_DIR_DOWN);
|
||||
add_arrow_bindings (widget_class, GDK_KEY_Left, GTK_DIR_LEFT);
|
||||
add_arrow_bindings (widget_class, GDK_KEY_Right, GTK_DIR_RIGHT);
|
||||
|
||||
add_reorder_bindings (binding_set, GDK_KEY_Up, GTK_DIR_UP, FALSE);
|
||||
add_reorder_bindings (binding_set, GDK_KEY_Down, GTK_DIR_DOWN, FALSE);
|
||||
add_reorder_bindings (binding_set, GDK_KEY_Left, GTK_DIR_LEFT, FALSE);
|
||||
add_reorder_bindings (binding_set, GDK_KEY_Right, GTK_DIR_RIGHT, FALSE);
|
||||
add_reorder_bindings (binding_set, GDK_KEY_Home, GTK_DIR_LEFT, TRUE);
|
||||
add_reorder_bindings (binding_set, GDK_KEY_Home, GTK_DIR_UP, TRUE);
|
||||
add_reorder_bindings (binding_set, GDK_KEY_End, GTK_DIR_RIGHT, TRUE);
|
||||
add_reorder_bindings (binding_set, GDK_KEY_End, GTK_DIR_DOWN, TRUE);
|
||||
add_reorder_bindings (widget_class, GDK_KEY_Up, GTK_DIR_UP, FALSE);
|
||||
add_reorder_bindings (widget_class, GDK_KEY_Down, GTK_DIR_DOWN, FALSE);
|
||||
add_reorder_bindings (widget_class, GDK_KEY_Left, GTK_DIR_LEFT, FALSE);
|
||||
add_reorder_bindings (widget_class, GDK_KEY_Right, GTK_DIR_RIGHT, FALSE);
|
||||
add_reorder_bindings (widget_class, GDK_KEY_Home, GTK_DIR_LEFT, TRUE);
|
||||
add_reorder_bindings (widget_class, GDK_KEY_Home, GTK_DIR_UP, TRUE);
|
||||
add_reorder_bindings (widget_class, GDK_KEY_End, GTK_DIR_RIGHT, TRUE);
|
||||
add_reorder_bindings (widget_class, GDK_KEY_End, GTK_DIR_DOWN, TRUE);
|
||||
|
||||
add_tab_bindings (binding_set, GDK_CONTROL_MASK, GTK_DIR_TAB_FORWARD);
|
||||
add_tab_bindings (binding_set, GDK_CONTROL_MASK | GDK_SHIFT_MASK, GTK_DIR_TAB_BACKWARD);
|
||||
add_tab_bindings (widget_class, GDK_CONTROL_MASK, GTK_DIR_TAB_FORWARD);
|
||||
add_tab_bindings (widget_class, GDK_CONTROL_MASK | GDK_SHIFT_MASK, GTK_DIR_TAB_BACKWARD);
|
||||
|
||||
/* Context menu */
|
||||
gtk_widget_class_add_binding (widget_class,
|
||||
GDK_KEY_F10, GDK_SHIFT_MASK,
|
||||
gtk_notebook_popup_menu, NULL);
|
||||
gtk_widget_class_add_binding (widget_class,
|
||||
GDK_KEY_Menu, 0,
|
||||
gtk_notebook_popup_menu, NULL);
|
||||
|
||||
gtk_widget_class_set_accessible_type (widget_class, GTK_TYPE_NOTEBOOK_ACCESSIBLE);
|
||||
gtk_widget_class_set_css_name (widget_class, I_("notebook"));
|
||||
@@ -1622,7 +1632,8 @@ gtk_notebook_move_focus_out (GtkNotebook *notebook,
|
||||
g_object_ref (notebook);
|
||||
|
||||
priv->focus_out = TRUE;
|
||||
g_signal_emit_by_name (toplevel, "move-focus", direction_type);
|
||||
gtk_widget_activate_action (GTK_WIDGET (notebook), "focus.move",
|
||||
"i", direction_type);
|
||||
priv->focus_out = FALSE;
|
||||
|
||||
g_object_unref (notebook);
|
||||
@@ -2595,7 +2606,9 @@ gtk_notebook_gesture_pressed (GtkGestureClick *gesture,
|
||||
|
||||
|
||||
static gboolean
|
||||
gtk_notebook_popup_menu (GtkWidget *widget)
|
||||
gtk_notebook_popup_menu (GtkWidget *widget,
|
||||
GVariant *args,
|
||||
gpointer data)
|
||||
{
|
||||
GtkNotebook *notebook = GTK_NOTEBOOK (widget);
|
||||
GtkNotebookPrivate *priv = notebook->priv;
|
||||
|
||||
+92
-92
@@ -26,7 +26,6 @@
|
||||
|
||||
#include "gtkpaned.h"
|
||||
|
||||
#include "gtkbindings.h"
|
||||
#include "gtkcontainerprivate.h"
|
||||
#include "gtkcssnodeprivate.h"
|
||||
#include "gtkcssstylepropertyprivate.h"
|
||||
@@ -276,24 +275,29 @@ static guint signals[LAST_SIGNAL] = { 0 };
|
||||
static GParamSpec *paned_props[LAST_PROP] = { NULL, };
|
||||
|
||||
static void
|
||||
add_tab_bindings (GtkBindingSet *binding_set,
|
||||
GdkModifierType modifiers)
|
||||
add_tab_bindings (GtkWidgetClass *widget_class,
|
||||
GdkModifierType modifiers)
|
||||
{
|
||||
gtk_binding_entry_add_signal (binding_set, GDK_KEY_Tab, modifiers,
|
||||
"toggle-handle-focus", 0);
|
||||
gtk_binding_entry_add_signal (binding_set, GDK_KEY_KP_Tab, modifiers,
|
||||
"toggle-handle-focus", 0);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_Tab, modifiers,
|
||||
"toggle-handle-focus",
|
||||
NULL);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_KP_Tab, modifiers,
|
||||
"toggle-handle-focus",
|
||||
NULL);
|
||||
}
|
||||
|
||||
static void
|
||||
add_move_binding (GtkBindingSet *binding_set,
|
||||
add_move_binding (GtkWidgetClass *widget_class,
|
||||
guint keyval,
|
||||
GdkModifierType mask,
|
||||
GtkScrollType scroll)
|
||||
{
|
||||
gtk_binding_entry_add_signal (binding_set, keyval, mask,
|
||||
"move-handle", 1,
|
||||
GTK_TYPE_SCROLL_TYPE, scroll);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
keyval, mask,
|
||||
"move-handle",
|
||||
"(i)", scroll);
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -335,16 +339,9 @@ gtk_paned_handle_contains (GtkGizmo *handle,
|
||||
static void
|
||||
gtk_paned_class_init (GtkPanedClass *class)
|
||||
{
|
||||
GObjectClass *object_class;
|
||||
GtkWidgetClass *widget_class;
|
||||
GtkContainerClass *container_class;
|
||||
GtkPanedClass *paned_class;
|
||||
GtkBindingSet *binding_set;
|
||||
|
||||
object_class = (GObjectClass *) class;
|
||||
widget_class = (GtkWidgetClass *) class;
|
||||
container_class = (GtkContainerClass *) class;
|
||||
paned_class = (GtkPanedClass *) class;
|
||||
GObjectClass *object_class = G_OBJECT_CLASS (class);
|
||||
GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (class);
|
||||
GtkContainerClass *container_class = GTK_CONTAINER_CLASS (class);
|
||||
|
||||
object_class->set_property = gtk_paned_set_property;
|
||||
object_class->get_property = gtk_paned_get_property;
|
||||
@@ -361,12 +358,12 @@ gtk_paned_class_init (GtkPanedClass *class)
|
||||
container_class->child_type = gtk_paned_child_type;
|
||||
container_class->set_focus_child = gtk_paned_set_focus_child;
|
||||
|
||||
paned_class->cycle_child_focus = gtk_paned_cycle_child_focus;
|
||||
paned_class->toggle_handle_focus = gtk_paned_toggle_handle_focus;
|
||||
paned_class->move_handle = gtk_paned_move_handle;
|
||||
paned_class->cycle_handle_focus = gtk_paned_cycle_handle_focus;
|
||||
paned_class->accept_position = gtk_paned_accept_position;
|
||||
paned_class->cancel_position = gtk_paned_cancel_position;
|
||||
class->cycle_child_focus = gtk_paned_cycle_child_focus;
|
||||
class->toggle_handle_focus = gtk_paned_toggle_handle_focus;
|
||||
class->move_handle = gtk_paned_move_handle;
|
||||
class->cycle_handle_focus = gtk_paned_cycle_handle_focus;
|
||||
class->accept_position = gtk_paned_accept_position;
|
||||
class->cancel_position = gtk_paned_cancel_position;
|
||||
|
||||
|
||||
paned_props[PROP_POSITION] =
|
||||
@@ -604,84 +601,87 @@ gtk_paned_class_init (GtkPanedClass *class)
|
||||
_gtk_marshal_BOOLEAN__VOID,
|
||||
G_TYPE_BOOLEAN, 0);
|
||||
|
||||
binding_set = gtk_binding_set_by_class (class);
|
||||
|
||||
/* F6 and friends */
|
||||
gtk_binding_entry_add_signal (binding_set,
|
||||
GDK_KEY_F6, 0,
|
||||
"cycle-child-focus", 1,
|
||||
G_TYPE_BOOLEAN, FALSE);
|
||||
gtk_binding_entry_add_signal (binding_set,
|
||||
GDK_KEY_F6, GDK_SHIFT_MASK,
|
||||
"cycle-child-focus", 1,
|
||||
G_TYPE_BOOLEAN, TRUE);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_F6, 0,
|
||||
"cycle-child-focus",
|
||||
"(b)", FALSE);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_F6, GDK_SHIFT_MASK,
|
||||
"cycle-child-focus",
|
||||
"(b)", TRUE);
|
||||
|
||||
/* F8 and friends */
|
||||
gtk_binding_entry_add_signal (binding_set,
|
||||
GDK_KEY_F8, 0,
|
||||
"cycle-handle-focus", 1,
|
||||
G_TYPE_BOOLEAN, FALSE);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_F8, 0,
|
||||
"cycle-handle-focus",
|
||||
"(b)", FALSE);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_F8, GDK_SHIFT_MASK,
|
||||
"cycle-handle-focus",
|
||||
"(b)", TRUE);
|
||||
|
||||
gtk_binding_entry_add_signal (binding_set,
|
||||
GDK_KEY_F8, GDK_SHIFT_MASK,
|
||||
"cycle-handle-focus", 1,
|
||||
G_TYPE_BOOLEAN, TRUE);
|
||||
|
||||
add_tab_bindings (binding_set, 0);
|
||||
add_tab_bindings (binding_set, GDK_CONTROL_MASK);
|
||||
add_tab_bindings (binding_set, GDK_SHIFT_MASK);
|
||||
add_tab_bindings (binding_set, GDK_CONTROL_MASK | GDK_SHIFT_MASK);
|
||||
add_tab_bindings (widget_class, 0);
|
||||
add_tab_bindings (widget_class, GDK_CONTROL_MASK);
|
||||
add_tab_bindings (widget_class, GDK_SHIFT_MASK);
|
||||
add_tab_bindings (widget_class, GDK_CONTROL_MASK | GDK_SHIFT_MASK);
|
||||
|
||||
/* accept and cancel positions */
|
||||
gtk_binding_entry_add_signal (binding_set,
|
||||
GDK_KEY_Escape, 0,
|
||||
"cancel-position", 0);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_Escape, 0,
|
||||
"cancel-position",
|
||||
NULL);
|
||||
|
||||
gtk_binding_entry_add_signal (binding_set,
|
||||
GDK_KEY_Return, 0,
|
||||
"accept-position", 0);
|
||||
gtk_binding_entry_add_signal (binding_set,
|
||||
GDK_KEY_ISO_Enter, 0,
|
||||
"accept-position", 0);
|
||||
gtk_binding_entry_add_signal (binding_set,
|
||||
GDK_KEY_KP_Enter, 0,
|
||||
"accept-position", 0);
|
||||
gtk_binding_entry_add_signal (binding_set,
|
||||
GDK_KEY_space, 0,
|
||||
"accept-position", 0);
|
||||
gtk_binding_entry_add_signal (binding_set,
|
||||
GDK_KEY_KP_Space, 0,
|
||||
"accept-position", 0);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_Return, 0,
|
||||
"accept-position",
|
||||
NULL);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_ISO_Enter, 0,
|
||||
"accept-position",
|
||||
NULL);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_KP_Enter, 0,
|
||||
"accept-position",
|
||||
NULL);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_space, 0,
|
||||
"accept-position",
|
||||
NULL);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_KP_Space, 0,
|
||||
"accept-position",
|
||||
NULL);
|
||||
|
||||
/* move handle */
|
||||
add_move_binding (binding_set, GDK_KEY_Left, 0, GTK_SCROLL_STEP_LEFT);
|
||||
add_move_binding (binding_set, GDK_KEY_KP_Left, 0, GTK_SCROLL_STEP_LEFT);
|
||||
add_move_binding (binding_set, GDK_KEY_Left, GDK_CONTROL_MASK, GTK_SCROLL_PAGE_LEFT);
|
||||
add_move_binding (binding_set, GDK_KEY_KP_Left, GDK_CONTROL_MASK, GTK_SCROLL_PAGE_LEFT);
|
||||
add_move_binding (widget_class, GDK_KEY_Left, 0, GTK_SCROLL_STEP_LEFT);
|
||||
add_move_binding (widget_class, GDK_KEY_KP_Left, 0, GTK_SCROLL_STEP_LEFT);
|
||||
add_move_binding (widget_class, GDK_KEY_Left, GDK_CONTROL_MASK, GTK_SCROLL_PAGE_LEFT);
|
||||
add_move_binding (widget_class, GDK_KEY_KP_Left, GDK_CONTROL_MASK, GTK_SCROLL_PAGE_LEFT);
|
||||
|
||||
add_move_binding (binding_set, GDK_KEY_Right, 0, GTK_SCROLL_STEP_RIGHT);
|
||||
add_move_binding (binding_set, GDK_KEY_Right, GDK_CONTROL_MASK, GTK_SCROLL_PAGE_RIGHT);
|
||||
add_move_binding (binding_set, GDK_KEY_KP_Right, 0, GTK_SCROLL_STEP_RIGHT);
|
||||
add_move_binding (binding_set, GDK_KEY_KP_Right, GDK_CONTROL_MASK, GTK_SCROLL_PAGE_RIGHT);
|
||||
add_move_binding (widget_class, GDK_KEY_Right, 0, GTK_SCROLL_STEP_RIGHT);
|
||||
add_move_binding (widget_class, GDK_KEY_Right, GDK_CONTROL_MASK, GTK_SCROLL_PAGE_RIGHT);
|
||||
add_move_binding (widget_class, GDK_KEY_KP_Right, 0, GTK_SCROLL_STEP_RIGHT);
|
||||
add_move_binding (widget_class, GDK_KEY_KP_Right, GDK_CONTROL_MASK, GTK_SCROLL_PAGE_RIGHT);
|
||||
|
||||
add_move_binding (binding_set, GDK_KEY_Up, 0, GTK_SCROLL_STEP_UP);
|
||||
add_move_binding (binding_set, GDK_KEY_Up, GDK_CONTROL_MASK, GTK_SCROLL_PAGE_UP);
|
||||
add_move_binding (binding_set, GDK_KEY_KP_Up, 0, GTK_SCROLL_STEP_UP);
|
||||
add_move_binding (binding_set, GDK_KEY_KP_Up, GDK_CONTROL_MASK, GTK_SCROLL_PAGE_UP);
|
||||
add_move_binding (binding_set, GDK_KEY_Page_Up, 0, GTK_SCROLL_PAGE_UP);
|
||||
add_move_binding (binding_set, GDK_KEY_KP_Page_Up, 0, GTK_SCROLL_PAGE_UP);
|
||||
add_move_binding (widget_class, GDK_KEY_Up, 0, GTK_SCROLL_STEP_UP);
|
||||
add_move_binding (widget_class, GDK_KEY_Up, GDK_CONTROL_MASK, GTK_SCROLL_PAGE_UP);
|
||||
add_move_binding (widget_class, GDK_KEY_KP_Up, 0, GTK_SCROLL_STEP_UP);
|
||||
add_move_binding (widget_class, GDK_KEY_KP_Up, GDK_CONTROL_MASK, GTK_SCROLL_PAGE_UP);
|
||||
add_move_binding (widget_class, GDK_KEY_Page_Up, 0, GTK_SCROLL_PAGE_UP);
|
||||
add_move_binding (widget_class, GDK_KEY_KP_Page_Up, 0, GTK_SCROLL_PAGE_UP);
|
||||
|
||||
add_move_binding (binding_set, GDK_KEY_Down, 0, GTK_SCROLL_STEP_DOWN);
|
||||
add_move_binding (binding_set, GDK_KEY_Down, GDK_CONTROL_MASK, GTK_SCROLL_PAGE_DOWN);
|
||||
add_move_binding (binding_set, GDK_KEY_KP_Down, 0, GTK_SCROLL_STEP_DOWN);
|
||||
add_move_binding (binding_set, GDK_KEY_KP_Down, GDK_CONTROL_MASK, GTK_SCROLL_PAGE_DOWN);
|
||||
add_move_binding (binding_set, GDK_KEY_Page_Down, 0, GTK_SCROLL_PAGE_RIGHT);
|
||||
add_move_binding (binding_set, GDK_KEY_KP_Page_Down, 0, GTK_SCROLL_PAGE_RIGHT);
|
||||
add_move_binding (widget_class, GDK_KEY_Down, 0, GTK_SCROLL_STEP_DOWN);
|
||||
add_move_binding (widget_class, GDK_KEY_Down, GDK_CONTROL_MASK, GTK_SCROLL_PAGE_DOWN);
|
||||
add_move_binding (widget_class, GDK_KEY_KP_Down, 0, GTK_SCROLL_STEP_DOWN);
|
||||
add_move_binding (widget_class, GDK_KEY_KP_Down, GDK_CONTROL_MASK, GTK_SCROLL_PAGE_DOWN);
|
||||
add_move_binding (widget_class, GDK_KEY_Page_Down, 0, GTK_SCROLL_PAGE_RIGHT);
|
||||
add_move_binding (widget_class, GDK_KEY_KP_Page_Down, 0, GTK_SCROLL_PAGE_RIGHT);
|
||||
|
||||
add_move_binding (binding_set, GDK_KEY_Home, 0, GTK_SCROLL_START);
|
||||
add_move_binding (binding_set, GDK_KEY_KP_Home, 0, GTK_SCROLL_START);
|
||||
add_move_binding (binding_set, GDK_KEY_End, 0, GTK_SCROLL_END);
|
||||
add_move_binding (binding_set, GDK_KEY_KP_End, 0, GTK_SCROLL_END);
|
||||
add_move_binding (widget_class, GDK_KEY_Home, 0, GTK_SCROLL_START);
|
||||
add_move_binding (widget_class, GDK_KEY_KP_Home, 0, GTK_SCROLL_START);
|
||||
add_move_binding (widget_class, GDK_KEY_End, 0, GTK_SCROLL_END);
|
||||
add_move_binding (widget_class, GDK_KEY_KP_End, 0, GTK_SCROLL_END);
|
||||
|
||||
gtk_widget_class_set_accessible_type (widget_class, GTK_TYPE_PANED_ACCESSIBLE);
|
||||
gtk_widget_class_set_css_name (widget_class, I_("paned"));
|
||||
|
||||
+45
-5
@@ -23,7 +23,6 @@
|
||||
#include "gtkpasswordentry.h"
|
||||
|
||||
#include "gtkaccessible.h"
|
||||
#include "gtkbindings.h"
|
||||
#include "gtktextprivate.h"
|
||||
#include "gtkeditable.h"
|
||||
#include "gtkgestureclick.h"
|
||||
@@ -59,6 +58,7 @@ typedef struct {
|
||||
GtkWidget *peek_icon;
|
||||
GdkKeymap *keymap;
|
||||
GMenuModel *extra_menu;
|
||||
gboolean activates_default;
|
||||
} GtkPasswordEntryPrivate;
|
||||
|
||||
struct _GtkPasswordEntryClass
|
||||
@@ -66,6 +66,11 @@ struct _GtkPasswordEntryClass
|
||||
GtkWidgetClass parent_class;
|
||||
};
|
||||
|
||||
enum {
|
||||
ACTIVATE,
|
||||
LAST_SIGNAL
|
||||
};
|
||||
|
||||
enum {
|
||||
PROP_PLACEHOLDER_TEXT = 1,
|
||||
PROP_ACTIVATES_DEFAULT,
|
||||
@@ -76,12 +81,28 @@ enum {
|
||||
|
||||
static GParamSpec *props[NUM_PROPERTIES] = { NULL, };
|
||||
|
||||
static guint signals[LAST_SIGNAL] = { 0 };
|
||||
|
||||
static void gtk_password_entry_editable_init (GtkEditableInterface *iface);
|
||||
|
||||
G_DEFINE_TYPE_WITH_CODE (GtkPasswordEntry, gtk_password_entry, GTK_TYPE_WIDGET,
|
||||
G_ADD_PRIVATE (GtkPasswordEntry)
|
||||
G_IMPLEMENT_INTERFACE (GTK_TYPE_EDITABLE, gtk_password_entry_editable_init))
|
||||
|
||||
static void
|
||||
gtk_password_entry_activate (GtkWidget *widget,
|
||||
const char *action_name,
|
||||
GVariant *parameters)
|
||||
{
|
||||
GtkPasswordEntry *entry = GTK_PASSWORD_ENTRY (widget);
|
||||
GtkPasswordEntryPrivate *priv = gtk_password_entry_get_instance_private (entry);
|
||||
|
||||
if (priv->activates_default)
|
||||
gtk_widget_activate_default (widget);
|
||||
else
|
||||
g_signal_emit (entry, signals[ACTIVATE], 0);
|
||||
}
|
||||
|
||||
static void
|
||||
keymap_state_changed (GdkKeymap *keymap,
|
||||
GtkWidget *widget)
|
||||
@@ -217,9 +238,9 @@ gtk_password_entry_set_property (GObject *object,
|
||||
break;
|
||||
|
||||
case PROP_ACTIVATES_DEFAULT:
|
||||
if (gtk_text_get_activates_default (GTK_TEXT (priv->entry)) != g_value_get_boolean (value))
|
||||
if (priv->activates_default != g_value_get_boolean (value))
|
||||
{
|
||||
gtk_text_set_activates_default (GTK_TEXT (priv->entry), g_value_get_boolean (value));
|
||||
priv->activates_default = g_value_get_boolean (value);
|
||||
g_object_notify_by_pspec (object, pspec);
|
||||
}
|
||||
break;
|
||||
@@ -257,7 +278,7 @@ gtk_password_entry_get_property (GObject *object,
|
||||
break;
|
||||
|
||||
case PROP_ACTIVATES_DEFAULT:
|
||||
g_value_set_boolean (value, gtk_text_get_activates_default (GTK_TEXT (priv->entry)));
|
||||
g_value_set_boolean (value, priv->activates_default);
|
||||
break;
|
||||
|
||||
case PROP_SHOW_PEEK_ICON:
|
||||
@@ -427,6 +448,25 @@ gtk_password_entry_class_init (GtkPasswordEntryClass *klass)
|
||||
g_object_class_install_properties (object_class, NUM_PROPERTIES, props);
|
||||
gtk_editable_install_properties (object_class, NUM_PROPERTIES);
|
||||
|
||||
signals[ACTIVATE] =
|
||||
g_signal_new (I_("activate"),
|
||||
G_OBJECT_CLASS_TYPE (object_class),
|
||||
G_SIGNAL_RUN_LAST,
|
||||
0,
|
||||
NULL, NULL,
|
||||
NULL,
|
||||
G_TYPE_NONE, 0);
|
||||
|
||||
gtk_widget_class_install_action (widget_class, "activate", NULL,
|
||||
gtk_password_entry_activate);
|
||||
|
||||
gtk_widget_class_bind_action (widget_class, GDK_KEY_Return, 0,
|
||||
"activate", NULL);
|
||||
gtk_widget_class_bind_action (widget_class, GDK_KEY_ISO_Enter, 0,
|
||||
"activate", NULL);
|
||||
gtk_widget_class_bind_action (widget_class, GDK_KEY_KP_Enter, 0,
|
||||
"activate", NULL);
|
||||
|
||||
gtk_widget_class_set_accessible_type (widget_class, GTK_TYPE_ENTRY_ACCESSIBLE);
|
||||
gtk_widget_class_set_css_name (widget_class, I_("entry"));
|
||||
}
|
||||
@@ -579,7 +619,7 @@ gtk_password_entry_set_extra_menu (GtkPasswordEntry *entry,
|
||||
|
||||
/**
|
||||
* gtk_password_entry_get_extra_menu:
|
||||
* @self: a #GtkText
|
||||
* @entry: a #GtkText
|
||||
*
|
||||
* Gets the menu model set with gtk_password_entry_set_extra_menu().
|
||||
*
|
||||
|
||||
+2
-7
@@ -104,8 +104,6 @@ static void mount_volume (GtkPlacesView
|
||||
static void on_eject_button_clicked (GtkWidget *widget,
|
||||
GtkPlacesViewRow *row);
|
||||
|
||||
static gboolean on_row_popup_menu (GtkPlacesViewRow *row);
|
||||
|
||||
static void populate_servers (GtkPlacesView *view);
|
||||
|
||||
static gboolean gtk_places_view_get_fetching_networks (GtkPlacesView *view);
|
||||
@@ -666,8 +664,6 @@ insert_row (GtkPlacesView *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);
|
||||
|
||||
g_signal_connect (gtk_places_view_row_get_eject_button (GTK_PLACES_VIEW_ROW (row)),
|
||||
"clicked",
|
||||
G_CALLBACK (on_eject_button_clicked),
|
||||
@@ -1733,11 +1729,10 @@ popup_menu (GtkPlacesViewRow *row,
|
||||
gtk_menu_popup_at_pointer (GTK_MENU (priv->popup_menu), (GdkEvent *) event);
|
||||
}
|
||||
|
||||
static gboolean
|
||||
on_row_popup_menu (GtkPlacesViewRow *row)
|
||||
void
|
||||
gtk_places_view_row_popup_menu (GtkPlacesViewRow *row)
|
||||
{
|
||||
popup_menu (row, NULL);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
|
||||
@@ -81,6 +81,8 @@ gboolean gtk_places_view_get_loading (GtkPlacesView
|
||||
|
||||
GtkWidget * gtk_places_view_new (void);
|
||||
|
||||
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
#endif /* GTK_PLACES_VIEW_H */
|
||||
|
||||
@@ -200,7 +200,7 @@ pressed_cb (GtkGesture *gesture,
|
||||
double y,
|
||||
GtkPlacesViewRow *row)
|
||||
{
|
||||
g_signal_emit_by_name (row, "popup-menu", 0);
|
||||
gtk_places_view_row_popup_menu (row);
|
||||
}
|
||||
|
||||
static void
|
||||
|
||||
@@ -57,6 +57,7 @@ void gtk_places_view_row_set_path_size_group (GtkPlacesViewR
|
||||
|
||||
void gtk_places_view_row_set_space_size_group (GtkPlacesViewRow *row,
|
||||
GtkSizeGroup *group);
|
||||
void gtk_places_view_row_popup_menu (GtkPlacesViewRow *row);
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
|
||||
+6
-49
@@ -111,10 +111,8 @@
|
||||
#include "gtkwidgetprivate.h"
|
||||
#include "gtkeventcontrollerkey.h"
|
||||
#include "gtkcssnodeprivate.h"
|
||||
#include "gtkbindings.h"
|
||||
#include "gtkenums.h"
|
||||
#include "gtktypebuiltins.h"
|
||||
#include "gtkmnemonichash.h"
|
||||
#include "gtkgizmoprivate.h"
|
||||
#include "gtkintl.h"
|
||||
#include "gtkprivate.h"
|
||||
@@ -488,8 +486,11 @@ allocate_contents (GtkGizmo *gizmo,
|
||||
}
|
||||
|
||||
static void
|
||||
gtk_popover_activate_default (GtkPopover *popover)
|
||||
gtk_popover_activate_default_activate (GtkWidget *widget,
|
||||
const char *action_name,
|
||||
GVariant *parameter)
|
||||
{
|
||||
GtkPopover *popover = GTK_POPOVER (widget);
|
||||
GtkPopoverPrivate *priv = gtk_popover_get_instance_private (popover);
|
||||
GtkWidget *focus_widget;
|
||||
|
||||
@@ -505,31 +506,6 @@ gtk_popover_activate_default (GtkPopover *popover)
|
||||
gtk_widget_activate (focus_widget);
|
||||
}
|
||||
|
||||
static void
|
||||
activate_default_cb (GSimpleAction *action,
|
||||
GVariant *parameter,
|
||||
gpointer data)
|
||||
{
|
||||
gtk_popover_activate_default (GTK_POPOVER (data));
|
||||
}
|
||||
|
||||
static void
|
||||
add_actions (GtkPopover *popover)
|
||||
{
|
||||
GActionEntry entries[] = {
|
||||
{ "activate", activate_default_cb, NULL, NULL, NULL },
|
||||
};
|
||||
|
||||
GActionGroup *actions;
|
||||
|
||||
actions = G_ACTION_GROUP (g_simple_action_group_new ());
|
||||
g_action_map_add_action_entries (G_ACTION_MAP (actions),
|
||||
entries, G_N_ELEMENTS (entries),
|
||||
popover);
|
||||
gtk_widget_insert_action_group (GTK_WIDGET (popover), "default", actions);
|
||||
g_object_unref (actions);
|
||||
}
|
||||
|
||||
static void
|
||||
node_style_changed_cb (GtkCssNode *node,
|
||||
GtkCssStyleChange *change,
|
||||
@@ -581,8 +557,6 @@ gtk_popover_init (GtkPopover *popover)
|
||||
|
||||
context = gtk_widget_get_style_context (GTK_WIDGET (popover));
|
||||
gtk_style_context_add_class (context, GTK_STYLE_CLASS_BACKGROUND);
|
||||
|
||||
add_actions (popover);
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -635,13 +609,6 @@ gtk_popover_unrealize (GtkWidget *widget)
|
||||
g_clear_object (&priv->surface);
|
||||
}
|
||||
|
||||
static void
|
||||
gtk_popover_move_focus (GtkWidget *widget,
|
||||
GtkDirectionType direction)
|
||||
{
|
||||
g_signal_emit_by_name (gtk_widget_get_root (widget), "move-focus", direction);
|
||||
}
|
||||
|
||||
static void
|
||||
gtk_popover_show (GtkWidget *widget)
|
||||
{
|
||||
@@ -1325,13 +1292,10 @@ gtk_popover_class_init (GtkPopoverClass *klass)
|
||||
widget_class->measure = gtk_popover_measure;
|
||||
widget_class->size_allocate = gtk_popover_size_allocate;
|
||||
widget_class->snapshot = gtk_popover_snapshot;
|
||||
widget_class->move_focus = gtk_popover_move_focus;
|
||||
|
||||
container_class->add = gtk_popover_add;
|
||||
container_class->remove = gtk_popover_remove;
|
||||
|
||||
klass->activate_default = gtk_popover_activate_default;
|
||||
|
||||
properties[PROP_RELATIVE_TO] =
|
||||
g_param_spec_object ("relative-to",
|
||||
P_("Relative to"),
|
||||
@@ -1386,15 +1350,8 @@ gtk_popover_class_init (GtkPopoverClass *klass)
|
||||
G_TYPE_NONE,
|
||||
0);
|
||||
|
||||
signals[ACTIVATE_DEFAULT] =
|
||||
g_signal_new (I_("activate-default"),
|
||||
G_TYPE_FROM_CLASS (object_class),
|
||||
G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION,
|
||||
G_STRUCT_OFFSET (GtkPopoverClass, activate_default),
|
||||
NULL, NULL,
|
||||
NULL,
|
||||
G_TYPE_NONE,
|
||||
0);
|
||||
gtk_widget_class_install_action (widget_class, "default.activate", NULL,
|
||||
gtk_popover_activate_default_activate);
|
||||
|
||||
gtk_widget_class_set_css_name (widget_class, "popover");
|
||||
}
|
||||
|
||||
+85
-44
@@ -31,7 +31,11 @@
|
||||
#include "gtkeventcontrollerkey.h"
|
||||
#include "gtkmain.h"
|
||||
#include "gtktypebuiltins.h"
|
||||
#include "gtkbindings.h"
|
||||
#include "gtkshortcut.h"
|
||||
#include "gtkshortcutcontroller.h"
|
||||
#include "gtkshortcuttrigger.h"
|
||||
#include "gtkshortcutmanager.h"
|
||||
#include "gtklabelprivate.h"
|
||||
|
||||
|
||||
/**
|
||||
@@ -135,7 +139,15 @@ enum {
|
||||
PROP_VISIBLE_SUBMENU = 1
|
||||
};
|
||||
|
||||
G_DEFINE_TYPE (GtkPopoverMenu, gtk_popover_menu, GTK_TYPE_POPOVER)
|
||||
static void
|
||||
gtk_popover_menu_shortcut_manager_interface_init (GtkShortcutManagerInterface *iface)
|
||||
{
|
||||
}
|
||||
|
||||
G_DEFINE_TYPE_WITH_CODE (GtkPopoverMenu, gtk_popover_menu, GTK_TYPE_POPOVER,
|
||||
G_IMPLEMENT_INTERFACE (GTK_TYPE_SHORTCUT_MANAGER,
|
||||
gtk_popover_menu_shortcut_manager_interface_init))
|
||||
|
||||
|
||||
void
|
||||
gtk_popover_menu_set_active_item (GtkPopoverMenu *menu,
|
||||
@@ -178,12 +190,24 @@ focus_out (GtkEventController *controller,
|
||||
gtk_popover_popdown (popover);
|
||||
}
|
||||
|
||||
static gboolean
|
||||
key_pressed (GtkEventController *controller,
|
||||
guint keyval,
|
||||
guint keycode,
|
||||
GdkModifierType state,
|
||||
GtkWidget *widget)
|
||||
{
|
||||
_gtk_label_mnemonics_visible_apply_recursively (widget, TRUE);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static void
|
||||
gtk_popover_menu_init (GtkPopoverMenu *popover)
|
||||
{
|
||||
GtkWidget *stack;
|
||||
GtkStyleContext *style_context;
|
||||
GtkEventController *controller;
|
||||
GList *controllers, *l;
|
||||
|
||||
stack = gtk_stack_new ();
|
||||
gtk_stack_set_vhomogeneous (GTK_STACK (stack), FALSE);
|
||||
@@ -197,8 +221,23 @@ gtk_popover_menu_init (GtkPopoverMenu *popover)
|
||||
gtk_style_context_add_class (style_context, GTK_STYLE_CLASS_MENU);
|
||||
|
||||
controller = gtk_event_controller_key_new ();
|
||||
gtk_event_controller_set_propagation_phase (controller, GTK_PHASE_CAPTURE);
|
||||
g_signal_connect (controller, "key-pressed", G_CALLBACK (key_pressed), popover);
|
||||
gtk_widget_add_controller (GTK_WIDGET (popover), controller);
|
||||
|
||||
controller = gtk_event_controller_key_new ();
|
||||
gtk_event_controller_set_propagation_phase (controller, GTK_PHASE_BUBBLE);
|
||||
g_signal_connect (controller, "focus-out", G_CALLBACK (focus_out), popover);
|
||||
gtk_widget_add_controller (GTK_WIDGET (popover), controller);
|
||||
|
||||
/* Trigger mnemonics without Alt */
|
||||
controllers = _gtk_widget_list_controllers (GTK_WIDGET (popover), GTK_PHASE_CAPTURE);
|
||||
for (l = controllers; l; l = l->next)
|
||||
{
|
||||
if (GTK_IS_SHORTCUT_CONTROLLER (l->data))
|
||||
gtk_shortcut_controller_set_mnemonics_modifiers (l->data, 0);
|
||||
}
|
||||
g_list_free (controllers);
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -213,6 +252,7 @@ gtk_popover_menu_unmap (GtkWidget *widget)
|
||||
{
|
||||
gtk_popover_menu_open_submenu (GTK_POPOVER_MENU (widget), "main");
|
||||
GTK_WIDGET_CLASS (gtk_popover_menu_parent_class)->unmap (widget);
|
||||
_gtk_label_mnemonics_visible_apply_recursively (widget, FALSE);
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -334,37 +374,41 @@ gtk_popover_menu_focus (GtkWidget *widget,
|
||||
|
||||
|
||||
static void
|
||||
add_tab_bindings (GtkBindingSet *binding_set,
|
||||
add_tab_bindings (GtkWidgetClass *widget_class,
|
||||
GdkModifierType modifiers,
|
||||
GtkDirectionType direction)
|
||||
{
|
||||
gtk_binding_entry_add_signal (binding_set, GDK_KEY_Tab, modifiers,
|
||||
"move-focus", 1,
|
||||
GTK_TYPE_DIRECTION_TYPE, direction);
|
||||
gtk_binding_entry_add_signal (binding_set, GDK_KEY_KP_Tab, modifiers,
|
||||
"move-focus", 1,
|
||||
GTK_TYPE_DIRECTION_TYPE, direction);
|
||||
GtkShortcut *shortcut;
|
||||
|
||||
shortcut = gtk_shortcut_new_with_arguments (
|
||||
gtk_alternative_trigger_new (gtk_keyval_trigger_new (GDK_KEY_Tab, modifiers),
|
||||
gtk_keyval_trigger_new (GDK_KEY_KP_Tab, modifiers)),
|
||||
gtk_action_action_new ("focus.move"),
|
||||
"i", direction);
|
||||
gtk_widget_class_add_shortcut (widget_class, shortcut);
|
||||
|
||||
g_object_unref (shortcut);
|
||||
}
|
||||
|
||||
static void
|
||||
add_arrow_bindings (GtkBindingSet *binding_set,
|
||||
add_arrow_bindings (GtkWidgetClass *widget_class,
|
||||
guint keysym,
|
||||
GtkDirectionType direction)
|
||||
{
|
||||
guint keypad_keysym = keysym - GDK_KEY_Left + GDK_KEY_KP_Left;
|
||||
|
||||
gtk_binding_entry_add_signal (binding_set, keysym, 0,
|
||||
"move-focus", 1,
|
||||
GTK_TYPE_DIRECTION_TYPE, direction);
|
||||
gtk_binding_entry_add_signal (binding_set, keysym, GDK_CONTROL_MASK,
|
||||
"move-focus", 1,
|
||||
GTK_TYPE_DIRECTION_TYPE, direction);
|
||||
gtk_binding_entry_add_signal (binding_set, keypad_keysym, 0,
|
||||
"move-focus", 1,
|
||||
GTK_TYPE_DIRECTION_TYPE, direction);
|
||||
gtk_binding_entry_add_signal (binding_set, keypad_keysym, GDK_CONTROL_MASK,
|
||||
"move-focus", 1,
|
||||
GTK_TYPE_DIRECTION_TYPE, direction);
|
||||
|
||||
gtk_widget_class_bind_action (widget_class, keysym, 0,
|
||||
"focus.move", "i",
|
||||
direction);
|
||||
gtk_widget_class_bind_action (widget_class, keysym, GDK_CONTROL_MASK,
|
||||
"focus.move", "i",
|
||||
direction);
|
||||
gtk_widget_class_bind_action (widget_class, keypad_keysym, 0,
|
||||
"focus.move", "i",
|
||||
direction);
|
||||
gtk_widget_class_bind_action (widget_class, keypad_keysym, GDK_CONTROL_MASK,
|
||||
"focus.move", "i",
|
||||
direction);
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -373,7 +417,6 @@ gtk_popover_menu_class_init (GtkPopoverMenuClass *klass)
|
||||
GtkContainerClass *container_class = GTK_CONTAINER_CLASS (klass);
|
||||
GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
|
||||
GObjectClass *object_class = G_OBJECT_CLASS (klass);
|
||||
GtkBindingSet *binding_set;
|
||||
|
||||
object_class->set_property = gtk_popover_menu_set_property;
|
||||
object_class->get_property = gtk_popover_menu_get_property;
|
||||
@@ -393,28 +436,26 @@ gtk_popover_menu_class_init (GtkPopoverMenuClass *klass)
|
||||
NULL,
|
||||
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
|
||||
|
||||
binding_set = gtk_binding_set_by_class (klass);
|
||||
add_arrow_bindings (widget_class, GDK_KEY_Up, GTK_DIR_UP);
|
||||
add_arrow_bindings (widget_class, GDK_KEY_Down, GTK_DIR_DOWN);
|
||||
add_arrow_bindings (widget_class, GDK_KEY_Left, GTK_DIR_LEFT);
|
||||
add_arrow_bindings (widget_class, GDK_KEY_Right, GTK_DIR_RIGHT);
|
||||
|
||||
add_arrow_bindings (binding_set, GDK_KEY_Up, GTK_DIR_UP);
|
||||
add_arrow_bindings (binding_set, GDK_KEY_Down, GTK_DIR_DOWN);
|
||||
add_arrow_bindings (binding_set, GDK_KEY_Left, GTK_DIR_LEFT);
|
||||
add_arrow_bindings (binding_set, GDK_KEY_Right, GTK_DIR_RIGHT);
|
||||
add_tab_bindings (widget_class, 0, GTK_DIR_TAB_FORWARD);
|
||||
add_tab_bindings (widget_class, GDK_CONTROL_MASK, GTK_DIR_TAB_FORWARD);
|
||||
add_tab_bindings (widget_class, GDK_SHIFT_MASK, GTK_DIR_TAB_BACKWARD);
|
||||
add_tab_bindings (widget_class, GDK_CONTROL_MASK | GDK_SHIFT_MASK, GTK_DIR_TAB_BACKWARD);
|
||||
|
||||
add_tab_bindings (binding_set, 0, GTK_DIR_TAB_FORWARD);
|
||||
add_tab_bindings (binding_set, GDK_CONTROL_MASK, GTK_DIR_TAB_FORWARD);
|
||||
add_tab_bindings (binding_set, GDK_SHIFT_MASK, GTK_DIR_TAB_BACKWARD);
|
||||
add_tab_bindings (binding_set, GDK_CONTROL_MASK | GDK_SHIFT_MASK, GTK_DIR_TAB_BACKWARD);
|
||||
|
||||
gtk_binding_entry_add_signal (binding_set, GDK_KEY_Return, 0,
|
||||
"activate-default", 0);
|
||||
gtk_binding_entry_add_signal (binding_set, GDK_KEY_ISO_Enter, 0,
|
||||
"activate-default", 0);
|
||||
gtk_binding_entry_add_signal (binding_set, GDK_KEY_KP_Enter, 0,
|
||||
"activate-default", 0);
|
||||
gtk_binding_entry_add_signal (binding_set, GDK_KEY_space, 0,
|
||||
"activate-default", 0);
|
||||
gtk_binding_entry_add_signal (binding_set, GDK_KEY_KP_Space, 0,
|
||||
"activate-default", 0);
|
||||
gtk_widget_class_bind_action (widget_class, GDK_KEY_Return, 0,
|
||||
"default.activate", NULL);
|
||||
gtk_widget_class_bind_action (widget_class, GDK_KEY_ISO_Enter, 0,
|
||||
"default.activate", NULL);
|
||||
gtk_widget_class_bind_action (widget_class, GDK_KEY_KP_Enter, 0,
|
||||
"default.activate", NULL);
|
||||
gtk_widget_class_bind_action (widget_class, GDK_KEY_space, 0,
|
||||
"default.activate", NULL);
|
||||
gtk_widget_class_bind_action (widget_class, GDK_KEY_KP_Space, 0,
|
||||
"default.activate", NULL);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
+4
-1
@@ -27,6 +27,8 @@
|
||||
#include "gtkprivate.h"
|
||||
#include "gtkintl.h"
|
||||
|
||||
#include "gtkshortcutmanager.h"
|
||||
|
||||
/**
|
||||
* SECTION:gtkroot
|
||||
* @Title: GtkRoot
|
||||
@@ -42,7 +44,8 @@
|
||||
*/
|
||||
|
||||
G_DEFINE_INTERFACE_WITH_CODE (GtkRoot, gtk_root, GTK_TYPE_WIDGET,
|
||||
g_type_interface_add_prerequisite (g_define_type_id, GTK_TYPE_NATIVE))
|
||||
g_type_interface_add_prerequisite (g_define_type_id, GTK_TYPE_NATIVE);
|
||||
g_type_interface_add_prerequisite (g_define_type_id, GTK_TYPE_SHORTCUT_MANAGER));
|
||||
|
||||
static GdkDisplay *
|
||||
gtk_root_default_get_display (GtkRoot *self)
|
||||
|
||||
+5
-8
@@ -28,7 +28,6 @@
|
||||
#include "gtkscale.h"
|
||||
|
||||
#include "gtkadjustment.h"
|
||||
#include "gtkbindings.h"
|
||||
#include "gtkbuildable.h"
|
||||
#include "gtkbuilderprivate.h"
|
||||
#include "gtkgizmoprivate.h"
|
||||
@@ -621,10 +620,11 @@ gtk_scale_size_allocate (GtkWidget *widget,
|
||||
}
|
||||
}
|
||||
|
||||
#define add_slider_binding(binding_set, keyval, mask, scroll) \
|
||||
gtk_binding_entry_add_signal (binding_set, keyval, mask, \
|
||||
I_("move-slider"), 1, \
|
||||
GTK_TYPE_SCROLL_TYPE, scroll)
|
||||
#define add_slider_binding(binding_set, keyval, mask, scroll) \
|
||||
gtk_widget_class_add_binding_signal (widget_class, \
|
||||
keyval, mask, \
|
||||
I_("move-slider"), \
|
||||
"(i)", scroll)
|
||||
|
||||
static void
|
||||
gtk_scale_value_changed (GtkRange *range)
|
||||
@@ -648,7 +648,6 @@ gtk_scale_class_init (GtkScaleClass *class)
|
||||
GObjectClass *gobject_class;
|
||||
GtkWidgetClass *widget_class;
|
||||
GtkRangeClass *range_class;
|
||||
GtkBindingSet *binding_set;
|
||||
|
||||
gobject_class = G_OBJECT_CLASS (class);
|
||||
range_class = (GtkRangeClass*) class;
|
||||
@@ -741,8 +740,6 @@ gtk_scale_class_init (GtkScaleClass *class)
|
||||
* blind users etc. don't care about scale orientation.
|
||||
*/
|
||||
|
||||
binding_set = gtk_binding_set_by_class (class);
|
||||
|
||||
add_slider_binding (binding_set, GDK_KEY_Left, 0,
|
||||
GTK_SCROLL_STEP_LEFT);
|
||||
|
||||
|
||||
+24
-16
@@ -37,7 +37,6 @@
|
||||
#include "gtkscalebutton.h"
|
||||
|
||||
#include "gtkadjustment.h"
|
||||
#include "gtkbindings.h"
|
||||
#include "gtkbox.h"
|
||||
#include "gtkbuttonprivate.h"
|
||||
#include "gtkimage.h"
|
||||
@@ -171,7 +170,6 @@ gtk_scale_button_class_init (GtkScaleButtonClass *klass)
|
||||
GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
|
||||
GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
|
||||
GtkButtonClass *button_class = GTK_BUTTON_CLASS (klass);
|
||||
GtkBindingSet *binding_set;
|
||||
|
||||
gobject_class->constructed = gtk_scale_button_constructed;
|
||||
gobject_class->finalize = gtk_scale_button_finalize;
|
||||
@@ -298,20 +296,30 @@ gtk_scale_button_class_init (GtkScaleButtonClass *klass)
|
||||
G_TYPE_NONE, 0);
|
||||
|
||||
/* Key bindings */
|
||||
binding_set = gtk_binding_set_by_class (widget_class);
|
||||
|
||||
gtk_binding_entry_add_signal (binding_set, GDK_KEY_space, 0,
|
||||
"popup", 0);
|
||||
gtk_binding_entry_add_signal (binding_set, GDK_KEY_KP_Space, 0,
|
||||
"popup", 0);
|
||||
gtk_binding_entry_add_signal (binding_set, GDK_KEY_Return, 0,
|
||||
"popup", 0);
|
||||
gtk_binding_entry_add_signal (binding_set, GDK_KEY_ISO_Enter, 0,
|
||||
"popup", 0);
|
||||
gtk_binding_entry_add_signal (binding_set, GDK_KEY_KP_Enter, 0,
|
||||
"popup", 0);
|
||||
gtk_binding_entry_add_signal (binding_set, GDK_KEY_Escape, 0,
|
||||
"popdown", 0);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_space, 0,
|
||||
"popup",
|
||||
NULL);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_KP_Space, 0,
|
||||
"popup",
|
||||
NULL);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_Return, 0,
|
||||
"popup",
|
||||
NULL);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_ISO_Enter, 0,
|
||||
"popup",
|
||||
NULL);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_KP_Enter, 0,
|
||||
"popup",
|
||||
NULL);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_Escape, 0,
|
||||
"popdown",
|
||||
NULL);
|
||||
|
||||
/* Bind class to template
|
||||
*/
|
||||
|
||||
@@ -245,16 +245,6 @@ gtk_scrollbar_class_init (GtkScrollbarClass *class)
|
||||
gtk_widget_class_set_css_name (widget_class, I_("scrollbar"));
|
||||
}
|
||||
|
||||
static gboolean
|
||||
emit_popup_menu (GtkWidget *self)
|
||||
{
|
||||
gboolean handled;
|
||||
|
||||
g_signal_emit_by_name (self, "popup-menu", &handled);
|
||||
|
||||
return handled;
|
||||
}
|
||||
|
||||
static void
|
||||
gtk_scrollbar_init (GtkScrollbar *self)
|
||||
{
|
||||
@@ -265,7 +255,6 @@ gtk_scrollbar_init (GtkScrollbar *self)
|
||||
priv->box = gtk_box_new (priv->orientation, 0);
|
||||
gtk_widget_set_parent (priv->box, GTK_WIDGET (self));
|
||||
priv->range = g_object_new (GTK_TYPE_RANGE, NULL);
|
||||
g_signal_connect_swapped (priv->range, "popup-menu", G_CALLBACK (emit_popup_menu), self);
|
||||
gtk_widget_set_hexpand (priv->range, TRUE);
|
||||
gtk_widget_set_vexpand (priv->range, TRUE);
|
||||
gtk_container_add (GTK_CONTAINER (priv->box), priv->range);
|
||||
|
||||
+34
-39
@@ -28,7 +28,6 @@
|
||||
|
||||
#include "gtkadjustment.h"
|
||||
#include "gtkadjustmentprivate.h"
|
||||
#include "gtkbindings.h"
|
||||
#include "gtkdnd.h"
|
||||
#include "gtkeventcontrollermotion.h"
|
||||
#include "gtkeventcontrollerscroll.h"
|
||||
@@ -413,7 +412,7 @@ static GParamSpec *properties[NUM_PROPERTIES];
|
||||
G_DEFINE_TYPE_WITH_PRIVATE (GtkScrolledWindow, gtk_scrolled_window, GTK_TYPE_BIN)
|
||||
|
||||
static void
|
||||
add_scroll_binding (GtkBindingSet *binding_set,
|
||||
add_scroll_binding (GtkWidgetClass *widget_class,
|
||||
guint keyval,
|
||||
GdkModifierType mask,
|
||||
GtkScrollType scroll,
|
||||
@@ -421,27 +420,29 @@ add_scroll_binding (GtkBindingSet *binding_set,
|
||||
{
|
||||
guint keypad_keyval = keyval - GDK_KEY_Left + GDK_KEY_KP_Left;
|
||||
|
||||
gtk_binding_entry_add_signal (binding_set, keyval, mask,
|
||||
"scroll-child", 2,
|
||||
GTK_TYPE_SCROLL_TYPE, scroll,
|
||||
G_TYPE_BOOLEAN, horizontal);
|
||||
gtk_binding_entry_add_signal (binding_set, keypad_keyval, mask,
|
||||
"scroll-child", 2,
|
||||
GTK_TYPE_SCROLL_TYPE, scroll,
|
||||
G_TYPE_BOOLEAN, horizontal);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
keyval, mask,
|
||||
"scroll-child",
|
||||
"(ib)", scroll, horizontal);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
keypad_keyval, mask,
|
||||
"scroll-child",
|
||||
"(ib)", scroll, horizontal);
|
||||
}
|
||||
|
||||
static void
|
||||
add_tab_bindings (GtkBindingSet *binding_set,
|
||||
add_tab_bindings (GtkWidgetClass *widget_class,
|
||||
GdkModifierType modifiers,
|
||||
GtkDirectionType direction)
|
||||
{
|
||||
gtk_binding_entry_add_signal (binding_set, GDK_KEY_Tab, modifiers,
|
||||
"move-focus-out", 1,
|
||||
GTK_TYPE_DIRECTION_TYPE, direction);
|
||||
gtk_binding_entry_add_signal (binding_set, GDK_KEY_KP_Tab, modifiers,
|
||||
"move-focus-out", 1,
|
||||
GTK_TYPE_DIRECTION_TYPE, direction);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_Tab, modifiers,
|
||||
"move-focus-out",
|
||||
"(i)", direction);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_KP_Tab, modifiers,
|
||||
"move-focus-out",
|
||||
"(i)", direction);
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -521,7 +522,6 @@ gtk_scrolled_window_class_init (GtkScrolledWindowClass *class)
|
||||
GObjectClass *gobject_class = G_OBJECT_CLASS (class);
|
||||
GtkWidgetClass *widget_class;
|
||||
GtkContainerClass *container_class;
|
||||
GtkBindingSet *binding_set;
|
||||
|
||||
widget_class = (GtkWidgetClass*) class;
|
||||
container_class = (GtkContainerClass*) class;
|
||||
@@ -796,25 +796,23 @@ gtk_scrolled_window_class_init (GtkScrolledWindowClass *class)
|
||||
NULL, NULL, NULL,
|
||||
G_TYPE_NONE, 1, GTK_TYPE_POSITION_TYPE);
|
||||
|
||||
binding_set = gtk_binding_set_by_class (class);
|
||||
add_scroll_binding (widget_class, GDK_KEY_Left, GDK_CONTROL_MASK, GTK_SCROLL_STEP_BACKWARD, TRUE);
|
||||
add_scroll_binding (widget_class, GDK_KEY_Right, GDK_CONTROL_MASK, GTK_SCROLL_STEP_FORWARD, TRUE);
|
||||
add_scroll_binding (widget_class, GDK_KEY_Up, GDK_CONTROL_MASK, GTK_SCROLL_STEP_BACKWARD, FALSE);
|
||||
add_scroll_binding (widget_class, GDK_KEY_Down, GDK_CONTROL_MASK, GTK_SCROLL_STEP_FORWARD, FALSE);
|
||||
|
||||
add_scroll_binding (binding_set, GDK_KEY_Left, GDK_CONTROL_MASK, GTK_SCROLL_STEP_BACKWARD, TRUE);
|
||||
add_scroll_binding (binding_set, GDK_KEY_Right, GDK_CONTROL_MASK, GTK_SCROLL_STEP_FORWARD, TRUE);
|
||||
add_scroll_binding (binding_set, GDK_KEY_Up, GDK_CONTROL_MASK, GTK_SCROLL_STEP_BACKWARD, FALSE);
|
||||
add_scroll_binding (binding_set, GDK_KEY_Down, GDK_CONTROL_MASK, GTK_SCROLL_STEP_FORWARD, FALSE);
|
||||
add_scroll_binding (widget_class, GDK_KEY_Page_Up, GDK_CONTROL_MASK, GTK_SCROLL_PAGE_BACKWARD, TRUE);
|
||||
add_scroll_binding (widget_class, GDK_KEY_Page_Down, GDK_CONTROL_MASK, GTK_SCROLL_PAGE_FORWARD, TRUE);
|
||||
add_scroll_binding (widget_class, GDK_KEY_Page_Up, 0, GTK_SCROLL_PAGE_BACKWARD, FALSE);
|
||||
add_scroll_binding (widget_class, GDK_KEY_Page_Down, 0, GTK_SCROLL_PAGE_FORWARD, FALSE);
|
||||
|
||||
add_scroll_binding (binding_set, GDK_KEY_Page_Up, GDK_CONTROL_MASK, GTK_SCROLL_PAGE_BACKWARD, TRUE);
|
||||
add_scroll_binding (binding_set, GDK_KEY_Page_Down, GDK_CONTROL_MASK, GTK_SCROLL_PAGE_FORWARD, TRUE);
|
||||
add_scroll_binding (binding_set, GDK_KEY_Page_Up, 0, GTK_SCROLL_PAGE_BACKWARD, FALSE);
|
||||
add_scroll_binding (binding_set, GDK_KEY_Page_Down, 0, GTK_SCROLL_PAGE_FORWARD, FALSE);
|
||||
add_scroll_binding (widget_class, GDK_KEY_Home, GDK_CONTROL_MASK, GTK_SCROLL_START, TRUE);
|
||||
add_scroll_binding (widget_class, GDK_KEY_End, GDK_CONTROL_MASK, GTK_SCROLL_END, TRUE);
|
||||
add_scroll_binding (widget_class, GDK_KEY_Home, 0, GTK_SCROLL_START, FALSE);
|
||||
add_scroll_binding (widget_class, GDK_KEY_End, 0, GTK_SCROLL_END, FALSE);
|
||||
|
||||
add_scroll_binding (binding_set, GDK_KEY_Home, GDK_CONTROL_MASK, GTK_SCROLL_START, TRUE);
|
||||
add_scroll_binding (binding_set, GDK_KEY_End, GDK_CONTROL_MASK, GTK_SCROLL_END, TRUE);
|
||||
add_scroll_binding (binding_set, GDK_KEY_Home, 0, GTK_SCROLL_START, FALSE);
|
||||
add_scroll_binding (binding_set, GDK_KEY_End, 0, GTK_SCROLL_END, FALSE);
|
||||
|
||||
add_tab_bindings (binding_set, GDK_CONTROL_MASK, GTK_DIR_TAB_FORWARD);
|
||||
add_tab_bindings (binding_set, GDK_CONTROL_MASK | GDK_SHIFT_MASK, GTK_DIR_TAB_BACKWARD);
|
||||
add_tab_bindings (widget_class, GDK_CONTROL_MASK, GTK_DIR_TAB_FORWARD);
|
||||
add_tab_bindings (widget_class, GDK_CONTROL_MASK | GDK_SHIFT_MASK, GTK_DIR_TAB_BACKWARD);
|
||||
|
||||
gtk_widget_class_set_accessible_type (widget_class, GTK_TYPE_SCROLLED_WINDOW_ACCESSIBLE);
|
||||
gtk_widget_class_set_css_name (widget_class, I_("scrolledwindow"));
|
||||
@@ -2922,19 +2920,16 @@ gtk_scrolled_window_move_focus_out (GtkScrolledWindow *scrolled_window,
|
||||
GtkDirectionType direction_type)
|
||||
{
|
||||
GtkScrolledWindowPrivate *priv = gtk_scrolled_window_get_instance_private (scrolled_window);
|
||||
GtkWidget *toplevel;
|
||||
|
||||
/* Focus out of the scrolled window entirely. We do this by setting
|
||||
* a flag, then propagating the focus motion to the notebook.
|
||||
*/
|
||||
toplevel = GTK_WIDGET (gtk_widget_get_root (GTK_WIDGET (scrolled_window)));
|
||||
if (!GTK_IS_ROOT (toplevel))
|
||||
return;
|
||||
|
||||
g_object_ref (scrolled_window);
|
||||
|
||||
priv->focus_out = TRUE;
|
||||
g_signal_emit_by_name (toplevel, "move-focus", direction_type);
|
||||
gtk_widget_activate_action (GTK_WIDGET (scrolled_window),
|
||||
"focus.move", "i", direction_type);
|
||||
priv->focus_out = FALSE;
|
||||
|
||||
g_object_unref (scrolled_window);
|
||||
|
||||
+41
-23
@@ -30,7 +30,6 @@
|
||||
#include "gtksearchentryprivate.h"
|
||||
|
||||
#include "gtkaccessible.h"
|
||||
#include "gtkbindings.h"
|
||||
#include "gtkeditable.h"
|
||||
#include "gtkbox.h"
|
||||
#include "gtkgestureclick.h"
|
||||
@@ -125,6 +124,7 @@ typedef struct {
|
||||
guint delayed_changed_id;
|
||||
gboolean content_changed;
|
||||
gboolean search_stopped;
|
||||
gboolean activates_default;
|
||||
} GtkSearchEntryPrivate;
|
||||
|
||||
static void gtk_search_entry_editable_init (GtkEditableInterface *iface);
|
||||
@@ -137,6 +137,20 @@ G_DEFINE_TYPE_WITH_CODE (GtkSearchEntry, gtk_search_entry, GTK_TYPE_WIDGET,
|
||||
/* 150 mseconds of delay */
|
||||
#define DELAYED_TIMEOUT_ID 150
|
||||
|
||||
static void
|
||||
gtk_search_entry_activate (GtkWidget *widget,
|
||||
const char *action_name,
|
||||
GVariant *parameters)
|
||||
{
|
||||
GtkSearchEntry *entry = GTK_SEARCH_ENTRY (widget);
|
||||
GtkSearchEntryPrivate *priv = gtk_search_entry_get_instance_private (entry);
|
||||
|
||||
if (priv->activates_default)
|
||||
gtk_widget_activate_default (widget);
|
||||
else
|
||||
g_signal_emit (entry, signals[ACTIVATE], 0);
|
||||
}
|
||||
|
||||
static void
|
||||
text_changed (GtkSearchEntry *entry)
|
||||
{
|
||||
@@ -191,9 +205,9 @@ gtk_search_entry_set_property (GObject *object,
|
||||
break;
|
||||
|
||||
case PROP_ACTIVATES_DEFAULT:
|
||||
if (gtk_text_get_activates_default (GTK_TEXT (priv->entry)) != g_value_get_boolean (value))
|
||||
if (priv->activates_default != g_value_get_boolean (value))
|
||||
{
|
||||
gtk_text_set_activates_default (GTK_TEXT (priv->entry), g_value_get_boolean (value));
|
||||
priv->activates_default = g_value_get_boolean (value);
|
||||
g_object_notify_by_pspec (object, pspec);
|
||||
}
|
||||
break;
|
||||
@@ -222,7 +236,7 @@ gtk_search_entry_get_property (GObject *object,
|
||||
break;
|
||||
|
||||
case PROP_ACTIVATES_DEFAULT:
|
||||
g_value_set_boolean (value, gtk_text_get_activates_default (GTK_TEXT (priv->entry)));
|
||||
g_value_set_boolean (value, priv->activates_default);
|
||||
break;
|
||||
|
||||
default:
|
||||
@@ -326,7 +340,6 @@ gtk_search_entry_class_init (GtkSearchEntryClass *klass)
|
||||
{
|
||||
GObjectClass *object_class = G_OBJECT_CLASS (klass);
|
||||
GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
|
||||
GtkBindingSet *binding_set;
|
||||
|
||||
object_class->finalize = gtk_search_entry_finalize;
|
||||
object_class->get_property = gtk_search_entry_get_property;
|
||||
@@ -360,7 +373,7 @@ gtk_search_entry_class_init (GtkSearchEntryClass *klass)
|
||||
signals[ACTIVATE] =
|
||||
g_signal_new (I_("activate"),
|
||||
G_OBJECT_CLASS_TYPE (object_class),
|
||||
G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION,
|
||||
G_SIGNAL_RUN_LAST,
|
||||
G_STRUCT_OFFSET (GtkSearchEntryClass, activate),
|
||||
NULL, NULL,
|
||||
NULL,
|
||||
@@ -462,14 +475,28 @@ gtk_search_entry_class_init (GtkSearchEntryClass *klass)
|
||||
NULL,
|
||||
G_TYPE_NONE, 0);
|
||||
|
||||
binding_set = gtk_binding_set_by_class (klass);
|
||||
gtk_widget_class_install_action (widget_class, "activate", NULL,
|
||||
gtk_search_entry_activate);
|
||||
|
||||
gtk_binding_entry_add_signal (binding_set, GDK_KEY_g, GDK_CONTROL_MASK,
|
||||
"next-match", 0);
|
||||
gtk_binding_entry_add_signal (binding_set, GDK_KEY_g, GDK_SHIFT_MASK | GDK_CONTROL_MASK,
|
||||
"previous-match", 0);
|
||||
gtk_binding_entry_add_signal (binding_set, GDK_KEY_Escape, 0,
|
||||
"stop-search", 0);
|
||||
gtk_widget_class_bind_action (widget_class, GDK_KEY_Return, 0,
|
||||
"activate", NULL);
|
||||
gtk_widget_class_bind_action (widget_class, GDK_KEY_ISO_Enter, 0,
|
||||
"activate", NULL);
|
||||
gtk_widget_class_bind_action (widget_class, GDK_KEY_KP_Enter, 0,
|
||||
"activate", NULL);
|
||||
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_g, GDK_CONTROL_MASK,
|
||||
"next-match",
|
||||
NULL);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_g, GDK_SHIFT_MASK | GDK_CONTROL_MASK,
|
||||
"previous-match",
|
||||
NULL);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_Escape, 0,
|
||||
"stop-search",
|
||||
NULL);
|
||||
|
||||
gtk_widget_class_set_accessible_type (widget_class, GTK_TYPE_ENTRY_ACCESSIBLE);
|
||||
gtk_widget_class_set_css_name (widget_class, I_("entry"));
|
||||
@@ -563,18 +590,10 @@ notify_cb (GObject *object,
|
||||
gpointer data)
|
||||
{
|
||||
/* The editable interface properties are already forwarded by the editable delegate setup */
|
||||
if (g_str_equal (pspec->name, "placeholder-text") ||
|
||||
g_str_equal (pspec->name, "activates-default"))
|
||||
if (g_str_equal (pspec->name, "placeholder-text"))
|
||||
g_object_notify (data, pspec->name);
|
||||
}
|
||||
|
||||
static void
|
||||
activate_cb (GtkText *text,
|
||||
gpointer data)
|
||||
{
|
||||
g_signal_emit (data, signals[ACTIVATE], 0);
|
||||
}
|
||||
|
||||
static void
|
||||
gtk_search_entry_init (GtkSearchEntry *entry)
|
||||
{
|
||||
@@ -588,7 +607,6 @@ gtk_search_entry_init (GtkSearchEntry *entry)
|
||||
g_signal_connect_after (priv->entry, "changed", G_CALLBACK (gtk_search_entry_changed), entry);
|
||||
g_signal_connect_swapped (priv->entry, "preedit-changed", G_CALLBACK (text_changed), entry);
|
||||
g_signal_connect (priv->entry, "notify", G_CALLBACK (notify_cb), entry);
|
||||
g_signal_connect (priv->entry, "activate", G_CALLBACK (activate_cb), entry);
|
||||
|
||||
priv->icon = gtk_image_new_from_icon_name ("edit-clear-symbolic");
|
||||
gtk_widget_set_tooltip_text (priv->icon, _("Clear entry"));
|
||||
|
||||
@@ -0,0 +1,393 @@
|
||||
/*
|
||||
* Copyright © 2018 Benjamin Otte
|
||||
*
|
||||
* 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.1 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/>.
|
||||
*
|
||||
* Authors: Benjamin Otte <otte@gnome.org>
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
|
||||
#include "gtkshortcut.h"
|
||||
|
||||
#include "gtkintl.h"
|
||||
#include "gtkshortcutaction.h"
|
||||
#include "gtkshortcuttrigger.h"
|
||||
#include "gtkwidget.h"
|
||||
|
||||
/**
|
||||
* SECTION:gtkshortcut
|
||||
* @title: GtkShortcut
|
||||
* @short_description: A widget for displaying shortcut
|
||||
* @see_also: #GtkShortcutController, #GtkShortcutAction,
|
||||
* #GtkShortcutTrigger
|
||||
*
|
||||
* GtkShortcut is the low level object used for managing keyboard
|
||||
* shortcuts.
|
||||
*
|
||||
* It contains a description of how to trigger the shortcut via a
|
||||
* #GtkShortcutTrigger and a way to activate the shortcut on a widget
|
||||
* via #GtkShortcutAction.
|
||||
*
|
||||
* The actual work is usually done via #GtkShortcutController, which
|
||||
* decides if and when to activate a shortcut. Using that controller
|
||||
* directly however is rarely necessary as various higher level
|
||||
* convenience APIs exist on #GtkWidgets that make it easier to use
|
||||
* shortcuts in GTK.
|
||||
*
|
||||
* #GtkShortcut does provide functionality to make it easy for users
|
||||
* to work with shortcuts, either by providing informational strings
|
||||
* for display purposes or by allowing shortcuts to be configured.
|
||||
*/
|
||||
|
||||
struct _GtkShortcut
|
||||
{
|
||||
GObject parent_instance;
|
||||
|
||||
GtkShortcutAction *action;
|
||||
GtkShortcutTrigger *trigger;
|
||||
GVariant *args;
|
||||
};
|
||||
|
||||
enum
|
||||
{
|
||||
PROP_0,
|
||||
PROP_ACTION,
|
||||
PROP_ARGUMENTS,
|
||||
PROP_TRIGGER,
|
||||
|
||||
N_PROPS
|
||||
};
|
||||
|
||||
G_DEFINE_TYPE (GtkShortcut, gtk_shortcut, G_TYPE_OBJECT)
|
||||
|
||||
static GParamSpec *properties[N_PROPS] = { NULL, };
|
||||
|
||||
static void
|
||||
gtk_shortcut_dispose (GObject *object)
|
||||
{
|
||||
GtkShortcut *self = GTK_SHORTCUT (object);
|
||||
|
||||
g_clear_pointer (&self->action, gtk_shortcut_action_unref);
|
||||
g_clear_pointer (&self->trigger, gtk_shortcut_trigger_unref);
|
||||
g_clear_pointer (&self->args, g_variant_unref);
|
||||
|
||||
G_OBJECT_CLASS (gtk_shortcut_parent_class)->dispose (object);
|
||||
}
|
||||
|
||||
static void
|
||||
gtk_shortcut_get_property (GObject *object,
|
||||
guint property_id,
|
||||
GValue *value,
|
||||
GParamSpec *pspec)
|
||||
{
|
||||
GtkShortcut *self = GTK_SHORTCUT (object);
|
||||
|
||||
switch (property_id)
|
||||
{
|
||||
case PROP_ACTION:
|
||||
g_value_set_boxed (value, self->action);
|
||||
break;
|
||||
|
||||
case PROP_ARGUMENTS:
|
||||
g_value_set_variant (value, self->args);
|
||||
break;
|
||||
|
||||
case PROP_TRIGGER:
|
||||
g_value_set_boxed (value, self->trigger);
|
||||
break;
|
||||
|
||||
default:
|
||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
gtk_shortcut_set_property (GObject *object,
|
||||
guint property_id,
|
||||
const GValue *value,
|
||||
GParamSpec *pspec)
|
||||
{
|
||||
GtkShortcut *self = GTK_SHORTCUT (object);
|
||||
|
||||
switch (property_id)
|
||||
{
|
||||
case PROP_ACTION:
|
||||
gtk_shortcut_set_action (self, g_value_dup_boxed (value));
|
||||
break;
|
||||
|
||||
case PROP_ARGUMENTS:
|
||||
gtk_shortcut_set_arguments (self, g_value_get_variant (value));
|
||||
break;
|
||||
|
||||
case PROP_TRIGGER:
|
||||
gtk_shortcut_set_trigger (self, g_value_dup_boxed (value));
|
||||
break;
|
||||
|
||||
default:
|
||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
gtk_shortcut_class_init (GtkShortcutClass *klass)
|
||||
{
|
||||
GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
|
||||
|
||||
gobject_class->dispose = gtk_shortcut_dispose;
|
||||
gobject_class->get_property = gtk_shortcut_get_property;
|
||||
gobject_class->set_property = gtk_shortcut_set_property;
|
||||
|
||||
/**
|
||||
* GtkShortcut:action:
|
||||
*
|
||||
* The action that gets activated by this shortcut.
|
||||
*/
|
||||
properties[PROP_ACTION] =
|
||||
g_param_spec_boxed ("action",
|
||||
P_("Action"),
|
||||
P_("The action activated by this shortcut"),
|
||||
GTK_TYPE_SHORTCUT_ACTION,
|
||||
G_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS);
|
||||
|
||||
/**
|
||||
* GtkShortcut:arguments:
|
||||
*
|
||||
* Arguments passed to activation.
|
||||
*/
|
||||
properties[PROP_ARGUMENTS] =
|
||||
g_param_spec_variant ("arguments",
|
||||
P_("Arguments"),
|
||||
P_("Arguments passed to activation"),
|
||||
G_VARIANT_TYPE_ANY,
|
||||
NULL,
|
||||
G_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS);
|
||||
|
||||
/**
|
||||
* GtkShortcut:trigger:
|
||||
*
|
||||
* The trigger that triggers this shortcut.
|
||||
*/
|
||||
properties[PROP_TRIGGER] =
|
||||
g_param_spec_boxed ("trigger",
|
||||
P_("Trigger"),
|
||||
P_("The trigger for this shortcut"),
|
||||
GTK_TYPE_SHORTCUT_TRIGGER,
|
||||
G_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS);
|
||||
|
||||
g_object_class_install_properties (gobject_class, N_PROPS, properties);
|
||||
}
|
||||
|
||||
static void
|
||||
gtk_shortcut_init (GtkShortcut *self)
|
||||
{
|
||||
self->action = gtk_nothing_action_new ();
|
||||
self->trigger = gtk_shortcut_trigger_ref (gtk_never_trigger_get ());
|
||||
}
|
||||
|
||||
/**
|
||||
* gtk_shortcut_new:
|
||||
* @trigger: (transfer full) (allow-none): The trigger that will trigger the shortcut
|
||||
* @action: (transfer full) (allow-none): The action that will be activated upon
|
||||
* triggering
|
||||
*
|
||||
* Creates a new #GtkShortcut that is triggered by @trigger and then activates
|
||||
* @action.
|
||||
*
|
||||
* Returns: a new #GtkShortcut
|
||||
**/
|
||||
GtkShortcut *
|
||||
gtk_shortcut_new (GtkShortcutTrigger *trigger,
|
||||
GtkShortcutAction *action)
|
||||
{
|
||||
GtkShortcut *shortcut;
|
||||
|
||||
shortcut = g_object_new (GTK_TYPE_SHORTCUT,
|
||||
"action", action,
|
||||
"trigger", trigger,
|
||||
NULL);
|
||||
|
||||
if (trigger)
|
||||
gtk_shortcut_trigger_unref (trigger);
|
||||
if (action)
|
||||
gtk_shortcut_action_unref (action);
|
||||
|
||||
return shortcut;
|
||||
}
|
||||
|
||||
/**
|
||||
* gtk_shortcut_new_with_arguments: (skip)
|
||||
* @trigger: (transfer full) (allow-none): The trigger that will trigger the shortcut
|
||||
* @action: (transfer full) (allow-none): The action that will be activated upon
|
||||
* triggering
|
||||
* @format_string: (allow-none): GVariant format string for arguments or %NULL for
|
||||
* no arguments
|
||||
* @...: arguments, as given by format string.
|
||||
*
|
||||
* Creates a new #GtkShortcut that is triggered by @trigger and then activates
|
||||
* @action with arguments given by @format_string.
|
||||
*
|
||||
* Returns: a new #GtkShortcut
|
||||
**/
|
||||
GtkShortcut *
|
||||
gtk_shortcut_new_with_arguments (GtkShortcutTrigger *trigger,
|
||||
GtkShortcutAction *action,
|
||||
const gchar *format_string,
|
||||
...)
|
||||
{
|
||||
GtkShortcut *shortcut;
|
||||
GVariant *args;
|
||||
|
||||
if (format_string)
|
||||
{
|
||||
va_list valist;
|
||||
va_start (valist, format_string);
|
||||
args = g_variant_new_va (format_string, NULL, &valist);
|
||||
va_end (valist);
|
||||
}
|
||||
else
|
||||
{
|
||||
args = NULL;
|
||||
}
|
||||
|
||||
shortcut = g_object_new (GTK_TYPE_SHORTCUT,
|
||||
"action", action,
|
||||
"arguments", args,
|
||||
"trigger", trigger,
|
||||
NULL);
|
||||
|
||||
if (trigger)
|
||||
gtk_shortcut_trigger_unref (trigger);
|
||||
if (action)
|
||||
gtk_shortcut_action_unref (action);
|
||||
|
||||
return shortcut;
|
||||
}
|
||||
|
||||
/**
|
||||
* gtk_shortcut_get_action:
|
||||
* @self: a #GtkShortcut
|
||||
*
|
||||
* Gets the action that is activated by this shortcut.
|
||||
*
|
||||
* Returns: (transfer none): the action
|
||||
**/
|
||||
GtkShortcutAction *
|
||||
gtk_shortcut_get_action (GtkShortcut *self)
|
||||
{
|
||||
g_return_val_if_fail (GTK_IS_SHORTCUT (self), NULL);
|
||||
|
||||
return self->action;
|
||||
}
|
||||
|
||||
/**
|
||||
* gtk_shortcut_set_action:
|
||||
* @self: a #GtkShortcut
|
||||
* @action: (transfer full) (nullable): The new action.
|
||||
* If the @action is %NULL, the nothing action will be used.
|
||||
*
|
||||
* Sets the new action for @self to be @action.
|
||||
**/
|
||||
void
|
||||
gtk_shortcut_set_action (GtkShortcut *self,
|
||||
GtkShortcutAction *action)
|
||||
{
|
||||
g_return_if_fail (GTK_IS_SHORTCUT (self));
|
||||
|
||||
if (action == NULL)
|
||||
action = gtk_nothing_action_new ();
|
||||
|
||||
if (self->action == action)
|
||||
{
|
||||
gtk_shortcut_action_unref (action);
|
||||
return;
|
||||
}
|
||||
|
||||
gtk_shortcut_action_unref (self->action);
|
||||
self->action = action;
|
||||
|
||||
g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_ACTION]);
|
||||
}
|
||||
|
||||
/**
|
||||
* gtk_shortcut_get_trigger:
|
||||
* @self: a #GtkShortcut
|
||||
*
|
||||
* Gets the trigger used to trigger @self.
|
||||
*
|
||||
* Returns: (transfer none): the trigger used
|
||||
**/
|
||||
GtkShortcutTrigger *
|
||||
gtk_shortcut_get_trigger (GtkShortcut *self)
|
||||
{
|
||||
g_return_val_if_fail (GTK_IS_SHORTCUT (self), NULL);
|
||||
|
||||
return self->trigger;
|
||||
}
|
||||
|
||||
/**
|
||||
* gtk_shortcut_set_trigger:
|
||||
* @self: a #GtkShortcut
|
||||
* @trigger: (transfer full) (nullable): The new trigger.
|
||||
* If the @trigger is %NULL, the never trigger will be used.
|
||||
*
|
||||
* Sets the new trigger for @self to be @trigger.
|
||||
**/
|
||||
void
|
||||
gtk_shortcut_set_trigger (GtkShortcut *self,
|
||||
GtkShortcutTrigger *trigger)
|
||||
{
|
||||
g_return_if_fail (GTK_IS_SHORTCUT (self));
|
||||
|
||||
if (trigger == NULL)
|
||||
trigger = gtk_shortcut_trigger_ref (gtk_never_trigger_get ());
|
||||
|
||||
if (self->trigger == trigger)
|
||||
{
|
||||
gtk_shortcut_trigger_unref (trigger);
|
||||
return;
|
||||
}
|
||||
|
||||
gtk_shortcut_trigger_unref (self->trigger);
|
||||
self->trigger = trigger;
|
||||
|
||||
g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_TRIGGER]);
|
||||
}
|
||||
|
||||
GVariant *
|
||||
gtk_shortcut_get_arguments (GtkShortcut *self)
|
||||
{
|
||||
g_return_val_if_fail (GTK_IS_SHORTCUT (self), NULL);
|
||||
|
||||
return self->args;
|
||||
}
|
||||
|
||||
void
|
||||
gtk_shortcut_set_arguments (GtkShortcut *self,
|
||||
GVariant *args)
|
||||
{
|
||||
g_return_if_fail (GTK_IS_SHORTCUT (self));
|
||||
|
||||
if (self->args == args)
|
||||
return;
|
||||
|
||||
g_clear_pointer (&self->args, g_variant_unref);
|
||||
if (args)
|
||||
self->args = g_variant_ref_sink (args);
|
||||
|
||||
g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_ARGUMENTS]);
|
||||
}
|
||||
|
||||
@@ -0,0 +1,62 @@
|
||||
/*
|
||||
* Copyright © 2018 Benjamin Otte
|
||||
*
|
||||
* 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.1 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/>.
|
||||
*
|
||||
* Authors: Benjamin Otte <otte@gnome.org>
|
||||
*/
|
||||
|
||||
#ifndef __GTK_SHORTCUT_H__
|
||||
#define __GTK_SHORTCUT_H__
|
||||
|
||||
#include <gtk/gtktypes.h>
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
#define GTK_TYPE_SHORTCUT (gtk_shortcut_get_type ())
|
||||
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
G_DECLARE_FINAL_TYPE (GtkShortcut, gtk_shortcut, GTK, SHORTCUT, GObject)
|
||||
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
GtkShortcut * gtk_shortcut_new (GtkShortcutTrigger *trigger,
|
||||
GtkShortcutAction *action);
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
GtkShortcut * gtk_shortcut_new_with_arguments (GtkShortcutTrigger *trigger,
|
||||
GtkShortcutAction *action,
|
||||
const gchar *format_string,
|
||||
...);
|
||||
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
GtkShortcutTrigger *
|
||||
gtk_shortcut_get_trigger (GtkShortcut *self);
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
void gtk_shortcut_set_trigger (GtkShortcut *self,
|
||||
GtkShortcutTrigger *trigger);
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
GtkShortcutAction *
|
||||
gtk_shortcut_get_action (GtkShortcut *self);
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
void gtk_shortcut_set_action (GtkShortcut *self,
|
||||
GtkShortcutAction *action);
|
||||
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
GVariant * gtk_shortcut_get_arguments (GtkShortcut *self);
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
void gtk_shortcut_set_arguments (GtkShortcut *self,
|
||||
GVariant *args);
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
#endif /* __GTK_SHORTCUT_H__ */
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,135 @@
|
||||
/*
|
||||
* Copyright © 2018 Benjamin Otte
|
||||
*
|
||||
* 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.1 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/>.
|
||||
*
|
||||
* Authors: Benjamin Otte <otte@gnome.org>
|
||||
*/
|
||||
|
||||
#ifndef __GTK_SHORTCUT_ACTION_H__
|
||||
#define __GTK_SHORTCUT_ACTION_H__
|
||||
|
||||
#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION)
|
||||
#error "Only <gtk/gtk.h> can be included directly."
|
||||
#endif
|
||||
|
||||
#include <gtk/gtktypes.h>
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
#define GTK_TYPE_SHORTCUT_ACTION (gtk_shortcut_action_get_type ())
|
||||
|
||||
#define GTK_IS_SHORTCUT_ACTION(obj) ((obj) != NULL)
|
||||
|
||||
/**
|
||||
* GtkShortcutFunc:
|
||||
* @widget: The widget passed to the activation
|
||||
* @args: The arguments passed to the activation
|
||||
* @user_data: The user data provided when activating the action
|
||||
*
|
||||
* Prototype for shortcuts based on user callbacks.
|
||||
*/
|
||||
typedef gboolean (* GtkShortcutFunc) (GtkWidget *widget,
|
||||
GVariant *args,
|
||||
gpointer user_data);
|
||||
|
||||
/**
|
||||
* GtkShortcutActionFlags:
|
||||
* @GTK_SHORTCUT_ACTION_EXCLUSIVE: The action is the only
|
||||
* action that can be activated. If this flag is not set,
|
||||
* a future activation may select a different action.
|
||||
*
|
||||
* List of flags that can be passed to action activation.
|
||||
* More flags may be added in the future.
|
||||
**/
|
||||
typedef enum {
|
||||
GTK_SHORTCUT_ACTION_EXCLUSIVE = 1 << 0
|
||||
} GtkShortcutActionFlags;
|
||||
|
||||
/**
|
||||
* GtkShortcutActionType:
|
||||
* @GTK_SHORTCUT_ACTION_NOTHING: Don't ever activate
|
||||
* @GTK_SHORTCUT_ACTION_CALLBACK: Call a custom user-provided callback
|
||||
* @GTK_SHORTCUT_ACTION_ACTIVATE: Call gtk_widget_activate() on the widget
|
||||
* @GTK_SHORTCUT_ACTION_MNEMONIC: Call gtk_widget_mnemonic_activate()
|
||||
* on the widget
|
||||
* @GTK_SHORTCUT_ACTION_SIGNAL: Emit the given action signal on the widget
|
||||
* @GTK_SHORTCUT_ACTION_ACTION: Call the provided action on the widget
|
||||
* @GTK_SHORTCUT_ACTION_GACTION: Activate a GAction
|
||||
*
|
||||
* The type of a action determines what the action does when activated.
|
||||
**/
|
||||
typedef enum {
|
||||
GTK_SHORTCUT_ACTION_NOTHING,
|
||||
GTK_SHORTCUT_ACTION_CALLBACK,
|
||||
GTK_SHORTCUT_ACTION_ACTIVATE,
|
||||
GTK_SHORTCUT_ACTION_MNEMONIC,
|
||||
GTK_SHORTCUT_ACTION_SIGNAL,
|
||||
GTK_SHORTCUT_ACTION_ACTION,
|
||||
GTK_SHORTCUT_ACTION_GACTION
|
||||
} GtkShortcutActionType;
|
||||
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
GType gtk_shortcut_action_get_type (void) G_GNUC_CONST;
|
||||
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
GtkShortcutAction * gtk_shortcut_action_ref (GtkShortcutAction *self);
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
void gtk_shortcut_action_unref (GtkShortcutAction *self);
|
||||
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
GtkShortcutActionType gtk_shortcut_action_get_action_type (GtkShortcutAction *self);
|
||||
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
char * gtk_shortcut_action_to_string (GtkShortcutAction *self);
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
void gtk_shortcut_action_print (GtkShortcutAction *self,
|
||||
GString *string);
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
gboolean gtk_shortcut_action_activate (GtkShortcutAction *self,
|
||||
GtkShortcutActionFlags flags,
|
||||
GtkWidget *widget,
|
||||
GVariant *args);
|
||||
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
GtkShortcutAction * gtk_nothing_action_new (void);
|
||||
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
GtkShortcutAction * gtk_callback_action_new (GtkShortcutFunc callback,
|
||||
gpointer data,
|
||||
GDestroyNotify destroy);
|
||||
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
GtkShortcutAction * gtk_mnemonic_action_new (void);
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
GtkShortcutAction * gtk_activate_action_new (void);
|
||||
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
GtkShortcutAction * gtk_signal_action_new (const char *signal_name);
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
const char * gtk_signal_action_get_signal_name (GtkShortcutAction *action);
|
||||
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
GtkShortcutAction * gtk_action_action_new (const char *name);
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
const char * gtk_action_action_get_name (GtkShortcutAction *action);
|
||||
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
GtkShortcutAction * gtk_gaction_action_new (GAction *action);
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
GAction * gtk_gaction_action_get_gaction (GtkShortcutAction *action);
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
#endif /* __GTK_SHORTCUT_ACTION_H__ */
|
||||
@@ -0,0 +1,29 @@
|
||||
/*
|
||||
* Copyright © 2018 Benjamin Otte
|
||||
*
|
||||
* 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.1 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/>.
|
||||
*
|
||||
* Authors: Benjamin Otte <otte@gnome.org>
|
||||
*/
|
||||
|
||||
#ifndef __GTK_SHORTCUT_ACTION_PRIVATE_H__
|
||||
#define __GTK_SHORTCUT_ACTION_PRIVATE_H__
|
||||
|
||||
#include "gtkshortcutaction.h"
|
||||
|
||||
GtkShortcutAction * gtk_shortcut_action_parse_builder (GtkBuilder *builder,
|
||||
const char *string,
|
||||
GError **error);
|
||||
|
||||
#endif /* __GTK_SHORTCUT_ACTION_PRIVATE_H__ */
|
||||
@@ -0,0 +1,664 @@
|
||||
/*
|
||||
* Copyright © 2018 Benjamin Otte
|
||||
*
|
||||
* 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.1 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/>.
|
||||
*
|
||||
* Authors: Benjamin Otte <otte@gnome.org>
|
||||
*/
|
||||
|
||||
|
||||
/**
|
||||
* SECTION:gtkshortcutcontroller
|
||||
* @Short_description: Event controller for shortcuts
|
||||
* @Title: GtkShortcutController
|
||||
* @See_also: #GtkEventController, #GtkShortcut
|
||||
*
|
||||
* #GtkShortcutController is an event controller that manages shortcuts.
|
||||
*
|
||||
* #GtkShortcutController implements #GListModel for querying the shortcuts that
|
||||
* have been added to it.
|
||||
**/
|
||||
|
||||
#include "config.h"
|
||||
|
||||
#include "gtkshortcutcontrollerprivate.h"
|
||||
|
||||
#include "gtkbuildable.h"
|
||||
#include "gtkconcatmodelprivate.h"
|
||||
#include "gtkeventcontrollerprivate.h"
|
||||
#include "gtkintl.h"
|
||||
#include "gtkshortcut.h"
|
||||
#include "gtkshortcutmanager.h"
|
||||
#include "gtkshortcuttrigger.h"
|
||||
#include "gtktypebuiltins.h"
|
||||
#include "gtkwidgetprivate.h"
|
||||
|
||||
#include <gdk/gdk.h>
|
||||
|
||||
struct _GtkShortcutController
|
||||
{
|
||||
GtkEventController parent_instance;
|
||||
|
||||
GListModel *shortcuts;
|
||||
GtkShortcutScope scope;
|
||||
GdkModifierType mnemonics_modifiers;
|
||||
guint last_activated;
|
||||
|
||||
guint custom_shortcuts : 1;
|
||||
};
|
||||
|
||||
struct _GtkShortcutControllerClass
|
||||
{
|
||||
GtkEventControllerClass parent_class;
|
||||
};
|
||||
|
||||
enum {
|
||||
PROP_0,
|
||||
PROP_MNEMONICS_MODIFIERS,
|
||||
PROP_MODEL,
|
||||
PROP_SCOPE,
|
||||
|
||||
N_PROPS
|
||||
};
|
||||
|
||||
static GParamSpec *properties[N_PROPS] = { NULL, };
|
||||
|
||||
static GType
|
||||
gtk_shortcut_controller_list_model_get_item_type (GListModel *list)
|
||||
{
|
||||
return GTK_TYPE_SHORTCUT;
|
||||
}
|
||||
|
||||
static guint
|
||||
gtk_shortcut_controller_list_model_get_n_items (GListModel *list)
|
||||
{
|
||||
GtkShortcutController *self = GTK_SHORTCUT_CONTROLLER (list);
|
||||
|
||||
return g_list_model_get_n_items (self->shortcuts);
|
||||
}
|
||||
|
||||
static gpointer
|
||||
gtk_shortcut_controller_list_model_get_item (GListModel *list,
|
||||
guint position)
|
||||
{
|
||||
GtkShortcutController *self = GTK_SHORTCUT_CONTROLLER (list);
|
||||
|
||||
return g_list_model_get_item (self->shortcuts, position);
|
||||
}
|
||||
|
||||
static void
|
||||
gtk_shortcut_controller_list_model_init (GListModelInterface *iface)
|
||||
{
|
||||
iface->get_item_type = gtk_shortcut_controller_list_model_get_item_type;
|
||||
iface->get_n_items = gtk_shortcut_controller_list_model_get_n_items;
|
||||
iface->get_item = gtk_shortcut_controller_list_model_get_item;
|
||||
}
|
||||
|
||||
static void
|
||||
gtk_shortcut_controller_buildable_add_child (GtkBuildable *buildable,
|
||||
GtkBuilder *builder,
|
||||
GObject *child,
|
||||
const gchar *type)
|
||||
{
|
||||
if (type != NULL)
|
||||
{
|
||||
GTK_BUILDER_WARN_INVALID_CHILD_TYPE (buildable, type);
|
||||
}
|
||||
if (GTK_IS_SHORTCUT (child))
|
||||
{
|
||||
gtk_shortcut_controller_add_shortcut (GTK_SHORTCUT_CONTROLLER (buildable), GTK_SHORTCUT (child));
|
||||
}
|
||||
else
|
||||
{
|
||||
g_warning ("Cannot add an object of type %s to a controller of type %s",
|
||||
g_type_name (G_OBJECT_TYPE (child)), g_type_name (G_OBJECT_TYPE (buildable)));
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
gtk_shortcut_controller_buildable_init (GtkBuildableIface *iface)
|
||||
{
|
||||
iface->add_child = gtk_shortcut_controller_buildable_add_child;
|
||||
}
|
||||
|
||||
G_DEFINE_TYPE_WITH_CODE (GtkShortcutController, gtk_shortcut_controller,
|
||||
GTK_TYPE_EVENT_CONTROLLER,
|
||||
G_IMPLEMENT_INTERFACE (G_TYPE_LIST_MODEL, gtk_shortcut_controller_list_model_init)
|
||||
G_IMPLEMENT_INTERFACE (GTK_TYPE_BUILDABLE, gtk_shortcut_controller_buildable_init))
|
||||
|
||||
static gboolean
|
||||
gtk_shortcut_controller_is_rooted (GtkShortcutController *self)
|
||||
{
|
||||
GtkWidget *widget = gtk_event_controller_get_widget (GTK_EVENT_CONTROLLER (self));
|
||||
|
||||
if (widget == NULL)
|
||||
return FALSE;
|
||||
|
||||
return gtk_widget_get_root (widget) != NULL;
|
||||
}
|
||||
|
||||
static GtkShortcutManager *
|
||||
gtk_shortcut_controller_get_manager (GtkShortcutController *self)
|
||||
{
|
||||
switch (self->scope)
|
||||
{
|
||||
case GTK_SHORTCUT_SCOPE_LOCAL:
|
||||
return NULL;
|
||||
|
||||
case GTK_SHORTCUT_SCOPE_MANAGED:
|
||||
{
|
||||
GtkWidget *widget;
|
||||
|
||||
for (widget = gtk_event_controller_get_widget (GTK_EVENT_CONTROLLER (self));
|
||||
!GTK_IS_SHORTCUT_MANAGER (widget);
|
||||
widget = _gtk_widget_get_parent (widget)) ;
|
||||
return GTK_SHORTCUT_MANAGER (widget);
|
||||
}
|
||||
break;
|
||||
|
||||
case GTK_SHORTCUT_SCOPE_GLOBAL:
|
||||
return GTK_SHORTCUT_MANAGER (gtk_widget_get_root (gtk_event_controller_get_widget (GTK_EVENT_CONTROLLER (self))));
|
||||
break;
|
||||
|
||||
default:
|
||||
g_assert_not_reached ();
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static void
|
||||
gtk_shortcut_controller_set_property (GObject *object,
|
||||
guint prop_id,
|
||||
const GValue *value,
|
||||
GParamSpec *pspec)
|
||||
{
|
||||
GtkShortcutController *self = GTK_SHORTCUT_CONTROLLER (object);
|
||||
|
||||
switch (prop_id)
|
||||
{
|
||||
case PROP_MNEMONICS_MODIFIERS:
|
||||
gtk_shortcut_controller_set_mnemonics_modifiers (self, g_value_get_flags (value));
|
||||
break;
|
||||
|
||||
case PROP_MODEL:
|
||||
{
|
||||
GListModel *model = g_value_get_object (value);
|
||||
if (model && g_list_model_get_item_type (model) != GTK_TYPE_SHORTCUT)
|
||||
{
|
||||
g_warning ("Setting a model with type '%s' on a shortcut controller that requires 'GtkShortcut'",
|
||||
g_type_name (g_list_model_get_item_type (model)));
|
||||
model = NULL;
|
||||
}
|
||||
if (model == NULL)
|
||||
{
|
||||
self->shortcuts = G_LIST_MODEL (g_list_store_new (GTK_TYPE_SHORTCUT));
|
||||
self->custom_shortcuts = TRUE;
|
||||
}
|
||||
else
|
||||
{
|
||||
self->shortcuts = g_object_ref (model);
|
||||
self->custom_shortcuts = FALSE;
|
||||
}
|
||||
g_signal_connect_swapped (self->shortcuts, "items-changed", G_CALLBACK (g_list_model_items_changed), self);
|
||||
}
|
||||
break;
|
||||
|
||||
case PROP_SCOPE:
|
||||
gtk_shortcut_controller_set_scope (self, g_value_get_enum (value));
|
||||
break;
|
||||
|
||||
default:
|
||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
gtk_shortcut_controller_get_property (GObject *object,
|
||||
guint prop_id,
|
||||
GValue *value,
|
||||
GParamSpec *pspec)
|
||||
{
|
||||
GtkShortcutController *self = GTK_SHORTCUT_CONTROLLER (object);
|
||||
|
||||
switch (prop_id)
|
||||
{
|
||||
case PROP_MNEMONICS_MODIFIERS:
|
||||
g_value_set_flags (value, self->mnemonics_modifiers);
|
||||
break;
|
||||
|
||||
case PROP_MODEL:
|
||||
g_value_set_object (value, self->shortcuts);
|
||||
break;
|
||||
|
||||
case PROP_SCOPE:
|
||||
g_value_set_enum (value, self->scope);
|
||||
break;
|
||||
|
||||
default:
|
||||
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
gtk_shortcut_controller_dispose (GObject *object)
|
||||
{
|
||||
GtkShortcutController *self = GTK_SHORTCUT_CONTROLLER (object);
|
||||
|
||||
if (self->custom_shortcuts)
|
||||
g_list_store_remove_all (G_LIST_STORE (self->shortcuts));
|
||||
|
||||
G_OBJECT_CLASS (gtk_shortcut_controller_parent_class)->dispose (object);
|
||||
}
|
||||
|
||||
static void
|
||||
gtk_shortcut_controller_finalize (GObject *object)
|
||||
{
|
||||
GtkShortcutController *self = GTK_SHORTCUT_CONTROLLER (object);
|
||||
|
||||
g_signal_handlers_disconnect_by_func (self->shortcuts, g_list_model_items_changed, self);
|
||||
g_clear_object (&self->shortcuts);
|
||||
|
||||
G_OBJECT_CLASS (gtk_shortcut_controller_parent_class)->finalize (object);
|
||||
}
|
||||
|
||||
static gboolean
|
||||
gtk_shortcut_controller_trigger_shortcut (GtkShortcutController *self,
|
||||
GtkShortcut *shortcut,
|
||||
guint position,
|
||||
const GdkEvent *event,
|
||||
gboolean enable_mnemonics,
|
||||
gboolean exclusive)
|
||||
{
|
||||
GtkWidget *widget;
|
||||
|
||||
if (!gtk_shortcut_trigger_trigger (gtk_shortcut_get_trigger (shortcut), event, enable_mnemonics))
|
||||
return FALSE;
|
||||
|
||||
widget = gtk_event_controller_get_widget (GTK_EVENT_CONTROLLER (self));
|
||||
if (!self->custom_shortcuts &&
|
||||
GTK_IS_CONCAT_MODEL (self->shortcuts))
|
||||
{
|
||||
GListModel *model = gtk_concat_model_get_model_for_item (GTK_CONCAT_MODEL (self->shortcuts), position);
|
||||
if (GTK_IS_SHORTCUT_CONTROLLER (model))
|
||||
widget = gtk_event_controller_get_widget (GTK_EVENT_CONTROLLER (model));
|
||||
}
|
||||
|
||||
self->last_activated = position;
|
||||
|
||||
return gtk_shortcut_action_activate (gtk_shortcut_get_action (shortcut),
|
||||
exclusive ? GTK_SHORTCUT_ACTION_EXCLUSIVE : 0,
|
||||
widget,
|
||||
gtk_shortcut_get_arguments (shortcut));
|
||||
}
|
||||
|
||||
static gboolean
|
||||
gtk_shortcut_controller_run_controllers (GtkEventController *controller,
|
||||
const GdkEvent *event,
|
||||
gboolean enable_mnemonics)
|
||||
{
|
||||
GtkShortcutController *self = GTK_SHORTCUT_CONTROLLER (controller);
|
||||
guint n_items;
|
||||
guint i;
|
||||
guint n_triggered;
|
||||
gboolean exclusive;
|
||||
|
||||
n_items = g_list_model_get_n_items (self->shortcuts);
|
||||
n_triggered = 0;
|
||||
|
||||
for (i = 0; i < n_items; i++)
|
||||
{
|
||||
GtkShortcut *shortcut = g_list_model_get_item (self->shortcuts, i);
|
||||
g_object_unref (shortcut);
|
||||
|
||||
if (gtk_shortcut_trigger_trigger (gtk_shortcut_get_trigger (shortcut), event, enable_mnemonics))
|
||||
n_triggered++;
|
||||
|
||||
if (n_triggered > 1)
|
||||
break;
|
||||
}
|
||||
|
||||
if (n_triggered == 0)
|
||||
return FALSE;
|
||||
|
||||
exclusive = n_triggered == 1;
|
||||
|
||||
for (i = 0; i < n_items; i++)
|
||||
{
|
||||
guint position = (self->last_activated + 1 + i) % n_items;
|
||||
GtkShortcut *shortcut = g_list_model_get_item (self->shortcuts, position);
|
||||
|
||||
g_object_unref (shortcut);
|
||||
|
||||
if (gtk_shortcut_controller_trigger_shortcut (self,
|
||||
shortcut,
|
||||
position,
|
||||
event,
|
||||
enable_mnemonics,
|
||||
exclusive))
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
gtk_shortcut_controller_handle_event (GtkEventController *controller,
|
||||
const GdkEvent *event)
|
||||
{
|
||||
GtkShortcutController *self = GTK_SHORTCUT_CONTROLLER (controller);
|
||||
gboolean enable_mnemonics;
|
||||
|
||||
if (self->scope != GTK_SHORTCUT_SCOPE_LOCAL)
|
||||
return FALSE;
|
||||
|
||||
if (gdk_event_get_event_type (event) == GDK_KEY_PRESS)
|
||||
{
|
||||
GdkModifierType modifiers;
|
||||
gdk_event_get_state (event, &modifiers);
|
||||
enable_mnemonics = (modifiers & gtk_accelerator_get_default_mod_mask ()) == self->mnemonics_modifiers;
|
||||
}
|
||||
else
|
||||
{
|
||||
enable_mnemonics = FALSE;
|
||||
}
|
||||
|
||||
return gtk_shortcut_controller_run_controllers (controller, event, enable_mnemonics);
|
||||
}
|
||||
|
||||
static void
|
||||
gtk_shortcut_controller_set_widget (GtkEventController *controller,
|
||||
GtkWidget *widget)
|
||||
{
|
||||
GtkShortcutController *self = GTK_SHORTCUT_CONTROLLER (controller);
|
||||
|
||||
GTK_EVENT_CONTROLLER_CLASS (gtk_shortcut_controller_parent_class)->set_widget (controller, widget);
|
||||
|
||||
if (_gtk_widget_get_root (widget))
|
||||
gtk_shortcut_controller_root (self);
|
||||
}
|
||||
|
||||
static void
|
||||
gtk_shortcut_controller_unset_widget (GtkEventController *controller)
|
||||
{
|
||||
GtkShortcutController *self = GTK_SHORTCUT_CONTROLLER (controller);
|
||||
GtkWidget *widget = gtk_event_controller_get_widget (controller);
|
||||
|
||||
if (_gtk_widget_get_root (widget))
|
||||
gtk_shortcut_controller_unroot (self);
|
||||
|
||||
GTK_EVENT_CONTROLLER_CLASS (gtk_shortcut_controller_parent_class)->unset_widget (controller);
|
||||
}
|
||||
|
||||
static void
|
||||
gtk_shortcut_controller_class_init (GtkShortcutControllerClass *klass)
|
||||
{
|
||||
GObjectClass *object_class = G_OBJECT_CLASS (klass);
|
||||
GtkEventControllerClass *controller_class = GTK_EVENT_CONTROLLER_CLASS (klass);
|
||||
|
||||
object_class->dispose = gtk_shortcut_controller_dispose;
|
||||
object_class->finalize = gtk_shortcut_controller_finalize;
|
||||
object_class->set_property = gtk_shortcut_controller_set_property;
|
||||
object_class->get_property = gtk_shortcut_controller_get_property;
|
||||
|
||||
controller_class->handle_event = gtk_shortcut_controller_handle_event;
|
||||
controller_class->set_widget = gtk_shortcut_controller_set_widget;
|
||||
controller_class->unset_widget = gtk_shortcut_controller_unset_widget;
|
||||
|
||||
/**
|
||||
* GtkShortcutController:mnemonic-modifiers:
|
||||
*
|
||||
* The modifiers that need to be pressed to allow mnemonics activation.
|
||||
*/
|
||||
properties[PROP_MNEMONICS_MODIFIERS] =
|
||||
g_param_spec_flags ("mnemonic-modifiers",
|
||||
P_("Mnemonic modifers"),
|
||||
P_("The modifiers to be pressed to allow mnemonics activation"),
|
||||
GDK_TYPE_MODIFIER_TYPE,
|
||||
GDK_MOD1_MASK,
|
||||
G_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS);
|
||||
|
||||
/**
|
||||
* GtkShortcutController:model:
|
||||
*
|
||||
* A list model to take shortcuts from
|
||||
*/
|
||||
properties[PROP_MODEL] =
|
||||
g_param_spec_object ("model",
|
||||
P_("Model"),
|
||||
P_("A list model to take shortcuts from"),
|
||||
G_TYPE_LIST_MODEL,
|
||||
G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS);
|
||||
|
||||
/**
|
||||
* GtkShortcutController:scope:
|
||||
*
|
||||
* What scope the shortcuts will be handled in.
|
||||
*/
|
||||
properties[PROP_SCOPE] =
|
||||
g_param_spec_enum ("scope",
|
||||
P_("Scope"),
|
||||
P_("What scope the shortcuts will be handled in"),
|
||||
GTK_TYPE_SHORTCUT_SCOPE,
|
||||
GTK_SHORTCUT_SCOPE_LOCAL,
|
||||
G_PARAM_READWRITE | G_PARAM_EXPLICIT_NOTIFY | G_PARAM_STATIC_STRINGS);
|
||||
|
||||
g_object_class_install_properties (object_class, N_PROPS, properties);
|
||||
}
|
||||
|
||||
static void
|
||||
gtk_shortcut_controller_init (GtkShortcutController *self)
|
||||
{
|
||||
self->mnemonics_modifiers = GDK_MOD1_MASK;
|
||||
}
|
||||
|
||||
void
|
||||
gtk_shortcut_controller_root (GtkShortcutController *self)
|
||||
{
|
||||
GtkShortcutManager *manager = gtk_shortcut_controller_get_manager (self);
|
||||
|
||||
if (manager)
|
||||
GTK_SHORTCUT_MANAGER_GET_IFACE (manager)->add_controller (manager, self);
|
||||
}
|
||||
|
||||
void
|
||||
gtk_shortcut_controller_unroot (GtkShortcutController *self)
|
||||
{
|
||||
GtkShortcutManager *manager = gtk_shortcut_controller_get_manager (self);
|
||||
|
||||
if (manager)
|
||||
GTK_SHORTCUT_MANAGER_GET_IFACE (manager)->remove_controller (manager, self);
|
||||
}
|
||||
|
||||
GtkEventController *
|
||||
gtk_shortcut_controller_new (void)
|
||||
{
|
||||
return g_object_new (GTK_TYPE_SHORTCUT_CONTROLLER,
|
||||
NULL);
|
||||
}
|
||||
|
||||
GtkEventController *
|
||||
gtk_shortcut_controller_new_for_model (GListModel *model)
|
||||
{
|
||||
g_return_val_if_fail (G_IS_LIST_MODEL (model), NULL);
|
||||
g_return_val_if_fail (g_list_model_get_item_type (model) == GTK_TYPE_SHORTCUT, NULL);
|
||||
|
||||
return g_object_new (GTK_TYPE_SHORTCUT_CONTROLLER,
|
||||
"model", model,
|
||||
NULL);
|
||||
}
|
||||
|
||||
/**
|
||||
* gtk_shortcut_controller_add_shortcut:
|
||||
* @self: the controller
|
||||
* @shortcut: a #GtkShortcut
|
||||
*
|
||||
* Adds @shortcut to the list of shortcuts handled by @self.
|
||||
*
|
||||
* If this controller uses an external shortcut list, this function does
|
||||
* nothing.
|
||||
*
|
||||
* The shortcut is added to the list so that it is triggered before
|
||||
* all existing shortcuts.
|
||||
*
|
||||
* FIXME: What's supposed to happen if a shortcut gets added twice?
|
||||
**/
|
||||
void
|
||||
gtk_shortcut_controller_add_shortcut (GtkShortcutController *self,
|
||||
GtkShortcut *shortcut)
|
||||
{
|
||||
g_return_if_fail (GTK_IS_SHORTCUT_CONTROLLER (self));
|
||||
g_return_if_fail (GTK_IS_SHORTCUT (shortcut));
|
||||
|
||||
if (!self->custom_shortcuts)
|
||||
return;
|
||||
|
||||
g_list_store_append (G_LIST_STORE (self->shortcuts), shortcut);
|
||||
}
|
||||
|
||||
/**
|
||||
* gtk_shortcut_controller_remove_shortcut:
|
||||
* @self: the controller
|
||||
* @shortcut: a #GtkShortcut
|
||||
*
|
||||
* Removes @shortcut from the list of shortcuts handled by @self.
|
||||
*
|
||||
* If @shortcut had not been added to @controller or this controller
|
||||
* uses an external shortcut list, this function does nothing.
|
||||
**/
|
||||
void
|
||||
gtk_shortcut_controller_remove_shortcut (GtkShortcutController *self,
|
||||
GtkShortcut *shortcut)
|
||||
{
|
||||
guint i;
|
||||
|
||||
g_return_if_fail (GTK_IS_SHORTCUT_CONTROLLER (self));
|
||||
g_return_if_fail (GTK_IS_SHORTCUT (shortcut));
|
||||
|
||||
if (!self->custom_shortcuts)
|
||||
return;
|
||||
|
||||
for (i = 0; i < g_list_model_get_n_items (self->shortcuts); i++)
|
||||
{
|
||||
GtkShortcut *item = g_list_model_get_item (self->shortcuts, i);
|
||||
|
||||
if (item == shortcut)
|
||||
{
|
||||
g_object_unref (item);
|
||||
g_list_store_remove (G_LIST_STORE (self->shortcuts), i);
|
||||
return;
|
||||
}
|
||||
|
||||
g_object_unref (item);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* gtk_shortcut_controller_set_scope:
|
||||
* @self: a #GtkShortcutController
|
||||
* @scope: the new scope to use
|
||||
*
|
||||
* Sets the controller to have the given @scope.
|
||||
*
|
||||
* The scope allows shortcuts to be activated outside of the normal
|
||||
* event propagation. In particular, it allows installing global
|
||||
* keyboard shortcuts that can be activated even when a widget does
|
||||
* not have focus.
|
||||
**/
|
||||
void
|
||||
gtk_shortcut_controller_set_scope (GtkShortcutController *self,
|
||||
GtkShortcutScope scope)
|
||||
{
|
||||
gboolean rooted;
|
||||
|
||||
g_return_if_fail (GTK_IS_SHORTCUT_CONTROLLER (self));
|
||||
|
||||
if (self->scope == scope)
|
||||
return;
|
||||
|
||||
rooted = gtk_shortcut_controller_is_rooted (self);
|
||||
|
||||
if (rooted)
|
||||
gtk_shortcut_controller_unroot (self);
|
||||
|
||||
self->scope = scope;
|
||||
|
||||
if (rooted)
|
||||
gtk_shortcut_controller_root (self);
|
||||
|
||||
g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_SCOPE]);
|
||||
}
|
||||
|
||||
/**
|
||||
* gtk_shortcut_controller_get_scope:
|
||||
* @self: a #GtkShortcutController
|
||||
*
|
||||
* Gets the scope for when this controller activates its shortcuts. See
|
||||
* gtk_shortcut_controller_set_scope() for details.
|
||||
*
|
||||
* Returns: the controller's scope
|
||||
**/
|
||||
GtkShortcutScope
|
||||
gtk_shortcut_controller_get_scope (GtkShortcutController *self)
|
||||
{
|
||||
g_return_val_if_fail (GTK_IS_SHORTCUT_CONTROLLER (self), GTK_SHORTCUT_SCOPE_LOCAL);
|
||||
|
||||
return self->scope;
|
||||
}
|
||||
|
||||
/**
|
||||
* gtk_shortcut_controller_set_mnemonics_modifiers:
|
||||
* @self: a #GtkShortcutController
|
||||
* @modifiers: the new mnemonics_modifiers to use
|
||||
*
|
||||
* Sets the controller to have the given @mnemonics_modifiers.
|
||||
*
|
||||
* The mnemonics modifiers determines which modifiers need to be pressed to allow
|
||||
* activation of shortcuts with mnemonics triggers.
|
||||
*
|
||||
* This value is only relevant for local shortcut controllers. Global and managed
|
||||
* shortcut controllers will have their shortcuts activated from other places which
|
||||
* have their own modifiers for activating mnemonics.
|
||||
**/
|
||||
void
|
||||
gtk_shortcut_controller_set_mnemonics_modifiers (GtkShortcutController *self,
|
||||
GdkModifierType modifiers)
|
||||
{
|
||||
g_return_if_fail (GTK_IS_SHORTCUT_CONTROLLER (self));
|
||||
|
||||
if (self->mnemonics_modifiers == modifiers)
|
||||
return;
|
||||
|
||||
self->mnemonics_modifiers = modifiers;
|
||||
|
||||
g_object_notify_by_pspec (G_OBJECT (self), properties[PROP_MNEMONICS_MODIFIERS]);
|
||||
}
|
||||
|
||||
/**
|
||||
* gtk_shortcut_controller_get_mnemonics_modifiers:
|
||||
* @self: a #GtkShortcutController
|
||||
*
|
||||
* Gets the mnemonics modifiers for when this controller activates its shortcuts. See
|
||||
* gtk_shortcut_controller_set_mnemonics_modifiers() for details.
|
||||
*
|
||||
* Returns: the controller's mnemonics modifiers
|
||||
**/
|
||||
GdkModifierType
|
||||
gtk_shortcut_controller_get_mnemonics_modifiers (GtkShortcutController *self)
|
||||
{
|
||||
g_return_val_if_fail (GTK_IS_SHORTCUT_CONTROLLER (self), GTK_SHORTCUT_SCOPE_LOCAL);
|
||||
|
||||
return self->mnemonics_modifiers;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,70 @@
|
||||
/*
|
||||
* Copyright © 2018 Benjamin Otte
|
||||
*
|
||||
* 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.1 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/>.
|
||||
*
|
||||
* Authors: Benjamin Otte <otte@gnome.org>
|
||||
*/
|
||||
|
||||
|
||||
#ifndef __GTK_SHORTCUT_CONTROLLER_H__
|
||||
#define __GTK_SHORTCUT_CONTROLLER_H__
|
||||
|
||||
#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION)
|
||||
#error "Only <gtk/gtk.h> can be included directly."
|
||||
#endif
|
||||
|
||||
#include <gtk/gtkeventcontroller.h>
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
#define GTK_TYPE_SHORTCUT_CONTROLLER (gtk_shortcut_controller_get_type ())
|
||||
#define GTK_SHORTCUT_CONTROLLER(o) (G_TYPE_CHECK_INSTANCE_CAST ((o), GTK_TYPE_SHORTCUT_CONTROLLER, GtkShortcutController))
|
||||
#define GTK_SHORTCUT_CONTROLLER_CLASS(k) (G_TYPE_CHECK_CLASS_CAST ((k), GTK_TYPE_SHORTCUT_CONTROLLER, GtkShortcutControllerClass))
|
||||
#define GTK_IS_SHORTCUT_CONTROLLER(o) (G_TYPE_CHECK_INSTANCE_TYPE ((o), GTK_TYPE_SHORTCUT_CONTROLLER))
|
||||
#define GTK_IS_SHORTCUT_CONTROLLER_CLASS(k) (G_TYPE_CHECK_CLASS_TYPE ((k), GTK_TYPE_SHORTCUT_CONTROLLER))
|
||||
#define GTK_SHORTCUT_CONTROLLER_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS ((o), GTK_TYPE_SHORTCUT_CONTROLLER, GtkShortcutControllerClass))
|
||||
|
||||
typedef struct _GtkShortcutController GtkShortcutController;
|
||||
typedef struct _GtkShortcutControllerClass GtkShortcutControllerClass;
|
||||
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
GType gtk_shortcut_controller_get_type (void) G_GNUC_CONST;
|
||||
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
GtkEventController * gtk_shortcut_controller_new (void);
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
GtkEventController * gtk_shortcut_controller_new_for_model (GListModel *list);
|
||||
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
void gtk_shortcut_controller_set_mnemonics_modifiers (GtkShortcutController *self,
|
||||
GdkModifierType modifiers);
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
GdkModifierType gtk_shortcut_controller_get_mnemonics_modifiers (GtkShortcutController *self);
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
void gtk_shortcut_controller_set_scope (GtkShortcutController *self,
|
||||
GtkShortcutScope scope);
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
GtkShortcutScope gtk_shortcut_controller_get_scope (GtkShortcutController *self);
|
||||
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
void gtk_shortcut_controller_add_shortcut (GtkShortcutController *self,
|
||||
GtkShortcut *shortcut);
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
void gtk_shortcut_controller_remove_shortcut (GtkShortcutController *self,
|
||||
GtkShortcut *shortcut);
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
#endif /* __GTK_SHORTCUT_CONTROLLER_H__ */
|
||||
@@ -1,10 +1,10 @@
|
||||
/* GTK - The GIMP Toolkit
|
||||
* Copyright (C) 2011 Red Hat, Inc.
|
||||
/*
|
||||
* Copyright © 2018 Benjamin Otte
|
||||
*
|
||||
* 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.
|
||||
* version 2.1 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
|
||||
@@ -13,18 +13,16 @@
|
||||
*
|
||||
* 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/>.
|
||||
*
|
||||
* Authors: Benjamin Otte <otte@gnome.org>
|
||||
*/
|
||||
|
||||
#ifndef __GTK_BINDINGS_PRIVATE_H__
|
||||
#define __GTK_BINDINGS_PRIVATE_H__
|
||||
#ifndef __GTK_SHORTCUT_CONTROLLER_PRIVATE_H__
|
||||
#define __GTK_SHORTCUT_CONTROLLER_PRIVATE_H__
|
||||
|
||||
#include "gtkbindings.h"
|
||||
#include "gtkshortcutcontroller.h"
|
||||
|
||||
G_BEGIN_DECLS
|
||||
void gtk_shortcut_controller_root (GtkShortcutController *controller);
|
||||
void gtk_shortcut_controller_unroot (GtkShortcutController *controller);
|
||||
|
||||
guint _gtk_binding_parse_binding (GScanner *scanner);
|
||||
void _gtk_binding_reset_parsed (void);
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
#endif /* __GTK_BINDINGS_PRIVATE_H__ */
|
||||
#endif /* __GTK_SHORTCUT_CONTROLLER_H__ */
|
||||
@@ -129,7 +129,7 @@ get_labels (guint key, GdkModifierType modifier, guint *n_mods)
|
||||
const gchar *labels[16];
|
||||
GList *freeme = NULL;
|
||||
gchar key_label[6];
|
||||
gchar *tmp;
|
||||
const gchar *tmp;
|
||||
gunichar ch;
|
||||
gint i = 0;
|
||||
gchar **retval;
|
||||
@@ -304,8 +304,7 @@ parse_combination (GtkShortcutLabel *self,
|
||||
accels = g_strsplit (str, "&", 0);
|
||||
for (k = 0; accels[k]; k++)
|
||||
{
|
||||
gtk_accelerator_parse (accels[k], &key, &modifier);
|
||||
if (key == 0 && modifier == 0)
|
||||
if (!gtk_accelerator_parse (accels[k], &key, &modifier))
|
||||
{
|
||||
retval = FALSE;
|
||||
break;
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user