aboutsummaryrefslogtreecommitdiffstats
path: root/gtk
diff options
context:
space:
mode:
authorGerald Combs <gerald@wireshark.org>2007-01-20 02:05:49 +0000
committerGerald Combs <gerald@wireshark.org>2007-01-20 02:05:49 +0000
commit1e6ce19f799b3c4e71f5fe365d282f0dc9e9c6eb (patch)
tree45d70fa3d62edff2f0cfc25635511c0acaae9186 /gtk
parent15648712d9555b2bae51537b228331856b1406ea (diff)
Recent versions of GTK+ have added a "gtk-label-select-on-focus"
property, which selects the entire contents of a label when it comes into focus. This property annoyingly defaults to TRUE, which meant that the labels in simple dialogs and the about box would unexpectedly show up selected. Work around this by setting the focus on the "OK" button in the about dialog and the first button specified in simple dialogs. svn path=/trunk/; revision=20507
Diffstat (limited to 'gtk')
-rw-r--r--gtk/about_dlg.c10
-rw-r--r--gtk/dlg_utils.c35
-rw-r--r--gtk/dlg_utils.h13
-rw-r--r--gtk/simple_dialog.c18
4 files changed, 60 insertions, 16 deletions
diff --git a/gtk/about_dlg.c b/gtk/about_dlg.c
index 49a1796aed..c9cdf738b1 100644
--- a/gtk/about_dlg.c
+++ b/gtk/about_dlg.c
@@ -105,7 +105,7 @@ splash_new(char *message)
main_lb = gtk_label_new(message);
gtk_container_add(GTK_CONTAINER(main_vb), main_lb);
OBJECT_SET_DATA(win, "splash_label", main_lb);
-
+
gtk_widget_show_all(win);
splash_update(win, message);
@@ -209,7 +209,7 @@ about_folders_page_new(void)
scrolledwindow = scrolled_window_new(NULL, NULL);
#if GTK_MAJOR_VERSION >= 2
- gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrolledwindow),
+ gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrolledwindow),
GTK_SHADOW_IN);
#endif
@@ -228,7 +228,7 @@ about_folders_page_new(void)
/* pers conf */
path = get_persconffile_path("", FALSE);
- about_folders_row(table, "Personal configuration", path,
+ about_folders_row(table, "Personal configuration", path,
"\"dfilters\", \"preferences\", \"ethers\", ...");
g_free((void *) path);
@@ -310,7 +310,7 @@ about_wireshark_cb( GtkWidget *w _U_, gpointer data _U_ )
#else
gtk_window_set_position(GTK_WINDOW(about_wireshark_w), GTK_WIN_POS_CENTER);
#endif
- /* setting the size is dangerous here, as making it too short will
+ /* setting the size is dangerous here, as making it too short will
* clip content on GTK1, so simply use the natural size */
/*gtk_window_set_default_size(GTK_WINDOW(about_wireshark_w), 600, 400);*/
gtk_container_border_width(GTK_CONTAINER(about_wireshark_w), 6);
@@ -355,6 +355,8 @@ about_wireshark_cb( GtkWidget *w _U_, gpointer data _U_ )
gtk_box_pack_start(GTK_BOX(main_vb), bbox, FALSE, FALSE, 0);
ok_btn = OBJECT_GET_DATA(bbox, GTK_STOCK_OK);
+ gtk_widget_grab_focus(ok_btn);
+ gtk_widget_grab_default(ok_btn);
window_set_cancel_button(about_wireshark_w, ok_btn, window_cancel_button_cb);
SIGNAL_CONNECT(about_wireshark_w, "delete_event", window_delete_event_cb, NULL);
diff --git a/gtk/dlg_utils.c b/gtk/dlg_utils.c
index d493bd0c9f..e79541caaf 100644
--- a/gtk/dlg_utils.c
+++ b/gtk/dlg_utils.c
@@ -68,10 +68,40 @@ dlg_button_new(GtkWidget *hbox, GtkWidget *button_hbox, const gchar *stock_id)
return button;
}
+/*
+ * Set the focus and default for the nth item in a button row, with
+ * 0 being the first item.
+ */
+#define BUTTON_HBOX_KEY "button_hbox"
+void
+dlg_button_focus_nth(GtkWidget *hbox, gint focus_item) {
+ GtkWidget *button_hbox, *button;
+ GList *children;
+ gint cur_item = 0;
+
+ if (!hbox)
+ return;
+
+ button_hbox = OBJECT_GET_DATA(hbox, BUTTON_HBOX_KEY);
+ children = gtk_container_get_children(GTK_CONTAINER(button_hbox));
+
+ while (children) {
+ if (cur_item == focus_item) {
+ button = children->data;
+ gtk_widget_grab_focus(button);
+ gtk_widget_grab_default(button);
+ break;
+ }
+ children = g_list_next(children);
+ cur_item++;
+ }
+
+ g_list_free(children);
+}
/* create a button row for a dialog */
-/* The purpose of this is, to have one place available, where all button rows
+/* The purpose of this is, to have one place available, where all button rows
* from all dialogs are laid out. This will:
*
* a.) keep the button layout more consistent over the different dialogs
@@ -123,7 +153,7 @@ dlg_button_row_new(const gchar *stock_id_first, ...)
} else if (strcmp(stock_id, GTK_STOCK_SAVE) == 0) {
save = stock_id;
} else if (strcmp(stock_id, WIRESHARK_STOCK_DONT_SAVE) == 0) {
- dont_save = stock_id;
+ dont_save = stock_id;
} else if (strcmp(stock_id, GTK_STOCK_CANCEL) == 0) {
cancel = stock_id;
} else if (strcmp(stock_id, GTK_STOCK_CLOSE) == 0) {
@@ -166,6 +196,7 @@ dlg_button_row_new(const gchar *stock_id_first, ...)
button_hbox = gtk_hbutton_box_new();
gtk_box_pack_end(GTK_BOX(hbox), button_hbox, TRUE, TRUE, 0);
+ OBJECT_SET_DATA(hbox, BUTTON_HBOX_KEY, button_hbox);
gtk_widget_show(button_hbox);
help_hbox = gtk_hbutton_box_new();
diff --git a/gtk/dlg_utils.h b/gtk/dlg_utils.h
index 71f515a0c9..7c51c2b2ae 100644
--- a/gtk/dlg_utils.h
+++ b/gtk/dlg_utils.h
@@ -24,7 +24,7 @@
/** @defgroup dialog_group Dialogs
*
- * Dialogs are specially created windows and are related to their parent windows (usually the main window).
+ * Dialogs are specially created windows and are related to their parent windows (usually the main window).
* See: @ref howto_window_page for details.
*
* Normal dialogs are created using dlg_window_new().
@@ -61,7 +61,7 @@
*/
/** @file
- * Utilities for dialog boxes. Depending on the window functions in
+ * Utilities for dialog boxes. Depending on the window functions in
* gui_utils.h, see: @ref howto_window_page for details.
* @ingroup dialog_group
*/
@@ -71,7 +71,7 @@
/** Create a dialog box window that belongs to Wireshark's main window.
- * If you want to create a window, use window_new() instead.
+ * If you want to create a window, use window_new() instead.
* See window_new() for general window usage.
*
* @param title the title for the new dialog
@@ -98,6 +98,13 @@ extern GtkWidget *dlg_button_row_new(const gchar *stock_id_first, ...);
*/
extern void dlg_set_activate(GtkWidget *widget, GtkWidget *ok_button);
+/** Set the focus and default for the nth item in a button row.
+ *
+ * @param hbox A button row returned by dlg_button_row_new().
+ * @param focus_item The button to focus (0 is the first).
+ * @see dlg_button_row_new()
+ */
+void dlg_button_focus_nth(GtkWidget *hbox, gint focus_item);
/** used by compat_macros.h only, don't use directly */
extern GtkWidget *dlg_radio_button_new_with_label_with_mnemonic(GSList *group,
diff --git a/gtk/simple_dialog.c b/gtk/simple_dialog.c
index fe288dd7b4..e97170f1cd 100644
--- a/gtk/simple_dialog.c
+++ b/gtk/simple_dialog.c
@@ -58,7 +58,7 @@ typedef struct {
gint btn_mask;
char *message;
} queued_message_t;
-
+
static GSList *message_queue;
static GtkWidget *
@@ -172,6 +172,8 @@ display_simple_dialog(gint type, gint btn_mask, char *message)
#if GTK_MAJOR_VERSION >= 2
gtk_label_set_markup(GTK_LABEL(msg_label), message);
gtk_label_set_selectable(GTK_LABEL(msg_label), TRUE);
+ g_object_set(gtk_widget_get_settings(msg_label),
+ "gtk-label-select-on-focus", FALSE, NULL);
#endif
gtk_label_set_justify(GTK_LABEL(msg_label), GTK_JUSTIFY_FILL);
@@ -228,12 +230,12 @@ display_simple_dialog(gint type, gint btn_mask, char *message)
OBJECT_SET_DATA(save_bt, CALLBACK_BTN_KEY, GINT_TO_POINTER(ESD_BTN_SAVE));
SIGNAL_CONNECT(save_bt, "clicked", simple_dialog_cancel_cb, win);
}
-
+
dont_save_bt = OBJECT_GET_DATA(bbox, WIRESHARK_STOCK_DONT_SAVE);
if (dont_save_bt) {
OBJECT_SET_DATA(dont_save_bt, CALLBACK_BTN_KEY, GINT_TO_POINTER(ESD_BTN_DONT_SAVE));
- SIGNAL_CONNECT(dont_save_bt, "clicked", simple_dialog_cancel_cb, win);
- }
+ SIGNAL_CONNECT(dont_save_bt, "clicked", simple_dialog_cancel_cb, win);
+ }
bt = OBJECT_GET_DATA(bbox, GTK_STOCK_CLEAR);
if(bt) {
OBJECT_SET_DATA(bt, CALLBACK_BTN_KEY, GINT_TO_POINTER(ESD_BTN_CLEAR));
@@ -266,6 +268,8 @@ display_simple_dialog(gint type, gint btn_mask, char *message)
}
}
+ dlg_button_focus_nth(bbox, 0);
+
gtk_widget_show(win);
return win;
@@ -325,9 +329,9 @@ vsimple_dialog(ESD_TYPE_E type, gint btn_mask, const gchar *msg_format, va_list
state = gdk_window_get_state(top_level->window);
}
- /* If we don't yet have a main window or it's iconified, don't show the
- dialog. If showing up a dialog, while main window is iconified, program
- will become unresponsive! */
+ /* If we don't yet have a main window or it's iconified, don't show the
+ dialog. If showing up a dialog, while main window is iconified, program
+ will become unresponsive! */
if (top_level == NULL || state & GDK_WINDOW_STATE_ICONIFIED) {
#else