Commit c744594b authored by Matthias Clasen's avatar Matthias Clasen

Add accessible alternatives to entry icon functionality

Inspired by the complaint in bug 611051.
parent ac6525b2
/* 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. * This demo shows how to use these features in a search entry.
*/ */
...@@ -45,21 +45,21 @@ finish_search (GtkButton *button) ...@@ -45,21 +45,21 @@ finish_search (GtkButton *button)
show_find_button (); show_find_button ();
g_source_remove (search_progress_id); g_source_remove (search_progress_id);
search_progress_id = 0; search_progress_id = 0;
return FALSE; return FALSE;
} }
static gboolean static gboolean
start_search_feedback (gpointer data) 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, (GSourceFunc)search_progress, data,
(GDestroyNotify)search_progress_done); (GDestroyNotify)search_progress_done);
return FALSE; return FALSE;
} }
static void static void
start_search (GtkButton *button, start_search (GtkButton *button,
GtkEntry *entry) GtkEntry *entry)
{ {
show_cancel_button (); show_cancel_button ();
...@@ -77,45 +77,13 @@ stop_search (GtkButton *button, ...@@ -77,45 +77,13 @@ stop_search (GtkButton *button,
} }
static void static void
icon_press_cb (GtkEntry *entry, clear_entry (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)
{ {
gboolean has_text; gtk_entry_set_text (entry, "");
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 static void
activate_cb (GtkEntry *entry, search_by_name (GtkWidget *item,
GtkButton *button)
{
if (search_progress_id != 0)
return;
start_search (button, entry);
}
static void
search_by_name (GtkWidget *item,
GtkEntry *entry) GtkEntry *entry)
{ {
gtk_entry_set_icon_from_stock (entry, gtk_entry_set_icon_from_stock (entry,
...@@ -125,10 +93,10 @@ search_by_name (GtkWidget *item, ...@@ -125,10 +93,10 @@ search_by_name (GtkWidget *item,
GTK_ENTRY_ICON_PRIMARY, GTK_ENTRY_ICON_PRIMARY,
"Search by name\n" "Search by name\n"
"Click here to change the search type"); "Click here to change the search type");
} }
static void static void
search_by_description (GtkWidget *item, search_by_description (GtkWidget *item,
GtkEntry *entry) GtkEntry *entry)
{ {
gtk_entry_set_icon_from_stock (entry, gtk_entry_set_icon_from_stock (entry,
...@@ -138,10 +106,10 @@ search_by_description (GtkWidget *item, ...@@ -138,10 +106,10 @@ search_by_description (GtkWidget *item,
GTK_ENTRY_ICON_PRIMARY, GTK_ENTRY_ICON_PRIMARY,
"Search by description\n" "Search by description\n"
"Click here to change the search type"); "Click here to change the search type");
} }
static void static void
search_by_file (GtkWidget *item, search_by_file (GtkWidget *item,
GtkEntry *entry) GtkEntry *entry)
{ {
gtk_entry_set_icon_from_stock (entry, gtk_entry_set_icon_from_stock (entry,
...@@ -151,7 +119,83 @@ search_by_file (GtkWidget *item, ...@@ -151,7 +119,83 @@ search_by_file (GtkWidget *item,
GTK_ENTRY_ICON_PRIMARY, GTK_ENTRY_ICON_PRIMARY,
"Search by file name\n" "Search by file name\n"
"Click here to change the search type"); "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 static void
search_entry_destroyed (GtkWidget *widget) search_entry_destroyed (GtkWidget *widget)
...@@ -165,7 +209,35 @@ search_entry_destroyed (GtkWidget *widget) ...@@ -165,7 +209,35 @@ search_entry_destroyed (GtkWidget *widget)
window = NULL; 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 * GtkWidget *
do_search_entry (GtkWidget *do_widget) do_search_entry (GtkWidget *do_widget)
{ {
...@@ -173,19 +245,17 @@ do_search_entry (GtkWidget *do_widget) ...@@ -173,19 +245,17 @@ do_search_entry (GtkWidget *do_widget)
GtkWidget *hbox; GtkWidget *hbox;
GtkWidget *label; GtkWidget *label;
GtkWidget *entry; GtkWidget *entry;
GtkWidget *item;
GtkWidget *image;
GtkWidget *find_button; GtkWidget *find_button;
GtkWidget *cancel_button; GtkWidget *cancel_button;
if (!window) if (!window)
{ {
window = gtk_dialog_new_with_buttons ("Search Entry", window = gtk_dialog_new_with_buttons ("Search Entry",
GTK_WINDOW (do_widget), GTK_WINDOW (do_widget),
0, 0,
GTK_STOCK_CLOSE, GTK_STOCK_CLOSE,
GTK_RESPONSE_NONE, GTK_RESPONSE_NONE,
NULL); NULL);
gtk_window_set_resizable (GTK_WINDOW (window), FALSE); gtk_window_set_resizable (GTK_WINDOW (window), FALSE);
g_signal_connect (window, "response", g_signal_connect (window, "response",
...@@ -216,58 +286,42 @@ do_search_entry (GtkWidget *do_widget) ...@@ -216,58 +286,42 @@ do_search_entry (GtkWidget *do_widget)
gtk_box_pack_start (GTK_BOX (hbox), notebook, FALSE, FALSE, 0); gtk_box_pack_start (GTK_BOX (hbox), notebook, FALSE, FALSE, 0);
find_button = gtk_button_new_with_label ("Find"); 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); G_CALLBACK (start_search), entry);
gtk_notebook_append_page (GTK_NOTEBOOK (notebook), find_button, NULL); gtk_notebook_append_page (GTK_NOTEBOOK (notebook), find_button, NULL);
gtk_widget_show (find_button); gtk_widget_show (find_button);
cancel_button = gtk_button_new_with_label ("Cancel"); 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); G_CALLBACK (stop_search), NULL);
gtk_notebook_append_page (GTK_NOTEBOOK (notebook), cancel_button, NULL); gtk_notebook_append_page (GTK_NOTEBOOK (notebook), cancel_button, NULL);
gtk_widget_show (cancel_button); gtk_widget_show (cancel_button);
/* Set up the search icon */ /* Set up the search icon */
search_by_name (NULL, GTK_ENTRY (entry)); search_by_name (NULL, GTK_ENTRY (entry));
/* Set up the clear icon */ /* Set up the clear icon */
gtk_entry_set_icon_from_stock (GTK_ENTRY (entry), gtk_entry_set_icon_from_stock (GTK_ENTRY (entry),
GTK_ENTRY_ICON_SECONDARY, GTK_ENTRY_ICON_SECONDARY,
GTK_STOCK_CLEAR); GTK_STOCK_CLEAR);
text_changed_cb (GTK_ENTRY (entry), NULL, find_button); 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_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_CALLBACK (text_changed_cb), find_button);
g_signal_connect (entry, "activate", g_signal_connect (entry, "activate",
G_CALLBACK (activate_cb), NULL); G_CALLBACK (activate_cb), NULL);
/* Create the menu */ /* Create the menu */
menu = gtk_menu_new (); menu = create_search_menu (entry);
gtk_menu_attach_to_widget (GTK_MENU (menu), entry, NULL); 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)) if (!gtk_widget_get_visible (window))
gtk_widget_show_all (window); gtk_widget_show_all (window);
else else
...@@ -279,5 +333,3 @@ do_search_entry (GtkWidget *do_widget) ...@@ -279,5 +333,3 @@ do_search_entry (GtkWidget *do_widget)
return window; return window;
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment