diff options
author | Matthias Clasen <mclasen@redhat.com> | 2010-03-08 19:59:24 -0500 |
---|---|---|
committer | Matthias Clasen <mclasen@redhat.com> | 2010-03-08 19:59:24 -0500 |
commit | c744594b2099d03af6b7654de6c8ed5565acd1a9 (patch) | |
tree | be939e306add7118829b1416b722bc003fc5c7d5 /demos | |
parent | ac6525b27c3f8a98dfabfec12c98c724dfb7b28a (diff) | |
download | gtk+-c744594b2099d03af6b7654de6c8ed5565acd1a9.tar.gz |
Add accessible alternatives to entry icon functionality
Inspired by the complaint in bug 611051.
Diffstat (limited to 'demos')
-rw-r--r-- | demos/gtk-demo/search_entry.c | 224 |
1 files changed, 138 insertions, 86 deletions
diff --git a/demos/gtk-demo/search_entry.c b/demos/gtk-demo/search_entry.c index e0236b1110..4a726f5ce9 100644 --- a/demos/gtk-demo/search_entry.c +++ b/demos/gtk-demo/search_entry.c @@ -1,6 +1,6 @@ -/* Entry/Search Entry +/* Entry/Search Entry * - * GtkEntry allows to display icons and progress information. + * GtkEntry allows to display icons and progress information. * This demo shows how to use these features in a search entry. */ @@ -45,21 +45,21 @@ finish_search (GtkButton *button) show_find_button (); g_source_remove (search_progress_id); search_progress_id = 0; - + return FALSE; } static gboolean start_search_feedback (gpointer data) { - search_progress_id = g_timeout_add_full (G_PRIORITY_DEFAULT, 100, + search_progress_id = g_timeout_add_full (G_PRIORITY_DEFAULT, 100, (GSourceFunc)search_progress, data, (GDestroyNotify)search_progress_done); return FALSE; } static void -start_search (GtkButton *button, +start_search (GtkButton *button, GtkEntry *entry) { show_cancel_button (); @@ -77,45 +77,13 @@ stop_search (GtkButton *button, } static void -icon_press_cb (GtkEntry *entry, - gint position, - GdkEventButton *event, - gpointer data) -{ - if (position == GTK_ENTRY_ICON_PRIMARY) - gtk_menu_popup (GTK_MENU (menu), NULL, NULL, NULL, NULL, - event->button, event->time); - else - gtk_entry_set_text (entry, ""); -} - -static void -text_changed_cb (GtkEntry *entry, - GParamSpec *pspec, - GtkWidget *button) +clear_entry (GtkEntry *entry) { - gboolean has_text; - - has_text = gtk_entry_get_text_length (entry) > 0; - gtk_entry_set_icon_sensitive (entry, - GTK_ENTRY_ICON_SECONDARY, - has_text); - gtk_widget_set_sensitive (button, has_text); + gtk_entry_set_text (entry, ""); } static void -activate_cb (GtkEntry *entry, - GtkButton *button) -{ - if (search_progress_id != 0) - return; - - start_search (button, entry); - -} - -static void -search_by_name (GtkWidget *item, +search_by_name (GtkWidget *item, GtkEntry *entry) { gtk_entry_set_icon_from_stock (entry, @@ -125,10 +93,10 @@ search_by_name (GtkWidget *item, GTK_ENTRY_ICON_PRIMARY, "Search by name\n" "Click here to change the search type"); -} - +} + static void -search_by_description (GtkWidget *item, +search_by_description (GtkWidget *item, GtkEntry *entry) { gtk_entry_set_icon_from_stock (entry, @@ -138,10 +106,10 @@ search_by_description (GtkWidget *item, GTK_ENTRY_ICON_PRIMARY, "Search by description\n" "Click here to change the search type"); -} - +} + static void -search_by_file (GtkWidget *item, +search_by_file (GtkWidget *item, GtkEntry *entry) { gtk_entry_set_icon_from_stock (entry, @@ -151,7 +119,83 @@ search_by_file (GtkWidget *item, GTK_ENTRY_ICON_PRIMARY, "Search by file name\n" "Click here to change the search type"); -} +} + +GtkWidget * +create_search_menu (GtkWidget *entry) +{ + GtkWidget *menu; + GtkWidget *item; + GtkWidget *image; + + menu = gtk_menu_new (); + + item = gtk_image_menu_item_new_with_mnemonic ("Search by _name"); + image = gtk_image_new_from_stock (GTK_STOCK_FIND, GTK_ICON_SIZE_MENU); + gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (item), image); + gtk_image_menu_item_set_always_show_image (GTK_IMAGE_MENU_ITEM (item), TRUE); + g_signal_connect (item, "activate", + G_CALLBACK (search_by_name), entry); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); + + item = gtk_image_menu_item_new_with_mnemonic ("Search by _description"); + image = gtk_image_new_from_stock (GTK_STOCK_EDIT, GTK_ICON_SIZE_MENU); + gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (item), image); + gtk_image_menu_item_set_always_show_image (GTK_IMAGE_MENU_ITEM (item), TRUE); + g_signal_connect (item, "activate", + G_CALLBACK (search_by_description), entry); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); + + item = gtk_image_menu_item_new_with_mnemonic ("Search by _file name"); + image = gtk_image_new_from_stock (GTK_STOCK_OPEN, GTK_ICON_SIZE_MENU); + gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (item), image); + gtk_image_menu_item_set_always_show_image (GTK_IMAGE_MENU_ITEM (item), TRUE); + g_signal_connect (item, "activate", + G_CALLBACK (search_by_file), entry); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); + + gtk_widget_show_all (menu); + + return menu; +} + +static void +icon_press_cb (GtkEntry *entry, + gint position, + GdkEventButton *event, + gpointer data) +{ + if (position == GTK_ENTRY_ICON_PRIMARY) + gtk_menu_popup (GTK_MENU (menu), NULL, NULL, NULL, NULL, + event->button, event->time); + else + clear_entry (entry); +} + +static void +text_changed_cb (GtkEntry *entry, + GParamSpec *pspec, + GtkWidget *button) +{ + gboolean has_text; + + has_text = gtk_entry_get_text_length (entry) > 0; + gtk_entry_set_icon_sensitive (entry, + GTK_ENTRY_ICON_SECONDARY, + has_text); + gtk_widget_set_sensitive (button, has_text); +} + +static void +activate_cb (GtkEntry *entry, + GtkButton *button) +{ + if (search_progress_id != 0) + return; + + start_search (button, entry); + +} static void search_entry_destroyed (GtkWidget *widget) @@ -165,7 +209,35 @@ search_entry_destroyed (GtkWidget *widget) window = NULL; } - +static void +entry_populate_popup (GtkEntry *entry, + GtkMenu *menu, + gpointer user_data) +{ + GtkWidget *item; + GtkWidget *search_menu; + gboolean has_text; + + has_text = gtk_entry_get_text_length (entry) > 0; + + item = gtk_separator_menu_item_new (); + gtk_widget_show (item); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); + + item = gtk_menu_item_new_with_mnemonic ("C_lear"); + gtk_widget_show (item); + g_signal_connect_swapped (item, "activate", + G_CALLBACK (clear_entry), entry); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); + gtk_widget_set_sensitive (item, has_text); + + search_menu = create_search_menu (GTK_WIDGET (entry)); + item = gtk_menu_item_new_with_label ("Search by"); + gtk_widget_show (item); + gtk_menu_item_set_submenu (GTK_MENU_ITEM (item), search_menu); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); +} + GtkWidget * do_search_entry (GtkWidget *do_widget) { @@ -173,19 +245,17 @@ do_search_entry (GtkWidget *do_widget) GtkWidget *hbox; GtkWidget *label; GtkWidget *entry; - GtkWidget *item; - GtkWidget *image; GtkWidget *find_button; GtkWidget *cancel_button; - + if (!window) { window = gtk_dialog_new_with_buttons ("Search Entry", GTK_WINDOW (do_widget), - 0, - GTK_STOCK_CLOSE, - GTK_RESPONSE_NONE, - NULL); + 0, + GTK_STOCK_CLOSE, + GTK_RESPONSE_NONE, + NULL); gtk_window_set_resizable (GTK_WINDOW (window), FALSE); g_signal_connect (window, "response", @@ -216,58 +286,42 @@ do_search_entry (GtkWidget *do_widget) gtk_box_pack_start (GTK_BOX (hbox), notebook, FALSE, FALSE, 0); find_button = gtk_button_new_with_label ("Find"); - g_signal_connect (find_button, "clicked", + g_signal_connect (find_button, "clicked", G_CALLBACK (start_search), entry); gtk_notebook_append_page (GTK_NOTEBOOK (notebook), find_button, NULL); gtk_widget_show (find_button); cancel_button = gtk_button_new_with_label ("Cancel"); - g_signal_connect (cancel_button, "clicked", + g_signal_connect (cancel_button, "clicked", G_CALLBACK (stop_search), NULL); gtk_notebook_append_page (GTK_NOTEBOOK (notebook), cancel_button, NULL); gtk_widget_show (cancel_button); /* Set up the search icon */ search_by_name (NULL, GTK_ENTRY (entry)); - + /* Set up the clear icon */ - gtk_entry_set_icon_from_stock (GTK_ENTRY (entry), - GTK_ENTRY_ICON_SECONDARY, + gtk_entry_set_icon_from_stock (GTK_ENTRY (entry), + GTK_ENTRY_ICON_SECONDARY, GTK_STOCK_CLEAR); text_changed_cb (GTK_ENTRY (entry), NULL, find_button); - g_signal_connect (entry, "icon-press", + g_signal_connect (entry, "icon-press", G_CALLBACK (icon_press_cb), NULL); - g_signal_connect (entry, "notify::text", + g_signal_connect (entry, "notify::text", G_CALLBACK (text_changed_cb), find_button); - g_signal_connect (entry, "activate", + g_signal_connect (entry, "activate", G_CALLBACK (activate_cb), NULL); /* Create the menu */ - menu = gtk_menu_new (); + menu = create_search_menu (entry); gtk_menu_attach_to_widget (GTK_MENU (menu), entry, NULL); - - item = gtk_image_menu_item_new_with_label ("Search by name"); - image = gtk_image_new_from_stock (GTK_STOCK_FIND, GTK_ICON_SIZE_MENU); - gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (item), image); - g_signal_connect (item, "activate", G_CALLBACK (search_by_name), entry); - gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); - - item = gtk_image_menu_item_new_with_label ("Search by description"); - image = gtk_image_new_from_stock (GTK_STOCK_EDIT, GTK_ICON_SIZE_MENU); - gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (item), image); - g_signal_connect (item, "activate", G_CALLBACK (search_by_description), entry); - gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); - - item = gtk_image_menu_item_new_with_label ("Search by file name"); - image = gtk_image_new_from_stock (GTK_STOCK_OPEN, GTK_ICON_SIZE_MENU); - gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (item), image); - g_signal_connect (item, "activate", G_CALLBACK (search_by_file), entry); - gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); - - gtk_widget_show_all (menu); } + /* add accessible alternatives for icon functionality */ + g_signal_connect (entry, "populate-popup", + G_CALLBACK (entry_populate_popup), NULL); + if (!gtk_widget_get_visible (window)) gtk_widget_show_all (window); else @@ -279,5 +333,3 @@ do_search_entry (GtkWidget *do_widget) return window; } - - |