Compare commits
101 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 4a5df018ca | |||
| ffc5004a59 | |||
| 194ba995ef | |||
| d10b62157b | |||
| b652794f81 | |||
| 6d50afedae | |||
| 88ccddd065 | |||
| 136d6a1ae8 | |||
| 40a26c2e8c | |||
| 8ef6e2fc8e | |||
| 7996b5b355 | |||
| c319da4de0 | |||
| 4939c3be90 | |||
| 66fca6dfcc | |||
| 276e761515 | |||
| 94d09e2a74 | |||
| 643936d5d5 | |||
| ab0eea1859 | |||
| d3674f6375 | |||
| e434fdcf4d | |||
| 432a4b844a | |||
| f1c108e21a | |||
| 87004c3a6c | |||
| e8cd1d140b | |||
| a262c38a79 | |||
| f2caa676a9 | |||
| 8391c87c6d | |||
| 1f413ef061 | |||
| 3685e52254 | |||
| a4c9f37b32 | |||
| 38c8cfe917 | |||
| 3839d41d44 | |||
| 2ee29b1538 | |||
| 787220507d | |||
| 6e164b6c82 | |||
| 171505b823 | |||
| 85c5585c63 | |||
| 2f29b14bec | |||
| 1db44a0af2 | |||
| 1d106ea36b | |||
| 35222a40f8 | |||
| 6ceaa17597 | |||
| a554a5cb93 | |||
| 852953121d | |||
| 291d7f9897 | |||
| d73be336d0 | |||
| 09af271445 | |||
| 811a2ea698 | |||
| e0723d74e6 | |||
| e3ead985e4 | |||
| cf4c4e0465 | |||
| ee815e0cf5 | |||
| 16fd077867 | |||
| 2c25375663 | |||
| c340a18b0f | |||
| f164fe371c | |||
| 533200a016 | |||
| 614a1c694d | |||
| d5d032cb08 | |||
| f19f7f793c | |||
| c891f2e562 | |||
| fed84e47a6 | |||
| fb4126f1fd | |||
| 78717fb175 | |||
| 9474c1dd9f | |||
| 0ccb4036c2 | |||
| 9dacd803a1 | |||
| 82434c44fb | |||
| 114b8be8a3 | |||
| b204748dbc | |||
| 03fdc3eea0 | |||
| 14fba445f4 | |||
| 05662e194b | |||
| fbb58721b6 | |||
| 9bdb03ae56 | |||
| 90d699b483 | |||
| b7b3cb1f13 | |||
| 2ea5835e5b | |||
| 822f28989f | |||
| 791176611f | |||
| e1fe9c8973 | |||
| 8542481ba1 | |||
| eec8a96d0c | |||
| 6edcf01ff6 | |||
| 6cafda4097 | |||
| 08ca6a3c44 | |||
| 2d2f138ff5 | |||
| a1dfe3da52 | |||
| e5eb17576e | |||
| 74262752de | |||
| 8d6138b8f2 | |||
| 2c48acb5a3 | |||
| 32d2a52028 | |||
| 1a115ea681 | |||
| 424bc84288 | |||
| ac738ac45e | |||
| 42396a98a9 | |||
| c04d7d1b28 | |||
| b945a954e7 | |||
| 499c9e6691 | |||
| 017f11bc2c |
+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);
|
||||
}
|
||||
|
||||
@@ -201,6 +201,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 (GtkGestureMultiPress *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)
|
||||
{
|
||||
@@ -294,12 +278,21 @@ start_puzzle (GdkPaintable *puzzle)
|
||||
gtk_container_add (GTK_CONTAINER (frame), grid);
|
||||
gtk_aspect_frame_set (GTK_ASPECT_FRAME (frame), 0.5, 0.5, (float) gdk_paintable_get_intrinsic_aspect_ratio (puzzle), 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_multi_press_new ());
|
||||
|
||||
@@ -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
|
||||
@@ -1783,10 +1714,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
|
||||
@@ -1876,8 +1803,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
|
||||
@@ -4423,10 +4348,9 @@ 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_can_activate_accel
|
||||
gtk_widget_event
|
||||
gtk_widget_activate
|
||||
@@ -4643,8 +4567,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
|
||||
@@ -4659,11 +4581,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
|
||||
@@ -4686,7 +4603,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
|
||||
@@ -4697,7 +4613,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
|
||||
@@ -5179,26 +5094,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_entry_add_signall
|
||||
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>
|
||||
@@ -6654,6 +6549,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>
|
||||
|
||||
@@ -281,7 +281,6 @@ create_accel_label (void)
|
||||
{
|
||||
WidgetInfo *info;
|
||||
GtkWidget *widget, *button, *box;
|
||||
GtkAccelGroup *accel_group;
|
||||
|
||||
widget = gtk_accel_label_new ("Accel Label");
|
||||
|
||||
@@ -293,14 +292,10 @@ create_accel_label (void)
|
||||
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");
|
||||
|
||||
@@ -234,7 +234,7 @@ gdk_content_formats_unref (GdkContentFormats *formats)
|
||||
* This is meant for debugging and logging.
|
||||
*
|
||||
* The form of the representation may change at any time and is
|
||||
* not guranteed to stay identical.
|
||||
* not guaranteed to stay identical.
|
||||
**/
|
||||
void
|
||||
gdk_content_formats_print (GdkContentFormats *formats,
|
||||
|
||||
+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;
|
||||
|
||||
/**
|
||||
|
||||
@@ -821,7 +821,7 @@ gdk_x11_drop_finish (GdkDrop *drop,
|
||||
|
||||
if (gdk_drop_get_drag (drop))
|
||||
{
|
||||
gdk_x11_drag_handle_status (display, &xev);
|
||||
gdk_x11_drag_handle_finished (display, &xev);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
||||
+2
-2
@@ -99,7 +99,7 @@ gsk_render_node_new (const GskRenderNodeClass *node_class, gsize extra_size)
|
||||
*
|
||||
* Acquires a reference on the given #GskRenderNode.
|
||||
*
|
||||
* Returns: (transfer none): the #GskRenderNode with an additional reference
|
||||
* Returns: (transfer full): the #GskRenderNode with an additional reference
|
||||
*/
|
||||
GskRenderNode *
|
||||
gsk_render_node_ref (GskRenderNode *node)
|
||||
@@ -113,7 +113,7 @@ gsk_render_node_ref (GskRenderNode *node)
|
||||
|
||||
/**
|
||||
* gsk_render_node_unref:
|
||||
* @node: a #GskRenderNode
|
||||
* @node: (transfer full): a #GskRenderNode
|
||||
*
|
||||
* Releases a reference on the given #GskRenderNode.
|
||||
*
|
||||
|
||||
@@ -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,23 +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))
|
||||
{
|
||||
GtkWidget *toplevel;
|
||||
|
||||
toplevel = gtk_widget_get_toplevel (parent);
|
||||
if (toplevel && GTK_IS_WINDOW (toplevel))
|
||||
mnemonic_modifier =
|
||||
gtk_window_get_mnemonic_modifier (GTK_WINDOW (toplevel));
|
||||
}
|
||||
|
||||
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
|
||||
@@ -604,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>
|
||||
@@ -199,11 +197,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
@@ -30,7 +30,6 @@
|
||||
|
||||
#include "gtklabel.h"
|
||||
#include "gtkaccellabel.h"
|
||||
#include "gtkaccelmap.h"
|
||||
#include "gtkintl.h"
|
||||
#include "gtkmain.h"
|
||||
#include "gtkprivate.h"
|
||||
@@ -78,23 +77,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
|
||||
@@ -111,8 +97,6 @@
|
||||
|
||||
enum {
|
||||
PROP_0,
|
||||
PROP_ACCEL_CLOSURE,
|
||||
PROP_ACCEL_WIDGET,
|
||||
PROP_LABEL,
|
||||
PROP_USE_UNDERLINE,
|
||||
LAST_PROP
|
||||
@@ -124,10 +108,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;
|
||||
};
|
||||
@@ -142,7 +122,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)
|
||||
@@ -157,56 +136,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"),
|
||||
@@ -239,12 +170,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;
|
||||
@@ -264,16 +189,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;
|
||||
@@ -293,10 +211,6 @@ gtk_accel_label_init (GtkAccelLabel *accel_label)
|
||||
|
||||
gtk_widget_set_has_surface (GTK_WIDGET (accel_label), FALSE);
|
||||
|
||||
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);
|
||||
@@ -329,17 +243,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)
|
||||
{
|
||||
@@ -352,25 +255,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.
|
||||
@@ -395,443 +279,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.
|
||||
@@ -855,7 +308,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;
|
||||
@@ -869,30 +322,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 ("-/-");
|
||||
|
||||
@@ -61,11 +61,6 @@ struct _GtkAccelLabelClass
|
||||
{
|
||||
GtkWidgetClass parent_class;
|
||||
|
||||
gchar *mod_name_shift;
|
||||
gchar *mod_name_control;
|
||||
gchar *mod_name_alt;
|
||||
gchar *mod_separator;
|
||||
|
||||
/* Padding for future expansion */
|
||||
void (*_gtk_reserved1) (void);
|
||||
void (*_gtk_reserved2) (void);
|
||||
@@ -79,16 +74,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,
|
||||
@@ -113,12 +100,6 @@ void gtk_accel_label_set_use_underline (GtkAccelLabel *accel_label,
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
gboolean gtk_accel_label_get_use_underline (GtkAccelLabel *accel_label);
|
||||
|
||||
|
||||
/* private */
|
||||
gchar * _gtk_accel_label_class_get_accelerator_label (GtkAccelLabelClass *klass,
|
||||
guint accelerator_key,
|
||||
GdkModifierType accelerator_mods);
|
||||
|
||||
G_DEFINE_AUTOPTR_CLEANUP_FUNC(GtkAccelLabel, g_object_unref)
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
-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__ */
|
||||
@@ -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"
|
||||
@@ -490,7 +489,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;
|
||||
@@ -599,8 +597,10 @@ gtk_assistant_class_init (GtkAssistantClass *class)
|
||||
g_cclosure_marshal_VOID__VOID,
|
||||
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:
|
||||
|
||||
-1466
File diff suppressed because it is too large
Load Diff
@@ -1,193 +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;
|
||||
typedef struct _GtkBindingEntry GtkBindingEntry;
|
||||
typedef struct _GtkBindingSignal GtkBindingSignal;
|
||||
typedef struct _GtkBindingArg GtkBindingArg;
|
||||
|
||||
/**
|
||||
* GtkBindingSet:
|
||||
* @set_name: unique name of this binding set
|
||||
* @priority: unused
|
||||
* @widget_path_pspecs: unused
|
||||
* @widget_class_pspecs: unused
|
||||
* @class_branch_pspecs: unused
|
||||
* @entries: the key binding entries in this binding set
|
||||
* @current: implementation detail
|
||||
* @parsed: whether this binding set stems from a CSS file and is reset upon theme changes
|
||||
*
|
||||
* A binding set maintains a list of activatable key bindings.
|
||||
* A single binding set can match multiple types of widgets.
|
||||
* Similar to style contexts, can be matched by any information contained
|
||||
* in a widgets #GtkWidgetPath. When a binding within a set is matched upon
|
||||
* activation, an action signal is emitted on the target widget to carry out
|
||||
* the actual activation.
|
||||
*/
|
||||
struct _GtkBindingSet
|
||||
{
|
||||
gchar *set_name;
|
||||
gint priority;
|
||||
GSList *widget_path_pspecs;
|
||||
GSList *widget_class_pspecs;
|
||||
GSList *class_branch_pspecs;
|
||||
GtkBindingEntry *entries;
|
||||
GtkBindingEntry *current;
|
||||
guint parsed : 1;
|
||||
};
|
||||
|
||||
/**
|
||||
* GtkBindingEntry:
|
||||
* @keyval: key value to match
|
||||
* @modifiers: key modifiers to match
|
||||
* @binding_set: binding set this entry belongs to
|
||||
* @destroyed: implementation detail
|
||||
* @in_emission: implementation detail
|
||||
* @marks_unbound: implementation detail
|
||||
* @set_next: linked list of entries maintained by binding set
|
||||
* @hash_next: implementation detail
|
||||
* @signals: action signals of this entry
|
||||
*
|
||||
* Each key binding element of a binding sets binding list is
|
||||
* represented by a GtkBindingEntry.
|
||||
*/
|
||||
struct _GtkBindingEntry
|
||||
{
|
||||
/* key portion */
|
||||
guint keyval;
|
||||
GdkModifierType modifiers;
|
||||
|
||||
GtkBindingSet *binding_set;
|
||||
guint destroyed : 1;
|
||||
guint in_emission : 1;
|
||||
guint marks_unbound : 1;
|
||||
GtkBindingEntry *set_next;
|
||||
GtkBindingEntry *hash_next;
|
||||
GtkBindingSignal *signals;
|
||||
};
|
||||
|
||||
/**
|
||||
* GtkBindingArg:
|
||||
* @arg_type: implementation detail
|
||||
*
|
||||
* A #GtkBindingArg holds the data associated with
|
||||
* an argument for a key binding signal emission as
|
||||
* stored in #GtkBindingSignal.
|
||||
*/
|
||||
struct _GtkBindingArg
|
||||
{
|
||||
GType arg_type;
|
||||
union {
|
||||
glong long_data;
|
||||
gdouble double_data;
|
||||
gchar *string_data;
|
||||
} d;
|
||||
};
|
||||
|
||||
/**
|
||||
* GtkBindingSignal:
|
||||
* @next: implementation detail
|
||||
* @signal_name: the action signal to be emitted
|
||||
* @n_args: number of arguments specified for the signal
|
||||
* @args: (array length=n_args): the arguments specified for the signal
|
||||
*
|
||||
* A GtkBindingSignal stores the necessary information to
|
||||
* activate a widget in response to a key press via a signal
|
||||
* emission.
|
||||
*/
|
||||
struct _GtkBindingSignal
|
||||
{
|
||||
GtkBindingSignal *next;
|
||||
gchar *signal_name;
|
||||
guint n_args;
|
||||
GtkBindingArg *args;
|
||||
};
|
||||
|
||||
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
|
||||
void gtk_binding_entry_add_signall (GtkBindingSet *binding_set,
|
||||
guint keyval,
|
||||
GdkModifierType modifiers,
|
||||
const gchar *signal_name,
|
||||
GSList *binding_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__ */
|
||||
@@ -1,35 +0,0 @@
|
||||
/* GTK - The GIMP Toolkit
|
||||
* Copyright (C) 2011 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_BINDINGS_PRIVATE_H__
|
||||
#define __GTK_BINDINGS_PRIVATE_H__
|
||||
|
||||
#include "gtkbindings.h"
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
guint _gtk_binding_parse_binding (GScanner *scanner);
|
||||
void _gtk_binding_reset_parsed (void);
|
||||
void _gtk_binding_entry_add_signall (GtkBindingSet *binding_set,
|
||||
guint keyval,
|
||||
GdkModifierType modifiers,
|
||||
const gchar *signal_name,
|
||||
GSList *binding_args);
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
#endif /* __GTK_BINDINGS_PRIVATE_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"
|
||||
@@ -2077,6 +2081,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);
|
||||
|
||||
+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
|
||||
@@ -1845,18 +1879,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
|
||||
*/
|
||||
|
||||
@@ -31,7 +31,6 @@
|
||||
#include "gtkentryprivate.h"
|
||||
|
||||
#include "gtkadjustment.h"
|
||||
#include "gtkbindings.h"
|
||||
#include "gtkbox.h"
|
||||
#include "gtkbutton.h"
|
||||
#include "gtkcelleditable.h"
|
||||
|
||||
@@ -999,6 +999,25 @@ typedef enum
|
||||
GTK_PAN_DIRECTION_DOWN
|
||||
} GtkPanDirection;
|
||||
|
||||
/**
|
||||
* GtkShortcutScope:
|
||||
* @GTK_SHORTCUT_SCOPE_LOCAL: Shortcuts are handled inside
|
||||
* the widget hte 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
|
||||
|
||||
@@ -34,7 +34,6 @@
|
||||
#include "gtkwidgetprivate.h"
|
||||
#include "gtkeventcontrollerprivate.h"
|
||||
#include "gtkeventcontrollerkey.h"
|
||||
#include "gtkbindings.h"
|
||||
#include "gtkenums.h"
|
||||
#include "gtkmain.h"
|
||||
|
||||
@@ -495,9 +494,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;
|
||||
}
|
||||
|
||||
|
||||
+90
-138
@@ -22,7 +22,6 @@
|
||||
#include "gtkfilechooserwidget.h"
|
||||
#include "gtkfilechooserwidgetprivate.h"
|
||||
|
||||
#include "gtkbindings.h"
|
||||
#include "gtkbutton.h"
|
||||
#include "gtkcelllayout.h"
|
||||
#include "gtkcellrendererpixbuf.h"
|
||||
@@ -1231,55 +1230,22 @@ places_sidebar_show_error_message_cb (GtkPlacesSidebar *sidebar,
|
||||
}
|
||||
|
||||
static gboolean
|
||||
key_is_left_or_right (guint keyval,
|
||||
guint state)
|
||||
trigger_location_entry (GtkWidget *widget,
|
||||
GVariant *arguments,
|
||||
gpointer unused)
|
||||
{
|
||||
guint modifiers;
|
||||
GtkFileChooserWidget *impl = GTK_FILE_CHOOSER_WIDGET (widget);
|
||||
GtkFileChooserWidgetPrivate *priv = impl->priv;
|
||||
|
||||
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)
|
||||
{
|
||||
GdkModifierType no_text_input_mask;
|
||||
|
||||
if (impl->priv->operation_mode == OPERATION_MODE_SEARCH)
|
||||
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
|
||||
@@ -1295,21 +1261,6 @@ key_press_cb (GtkEventControllerKey *controller,
|
||||
{
|
||||
GtkFileChooserWidget *impl = (GtkFileChooserWidget *) data;
|
||||
GtkFileChooserWidgetPrivate *priv = impl->priv;
|
||||
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
|
||||
@@ -1344,28 +1295,15 @@ widget_key_press_cb (GtkEventControllerKey *controller,
|
||||
GtkFileChooserWidget *impl = (GtkFileChooserWidget *) data;
|
||||
GtkFileChooserWidgetPrivate *priv = impl->priv;
|
||||
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;
|
||||
@@ -7855,18 +7793,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
|
||||
@@ -7877,7 +7817,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;
|
||||
@@ -8159,71 +8098,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",
|
||||
|
||||
+53
-55
@@ -78,7 +78,6 @@
|
||||
#include "gtkflowbox.h"
|
||||
|
||||
#include "gtkadjustment.h"
|
||||
#include "gtkbindings.h"
|
||||
#include "gtkcontainerprivate.h"
|
||||
#include "gtkcssnodeprivate.h"
|
||||
#include "gtkgesturedrag.h"
|
||||
@@ -2964,7 +2963,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,
|
||||
@@ -2975,34 +2974,27 @@ gtk_flow_box_add_move_binding (GtkBindingSet *binding_set,
|
||||
GdkModifierType modify_mod_mask = GDK_CONTROL_MASK;
|
||||
|
||||
display = gdk_display_get_default ();
|
||||
if (display)
|
||||
{
|
||||
extend_mod_mask = gdk_keymap_get_modifier_mask (gdk_display_get_keymap (display),
|
||||
GDK_MODIFIER_INTENT_EXTEND_SELECTION);
|
||||
modify_mod_mask = gdk_keymap_get_modifier_mask (gdk_display_get_keymap (display),
|
||||
GDK_MODIFIER_INTENT_MODIFY_SELECTION);
|
||||
}
|
||||
extend_mod_mask = gdk_keymap_get_modifier_mask (gdk_display_get_keymap (display),
|
||||
GDK_MODIFIER_INTENT_EXTEND_SELECTION);
|
||||
modify_mod_mask = gdk_keymap_get_modifier_mask (gdk_display_get_keymap (display),
|
||||
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
|
||||
@@ -3364,7 +3356,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;
|
||||
@@ -3638,50 +3629,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;
|
||||
@@ -816,70 +808,88 @@ gtk_icon_view_class_init (GtkIconViewClass *klass)
|
||||
G_TYPE_INT);
|
||||
|
||||
/* 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);
|
||||
@@ -3405,35 +3415,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"
|
||||
@@ -308,12 +307,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;
|
||||
@@ -392,9 +387,10 @@ gtk_info_bar_class_init (GtkInfoBarClass *klass)
|
||||
g_cclosure_marshal_VOID__VOID,
|
||||
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
|
||||
*/
|
||||
|
||||
+97
-151
@@ -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"
|
||||
@@ -254,7 +255,7 @@ struct _GtkLabelPrivate
|
||||
{
|
||||
GtkLabelSelectionInfo *select_info;
|
||||
GtkWidget *mnemonic_widget;
|
||||
GtkWindow *mnemonic_window;
|
||||
GtkEventController *mnemonic_controller;
|
||||
|
||||
PangoAttrList *attrs;
|
||||
PangoAttrList *markup_attrs;
|
||||
@@ -389,7 +390,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;
|
||||
@@ -455,7 +455,6 @@ 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_set_selectable_hint (GtkLabel *label);
|
||||
@@ -474,9 +473,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);
|
||||
@@ -563,7 +560,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,
|
||||
@@ -571,18 +568,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_add_binding_signal (widget_class,
|
||||
keyval, modmask,
|
||||
"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_add_binding_signal (widget_class,
|
||||
keyval, modmask | GDK_SHIFT_MASK,
|
||||
"move-cursor",
|
||||
"(iib)", step, count, TRUE);
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -590,7 +585,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;
|
||||
@@ -606,7 +600,6 @@ gtk_label_class_init (GtkLabelClass *class)
|
||||
widget_class->unrealize = gtk_label_unrealize;
|
||||
widget_class->unmap = gtk_label_unmap;
|
||||
widget_class->root = gtk_label_root;
|
||||
widget_class->unroot = gtk_label_unroot;
|
||||
widget_class->mnemonic_activate = gtk_label_mnemonic_activate;
|
||||
widget_class->drag_data_get = gtk_label_drag_data_get;
|
||||
widget_class->grab_focus = gtk_label_grab_focus;
|
||||
@@ -998,124 +991,113 @@ gtk_label_class_init (GtkLabelClass *class)
|
||||
/*
|
||||
* Key bindings
|
||||
*/
|
||||
binding_set = gtk_binding_set_by_class (class);
|
||||
|
||||
/* Moving the insertion point */
|
||||
add_move_binding (binding_set, GDK_KEY_Right, 0,
|
||||
add_move_binding (widget_class, GDK_KEY_Right, 0,
|
||||
GTK_MOVEMENT_VISUAL_POSITIONS, 1);
|
||||
|
||||
add_move_binding (binding_set, GDK_KEY_Left, 0,
|
||||
add_move_binding (widget_class, GDK_KEY_Left, 0,
|
||||
GTK_MOVEMENT_VISUAL_POSITIONS, -1);
|
||||
|
||||
add_move_binding (binding_set, GDK_KEY_KP_Right, 0,
|
||||
add_move_binding (widget_class, GDK_KEY_KP_Right, 0,
|
||||
GTK_MOVEMENT_VISUAL_POSITIONS, 1);
|
||||
|
||||
add_move_binding (binding_set, GDK_KEY_KP_Left, 0,
|
||||
add_move_binding (widget_class, GDK_KEY_KP_Left, 0,
|
||||
GTK_MOVEMENT_VISUAL_POSITIONS, -1);
|
||||
|
||||
add_move_binding (binding_set, GDK_KEY_f, GDK_CONTROL_MASK,
|
||||
add_move_binding (widget_class, GDK_KEY_f, GDK_CONTROL_MASK,
|
||||
GTK_MOVEMENT_LOGICAL_POSITIONS, 1);
|
||||
|
||||
add_move_binding (binding_set, GDK_KEY_b, GDK_CONTROL_MASK,
|
||||
add_move_binding (widget_class, GDK_KEY_b, GDK_CONTROL_MASK,
|
||||
GTK_MOVEMENT_LOGICAL_POSITIONS, -1);
|
||||
|
||||
add_move_binding (binding_set, GDK_KEY_Right, GDK_CONTROL_MASK,
|
||||
add_move_binding (widget_class, GDK_KEY_Right, GDK_CONTROL_MASK,
|
||||
GTK_MOVEMENT_WORDS, 1);
|
||||
|
||||
add_move_binding (binding_set, GDK_KEY_Left, GDK_CONTROL_MASK,
|
||||
add_move_binding (widget_class, GDK_KEY_Left, GDK_CONTROL_MASK,
|
||||
GTK_MOVEMENT_WORDS, -1);
|
||||
|
||||
add_move_binding (binding_set, GDK_KEY_KP_Right, GDK_CONTROL_MASK,
|
||||
add_move_binding (widget_class, GDK_KEY_KP_Right, GDK_CONTROL_MASK,
|
||||
GTK_MOVEMENT_WORDS, 1);
|
||||
|
||||
add_move_binding (binding_set, GDK_KEY_KP_Left, GDK_CONTROL_MASK,
|
||||
add_move_binding (widget_class, 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);
|
||||
gtk_widget_class_add_binding (widget_class,
|
||||
GDK_KEY_a, GDK_CONTROL_MASK,
|
||||
(GtkShortcutFunc) gtk_label_select_all,
|
||||
NULL);
|
||||
gtk_widget_class_add_binding (widget_class,
|
||||
GDK_KEY_slash, GDK_CONTROL_MASK,
|
||||
(GtkShortcutFunc) gtk_label_select_all,
|
||||
NULL);
|
||||
|
||||
/* 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_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_a, GDK_SHIFT_MASK | GDK_CONTROL_MASK,
|
||||
"move-cursor",
|
||||
"(iib)", GTK_MOVEMENT_PARAGRAPH_ENDS, 0, 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);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_backslash, GDK_CONTROL_MASK,
|
||||
"move-cursor",
|
||||
"(iib)", GTK_MOVEMENT_PARAGRAPH_ENDS, 0, FALSE);
|
||||
|
||||
add_move_binding (binding_set, GDK_KEY_f, GDK_MOD1_MASK,
|
||||
add_move_binding (widget_class, GDK_KEY_f, GDK_MOD1_MASK,
|
||||
GTK_MOVEMENT_WORDS, 1);
|
||||
|
||||
add_move_binding (binding_set, GDK_KEY_b, GDK_MOD1_MASK,
|
||||
add_move_binding (widget_class, GDK_KEY_b, GDK_MOD1_MASK,
|
||||
GTK_MOVEMENT_WORDS, -1);
|
||||
|
||||
add_move_binding (binding_set, GDK_KEY_Home, 0,
|
||||
add_move_binding (widget_class, GDK_KEY_Home, 0,
|
||||
GTK_MOVEMENT_DISPLAY_LINE_ENDS, -1);
|
||||
|
||||
add_move_binding (binding_set, GDK_KEY_End, 0,
|
||||
add_move_binding (widget_class, GDK_KEY_End, 0,
|
||||
GTK_MOVEMENT_DISPLAY_LINE_ENDS, 1);
|
||||
|
||||
add_move_binding (binding_set, GDK_KEY_KP_Home, 0,
|
||||
add_move_binding (widget_class, GDK_KEY_KP_Home, 0,
|
||||
GTK_MOVEMENT_DISPLAY_LINE_ENDS, -1);
|
||||
|
||||
add_move_binding (binding_set, GDK_KEY_KP_End, 0,
|
||||
add_move_binding (widget_class, GDK_KEY_KP_End, 0,
|
||||
GTK_MOVEMENT_DISPLAY_LINE_ENDS, 1);
|
||||
|
||||
add_move_binding (binding_set, GDK_KEY_Home, GDK_CONTROL_MASK,
|
||||
add_move_binding (widget_class, GDK_KEY_Home, GDK_CONTROL_MASK,
|
||||
GTK_MOVEMENT_BUFFER_ENDS, -1);
|
||||
|
||||
add_move_binding (binding_set, GDK_KEY_End, GDK_CONTROL_MASK,
|
||||
add_move_binding (widget_class, GDK_KEY_End, GDK_CONTROL_MASK,
|
||||
GTK_MOVEMENT_BUFFER_ENDS, 1);
|
||||
|
||||
add_move_binding (binding_set, GDK_KEY_KP_Home, GDK_CONTROL_MASK,
|
||||
add_move_binding (widget_class, GDK_KEY_KP_Home, GDK_CONTROL_MASK,
|
||||
GTK_MOVEMENT_BUFFER_ENDS, -1);
|
||||
|
||||
add_move_binding (binding_set, GDK_KEY_KP_End, GDK_CONTROL_MASK,
|
||||
add_move_binding (widget_class, 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_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_c, GDK_CONTROL_MASK,
|
||||
"copy-clipboard",
|
||||
NULL);
|
||||
|
||||
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_add_binding_signal (widget_class,
|
||||
GDK_KEY_Return, 0,
|
||||
"activate-current-link",
|
||||
NULL);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_ISO_Enter, 0,
|
||||
"activate-current-link",
|
||||
NULL);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_KP_Enter, 0,
|
||||
"activate-current-link",
|
||||
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_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");
|
||||
@@ -1299,7 +1281,6 @@ gtk_label_init (GtkLabel *label)
|
||||
priv->attrs = NULL;
|
||||
|
||||
priv->mnemonic_widget = NULL;
|
||||
priv->mnemonic_window = NULL;
|
||||
|
||||
priv->mnemonics_visible = TRUE;
|
||||
}
|
||||
@@ -1739,65 +1720,42 @@ 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;
|
||||
|
||||
mnemonic_menu = g_object_get_qdata (G_OBJECT (label), quark_mnemonic_menu);
|
||||
|
||||
if (last_key != 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;
|
||||
}
|
||||
}
|
||||
GtkShortcut *shortcut;
|
||||
|
||||
if (priv->mnemonic_keyval == GDK_KEY_VoidSymbol)
|
||||
goto done;
|
||||
{
|
||||
if (priv->mnemonic_controller)
|
||||
{
|
||||
gtk_widget_remove_controller (widget, priv->mnemonic_controller);
|
||||
priv->mnemonic_controller = NULL;
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
if (priv->mnemonic_controller == NULL)
|
||||
{
|
||||
priv->mnemonic_controller = gtk_shortcut_controller_new ();
|
||||
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 (toplevel && gtk_widget_is_toplevel (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
|
||||
@@ -1840,13 +1798,12 @@ 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_get_toplevel (widget), priv->mnemonic_keyval);
|
||||
gtk_label_setup_mnemonic (label);
|
||||
|
||||
/* The PangoContext is replaced when the display changes, so clear the layouts */
|
||||
gtk_label_clear_layout (GTK_LABEL (widget));
|
||||
@@ -1869,17 +1826,6 @@ gtk_label_root (GtkWidget *widget)
|
||||
label_shortcut_setting_apply (GTK_LABEL (widget));
|
||||
}
|
||||
|
||||
static void
|
||||
gtk_label_unroot (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)->unroot (widget);
|
||||
}
|
||||
|
||||
static void
|
||||
mnemonics_visible_apply (GtkWidget *widget,
|
||||
gboolean mnemonics_visible)
|
||||
@@ -2136,7 +2082,7 @@ gtk_label_recalculate (GtkLabel *label)
|
||||
|
||||
if (keyval != priv->mnemonic_keyval)
|
||||
{
|
||||
gtk_label_setup_mnemonic (label, gtk_widget_get_toplevel (GTK_WIDGET (label)), keyval);
|
||||
gtk_label_setup_mnemonic (label);
|
||||
g_object_notify_by_pspec (G_OBJECT (label), label_props[PROP_MNEMONIC_KEYVAL]);
|
||||
}
|
||||
|
||||
|
||||
+48
-47
@@ -21,7 +21,6 @@
|
||||
|
||||
#include "gtkactionhelperprivate.h"
|
||||
#include "gtkadjustmentprivate.h"
|
||||
#include "gtkbindings.h"
|
||||
#include "gtkbuildable.h"
|
||||
#include "gtkcontainerprivate.h"
|
||||
#include "gtkcssnodeprivate.h"
|
||||
@@ -202,7 +201,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,
|
||||
@@ -408,9 +407,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;
|
||||
@@ -581,43 +577,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
|
||||
@@ -1406,7 +1411,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,
|
||||
@@ -1425,26 +1430,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
-8
@@ -113,7 +113,6 @@
|
||||
|
||||
#include "gtkintl.h"
|
||||
|
||||
#include "gtkaccelmapprivate.h"
|
||||
#include "gtkbox.h"
|
||||
#include "gtkdebug.h"
|
||||
#include "gtkdndprivate.h"
|
||||
@@ -668,8 +667,6 @@ do_post_parse_initialization (void)
|
||||
gsk_ensure_resources ();
|
||||
_gtk_ensure_resources ();
|
||||
|
||||
_gtk_accel_map_init ();
|
||||
|
||||
gtk_initialized = TRUE;
|
||||
|
||||
display_manager = gdk_display_manager_get ();
|
||||
@@ -1856,10 +1853,6 @@ gtk_main_do_event (GdkEvent *event)
|
||||
{
|
||||
GtkWidget *focus_widget;
|
||||
|
||||
if (event->any.type == GDK_KEY_PRESS &&
|
||||
gtk_window_activate_key (GTK_WINDOW (target_widget), (GdkEventKey *) event))
|
||||
goto cleanup;
|
||||
|
||||
focus_widget = gtk_root_get_focus (GTK_ROOT (target_widget));
|
||||
if (focus_widget)
|
||||
target_widget = focus_widget;
|
||||
@@ -1967,7 +1960,7 @@ gtk_main_do_event (GdkEvent *event)
|
||||
* FIXME: this does not work with mnemonic modifiers other than Alt
|
||||
*/
|
||||
if ((event->key.keyval == GDK_KEY_Alt_L || event->key.keyval == GDK_KEY_Alt_R) &&
|
||||
((event->key.state & (gtk_accelerator_get_default_mod_mask ()) & ~(GDK_RELEASE_MASK|GDK_MOD1_MASK)) == 0) &&
|
||||
((event->key.state & (gtk_accelerator_get_default_mod_mask ()) & ~(GDK_MOD1_MASK)) == 0) &&
|
||||
!GTK_IS_MENU_SHELL (grab_widget))
|
||||
{
|
||||
gboolean mnemonics_visible;
|
||||
|
||||
+84
-294
@@ -90,9 +90,7 @@
|
||||
#include "gtkmenuprivate.h"
|
||||
|
||||
#include "gtkaccellabel.h"
|
||||
#include "gtkaccelmap.h"
|
||||
#include "gtkadjustment.h"
|
||||
#include "gtkbindings.h"
|
||||
#include "gtkbox.h"
|
||||
#include "gtkcheckmenuitemprivate.h"
|
||||
#include "gtkcssnodeprivate.h"
|
||||
@@ -108,6 +106,7 @@
|
||||
#include "gtkprivate.h"
|
||||
#include "gtkscrollbar.h"
|
||||
#include "gtksettings.h"
|
||||
#include "gtkshortcutmanager.h"
|
||||
#include "gtksnapshot.h"
|
||||
#include "gtkstylecontextprivate.h"
|
||||
#include "gtktypebuiltins.h"
|
||||
@@ -169,8 +168,6 @@ enum {
|
||||
enum {
|
||||
PROP_0,
|
||||
PROP_ACTIVE,
|
||||
PROP_ACCEL_GROUP,
|
||||
PROP_ACCEL_PATH,
|
||||
PROP_ATTACH_WIDGET,
|
||||
PROP_TEAROFF_STATE,
|
||||
PROP_TEAROFF_TITLE,
|
||||
@@ -198,7 +195,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_snapshot (GtkWidget *widget,
|
||||
GtkSnapshot *snapshot);
|
||||
static void gtk_menu_motion (GtkEventController *controller,
|
||||
@@ -271,8 +267,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,
|
||||
@@ -296,7 +290,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
|
||||
menu_queue_resize (GtkMenu *menu)
|
||||
@@ -404,7 +406,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;
|
||||
@@ -414,7 +415,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->snapshot = gtk_menu_snapshot;
|
||||
widget_class->focus = gtk_menu_focus;
|
||||
widget_class->can_activate_accel = gtk_menu_real_can_activate_accel;
|
||||
@@ -507,32 +507,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:
|
||||
*
|
||||
@@ -686,87 +660,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"));
|
||||
@@ -786,12 +743,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;
|
||||
@@ -858,12 +809,6 @@ gtk_menu_get_property (GObject *object,
|
||||
case PROP_ACTIVE:
|
||||
g_value_set_int (value, g_list_index (GTK_MENU_SHELL (menu)->priv->children, gtk_menu_get_active (menu)));
|
||||
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;
|
||||
@@ -897,6 +842,7 @@ gtk_menu_init (GtkMenu *menu)
|
||||
GtkMenuPrivate *priv;
|
||||
GtkGesture *gesture;
|
||||
GtkEventController *controller;
|
||||
GList *l, *controllers;
|
||||
|
||||
priv = gtk_menu_get_instance_private (menu);
|
||||
|
||||
@@ -906,7 +852,6 @@ gtk_menu_init (GtkMenu *menu)
|
||||
gtk_container_add (GTK_CONTAINER (priv->toplevel), GTK_WIDGET (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),
|
||||
@@ -964,6 +909,15 @@ gtk_menu_init (GtkMenu *menu)
|
||||
g_signal_connect (controller, "key-pressed",
|
||||
G_CALLBACK (gtk_menu_key_pressed), 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
|
||||
@@ -1007,8 +961,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);
|
||||
@@ -1959,57 +1911,6 @@ gtk_menu_set_active (GtkMenu *menu,
|
||||
g_object_notify (G_OBJECT (menu), "active");
|
||||
}
|
||||
|
||||
/**
|
||||
* 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)
|
||||
@@ -2028,107 +1929,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
|
||||
@@ -2436,16 +2236,6 @@ gtk_menu_snapshot (GtkWidget *widget,
|
||||
gtk_widget_snapshot_child (widget, priv->bottom_arrow_widget, snapshot);
|
||||
}
|
||||
|
||||
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,
|
||||
int for_size,
|
||||
|
||||
@@ -135,20 +135,6 @@ GDK_AVAILABLE_IN_ALL
|
||||
void gtk_menu_set_active (GtkMenu *menu,
|
||||
guint index);
|
||||
|
||||
/* set/get the accelerator group that holds global accelerators (should
|
||||
* be added to the corresponding toplevel with gtk_window_add_accel_group().
|
||||
*/
|
||||
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);
|
||||
|
||||
/* A reference count is kept for a widget when it is attached to
|
||||
* a particular widget. This is typically a menu item; it may also
|
||||
* be a widget with a popup menu - for instance, the Notebook widget.
|
||||
|
||||
+40
-52
@@ -41,7 +41,6 @@
|
||||
|
||||
#include "gtkmenubar.h"
|
||||
|
||||
#include "gtkbindings.h"
|
||||
#include "gtkmain.h"
|
||||
#include "gtkmarshalers.h"
|
||||
#include "gtkmenuitemprivate.h"
|
||||
@@ -83,8 +82,6 @@ gtk_menu_bar_class_init (GtkMenuBarClass *class)
|
||||
GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (class);
|
||||
GtkMenuShellClass *menu_shell_class = GTK_MENU_SHELL_CLASS (class);
|
||||
|
||||
GtkBindingSet *binding_set;
|
||||
|
||||
widget_class->measure = gtk_menu_bar_measure;
|
||||
widget_class->size_allocate = gtk_menu_bar_size_allocate;
|
||||
widget_class->root = gtk_menu_bar_root;
|
||||
@@ -94,47 +91,38 @@ gtk_menu_bar_class_init (GtkMenuBarClass *class)
|
||||
menu_shell_class->get_popup_delay = gtk_menu_bar_get_popup_delay;
|
||||
menu_shell_class->move_current = gtk_menu_bar_move_current;
|
||||
|
||||
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"));
|
||||
@@ -318,15 +306,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);
|
||||
@@ -334,7 +322,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);
|
||||
}
|
||||
@@ -391,7 +379,7 @@ gtk_menu_bar_unroot (GtkWidget *widget)
|
||||
**/
|
||||
void
|
||||
_gtk_menu_bar_cycle_focus (GtkMenuBar *menubar,
|
||||
GtkDirectionType dir)
|
||||
GtkDirectionType dir)
|
||||
{
|
||||
GtkWidget *toplevel = gtk_widget_get_toplevel (GTK_WIDGET (menubar));
|
||||
GtkMenuItem *to_activate = NULL;
|
||||
@@ -439,7 +427,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);
|
||||
|
||||
|
||||
@@ -124,7 +124,6 @@ enum {
|
||||
enum {
|
||||
PROP_0,
|
||||
PROP_SUBMENU,
|
||||
PROP_ACCEL_PATH,
|
||||
PROP_LABEL,
|
||||
PROP_USE_UNDERLINE,
|
||||
|
||||
@@ -192,11 +191,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);
|
||||
|
||||
@@ -600,20 +594,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:
|
||||
*
|
||||
@@ -755,9 +735,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;
|
||||
@@ -790,9 +767,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;
|
||||
@@ -841,7 +815,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
|
||||
@@ -857,46 +830,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_SHELL (gtk_widget_get_parent (GTK_WIDGET (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_get_toplevel (GTK_WIDGET (menu_shell));
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Fall back to something ... */
|
||||
toplevel = gtk_widget_get_toplevel (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,
|
||||
parent && gtk_widget_can_activate_accel (parent, 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;
|
||||
GtkWidget *parent;
|
||||
|
||||
parent = gtk_widget_get_parent (GTK_WIDGET (object));
|
||||
menu = GTK_IS_MENU (parent) ? GTK_MENU (parent) : 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 *parent;
|
||||
GtkWidget *widget;
|
||||
|
||||
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 */
|
||||
parent = gtk_widget_get_parent (widget);
|
||||
if (GTK_IS_MENU (parent))
|
||||
{
|
||||
GtkMenu *menu = GTK_MENU (parent);
|
||||
|
||||
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));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -133,11 +133,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,
|
||||
|
||||
@@ -34,8 +34,6 @@ struct _GtkMenuItemPrivate
|
||||
|
||||
guint timer;
|
||||
|
||||
const char *accel_path;
|
||||
|
||||
GtkActionHelper *action_helper;
|
||||
|
||||
GtkWidget *arrow_widget;
|
||||
@@ -48,10 +46,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);
|
||||
|
||||
@@ -36,9 +36,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 "gtkmenubar.h"
|
||||
#include "gtkmenuitemprivate.h"
|
||||
#include "gtkmnemonichash.h"
|
||||
#include "gtkmodelmenuitem.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 multi_press_pressed (GtkGestureMultiPress *gesture,
|
||||
gint n_press,
|
||||
gdouble x,
|
||||
@@ -157,11 +153,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);
|
||||
|
||||
@@ -172,23 +163,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->forall = gtk_menu_shell_forall;
|
||||
@@ -351,43 +333,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:
|
||||
@@ -478,21 +455,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)
|
||||
{
|
||||
@@ -939,16 +901,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
|
||||
@@ -1515,126 +1468,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/gtkmenutracker.h>
|
||||
#include <gtk/gtkeventcontroller.h>
|
||||
@@ -67,9 +66,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;
|
||||
};
|
||||
@@ -81,13 +77,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,198 +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 "gtkmnemonichash.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_widget_get_surface (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__ */
|
||||
@@ -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
|
||||
{
|
||||
|
||||
+81
-80
@@ -27,7 +27,6 @@
|
||||
|
||||
#include "gtknotebook.h"
|
||||
|
||||
#include "gtkbindings.h"
|
||||
#include "gtkbox.h"
|
||||
#include "gtkbuildable.h"
|
||||
#include "gtkbutton.h"
|
||||
@@ -809,49 +808,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
|
||||
@@ -909,7 +912,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;
|
||||
@@ -1166,67 +1168,66 @@ gtk_notebook_class_init (GtkNotebookClass *class)
|
||||
GTK_TYPE_NOTEBOOK, 3,
|
||||
GTK_TYPE_WIDGET, G_TYPE_INT, G_TYPE_INT);
|
||||
|
||||
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);
|
||||
|
||||
gtk_widget_class_set_accessible_type (widget_class, GTK_TYPE_NOTEBOOK_ACCESSIBLE);
|
||||
gtk_widget_class_set_css_name (widget_class, I_("notebook"));
|
||||
|
||||
+92
-92
@@ -26,7 +26,6 @@
|
||||
|
||||
#include "gtkpaned.h"
|
||||
|
||||
#include "gtkbindings.h"
|
||||
#include "gtkcontainerprivate.h"
|
||||
#include "gtkcssnodeprivate.h"
|
||||
#include "gtkcssstylepropertyprivate.h"
|
||||
@@ -254,24 +253,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
|
||||
@@ -313,16 +317,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;
|
||||
@@ -339,12 +336,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] =
|
||||
@@ -582,84 +579,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"));
|
||||
|
||||
@@ -23,7 +23,6 @@
|
||||
#include "gtkpasswordentry.h"
|
||||
|
||||
#include "gtkaccessible.h"
|
||||
#include "gtkbindings.h"
|
||||
#include "gtktextprivate.h"
|
||||
#include "gtkeditable.h"
|
||||
#include "gtkgesturemultipress.h"
|
||||
|
||||
+4
-1
@@ -24,6 +24,8 @@
|
||||
#include "gtkprivate.h"
|
||||
#include "gtkintl.h"
|
||||
|
||||
#include "gtkshortcutmanager.h"
|
||||
|
||||
/**
|
||||
* SECTION:gtkroot
|
||||
* @Title: GtkRoot
|
||||
@@ -38,7 +40,8 @@
|
||||
* The obvious example of a #GtkRoot is #GtkWindow.
|
||||
*/
|
||||
|
||||
G_DEFINE_INTERFACE (GtkRoot, gtk_root, GTK_TYPE_WIDGET)
|
||||
G_DEFINE_INTERFACE_WITH_CODE (GtkRoot, gtk_root, GTK_TYPE_WIDGET,
|
||||
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"
|
||||
@@ -620,10 +619,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)
|
||||
@@ -647,7 +647,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;
|
||||
@@ -740,8 +739,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"
|
||||
@@ -166,7 +165,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;
|
||||
@@ -291,20 +289,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
|
||||
*/
|
||||
|
||||
+32
-34
@@ -28,7 +28,6 @@
|
||||
|
||||
#include "gtkadjustment.h"
|
||||
#include "gtkadjustmentprivate.h"
|
||||
#include "gtkbindings.h"
|
||||
#include "gtkdnd.h"
|
||||
#include "gtkeventcontrollermotion.h"
|
||||
#include "gtkeventcontrollerscroll.h"
|
||||
@@ -390,7 +389,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,
|
||||
@@ -398,27 +397,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
|
||||
@@ -498,7 +499,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;
|
||||
@@ -772,25 +772,23 @@ gtk_scrolled_window_class_init (GtkScrolledWindowClass *class)
|
||||
g_cclosure_marshal_generic,
|
||||
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"));
|
||||
|
||||
+12
-10
@@ -30,7 +30,6 @@
|
||||
#include "gtksearchentryprivate.h"
|
||||
|
||||
#include "gtkaccessible.h"
|
||||
#include "gtkbindings.h"
|
||||
#include "gtkeditable.h"
|
||||
#include "gtkbox.h"
|
||||
#include "gtkgesturemultipress.h"
|
||||
@@ -308,7 +307,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;
|
||||
@@ -444,14 +442,18 @@ gtk_search_entry_class_init (GtkSearchEntryClass *klass)
|
||||
NULL,
|
||||
G_TYPE_NONE, 0);
|
||||
|
||||
binding_set = gtk_binding_set_by_class (klass);
|
||||
|
||||
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_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"));
|
||||
|
||||
@@ -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: (tranfer full) (allow-none): The trigger that will trigger the shortcut
|
||||
* @action: (tranfer 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: (tranfer full) (allow-none): The trigger that will trigger the shortcut
|
||||
* @action: (tranfer 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,649 @@
|
||||
/*
|
||||
* 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 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 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_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)
|
||||
{
|
||||
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));
|
||||
}
|
||||
|
||||
return gtk_shortcut_action_activate (gtk_shortcut_get_action (shortcut),
|
||||
GTK_SHORTCUT_ACTION_EXCLUSIVE, /* FIXME */
|
||||
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 i;
|
||||
|
||||
for (i = 0; i < g_list_model_get_n_items (self->shortcuts); i++)
|
||||
{
|
||||
GtkShortcut *shortcut = g_list_model_get_item (self->shortcuts, i);
|
||||
|
||||
g_object_unref (shortcut);
|
||||
|
||||
if (gtk_shortcut_controller_trigger_shortcut (self,
|
||||
shortcut,
|
||||
i,
|
||||
event,
|
||||
enable_mnemonics))
|
||||
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_WRITABLE | 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;
|
||||
|
||||
switch (self->scope)
|
||||
{
|
||||
case GTK_SHORTCUT_SCOPE_LOCAL:
|
||||
return;
|
||||
|
||||
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));
|
||||
manager = GTK_SHORTCUT_MANAGER (widget);
|
||||
}
|
||||
break;
|
||||
|
||||
case GTK_SHORTCUT_SCOPE_GLOBAL:
|
||||
manager = GTK_SHORTCUT_MANAGER (gtk_widget_get_root (gtk_event_controller_get_widget (GTK_EVENT_CONTROLLER (self))));
|
||||
break;
|
||||
|
||||
default:
|
||||
g_assert_not_reached ();
|
||||
return;
|
||||
}
|
||||
|
||||
GTK_SHORTCUT_MANAGER_GET_IFACE (manager)->add_controller (manager, self);
|
||||
}
|
||||
|
||||
void
|
||||
gtk_shortcut_controller_unroot (GtkShortcutController *self)
|
||||
{
|
||||
GtkShortcutManager *manager;
|
||||
|
||||
switch (self->scope)
|
||||
{
|
||||
case GTK_SHORTCUT_SCOPE_LOCAL:
|
||||
return;
|
||||
|
||||
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));
|
||||
manager = GTK_SHORTCUT_MANAGER (widget);
|
||||
}
|
||||
break;
|
||||
|
||||
case GTK_SHORTCUT_SCOPE_GLOBAL:
|
||||
manager = GTK_SHORTCUT_MANAGER (gtk_widget_get_root (gtk_event_controller_get_widget (GTK_EVENT_CONTROLLER (self))));
|
||||
break;
|
||||
|
||||
default:
|
||||
g_assert_not_reached ();
|
||||
return;
|
||||
}
|
||||
|
||||
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 *controller,
|
||||
GtkShortcutScope scope);
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
GtkShortcutScope gtk_shortcut_controller_get_scope (GtkShortcutController *controller);
|
||||
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
void gtk_shortcut_controller_add_shortcut (GtkShortcutController *controller,
|
||||
GtkShortcut *shortcut);
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
void gtk_shortcut_controller_remove_shortcut (GtkShortcutController *controller,
|
||||
GtkShortcut *shortcut);
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
#endif /* __GTK_SHORTCUT_CONTROLLER_H__ */
|
||||
@@ -0,0 +1,28 @@
|
||||
/*
|
||||
* 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_PRIVATE_H__
|
||||
#define __GTK_SHORTCUT_CONTROLLER_PRIVATE_H__
|
||||
|
||||
#include "gtkshortcutcontroller.h"
|
||||
|
||||
void gtk_shortcut_controller_root (GtkShortcutController *controller);
|
||||
void gtk_shortcut_controller_unroot (GtkShortcutController *controller);
|
||||
|
||||
#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;
|
||||
|
||||
@@ -0,0 +1,77 @@
|
||||
/*
|
||||
* 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 "gtkshortcutmanager.h"
|
||||
|
||||
#include "gtkconcatmodelprivate.h"
|
||||
|
||||
G_DEFINE_INTERFACE (GtkShortcutManager, gtk_shortcut_manager, G_TYPE_OBJECT)
|
||||
|
||||
static GtkConcatModel *
|
||||
gtk_shortcut_manager_get_model (GtkShortcutManager *self,
|
||||
GtkPropagationPhase phase)
|
||||
{
|
||||
switch (phase)
|
||||
{
|
||||
case GTK_PHASE_CAPTURE:
|
||||
return g_object_get_data (G_OBJECT (self), "gtk-shortcut-manager-capture");
|
||||
case GTK_PHASE_BUBBLE:
|
||||
return g_object_get_data (G_OBJECT (self), "gtk-shortcut-manager-bubble");
|
||||
case GTK_PHASE_NONE:
|
||||
case GTK_PHASE_TARGET:
|
||||
return NULL;
|
||||
default:
|
||||
g_assert_not_reached ();
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
gtk_shortcut_manager_default_add_controller (GtkShortcutManager *self,
|
||||
GtkShortcutController *controller)
|
||||
{
|
||||
GtkConcatModel *model;
|
||||
|
||||
model = gtk_shortcut_manager_get_model (self,
|
||||
gtk_event_controller_get_propagation_phase (GTK_EVENT_CONTROLLER (controller)));
|
||||
if (model)
|
||||
gtk_concat_model_append (model, G_LIST_MODEL (controller));
|
||||
}
|
||||
|
||||
static void
|
||||
gtk_shortcut_manager_default_remove_controller (GtkShortcutManager *self,
|
||||
GtkShortcutController *controller)
|
||||
{
|
||||
GtkConcatModel *model;
|
||||
|
||||
model = gtk_shortcut_manager_get_model (self,
|
||||
gtk_event_controller_get_propagation_phase (GTK_EVENT_CONTROLLER (controller)));
|
||||
if (model)
|
||||
gtk_concat_model_remove (model, G_LIST_MODEL (controller));
|
||||
}
|
||||
|
||||
static void
|
||||
gtk_shortcut_manager_default_init (GtkShortcutManagerInterface *iface)
|
||||
{
|
||||
iface->add_controller = gtk_shortcut_manager_default_add_controller;
|
||||
iface->remove_controller = gtk_shortcut_manager_default_remove_controller;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,71 @@
|
||||
/*
|
||||
* 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_MANAGER_H__
|
||||
#define __GTK_SHORTCUT_MANAGER_H__
|
||||
|
||||
#if !defined (__GTK_H_INSIDE__) && !defined (GTK_COMPILATION)
|
||||
#error "Only <gtk/gtk.h> can be included directly."
|
||||
#endif
|
||||
|
||||
#include <gtk/gtkshortcutcontroller.h>
|
||||
#include <gtk/gtkwidget.h>
|
||||
|
||||
G_BEGIN_DECLS
|
||||
|
||||
#define GTK_TYPE_SHORTCUT_MANAGER (gtk_shortcut_manager_get_type ())
|
||||
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
G_DECLARE_INTERFACE (GtkShortcutManager, gtk_shortcut_manager, GTK, SHORTCUT_MANAGER, GtkWidget)
|
||||
|
||||
/**
|
||||
* GtkShortcutManager:
|
||||
*
|
||||
* This object is used to implement support for #GtkShortcutScopes. Every
|
||||
* widget that implements #GtkShortcutManager will be used as a
|
||||
* %GTK_SHORTCUT_SCOPE_MANAGED.
|
||||
*/
|
||||
|
||||
/**
|
||||
* GtkShortcutManagerInterface:
|
||||
* @add_controller: Add a #GtkShortcutController to be managed.
|
||||
* @remove_controller: Remove a #GtkShortcutController that had previously
|
||||
* been added.
|
||||
*
|
||||
* The list of functions that can be implemented for the #GtkShortcutManager interface.
|
||||
*
|
||||
* Note that no function is mandatory to implement, the default implementation will work
|
||||
* fine.
|
||||
*/
|
||||
struct _GtkShortcutManagerInterface
|
||||
{
|
||||
/*< private >*/
|
||||
GTypeInterface g_iface;
|
||||
|
||||
/*< public >*/
|
||||
void (* add_controller) (GtkShortcutManager *self,
|
||||
GtkShortcutController *controller);
|
||||
void (* remove_controller) (GtkShortcutManager *self,
|
||||
GtkShortcutController *controller);
|
||||
};
|
||||
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
#endif /* __GTK_SHORTCUT_MANAGER_H__ */
|
||||
+17
-19
@@ -29,7 +29,6 @@
|
||||
#include "gtkorientable.h"
|
||||
#include "gtksizegroup.h"
|
||||
#include "gtkwidget.h"
|
||||
#include "gtkbindings.h"
|
||||
#include "gtkprivate.h"
|
||||
#include "gtkmarshalers.h"
|
||||
#include "gtkgesturepan.h"
|
||||
@@ -311,7 +310,6 @@ gtk_shortcuts_section_class_init (GtkShortcutsSectionClass *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;
|
||||
|
||||
object_class->finalize = gtk_shortcuts_section_finalize;
|
||||
object_class->get_property = gtk_shortcuts_section_get_property;
|
||||
@@ -392,23 +390,23 @@ gtk_shortcuts_section_class_init (GtkShortcutsSectionClass *klass)
|
||||
G_TYPE_BOOLEAN, 1,
|
||||
G_TYPE_INT);
|
||||
|
||||
binding_set = gtk_binding_set_by_class (klass);
|
||||
gtk_binding_entry_add_signal (binding_set,
|
||||
GDK_KEY_Page_Up, 0,
|
||||
"change-current-page", 1,
|
||||
G_TYPE_INT, -1);
|
||||
gtk_binding_entry_add_signal (binding_set,
|
||||
GDK_KEY_Page_Down, 0,
|
||||
"change-current-page", 1,
|
||||
G_TYPE_INT, 1);
|
||||
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, 0,
|
||||
"change-current-page",
|
||||
"(i)", -1);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_Page_Down, 0,
|
||||
"change-current-page",
|
||||
"(i)", 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_widget_class_set_css_name (widget_class, I_("shortcuts-section"));
|
||||
}
|
||||
|
||||
|
||||
@@ -20,7 +20,6 @@
|
||||
|
||||
#include "gtkshortcutswindowprivate.h"
|
||||
|
||||
#include "gtkbindings.h"
|
||||
#include "gtkbox.h"
|
||||
#include "gtkgrid.h"
|
||||
#include "gtkheaderbar.h"
|
||||
@@ -764,7 +763,6 @@ gtk_shortcuts_window_class_init (GtkShortcutsWindowClass *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_binding_set_by_class (klass);
|
||||
|
||||
object_class->constructed = gtk_shortcuts_window_constructed;
|
||||
object_class->finalize = gtk_shortcuts_window_finalize;
|
||||
@@ -846,8 +844,14 @@ gtk_shortcuts_window_class_init (GtkShortcutsWindowClass *klass)
|
||||
G_TYPE_NONE,
|
||||
0);
|
||||
|
||||
gtk_binding_entry_add_signal (binding_set, GDK_KEY_Escape, 0, "close", 0);
|
||||
gtk_binding_entry_add_signal (binding_set, GDK_KEY_f, GDK_CONTROL_MASK, "search", 0);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_Escape, 0,
|
||||
"close",
|
||||
NULL);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_f, GDK_CONTROL_MASK,
|
||||
"search",
|
||||
NULL);
|
||||
|
||||
g_type_ensure (GTK_TYPE_SHORTCUTS_GROUP);
|
||||
g_type_ensure (GTK_TYPE_SHORTCUTS_SHORTCUT);
|
||||
|
||||
@@ -0,0 +1,981 @@
|
||||
/*
|
||||
* 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:GtkShortcutTrigger
|
||||
* @Title: GtkShortcutTrigger
|
||||
* @Short_description: Triggers to track if shortcuts should be activated
|
||||
* @See_also: #GtkShortcut
|
||||
*
|
||||
* #GtkShortcutTrigger is the object used to track if a #GtkShortcut should be
|
||||
* activated. For this purpose, gtk_shortcut_trigger_trigger() can be called
|
||||
* on a #GdkEvent.
|
||||
*
|
||||
* #GtkShortcutTriggers contain functions that allow easy presentation to end
|
||||
* users as well as being printed for debugging.
|
||||
*
|
||||
* All #GtkShortcutTriggers are immutable, you can only specify their properties
|
||||
* during construction. If you want to change a trigger, you have to replace it
|
||||
* with a new one.
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
|
||||
#include "gtkshortcuttrigger.h"
|
||||
|
||||
#include "gtkaccelgroupprivate.h"
|
||||
|
||||
typedef struct _GtkShortcutTriggerClass GtkShortcutTriggerClass;
|
||||
|
||||
#define GTK_IS_SHORTCUT_TRIGGER_TYPE(trigger,type) (GTK_IS_SHORTCUT_TRIGGER (trigger) && (trigger)->trigger_class->trigger_type == (type))
|
||||
|
||||
struct _GtkShortcutTrigger
|
||||
{
|
||||
const GtkShortcutTriggerClass *trigger_class;
|
||||
|
||||
volatile int ref_count;
|
||||
};
|
||||
|
||||
struct _GtkShortcutTriggerClass
|
||||
{
|
||||
GtkShortcutTriggerType trigger_type;
|
||||
gsize struct_size;
|
||||
const char *type_name;
|
||||
|
||||
void (* finalize) (GtkShortcutTrigger *trigger);
|
||||
gboolean (* trigger) (GtkShortcutTrigger *trigger,
|
||||
const GdkEvent *event,
|
||||
gboolean enable_mnemonics);
|
||||
guint (* hash) (GtkShortcutTrigger *trigger);
|
||||
int (* compare) (GtkShortcutTrigger *trigger1,
|
||||
GtkShortcutTrigger *trigger2);
|
||||
void (* print) (GtkShortcutTrigger *trigger,
|
||||
GString *string);
|
||||
gboolean (* print_label) (GtkShortcutTrigger *trigger,
|
||||
GdkDisplay *display,
|
||||
GString *string);
|
||||
};
|
||||
|
||||
G_DEFINE_BOXED_TYPE (GtkShortcutTrigger, gtk_shortcut_trigger,
|
||||
gtk_shortcut_trigger_ref,
|
||||
gtk_shortcut_trigger_unref)
|
||||
|
||||
static void
|
||||
gtk_shortcut_trigger_finalize (GtkShortcutTrigger *self)
|
||||
{
|
||||
self->trigger_class->finalize (self);
|
||||
|
||||
g_free (self);
|
||||
}
|
||||
|
||||
/*< private >
|
||||
* gtk_shortcut_trigger_new:
|
||||
* @trigger_class: class structure for this trigger
|
||||
*
|
||||
* Returns: (transfer full): the newly created #GtkShortcutTrigger
|
||||
*/
|
||||
static GtkShortcutTrigger *
|
||||
gtk_shortcut_trigger_new (const GtkShortcutTriggerClass *trigger_class)
|
||||
{
|
||||
GtkShortcutTrigger *self;
|
||||
|
||||
g_return_val_if_fail (trigger_class != NULL, NULL);
|
||||
|
||||
self = g_malloc0 (trigger_class->struct_size);
|
||||
|
||||
self->trigger_class = trigger_class;
|
||||
|
||||
self->ref_count = 1;
|
||||
|
||||
return self;
|
||||
}
|
||||
|
||||
/**
|
||||
* gtk_shortcut_trigger_ref:
|
||||
* @trigger: a #GtkShortcutTrigger
|
||||
*
|
||||
* Acquires a reference on the given #GtkShortcutTrigger.
|
||||
*
|
||||
* Returns: (transfer full): the #GtkShortcutTrigger with an additional reference
|
||||
*/
|
||||
GtkShortcutTrigger *
|
||||
gtk_shortcut_trigger_ref (GtkShortcutTrigger *trigger)
|
||||
{
|
||||
g_return_val_if_fail (GTK_IS_SHORTCUT_TRIGGER (trigger), NULL);
|
||||
|
||||
g_atomic_int_inc (&trigger->ref_count);
|
||||
|
||||
return trigger;
|
||||
}
|
||||
|
||||
/**
|
||||
* gtk_shortcut_trigger_unref:
|
||||
* @trigger: (transfer full): a #GtkShortcutTrigger
|
||||
*
|
||||
* Releases a reference on the given #GtkShortcutTrigger.
|
||||
*
|
||||
* If the reference was the last, the resources associated to the @trigger are
|
||||
* freed.
|
||||
*/
|
||||
void
|
||||
gtk_shortcut_trigger_unref (GtkShortcutTrigger *trigger)
|
||||
{
|
||||
g_return_if_fail (GTK_IS_SHORTCUT_TRIGGER (trigger));
|
||||
|
||||
if (g_atomic_int_dec_and_test (&trigger->ref_count))
|
||||
gtk_shortcut_trigger_finalize (trigger);
|
||||
}
|
||||
|
||||
/**
|
||||
* gtk_shortcut_trigger_get_trigger_type:
|
||||
* @self: a #GtkShortcutTrigger
|
||||
*
|
||||
* Returns the type of the @trigger.
|
||||
*
|
||||
* Returns: the type of the #GtkShortcutTrigger
|
||||
*/
|
||||
GtkShortcutTriggerType
|
||||
gtk_shortcut_trigger_get_trigger_type (GtkShortcutTrigger *self)
|
||||
{
|
||||
g_return_val_if_fail (GTK_IS_SHORTCUT_TRIGGER (self), GTK_SHORTCUT_TRIGGER_NEVER);
|
||||
|
||||
return self->trigger_class->trigger_type;
|
||||
}
|
||||
|
||||
/**
|
||||
* gtk_shortcut_trigger_trigger:
|
||||
* @self: a #GtkShortcutTrigger
|
||||
* @event: the event to check
|
||||
* @enable_mnemonics: %TRUE if mnemonics should trigger. Usually the
|
||||
* value of this property is determined by checking that the passed
|
||||
* in @event is a Key event and has the right modifiers set.
|
||||
*
|
||||
* Checks if the given @event triggers @self. If so, returns %TRUE.
|
||||
*
|
||||
* Returns: %TRUE if this event triggered the trigger
|
||||
**/
|
||||
gboolean
|
||||
gtk_shortcut_trigger_trigger (GtkShortcutTrigger *self,
|
||||
const GdkEvent *event,
|
||||
gboolean enable_mnemonics)
|
||||
{
|
||||
g_return_val_if_fail (GTK_IS_SHORTCUT_TRIGGER (self), FALSE);
|
||||
g_return_val_if_fail (GDK_IS_EVENT (event), FALSE);
|
||||
|
||||
return self->trigger_class->trigger (self, event, enable_mnemonics);
|
||||
}
|
||||
|
||||
/**
|
||||
* gtk_shortcut_trigger_parse_string:
|
||||
* @string: the string to parse
|
||||
*
|
||||
* Tries to parse the given string into a trigger. On success,
|
||||
* the parsed trigger is returned. When parsing failed, %NULL is
|
||||
* returned.
|
||||
*
|
||||
* FIXME: Document the supported format here once we've figured
|
||||
* it out.
|
||||
* For now, this function only supports gtk_accelerator_parse() and
|
||||
* can only return a trigger of type %GTK_SHORTCUT_TRIGGER_KEYVAL.
|
||||
*
|
||||
* Returns: a new #GtkShortcutTrigger or %NULL on error
|
||||
**/
|
||||
GtkShortcutTrigger *
|
||||
gtk_shortcut_trigger_parse_string (const char *string)
|
||||
{
|
||||
GdkModifierType modifiers;
|
||||
guint keyval;
|
||||
|
||||
g_return_val_if_fail (string != NULL, NULL);
|
||||
|
||||
if (gtk_accelerator_parse (string, &keyval, &modifiers))
|
||||
return gtk_keyval_trigger_new (keyval, modifiers);
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/**
|
||||
* gtk_shortcut_trigger_to_string:
|
||||
* @self: a #GtkShortcutTrigger
|
||||
*
|
||||
* Prints the given trigger into a human-readable string.
|
||||
* This is a small wrapper around gdk_content_formats_print() to help
|
||||
* when debugging.
|
||||
*
|
||||
* Returns: (transfer full): a new string
|
||||
**/
|
||||
char *
|
||||
gtk_shortcut_trigger_to_string (GtkShortcutTrigger *self)
|
||||
{
|
||||
GString *string;
|
||||
|
||||
g_return_val_if_fail (self != NULL, NULL);
|
||||
|
||||
string = g_string_new (NULL);
|
||||
gtk_shortcut_trigger_print (self, string);
|
||||
|
||||
return g_string_free (string, FALSE);
|
||||
}
|
||||
|
||||
/**
|
||||
* gtk_shortcut_trigger_print:
|
||||
* @self: a #GtkShortcutTrigger
|
||||
* @string: a #GString to print into
|
||||
*
|
||||
* Prints the given trigger into a string for the developer.
|
||||
* This is meant for debugging and logging.
|
||||
*
|
||||
* The form of the representation may change at any time and is
|
||||
* not guaranteed to stay identical.
|
||||
**/
|
||||
void
|
||||
gtk_shortcut_trigger_print (GtkShortcutTrigger *self,
|
||||
GString *string)
|
||||
{
|
||||
g_return_if_fail (GTK_IS_SHORTCUT_TRIGGER (self));
|
||||
g_return_if_fail (string != NULL);
|
||||
|
||||
return self->trigger_class->print (self, string);
|
||||
}
|
||||
|
||||
/**
|
||||
* gtk_shortcut_trigger_to_label:
|
||||
* @self: a #GtkShortcutTrigger
|
||||
* @display: #GdkDisplay to print for
|
||||
*
|
||||
* Gets textual representation for the given trigger. This
|
||||
* function is returning a translated string for presentation
|
||||
* to end users for example in menu items or in help texts.
|
||||
*
|
||||
* The @display in use may influence the resulting string in
|
||||
* various forms, such as resolving hardware keycodes or by
|
||||
* causing display-specific modifier names.
|
||||
*
|
||||
* The form of the representation may change at any time and is
|
||||
* not guaranteed to stay identical.
|
||||
*
|
||||
* Returns: (transfer full): a new string
|
||||
**/
|
||||
char *
|
||||
gtk_shortcut_trigger_to_label (GtkShortcutTrigger *self,
|
||||
GdkDisplay *display)
|
||||
{
|
||||
GString *string;
|
||||
|
||||
g_return_val_if_fail (self != NULL, NULL);
|
||||
|
||||
string = g_string_new (NULL);
|
||||
gtk_shortcut_trigger_print_label (self, display, string);
|
||||
|
||||
return g_string_free (string, FALSE);
|
||||
}
|
||||
|
||||
/**
|
||||
* gtk_shortcut_trigger_print_label:
|
||||
* @self: a #GtkShortcutTrigger
|
||||
* @display: #GdkDisplay to print for
|
||||
* @string: a #GString to print into
|
||||
*
|
||||
* Prints the given trigger into a string. This function is
|
||||
* returning a translated string for presentation to end users
|
||||
* for example in menu items or in help texts.
|
||||
*
|
||||
* The @display in use may influence the resulting string in
|
||||
* various forms, such as resolving hardware keycodes or by
|
||||
* causing display-specific modifier names.
|
||||
*
|
||||
* The form of the representation may change at any time and is
|
||||
* not guaranteed to stay identical.
|
||||
*
|
||||
* Returns: %TRUE if something was printed or %FALSE if the
|
||||
* trigger did not have a textual representation suitable
|
||||
* for end users.
|
||||
**/
|
||||
gboolean
|
||||
gtk_shortcut_trigger_print_label (GtkShortcutTrigger *self,
|
||||
GdkDisplay *display,
|
||||
GString *string)
|
||||
{
|
||||
g_return_val_if_fail (GTK_IS_SHORTCUT_TRIGGER (self), FALSE);
|
||||
g_return_val_if_fail (GDK_IS_DISPLAY (display), FALSE);
|
||||
g_return_val_if_fail (string != NULL, FALSE);
|
||||
|
||||
return self->trigger_class->print_label (self, display, string);
|
||||
}
|
||||
|
||||
/**
|
||||
* gtk_shortcut_trigger_hash:
|
||||
* @trigger: (type GtkShortcutTrigger): a #GtkShortcutTrigger
|
||||
*
|
||||
* Generates a hash value for a #GtkShortcutTrigger.
|
||||
*
|
||||
* The output of this function is guaranteed to be the same for a given
|
||||
* value only per-process. It may change between different processor
|
||||
* architectures or even different versions of GTK. Do not use this
|
||||
* function as a basis for building protocols or file formats.
|
||||
*
|
||||
* The types of @trigger is #gconstpointer only to allow use of this
|
||||
* function with #GHashTable. They must each be a #GtkShortcutTrigger.
|
||||
*
|
||||
* Returns: a hash value corresponding to @trigger
|
||||
**/
|
||||
guint
|
||||
gtk_shortcut_trigger_hash (gconstpointer trigger)
|
||||
{
|
||||
GtkShortcutTrigger *t = (GtkShortcutTrigger *) trigger;
|
||||
|
||||
g_return_val_if_fail (GTK_IS_SHORTCUT_TRIGGER (trigger), 0);
|
||||
|
||||
return t->trigger_class->hash (t);
|
||||
}
|
||||
|
||||
/**
|
||||
* gtk_shortcut_trigger_equal:
|
||||
* @trigger1: (type GtkShortcutTrigger): a #GtkShortcutTrigger
|
||||
* @trigger2: (type GtkShortcutTrigger): a #GtkShortcutTrigger
|
||||
*
|
||||
* Checks if @trigger1 and @trigger2 trigger under the same conditions.
|
||||
*
|
||||
* The types of @one and @two are #gconstpointer only to allow use of this
|
||||
* function with #GHashTable. They must each be a #GtkShortcutTrigger.
|
||||
*
|
||||
* Returns: %TRUE if @trigger1 and @trigger2 are equal
|
||||
**/
|
||||
gboolean
|
||||
gtk_shortcut_trigger_equal (gconstpointer trigger1,
|
||||
gconstpointer trigger2)
|
||||
{
|
||||
return gtk_shortcut_trigger_compare (trigger1, trigger2) == 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* gtk_shortcut_trigger_compare:
|
||||
* @trigger1: (type GtkShortcutTrigger): a #GtkShortcutTrigger
|
||||
* @trigger2: (type GtkShortcutTrigger): a #GtkShortcutTrigger
|
||||
*
|
||||
*
|
||||
* The types of @one and @two are #gconstpointer only to allow use of this
|
||||
* function as a #GCompareFunc. They must each be a #GtkShortcutTrigger.
|
||||
*
|
||||
* Returns: An integer less than, equal to, or greater than zero if
|
||||
* @trigger1 is found, respectively, to be less than, to match,
|
||||
* or be greater than @trigger2.
|
||||
**/
|
||||
gint
|
||||
gtk_shortcut_trigger_compare (gconstpointer trigger1,
|
||||
gconstpointer trigger2)
|
||||
{
|
||||
GtkShortcutTrigger *t1 = (GtkShortcutTrigger *) trigger1;
|
||||
GtkShortcutTrigger *t2 = (GtkShortcutTrigger *) trigger2;
|
||||
|
||||
g_return_val_if_fail (GTK_IS_SHORTCUT_TRIGGER (trigger1), -1);
|
||||
g_return_val_if_fail (GTK_IS_SHORTCUT_TRIGGER (trigger2), 1);
|
||||
|
||||
if (t1->trigger_class != t2->trigger_class)
|
||||
return t1->trigger_class->trigger_type - t2->trigger_class->trigger_type;
|
||||
|
||||
return t1->trigger_class->compare (t1, t2);
|
||||
}
|
||||
|
||||
/*** GTK_SHORTCUT_TRIGGER_NEVER ***/
|
||||
|
||||
typedef struct _GtkNeverTrigger GtkNeverTrigger;
|
||||
|
||||
struct _GtkNeverTrigger
|
||||
{
|
||||
GtkShortcutTrigger trigger;
|
||||
|
||||
guint never;
|
||||
GdkModifierType modifiers;
|
||||
};
|
||||
|
||||
static void
|
||||
gtk_never_trigger_finalize (GtkShortcutTrigger *trigger)
|
||||
{
|
||||
g_assert_not_reached ();
|
||||
}
|
||||
|
||||
static gboolean
|
||||
gtk_never_trigger_trigger (GtkShortcutTrigger *trigger,
|
||||
const GdkEvent *event,
|
||||
gboolean enable_mnemonics)
|
||||
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static guint
|
||||
gtk_never_trigger_hash (GtkShortcutTrigger *trigger)
|
||||
{
|
||||
return GTK_SHORTCUT_TRIGGER_NEVER;
|
||||
}
|
||||
|
||||
static int
|
||||
gtk_never_trigger_compare (GtkShortcutTrigger *trigger1,
|
||||
GtkShortcutTrigger *trigger2)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void
|
||||
gtk_never_trigger_print (GtkShortcutTrigger *trigger,
|
||||
GString *string)
|
||||
|
||||
{
|
||||
g_string_append (string, "<never>");
|
||||
}
|
||||
|
||||
static gboolean
|
||||
gtk_never_trigger_print_label (GtkShortcutTrigger *trigger,
|
||||
GdkDisplay *display,
|
||||
GString *string)
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static const GtkShortcutTriggerClass GTK_NEVER_TRIGGER_CLASS = {
|
||||
GTK_SHORTCUT_TRIGGER_NEVER,
|
||||
sizeof (GtkNeverTrigger),
|
||||
"GtkNeverTrigger",
|
||||
gtk_never_trigger_finalize,
|
||||
gtk_never_trigger_trigger,
|
||||
gtk_never_trigger_hash,
|
||||
gtk_never_trigger_compare,
|
||||
gtk_never_trigger_print,
|
||||
gtk_never_trigger_print_label
|
||||
};
|
||||
|
||||
static GtkNeverTrigger never = { { >K_NEVER_TRIGGER_CLASS, 1 } };
|
||||
|
||||
/**
|
||||
* gtk_never_trigger_get:
|
||||
*
|
||||
* Gets the never trigger. This is a singleton for a trigger that never triggers.
|
||||
* Use this trigger instead of %NULL because it implements all virtual functions.
|
||||
*
|
||||
* Returns: (transfer none): The never trigger
|
||||
*/
|
||||
GtkShortcutTrigger *
|
||||
gtk_never_trigger_get (void)
|
||||
{
|
||||
return &never.trigger;
|
||||
}
|
||||
|
||||
/*** GTK_KEYVAL_TRIGGER ***/
|
||||
|
||||
typedef struct _GtkKeyvalTrigger GtkKeyvalTrigger;
|
||||
|
||||
struct _GtkKeyvalTrigger
|
||||
{
|
||||
GtkShortcutTrigger trigger;
|
||||
|
||||
guint keyval;
|
||||
GdkModifierType modifiers;
|
||||
};
|
||||
|
||||
static void
|
||||
gtk_keyval_trigger_finalize (GtkShortcutTrigger *trigger)
|
||||
{
|
||||
}
|
||||
|
||||
static gboolean
|
||||
gtk_keyval_trigger_trigger (GtkShortcutTrigger *trigger,
|
||||
const GdkEvent *event,
|
||||
gboolean enable_mnemonics)
|
||||
{
|
||||
const GdkModifierType legacy_x11_modifiers = GDK_MOD2_MASK | GDK_MOD3_MASK | GDK_MOD4_MASK | GDK_MOD5_MASK;
|
||||
GtkKeyvalTrigger *self = (GtkKeyvalTrigger *) trigger;
|
||||
GdkModifierType modifiers;
|
||||
guint keyval;
|
||||
|
||||
if (gdk_event_get_event_type (event) != GDK_KEY_PRESS)
|
||||
return FALSE;
|
||||
|
||||
/* XXX: This needs to deal with groups */
|
||||
gdk_event_get_state (event, &modifiers);
|
||||
gdk_event_get_keyval (event, &keyval);
|
||||
|
||||
if (keyval == GDK_KEY_ISO_Left_Tab)
|
||||
keyval = GDK_KEY_Tab;
|
||||
else
|
||||
keyval = gdk_keyval_to_lower (keyval);
|
||||
|
||||
/* Filter legacy X11 modifiers and Caps lock out */
|
||||
modifiers &= ~(legacy_x11_modifiers | GDK_LOCK_MASK);
|
||||
|
||||
return keyval == self->keyval && modifiers == self->modifiers;
|
||||
}
|
||||
|
||||
static guint
|
||||
gtk_keyval_trigger_hash (GtkShortcutTrigger *trigger)
|
||||
{
|
||||
GtkKeyvalTrigger *self = (GtkKeyvalTrigger *) trigger;
|
||||
|
||||
return (self->modifiers << 24)
|
||||
| (self->modifiers >> 8)
|
||||
| (self->keyval << 16)
|
||||
| GTK_SHORTCUT_TRIGGER_KEYVAL;
|
||||
}
|
||||
|
||||
static int
|
||||
gtk_keyval_trigger_compare (GtkShortcutTrigger *trigger1,
|
||||
GtkShortcutTrigger *trigger2)
|
||||
{
|
||||
GtkKeyvalTrigger *self1 = (GtkKeyvalTrigger *) trigger1;
|
||||
GtkKeyvalTrigger *self2 = (GtkKeyvalTrigger *) trigger2;
|
||||
|
||||
if (self1->modifiers != self2->modifiers)
|
||||
return self2->modifiers - self1->modifiers;
|
||||
|
||||
return self1->keyval - self2->keyval;
|
||||
}
|
||||
|
||||
static void
|
||||
gtk_keyval_trigger_print (GtkShortcutTrigger *trigger,
|
||||
GString *string)
|
||||
|
||||
{
|
||||
GtkKeyvalTrigger *self = (GtkKeyvalTrigger *) trigger;
|
||||
char *accelerator_name;
|
||||
|
||||
accelerator_name = gtk_accelerator_name (self->keyval, self->modifiers);
|
||||
g_string_append (string, accelerator_name);
|
||||
g_free (accelerator_name);
|
||||
}
|
||||
|
||||
static gboolean
|
||||
gtk_keyval_trigger_print_label (GtkShortcutTrigger *trigger,
|
||||
GdkDisplay *display,
|
||||
GString *string)
|
||||
|
||||
{
|
||||
GtkKeyvalTrigger *self = (GtkKeyvalTrigger *) trigger;
|
||||
|
||||
gtk_accelerator_print_label (string, self->keyval, self->modifiers);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static const GtkShortcutTriggerClass GTK_KEYVAL_TRIGGER_CLASS = {
|
||||
GTK_SHORTCUT_TRIGGER_KEYVAL,
|
||||
sizeof (GtkKeyvalTrigger),
|
||||
"GtkKeyvalTrigger",
|
||||
gtk_keyval_trigger_finalize,
|
||||
gtk_keyval_trigger_trigger,
|
||||
gtk_keyval_trigger_hash,
|
||||
gtk_keyval_trigger_compare,
|
||||
gtk_keyval_trigger_print,
|
||||
gtk_keyval_trigger_print_label
|
||||
};
|
||||
|
||||
/**
|
||||
* gtk_keyval_trigger_new:
|
||||
* @keyval: The keyval to trigger for
|
||||
* @modifiers: the modifiers that need to be present
|
||||
*
|
||||
* Creates a #GtkShortcutTrigger that will trigger whenever the key with
|
||||
* the given @keyval and @modifiers is pressed.
|
||||
*
|
||||
* Returns: A new #GtkShortcutTrigger
|
||||
*/
|
||||
GtkShortcutTrigger *
|
||||
gtk_keyval_trigger_new (guint keyval,
|
||||
GdkModifierType modifiers)
|
||||
{
|
||||
GtkKeyvalTrigger *self;
|
||||
|
||||
self = (GtkKeyvalTrigger *) gtk_shortcut_trigger_new (>K_KEYVAL_TRIGGER_CLASS);
|
||||
|
||||
/* We store keyvals as lower key */
|
||||
if (keyval == GDK_KEY_ISO_Left_Tab)
|
||||
self->keyval = GDK_KEY_Tab;
|
||||
else
|
||||
self->keyval = gdk_keyval_to_lower (keyval);
|
||||
self->modifiers = modifiers;
|
||||
|
||||
return &self->trigger;
|
||||
}
|
||||
|
||||
/**
|
||||
* gtk_keyval_trigger_get_modifiers:
|
||||
* @trigger: a keyval #GtkShortcutTrigger
|
||||
*
|
||||
* Gets the modifiers that must be present to succeed triggering @self.
|
||||
*
|
||||
* Returns: the modifiers
|
||||
**/
|
||||
GdkModifierType
|
||||
gtk_keyval_trigger_get_modifiers (GtkShortcutTrigger *trigger)
|
||||
{
|
||||
GtkKeyvalTrigger *self = (GtkKeyvalTrigger *) trigger;
|
||||
|
||||
g_return_val_if_fail (GTK_IS_SHORTCUT_TRIGGER_TYPE (trigger, GTK_SHORTCUT_TRIGGER_KEYVAL), 0);
|
||||
|
||||
return self->modifiers;
|
||||
}
|
||||
|
||||
/**
|
||||
* gtk_keyval_trigger_get_keyval:
|
||||
* @trigger: a keyval #GtkShortcutTrigger
|
||||
*
|
||||
* Gets the keyval that must be pressed to succeed triggering @self.
|
||||
*
|
||||
* Returns: the keyval
|
||||
**/
|
||||
guint
|
||||
gtk_keyval_trigger_get_keyval (GtkShortcutTrigger *trigger)
|
||||
{
|
||||
GtkKeyvalTrigger *self = (GtkKeyvalTrigger *) trigger;
|
||||
|
||||
g_return_val_if_fail (GTK_IS_SHORTCUT_TRIGGER_TYPE (trigger, GTK_SHORTCUT_TRIGGER_KEYVAL), 0);
|
||||
|
||||
return self->keyval;
|
||||
}
|
||||
|
||||
/*** GTK_MNEMONIC_TRIGGER ***/
|
||||
|
||||
typedef struct _GtkMnemonicTrigger GtkMnemonicTrigger;
|
||||
|
||||
struct _GtkMnemonicTrigger
|
||||
{
|
||||
GtkShortcutTrigger trigger;
|
||||
|
||||
guint keyval;
|
||||
};
|
||||
|
||||
static void
|
||||
gtk_mnemonic_trigger_finalize (GtkShortcutTrigger *trigger)
|
||||
{
|
||||
}
|
||||
|
||||
static gboolean
|
||||
gtk_mnemonic_trigger_trigger (GtkShortcutTrigger *trigger,
|
||||
const GdkEvent *event,
|
||||
gboolean enable_mnemonics)
|
||||
{
|
||||
GtkMnemonicTrigger *self = (GtkMnemonicTrigger *) trigger;
|
||||
guint keyval;
|
||||
|
||||
if (!enable_mnemonics)
|
||||
return FALSE;
|
||||
|
||||
if (gdk_event_get_event_type (event) != GDK_KEY_PRESS)
|
||||
return FALSE;
|
||||
|
||||
/* XXX: This needs to deal with groups */
|
||||
gdk_event_get_keyval (event, &keyval);
|
||||
|
||||
if (keyval == GDK_KEY_ISO_Left_Tab)
|
||||
keyval = GDK_KEY_Tab;
|
||||
else
|
||||
keyval = gdk_keyval_to_lower (keyval);
|
||||
|
||||
return keyval == self->keyval;
|
||||
}
|
||||
|
||||
static guint
|
||||
gtk_mnemonic_trigger_hash (GtkShortcutTrigger *trigger)
|
||||
{
|
||||
GtkMnemonicTrigger *self = (GtkMnemonicTrigger *) trigger;
|
||||
|
||||
return (self->keyval << 8)
|
||||
| GTK_SHORTCUT_TRIGGER_MNEMONIC;
|
||||
}
|
||||
|
||||
static int
|
||||
gtk_mnemonic_trigger_compare (GtkShortcutTrigger *trigger1,
|
||||
GtkShortcutTrigger *trigger2)
|
||||
{
|
||||
GtkMnemonicTrigger *self1 = (GtkMnemonicTrigger *) trigger1;
|
||||
GtkMnemonicTrigger *self2 = (GtkMnemonicTrigger *) trigger2;
|
||||
|
||||
return self1->keyval - self2->keyval;
|
||||
}
|
||||
|
||||
static void
|
||||
gtk_mnemonic_trigger_print (GtkShortcutTrigger *trigger,
|
||||
GString *string)
|
||||
|
||||
{
|
||||
GtkMnemonicTrigger *self = (GtkMnemonicTrigger *) trigger;
|
||||
const char *keyval_str;
|
||||
|
||||
keyval_str = gdk_keyval_name (self->keyval);
|
||||
if (keyval_str == NULL)
|
||||
keyval_str = "???";
|
||||
|
||||
g_string_append (string, keyval_str);
|
||||
}
|
||||
|
||||
static gboolean
|
||||
gtk_mnemonic_trigger_print_label (GtkShortcutTrigger *trigger,
|
||||
GdkDisplay *display,
|
||||
GString *string)
|
||||
|
||||
{
|
||||
GtkMnemonicTrigger *self = (GtkMnemonicTrigger *) trigger;
|
||||
const char *keyval_str;
|
||||
|
||||
keyval_str = gdk_keyval_name (self->keyval);
|
||||
if (keyval_str == NULL)
|
||||
return FALSE;
|
||||
|
||||
g_string_append (string, keyval_str);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static const GtkShortcutTriggerClass GTK_MNEMONIC_TRIGGER_CLASS = {
|
||||
GTK_SHORTCUT_TRIGGER_MNEMONIC,
|
||||
sizeof (GtkMnemonicTrigger),
|
||||
"GtkMnemonicTrigger",
|
||||
gtk_mnemonic_trigger_finalize,
|
||||
gtk_mnemonic_trigger_trigger,
|
||||
gtk_mnemonic_trigger_hash,
|
||||
gtk_mnemonic_trigger_compare,
|
||||
gtk_mnemonic_trigger_print,
|
||||
gtk_mnemonic_trigger_print_label
|
||||
};
|
||||
|
||||
/**
|
||||
* gtk_mnemonic_trigger_new:
|
||||
* @keyval: The keyval to trigger for
|
||||
*
|
||||
* Creates a #GtkShortcutTrigger that will trigger whenever the key with
|
||||
* the given @keyval is pressed and mnemonics have been activated.
|
||||
*
|
||||
* Mnemonics are activated by calling code when a key event with the right
|
||||
* modifiers is detected.
|
||||
*
|
||||
* Returns: A new #GtkShortcutTrigger
|
||||
*/
|
||||
GtkShortcutTrigger *
|
||||
gtk_mnemonic_trigger_new (guint keyval)
|
||||
{
|
||||
GtkMnemonicTrigger *self;
|
||||
|
||||
self = (GtkMnemonicTrigger *) gtk_shortcut_trigger_new (>K_MNEMONIC_TRIGGER_CLASS);
|
||||
|
||||
/* We store keyvals as lower key */
|
||||
if (keyval == GDK_KEY_ISO_Left_Tab)
|
||||
self->keyval = GDK_KEY_Tab;
|
||||
else
|
||||
self->keyval = gdk_keyval_to_lower (keyval);
|
||||
|
||||
return &self->trigger;
|
||||
}
|
||||
|
||||
/**
|
||||
* gtk_mnemonic_trigger_get_keyval:
|
||||
* @trigger: a mnemonic #GtkShortcutTrigger
|
||||
*
|
||||
* Gets the keyval that must be pressed to succeed triggering @self.
|
||||
*
|
||||
* Returns: the keyval
|
||||
**/
|
||||
guint
|
||||
gtk_mnemonic_trigger_get_keyval (GtkShortcutTrigger *trigger)
|
||||
{
|
||||
GtkMnemonicTrigger *self = (GtkMnemonicTrigger *) trigger;
|
||||
|
||||
g_return_val_if_fail (GTK_IS_SHORTCUT_TRIGGER_TYPE (trigger, GTK_SHORTCUT_TRIGGER_MNEMONIC), 0);
|
||||
|
||||
return self->keyval;
|
||||
}
|
||||
|
||||
/*** GTK_ALTERNATIVE_TRIGGER ***/
|
||||
|
||||
typedef struct _GtkAlternativeTrigger GtkAlternativeTrigger;
|
||||
|
||||
struct _GtkAlternativeTrigger
|
||||
{
|
||||
GtkShortcutTrigger trigger;
|
||||
|
||||
GtkShortcutTrigger *first;
|
||||
GtkShortcutTrigger *second;
|
||||
};
|
||||
|
||||
static void
|
||||
gtk_alternative_trigger_finalize (GtkShortcutTrigger *trigger)
|
||||
{
|
||||
GtkAlternativeTrigger *self = (GtkAlternativeTrigger *) trigger;
|
||||
|
||||
gtk_shortcut_trigger_unref (self->first);
|
||||
gtk_shortcut_trigger_unref (self->second);
|
||||
}
|
||||
|
||||
static gboolean
|
||||
gtk_alternative_trigger_trigger (GtkShortcutTrigger *trigger,
|
||||
const GdkEvent *event,
|
||||
gboolean enable_mnemonics)
|
||||
{
|
||||
GtkAlternativeTrigger *self = (GtkAlternativeTrigger *) trigger;
|
||||
|
||||
if (gtk_shortcut_trigger_trigger (self->first, event, enable_mnemonics))
|
||||
return TRUE;
|
||||
|
||||
if (gtk_shortcut_trigger_trigger (self->second, event, enable_mnemonics))
|
||||
return TRUE;
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static guint
|
||||
gtk_alternative_trigger_hash (GtkShortcutTrigger *trigger)
|
||||
{
|
||||
GtkAlternativeTrigger *self = (GtkAlternativeTrigger *) trigger;
|
||||
guint result;
|
||||
|
||||
result = gtk_shortcut_trigger_hash (self->first);
|
||||
result <<= 5;
|
||||
|
||||
result |= gtk_shortcut_trigger_hash (self->second);
|
||||
result <<= 5;
|
||||
|
||||
return result | GTK_SHORTCUT_TRIGGER_ALTERNATIVE;
|
||||
}
|
||||
|
||||
static int
|
||||
gtk_alternative_trigger_compare (GtkShortcutTrigger *trigger1,
|
||||
GtkShortcutTrigger *trigger2)
|
||||
{
|
||||
GtkAlternativeTrigger *self1 = (GtkAlternativeTrigger *) trigger1;
|
||||
GtkAlternativeTrigger *self2 = (GtkAlternativeTrigger *) trigger2;
|
||||
int cmp;
|
||||
|
||||
cmp = gtk_shortcut_trigger_compare (self1->first, self2->first);
|
||||
if (cmp != 0)
|
||||
return cmp;
|
||||
|
||||
return gtk_shortcut_trigger_compare (self1->second, self2->second);
|
||||
}
|
||||
|
||||
static void
|
||||
gtk_alternative_trigger_print (GtkShortcutTrigger *trigger,
|
||||
GString *string)
|
||||
|
||||
{
|
||||
GtkAlternativeTrigger *self = (GtkAlternativeTrigger *) trigger;
|
||||
|
||||
gtk_shortcut_trigger_print (self->first, string);
|
||||
g_string_append (string, ", ");
|
||||
gtk_shortcut_trigger_print (self->second, string);
|
||||
}
|
||||
|
||||
static gboolean
|
||||
gtk_alternative_trigger_print_label (GtkShortcutTrigger *trigger,
|
||||
GdkDisplay *display,
|
||||
GString *string)
|
||||
|
||||
{
|
||||
GtkAlternativeTrigger *self = (GtkAlternativeTrigger *) trigger;
|
||||
|
||||
if (gtk_shortcut_trigger_print_label (self->first, display, string))
|
||||
{
|
||||
g_string_append (string, ", ");
|
||||
if (!gtk_shortcut_trigger_print_label (self->second, display, string))
|
||||
g_string_truncate (string, string->len - 2);
|
||||
return TRUE;
|
||||
}
|
||||
else
|
||||
{
|
||||
return gtk_shortcut_trigger_print_label (self->second, display, string);
|
||||
}
|
||||
}
|
||||
|
||||
static const GtkShortcutTriggerClass GTK_ALTERNATIVE_TRIGGER_CLASS = {
|
||||
GTK_SHORTCUT_TRIGGER_ALTERNATIVE,
|
||||
sizeof (GtkAlternativeTrigger),
|
||||
"GtkAlternativeTrigger",
|
||||
gtk_alternative_trigger_finalize,
|
||||
gtk_alternative_trigger_trigger,
|
||||
gtk_alternative_trigger_hash,
|
||||
gtk_alternative_trigger_compare,
|
||||
gtk_alternative_trigger_print,
|
||||
gtk_alternative_trigger_print_label
|
||||
};
|
||||
|
||||
/**
|
||||
* gtk_alternative_trigger_new:
|
||||
* @first: (transfer full): The first trigger that may trigger
|
||||
* @second: (transfer full): The second trigger that may trigger
|
||||
*
|
||||
* Creates a #GtkShortcutTrigger that will trigger whenever either of the 2 given
|
||||
* triggers gets triggered.
|
||||
*
|
||||
* Note that nesting is allowed, so if you want more than two alternative, create
|
||||
* a new alternative trigger for each option.
|
||||
*
|
||||
* Returns: A new #GtkShortcutTrigger
|
||||
*/
|
||||
GtkShortcutTrigger *
|
||||
gtk_alternative_trigger_new (GtkShortcutTrigger *first,
|
||||
GtkShortcutTrigger *second)
|
||||
{
|
||||
GtkAlternativeTrigger *self;
|
||||
|
||||
g_return_val_if_fail (GTK_IS_SHORTCUT_TRIGGER (first), NULL);
|
||||
g_return_val_if_fail (GTK_IS_SHORTCUT_TRIGGER (second), NULL);
|
||||
|
||||
self = (GtkAlternativeTrigger *) gtk_shortcut_trigger_new (>K_ALTERNATIVE_TRIGGER_CLASS);
|
||||
|
||||
self->first = first;
|
||||
self->second = second;
|
||||
|
||||
return &self->trigger;
|
||||
}
|
||||
|
||||
/**
|
||||
* gtk_alternative_trigger_get_first:
|
||||
* @self: an alternative #GtkShortcutTrigger
|
||||
*
|
||||
* Gets the first of the 2 alternative triggers that may trigger @self.
|
||||
* gtk_alternative_trigger_get_second() will return the other one.
|
||||
*
|
||||
* Returns: (transfer none): the first alternative trigger
|
||||
**/
|
||||
GtkShortcutTrigger *
|
||||
gtk_alternative_trigger_get_first (GtkShortcutTrigger *trigger)
|
||||
{
|
||||
GtkAlternativeTrigger *self = (GtkAlternativeTrigger *) trigger;
|
||||
|
||||
g_return_val_if_fail (GTK_IS_SHORTCUT_TRIGGER_TYPE (trigger, GTK_SHORTCUT_TRIGGER_ALTERNATIVE), 0);
|
||||
|
||||
return self->first;
|
||||
}
|
||||
|
||||
/**
|
||||
* gtk_alternative_trigger_get_second:
|
||||
* @self: an alternative #GtkShortcutTrigger
|
||||
*
|
||||
* Gets the second of the 2 alternative triggers that may trigger @self.
|
||||
* gtk_alternative_trigger_get_first() will return the other one.
|
||||
*
|
||||
* Returns: (transfer none): the second alternative trigger
|
||||
**/
|
||||
GtkShortcutTrigger *
|
||||
gtk_alternative_trigger_get_second (GtkShortcutTrigger *trigger)
|
||||
{
|
||||
GtkAlternativeTrigger *self = (GtkAlternativeTrigger *) trigger;
|
||||
|
||||
g_return_val_if_fail (GTK_IS_SHORTCUT_TRIGGER_TYPE (trigger, GTK_SHORTCUT_TRIGGER_ALTERNATIVE), 0);
|
||||
|
||||
return self->second;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,121 @@
|
||||
/*
|
||||
* 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_TRIGGER_H__
|
||||
#define __GTK_SHORTCUT_TRIGGER_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_TRIGGER (gtk_shortcut_trigger_get_type ())
|
||||
|
||||
#define GTK_IS_SHORTCUT_TRIGGER(obj) ((obj) != NULL)
|
||||
|
||||
/**
|
||||
* GtkShortcutTriggerType:
|
||||
* @GTK_SHORTCUT_TRIGGER_NEVER: Never ever trigger
|
||||
* @GTK_SHORTCUT_TRIGGER_KEYVAL: Trigger if a key event with matching
|
||||
* modifiers and keyval is received.
|
||||
* @GTK_SHORTCUT_TRIGGER_MNEMONIC: Trigger if a key event with matching
|
||||
* keyval is received and mnemonics are enabled for this event.
|
||||
* @GTK_SHORTCUT_TRIGGER_ALTERNAITVE: Trigger if either if two
|
||||
* alternatives triggers
|
||||
*
|
||||
* The type of a trigger determines what the trigger triggers on.
|
||||
**/
|
||||
typedef enum {
|
||||
GTK_SHORTCUT_TRIGGER_NEVER,
|
||||
GTK_SHORTCUT_TRIGGER_KEYVAL,
|
||||
GTK_SHORTCUT_TRIGGER_MNEMONIC,
|
||||
GTK_SHORTCUT_TRIGGER_ALTERNATIVE
|
||||
} GtkShortcutTriggerType;
|
||||
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
GType gtk_shortcut_trigger_get_type (void) G_GNUC_CONST;
|
||||
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
GtkShortcutTrigger * gtk_shortcut_trigger_ref (GtkShortcutTrigger *self);
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
void gtk_shortcut_trigger_unref (GtkShortcutTrigger *self);
|
||||
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
GtkShortcutTriggerType gtk_shortcut_trigger_get_trigger_type (GtkShortcutTrigger *self);
|
||||
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
GtkShortcutTrigger * gtk_shortcut_trigger_parse_string (const char *string);
|
||||
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
char * gtk_shortcut_trigger_to_string (GtkShortcutTrigger *self);
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
void gtk_shortcut_trigger_print (GtkShortcutTrigger *self,
|
||||
GString *string);
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
char * gtk_shortcut_trigger_to_label (GtkShortcutTrigger *self,
|
||||
GdkDisplay *display);
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
gboolean gtk_shortcut_trigger_print_label (GtkShortcutTrigger *self,
|
||||
GdkDisplay *display,
|
||||
GString *string);
|
||||
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
guint gtk_shortcut_trigger_hash (gconstpointer trigger);
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
gboolean gtk_shortcut_trigger_equal (gconstpointer trigger1,
|
||||
gconstpointer trigger2);
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
gint gtk_shortcut_trigger_compare (gconstpointer trigger1,
|
||||
gconstpointer trigger2);
|
||||
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
gboolean gtk_shortcut_trigger_trigger (GtkShortcutTrigger *self,
|
||||
const GdkEvent *event,
|
||||
gboolean enable_mnemonics);
|
||||
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
GtkShortcutTrigger * gtk_never_trigger_get (void);
|
||||
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
GtkShortcutTrigger * gtk_keyval_trigger_new (guint keyval,
|
||||
GdkModifierType modifiers);
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
GdkModifierType gtk_keyval_trigger_get_modifiers (GtkShortcutTrigger *self);
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
guint gtk_keyval_trigger_get_keyval (GtkShortcutTrigger *self);
|
||||
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
GtkShortcutTrigger * gtk_mnemonic_trigger_new (guint keyval);
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
guint gtk_mnemonic_trigger_get_keyval (GtkShortcutTrigger *self);
|
||||
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
GtkShortcutTrigger * gtk_alternative_trigger_new (GtkShortcutTrigger *one,
|
||||
GtkShortcutTrigger *two);
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
GtkShortcutTrigger * gtk_alternative_trigger_get_first (GtkShortcutTrigger *trigger);
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
GtkShortcutTrigger * gtk_alternative_trigger_get_second (GtkShortcutTrigger *trigger);
|
||||
|
||||
G_END_DECLS
|
||||
|
||||
#endif /* __GTK_SHORTCUT_TRIGGER_H__ */
|
||||
+14
-18
@@ -30,7 +30,6 @@
|
||||
#include "gtkspinbutton.h"
|
||||
|
||||
#include "gtkadjustment.h"
|
||||
#include "gtkbindings.h"
|
||||
#include "gtkbox.h"
|
||||
#include "gtkbutton.h"
|
||||
#include "gtkcssstylepropertyprivate.h"
|
||||
@@ -299,10 +298,10 @@ G_DEFINE_TYPE_WITH_CODE (GtkSpinButton, gtk_spin_button, GTK_TYPE_WIDGET,
|
||||
G_IMPLEMENT_INTERFACE (GTK_TYPE_EDITABLE,
|
||||
gtk_spin_button_editable_init))
|
||||
|
||||
#define add_spin_binding(binding_set, keyval, mask, scroll) \
|
||||
gtk_binding_entry_add_signal (binding_set, keyval, mask, \
|
||||
"change-value", 1, \
|
||||
GTK_TYPE_SCROLL_TYPE, scroll)
|
||||
#define add_spin_binding(widget_class, keyval, mask, scroll) \
|
||||
gtk_widget_class_add_binding_signal (widget_class, keyval, mask, \
|
||||
"change-value", \
|
||||
"(i)", scroll)
|
||||
|
||||
|
||||
static void
|
||||
@@ -331,7 +330,6 @@ gtk_spin_button_class_init (GtkSpinButtonClass *class)
|
||||
{
|
||||
GObjectClass *gobject_class = G_OBJECT_CLASS (class);
|
||||
GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (class);
|
||||
GtkBindingSet *binding_set;
|
||||
|
||||
gobject_class->finalize = gtk_spin_button_finalize;
|
||||
gobject_class->set_property = gtk_spin_button_set_property;
|
||||
@@ -530,18 +528,16 @@ gtk_spin_button_class_init (GtkSpinButtonClass *class)
|
||||
G_TYPE_NONE, 1,
|
||||
GTK_TYPE_SCROLL_TYPE);
|
||||
|
||||
binding_set = gtk_binding_set_by_class (class);
|
||||
|
||||
add_spin_binding (binding_set, GDK_KEY_Up, 0, GTK_SCROLL_STEP_UP);
|
||||
add_spin_binding (binding_set, GDK_KEY_KP_Up, 0, GTK_SCROLL_STEP_UP);
|
||||
add_spin_binding (binding_set, GDK_KEY_Down, 0, GTK_SCROLL_STEP_DOWN);
|
||||
add_spin_binding (binding_set, GDK_KEY_KP_Down, 0, GTK_SCROLL_STEP_DOWN);
|
||||
add_spin_binding (binding_set, GDK_KEY_Page_Up, 0, GTK_SCROLL_PAGE_UP);
|
||||
add_spin_binding (binding_set, GDK_KEY_Page_Down, 0, GTK_SCROLL_PAGE_DOWN);
|
||||
add_spin_binding (binding_set, GDK_KEY_End, GDK_CONTROL_MASK, GTK_SCROLL_END);
|
||||
add_spin_binding (binding_set, GDK_KEY_Home, GDK_CONTROL_MASK, GTK_SCROLL_START);
|
||||
add_spin_binding (binding_set, GDK_KEY_Page_Up, GDK_CONTROL_MASK, GTK_SCROLL_END);
|
||||
add_spin_binding (binding_set, GDK_KEY_Page_Down, GDK_CONTROL_MASK, GTK_SCROLL_START);
|
||||
add_spin_binding (widget_class, GDK_KEY_Up, 0, GTK_SCROLL_STEP_UP);
|
||||
add_spin_binding (widget_class, GDK_KEY_KP_Up, 0, GTK_SCROLL_STEP_UP);
|
||||
add_spin_binding (widget_class, GDK_KEY_Down, 0, GTK_SCROLL_STEP_DOWN);
|
||||
add_spin_binding (widget_class, GDK_KEY_KP_Down, 0, GTK_SCROLL_STEP_DOWN);
|
||||
add_spin_binding (widget_class, GDK_KEY_Page_Up, 0, GTK_SCROLL_PAGE_UP);
|
||||
add_spin_binding (widget_class, GDK_KEY_Page_Down, 0, GTK_SCROLL_PAGE_DOWN);
|
||||
add_spin_binding (widget_class, GDK_KEY_End, GDK_CONTROL_MASK, GTK_SCROLL_END);
|
||||
add_spin_binding (widget_class, GDK_KEY_Home, GDK_CONTROL_MASK, GTK_SCROLL_START);
|
||||
add_spin_binding (widget_class, GDK_KEY_Page_Up, GDK_CONTROL_MASK, GTK_SCROLL_END);
|
||||
add_spin_binding (widget_class, GDK_KEY_Page_Down, GDK_CONTROL_MASK, GTK_SCROLL_START);
|
||||
|
||||
gtk_widget_class_set_accessible_type (widget_class, GTK_TYPE_SPIN_BUTTON_ACCESSIBLE);
|
||||
gtk_widget_class_set_css_name (widget_class, I_("spinbutton"));
|
||||
|
||||
+135
-123
@@ -24,7 +24,6 @@
|
||||
#include "gtktextprivate.h"
|
||||
|
||||
#include "gtkadjustment.h"
|
||||
#include "gtkbindings.h"
|
||||
#include "gtkbox.h"
|
||||
#include "gtkbutton.h"
|
||||
#include "gtkcssnodeprivate.h"
|
||||
@@ -629,26 +628,23 @@ G_DEFINE_TYPE_WITH_CODE (GtkText, gtk_text, GTK_TYPE_WIDGET,
|
||||
G_IMPLEMENT_INTERFACE (GTK_TYPE_EDITABLE, gtk_text_editable_init))
|
||||
|
||||
static void
|
||||
add_move_binding (GtkBindingSet *binding_set,
|
||||
add_move_binding (GtkWidgetClass *widget_class,
|
||||
guint keyval,
|
||||
guint modmask,
|
||||
GtkMovementStep step,
|
||||
int count)
|
||||
{
|
||||
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_add_binding_signal (widget_class,
|
||||
keyval, modmask,
|
||||
"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_add_binding_signal (widget_class,
|
||||
keyval, modmask | GDK_SHIFT_MASK,
|
||||
"move-cursor",
|
||||
"(iib)", step, count, TRUE);
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -656,7 +652,6 @@ gtk_text_class_init (GtkTextClass *class)
|
||||
{
|
||||
GObjectClass *gobject_class = G_OBJECT_CLASS (class);
|
||||
GtkWidgetClass *widget_class;
|
||||
GtkBindingSet *binding_set;
|
||||
|
||||
widget_class = (GtkWidgetClass*) class;
|
||||
|
||||
@@ -1185,174 +1180,191 @@ gtk_text_class_init (GtkTextClass *class)
|
||||
* Key bindings
|
||||
*/
|
||||
|
||||
binding_set = gtk_binding_set_by_class (class);
|
||||
|
||||
/* Moving the insertion point */
|
||||
add_move_binding (binding_set, GDK_KEY_Right, 0,
|
||||
add_move_binding (widget_class, GDK_KEY_Right, 0,
|
||||
GTK_MOVEMENT_VISUAL_POSITIONS, 1);
|
||||
|
||||
add_move_binding (binding_set, GDK_KEY_Left, 0,
|
||||
add_move_binding (widget_class, GDK_KEY_Left, 0,
|
||||
GTK_MOVEMENT_VISUAL_POSITIONS, -1);
|
||||
|
||||
add_move_binding (binding_set, GDK_KEY_KP_Right, 0,
|
||||
add_move_binding (widget_class, GDK_KEY_KP_Right, 0,
|
||||
GTK_MOVEMENT_VISUAL_POSITIONS, 1);
|
||||
|
||||
add_move_binding (binding_set, GDK_KEY_KP_Left, 0,
|
||||
add_move_binding (widget_class, GDK_KEY_KP_Left, 0,
|
||||
GTK_MOVEMENT_VISUAL_POSITIONS, -1);
|
||||
|
||||
add_move_binding (binding_set, GDK_KEY_Right, GDK_CONTROL_MASK,
|
||||
add_move_binding (widget_class, GDK_KEY_Right, GDK_CONTROL_MASK,
|
||||
GTK_MOVEMENT_WORDS, 1);
|
||||
|
||||
add_move_binding (binding_set, GDK_KEY_Left, GDK_CONTROL_MASK,
|
||||
add_move_binding (widget_class, GDK_KEY_Left, GDK_CONTROL_MASK,
|
||||
GTK_MOVEMENT_WORDS, -1);
|
||||
|
||||
add_move_binding (binding_set, GDK_KEY_KP_Right, GDK_CONTROL_MASK,
|
||||
add_move_binding (widget_class, GDK_KEY_KP_Right, GDK_CONTROL_MASK,
|
||||
GTK_MOVEMENT_WORDS, 1);
|
||||
|
||||
add_move_binding (binding_set, GDK_KEY_KP_Left, GDK_CONTROL_MASK,
|
||||
add_move_binding (widget_class, GDK_KEY_KP_Left, GDK_CONTROL_MASK,
|
||||
GTK_MOVEMENT_WORDS, -1);
|
||||
|
||||
add_move_binding (binding_set, GDK_KEY_Home, 0,
|
||||
add_move_binding (widget_class, GDK_KEY_Home, 0,
|
||||
GTK_MOVEMENT_DISPLAY_LINE_ENDS, -1);
|
||||
|
||||
add_move_binding (binding_set, GDK_KEY_End, 0,
|
||||
add_move_binding (widget_class, GDK_KEY_End, 0,
|
||||
GTK_MOVEMENT_DISPLAY_LINE_ENDS, 1);
|
||||
|
||||
add_move_binding (binding_set, GDK_KEY_KP_Home, 0,
|
||||
add_move_binding (widget_class, GDK_KEY_KP_Home, 0,
|
||||
GTK_MOVEMENT_DISPLAY_LINE_ENDS, -1);
|
||||
|
||||
add_move_binding (binding_set, GDK_KEY_KP_End, 0,
|
||||
add_move_binding (widget_class, GDK_KEY_KP_End, 0,
|
||||
GTK_MOVEMENT_DISPLAY_LINE_ENDS, 1);
|
||||
|
||||
add_move_binding (binding_set, GDK_KEY_Home, GDK_CONTROL_MASK,
|
||||
add_move_binding (widget_class, GDK_KEY_Home, GDK_CONTROL_MASK,
|
||||
GTK_MOVEMENT_BUFFER_ENDS, -1);
|
||||
|
||||
add_move_binding (binding_set, GDK_KEY_End, GDK_CONTROL_MASK,
|
||||
add_move_binding (widget_class, GDK_KEY_End, GDK_CONTROL_MASK,
|
||||
GTK_MOVEMENT_BUFFER_ENDS, 1);
|
||||
|
||||
add_move_binding (binding_set, GDK_KEY_KP_Home, GDK_CONTROL_MASK,
|
||||
add_move_binding (widget_class, GDK_KEY_KP_Home, GDK_CONTROL_MASK,
|
||||
GTK_MOVEMENT_BUFFER_ENDS, -1);
|
||||
|
||||
add_move_binding (binding_set, GDK_KEY_KP_End, GDK_CONTROL_MASK,
|
||||
add_move_binding (widget_class, GDK_KEY_KP_End, GDK_CONTROL_MASK,
|
||||
GTK_MOVEMENT_BUFFER_ENDS, 1);
|
||||
|
||||
/* Select all
|
||||
*/
|
||||
gtk_binding_entry_add_signal (binding_set, GDK_KEY_a, GDK_CONTROL_MASK,
|
||||
"move-cursor", 3,
|
||||
GTK_TYPE_MOVEMENT_STEP, GTK_MOVEMENT_BUFFER_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,
|
||||
GTK_TYPE_MOVEMENT_STEP, GTK_MOVEMENT_BUFFER_ENDS,
|
||||
G_TYPE_INT, 1,
|
||||
G_TYPE_BOOLEAN, TRUE);
|
||||
gtk_widget_class_add_binding (widget_class,
|
||||
GDK_KEY_a, GDK_CONTROL_MASK,
|
||||
(GtkShortcutFunc) gtk_text_select_all,
|
||||
NULL);
|
||||
|
||||
gtk_widget_class_add_binding (widget_class,
|
||||
GDK_KEY_slash, GDK_CONTROL_MASK,
|
||||
(GtkShortcutFunc) gtk_text_select_all,
|
||||
NULL);
|
||||
|
||||
gtk_binding_entry_add_signal (binding_set, GDK_KEY_slash, GDK_CONTROL_MASK,
|
||||
"move-cursor", 3,
|
||||
GTK_TYPE_MOVEMENT_STEP, GTK_MOVEMENT_BUFFER_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,
|
||||
GTK_TYPE_MOVEMENT_STEP, GTK_MOVEMENT_BUFFER_ENDS,
|
||||
G_TYPE_INT, 1,
|
||||
G_TYPE_BOOLEAN, TRUE);
|
||||
/* Unselect all
|
||||
*/
|
||||
gtk_binding_entry_add_signal (binding_set, GDK_KEY_backslash, GDK_CONTROL_MASK,
|
||||
"move-cursor", 3,
|
||||
GTK_TYPE_MOVEMENT_STEP, GTK_MOVEMENT_VISUAL_POSITIONS,
|
||||
G_TYPE_INT, 0,
|
||||
G_TYPE_BOOLEAN, FALSE);
|
||||
gtk_binding_entry_add_signal (binding_set, GDK_KEY_a, GDK_SHIFT_MASK | GDK_CONTROL_MASK,
|
||||
"move-cursor", 3,
|
||||
GTK_TYPE_MOVEMENT_STEP, GTK_MOVEMENT_VISUAL_POSITIONS,
|
||||
G_TYPE_INT, 0,
|
||||
G_TYPE_BOOLEAN, FALSE);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_backslash, GDK_CONTROL_MASK,
|
||||
"move-cursor",
|
||||
"(iib)", GTK_MOVEMENT_VISUAL_POSITIONS, 0, FALSE);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_a, GDK_SHIFT_MASK | GDK_CONTROL_MASK,
|
||||
"move-cursor",
|
||||
"(iib)", GTK_MOVEMENT_VISUAL_POSITIONS, 0, FALSE);
|
||||
|
||||
/* Activate
|
||||
*/
|
||||
gtk_binding_entry_add_signal (binding_set, GDK_KEY_Return, 0,
|
||||
"activate", 0);
|
||||
gtk_binding_entry_add_signal (binding_set, GDK_KEY_ISO_Enter, 0,
|
||||
"activate", 0);
|
||||
gtk_binding_entry_add_signal (binding_set, GDK_KEY_KP_Enter, 0,
|
||||
"activate", 0);
|
||||
gtk_widget_class_add_binding_signal (widget_class, GDK_KEY_Return, 0,
|
||||
"activate",
|
||||
NULL);
|
||||
gtk_widget_class_add_binding_signal (widget_class, GDK_KEY_ISO_Enter, 0,
|
||||
"activate",
|
||||
NULL);
|
||||
gtk_widget_class_add_binding_signal (widget_class, GDK_KEY_KP_Enter, 0,
|
||||
"activate",
|
||||
NULL);
|
||||
|
||||
/* Deleting text */
|
||||
gtk_binding_entry_add_signal (binding_set, GDK_KEY_Delete, 0,
|
||||
"delete-from-cursor", 2,
|
||||
G_TYPE_ENUM, GTK_DELETE_CHARS,
|
||||
G_TYPE_INT, 1);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_Delete, 0,
|
||||
"delete-from-cursor",
|
||||
"(ii)", GTK_DELETE_CHARS, 1);
|
||||
|
||||
gtk_binding_entry_add_signal (binding_set, GDK_KEY_KP_Delete, 0,
|
||||
"delete-from-cursor", 2,
|
||||
G_TYPE_ENUM, GTK_DELETE_CHARS,
|
||||
G_TYPE_INT, 1);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_KP_Delete, 0,
|
||||
"delete-from-cursor",
|
||||
"(ii)", GTK_DELETE_CHARS, 1);
|
||||
|
||||
gtk_binding_entry_add_signal (binding_set, GDK_KEY_BackSpace, 0,
|
||||
"backspace", 0);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_BackSpace, 0,
|
||||
"backspace",
|
||||
NULL);
|
||||
|
||||
gtk_binding_entry_add_signal (binding_set, GDK_KEY_u, GDK_CONTROL_MASK,
|
||||
"delete-from-cursor", 2,
|
||||
G_TYPE_ENUM, GTK_DELETE_PARAGRAPH_ENDS,
|
||||
G_TYPE_INT, -1);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_u, GDK_CONTROL_MASK,
|
||||
"delete-from-cursor",
|
||||
"(ii)", GTK_DELETE_PARAGRAPH_ENDS, -1);
|
||||
|
||||
/* Make this do the same as Backspace, to help with mis-typing */
|
||||
gtk_binding_entry_add_signal (binding_set, GDK_KEY_BackSpace, GDK_SHIFT_MASK,
|
||||
"backspace", 0);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_BackSpace, GDK_SHIFT_MASK,
|
||||
"backspace",
|
||||
NULL);
|
||||
|
||||
gtk_binding_entry_add_signal (binding_set, GDK_KEY_Delete, GDK_CONTROL_MASK,
|
||||
"delete-from-cursor", 2,
|
||||
G_TYPE_ENUM, GTK_DELETE_WORD_ENDS,
|
||||
G_TYPE_INT, 1);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_Delete, GDK_CONTROL_MASK,
|
||||
"delete-from-cursor",
|
||||
"(ii)", GTK_DELETE_WORD_ENDS, 1);
|
||||
|
||||
gtk_binding_entry_add_signal (binding_set, GDK_KEY_KP_Delete, GDK_CONTROL_MASK,
|
||||
"delete-from-cursor", 2,
|
||||
G_TYPE_ENUM, GTK_DELETE_WORD_ENDS,
|
||||
G_TYPE_INT, 1);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_KP_Delete, GDK_CONTROL_MASK,
|
||||
"delete-from-cursor",
|
||||
"(ii)", GTK_DELETE_WORD_ENDS, 1);
|
||||
|
||||
gtk_binding_entry_add_signal (binding_set, GDK_KEY_BackSpace, GDK_CONTROL_MASK,
|
||||
"delete-from-cursor", 2,
|
||||
G_TYPE_ENUM, GTK_DELETE_WORD_ENDS,
|
||||
G_TYPE_INT, -1);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_BackSpace, GDK_CONTROL_MASK,
|
||||
"delete-from-cursor",
|
||||
"(ii)", GTK_DELETE_WORD_ENDS, -1);
|
||||
|
||||
/* Cut/copy/paste */
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_x, GDK_CONTROL_MASK,
|
||||
"cut-clipboard",
|
||||
NULL);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_c, GDK_CONTROL_MASK,
|
||||
"copy-clipboard",
|
||||
NULL);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_v, GDK_CONTROL_MASK,
|
||||
"paste-clipboard",
|
||||
NULL);
|
||||
|
||||
gtk_binding_entry_add_signal (binding_set, GDK_KEY_x, GDK_CONTROL_MASK,
|
||||
"cut-clipboard", 0);
|
||||
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_v, GDK_CONTROL_MASK,
|
||||
"paste-clipboard", 0);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_Delete, GDK_SHIFT_MASK,
|
||||
"cut-clipboard",
|
||||
NULL);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_Insert, GDK_CONTROL_MASK,
|
||||
"copy-clipboard",
|
||||
NULL);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_Insert, GDK_SHIFT_MASK,
|
||||
"paste-clipboard",
|
||||
NULL);
|
||||
|
||||
gtk_binding_entry_add_signal (binding_set, GDK_KEY_Delete, GDK_SHIFT_MASK,
|
||||
"cut-clipboard", 0);
|
||||
gtk_binding_entry_add_signal (binding_set, GDK_KEY_Insert, GDK_CONTROL_MASK,
|
||||
"copy-clipboard", 0);
|
||||
gtk_binding_entry_add_signal (binding_set, GDK_KEY_Insert, GDK_SHIFT_MASK,
|
||||
"paste-clipboard", 0);
|
||||
|
||||
gtk_binding_entry_add_signal (binding_set, GDK_KEY_KP_Delete, GDK_SHIFT_MASK,
|
||||
"cut-clipboard", 0);
|
||||
gtk_binding_entry_add_signal (binding_set, GDK_KEY_KP_Insert, GDK_CONTROL_MASK,
|
||||
"copy-clipboard", 0);
|
||||
gtk_binding_entry_add_signal (binding_set, GDK_KEY_KP_Insert, GDK_SHIFT_MASK,
|
||||
"paste-clipboard", 0);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_KP_Delete, GDK_SHIFT_MASK,
|
||||
"cut-clipboard",
|
||||
NULL);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_KP_Insert, GDK_CONTROL_MASK,
|
||||
"copy-clipboard",
|
||||
NULL);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_KP_Insert, GDK_SHIFT_MASK,
|
||||
"paste-clipboard",
|
||||
NULL);
|
||||
|
||||
/* Overwrite */
|
||||
gtk_binding_entry_add_signal (binding_set, GDK_KEY_Insert, 0,
|
||||
"toggle-overwrite", 0);
|
||||
gtk_binding_entry_add_signal (binding_set, GDK_KEY_KP_Insert, 0,
|
||||
"toggle-overwrite", 0);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_Insert, 0,
|
||||
"toggle-overwrite",
|
||||
NULL);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_KP_Insert, 0,
|
||||
"toggle-overwrite",
|
||||
NULL);
|
||||
|
||||
/* Emoji */
|
||||
gtk_binding_entry_add_signal (binding_set, GDK_KEY_period, GDK_CONTROL_MASK,
|
||||
"insert-emoji", 0);
|
||||
gtk_binding_entry_add_signal (binding_set, GDK_KEY_semicolon, GDK_CONTROL_MASK,
|
||||
"insert-emoji", 0);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_period, GDK_CONTROL_MASK,
|
||||
"insert-emoji",
|
||||
NULL);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_semicolon, GDK_CONTROL_MASK,
|
||||
"insert-emoji",
|
||||
NULL);
|
||||
|
||||
gtk_widget_class_set_accessible_type (widget_class, GTK_TYPE_TEXT_ACCESSIBLE);
|
||||
gtk_widget_class_set_css_name (widget_class, I_("text"));
|
||||
|
||||
+169
-135
@@ -30,7 +30,6 @@
|
||||
#include <string.h>
|
||||
|
||||
#include "gtkadjustmentprivate.h"
|
||||
#include "gtkbindings.h"
|
||||
#include "gtkdnd.h"
|
||||
#include "gtkdebug.h"
|
||||
#include "gtkintl.h"
|
||||
@@ -650,7 +649,7 @@ G_DEFINE_TYPE_WITH_CODE (GtkTextView, gtk_text_view, GTK_TYPE_CONTAINER,
|
||||
G_IMPLEMENT_INTERFACE (GTK_TYPE_SCROLLABLE, NULL))
|
||||
|
||||
static void
|
||||
add_move_binding (GtkBindingSet *binding_set,
|
||||
add_move_binding (GtkWidgetClass *widget_class,
|
||||
guint keyval,
|
||||
guint modmask,
|
||||
GtkMovementStep step,
|
||||
@@ -658,18 +657,16 @@ add_move_binding (GtkBindingSet *binding_set,
|
||||
{
|
||||
g_assert ((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_add_binding_signal (widget_class,
|
||||
keyval, modmask,
|
||||
"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_add_binding_signal (widget_class,
|
||||
keyval, modmask | GDK_SHIFT_MASK,
|
||||
"move-cursor",
|
||||
"(iib)", step, count, TRUE);
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -678,7 +675,6 @@ gtk_text_view_class_init (GtkTextViewClass *klass)
|
||||
GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
|
||||
GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass);
|
||||
GtkContainerClass *container_class = GTK_CONTAINER_CLASS (klass);
|
||||
GtkBindingSet *binding_set;
|
||||
|
||||
/* Default handlers and virtual methods
|
||||
*/
|
||||
@@ -1378,224 +1374,262 @@ gtk_text_view_class_init (GtkTextViewClass *klass)
|
||||
* Key bindings
|
||||
*/
|
||||
|
||||
binding_set = gtk_binding_set_by_class (klass);
|
||||
|
||||
/* Moving the insertion point */
|
||||
add_move_binding (binding_set, GDK_KEY_Right, 0,
|
||||
add_move_binding (widget_class, GDK_KEY_Right, 0,
|
||||
GTK_MOVEMENT_VISUAL_POSITIONS, 1);
|
||||
|
||||
add_move_binding (binding_set, GDK_KEY_KP_Right, 0,
|
||||
add_move_binding (widget_class, GDK_KEY_KP_Right, 0,
|
||||
GTK_MOVEMENT_VISUAL_POSITIONS, 1);
|
||||
|
||||
add_move_binding (binding_set, GDK_KEY_Left, 0,
|
||||
add_move_binding (widget_class, GDK_KEY_Left, 0,
|
||||
GTK_MOVEMENT_VISUAL_POSITIONS, -1);
|
||||
|
||||
add_move_binding (binding_set, GDK_KEY_KP_Left, 0,
|
||||
add_move_binding (widget_class, GDK_KEY_KP_Left, 0,
|
||||
GTK_MOVEMENT_VISUAL_POSITIONS, -1);
|
||||
|
||||
add_move_binding (binding_set, GDK_KEY_Right, GDK_CONTROL_MASK,
|
||||
add_move_binding (widget_class, GDK_KEY_Right, GDK_CONTROL_MASK,
|
||||
GTK_MOVEMENT_WORDS, 1);
|
||||
|
||||
add_move_binding (binding_set, GDK_KEY_KP_Right, GDK_CONTROL_MASK,
|
||||
add_move_binding (widget_class, GDK_KEY_KP_Right, GDK_CONTROL_MASK,
|
||||
GTK_MOVEMENT_WORDS, 1);
|
||||
|
||||
add_move_binding (binding_set, GDK_KEY_Left, GDK_CONTROL_MASK,
|
||||
add_move_binding (widget_class, GDK_KEY_Left, GDK_CONTROL_MASK,
|
||||
GTK_MOVEMENT_WORDS, -1);
|
||||
|
||||
add_move_binding (binding_set, GDK_KEY_KP_Left, GDK_CONTROL_MASK,
|
||||
add_move_binding (widget_class, GDK_KEY_KP_Left, GDK_CONTROL_MASK,
|
||||
GTK_MOVEMENT_WORDS, -1);
|
||||
|
||||
add_move_binding (binding_set, GDK_KEY_Up, 0,
|
||||
add_move_binding (widget_class, GDK_KEY_Up, 0,
|
||||
GTK_MOVEMENT_DISPLAY_LINES, -1);
|
||||
|
||||
add_move_binding (binding_set, GDK_KEY_KP_Up, 0,
|
||||
add_move_binding (widget_class, GDK_KEY_KP_Up, 0,
|
||||
GTK_MOVEMENT_DISPLAY_LINES, -1);
|
||||
|
||||
add_move_binding (binding_set, GDK_KEY_Down, 0,
|
||||
add_move_binding (widget_class, GDK_KEY_Down, 0,
|
||||
GTK_MOVEMENT_DISPLAY_LINES, 1);
|
||||
|
||||
add_move_binding (binding_set, GDK_KEY_KP_Down, 0,
|
||||
add_move_binding (widget_class, GDK_KEY_KP_Down, 0,
|
||||
GTK_MOVEMENT_DISPLAY_LINES, 1);
|
||||
|
||||
add_move_binding (binding_set, GDK_KEY_Up, GDK_CONTROL_MASK,
|
||||
add_move_binding (widget_class, GDK_KEY_Up, GDK_CONTROL_MASK,
|
||||
GTK_MOVEMENT_PARAGRAPHS, -1);
|
||||
|
||||
add_move_binding (binding_set, GDK_KEY_KP_Up, GDK_CONTROL_MASK,
|
||||
add_move_binding (widget_class, GDK_KEY_KP_Up, GDK_CONTROL_MASK,
|
||||
GTK_MOVEMENT_PARAGRAPHS, -1);
|
||||
|
||||
add_move_binding (binding_set, GDK_KEY_Down, GDK_CONTROL_MASK,
|
||||
add_move_binding (widget_class, GDK_KEY_Down, GDK_CONTROL_MASK,
|
||||
GTK_MOVEMENT_PARAGRAPHS, 1);
|
||||
|
||||
add_move_binding (binding_set, GDK_KEY_KP_Down, GDK_CONTROL_MASK,
|
||||
add_move_binding (widget_class, GDK_KEY_KP_Down, GDK_CONTROL_MASK,
|
||||
GTK_MOVEMENT_PARAGRAPHS, 1);
|
||||
|
||||
add_move_binding (binding_set, GDK_KEY_Home, 0,
|
||||
add_move_binding (widget_class, GDK_KEY_Home, 0,
|
||||
GTK_MOVEMENT_DISPLAY_LINE_ENDS, -1);
|
||||
|
||||
add_move_binding (binding_set, GDK_KEY_KP_Home, 0,
|
||||
add_move_binding (widget_class, GDK_KEY_KP_Home, 0,
|
||||
GTK_MOVEMENT_DISPLAY_LINE_ENDS, -1);
|
||||
|
||||
add_move_binding (binding_set, GDK_KEY_End, 0,
|
||||
add_move_binding (widget_class, GDK_KEY_End, 0,
|
||||
GTK_MOVEMENT_DISPLAY_LINE_ENDS, 1);
|
||||
|
||||
add_move_binding (binding_set, GDK_KEY_KP_End, 0,
|
||||
add_move_binding (widget_class, GDK_KEY_KP_End, 0,
|
||||
GTK_MOVEMENT_DISPLAY_LINE_ENDS, 1);
|
||||
|
||||
add_move_binding (binding_set, GDK_KEY_Home, GDK_CONTROL_MASK,
|
||||
add_move_binding (widget_class, GDK_KEY_Home, GDK_CONTROL_MASK,
|
||||
GTK_MOVEMENT_BUFFER_ENDS, -1);
|
||||
|
||||
add_move_binding (binding_set, GDK_KEY_KP_Home, GDK_CONTROL_MASK,
|
||||
add_move_binding (widget_class, GDK_KEY_KP_Home, GDK_CONTROL_MASK,
|
||||
GTK_MOVEMENT_BUFFER_ENDS, -1);
|
||||
|
||||
add_move_binding (binding_set, GDK_KEY_End, GDK_CONTROL_MASK,
|
||||
add_move_binding (widget_class, GDK_KEY_End, GDK_CONTROL_MASK,
|
||||
GTK_MOVEMENT_BUFFER_ENDS, 1);
|
||||
|
||||
add_move_binding (binding_set, GDK_KEY_KP_End, GDK_CONTROL_MASK,
|
||||
add_move_binding (widget_class, GDK_KEY_KP_End, GDK_CONTROL_MASK,
|
||||
GTK_MOVEMENT_BUFFER_ENDS, 1);
|
||||
|
||||
add_move_binding (binding_set, GDK_KEY_Page_Up, 0,
|
||||
add_move_binding (widget_class, GDK_KEY_Page_Up, 0,
|
||||
GTK_MOVEMENT_PAGES, -1);
|
||||
|
||||
add_move_binding (binding_set, GDK_KEY_KP_Page_Up, 0,
|
||||
add_move_binding (widget_class, GDK_KEY_KP_Page_Up, 0,
|
||||
GTK_MOVEMENT_PAGES, -1);
|
||||
|
||||
add_move_binding (binding_set, GDK_KEY_Page_Down, 0,
|
||||
add_move_binding (widget_class, GDK_KEY_Page_Down, 0,
|
||||
GTK_MOVEMENT_PAGES, 1);
|
||||
|
||||
add_move_binding (binding_set, GDK_KEY_KP_Page_Down, 0,
|
||||
add_move_binding (widget_class, GDK_KEY_KP_Page_Down, 0,
|
||||
GTK_MOVEMENT_PAGES, 1);
|
||||
|
||||
add_move_binding (binding_set, GDK_KEY_Page_Up, GDK_CONTROL_MASK,
|
||||
add_move_binding (widget_class, GDK_KEY_Page_Up, GDK_CONTROL_MASK,
|
||||
GTK_MOVEMENT_HORIZONTAL_PAGES, -1);
|
||||
|
||||
add_move_binding (binding_set, GDK_KEY_KP_Page_Up, GDK_CONTROL_MASK,
|
||||
add_move_binding (widget_class, GDK_KEY_KP_Page_Up, GDK_CONTROL_MASK,
|
||||
GTK_MOVEMENT_HORIZONTAL_PAGES, -1);
|
||||
|
||||
add_move_binding (binding_set, GDK_KEY_Page_Down, GDK_CONTROL_MASK,
|
||||
add_move_binding (widget_class, GDK_KEY_Page_Down, GDK_CONTROL_MASK,
|
||||
GTK_MOVEMENT_HORIZONTAL_PAGES, 1);
|
||||
|
||||
add_move_binding (binding_set, GDK_KEY_KP_Page_Down, GDK_CONTROL_MASK,
|
||||
add_move_binding (widget_class, GDK_KEY_KP_Page_Down, GDK_CONTROL_MASK,
|
||||
GTK_MOVEMENT_HORIZONTAL_PAGES, 1);
|
||||
|
||||
/* Select all */
|
||||
gtk_binding_entry_add_signal (binding_set, GDK_KEY_a, GDK_CONTROL_MASK,
|
||||
"select-all", 1,
|
||||
G_TYPE_BOOLEAN, TRUE);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_a, GDK_CONTROL_MASK,
|
||||
"select-all",
|
||||
"(b)", TRUE);
|
||||
|
||||
gtk_binding_entry_add_signal (binding_set, GDK_KEY_slash, GDK_CONTROL_MASK,
|
||||
"select-all", 1,
|
||||
G_TYPE_BOOLEAN, TRUE);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_slash, GDK_CONTROL_MASK,
|
||||
"select-all",
|
||||
"(b)", TRUE);
|
||||
|
||||
/* Unselect all */
|
||||
gtk_binding_entry_add_signal (binding_set, GDK_KEY_backslash, GDK_CONTROL_MASK,
|
||||
"select-all", 1,
|
||||
G_TYPE_BOOLEAN, FALSE);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_backslash, GDK_CONTROL_MASK,
|
||||
"select-all",
|
||||
"(b)", FALSE);
|
||||
|
||||
gtk_binding_entry_add_signal (binding_set, GDK_KEY_a, GDK_SHIFT_MASK | GDK_CONTROL_MASK,
|
||||
"select-all", 1,
|
||||
G_TYPE_BOOLEAN, FALSE);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_a, GDK_SHIFT_MASK | GDK_CONTROL_MASK,
|
||||
"select-all",
|
||||
"(b)", FALSE);
|
||||
|
||||
/* Deleting text */
|
||||
gtk_binding_entry_add_signal (binding_set, GDK_KEY_Delete, 0,
|
||||
"delete-from-cursor", 2,
|
||||
G_TYPE_ENUM, GTK_DELETE_CHARS,
|
||||
G_TYPE_INT, 1);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_Delete, 0,
|
||||
"delete-from-cursor",
|
||||
"(ii)", GTK_DELETE_CHARS, 1);
|
||||
|
||||
gtk_binding_entry_add_signal (binding_set, GDK_KEY_KP_Delete, 0,
|
||||
"delete-from-cursor", 2,
|
||||
G_TYPE_ENUM, GTK_DELETE_CHARS,
|
||||
G_TYPE_INT, 1);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_KP_Delete, 0,
|
||||
"delete-from-cursor",
|
||||
"(ii)", GTK_DELETE_CHARS, 1);
|
||||
|
||||
gtk_binding_entry_add_signal (binding_set, GDK_KEY_BackSpace, 0,
|
||||
"backspace", 0);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_BackSpace, 0,
|
||||
"backspace",
|
||||
NULL);
|
||||
|
||||
/* Make this do the same as Backspace, to help with mis-typing */
|
||||
gtk_binding_entry_add_signal (binding_set, GDK_KEY_BackSpace, GDK_SHIFT_MASK,
|
||||
"backspace", 0);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_BackSpace, GDK_SHIFT_MASK,
|
||||
"backspace",
|
||||
NULL);
|
||||
|
||||
gtk_binding_entry_add_signal (binding_set, GDK_KEY_Delete, GDK_CONTROL_MASK,
|
||||
"delete-from-cursor", 2,
|
||||
G_TYPE_ENUM, GTK_DELETE_WORD_ENDS,
|
||||
G_TYPE_INT, 1);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_Delete, GDK_CONTROL_MASK,
|
||||
"delete-from-cursor",
|
||||
"(ii)", GTK_DELETE_WORD_ENDS, 1);
|
||||
|
||||
gtk_binding_entry_add_signal (binding_set, GDK_KEY_KP_Delete, GDK_CONTROL_MASK,
|
||||
"delete-from-cursor", 2,
|
||||
G_TYPE_ENUM, GTK_DELETE_WORD_ENDS,
|
||||
G_TYPE_INT, 1);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_KP_Delete, GDK_CONTROL_MASK,
|
||||
"delete-from-cursor",
|
||||
"(ii)", GTK_DELETE_WORD_ENDS, 1);
|
||||
|
||||
gtk_binding_entry_add_signal (binding_set, GDK_KEY_BackSpace, GDK_CONTROL_MASK,
|
||||
"delete-from-cursor", 2,
|
||||
G_TYPE_ENUM, GTK_DELETE_WORD_ENDS,
|
||||
G_TYPE_INT, -1);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_BackSpace, GDK_CONTROL_MASK,
|
||||
"delete-from-cursor",
|
||||
"(ii)", GTK_DELETE_WORD_ENDS, -1);
|
||||
|
||||
gtk_binding_entry_add_signal (binding_set, GDK_KEY_Delete, GDK_SHIFT_MASK | GDK_CONTROL_MASK,
|
||||
"delete-from-cursor", 2,
|
||||
G_TYPE_ENUM, GTK_DELETE_PARAGRAPH_ENDS,
|
||||
G_TYPE_INT, 1);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_Delete, GDK_SHIFT_MASK | GDK_CONTROL_MASK,
|
||||
"delete-from-cursor",
|
||||
"(ii)", GTK_DELETE_PARAGRAPH_ENDS, 1);
|
||||
|
||||
gtk_binding_entry_add_signal (binding_set, GDK_KEY_KP_Delete, GDK_SHIFT_MASK | GDK_CONTROL_MASK,
|
||||
"delete-from-cursor", 2,
|
||||
G_TYPE_ENUM, GTK_DELETE_PARAGRAPH_ENDS,
|
||||
G_TYPE_INT, 1);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_KP_Delete, GDK_SHIFT_MASK | GDK_CONTROL_MASK,
|
||||
"delete-from-cursor",
|
||||
"(ii)", GTK_DELETE_PARAGRAPH_ENDS, 1);
|
||||
|
||||
gtk_binding_entry_add_signal (binding_set, GDK_KEY_BackSpace, GDK_SHIFT_MASK | GDK_CONTROL_MASK,
|
||||
"delete-from-cursor", 2,
|
||||
G_TYPE_ENUM, GTK_DELETE_PARAGRAPH_ENDS,
|
||||
G_TYPE_INT, -1);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_BackSpace, GDK_SHIFT_MASK | GDK_CONTROL_MASK,
|
||||
"delete-from-cursor",
|
||||
"(ii)", GTK_DELETE_PARAGRAPH_ENDS, -1);
|
||||
|
||||
/* Cut/copy/paste */
|
||||
|
||||
gtk_binding_entry_add_signal (binding_set, GDK_KEY_x, GDK_CONTROL_MASK,
|
||||
"cut-clipboard", 0);
|
||||
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_v, GDK_CONTROL_MASK,
|
||||
"paste-clipboard", 0);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_x, GDK_CONTROL_MASK,
|
||||
"cut-clipboard",
|
||||
NULL);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_c, GDK_CONTROL_MASK,
|
||||
"copy-clipboard",
|
||||
NULL);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_v, GDK_CONTROL_MASK,
|
||||
"paste-clipboard",
|
||||
NULL);
|
||||
|
||||
gtk_binding_entry_add_signal (binding_set, GDK_KEY_KP_Delete, GDK_SHIFT_MASK,
|
||||
"cut-clipboard", 0);
|
||||
gtk_binding_entry_add_signal (binding_set, GDK_KEY_KP_Insert, GDK_CONTROL_MASK,
|
||||
"copy-clipboard", 0);
|
||||
gtk_binding_entry_add_signal (binding_set, GDK_KEY_KP_Insert, GDK_SHIFT_MASK,
|
||||
"paste-clipboard", 0);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_KP_Delete, GDK_SHIFT_MASK,
|
||||
"cut-clipboard",
|
||||
NULL);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_KP_Insert, GDK_CONTROL_MASK,
|
||||
"copy-clipboard",
|
||||
NULL);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_KP_Insert, GDK_SHIFT_MASK,
|
||||
"paste-clipboard",
|
||||
NULL);
|
||||
|
||||
gtk_binding_entry_add_signal (binding_set, GDK_KEY_Delete, GDK_SHIFT_MASK,
|
||||
"cut-clipboard", 0);
|
||||
gtk_binding_entry_add_signal (binding_set, GDK_KEY_Insert, GDK_CONTROL_MASK,
|
||||
"copy-clipboard", 0);
|
||||
gtk_binding_entry_add_signal (binding_set, GDK_KEY_Insert, GDK_SHIFT_MASK,
|
||||
"paste-clipboard", 0);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_Delete, GDK_SHIFT_MASK,
|
||||
"cut-clipboard",
|
||||
NULL);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_Insert, GDK_CONTROL_MASK,
|
||||
"copy-clipboard",
|
||||
NULL);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_Insert, GDK_SHIFT_MASK,
|
||||
"paste-clipboard",
|
||||
NULL);
|
||||
|
||||
/* Overwrite */
|
||||
gtk_binding_entry_add_signal (binding_set, GDK_KEY_Insert, 0,
|
||||
"toggle-overwrite", 0);
|
||||
gtk_binding_entry_add_signal (binding_set, GDK_KEY_KP_Insert, 0,
|
||||
"toggle-overwrite", 0);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_Insert, 0,
|
||||
"toggle-overwrite",
|
||||
NULL);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_KP_Insert, 0,
|
||||
"toggle-overwrite",
|
||||
NULL);
|
||||
|
||||
/* Emoji */
|
||||
gtk_binding_entry_add_signal (binding_set, GDK_KEY_period, GDK_CONTROL_MASK,
|
||||
"insert-emoji", 0);
|
||||
gtk_binding_entry_add_signal (binding_set, GDK_KEY_semicolon, GDK_CONTROL_MASK,
|
||||
"insert-emoji", 0);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_period, GDK_CONTROL_MASK,
|
||||
"insert-emoji",
|
||||
NULL);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_semicolon, GDK_CONTROL_MASK,
|
||||
"insert-emoji",
|
||||
NULL);
|
||||
|
||||
/* Caret mode */
|
||||
gtk_binding_entry_add_signal (binding_set, GDK_KEY_F7, 0,
|
||||
"toggle-cursor-visible", 0);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_F7, 0,
|
||||
"toggle-cursor-visible",
|
||||
NULL);
|
||||
|
||||
/* Control-tab focus motion */
|
||||
gtk_binding_entry_add_signal (binding_set, GDK_KEY_Tab, GDK_CONTROL_MASK,
|
||||
"move-focus", 1,
|
||||
GTK_TYPE_DIRECTION_TYPE, GTK_DIR_TAB_FORWARD);
|
||||
gtk_binding_entry_add_signal (binding_set, GDK_KEY_KP_Tab, GDK_CONTROL_MASK,
|
||||
"move-focus", 1,
|
||||
GTK_TYPE_DIRECTION_TYPE, GTK_DIR_TAB_FORWARD);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_Tab, GDK_CONTROL_MASK,
|
||||
"move-focus",
|
||||
"(i)", GTK_DIR_TAB_FORWARD);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_KP_Tab, GDK_CONTROL_MASK,
|
||||
"move-focus",
|
||||
"(i)", GTK_DIR_TAB_FORWARD);
|
||||
|
||||
gtk_binding_entry_add_signal (binding_set, GDK_KEY_Tab, GDK_SHIFT_MASK | GDK_CONTROL_MASK,
|
||||
"move-focus", 1,
|
||||
GTK_TYPE_DIRECTION_TYPE, GTK_DIR_TAB_BACKWARD);
|
||||
gtk_binding_entry_add_signal (binding_set, GDK_KEY_KP_Tab, GDK_SHIFT_MASK | GDK_CONTROL_MASK,
|
||||
"move-focus", 1,
|
||||
GTK_TYPE_DIRECTION_TYPE, GTK_DIR_TAB_BACKWARD);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_Tab, GDK_SHIFT_MASK | GDK_CONTROL_MASK,
|
||||
"move-focus",
|
||||
"(i)", GTK_DIR_TAB_BACKWARD);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_KP_Tab, GDK_SHIFT_MASK | GDK_CONTROL_MASK,
|
||||
"move-focus",
|
||||
"(i)", GTK_DIR_TAB_BACKWARD);
|
||||
|
||||
gtk_widget_class_set_accessible_type (widget_class, GTK_TYPE_TEXT_VIEW_ACCESSIBLE);
|
||||
gtk_widget_class_set_css_name (widget_class, I_("textview"));
|
||||
|
||||
+42
-40
@@ -36,7 +36,6 @@
|
||||
#include "gtktoolbar.h"
|
||||
#include "gtktoolbarprivate.h"
|
||||
|
||||
#include "gtkbindings.h"
|
||||
#include "gtkbox.h"
|
||||
#include "gtkcontainerprivate.h"
|
||||
#include "gtkcssnodeprivate.h"
|
||||
@@ -301,33 +300,35 @@ static guint toolbar_signals[LAST_SIGNAL] = { 0 };
|
||||
|
||||
|
||||
static void
|
||||
add_arrow_bindings (GtkBindingSet *binding_set,
|
||||
add_arrow_bindings (GtkWidgetClass *widget_class,
|
||||
guint keysym,
|
||||
GtkDirectionType dir)
|
||||
{
|
||||
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, dir);
|
||||
gtk_binding_entry_add_signal (binding_set, keypad_keysym, 0,
|
||||
"move-focus", 1,
|
||||
GTK_TYPE_DIRECTION_TYPE, dir);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
keysym, 0,
|
||||
"move-focus",
|
||||
"(i)", dir);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
keypad_keysym, 0,
|
||||
"move-focus",
|
||||
"(i)", dir);
|
||||
}
|
||||
|
||||
static void
|
||||
add_ctrl_tab_bindings (GtkBindingSet *binding_set,
|
||||
add_ctrl_tab_bindings (GtkWidgetClass *widget_class,
|
||||
GdkModifierType modifiers,
|
||||
GtkDirectionType direction)
|
||||
{
|
||||
gtk_binding_entry_add_signal (binding_set,
|
||||
GDK_KEY_Tab, GDK_CONTROL_MASK | modifiers,
|
||||
"move-focus", 1,
|
||||
GTK_TYPE_DIRECTION_TYPE, direction);
|
||||
gtk_binding_entry_add_signal (binding_set,
|
||||
GDK_KEY_KP_Tab, GDK_CONTROL_MASK | modifiers,
|
||||
"move-focus", 1,
|
||||
GTK_TYPE_DIRECTION_TYPE, direction);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_Tab, GDK_CONTROL_MASK | modifiers,
|
||||
"move-focus",
|
||||
"(i)", direction);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_KP_Tab, GDK_CONTROL_MASK | modifiers,
|
||||
"move-focus",
|
||||
"(i)", direction);
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -336,7 +337,6 @@ gtk_toolbar_class_init (GtkToolbarClass *klass)
|
||||
GObjectClass *gobject_class;
|
||||
GtkWidgetClass *widget_class;
|
||||
GtkContainerClass *container_class;
|
||||
GtkBindingSet *binding_set;
|
||||
|
||||
gobject_class = (GObjectClass *)klass;
|
||||
widget_class = (GtkWidgetClass *)klass;
|
||||
@@ -476,28 +476,30 @@ gtk_toolbar_class_init (GtkToolbarClass *klass)
|
||||
TRUE,
|
||||
GTK_PARAM_READWRITE|G_PARAM_EXPLICIT_NOTIFY));
|
||||
|
||||
binding_set = gtk_binding_set_by_class (klass);
|
||||
|
||||
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 (binding_set, GDK_KEY_Up, GTK_DIR_UP);
|
||||
add_arrow_bindings (binding_set, GDK_KEY_Down, GTK_DIR_DOWN);
|
||||
|
||||
gtk_binding_entry_add_signal (binding_set, GDK_KEY_KP_Home, 0,
|
||||
"focus-home-or-end", 1,
|
||||
G_TYPE_BOOLEAN, TRUE);
|
||||
gtk_binding_entry_add_signal (binding_set, GDK_KEY_Home, 0,
|
||||
"focus-home-or-end", 1,
|
||||
G_TYPE_BOOLEAN, TRUE);
|
||||
gtk_binding_entry_add_signal (binding_set, GDK_KEY_KP_End, 0,
|
||||
"focus-home-or-end", 1,
|
||||
G_TYPE_BOOLEAN, FALSE);
|
||||
gtk_binding_entry_add_signal (binding_set, GDK_KEY_End, 0,
|
||||
"focus-home-or-end", 1,
|
||||
G_TYPE_BOOLEAN, FALSE);
|
||||
|
||||
add_ctrl_tab_bindings (binding_set, 0, GTK_DIR_TAB_FORWARD);
|
||||
add_ctrl_tab_bindings (binding_set, GDK_SHIFT_MASK, GTK_DIR_TAB_BACKWARD);
|
||||
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 (widget_class, GDK_KEY_Up, GTK_DIR_UP);
|
||||
add_arrow_bindings (widget_class, GDK_KEY_Down, GTK_DIR_DOWN);
|
||||
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_KP_Home, 0,
|
||||
"focus-home-or-end",
|
||||
"(b)", TRUE);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_Home, 0,
|
||||
"focus-home-or-end",
|
||||
"(b)", TRUE);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_KP_End, 0,
|
||||
"focus-home-or-end",
|
||||
"(b)", FALSE);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_End, 0,
|
||||
"focus-home-or-end",
|
||||
"(b)", FALSE);
|
||||
|
||||
add_ctrl_tab_bindings (widget_class, 0, GTK_DIR_TAB_FORWARD);
|
||||
add_ctrl_tab_bindings (widget_class, GDK_SHIFT_MASK, GTK_DIR_TAB_BACKWARD);
|
||||
|
||||
gtk_widget_class_set_css_name (widget_class, I_("toolbar"));
|
||||
}
|
||||
|
||||
+202
-230
@@ -22,7 +22,6 @@
|
||||
|
||||
#include "gtkadjustmentprivate.h"
|
||||
#include "gtkbox.h"
|
||||
#include "gtkbindings.h"
|
||||
#include "gtkbuildable.h"
|
||||
#include "gtkbutton.h"
|
||||
#include "gtkcelllayout.h"
|
||||
@@ -52,6 +51,7 @@
|
||||
#include "gtkrendericonprivate.h"
|
||||
#include "gtkscrollable.h"
|
||||
#include "gtksettingsprivate.h"
|
||||
#include "gtkshortcutcontroller.h"
|
||||
#include "gtksnapshot.h"
|
||||
#include "gtkstylecontextprivate.h"
|
||||
#include "gtktooltip.h"
|
||||
@@ -596,16 +596,16 @@ static void gtk_tree_view_size_allocate (GtkWidget *widget,
|
||||
static void gtk_tree_view_snapshot (GtkWidget *widget,
|
||||
GtkSnapshot *snapshot);
|
||||
|
||||
static gboolean gtk_tree_view_forward_controller_key_pressed (GtkEventControllerKey *key,
|
||||
guint keyval,
|
||||
guint keycode,
|
||||
GdkModifierType state,
|
||||
GtkTreeView *tree_view);
|
||||
static gboolean gtk_tree_view_key_controller_key_pressed (GtkEventControllerKey *key,
|
||||
guint keyval,
|
||||
guint keycode,
|
||||
GdkModifierType state,
|
||||
GtkTreeView *tree_view);
|
||||
static void gtk_tree_view_key_controller_key_released (GtkEventControllerKey *key,
|
||||
guint keyval,
|
||||
guint keycode,
|
||||
GdkModifierType state,
|
||||
GtkTreeView *tree_view);
|
||||
static void gtk_tree_view_key_controller_focus_out (GtkEventControllerKey *key,
|
||||
GdkCrossingMode mode,
|
||||
GdkNotifyType detail,
|
||||
@@ -707,7 +707,7 @@ static void invalidate_empty_focus (GtkTreeView *tree_view);
|
||||
static gboolean gtk_tree_view_is_expander_column (GtkTreeView *tree_view,
|
||||
GtkTreeViewColumn *column);
|
||||
static inline gboolean gtk_tree_view_draw_expanders (GtkTreeView *tree_view);
|
||||
static void gtk_tree_view_add_move_binding (GtkBindingSet *binding_set,
|
||||
static void gtk_tree_view_add_move_binding (GtkWidgetClass *widget_class,
|
||||
guint keyval,
|
||||
guint modmask,
|
||||
gboolean add_shifted_binding,
|
||||
@@ -952,16 +952,9 @@ G_DEFINE_TYPE_WITH_CODE (GtkTreeView, gtk_tree_view, GTK_TYPE_CONTAINER,
|
||||
static void
|
||||
gtk_tree_view_class_init (GtkTreeViewClass *class)
|
||||
{
|
||||
GObjectClass *o_class;
|
||||
GtkWidgetClass *widget_class;
|
||||
GtkContainerClass *container_class;
|
||||
GtkBindingSet *binding_set;
|
||||
|
||||
binding_set = gtk_binding_set_by_class (class);
|
||||
|
||||
o_class = (GObjectClass *) class;
|
||||
widget_class = (GtkWidgetClass *) class;
|
||||
container_class = (GtkContainerClass *) class;
|
||||
GObjectClass *o_class = G_OBJECT_CLASS (class);
|
||||
GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (class);
|
||||
GtkContainerClass *container_class = GTK_CONTAINER_CLASS (class);
|
||||
|
||||
/* GObject signals */
|
||||
o_class->set_property = gtk_tree_view_set_property;
|
||||
@@ -1425,217 +1418,198 @@ gtk_tree_view_class_init (GtkTreeViewClass *class)
|
||||
G_TYPE_BOOLEAN, 0);
|
||||
|
||||
/* Key bindings */
|
||||
gtk_tree_view_add_move_binding (binding_set, GDK_KEY_Up, 0, TRUE,
|
||||
gtk_tree_view_add_move_binding (widget_class, GDK_KEY_Up, 0, TRUE,
|
||||
GTK_MOVEMENT_DISPLAY_LINES, -1);
|
||||
gtk_tree_view_add_move_binding (binding_set, GDK_KEY_KP_Up, 0, TRUE,
|
||||
gtk_tree_view_add_move_binding (widget_class, GDK_KEY_KP_Up, 0, TRUE,
|
||||
GTK_MOVEMENT_DISPLAY_LINES, -1);
|
||||
|
||||
gtk_tree_view_add_move_binding (binding_set, GDK_KEY_Down, 0, TRUE,
|
||||
gtk_tree_view_add_move_binding (widget_class, GDK_KEY_Down, 0, TRUE,
|
||||
GTK_MOVEMENT_DISPLAY_LINES, 1);
|
||||
gtk_tree_view_add_move_binding (binding_set, GDK_KEY_KP_Down, 0, TRUE,
|
||||
gtk_tree_view_add_move_binding (widget_class, GDK_KEY_KP_Down, 0, TRUE,
|
||||
GTK_MOVEMENT_DISPLAY_LINES, 1);
|
||||
|
||||
gtk_tree_view_add_move_binding (binding_set, GDK_KEY_p, GDK_CONTROL_MASK, FALSE,
|
||||
gtk_tree_view_add_move_binding (widget_class, GDK_KEY_p, GDK_CONTROL_MASK, FALSE,
|
||||
GTK_MOVEMENT_DISPLAY_LINES, -1);
|
||||
|
||||
gtk_tree_view_add_move_binding (binding_set, GDK_KEY_n, GDK_CONTROL_MASK, FALSE,
|
||||
gtk_tree_view_add_move_binding (widget_class, GDK_KEY_n, GDK_CONTROL_MASK, FALSE,
|
||||
GTK_MOVEMENT_DISPLAY_LINES, 1);
|
||||
|
||||
gtk_tree_view_add_move_binding (binding_set, GDK_KEY_Home, 0, TRUE,
|
||||
gtk_tree_view_add_move_binding (widget_class, GDK_KEY_Home, 0, TRUE,
|
||||
GTK_MOVEMENT_BUFFER_ENDS, -1);
|
||||
gtk_tree_view_add_move_binding (binding_set, GDK_KEY_KP_Home, 0, TRUE,
|
||||
gtk_tree_view_add_move_binding (widget_class, GDK_KEY_KP_Home, 0, TRUE,
|
||||
GTK_MOVEMENT_BUFFER_ENDS, -1);
|
||||
|
||||
gtk_tree_view_add_move_binding (binding_set, GDK_KEY_End, 0, TRUE,
|
||||
gtk_tree_view_add_move_binding (widget_class, GDK_KEY_End, 0, TRUE,
|
||||
GTK_MOVEMENT_BUFFER_ENDS, 1);
|
||||
gtk_tree_view_add_move_binding (binding_set, GDK_KEY_KP_End, 0, TRUE,
|
||||
gtk_tree_view_add_move_binding (widget_class, GDK_KEY_KP_End, 0, TRUE,
|
||||
GTK_MOVEMENT_BUFFER_ENDS, 1);
|
||||
|
||||
gtk_tree_view_add_move_binding (binding_set, GDK_KEY_Page_Up, 0, TRUE,
|
||||
gtk_tree_view_add_move_binding (widget_class, GDK_KEY_Page_Up, 0, TRUE,
|
||||
GTK_MOVEMENT_PAGES, -1);
|
||||
gtk_tree_view_add_move_binding (binding_set, GDK_KEY_KP_Page_Up, 0, TRUE,
|
||||
gtk_tree_view_add_move_binding (widget_class, GDK_KEY_KP_Page_Up, 0, TRUE,
|
||||
GTK_MOVEMENT_PAGES, -1);
|
||||
|
||||
gtk_tree_view_add_move_binding (binding_set, GDK_KEY_Page_Down, 0, TRUE,
|
||||
gtk_tree_view_add_move_binding (widget_class, GDK_KEY_Page_Down, 0, TRUE,
|
||||
GTK_MOVEMENT_PAGES, 1);
|
||||
gtk_tree_view_add_move_binding (binding_set, GDK_KEY_KP_Page_Down, 0, TRUE,
|
||||
gtk_tree_view_add_move_binding (widget_class, GDK_KEY_KP_Page_Down, 0, TRUE,
|
||||
GTK_MOVEMENT_PAGES, 1);
|
||||
|
||||
|
||||
gtk_binding_entry_add_signal (binding_set, GDK_KEY_Right, 0, "move-cursor", 2,
|
||||
G_TYPE_ENUM, GTK_MOVEMENT_VISUAL_POSITIONS,
|
||||
G_TYPE_INT, 1);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_Right, 0,
|
||||
"move-cursor",
|
||||
"(ii)", GTK_MOVEMENT_VISUAL_POSITIONS, 1);
|
||||
|
||||
gtk_binding_entry_add_signal (binding_set, GDK_KEY_Left, 0, "move-cursor", 2,
|
||||
G_TYPE_ENUM, GTK_MOVEMENT_VISUAL_POSITIONS,
|
||||
G_TYPE_INT, -1);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_Left, 0,
|
||||
"move-cursor",
|
||||
"(ii)", GTK_MOVEMENT_VISUAL_POSITIONS, -1);
|
||||
|
||||
gtk_binding_entry_add_signal (binding_set, GDK_KEY_KP_Right, 0, "move-cursor", 2,
|
||||
G_TYPE_ENUM, GTK_MOVEMENT_VISUAL_POSITIONS,
|
||||
G_TYPE_INT, 1);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_KP_Right, 0,
|
||||
"move-cursor",
|
||||
"(ii)", GTK_MOVEMENT_VISUAL_POSITIONS, 1);
|
||||
|
||||
gtk_binding_entry_add_signal (binding_set, GDK_KEY_KP_Left, 0, "move-cursor", 2,
|
||||
G_TYPE_ENUM, GTK_MOVEMENT_VISUAL_POSITIONS,
|
||||
G_TYPE_INT, -1);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_KP_Left, 0,
|
||||
"move-cursor",
|
||||
"(ii)", GTK_MOVEMENT_VISUAL_POSITIONS, -1);
|
||||
|
||||
gtk_binding_entry_add_signal (binding_set, GDK_KEY_Right, GDK_CONTROL_MASK,
|
||||
"move-cursor", 2,
|
||||
G_TYPE_ENUM, GTK_MOVEMENT_VISUAL_POSITIONS,
|
||||
G_TYPE_INT, 1);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_Right, GDK_CONTROL_MASK,
|
||||
"move-cursor",
|
||||
"(ii)", GTK_MOVEMENT_VISUAL_POSITIONS, 1);
|
||||
|
||||
gtk_binding_entry_add_signal (binding_set, GDK_KEY_Left, GDK_CONTROL_MASK,
|
||||
"move-cursor", 2,
|
||||
G_TYPE_ENUM, GTK_MOVEMENT_VISUAL_POSITIONS,
|
||||
G_TYPE_INT, -1);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_Left, GDK_CONTROL_MASK,
|
||||
"move-cursor",
|
||||
"(ii)", GTK_MOVEMENT_VISUAL_POSITIONS, -1);
|
||||
|
||||
gtk_binding_entry_add_signal (binding_set, GDK_KEY_KP_Right, GDK_CONTROL_MASK,
|
||||
"move-cursor", 2,
|
||||
G_TYPE_ENUM, GTK_MOVEMENT_VISUAL_POSITIONS,
|
||||
G_TYPE_INT, 1);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_KP_Right, GDK_CONTROL_MASK,
|
||||
"move-cursor",
|
||||
"(ii)", GTK_MOVEMENT_VISUAL_POSITIONS, 1);
|
||||
|
||||
gtk_binding_entry_add_signal (binding_set, GDK_KEY_KP_Left, GDK_CONTROL_MASK,
|
||||
"move-cursor", 2,
|
||||
G_TYPE_ENUM, GTK_MOVEMENT_VISUAL_POSITIONS,
|
||||
G_TYPE_INT, -1);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_KP_Left, GDK_CONTROL_MASK,
|
||||
"move-cursor",
|
||||
"(ii)", GTK_MOVEMENT_VISUAL_POSITIONS, -1);
|
||||
|
||||
gtk_binding_entry_add_signal (binding_set, GDK_KEY_space, GDK_CONTROL_MASK, "toggle-cursor-row", 0);
|
||||
gtk_binding_entry_add_signal (binding_set, GDK_KEY_KP_Space, GDK_CONTROL_MASK, "toggle-cursor-row", 0);
|
||||
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_slash, GDK_CONTROL_MASK, "select-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_slash, GDK_CONTROL_MASK, "select-all", NULL);
|
||||
|
||||
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_backslash, GDK_CONTROL_MASK, "unselect-all", 0);
|
||||
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_backslash, GDK_CONTROL_MASK, "unselect-all", NULL);
|
||||
|
||||
gtk_binding_entry_add_signal (binding_set, GDK_KEY_space, GDK_SHIFT_MASK, "select-cursor-row", 1,
|
||||
G_TYPE_BOOLEAN, TRUE);
|
||||
gtk_binding_entry_add_signal (binding_set, GDK_KEY_KP_Space, GDK_SHIFT_MASK, "select-cursor-row", 1,
|
||||
G_TYPE_BOOLEAN, TRUE);
|
||||
gtk_widget_class_add_binding_signal (widget_class, GDK_KEY_space, GDK_SHIFT_MASK, "select-cursor-row", "(b)", TRUE);
|
||||
gtk_widget_class_add_binding_signal (widget_class, GDK_KEY_KP_Space, GDK_SHIFT_MASK, "select-cursor-row", "(b)", TRUE);
|
||||
|
||||
gtk_binding_entry_add_signal (binding_set, GDK_KEY_space, 0, "select-cursor-row", 1,
|
||||
G_TYPE_BOOLEAN, TRUE);
|
||||
gtk_binding_entry_add_signal (binding_set, GDK_KEY_KP_Space, 0, "select-cursor-row", 1,
|
||||
G_TYPE_BOOLEAN, TRUE);
|
||||
gtk_binding_entry_add_signal (binding_set, GDK_KEY_Return, 0, "select-cursor-row", 1,
|
||||
G_TYPE_BOOLEAN, TRUE);
|
||||
gtk_binding_entry_add_signal (binding_set, GDK_KEY_ISO_Enter, 0, "select-cursor-row", 1,
|
||||
G_TYPE_BOOLEAN, TRUE);
|
||||
gtk_binding_entry_add_signal (binding_set, GDK_KEY_KP_Enter, 0, "select-cursor-row", 1,
|
||||
G_TYPE_BOOLEAN, TRUE);
|
||||
gtk_widget_class_add_binding_signal (widget_class, GDK_KEY_space, 0, "select-cursor-row", "(b)", TRUE);
|
||||
gtk_widget_class_add_binding_signal (widget_class, GDK_KEY_KP_Space, 0, "select-cursor-row", "(b)", TRUE);
|
||||
gtk_widget_class_add_binding_signal (widget_class, GDK_KEY_Return, 0, "select-cursor-row", "(b)", TRUE);
|
||||
gtk_widget_class_add_binding_signal (widget_class, GDK_KEY_ISO_Enter, 0, "select-cursor-row", "(b)", TRUE);
|
||||
gtk_widget_class_add_binding_signal (widget_class, GDK_KEY_KP_Enter, 0, "select-cursor-row", "(b)", TRUE);
|
||||
|
||||
/* expand and collapse rows */
|
||||
gtk_binding_entry_add_signal (binding_set, GDK_KEY_plus, 0, "expand-collapse-cursor-row", 3,
|
||||
G_TYPE_BOOLEAN, TRUE,
|
||||
G_TYPE_BOOLEAN, TRUE,
|
||||
G_TYPE_BOOLEAN, FALSE);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_plus, 0,
|
||||
"expand-collapse-cursor-row",
|
||||
"(bbb)", TRUE, TRUE, FALSE);
|
||||
|
||||
gtk_binding_entry_add_signal (binding_set, GDK_KEY_asterisk, 0,
|
||||
"expand-collapse-cursor-row", 3,
|
||||
G_TYPE_BOOLEAN, TRUE,
|
||||
G_TYPE_BOOLEAN, TRUE,
|
||||
G_TYPE_BOOLEAN, TRUE);
|
||||
gtk_binding_entry_add_signal (binding_set, GDK_KEY_KP_Multiply, 0,
|
||||
"expand-collapse-cursor-row", 3,
|
||||
G_TYPE_BOOLEAN, TRUE,
|
||||
G_TYPE_BOOLEAN, TRUE,
|
||||
G_TYPE_BOOLEAN, TRUE);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_asterisk, 0,
|
||||
"expand-collapse-cursor-row",
|
||||
"(bbb)", TRUE, TRUE, TRUE);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_KP_Multiply, 0,
|
||||
"expand-collapse-cursor-row",
|
||||
"(bbb)", TRUE, TRUE, TRUE);
|
||||
|
||||
gtk_binding_entry_add_signal (binding_set, GDK_KEY_slash, 0,
|
||||
"expand-collapse-cursor-row", 3,
|
||||
G_TYPE_BOOLEAN, TRUE,
|
||||
G_TYPE_BOOLEAN, FALSE,
|
||||
G_TYPE_BOOLEAN, FALSE);
|
||||
gtk_binding_entry_add_signal (binding_set, GDK_KEY_KP_Divide, 0,
|
||||
"expand-collapse-cursor-row", 3,
|
||||
G_TYPE_BOOLEAN, TRUE,
|
||||
G_TYPE_BOOLEAN, FALSE,
|
||||
G_TYPE_BOOLEAN, FALSE);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_slash, 0,
|
||||
"expand-collapse-cursor-row",
|
||||
"(bbb)", TRUE, FALSE, FALSE);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_KP_Divide, 0,
|
||||
"expand-collapse-cursor-row",
|
||||
"(bbb)", TRUE, FALSE, FALSE);
|
||||
|
||||
/* Not doable on US keyboards */
|
||||
gtk_binding_entry_add_signal (binding_set, GDK_KEY_plus, GDK_SHIFT_MASK, "expand-collapse-cursor-row", 3,
|
||||
G_TYPE_BOOLEAN, TRUE,
|
||||
G_TYPE_BOOLEAN, TRUE,
|
||||
G_TYPE_BOOLEAN, TRUE);
|
||||
gtk_binding_entry_add_signal (binding_set, GDK_KEY_KP_Add, 0, "expand-collapse-cursor-row", 3,
|
||||
G_TYPE_BOOLEAN, TRUE,
|
||||
G_TYPE_BOOLEAN, TRUE,
|
||||
G_TYPE_BOOLEAN, FALSE);
|
||||
gtk_binding_entry_add_signal (binding_set, GDK_KEY_KP_Add, GDK_SHIFT_MASK, "expand-collapse-cursor-row", 3,
|
||||
G_TYPE_BOOLEAN, TRUE,
|
||||
G_TYPE_BOOLEAN, TRUE,
|
||||
G_TYPE_BOOLEAN, TRUE);
|
||||
gtk_binding_entry_add_signal (binding_set, GDK_KEY_KP_Add, GDK_SHIFT_MASK, "expand-collapse-cursor-row", 3,
|
||||
G_TYPE_BOOLEAN, TRUE,
|
||||
G_TYPE_BOOLEAN, TRUE,
|
||||
G_TYPE_BOOLEAN, TRUE);
|
||||
gtk_binding_entry_add_signal (binding_set, GDK_KEY_Right, GDK_SHIFT_MASK,
|
||||
"expand-collapse-cursor-row", 3,
|
||||
G_TYPE_BOOLEAN, FALSE,
|
||||
G_TYPE_BOOLEAN, TRUE,
|
||||
G_TYPE_BOOLEAN, TRUE);
|
||||
gtk_binding_entry_add_signal (binding_set, GDK_KEY_KP_Right, GDK_SHIFT_MASK,
|
||||
"expand-collapse-cursor-row", 3,
|
||||
G_TYPE_BOOLEAN, FALSE,
|
||||
G_TYPE_BOOLEAN, TRUE,
|
||||
G_TYPE_BOOLEAN, TRUE);
|
||||
gtk_binding_entry_add_signal (binding_set, GDK_KEY_Right,
|
||||
GDK_CONTROL_MASK | GDK_SHIFT_MASK,
|
||||
"expand-collapse-cursor-row", 3,
|
||||
G_TYPE_BOOLEAN, FALSE,
|
||||
G_TYPE_BOOLEAN, TRUE,
|
||||
G_TYPE_BOOLEAN, TRUE);
|
||||
gtk_binding_entry_add_signal (binding_set, GDK_KEY_KP_Right,
|
||||
GDK_CONTROL_MASK | GDK_SHIFT_MASK,
|
||||
"expand-collapse-cursor-row", 3,
|
||||
G_TYPE_BOOLEAN, FALSE,
|
||||
G_TYPE_BOOLEAN, TRUE,
|
||||
G_TYPE_BOOLEAN, TRUE);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_plus, GDK_SHIFT_MASK,
|
||||
"expand-collapse-cursor-row",
|
||||
"(bbb)", TRUE, TRUE, TRUE);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_KP_Add, 0,
|
||||
"expand-collapse-cursor-row",
|
||||
"(bbb)", TRUE, TRUE, FALSE);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_KP_Add, GDK_SHIFT_MASK,
|
||||
"expand-collapse-cursor-row",
|
||||
"(bbb)", TRUE, TRUE, TRUE);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_KP_Add, GDK_SHIFT_MASK,
|
||||
"expand-collapse-cursor-row",
|
||||
"(bbb)", TRUE, TRUE, TRUE);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_Right, GDK_SHIFT_MASK,
|
||||
"expand-collapse-cursor-row",
|
||||
"(bbb)", FALSE, TRUE, TRUE);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_KP_Right, GDK_SHIFT_MASK,
|
||||
"expand-collapse-cursor-row",
|
||||
"(bbb)", FALSE, TRUE, TRUE);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_Right, GDK_CONTROL_MASK | GDK_SHIFT_MASK,
|
||||
"expand-collapse-cursor-row",
|
||||
"(bbb)", FALSE, TRUE, TRUE);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_KP_Right, GDK_CONTROL_MASK | GDK_SHIFT_MASK,
|
||||
"expand-collapse-cursor-row",
|
||||
"(bbb)", FALSE, TRUE, TRUE);
|
||||
|
||||
gtk_binding_entry_add_signal (binding_set, GDK_KEY_minus, 0, "expand-collapse-cursor-row", 3,
|
||||
G_TYPE_BOOLEAN, TRUE,
|
||||
G_TYPE_BOOLEAN, FALSE,
|
||||
G_TYPE_BOOLEAN, FALSE);
|
||||
gtk_binding_entry_add_signal (binding_set, GDK_KEY_minus, GDK_SHIFT_MASK, "expand-collapse-cursor-row", 3,
|
||||
G_TYPE_BOOLEAN, TRUE,
|
||||
G_TYPE_BOOLEAN, FALSE,
|
||||
G_TYPE_BOOLEAN, TRUE);
|
||||
gtk_binding_entry_add_signal (binding_set, GDK_KEY_KP_Subtract, 0, "expand-collapse-cursor-row", 3,
|
||||
G_TYPE_BOOLEAN, TRUE,
|
||||
G_TYPE_BOOLEAN, FALSE,
|
||||
G_TYPE_BOOLEAN, FALSE);
|
||||
gtk_binding_entry_add_signal (binding_set, GDK_KEY_KP_Subtract, GDK_SHIFT_MASK, "expand-collapse-cursor-row", 3,
|
||||
G_TYPE_BOOLEAN, TRUE,
|
||||
G_TYPE_BOOLEAN, FALSE,
|
||||
G_TYPE_BOOLEAN, TRUE);
|
||||
gtk_binding_entry_add_signal (binding_set, GDK_KEY_Left, GDK_SHIFT_MASK,
|
||||
"expand-collapse-cursor-row", 3,
|
||||
G_TYPE_BOOLEAN, FALSE,
|
||||
G_TYPE_BOOLEAN, FALSE,
|
||||
G_TYPE_BOOLEAN, TRUE);
|
||||
gtk_binding_entry_add_signal (binding_set, GDK_KEY_KP_Left, GDK_SHIFT_MASK,
|
||||
"expand-collapse-cursor-row", 3,
|
||||
G_TYPE_BOOLEAN, FALSE,
|
||||
G_TYPE_BOOLEAN, FALSE,
|
||||
G_TYPE_BOOLEAN, TRUE);
|
||||
gtk_binding_entry_add_signal (binding_set, GDK_KEY_Left,
|
||||
GDK_CONTROL_MASK | GDK_SHIFT_MASK,
|
||||
"expand-collapse-cursor-row", 3,
|
||||
G_TYPE_BOOLEAN, FALSE,
|
||||
G_TYPE_BOOLEAN, FALSE,
|
||||
G_TYPE_BOOLEAN, TRUE);
|
||||
gtk_binding_entry_add_signal (binding_set, GDK_KEY_KP_Left,
|
||||
GDK_CONTROL_MASK | GDK_SHIFT_MASK,
|
||||
"expand-collapse-cursor-row", 3,
|
||||
G_TYPE_BOOLEAN, FALSE,
|
||||
G_TYPE_BOOLEAN, FALSE,
|
||||
G_TYPE_BOOLEAN, TRUE);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_minus, 0,
|
||||
"expand-collapse-cursor-row",
|
||||
"(bbb)", TRUE, FALSE, FALSE);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_minus, GDK_SHIFT_MASK,
|
||||
"expand-collapse-cursor-row",
|
||||
"(bbb)", TRUE, FALSE, TRUE);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_KP_Subtract, 0,
|
||||
"expand-collapse-cursor-row",
|
||||
"(bbb)", TRUE, FALSE, FALSE);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_KP_Subtract, GDK_SHIFT_MASK,
|
||||
"expand-collapse-cursor-row",
|
||||
"(bbb)", TRUE, FALSE, TRUE);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_Left, GDK_SHIFT_MASK,
|
||||
"expand-collapse-cursor-row",
|
||||
"(bbb)", FALSE, FALSE, TRUE);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_KP_Left, GDK_SHIFT_MASK,
|
||||
"expand-collapse-cursor-row",
|
||||
"(bbb)", FALSE, FALSE, TRUE);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_Left, GDK_CONTROL_MASK | GDK_SHIFT_MASK,
|
||||
"expand-collapse-cursor-row",
|
||||
"(bbb)", FALSE, FALSE, TRUE);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
GDK_KEY_KP_Left, GDK_CONTROL_MASK | GDK_SHIFT_MASK,
|
||||
"expand-collapse-cursor-row",
|
||||
"(bbb)", FALSE, FALSE, TRUE);
|
||||
|
||||
gtk_binding_entry_add_signal (binding_set, GDK_KEY_BackSpace, 0, "select-cursor-parent", 0);
|
||||
gtk_binding_entry_add_signal (binding_set, GDK_KEY_BackSpace, GDK_CONTROL_MASK, "select-cursor-parent", 0);
|
||||
gtk_widget_class_add_binding_signal (widget_class, GDK_KEY_BackSpace, 0, "select-cursor-parent", NULL);
|
||||
gtk_widget_class_add_binding_signal (widget_class, GDK_KEY_BackSpace, GDK_CONTROL_MASK, "select-cursor-parent", NULL);
|
||||
|
||||
gtk_binding_entry_add_signal (binding_set, GDK_KEY_f, GDK_CONTROL_MASK, "start-interactive-search", 0);
|
||||
gtk_widget_class_add_binding_signal (widget_class, GDK_KEY_f, GDK_CONTROL_MASK, "start-interactive-search", NULL);
|
||||
|
||||
gtk_binding_entry_add_signal (binding_set, GDK_KEY_F, GDK_CONTROL_MASK, "start-interactive-search", 0);
|
||||
gtk_widget_class_add_binding_signal (widget_class, GDK_KEY_F, GDK_CONTROL_MASK, "start-interactive-search", NULL);
|
||||
|
||||
gtk_widget_class_set_accessible_type (widget_class, GTK_TYPE_TREE_VIEW_ACCESSIBLE);
|
||||
gtk_widget_class_set_css_name (widget_class, I_("treeview"));
|
||||
@@ -1648,6 +1622,7 @@ gtk_tree_view_init (GtkTreeView *tree_view)
|
||||
GtkCssNode *widget_node;
|
||||
GtkGesture *gesture;
|
||||
GtkEventController *controller;
|
||||
GList *list, *controllers;
|
||||
|
||||
priv = tree_view->priv = gtk_tree_view_get_instance_private (tree_view);
|
||||
|
||||
@@ -1715,6 +1690,24 @@ gtk_tree_view_init (GtkTreeView *tree_view)
|
||||
gtk_css_node_set_state (priv->header_node, gtk_css_node_get_state (widget_node));
|
||||
g_object_unref (priv->header_node);
|
||||
|
||||
controller = gtk_event_controller_key_new ();
|
||||
g_signal_connect (controller, "key-pressed",
|
||||
G_CALLBACK (gtk_tree_view_forward_controller_key_pressed), tree_view);
|
||||
gtk_widget_add_controller (GTK_WIDGET (tree_view), controller);
|
||||
|
||||
controllers = _gtk_widget_list_controllers (GTK_WIDGET (tree_view), 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 (GTK_WIDGET (tree_view), list->data);
|
||||
gtk_widget_add_controller (GTK_WIDGET (tree_view), list->data);
|
||||
break;
|
||||
}
|
||||
}
|
||||
g_list_free (controllers);
|
||||
|
||||
priv->multipress_gesture = gtk_gesture_multi_press_new ();
|
||||
gtk_gesture_single_set_button (GTK_GESTURE_SINGLE (priv->multipress_gesture), 0);
|
||||
g_signal_connect (priv->multipress_gesture, "pressed",
|
||||
@@ -1762,8 +1755,6 @@ gtk_tree_view_init (GtkTreeView *tree_view)
|
||||
controller = gtk_event_controller_key_new ();
|
||||
g_signal_connect (controller, "key-pressed",
|
||||
G_CALLBACK (gtk_tree_view_key_controller_key_pressed), tree_view);
|
||||
g_signal_connect (controller, "key-released",
|
||||
G_CALLBACK (gtk_tree_view_key_controller_key_released), tree_view);
|
||||
g_signal_connect (controller, "focus-out",
|
||||
G_CALLBACK (gtk_tree_view_key_controller_focus_out), tree_view);
|
||||
gtk_widget_add_controller (GTK_WIDGET (tree_view), controller);
|
||||
@@ -5177,7 +5168,6 @@ gtk_tree_view_key_controller_key_pressed (GtkEventControllerKey *key,
|
||||
{
|
||||
GtkWidget *widget = GTK_WIDGET (tree_view);
|
||||
GtkWidget *button;
|
||||
GdkEvent *event;
|
||||
|
||||
if (tree_view->priv->rubber_band_status)
|
||||
{
|
||||
@@ -5297,16 +5287,16 @@ gtk_tree_view_key_controller_key_pressed (GtkEventControllerKey *key,
|
||||
}
|
||||
}
|
||||
|
||||
/* Handle the keybindings. */
|
||||
event = gtk_get_current_event ();
|
||||
if (gtk_bindings_activate_event (G_OBJECT (widget), (GdkEventKey *)event))
|
||||
{
|
||||
g_object_unref (event);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
g_object_unref (event);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
gtk_tree_view_forward_controller_key_pressed (GtkEventControllerKey *key,
|
||||
guint keyval,
|
||||
guint keycode,
|
||||
GdkModifierType state,
|
||||
GtkTreeView *tree_view)
|
||||
{
|
||||
if (tree_view->priv->search_entry_avoid_unhandled_binding)
|
||||
{
|
||||
tree_view->priv->search_entry_avoid_unhandled_binding = FALSE;
|
||||
@@ -5373,24 +5363,6 @@ gtk_tree_view_key_controller_key_pressed (GtkEventControllerKey *key,
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static void
|
||||
gtk_tree_view_key_controller_key_released (GtkEventControllerKey *key,
|
||||
guint keyval,
|
||||
guint keycode,
|
||||
GdkModifierType state,
|
||||
GtkTreeView *tree_view)
|
||||
{
|
||||
GdkEvent *event;
|
||||
|
||||
if (tree_view->priv->rubber_band_status)
|
||||
return;
|
||||
|
||||
/* Handle the keybindings. */
|
||||
event = gtk_get_current_event ();
|
||||
gtk_bindings_activate_event (G_OBJECT (tree_view), (GdkEventKey *)event);
|
||||
g_object_unref (event);
|
||||
}
|
||||
|
||||
static void
|
||||
gtk_tree_view_motion_controller_enter (GtkEventControllerMotion *controller,
|
||||
double x,
|
||||
@@ -8908,7 +8880,7 @@ gtk_tree_view_draw_expanders (GtkTreeView *tree_view)
|
||||
}
|
||||
|
||||
static void
|
||||
gtk_tree_view_add_move_binding (GtkBindingSet *binding_set,
|
||||
gtk_tree_view_add_move_binding (GtkWidgetClass *widget_class,
|
||||
guint keyval,
|
||||
guint modmask,
|
||||
gboolean add_shifted_binding,
|
||||
@@ -8916,29 +8888,29 @@ gtk_tree_view_add_move_binding (GtkBindingSet *binding_set,
|
||||
gint count)
|
||||
{
|
||||
|
||||
gtk_binding_entry_add_signal (binding_set, keyval, modmask,
|
||||
"move-cursor", 2,
|
||||
G_TYPE_ENUM, step,
|
||||
G_TYPE_INT, count);
|
||||
gtk_widget_class_add_binding_signal (widget_class,
|
||||
keyval, modmask,
|
||||
"move-cursor",
|
||||
"(ii)", step, count);
|
||||
|
||||
if (add_shifted_binding)
|
||||
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 gint
|
||||
|
||||
@@ -43,6 +43,9 @@ typedef struct _GtkRequisition GtkRequisition;
|
||||
typedef struct _GtkRoot GtkRoot;
|
||||
typedef struct _GtkSelectionData GtkSelectionData;
|
||||
typedef struct _GtkSettings GtkSettings;
|
||||
typedef struct _GtkShortcut GtkShortcut;
|
||||
typedef struct _GtkShortcutAction GtkShortcutAction;
|
||||
typedef struct _GtkShortcutTrigger GtkShortcutTrigger;
|
||||
typedef GdkSnapshot GtkSnapshot;
|
||||
typedef struct _GtkStyleContext GtkStyleContext;
|
||||
typedef struct _GtkTooltip GtkTooltip;
|
||||
|
||||
+225
-477
@@ -26,13 +26,12 @@
|
||||
|
||||
#include "gtkwidgetprivate.h"
|
||||
|
||||
#include "gtkaccelmapprivate.h"
|
||||
#include "gtkaccelgroupprivate.h"
|
||||
#include "gtkaccessible.h"
|
||||
#include "gtkapplicationprivate.h"
|
||||
#include "gtkbindings.h"
|
||||
#include "gtkbuildable.h"
|
||||
#include "gtkbuilderprivate.h"
|
||||
#include "gtkconcatmodelprivate.h"
|
||||
#include "gtkcontainerprivate.h"
|
||||
#include "gtkcssboxesprivate.h"
|
||||
#include "gtkcssfiltervalueprivate.h"
|
||||
@@ -59,6 +58,10 @@
|
||||
#include "gtkscrollable.h"
|
||||
#include "gtkselection.h"
|
||||
#include "gtksettingsprivate.h"
|
||||
#include "gtkshortcut.h"
|
||||
#include "gtkshortcutcontrollerprivate.h"
|
||||
#include "gtkshortcutmanager.h"
|
||||
#include "gtkshortcuttrigger.h"
|
||||
#include "gtksizegroup-private.h"
|
||||
#include "gtksnapshotprivate.h"
|
||||
#include "gtkstylecontextprivate.h"
|
||||
@@ -494,6 +497,7 @@ typedef struct {
|
||||
struct _GtkWidgetClassPrivate
|
||||
{
|
||||
GtkWidgetTemplate *template;
|
||||
GListStore *shortcuts;
|
||||
GType accessible_type;
|
||||
AtkRole accessible_role;
|
||||
const char *css_name;
|
||||
@@ -717,8 +721,6 @@ static gpointer gtk_widget_parent_class = NULL;
|
||||
static guint widget_signals[LAST_SIGNAL] = { 0 };
|
||||
GtkTextDirection gtk_default_direction = GTK_TEXT_DIR_LTR;
|
||||
|
||||
static GQuark quark_accel_path = 0;
|
||||
static GQuark quark_accel_closures = 0;
|
||||
static GQuark quark_input_shape_info = 0;
|
||||
static GQuark quark_pango_context = 0;
|
||||
static GQuark quark_mnemonic_labels = 0;
|
||||
@@ -794,9 +796,29 @@ static void
|
||||
gtk_widget_base_class_init (gpointer g_class)
|
||||
{
|
||||
GtkWidgetClass *klass = g_class;
|
||||
GtkWidgetClassPrivate *priv;
|
||||
|
||||
klass->priv = G_TYPE_CLASS_GET_PRIVATE (g_class, GTK_TYPE_WIDGET, GtkWidgetClassPrivate);
|
||||
klass->priv->template = NULL;
|
||||
priv = klass->priv = G_TYPE_CLASS_GET_PRIVATE (g_class, GTK_TYPE_WIDGET, GtkWidgetClassPrivate);
|
||||
|
||||
priv->template = NULL;
|
||||
|
||||
if (priv->shortcuts == NULL)
|
||||
{
|
||||
priv->shortcuts = g_list_store_new (GTK_TYPE_SHORTCUT);
|
||||
}
|
||||
else
|
||||
{
|
||||
GListModel *parent_shortcuts = G_LIST_MODEL (priv->shortcuts);
|
||||
guint i;
|
||||
|
||||
priv->shortcuts = g_list_store_new (GTK_TYPE_SHORTCUT);
|
||||
for (i = 0; i < g_list_model_get_n_items (parent_shortcuts); i++)
|
||||
{
|
||||
GtkShortcut *shortcut = g_list_model_get_item (parent_shortcuts, i);
|
||||
g_list_store_append (priv->shortcuts, shortcut);
|
||||
g_object_unref (shortcut);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -849,12 +871,30 @@ gtk_widget_real_grab_notify (GtkWidget *widget,
|
||||
static void
|
||||
gtk_widget_real_root (GtkWidget *widget)
|
||||
{
|
||||
GtkWidgetPrivate *priv = gtk_widget_get_instance_private (widget);
|
||||
GList *l;
|
||||
|
||||
gtk_widget_forall (widget, (GtkCallback) gtk_widget_root, NULL);
|
||||
|
||||
for (l = priv->event_controllers; l; l = l->next)
|
||||
{
|
||||
if (GTK_IS_SHORTCUT_CONTROLLER (l->data))
|
||||
gtk_shortcut_controller_root (GTK_SHORTCUT_CONTROLLER (l->data));
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
gtk_widget_real_unroot (GtkWidget *widget)
|
||||
{
|
||||
GtkWidgetPrivate *priv = gtk_widget_get_instance_private (widget);
|
||||
GList *l;
|
||||
|
||||
for (l = priv->event_controllers; l; l = l->next)
|
||||
{
|
||||
if (GTK_IS_SHORTCUT_CONTROLLER (l->data))
|
||||
gtk_shortcut_controller_unroot (GTK_SHORTCUT_CONTROLLER (l->data));
|
||||
}
|
||||
|
||||
gtk_widget_forall (widget, (GtkCallback) gtk_widget_unroot, NULL);
|
||||
}
|
||||
|
||||
@@ -862,13 +902,10 @@ static void
|
||||
gtk_widget_class_init (GtkWidgetClass *klass)
|
||||
{
|
||||
GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
|
||||
GtkBindingSet *binding_set;
|
||||
|
||||
g_type_class_adjust_private_offset (klass, &GtkWidget_private_offset);
|
||||
gtk_widget_parent_class = g_type_class_peek_parent (klass);
|
||||
|
||||
quark_accel_path = g_quark_from_static_string ("gtk-accel-path");
|
||||
quark_accel_closures = g_quark_from_static_string ("gtk-accel-closures");
|
||||
quark_input_shape_info = g_quark_from_static_string ("gtk-input-shape-info");
|
||||
quark_pango_context = g_quark_from_static_string ("gtk-pango-context");
|
||||
quark_mnemonic_labels = g_quark_from_static_string ("gtk-mnemonic-labels");
|
||||
@@ -2097,11 +2134,14 @@ gtk_widget_class_init (GtkWidgetClass *klass)
|
||||
_gtk_marshal_BOOLEAN__UINT,
|
||||
G_TYPE_BOOLEAN, 1, G_TYPE_UINT);
|
||||
|
||||
binding_set = gtk_binding_set_by_class (klass);
|
||||
gtk_binding_entry_add_signal (binding_set, GDK_KEY_F10, GDK_SHIFT_MASK,
|
||||
"popup-menu", 0);
|
||||
gtk_binding_entry_add_signal (binding_set, GDK_KEY_Menu, 0,
|
||||
"popup-menu", 0);
|
||||
gtk_widget_class_add_binding_signal (klass,
|
||||
GDK_KEY_F10, GDK_SHIFT_MASK,
|
||||
"popup-menu",
|
||||
NULL);
|
||||
gtk_widget_class_add_binding_signal (klass,
|
||||
GDK_KEY_Menu, 0,
|
||||
"popup-menu",
|
||||
NULL);
|
||||
|
||||
gtk_widget_class_set_accessible_type (klass, GTK_TYPE_WIDGET_ACCESSIBLE);
|
||||
gtk_widget_class_set_css_name (klass, I_("widget"));
|
||||
@@ -2110,7 +2150,9 @@ gtk_widget_class_init (GtkWidgetClass *klass)
|
||||
static void
|
||||
gtk_widget_base_class_finalize (GtkWidgetClass *klass)
|
||||
{
|
||||
|
||||
template_data_free (klass->priv->template);
|
||||
g_object_unref (klass->priv->shortcuts);
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -2741,6 +2783,7 @@ gtk_widget_init (GTypeInstance *instance, gpointer g_class)
|
||||
{
|
||||
GtkWidget *widget = GTK_WIDGET (instance);
|
||||
GtkWidgetPrivate *priv = gtk_widget_get_instance_private (widget);
|
||||
GtkEventController *controller;
|
||||
GType layout_manager_type;
|
||||
|
||||
widget->priv = priv;
|
||||
@@ -2811,9 +2854,28 @@ gtk_widget_init (GTypeInstance *instance, gpointer g_class)
|
||||
if (g_type_is_a (G_TYPE_FROM_CLASS (g_class), GTK_TYPE_ROOT))
|
||||
priv->root = (GtkRoot *) widget;
|
||||
|
||||
if (g_type_is_a (G_TYPE_FROM_CLASS (g_class), GTK_TYPE_SHORTCUT_MANAGER))
|
||||
{
|
||||
GtkConcatModel *model;
|
||||
|
||||
model = gtk_concat_model_new (GTK_TYPE_SHORTCUT);
|
||||
g_object_set_data_full (G_OBJECT (widget), "gtk-shortcut-manager-bubble", model, g_object_unref);
|
||||
controller = gtk_shortcut_controller_new_for_model (G_LIST_MODEL (model));
|
||||
gtk_widget_add_controller (widget, controller);
|
||||
|
||||
model = gtk_concat_model_new (GTK_TYPE_SHORTCUT);
|
||||
g_object_set_data_full (G_OBJECT (widget), "gtk-shortcut-manager-capture", model, g_object_unref);
|
||||
controller = gtk_shortcut_controller_new_for_model (G_LIST_MODEL (model));
|
||||
gtk_event_controller_set_propagation_phase (controller, GTK_PHASE_CAPTURE);
|
||||
gtk_widget_add_controller (widget, controller);
|
||||
}
|
||||
|
||||
layout_manager_type = gtk_widget_class_get_layout_manager_type (g_class);
|
||||
if (layout_manager_type != G_TYPE_INVALID)
|
||||
gtk_widget_set_layout_manager (widget, g_object_new (layout_manager_type, NULL));
|
||||
|
||||
controller = gtk_shortcut_controller_new_for_model (G_LIST_MODEL (GTK_WIDGET_CLASS (g_class)->priv->shortcuts));
|
||||
gtk_widget_add_controller (widget, controller);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -4763,6 +4825,133 @@ gtk_widget_adjust_size_allocation (GtkWidget *widget,
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* gtk_widget_class_add_binding: (skip)
|
||||
* @widget_class: the class to add the binding to
|
||||
* @keyval: key value of binding to install
|
||||
* @mods: key modifier of binding to install
|
||||
* @callback: the callback to call upon activation
|
||||
* @format_string: GVariant format string for arguments or %NULL for
|
||||
* no arguments
|
||||
* @...: arguments, as given by format string.
|
||||
*
|
||||
* Creates a new shortcut for @widget_class that calls the given @callback
|
||||
* with arguments read according to @format_string.
|
||||
* The arguments and format string must be provided in the same way as
|
||||
* with g_variant_new().
|
||||
*
|
||||
* This function is a convenience wrapper around
|
||||
* gtk_widget_class_add_shortcut() and must be called during class
|
||||
* initialization. It does not provide for user_data, if you need that,
|
||||
* you will have to use gtk_widget_class_add_shortcut() with a custom
|
||||
* shortcut.
|
||||
**/
|
||||
void
|
||||
gtk_widget_class_add_binding (GtkWidgetClass *widget_class,
|
||||
guint keyval,
|
||||
GdkModifierType mods,
|
||||
GtkShortcutFunc func,
|
||||
const gchar *format_string,
|
||||
...)
|
||||
{
|
||||
GtkShortcut *shortcut;
|
||||
|
||||
g_return_if_fail (GTK_IS_WIDGET_CLASS (widget_class));
|
||||
|
||||
shortcut = gtk_shortcut_new (gtk_keyval_trigger_new (keyval, mods),
|
||||
gtk_callback_action_new (func, NULL, NULL));
|
||||
if (format_string)
|
||||
{
|
||||
va_list args;
|
||||
va_start (args, format_string);
|
||||
gtk_shortcut_set_arguments (shortcut,
|
||||
g_variant_new_va (format_string, NULL, &args));
|
||||
va_end (args);
|
||||
}
|
||||
|
||||
gtk_widget_class_add_shortcut (widget_class, shortcut);
|
||||
|
||||
g_object_unref (shortcut);
|
||||
}
|
||||
|
||||
/**
|
||||
* gtk_widget_class_add_binding_signal: (skip)
|
||||
* @widget_class: the class to add the binding to
|
||||
* @keyval: key value of binding to install
|
||||
* @mods: key modifier of binding to install
|
||||
* @signal: the signal to execute
|
||||
* @format_string: GVariant format string for arguments or %NULL for
|
||||
* no arguments
|
||||
* @...: arguments, as given by format string.
|
||||
*
|
||||
* Creates a new shortcut for @widget_class that emits the given action
|
||||
* @signal with arguments read according to @format_string.
|
||||
* The arguments and format string must be provided in the same way as
|
||||
* with g_variant_new().
|
||||
*
|
||||
* This function is a convenience wrapper around
|
||||
* gtk_widget_class_add_shortcut() and must be called during class
|
||||
* initialization.
|
||||
**/
|
||||
void
|
||||
gtk_widget_class_add_binding_signal (GtkWidgetClass *widget_class,
|
||||
guint keyval,
|
||||
GdkModifierType mods,
|
||||
const gchar *signal,
|
||||
const gchar *format_string,
|
||||
...)
|
||||
{
|
||||
GtkShortcut *shortcut;
|
||||
|
||||
g_return_if_fail (GTK_IS_WIDGET_CLASS (widget_class));
|
||||
g_return_if_fail (g_signal_lookup (signal, G_TYPE_FROM_CLASS (widget_class)));
|
||||
/* XXX: validate variant format for signal */
|
||||
|
||||
shortcut = gtk_shortcut_new (gtk_keyval_trigger_new (keyval, mods),
|
||||
gtk_signal_action_new (signal));
|
||||
if (format_string)
|
||||
{
|
||||
va_list args;
|
||||
va_start (args, format_string);
|
||||
gtk_shortcut_set_arguments (shortcut,
|
||||
g_variant_new_va (format_string, NULL, &args));
|
||||
va_end (args);
|
||||
}
|
||||
|
||||
gtk_widget_class_add_shortcut (widget_class, shortcut);
|
||||
|
||||
g_object_unref (shortcut);
|
||||
}
|
||||
|
||||
/**
|
||||
* gtk_widget_class_add_shortcut:
|
||||
* @widget_class: the class to add the shortcut to
|
||||
* @shortcut: (transfer none): the #GtkShortcut to add
|
||||
*
|
||||
* Installs a shortcut in @widget_class. Every instance created for
|
||||
* @widget_class or its subclasses will inherit this shortcut and
|
||||
* trigger it.
|
||||
*
|
||||
* Shortcuts added this way will be triggered in the @GTK_PHASE_BUBBLE
|
||||
* phase, which means they may also trigger if child widgets have focus.
|
||||
*
|
||||
* This function must only be used in class initialization functions
|
||||
* otherwise it is not guaranteed that the shortcut will be installed.
|
||||
**/
|
||||
void
|
||||
gtk_widget_class_add_shortcut (GtkWidgetClass *widget_class,
|
||||
GtkShortcut *shortcut)
|
||||
{
|
||||
GtkWidgetClassPrivate *priv;
|
||||
|
||||
g_return_if_fail (GTK_IS_WIDGET_CLASS (widget_class));
|
||||
g_return_if_fail (GTK_IS_SHORTCUT (shortcut));
|
||||
|
||||
priv = widget_class->priv;
|
||||
|
||||
g_list_store_append (priv->shortcuts, shortcut);
|
||||
}
|
||||
|
||||
static gboolean
|
||||
gtk_widget_real_can_activate_accel (GtkWidget *widget,
|
||||
guint signal_id)
|
||||
@@ -4800,311 +4989,6 @@ gtk_widget_can_activate_accel (GtkWidget *widget,
|
||||
return can_activate;
|
||||
}
|
||||
|
||||
typedef struct {
|
||||
GClosure closure;
|
||||
guint signal_id;
|
||||
} AccelClosure;
|
||||
|
||||
static void
|
||||
closure_accel_activate (GClosure *closure,
|
||||
GValue *return_value,
|
||||
guint n_param_values,
|
||||
const GValue *param_values,
|
||||
gpointer invocation_hint,
|
||||
gpointer marshal_data)
|
||||
{
|
||||
AccelClosure *aclosure = (AccelClosure*) closure;
|
||||
gboolean can_activate = gtk_widget_can_activate_accel (closure->data, aclosure->signal_id);
|
||||
|
||||
if (can_activate)
|
||||
g_signal_emit (closure->data, aclosure->signal_id, 0);
|
||||
|
||||
/* whether accelerator was handled */
|
||||
g_value_set_boolean (return_value, can_activate);
|
||||
}
|
||||
|
||||
static void
|
||||
closures_destroy (gpointer data)
|
||||
{
|
||||
GSList *slist, *closures = data;
|
||||
|
||||
for (slist = closures; slist; slist = slist->next)
|
||||
{
|
||||
g_closure_invalidate (slist->data);
|
||||
g_closure_unref (slist->data);
|
||||
}
|
||||
g_slist_free (closures);
|
||||
}
|
||||
|
||||
static GClosure*
|
||||
widget_new_accel_closure (GtkWidget *widget,
|
||||
guint signal_id)
|
||||
{
|
||||
AccelClosure *aclosure;
|
||||
GClosure *closure = NULL;
|
||||
GSList *slist, *closures;
|
||||
|
||||
closures = g_object_steal_qdata (G_OBJECT (widget), quark_accel_closures);
|
||||
for (slist = closures; slist; slist = slist->next)
|
||||
if (!gtk_accel_group_from_accel_closure (slist->data))
|
||||
{
|
||||
/* reuse this closure */
|
||||
closure = slist->data;
|
||||
break;
|
||||
}
|
||||
if (!closure)
|
||||
{
|
||||
closure = g_closure_new_object (sizeof (AccelClosure), G_OBJECT (widget));
|
||||
closures = g_slist_prepend (closures, g_closure_ref (closure));
|
||||
g_closure_sink (closure);
|
||||
g_closure_set_marshal (closure, closure_accel_activate);
|
||||
}
|
||||
g_object_set_qdata_full (G_OBJECT (widget), quark_accel_closures, closures, closures_destroy);
|
||||
|
||||
aclosure = (AccelClosure*) closure;
|
||||
g_assert (closure->data == widget);
|
||||
g_assert (closure->marshal == closure_accel_activate);
|
||||
aclosure->signal_id = signal_id;
|
||||
|
||||
return closure;
|
||||
}
|
||||
|
||||
/**
|
||||
* gtk_widget_add_accelerator:
|
||||
* @widget: widget to install an accelerator on
|
||||
* @accel_signal: widget signal to emit on accelerator activation
|
||||
* @accel_group: accel group for this widget, added to its toplevel
|
||||
* @accel_key: GDK keyval of the accelerator
|
||||
* @accel_mods: modifier key combination of the accelerator
|
||||
* @accel_flags: flag accelerators, e.g. %GTK_ACCEL_VISIBLE
|
||||
*
|
||||
* Installs an accelerator for this @widget in @accel_group that causes
|
||||
* @accel_signal to be emitted if the accelerator is activated.
|
||||
* The @accel_group needs to be added to the widget’s toplevel via
|
||||
* gtk_window_add_accel_group(), and the signal must be of type %G_SIGNAL_ACTION.
|
||||
* Accelerators added through this function are not user changeable during
|
||||
* runtime. If you want to support accelerators that can be changed by the
|
||||
* user, use gtk_accel_map_add_entry() and gtk_widget_set_accel_path() or
|
||||
* gtk_menu_item_set_accel_path() instead.
|
||||
*/
|
||||
void
|
||||
gtk_widget_add_accelerator (GtkWidget *widget,
|
||||
const gchar *accel_signal,
|
||||
GtkAccelGroup *accel_group,
|
||||
guint accel_key,
|
||||
GdkModifierType accel_mods,
|
||||
GtkAccelFlags accel_flags)
|
||||
{
|
||||
GClosure *closure;
|
||||
GSignalQuery query;
|
||||
|
||||
g_return_if_fail (GTK_IS_WIDGET (widget));
|
||||
g_return_if_fail (accel_signal != NULL);
|
||||
g_return_if_fail (GTK_IS_ACCEL_GROUP (accel_group));
|
||||
|
||||
g_signal_query (g_signal_lookup (accel_signal, G_OBJECT_TYPE (widget)), &query);
|
||||
if (!query.signal_id ||
|
||||
!(query.signal_flags & G_SIGNAL_ACTION) ||
|
||||
query.return_type != G_TYPE_NONE ||
|
||||
query.n_params)
|
||||
{
|
||||
/* hmm, should be elaborate enough */
|
||||
g_warning (G_STRLOC ": widget '%s' has no activatable signal \"%s\" without arguments",
|
||||
G_OBJECT_TYPE_NAME (widget), accel_signal);
|
||||
return;
|
||||
}
|
||||
|
||||
closure = widget_new_accel_closure (widget, query.signal_id);
|
||||
|
||||
g_object_ref (widget);
|
||||
|
||||
/* install the accelerator. since we don't map this onto an accel_path,
|
||||
* the accelerator will automatically be locked.
|
||||
*/
|
||||
gtk_accel_group_connect (accel_group,
|
||||
accel_key,
|
||||
accel_mods,
|
||||
accel_flags | GTK_ACCEL_LOCKED,
|
||||
closure);
|
||||
|
||||
g_signal_emit (widget, widget_signals[ACCEL_CLOSURES_CHANGED], 0);
|
||||
|
||||
g_object_unref (widget);
|
||||
}
|
||||
|
||||
/**
|
||||
* gtk_widget_remove_accelerator:
|
||||
* @widget: widget to install an accelerator on
|
||||
* @accel_group: accel group for this widget
|
||||
* @accel_key: GDK keyval of the accelerator
|
||||
* @accel_mods: modifier key combination of the accelerator
|
||||
*
|
||||
* Removes an accelerator from @widget, previously installed with
|
||||
* gtk_widget_add_accelerator().
|
||||
*
|
||||
* Returns: whether an accelerator was installed and could be removed
|
||||
*/
|
||||
gboolean
|
||||
gtk_widget_remove_accelerator (GtkWidget *widget,
|
||||
GtkAccelGroup *accel_group,
|
||||
guint accel_key,
|
||||
GdkModifierType accel_mods)
|
||||
{
|
||||
GtkAccelGroupEntry *ag_entry;
|
||||
GList *slist, *clist;
|
||||
guint n;
|
||||
|
||||
g_return_val_if_fail (GTK_IS_WIDGET (widget), FALSE);
|
||||
g_return_val_if_fail (GTK_IS_ACCEL_GROUP (accel_group), FALSE);
|
||||
|
||||
ag_entry = gtk_accel_group_query (accel_group, accel_key, accel_mods, &n);
|
||||
clist = gtk_widget_list_accel_closures (widget);
|
||||
for (slist = clist; slist; slist = slist->next)
|
||||
{
|
||||
guint i;
|
||||
|
||||
for (i = 0; i < n; i++)
|
||||
if (slist->data == (gpointer) ag_entry[i].closure)
|
||||
{
|
||||
gboolean is_removed = gtk_accel_group_disconnect (accel_group, slist->data);
|
||||
|
||||
g_signal_emit (widget, widget_signals[ACCEL_CLOSURES_CHANGED], 0);
|
||||
|
||||
g_list_free (clist);
|
||||
|
||||
return is_removed;
|
||||
}
|
||||
}
|
||||
g_list_free (clist);
|
||||
|
||||
g_warning (G_STRLOC ": no accelerator (%u,%u) installed in accel group (%p) for %s (%p)",
|
||||
accel_key, accel_mods, accel_group,
|
||||
G_OBJECT_TYPE_NAME (widget), widget);
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/**
|
||||
* gtk_widget_list_accel_closures:
|
||||
* @widget: widget to list accelerator closures for
|
||||
*
|
||||
* Lists the closures used by @widget for accelerator group connections
|
||||
* with gtk_accel_group_connect_by_path() or gtk_accel_group_connect().
|
||||
* The closures can be used to monitor accelerator changes on @widget,
|
||||
* by connecting to the @GtkAccelGroup::accel-changed signal of the
|
||||
* #GtkAccelGroup of a closure which can be found out with
|
||||
* gtk_accel_group_from_accel_closure().
|
||||
*
|
||||
* Returns: (transfer container) (element-type GClosure):
|
||||
* a newly allocated #GList of closures
|
||||
*/
|
||||
GList*
|
||||
gtk_widget_list_accel_closures (GtkWidget *widget)
|
||||
{
|
||||
GSList *slist;
|
||||
GList *clist = NULL;
|
||||
|
||||
g_return_val_if_fail (GTK_IS_WIDGET (widget), NULL);
|
||||
|
||||
for (slist = g_object_get_qdata (G_OBJECT (widget), quark_accel_closures); slist; slist = slist->next)
|
||||
if (gtk_accel_group_from_accel_closure (slist->data))
|
||||
clist = g_list_prepend (clist, slist->data);
|
||||
return clist;
|
||||
}
|
||||
|
||||
typedef struct {
|
||||
GQuark path_quark;
|
||||
GtkAccelGroup *accel_group;
|
||||
GClosure *closure;
|
||||
} AccelPath;
|
||||
|
||||
static void
|
||||
destroy_accel_path (gpointer data)
|
||||
{
|
||||
AccelPath *apath = data;
|
||||
|
||||
gtk_accel_group_disconnect (apath->accel_group, apath->closure);
|
||||
|
||||
/* closures_destroy takes care of unrefing the closure */
|
||||
g_object_unref (apath->accel_group);
|
||||
|
||||
g_slice_free (AccelPath, apath);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* gtk_widget_set_accel_path:
|
||||
* @widget: a #GtkWidget
|
||||
* @accel_path: (allow-none): path used to look up the accelerator
|
||||
* @accel_group: (allow-none): a #GtkAccelGroup.
|
||||
*
|
||||
* Given an accelerator group, @accel_group, and an accelerator path,
|
||||
* @accel_path, sets up an accelerator in @accel_group so whenever the
|
||||
* key binding that is defined for @accel_path is pressed, @widget
|
||||
* will be activated. This removes any accelerators (for any
|
||||
* accelerator group) installed by previous calls to
|
||||
* gtk_widget_set_accel_path(). Associating accelerators with
|
||||
* paths allows them to be modified by the user and the modifications
|
||||
* to be saved for future use. (See gtk_accel_map_save().)
|
||||
*
|
||||
* This function is a low level function that would most likely
|
||||
* be used by a menu creation system.
|
||||
*
|
||||
* If you only want to
|
||||
* set up accelerators on menu items gtk_menu_item_set_accel_path()
|
||||
* provides a somewhat more convenient interface.
|
||||
*
|
||||
* 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_widget_set_accel_path (GtkWidget *widget,
|
||||
const gchar *accel_path,
|
||||
GtkAccelGroup *accel_group)
|
||||
{
|
||||
AccelPath *apath;
|
||||
|
||||
g_return_if_fail (GTK_IS_WIDGET (widget));
|
||||
g_return_if_fail (GTK_WIDGET_GET_CLASS (widget)->activate_signal != 0);
|
||||
|
||||
if (accel_path)
|
||||
{
|
||||
g_return_if_fail (GTK_IS_ACCEL_GROUP (accel_group));
|
||||
g_return_if_fail (_gtk_accel_path_is_valid (accel_path));
|
||||
|
||||
gtk_accel_map_add_entry (accel_path, 0, 0);
|
||||
apath = g_slice_new (AccelPath);
|
||||
apath->accel_group = g_object_ref (accel_group);
|
||||
apath->path_quark = g_quark_from_string (accel_path);
|
||||
apath->closure = widget_new_accel_closure (widget, GTK_WIDGET_GET_CLASS (widget)->activate_signal);
|
||||
}
|
||||
else
|
||||
apath = NULL;
|
||||
|
||||
/* also removes possible old settings */
|
||||
g_object_set_qdata_full (G_OBJECT (widget), quark_accel_path, apath, destroy_accel_path);
|
||||
|
||||
if (apath)
|
||||
gtk_accel_group_connect_by_path (apath->accel_group, g_quark_to_string (apath->path_quark), apath->closure);
|
||||
|
||||
g_signal_emit (widget, widget_signals[ACCEL_CLOSURES_CHANGED], 0);
|
||||
}
|
||||
|
||||
const gchar*
|
||||
_gtk_widget_get_accel_path (GtkWidget *widget,
|
||||
gboolean *locked)
|
||||
{
|
||||
AccelPath *apath;
|
||||
|
||||
g_return_val_if_fail (GTK_IS_WIDGET (widget), NULL);
|
||||
|
||||
apath = g_object_get_qdata (G_OBJECT (widget), quark_accel_path);
|
||||
if (locked)
|
||||
*locked = apath ? gtk_accel_group_get_is_locked (apath->accel_group) : TRUE;
|
||||
return apath ? g_quark_to_string (apath->path_quark) : NULL;
|
||||
}
|
||||
|
||||
/**
|
||||
* gtk_widget_mnemonic_activate:
|
||||
* @widget: a #GtkWidget
|
||||
@@ -5366,11 +5250,6 @@ gtk_widget_event_internal (GtkWidget *widget,
|
||||
return_val |= gtk_widget_run_controllers (widget, event_copy, GTK_PHASE_BUBBLE);
|
||||
g_object_unref (event_copy);
|
||||
|
||||
if (return_val == FALSE &&
|
||||
(event->any.type == GDK_KEY_PRESS ||
|
||||
event->any.type == GDK_KEY_RELEASE))
|
||||
return_val |= gtk_bindings_activate_event (G_OBJECT (widget), (GdkEventKey *) event);
|
||||
|
||||
return return_val;
|
||||
}
|
||||
|
||||
@@ -8137,10 +8016,6 @@ gtk_widget_real_destroy (GtkWidget *object)
|
||||
priv->accessible = NULL;
|
||||
}
|
||||
|
||||
/* wipe accelerator closures (keep order) */
|
||||
g_object_set_qdata (G_OBJECT (widget), quark_accel_path, NULL);
|
||||
g_object_set_qdata (G_OBJECT (widget), quark_accel_closures, NULL);
|
||||
|
||||
/* Callers of add_mnemonic_label() should disconnect on ::destroy */
|
||||
g_object_set_qdata (G_OBJECT (widget), quark_mnemonic_labels, NULL);
|
||||
|
||||
@@ -9737,90 +9612,6 @@ static const GMarkupParser accessibility_parser =
|
||||
accessibility_text,
|
||||
};
|
||||
|
||||
typedef struct
|
||||
{
|
||||
GObject *object;
|
||||
GtkBuilder *builder;
|
||||
guint key;
|
||||
guint modifiers;
|
||||
gchar *signal;
|
||||
} AccelGroupParserData;
|
||||
|
||||
static void
|
||||
accel_group_start_element (GMarkupParseContext *context,
|
||||
const gchar *element_name,
|
||||
const gchar **names,
|
||||
const gchar **values,
|
||||
gpointer user_data,
|
||||
GError **error)
|
||||
{
|
||||
AccelGroupParserData *data = (AccelGroupParserData*)user_data;
|
||||
|
||||
if (strcmp (element_name, "accelerator") == 0)
|
||||
{
|
||||
const gchar *key_str = NULL;
|
||||
const gchar *signal = NULL;
|
||||
const gchar *modifiers_str = NULL;
|
||||
guint key = 0;
|
||||
guint modifiers = 0;
|
||||
|
||||
if (!_gtk_builder_check_parent (data->builder, context, "object", error))
|
||||
return;
|
||||
|
||||
if (!g_markup_collect_attributes (element_name, names, values, error,
|
||||
G_MARKUP_COLLECT_STRING, "key", &key_str,
|
||||
G_MARKUP_COLLECT_STRING, "signal", &signal,
|
||||
G_MARKUP_COLLECT_STRING|G_MARKUP_COLLECT_OPTIONAL, "modifiers", &modifiers_str,
|
||||
G_MARKUP_COLLECT_INVALID))
|
||||
{
|
||||
_gtk_builder_prefix_error (data->builder, context, error);
|
||||
return;
|
||||
}
|
||||
|
||||
key = gdk_keyval_from_name (key_str);
|
||||
if (key == 0)
|
||||
{
|
||||
g_set_error (error,
|
||||
GTK_BUILDER_ERROR, GTK_BUILDER_ERROR_INVALID_VALUE,
|
||||
"Could not parse key '%s'", key_str);
|
||||
_gtk_builder_prefix_error (data->builder, context, error);
|
||||
return;
|
||||
}
|
||||
|
||||
if (modifiers_str != NULL)
|
||||
{
|
||||
GFlagsValue aliases[2] = {
|
||||
{ 0, "primary", "primary" },
|
||||
{ 0, NULL, NULL }
|
||||
};
|
||||
|
||||
aliases[0].value = _gtk_get_primary_accel_mod ();
|
||||
|
||||
if (!_gtk_builder_flags_from_string (GDK_TYPE_MODIFIER_TYPE, aliases,
|
||||
modifiers_str, &modifiers, error))
|
||||
{
|
||||
_gtk_builder_prefix_error (data->builder, context, error);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
data->key = key;
|
||||
data->modifiers = modifiers;
|
||||
data->signal = g_strdup (signal);
|
||||
}
|
||||
else
|
||||
{
|
||||
_gtk_builder_error_unhandled_tag (data->builder, context,
|
||||
"GtkWidget", element_name,
|
||||
error);
|
||||
}
|
||||
}
|
||||
|
||||
static const GMarkupParser accel_group_parser =
|
||||
{
|
||||
accel_group_start_element,
|
||||
};
|
||||
|
||||
typedef struct
|
||||
{
|
||||
GtkBuilder *builder;
|
||||
@@ -10023,20 +9814,6 @@ gtk_widget_buildable_custom_tag_start (GtkBuildable *buildable,
|
||||
GMarkupParser *parser,
|
||||
gpointer *parser_data)
|
||||
{
|
||||
if (strcmp (tagname, "accelerator") == 0)
|
||||
{
|
||||
AccelGroupParserData *data;
|
||||
|
||||
data = g_slice_new0 (AccelGroupParserData);
|
||||
data->object = (GObject *)g_object_ref (buildable);
|
||||
data->builder = builder;
|
||||
|
||||
*parser = accel_group_parser;
|
||||
*parser_data = data;
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
if (strcmp (tagname, "accessibility") == 0)
|
||||
{
|
||||
AccessibilitySubParserData *data;
|
||||
@@ -10089,44 +9866,6 @@ gtk_widget_buildable_custom_tag_end (GtkBuildable *buildable,
|
||||
{
|
||||
}
|
||||
|
||||
void
|
||||
_gtk_widget_buildable_finish_accelerator (GtkWidget *widget,
|
||||
GtkWidget *toplevel,
|
||||
gpointer user_data)
|
||||
{
|
||||
AccelGroupParserData *accel_data;
|
||||
GSList *accel_groups;
|
||||
GtkAccelGroup *accel_group;
|
||||
|
||||
g_return_if_fail (GTK_IS_WIDGET (widget));
|
||||
g_return_if_fail (GTK_IS_WIDGET (toplevel));
|
||||
g_return_if_fail (user_data != NULL);
|
||||
|
||||
accel_data = (AccelGroupParserData*)user_data;
|
||||
accel_groups = gtk_accel_groups_from_object (G_OBJECT (toplevel));
|
||||
if (g_slist_length (accel_groups) == 0)
|
||||
{
|
||||
accel_group = gtk_accel_group_new ();
|
||||
gtk_window_add_accel_group (GTK_WINDOW (toplevel), accel_group);
|
||||
}
|
||||
else
|
||||
{
|
||||
g_assert (g_slist_length (accel_groups) == 1);
|
||||
accel_group = g_slist_nth_data (accel_groups, 0);
|
||||
}
|
||||
|
||||
gtk_widget_add_accelerator (GTK_WIDGET (accel_data->object),
|
||||
accel_data->signal,
|
||||
accel_group,
|
||||
accel_data->key,
|
||||
accel_data->modifiers,
|
||||
GTK_ACCEL_VISIBLE);
|
||||
|
||||
g_object_unref (accel_data->object);
|
||||
g_free (accel_data->signal);
|
||||
g_slice_free (AccelGroupParserData, accel_data);
|
||||
}
|
||||
|
||||
static void
|
||||
gtk_widget_buildable_finish_layout_properties (GtkWidget *widget,
|
||||
GtkWidget *parent,
|
||||
@@ -10200,19 +9939,7 @@ gtk_widget_buildable_custom_finished (GtkBuildable *buildable,
|
||||
const gchar *tagname,
|
||||
gpointer user_data)
|
||||
{
|
||||
if (strcmp (tagname, "accelerator") == 0)
|
||||
{
|
||||
AccelGroupParserData *accel_data;
|
||||
GtkWidget *toplevel;
|
||||
|
||||
accel_data = (AccelGroupParserData*)user_data;
|
||||
g_assert (accel_data->object);
|
||||
|
||||
toplevel = _gtk_widget_get_toplevel (GTK_WIDGET (accel_data->object));
|
||||
|
||||
_gtk_widget_buildable_finish_accelerator (GTK_WIDGET (buildable), toplevel, user_data);
|
||||
}
|
||||
else if (strcmp (tagname, "accessibility") == 0)
|
||||
if (strcmp (tagname, "accessibility") == 0)
|
||||
{
|
||||
AccessibilitySubParserData *a11y_data;
|
||||
|
||||
@@ -12821,6 +12548,27 @@ gtk_widget_remove_controller (GtkWidget *widget,
|
||||
gtk_list_list_model_item_removed (priv->controller_observer, before);
|
||||
}
|
||||
|
||||
GList *
|
||||
_gtk_widget_list_controllers (GtkWidget *widget,
|
||||
GtkPropagationPhase phase)
|
||||
{
|
||||
GtkWidgetPrivate *priv = gtk_widget_get_instance_private (widget);
|
||||
GList *l, *retval = NULL;
|
||||
|
||||
g_return_val_if_fail (GTK_IS_WIDGET (widget), NULL);
|
||||
|
||||
for (l = priv->event_controllers; l; l = l->next)
|
||||
{
|
||||
GtkEventController *controller = l->data;
|
||||
|
||||
if (controller != NULL &&
|
||||
phase == gtk_event_controller_get_propagation_phase (controller))
|
||||
retval = g_list_prepend (retval, controller);
|
||||
}
|
||||
|
||||
return retval;
|
||||
}
|
||||
|
||||
gboolean
|
||||
_gtk_widget_consumes_motion (GtkWidget *widget,
|
||||
GdkEventSequence *sequence)
|
||||
|
||||
+19
-15
@@ -33,6 +33,8 @@
|
||||
#include <gsk/gsk.h>
|
||||
#include <gtk/gtkaccelgroup.h>
|
||||
#include <gtk/gtkborder.h>
|
||||
#include <gtk/gtkshortcut.h>
|
||||
#include <gtk/gtkshortcutaction.h>
|
||||
#include <gtk/gtktypes.h>
|
||||
#include <atk/atk.h>
|
||||
|
||||
@@ -421,23 +423,25 @@ GDK_AVAILABLE_IN_ALL
|
||||
GType gtk_widget_class_get_layout_manager_type (GtkWidgetClass *widget_class);
|
||||
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
void gtk_widget_add_accelerator (GtkWidget *widget,
|
||||
const gchar *accel_signal,
|
||||
GtkAccelGroup *accel_group,
|
||||
guint accel_key,
|
||||
GdkModifierType accel_mods,
|
||||
GtkAccelFlags accel_flags);
|
||||
void gtk_widget_class_add_binding (GtkWidgetClass *widget_class,
|
||||
guint keyval,
|
||||
GdkModifierType mods,
|
||||
GtkShortcutFunc callback,
|
||||
const gchar *format_string,
|
||||
...);
|
||||
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
gboolean gtk_widget_remove_accelerator (GtkWidget *widget,
|
||||
GtkAccelGroup *accel_group,
|
||||
guint accel_key,
|
||||
GdkModifierType accel_mods);
|
||||
void gtk_widget_class_add_binding_signal
|
||||
(GtkWidgetClass *widget_class,
|
||||
GdkModifierType mods,
|
||||
guint keyval,
|
||||
const gchar *signal,
|
||||
const gchar *format_string,
|
||||
...);
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
void gtk_widget_set_accel_path (GtkWidget *widget,
|
||||
const gchar *accel_path,
|
||||
GtkAccelGroup *accel_group);
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
GList* gtk_widget_list_accel_closures (GtkWidget *widget);
|
||||
void gtk_widget_class_add_shortcut (GtkWidgetClass *widget_class,
|
||||
GtkShortcut *shortcut);
|
||||
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
gboolean gtk_widget_can_activate_accel (GtkWidget *widget,
|
||||
guint signal_id);
|
||||
|
||||
@@ -275,9 +275,6 @@ void _gtk_widget_synthesize_crossing (GtkWidget *fro
|
||||
GdkDevice *device,
|
||||
GdkCrossingMode mode);
|
||||
|
||||
void _gtk_widget_buildable_finish_accelerator (GtkWidget *widget,
|
||||
GtkWidget *toplevel,
|
||||
gpointer user_data);
|
||||
GtkStyleContext * _gtk_widget_peek_style_context (GtkWidget *widget);
|
||||
|
||||
typedef gboolean (*GtkCapturedEventHandler) (GtkWidget *widget, GdkEvent *event);
|
||||
@@ -296,6 +293,8 @@ void _gtk_widget_update_parent_muxer (GtkWidget *widget
|
||||
GtkActionMuxer * _gtk_widget_get_action_muxer (GtkWidget *widget,
|
||||
gboolean create);
|
||||
|
||||
GList * _gtk_widget_list_controllers (GtkWidget *widget,
|
||||
GtkPropagationPhase phase);
|
||||
gboolean _gtk_widget_consumes_motion (GtkWidget *widget,
|
||||
GdkEventSequence *sequence);
|
||||
|
||||
|
||||
+126
-695
File diff suppressed because it is too large
Load Diff
@@ -149,12 +149,6 @@ GDK_AVAILABLE_IN_ALL
|
||||
void gtk_window_set_startup_id (GtkWindow *window,
|
||||
const gchar *startup_id);
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
void gtk_window_add_accel_group (GtkWindow *window,
|
||||
GtkAccelGroup *accel_group);
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
void gtk_window_remove_accel_group (GtkWindow *window,
|
||||
GtkAccelGroup *accel_group);
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
void gtk_window_set_position (GtkWindow *window,
|
||||
GtkWindowPosition position);
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
@@ -265,31 +259,6 @@ GDK_AVAILABLE_IN_ALL
|
||||
void gtk_window_set_has_user_ref_count (GtkWindow *window,
|
||||
gboolean setting);
|
||||
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
void gtk_window_add_mnemonic (GtkWindow *window,
|
||||
guint keyval,
|
||||
GtkWidget *target);
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
void gtk_window_remove_mnemonic (GtkWindow *window,
|
||||
guint keyval,
|
||||
GtkWidget *target);
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
gboolean gtk_window_mnemonic_activate (GtkWindow *window,
|
||||
guint keyval,
|
||||
GdkModifierType modifier);
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
void gtk_window_set_mnemonic_modifier (GtkWindow *window,
|
||||
GdkModifierType modifier);
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
GdkModifierType gtk_window_get_mnemonic_modifier (GtkWindow *window);
|
||||
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
gboolean gtk_window_activate_key (GtkWindow *window,
|
||||
GdkEventKey *event);
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
gboolean gtk_window_propagate_key_event (GtkWindow *window,
|
||||
GdkEventKey *event);
|
||||
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
void gtk_window_present (GtkWindow *window);
|
||||
GDK_AVAILABLE_IN_ALL
|
||||
|
||||
@@ -56,7 +56,6 @@ void gtk_window_check_resize (GtkWindow *self);
|
||||
typedef void (*GtkWindowKeysForeachFunc) (GtkWindow *window,
|
||||
guint keyval,
|
||||
GdkModifierType modifiers,
|
||||
gboolean is_mnemonic,
|
||||
gpointer data);
|
||||
|
||||
gboolean gtk_window_emit_close_request (GtkWindow *window);
|
||||
|
||||
+11
-5
@@ -119,7 +119,6 @@ gtk_private_sources = files([
|
||||
'gtkmenusectionbox.c',
|
||||
'gtkmenutracker.c',
|
||||
'gtkmenutrackeritem.c',
|
||||
'gtkmnemonichash.c',
|
||||
'gtkpango.c',
|
||||
'gskpango.c',
|
||||
'gtkpathbar.c',
|
||||
@@ -150,7 +149,6 @@ gtk_public_sources = files([
|
||||
'gtkaboutdialog.c',
|
||||
'gtkaccelgroup.c',
|
||||
'gtkaccellabel.c',
|
||||
'gtkaccelmap.c',
|
||||
'gtkaccessible.c',
|
||||
'gtkactionable.c',
|
||||
'gtkactionbar.c',
|
||||
@@ -165,7 +163,6 @@ gtk_public_sources = files([
|
||||
'gtkassistant.c',
|
||||
'gtkbin.c',
|
||||
'gtkbinlayout.c',
|
||||
'gtkbindings.c',
|
||||
'gtkborder.c',
|
||||
'gtkboxlayout.c',
|
||||
'gtkbox.c',
|
||||
@@ -199,6 +196,7 @@ gtk_public_sources = files([
|
||||
'gtkcombobox.c',
|
||||
'gtkcomboboxtext.c',
|
||||
'gtkcomposetable.c',
|
||||
'gtkconcatmodel.c',
|
||||
'gtkcontainer.c',
|
||||
'gtkcssprovider.c',
|
||||
'gtkdialog.c',
|
||||
@@ -330,11 +328,16 @@ gtk_public_sources = files([
|
||||
'gtkseparatormenuitem.c',
|
||||
'gtkseparatortoolitem.c',
|
||||
'gtksettings.c',
|
||||
'gtkshortcut.c',
|
||||
'gtkshortcutaction.c',
|
||||
'gtkshortcutcontroller.c',
|
||||
'gtkshortcutlabel.c',
|
||||
'gtkshortcutmanager.c',
|
||||
'gtkshortcutsgroup.c',
|
||||
'gtkshortcutssection.c',
|
||||
'gtkshortcutsshortcut.c',
|
||||
'gtkshortcutswindow.c',
|
||||
'gtkshortcuttrigger.c',
|
||||
'gtkshow.c',
|
||||
'gtksidebarrow.c',
|
||||
'gtksingleselection.c',
|
||||
@@ -408,7 +411,6 @@ gtk_public_headers = files([
|
||||
'gtkaboutdialog.h',
|
||||
'gtkaccelgroup.h',
|
||||
'gtkaccellabel.h',
|
||||
'gtkaccelmap.h',
|
||||
'gtkaccessible.h',
|
||||
'gtkactionable.h',
|
||||
'gtkactionbar.h',
|
||||
@@ -423,7 +425,6 @@ gtk_public_headers = files([
|
||||
'gtkassistant.h',
|
||||
'gtkbin.h',
|
||||
'gtkbinlayout.h',
|
||||
'gtkbindings.h',
|
||||
'gtkborder.h',
|
||||
'gtkbox.h',
|
||||
'gtkboxlayout.h',
|
||||
@@ -574,11 +575,16 @@ gtk_public_headers = files([
|
||||
'gtkseparatormenuitem.h',
|
||||
'gtkseparatortoolitem.h',
|
||||
'gtksettings.h',
|
||||
'gtkshortcut.h',
|
||||
'gtkshortcutaction.h',
|
||||
'gtkshortcutcontroller.h',
|
||||
'gtkshortcutlabel.h',
|
||||
'gtkshortcutmanager.h',
|
||||
'gtkshortcutsgroup.h',
|
||||
'gtkshortcutssection.h',
|
||||
'gtkshortcutsshortcut.h',
|
||||
'gtkshortcutswindow.h',
|
||||
'gtkshortcuttrigger.h',
|
||||
'gtkshow.h',
|
||||
'gtksingleselection.h',
|
||||
'gtksizegroup.h',
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user