2 * Dialog box for GUI preferences
6 * Wireshark - Network traffic analyzer
7 * By Gerald Combs <gerald@wireshark.org>
8 * Copyright 1998 Gerald Combs
10 * This program is free software; you can redistribute it and/or
11 * modify it under the terms of the GNU General Public License
12 * as published by the Free Software Foundation; either version 2
13 * of the License, or (at your option) any later version.
15 * This program is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 * GNU General Public License for more details.
20 * You should have received a copy of the GNU General Public License
21 * along with this program; if not, write to the Free Software
22 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
30 #include <epan/prefs.h>
34 #include "ui/recent.h"
36 #include "ui/gtk/prefs_gui.h"
37 #include "ui/gtk/gtkglobals.h"
38 #include "ui/gtk/help_dlg.h"
39 #include "ui/gtk/supported_protos_dlg.h"
40 #include "ui/gtk/prefs_dlg.h"
41 #include "ui/gtk/main_titlebar.h"
42 #include "ui/gtk/gui_utils.h"
43 #include "ui/gtk/dlg_utils.h"
44 #include "ui/gtk/main.h"
45 #include "ui/gtk/packet_list.h"
46 #include "ui/gtk/packet_panes.h"
47 #include "ui/gtk/main_toolbar.h"
48 #include "ui/gtk/font_utils.h"
49 #include "ui/gtk/webbrowser.h"
50 #include "ui/gtk/main_welcome.h"
53 static gint fetch_enum_value(gpointer control, const enum_val_t *enumvals);
54 static gboolean fileopen_dir_changed_cb(GtkWidget *myentry, GdkEvent *event _U_, gpointer parent_w _U_);
55 static gboolean fileopen_preview_changed_cb(GtkWidget *myentry _U_, GdkEvent *event, gpointer parent_w);
56 static void fileopen_selected_cb(GtkWidget *mybutton_rb _U_, gpointer parent_w);
57 static gboolean recent_files_count_changed_cb(GtkWidget *recent_files_entry _U_,
58 GdkEvent *event _U_, gpointer parent_w);
59 static gboolean recent_df_entries_changed_cb(GtkWidget *recent_df_entry _U_,
60 GdkEvent *event _U_, gpointer parent_w);
61 static gint scroll_percent_changed_cb(GtkWidget *recent_df_entry _U_,
62 GdkEvent *event _U_, gpointer parent_w);
63 #define GEOMETRY_POSITION_KEY "geometry_position"
64 #define GEOMETRY_SIZE_KEY "geometry_size"
65 #define GEOMETRY_MAXIMIZED_KEY "geometry_maximized"
67 #if defined(HAVE_IGE_MAC_INTEGRATION) || defined(HAVE_GTKOSXAPPLICATION)
68 #define MACOSX_STYLE_KEY "macosx_style"
72 #define GUI_CONSOLE_OPEN_KEY "console_open"
73 #define ENABLE_UPDATE_KEY "enable_update"
76 #define GUI_FILEOPEN_KEY "fileopen_behavior"
77 #define GUI_FILEOPEN_PREVIEW_KEY "fileopen_preview_timeout"
78 #define GUI_RECENT_FILES_COUNT_KEY "recent_files_count"
79 #define GUI_RECENT_DF_ENTRIES_KEY "recent_display_filter_entries"
80 #define GUI_FILEOPEN_DIR_KEY "fileopen_directory"
81 #define GUI_ASK_UNSAVED_KEY "ask_unsaved"
82 #define GUI_WEBBROWSER_KEY "webbrowser"
83 #define GUI_FIND_WRAP_KEY "find_wrap"
84 #define GUI_USE_PREF_SAVE_KEY "use_pref_save"
85 #define GUI_SHOW_VERSION_KEY "show_version"
86 #define GUI_EXPERT_EYECANDY_KEY "expert_eyecandy"
87 #define GUI_AUTO_SCROLL_KEY "auto_scroll_on_expand"
88 #define GUI_SCROLL_PERCENT_KEY "scroll_percent_on_expand"
89 #define GUI_PACKET_EDITOR "packet_editor"
91 static const enum_val_t filter_toolbar_placement_vals[] _U_ = {
92 { "FALSE", "Below the main toolbar", FALSE },
93 { "TRUE", "Insert into statusbar", TRUE },
97 static const enum_val_t highlight_style_vals[] _U_ = {
98 { "FALSE", "Bold", FALSE },
99 { "TRUE", "Inverse", TRUE },
104 static const enum_val_t toolbar_style_vals[] _U_ = {
105 { "ICONS", "Icons only", TB_STYLE_ICONS },
106 { "TEXT", "Text only", TB_STYLE_TEXT },
107 { "BOTH", "Icons & Text", TB_STYLE_BOTH },
112 static const enum_val_t gui_console_open_vals[] = {
113 { "NEVER", "Never", console_open_never },
114 { "AUTOMATIC", "Automatic (advanced user)", console_open_auto },
115 { "ALWAYS", "Always (debugging)", console_open_always },
120 static const enum_val_t gui_version_placement_vals[] = {
121 { "WELCOME", "Welcome only", version_welcome_only },
122 { "TITLE", "Title only", version_title_only },
123 { "BOTH", "Both", version_both },
124 { "NEITHER", "Neither", version_neither },
128 static const enum_val_t gui_fileopen_vals[] = {
129 { "LAST_OPENED", "Remember last directory", FO_STYLE_LAST_OPENED },
130 { "SPECIFIED", "Always start in:", FO_STYLE_SPECIFIED },
134 /* Used to contain the string from the Recent Files Count Max pref item */
135 static char recent_files_count_max_str[128] = "";
137 /* Used to contain the string from the Recent Display Filter Max Entries pref item */
138 static char recent_df_entries_max_str[128] = "";
140 /* Used to contain the string from the Open File preview timeout pref item */
141 static char open_file_preview_str[128] = "";
143 /* Used to contain the string from the Auto Scroll Percentage pref item */
144 static char scroll_percent_preview_str[128] = "";
149 GtkWidget *main_grid, *main_vb;
151 GtkWidget *console_open_om, *enable_update_cb;
153 GtkWidget *fileopen_rb, *fileopen_dir_te, *fileopen_preview_te;
154 GtkWidget *recent_files_count_max_te, *recent_df_entries_max_te, *ask_unsaved_cb, *find_wrap_cb;
155 GtkWidget *use_pref_save_cb;
156 GtkWidget *show_version_om;
157 GtkWidget *auto_scroll_cb, *scroll_percent_te;
158 GtkWidget *webbrowser_te;
159 GtkWidget *save_position_cb, *save_size_cb, *save_maximized_cb;
160 #if defined(HAVE_IGE_MAC_INTEGRATION) || defined(HAVE_GTKOSXAPPLICATION)
161 GtkWidget *macosx_style_cb;
163 GtkWidget *expert_info_eyecandy_cb;
164 GtkWidget *packet_editor_cb;
167 char current_val_str[128];
169 /* The columns haven't been changed yet */
170 cfile.columns_changed = FALSE;
172 /* Main vertical box */
173 main_vb = ws_gtk_box_new(GTK_ORIENTATION_VERTICAL, 7, FALSE);
174 gtk_container_set_border_width( GTK_CONTAINER(main_vb), 5 );
177 main_grid = ws_gtk_grid_new();
178 gtk_box_pack_start(GTK_BOX(main_vb), main_grid, FALSE, FALSE, 0);
179 #if GTK_CHECK_VERSION(3,0,0)
180 gtk_widget_set_vexpand(GTK_WIDGET(main_grid), FALSE); /* Ignore VEXPAND requests from children */
182 ws_gtk_grid_set_row_spacing(GTK_GRID(main_grid), 10);
183 ws_gtk_grid_set_column_spacing(GTK_GRID(main_grid), 15);
186 save_position_cb = create_preference_check_button(main_grid, pos++,
187 "Save window position:",
188 "Save the position of the main window.",
189 prefs.gui_geometry_save_position);
190 g_object_set_data(G_OBJECT(main_vb), GEOMETRY_POSITION_KEY, save_position_cb);
192 save_size_cb = create_preference_check_button(main_grid, pos++,
194 "Save the size of the main window.",
195 prefs.gui_geometry_save_size);
196 g_object_set_data(G_OBJECT(main_vb), GEOMETRY_SIZE_KEY, save_size_cb);
198 save_maximized_cb = create_preference_check_button(main_grid, pos++,
199 "Save maximized state:",
200 "Save the maximized state of the main window.",
201 prefs.gui_geometry_save_maximized);
202 g_object_set_data(G_OBJECT(main_vb), GEOMETRY_MAXIMIZED_KEY, save_maximized_cb);
205 enable_update_cb = create_preference_check_button(main_grid, pos++,
206 "Check for updates:",
207 "Periodically check for new versions of Wireshark.",
208 prefs.gui_update_enabled);
209 g_object_set_data(G_OBJECT(main_vb), ENABLE_UPDATE_KEY, enable_update_cb);
212 #if defined(HAVE_IGE_MAC_INTEGRATION) || defined(HAVE_GTKOSXAPPLICATION)
213 macosx_style_cb = create_preference_check_button(main_grid, pos++,
215 "Create a Mac OS X look and feel. Checking this box will move the "
216 "menu bar to the top of the screen instead of the top of the Wireshark window. "
217 "Requires a restart of Wireshark to take effect.",
218 prefs.gui_macosx_style);
219 g_object_set_data(G_OBJECT(main_vb), MACOSX_STYLE_KEY, macosx_style_cb);
223 /* How the console window should be opened */
224 console_open_om = create_preference_option_menu(main_grid, pos++,
225 "Open a console window",
226 "Whether to open a console window "
227 "(Automatic will open a console if messages appear).",
228 gui_console_open_vals, prefs.gui_console_open);
229 g_object_set_data(G_OBJECT(main_vb), GUI_CONSOLE_OPEN_KEY, console_open_om);
232 /* Allow user to select where they want the File Open dialog to open to
234 fileopen_rb = create_preference_radio_buttons(main_grid, pos++,
235 "\"File Open\" dialog behavior:",
236 "Which directory the \"File Open\" dialog should start with.",
237 gui_fileopen_vals, prefs.gui_fileopen_style);
239 /* Directory to default File Open dialog to */
240 fileopen_dir_te = create_preference_entry(main_grid, pos++,
242 "The \"File Open\" dialog defaults always to this directory.",
243 prefs.gui_fileopen_dir);
244 g_object_set_data(G_OBJECT(main_vb), GUI_FILEOPEN_KEY, fileopen_rb);
245 g_object_set_data(G_OBJECT(main_vb), GUI_FILEOPEN_DIR_KEY, fileopen_dir_te);
246 g_signal_connect(fileopen_rb, "clicked", G_CALLBACK(fileopen_selected_cb), main_vb);
247 g_signal_connect(fileopen_dir_te, "focus-out-event",
248 G_CALLBACK(fileopen_dir_changed_cb), main_vb);
250 /* File Open dialog preview timeout */
251 fileopen_preview_te = create_preference_entry(main_grid, pos++,
252 "\"File Open\" preview timeout:",
253 "Reading preview data in the \"File Open\" dialog will be stopped after given seconds.",
254 open_file_preview_str);
255 g_snprintf(current_val_str, sizeof(current_val_str), "%d", prefs.gui_fileopen_preview);
256 gtk_entry_set_text(GTK_ENTRY(fileopen_preview_te), current_val_str);
257 g_object_set_data(G_OBJECT(main_vb), GUI_FILEOPEN_PREVIEW_KEY, fileopen_preview_te);
258 g_signal_connect(fileopen_preview_te, "focus_out_event", G_CALLBACK(fileopen_preview_changed_cb), main_vb);
260 /* Number of recent entries in the display filter list ... */
261 recent_df_entries_max_te = create_preference_entry(main_grid, pos++,
262 "Maximum recent filters:",
263 "Maximum number of recent entries in filter display list.",
264 recent_df_entries_max_str);
265 g_snprintf(current_val_str, sizeof(current_val_str), "%d", prefs.gui_recent_df_entries_max);
266 gtk_entry_set_text(GTK_ENTRY(recent_df_entries_max_te), current_val_str);
267 g_object_set_data(G_OBJECT(main_vb), GUI_RECENT_DF_ENTRIES_KEY, recent_df_entries_max_te);
268 g_signal_connect(recent_df_entries_max_te, "focus_out_event", G_CALLBACK(recent_df_entries_changed_cb), main_vb);
270 /* Number of entries in the recent_files list ... */
271 recent_files_count_max_te = create_preference_entry(main_grid, pos++,
272 "Maximum recent files:",
273 "Maximum number of entries in the \"File/Open Recent\" list.",
274 recent_files_count_max_str);
275 g_snprintf(current_val_str, sizeof(current_val_str), "%d", prefs.gui_recent_files_count_max);
276 gtk_entry_set_text(GTK_ENTRY(recent_files_count_max_te), current_val_str);
277 g_object_set_data(G_OBJECT(main_vb), GUI_RECENT_FILES_COUNT_KEY, recent_files_count_max_te);
278 g_signal_connect(recent_files_count_max_te, "focus_out_event", G_CALLBACK(recent_files_count_changed_cb), main_vb);
280 fileopen_selected_cb(NULL, main_vb);
282 /* ask for unsaved capture files? */
283 ask_unsaved_cb = create_preference_check_button(main_grid, pos++,
284 "Confirm unsaved capture files:",
285 "Whether a dialog should pop up in case of an unsaved capture file.",
286 prefs.gui_ask_unsaved);
287 g_object_set_data(G_OBJECT(main_vb), GUI_ASK_UNSAVED_KEY, ask_unsaved_cb);
289 /* do we want to wrap when searching for data? */
290 find_wrap_cb = create_preference_check_button(main_grid, pos++,
291 "Wrap to end/beginning of file during a find:",
292 "Whether a search should wrap in a capture file.",
293 prefs.gui_find_wrap);
294 g_object_set_data(G_OBJECT(main_vb), GUI_FIND_WRAP_KEY, find_wrap_cb);
296 /* show an explicit Save button for settings dialogs (preferences and alike)? */
297 use_pref_save_cb = create_preference_check_button(main_grid, pos++,
298 "Settings dialogs show a save button:",
299 "Whether the various settings dialogs (e.g. Preferences) should "
300 "use an explicit save button - for advanced users.",
301 prefs.gui_use_pref_save);
302 g_object_set_data(G_OBJECT(main_vb), GUI_USE_PREF_SAVE_KEY, use_pref_save_cb);
304 /* Show version in welcome and/or title screen */
305 show_version_om = create_preference_option_menu(main_grid, pos++,
306 "Welcome screen and title bar shows version",
307 "Whether version should be shown in the start page and/or main screen's title bar.",
308 gui_version_placement_vals, prefs.gui_version_placement);
309 g_object_set_data(G_OBJECT(main_vb), GUI_SHOW_VERSION_KEY, show_version_om);
311 /* Whether to auto scroll when expanding items */
312 auto_scroll_cb = create_preference_check_button(main_grid, pos++,
313 "Auto scroll on expansion:",
314 "Whether the details view should be automatically scrolled up when expanding an item.",
315 prefs.gui_auto_scroll_on_expand );
316 g_object_set_data(G_OBJECT(main_vb), GUI_AUTO_SCROLL_KEY, auto_scroll_cb);
318 /* Where to auto scroll to when expanding items */
319 scroll_percent_te = create_preference_entry(main_grid, pos++,
320 "Auto scroll percentage:",
321 "Where to scroll the expanded item to within the view e.g. 0% = top of view, 50% = center of view.",
322 scroll_percent_preview_str);
323 g_snprintf(current_val_str, sizeof(current_val_str), "%d", prefs.gui_auto_scroll_percentage);
324 gtk_entry_set_text(GTK_ENTRY(scroll_percent_te), current_val_str);
325 g_object_set_data(G_OBJECT(main_vb), GUI_SCROLL_PERCENT_KEY, scroll_percent_te);
326 g_signal_connect(scroll_percent_te, "focus_out_event", G_CALLBACK(scroll_percent_changed_cb), main_vb);
329 if (browser_needs_pref()) {
330 webbrowser_te = create_preference_entry(main_grid, pos++,
331 "Web browser command:",
332 "Command line to desired browser.",
333 prefs.gui_webbrowser);
334 gtk_entry_set_text(GTK_ENTRY(webbrowser_te), prefs.gui_webbrowser);
335 g_object_set_data(G_OBJECT(main_vb), GUI_WEBBROWSER_KEY, webbrowser_te);
338 /* Enable Expert Infos Dialog Tab Label "eye-candy" */
339 expert_info_eyecandy_cb = create_preference_check_button(main_grid, pos++,
340 "Display icons in the Expert Infos dialog tab labels:",
341 "Whether icon images should be displayed in the Expert Infos dialog tab labels.",
342 prefs.gui_expert_composite_eyecandy );
343 g_object_set_data(G_OBJECT(main_vb), GUI_EXPERT_EYECANDY_KEY, expert_info_eyecandy_cb);
345 /* Enable Experimental Packet Editor */
346 packet_editor_cb = create_preference_check_button(main_grid, pos++,
347 "Enable Packet Editor (Experimental):",
348 "Activate Packet Editor (Experimental)",
349 prefs.gui_packet_editor);
350 g_object_set_data(G_OBJECT(main_vb), GUI_PACKET_EDITOR, packet_editor_cb);
352 /* Show 'em what we got */
353 gtk_widget_show_all(main_vb);
360 fetch_enum_value(gpointer control, const enum_val_t *enumvals)
362 return fetch_preference_option_menu_val(GTK_WIDGET(control), enumvals);
366 gui_prefs_fetch(GtkWidget *w)
368 prefs.gui_geometry_save_position =
369 gtk_toggle_button_get_active((GtkToggleButton *)g_object_get_data(G_OBJECT(w), GEOMETRY_POSITION_KEY));
370 prefs.gui_geometry_save_size =
371 gtk_toggle_button_get_active((GtkToggleButton *)g_object_get_data(G_OBJECT(w), GEOMETRY_SIZE_KEY));
372 prefs.gui_geometry_save_maximized =
373 gtk_toggle_button_get_active((GtkToggleButton *)g_object_get_data(G_OBJECT(w), GEOMETRY_MAXIMIZED_KEY));
376 prefs.gui_update_enabled =
377 gtk_toggle_button_get_active((GtkToggleButton *)g_object_get_data(G_OBJECT(w), ENABLE_UPDATE_KEY));
380 #if defined(HAVE_IGE_MAC_INTEGRATION) || defined(HAVE_GTKOSXAPPLICATION)
381 prefs.gui_macosx_style =
382 gtk_toggle_button_get_active((GtkToggleButton *)g_object_get_data(G_OBJECT(w), MACOSX_STYLE_KEY));
386 prefs.gui_console_open = fetch_enum_value(
387 g_object_get_data(G_OBJECT(w), GUI_CONSOLE_OPEN_KEY), gui_console_open_vals);
389 prefs.gui_fileopen_style = fetch_preference_radio_buttons_val(
390 (GtkWidget *)g_object_get_data(G_OBJECT(w), GUI_FILEOPEN_KEY), gui_fileopen_vals);
392 g_free(prefs.gui_fileopen_dir);
393 prefs.gui_fileopen_dir = g_strdup(gtk_entry_get_text(
394 GTK_ENTRY(g_object_get_data(G_OBJECT(w), GUI_FILEOPEN_DIR_KEY))));
396 prefs.gui_ask_unsaved =
397 gtk_toggle_button_get_active((GtkToggleButton *)g_object_get_data(G_OBJECT(w), GUI_ASK_UNSAVED_KEY));
399 prefs.gui_find_wrap =
400 gtk_toggle_button_get_active((GtkToggleButton *)g_object_get_data(G_OBJECT(w), GUI_FIND_WRAP_KEY));
402 prefs.gui_use_pref_save =
403 gtk_toggle_button_get_active((GtkToggleButton *)g_object_get_data(G_OBJECT(w), GUI_USE_PREF_SAVE_KEY));
405 prefs.gui_version_placement = (version_info_e)
406 fetch_enum_value(g_object_get_data(G_OBJECT(w), GUI_SHOW_VERSION_KEY), gui_version_placement_vals);
408 prefs.gui_auto_scroll_on_expand =
409 gtk_toggle_button_get_active((GtkToggleButton *)g_object_get_data(G_OBJECT(w), GUI_AUTO_SCROLL_KEY));
411 if (browser_needs_pref()) {
412 g_free(prefs.gui_webbrowser);
413 prefs.gui_webbrowser = g_strdup(gtk_entry_get_text(
414 GTK_ENTRY(g_object_get_data(G_OBJECT(w), GUI_WEBBROWSER_KEY))));
417 prefs.gui_expert_composite_eyecandy =
418 gtk_toggle_button_get_active((GtkToggleButton *)g_object_get_data(G_OBJECT(w), GUI_EXPERT_EYECANDY_KEY));
420 prefs.gui_packet_editor =
421 gtk_toggle_button_get_active((GtkToggleButton *)g_object_get_data(G_OBJECT(w), GUI_PACKET_EDITOR));
427 gui_prefs_apply(GtkWidget *w _U_)
431 /* user immediately wants to see a console */
432 if (prefs.gui_console_open == console_open_always) {
437 /* Redisplay the main window's title */
438 main_titlebar_update();
440 /* Redisplay the default welcome header message in case the "show
441 * version" option was changed. */
442 welcome_header_set_message(NULL);
444 /* Redraw the help window(s). */
448 /* XXX: redraw the toolbar only, if style changed */
449 toolbar_redraw_all();
451 set_tree_styles_all();
452 main_widgets_rearrange();
456 gui_prefs_destroy(GtkWidget *w _U_)
461 recent_df_entries_changed_cb(GtkWidget *recent_df_entry _U_,
462 GdkEvent *event _U_, gpointer parent_w)
464 GtkWidget *recent_df_entries_count_te;
467 recent_df_entries_count_te = (GtkWidget *)g_object_get_data(G_OBJECT(parent_w), GUI_RECENT_DF_ENTRIES_KEY);
470 * Now, just convert the string to a number and store it in the prefs
474 newval = (guint)strtol(gtk_entry_get_text (GTK_ENTRY(recent_df_entries_count_te)), NULL, 10);
477 prefs.gui_recent_df_entries_max = newval;
480 /* We really should pop up a nasty dialog box if newval <= 0 */
486 recent_files_count_changed_cb(GtkWidget *recent_files_entry _U_,
487 GdkEvent *event _U_, gpointer parent_w)
489 GtkWidget *recent_files_count_te;
492 recent_files_count_te = (GtkWidget *)g_object_get_data(G_OBJECT(parent_w), GUI_RECENT_FILES_COUNT_KEY);
495 * Now, just convert the string to a number and store it in the prefs
499 newval = (guint)strtol(gtk_entry_get_text (GTK_ENTRY(recent_files_count_te)), NULL, 10);
502 prefs.gui_recent_files_count_max = newval;
505 /* We really should pop up a nasty dialog box if newval <= 0 */
511 fileopen_preview_changed_cb(GtkWidget *recent_files_entry _U_,
512 GdkEvent *event _U_, gpointer parent_w)
514 GtkWidget *fileopen_preview_te;
517 fileopen_preview_te = (GtkWidget *)g_object_get_data(G_OBJECT(parent_w), GUI_FILEOPEN_PREVIEW_KEY);
520 * Now, just convert the string to a number and store it in the prefs
524 newval = (guint)strtol(gtk_entry_get_text (GTK_ENTRY(fileopen_preview_te)), NULL, 10);
527 prefs.gui_fileopen_preview = newval;
530 /* We really should pop up a nasty dialog box if newval <= 0 */
536 fileopen_dir_changed_cb(GtkWidget *fileopen_dir_te, GdkEvent *event _U_, gpointer parent_w _U_)
539 gint fileopen_dir_te_length;
541 fileopen_dir_te_length = (gint) strlen(gtk_entry_get_text (GTK_ENTRY(fileopen_dir_te)));
542 if (fileopen_dir_te_length == 0)
544 lastchar = gtk_editable_get_chars(GTK_EDITABLE(fileopen_dir_te), fileopen_dir_te_length-1, -1);
545 if (strcmp(lastchar, G_DIR_SEPARATOR_S) != 0){
546 gtk_editable_insert_text(GTK_EDITABLE(fileopen_dir_te), G_DIR_SEPARATOR_S,
547 1, /* new_text_length */
548 &fileopen_dir_te_length); /* *position */
554 fileopen_selected_cb(GtkWidget *mybutton_rb _U_, gpointer parent_w)
556 GtkWidget *fileopen_rb, *fileopen_dir_te;
558 fileopen_rb = (GtkWidget *)g_object_get_data(G_OBJECT(parent_w), GUI_FILEOPEN_KEY);
559 fileopen_dir_te = (GtkWidget *)g_object_get_data(G_OBJECT(parent_w), GUI_FILEOPEN_DIR_KEY);
561 if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(fileopen_rb)))
563 gtk_widget_set_sensitive(GTK_WIDGET(fileopen_dir_te), TRUE);
567 gtk_widget_set_sensitive(GTK_WIDGET(fileopen_dir_te), FALSE);
573 scroll_percent_changed_cb(GtkWidget *recent_files_entry _U_,
574 GdkEvent *event _U_, gpointer parent_w)
576 GtkWidget *scroll_percent_te;
579 scroll_percent_te = (GtkWidget*)g_object_get_data(G_OBJECT(parent_w), GUI_SCROLL_PERCENT_KEY);
582 * Now, just convert the string to a number and store it in the prefs field ...
585 newval = (guint)strtol(gtk_entry_get_text(GTK_ENTRY(scroll_percent_te)), NULL, 10);
588 prefs.gui_auto_scroll_percentage = newval;
592 prefs.gui_auto_scroll_percentage = newval;
595 /* We really should pop up a dialog box is newval < 0 or > 100 */
600 * Editor modelines - http://www.wireshark.org/tools/modelines.html
605 * indent-tabs-mode: t
608 * vi: set shiftwidth=8 tabstop=8 noexpandtab:
609 * :indentSize=8:tabSize=8:noTabs=false: