[gtk+] Add accessible alternatives to entry icon functionality
- From: Matthias Clasen <matthiasc src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk+] Add accessible alternatives to entry icon functionality
- Date: Tue, 9 Mar 2010 01:01:53 +0000 (UTC)
commit c744594b2099d03af6b7654de6c8ed5565acd1a9
Author: Matthias Clasen <mclasen redhat com>
Date: Mon Mar 8 19:59:24 2010 -0500
Add accessible alternatives to entry icon functionality
Inspired by the complaint in bug 611051.
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 e0236b1..4a726f5 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;
}
-
-
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]