[gtk+] Add an example for accelerators with manual image menuitems



commit cbf5b49cb8692d0743706cc5f535e3ed01049c08
Author: Matthias Clasen <mclasen redhat com>
Date:   Fri Mar 6 20:33:38 2015 -0500

    Add an example for accelerators with manual image menuitems
    
    This is somewhat tricky to work out, so put some example
    code here for future reference. The tricky part is that
    GtkAccelLabel tries to be smart about hiding the accel
    if there's not enough space, so we have to make sure to
    pack the label with expand=TRUE and set align=GTK_ALIGN_FILL,
    or things won't work.

 tests/teststockbuttonmenu.c |   22 +++++++++++++++++++---
 1 files changed, 19 insertions(+), 3 deletions(-)
---
diff --git a/tests/teststockbuttonmenu.c b/tests/teststockbuttonmenu.c
index d36790f..1095028 100644
--- a/tests/teststockbuttonmenu.c
+++ b/tests/teststockbuttonmenu.c
@@ -10,8 +10,10 @@ int main (int argc, char **argv)
        GtkWidget *menu;
        GtkWidget *item;
        GtkWidget *box;
+       GtkWidget *label;
        GtkAction *action1;
        GtkAction *action2;
+        GtkAccelGroup *accel_group;
 
        gtk_init (&argc, &argv);
 
@@ -21,6 +23,9 @@ int main (int argc, char **argv)
 
        window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
 
+        accel_group = gtk_accel_group_new ();
+        gtk_window_add_accel_group (GTK_WINDOW (window), accel_group);
+
        grid = gtk_grid_new ();
        gtk_container_add (GTK_CONTAINER (window), grid);
 
@@ -58,6 +63,9 @@ int main (int argc, char **argv)
         gtk_container_add (GTK_CONTAINER (grid), button);
 
        menu = gtk_menu_new ();
+        gtk_menu_set_accel_group (GTK_MENU (menu), accel_group);
+        gtk_menu_set_accel_path (GTK_MENU (menu), "<menu>/TEST");
+
        gtk_menu_button_set_popup (GTK_MENU_BUTTON (button), menu);
 
        /* plain old stock menuitem */
@@ -65,7 +73,7 @@ int main (int argc, char **argv)
        gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
 
        /* gtk_image_menu_item_set_always_show_image still works */
-       item = gtk_image_menu_item_new_from_stock (GTK_STOCK_CLOSE, NULL);
+       item = gtk_image_menu_item_new_from_stock (GTK_STOCK_CLOSE, accel_group);
        gtk_image_menu_item_set_always_show_image (GTK_IMAGE_MENU_ITEM (item), TRUE);
        gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
 
@@ -74,9 +82,17 @@ int main (int argc, char **argv)
        box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 12);
        gtk_container_add (GTK_CONTAINER (item), box);
        gtk_container_add (GTK_CONTAINER (box), gtk_image_new_from_icon_name ("edit-clear", 
GTK_ICON_SIZE_MENU));
-       gtk_container_add (GTK_CONTAINER (box), gtk_label_new_with_mnemonic ("_Clear"));
+        label = gtk_accel_label_new ("C_lear");
+        gtk_label_set_use_underline (GTK_LABEL (label), TRUE);
+        gtk_label_set_xalign (GTK_LABEL (label), 0.0);
+        gtk_widget_set_halign (label, GTK_ALIGN_FILL);
+
+        gtk_widget_add_accelerator (item, "activate", accel_group,
+                                    GDK_KEY_x, GDK_CONTROL_MASK, GTK_ACCEL_VISIBLE);
+        gtk_accel_label_set_accel_widget (GTK_ACCEL_LABEL (label), item);
+       gtk_box_pack_end (GTK_BOX (box), label, TRUE, TRUE, 0);
        gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
-       
+
        /* GtkAction-backed menuitem */
        item = gtk_image_menu_item_new ();
        gtk_activatable_set_related_action (GTK_ACTIVATABLE (item), action1);


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