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., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
32 #include <epan/prefs.h>
34 #include "../simple_dialog.h"
36 #include "gtk/prefs_gui.h"
37 #include "gtk/gtkglobals.h"
38 #include "gtk/help_dlg.h"
39 #include "gtk/supported_protos_dlg.h"
40 #include "gtk/prefs_dlg.h"
41 #include "gtk/gui_utils.h"
42 #include "gtk/dlg_utils.h"
44 #include "gtk/new_packet_list.h"
45 #include "gtk/main_proto_draw.h"
46 #include "gtk/main_toolbar.h"
47 #include "gtk/font_utils.h"
48 #include "gtk/recent.h"
49 #include "gtk/webbrowser.h"
50 #include "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 PLIST_SEL_BROWSE_KEY "plist_sel_browse"
64 #define PTREE_SEL_BROWSE_KEY "ptree_sel_browse"
65 #define GEOMETRY_POSITION_KEY "geometry_position"
66 #define GEOMETRY_SIZE_KEY "geometry_size"
67 #define GEOMETRY_MAXIMIZED_KEY "geometry_maximized"
69 #define MACOSX_STYLE_KEY "macosx_style"
71 #define GUI_CONSOLE_OPEN_KEY "console_open"
72 #define GUI_FILEOPEN_KEY "fileopen_behavior"
73 #define GUI_FILEOPEN_PREVIEW_KEY "fileopen_preview_timeout"
74 #define GUI_RECENT_FILES_COUNT_KEY "recent_files_count"
75 #define GUI_RECENT_DF_ENTRIES_KEY "recent_display_filter_entries"
76 #define GUI_FILEOPEN_DIR_KEY "fileopen_directory"
77 #define GUI_ASK_UNSAVED_KEY "ask_unsaved"
78 #define GUI_WEBBROWSER_KEY "webbrowser"
79 #define GUI_FIND_WRAP_KEY "find_wrap"
80 #define GUI_USE_PREF_SAVE_KEY "use_pref_save"
81 #define GUI_SHOW_VERSION_KEY "show_version"
82 #define GUI_EXPERT_EYECANDY_KEY "expert_eyecandy"
83 #define GUI_AUTO_SCROLL_KEY "auto_scroll_on_expand"
84 #define GUI_SCROLL_PERCENT_KEY "scroll_percent_on_expand"
86 static const enum_val_t scrollbar_placement_vals[] _U_ = {
87 { "FALSE", "Left", FALSE },
88 { "TRUE", "Right", TRUE },
92 static const enum_val_t selection_mode_vals[] = {
93 { "FALSE", "Selects", FALSE },
94 { "TRUE", "Browses", TRUE },
98 static const enum_val_t altern_colors_vals[] _U_ = {
99 { "FALSE", "No", FALSE },
100 { "TRUE", "Yes", TRUE },
104 static const enum_val_t filter_toolbar_placement_vals[] _U_ = {
105 { "FALSE", "Below the main toolbar", FALSE },
106 { "TRUE", "Insert into statusbar", TRUE },
110 static const enum_val_t highlight_style_vals[] _U_ = {
111 { "FALSE", "Bold", FALSE },
112 { "TRUE", "Inverse", TRUE },
117 static const enum_val_t toolbar_style_vals[] _U_ = {
118 { "ICONS", "Icons only", TB_STYLE_ICONS },
119 { "TEXT", "Text only", TB_STYLE_TEXT },
120 { "BOTH", "Icons & Text", TB_STYLE_BOTH },
125 static const enum_val_t gui_console_open_vals[] = {
126 { "NEVER", "Never", console_open_never },
127 { "AUTOMATIC", "Automatic (advanced user)", console_open_auto },
128 { "ALWAYS", "Always (debugging)", console_open_always },
133 static const enum_val_t gui_fileopen_vals[] = {
134 { "LAST_OPENED", "Remember last directory", FO_STYLE_LAST_OPENED },
135 { "SPECIFIED", "Always start in:", FO_STYLE_SPECIFIED },
139 /* Set to FALSE initially; set to TRUE if the user ever hits "OK" on
140 the "Font..." dialog, so that we know that they (probably) changed
141 the font, and therefore that the "apply" function needs to take care
143 static gboolean font_changed;
145 /* Font name from the font dialog box; if "font_changed" is TRUE, this
146 has been set to the name of the font the user selected. */
147 static gchar *new_font_name;
149 static GtkWidget *font_browse_w;
151 /* Used to contain the string from the Recent Files Count Max pref item */
152 static char recent_files_count_max_str[128] = "";
154 /* Used to contain the string from the Recent Display Filter Max Entries pref item */
155 static char recent_df_entries_max_str[128] = "";
157 /* Used to contain the string from the Open File preview timeout pref item */
158 static char open_file_preview_str[128] = "";
160 /* Used to contain the string from the Auto Scroll Percentage pref item */
161 static char scroll_percent_preview_str[128] = "";
163 #define GUI_TABLE_ROWS 4
168 GtkWidget *main_tb, *main_vb;
169 GtkWidget *plist_browse_om;
170 GtkWidget *ptree_browse_om;
172 GtkWidget *console_open_om;
174 GtkWidget *fileopen_rb, *fileopen_dir_te, *fileopen_preview_te;
175 GtkWidget *recent_files_count_max_te, *recent_df_entries_max_te, *ask_unsaved_cb, *find_wrap_cb;
176 GtkWidget *use_pref_save_cb;
177 GtkWidget *show_version_cb;
178 GtkWidget *auto_scroll_cb, *scroll_percent_te;
179 GtkWidget *webbrowser_te;
180 GtkWidget *save_position_cb, *save_size_cb, *save_maximized_cb;
181 #if defined(HAVE_IGE_MAC_INTEGRATION) || defined(HAVE_GTKOSXAPPLICATION)
182 GtkWidget *macosx_style_cb;
184 GtkWidget *expert_info_eyecandy_cb;
187 char current_val_str[128];
189 /* The font haven't been changed yet. */
190 font_changed = FALSE;
192 /* The columns haven't been changed yet */
193 cfile.cinfo.columns_changed = FALSE;
195 /* Main vertical box */
196 main_vb = gtk_vbox_new(FALSE, 7);
197 gtk_container_set_border_width( GTK_CONTAINER(main_vb), 5 );
200 main_tb = gtk_table_new(GUI_TABLE_ROWS, 2, FALSE);
201 gtk_box_pack_start(GTK_BOX(main_vb), main_tb, FALSE, FALSE, 0);
202 gtk_table_set_row_spacings(GTK_TABLE(main_tb), 10);
203 gtk_table_set_col_spacings(GTK_TABLE(main_tb), 15);
205 /* Packet list selection browseable */
206 plist_browse_om = create_preference_option_menu(main_tb, pos++,
207 "Packet list selection mode:",
208 "Choose to browse or select a packet for detailed dissection.",
209 selection_mode_vals, prefs.gui_plist_sel_browse);
210 g_object_set_data(G_OBJECT(main_vb), PLIST_SEL_BROWSE_KEY, plist_browse_om);
212 /* Proto tree selection browseable */
213 ptree_browse_om = create_preference_option_menu(main_tb, pos++,
214 "Protocol tree selection mode:",
215 "Choose to browse or select.",
216 selection_mode_vals, prefs.gui_ptree_sel_browse);
217 g_object_set_data(G_OBJECT(main_vb), PTREE_SEL_BROWSE_KEY, ptree_browse_om);
220 save_position_cb = create_preference_check_button(main_tb, pos++,
221 "Save window position:",
222 "Whether to save the position of the main window.",
223 prefs.gui_geometry_save_position);
224 g_object_set_data(G_OBJECT(main_vb), GEOMETRY_POSITION_KEY, save_position_cb);
226 save_size_cb = create_preference_check_button(main_tb, pos++,
228 "Whether to save the size of the main window.",
229 prefs.gui_geometry_save_size);
230 g_object_set_data(G_OBJECT(main_vb), GEOMETRY_SIZE_KEY, save_size_cb);
232 save_maximized_cb = create_preference_check_button(main_tb, pos++,
233 "Save maximized state:",
234 "Whether to save the maximized state of the main window.",
235 prefs.gui_geometry_save_maximized);
236 g_object_set_data(G_OBJECT(main_vb), GEOMETRY_MAXIMIZED_KEY, save_maximized_cb);
238 #if defined(HAVE_IGE_MAC_INTEGRATION) || defined(HAVE_GTKOSXAPPLICATION)
239 macosx_style_cb = create_preference_check_button(main_tb, pos++,
241 "Whether to create a Mac OS X look and feel. Checking this box will move the "
242 "menu bar to the top of the screen instead of the top of the Wireshark window. "
243 "Requires a restart of Wireshark to take effect.",
244 prefs.gui_macosx_style);
245 g_object_set_data(G_OBJECT(main_vb), MACOSX_STYLE_KEY, macosx_style_cb);
249 /* How the console window should be opened */
250 console_open_om = create_preference_option_menu(main_tb, pos++,
251 "Open a console window",
252 "Whether to open a console window "
253 "(Automatic will open a console if messages appear).",
254 gui_console_open_vals, prefs.gui_console_open);
255 g_object_set_data(G_OBJECT(main_vb), GUI_CONSOLE_OPEN_KEY, console_open_om);
258 /* Allow user to select where they want the File Open dialog to open to
260 fileopen_rb = create_preference_radio_buttons(main_tb, pos++,
261 "\"File Open\" dialog behavior:",
262 "Which directory the \"File Open\" dialog should start with.",
263 gui_fileopen_vals, prefs.gui_fileopen_style);
265 /* Directory to default File Open dialog to */
266 fileopen_dir_te = create_preference_entry(main_tb, pos++,
268 "The \"File Open\" dialog defaults always to this directory.",
269 prefs.gui_fileopen_dir);
270 g_object_set_data(G_OBJECT(main_vb), GUI_FILEOPEN_KEY, fileopen_rb);
271 g_object_set_data(G_OBJECT(main_vb), GUI_FILEOPEN_DIR_KEY, fileopen_dir_te);
272 g_signal_connect(fileopen_rb, "clicked", G_CALLBACK(fileopen_selected_cb), main_vb);
273 g_signal_connect(fileopen_dir_te, "focus-out-event",
274 G_CALLBACK(fileopen_dir_changed_cb), main_vb);
276 /* File Open dialog preview timeout */
277 fileopen_preview_te = create_preference_entry(main_tb, pos++,
278 "\"File Open\" preview timeout:",
279 "Reading preview data in the \"File Open\" dialog will be stopped after given seconds.",
280 open_file_preview_str);
281 g_snprintf(current_val_str, sizeof(current_val_str), "%d", prefs.gui_fileopen_preview);
282 gtk_entry_set_text(GTK_ENTRY(fileopen_preview_te), current_val_str);
283 g_object_set_data(G_OBJECT(main_vb), GUI_FILEOPEN_PREVIEW_KEY, fileopen_preview_te);
284 g_signal_connect(fileopen_preview_te, "focus_out_event", G_CALLBACK(fileopen_preview_changed_cb), main_vb);
286 /* Number of recent entries in the display filter list ... */
287 recent_df_entries_max_te = create_preference_entry(main_tb, pos++,
288 "Filter display max. list entries:",
289 "Maximum number of recent entries in filter display list.",
290 recent_df_entries_max_str);
291 g_snprintf(current_val_str, sizeof(current_val_str), "%d", prefs.gui_recent_df_entries_max);
292 gtk_entry_set_text(GTK_ENTRY(recent_df_entries_max_te), current_val_str);
293 g_object_set_data(G_OBJECT(main_vb), GUI_RECENT_DF_ENTRIES_KEY, recent_df_entries_max_te);
294 g_signal_connect(recent_df_entries_max_te, "focus_out_event", G_CALLBACK(recent_df_entries_changed_cb), main_vb);
296 /* Number of entries in the recent_files list ... */
297 recent_files_count_max_te = create_preference_entry(main_tb, pos++,
298 "\"Open Recent\" max. list entries:",
299 "Maximum number of entries in the \"File/Open Recent\" list.",
300 recent_files_count_max_str);
301 g_snprintf(current_val_str, sizeof(current_val_str), "%d", prefs.gui_recent_files_count_max);
302 gtk_entry_set_text(GTK_ENTRY(recent_files_count_max_te), current_val_str);
303 g_object_set_data(G_OBJECT(main_vb), GUI_RECENT_FILES_COUNT_KEY, recent_files_count_max_te);
304 g_signal_connect(recent_files_count_max_te, "focus_out_event", G_CALLBACK(recent_files_count_changed_cb), main_vb);
306 fileopen_selected_cb(NULL, main_vb);
308 /* ask for unsaved capture files? */
309 ask_unsaved_cb = create_preference_check_button(main_tb, pos++,
310 "Ask for unsaved capture files:",
311 "Whether a dialog should pop up in case of an unsaved capture file.",
312 prefs.gui_ask_unsaved);
313 g_object_set_data(G_OBJECT(main_vb), GUI_ASK_UNSAVED_KEY, ask_unsaved_cb);
315 /* do we want to wrap when searching for data? */
316 find_wrap_cb = create_preference_check_button(main_tb, pos++,
317 "Wrap to end/beginning of file during a find:",
318 "Whether a search should wrap in a capture file.",
319 prefs.gui_find_wrap);
320 g_object_set_data(G_OBJECT(main_vb), GUI_FIND_WRAP_KEY, find_wrap_cb);
322 /* show an explicit Save button for settings dialogs (preferences and alike)? */
323 use_pref_save_cb = create_preference_check_button(main_tb, pos++,
324 "Settings dialogs show a save button:",
325 "Whether the various settings dialogs (e.g. Preferences) should "
326 "use an explicit save button - for advanced users.",
327 prefs.gui_use_pref_save);
328 g_object_set_data(G_OBJECT(main_vb), GUI_USE_PREF_SAVE_KEY, use_pref_save_cb);
330 /* Show version in welcome screen */
331 show_version_cb = create_preference_check_button(main_tb, pos++,
332 "Welcome screen and title bar shows version:",
333 "Whether version should be shown in the start page and main screen's title bar.",
334 prefs.gui_version_in_start_page );
335 g_object_set_data(G_OBJECT(main_vb), GUI_SHOW_VERSION_KEY, show_version_cb);
337 /* Whether to auto scroll when expanding items */
338 auto_scroll_cb = create_preference_check_button(main_tb, pos++,
339 "Auto scroll on expansion:",
340 "Whether the details view should be automatically scrolled up when expanding an item.",
341 prefs.gui_auto_scroll_on_expand );
342 g_object_set_data(G_OBJECT(main_vb), GUI_AUTO_SCROLL_KEY, auto_scroll_cb);
344 /* Where to auto scroll to when expanding items */
345 scroll_percent_te = create_preference_entry(main_tb, pos++,
346 "Auto scroll percentage:",
347 "Where to scroll the expanded item to within the view e.g. 0% = top of view, 50% = center of view.",
348 scroll_percent_preview_str);
349 g_snprintf(current_val_str, sizeof(current_val_str), "%d", prefs.gui_auto_scroll_percentage);
350 gtk_entry_set_text(GTK_ENTRY(scroll_percent_te), current_val_str);
351 g_object_set_data(G_OBJECT(main_vb), GUI_SCROLL_PERCENT_KEY, scroll_percent_te);
352 g_signal_connect(scroll_percent_te, "focus_out_event", G_CALLBACK(scroll_percent_changed_cb), main_vb);
355 if (browser_needs_pref()) {
356 webbrowser_te = create_preference_entry(main_tb, pos++,
357 "Web browser command:",
358 "Command line to desired browser.",
359 prefs.gui_webbrowser);
360 gtk_entry_set_text(GTK_ENTRY(webbrowser_te), prefs.gui_webbrowser);
361 g_object_set_data(G_OBJECT(main_vb), GUI_WEBBROWSER_KEY, webbrowser_te);
364 /* Enable Expert Infos Dialog Tab Label "eye-candy" */
365 expert_info_eyecandy_cb = create_preference_check_button(main_tb, pos++,
366 "Display LEDs in the Expert Infos dialog tab labels:",
367 "Whether colored LED images should be displayed in the Expert Infos dialog tab labels.",
368 prefs.gui_expert_composite_eyecandy );
369 g_object_set_data(G_OBJECT(main_vb), GUI_EXPERT_EYECANDY_KEY, expert_info_eyecandy_cb);
371 /* Show 'em what we got */
372 gtk_widget_show_all(main_vb);
378 /* Create a font widget for browsing. */
380 gui_font_prefs_show(void)
382 /* Create the font selection widget. */
383 font_browse_w = (GtkWidget *) gtk_font_selection_new();
384 gtk_widget_show(font_browse_w);
386 return font_browse_w;
395 font_name = g_strdup(gtk_font_selection_get_font_name(
396 GTK_FONT_SELECTION(font_browse_w)));
397 if (font_name == NULL) {
398 /* No font was selected; let the user know, but don't
399 tear down the font selection dialog, so they can
401 simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK,
402 "You have not selected a font.");
406 if (!user_font_test(font_name)) {
407 /* The font isn't usable; "user_font_test()" has already
408 told the user why. Don't tear down the font selection
413 new_font_name = font_name;
419 fetch_enum_value(gpointer control, const enum_val_t *enumvals)
421 return fetch_preference_option_menu_val(GTK_WIDGET(control), enumvals);
425 gui_prefs_fetch(GtkWidget *w)
427 prefs.gui_plist_sel_browse = fetch_enum_value(
428 g_object_get_data(G_OBJECT(w), PLIST_SEL_BROWSE_KEY), selection_mode_vals);
429 prefs.gui_ptree_sel_browse = fetch_enum_value(
430 g_object_get_data(G_OBJECT(w), PTREE_SEL_BROWSE_KEY), selection_mode_vals);
431 prefs.gui_geometry_save_position =
432 gtk_toggle_button_get_active(g_object_get_data(G_OBJECT(w), GEOMETRY_POSITION_KEY));
433 prefs.gui_geometry_save_size =
434 gtk_toggle_button_get_active(g_object_get_data(G_OBJECT(w), GEOMETRY_SIZE_KEY));
435 prefs.gui_geometry_save_maximized =
436 gtk_toggle_button_get_active(g_object_get_data(G_OBJECT(w), GEOMETRY_MAXIMIZED_KEY));
438 #if defined(HAVE_IGE_MAC_INTEGRATION) || defined(HAVE_GTKOSXAPPLICATION)
439 prefs.gui_macosx_style =
440 gtk_toggle_button_get_active(g_object_get_data(G_OBJECT(w), MACOSX_STYLE_KEY));
444 prefs.gui_console_open = fetch_enum_value(
445 g_object_get_data(G_OBJECT(w), GUI_CONSOLE_OPEN_KEY), gui_console_open_vals);
447 prefs.gui_fileopen_style = fetch_preference_radio_buttons_val(
448 g_object_get_data(G_OBJECT(w), GUI_FILEOPEN_KEY), gui_fileopen_vals);
450 g_free(prefs.gui_fileopen_dir);
451 prefs.gui_fileopen_dir = g_strdup(gtk_entry_get_text(
452 GTK_ENTRY(g_object_get_data(G_OBJECT(w), GUI_FILEOPEN_DIR_KEY))));
454 prefs.gui_ask_unsaved =
455 gtk_toggle_button_get_active(g_object_get_data(G_OBJECT(w), GUI_ASK_UNSAVED_KEY));
457 prefs.gui_find_wrap =
458 gtk_toggle_button_get_active(g_object_get_data(G_OBJECT(w), GUI_FIND_WRAP_KEY));
460 prefs.gui_use_pref_save =
461 gtk_toggle_button_get_active(g_object_get_data(G_OBJECT(w), GUI_USE_PREF_SAVE_KEY));
463 prefs.gui_version_in_start_page =
464 gtk_toggle_button_get_active(g_object_get_data(G_OBJECT(w), GUI_SHOW_VERSION_KEY));
466 prefs.gui_auto_scroll_on_expand =
467 gtk_toggle_button_get_active(g_object_get_data(G_OBJECT(w), GUI_AUTO_SCROLL_KEY));
469 if (browser_needs_pref()) {
470 g_free(prefs.gui_webbrowser);
471 prefs.gui_webbrowser = g_strdup(gtk_entry_get_text(
472 GTK_ENTRY(g_object_get_data(G_OBJECT(w), GUI_WEBBROWSER_KEY))));
475 prefs.gui_expert_composite_eyecandy =
476 gtk_toggle_button_get_active(g_object_get_data(G_OBJECT(w), GUI_EXPERT_EYECANDY_KEY));
479 * XXX - we need to have a way to fetch the preferences into
480 * local storage and only set the permanent preferences if there
481 * weren't any errors in those fetches, as there are several
482 * places where there *can* be a bad preference value.
485 if (strcmp(new_font_name, prefs.gui_font_name) != 0) {
487 g_free(prefs.gui_font_name);
488 prefs.gui_font_name = g_strdup(new_font_name);
496 gui_prefs_apply(GtkWidget *w _U_ , gboolean redissect)
500 /* user immediately wants to see a console */
501 if (prefs.gui_console_open == console_open_always) {
507 /* This redraws the packet bytes windows. */
508 switch (user_font_apply()) {
513 case FA_FONT_NOT_RESIZEABLE:
514 /* "user_font_apply()" popped up an alert box. */
515 /* turn off zooming - font can't be resized */
516 recent.gui_zoom_level = 0;
519 case FA_FONT_NOT_AVAILABLE:
520 /* We assume this means that the specified size
522 simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK,
523 "That font isn't available at the specified zoom level;\n"
524 "turning zooming off.");
525 recent.gui_zoom_level = 0;
528 } else if (!redissect) {
529 /* Redraw the packet bytes windows, in case the
530 highlight style changed, only if we aren't redissecting the whole file.
531 XXX - do it only if the highlight style *did* change. */
532 redraw_packet_bytes_all();
535 /* Redisplay the main window's title */
536 update_main_window_title();
538 /* Redisplay the default welcome header message in case the "show
539 * version" option was changed. */
540 welcome_header_set_message(NULL);
542 /* Redraw the help window(s). */
546 /* XXX: redraw the toolbar only, if style changed */
547 toolbar_redraw_all();
549 set_scrollbar_placement_all();
550 new_packet_list_set_sel_browse(prefs.gui_plist_sel_browse, FALSE);
551 set_ptree_sel_browse_all(prefs.gui_ptree_sel_browse);
552 set_tree_styles_all();
553 main_widgets_rearrange();
557 gui_prefs_destroy(GtkWidget *w _U_)
559 /* Free up any saved font name. */
560 if (new_font_name != NULL) {
561 g_free(new_font_name);
562 new_font_name = NULL;
567 recent_df_entries_changed_cb(GtkWidget *recent_df_entry _U_,
568 GdkEvent *event _U_, gpointer parent_w)
570 GtkWidget *recent_df_entries_count_te;
573 recent_df_entries_count_te = (GtkWidget *)g_object_get_data(G_OBJECT(parent_w), GUI_RECENT_DF_ENTRIES_KEY);
576 * Now, just convert the string to a number and store it in the prefs
580 newval = strtol(gtk_entry_get_text (GTK_ENTRY(recent_df_entries_count_te)), NULL, 10);
583 prefs.gui_recent_df_entries_max = newval;
586 /* We really should pop up a nasty dialog box if newval <= 0 */
592 recent_files_count_changed_cb(GtkWidget *recent_files_entry _U_,
593 GdkEvent *event _U_, gpointer parent_w)
595 GtkWidget *recent_files_count_te;
598 recent_files_count_te = (GtkWidget *)g_object_get_data(G_OBJECT(parent_w), GUI_RECENT_FILES_COUNT_KEY);
601 * Now, just convert the string to a number and store it in the prefs
605 newval = strtol(gtk_entry_get_text (GTK_ENTRY(recent_files_count_te)), NULL, 10);
608 prefs.gui_recent_files_count_max = newval;
611 /* We really should pop up a nasty dialog box if newval <= 0 */
617 fileopen_preview_changed_cb(GtkWidget *recent_files_entry _U_,
618 GdkEvent *event _U_, gpointer parent_w)
620 GtkWidget *fileopen_preview_te;
623 fileopen_preview_te = (GtkWidget *)g_object_get_data(G_OBJECT(parent_w), GUI_FILEOPEN_PREVIEW_KEY);
626 * Now, just convert the string to a number and store it in the prefs
630 newval = strtol(gtk_entry_get_text (GTK_ENTRY(fileopen_preview_te)), NULL, 10);
633 prefs.gui_fileopen_preview = newval;
636 /* We really should pop up a nasty dialog box if newval <= 0 */
642 fileopen_dir_changed_cb(GtkWidget *fileopen_dir_te, GdkEvent *event _U_, gpointer parent_w _U_)
645 gint fileopen_dir_te_length;
647 fileopen_dir_te_length = (gint) strlen(gtk_entry_get_text (GTK_ENTRY(fileopen_dir_te)));
648 if (fileopen_dir_te_length == 0)
650 lastchar = gtk_editable_get_chars(GTK_EDITABLE(fileopen_dir_te), fileopen_dir_te_length-1, -1);
651 if (strcmp(lastchar, G_DIR_SEPARATOR_S) != 0){
652 gtk_editable_insert_text(GTK_EDITABLE(fileopen_dir_te), G_DIR_SEPARATOR_S,
653 1, /* new_text_length */
654 &fileopen_dir_te_length); /* *position */
660 fileopen_selected_cb(GtkWidget *mybutton_rb _U_, gpointer parent_w)
662 GtkWidget *fileopen_rb, *fileopen_dir_te;
664 fileopen_rb = (GtkWidget *)g_object_get_data(G_OBJECT(parent_w), GUI_FILEOPEN_KEY);
665 fileopen_dir_te = (GtkWidget *)g_object_get_data(G_OBJECT(parent_w), GUI_FILEOPEN_DIR_KEY);
667 if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(fileopen_rb)))
669 gtk_widget_set_sensitive(GTK_WIDGET(fileopen_dir_te), TRUE);
673 gtk_widget_set_sensitive(GTK_WIDGET(fileopen_dir_te), FALSE);
679 scroll_percent_changed_cb(GtkWidget *recent_files_entry _U_,
680 GdkEvent *event _U_, gpointer parent_w)
682 GtkWidget *scroll_percent_te;
685 scroll_percent_te = (GtkWidget*)g_object_get_data(G_OBJECT(parent_w), GUI_SCROLL_PERCENT_KEY);
688 * Now, just convert the string to a number and store it in the prefs field ...
691 newval = strtol(gtk_entry_get_text(GTK_ENTRY(scroll_percent_te)), NULL, 10);
694 prefs.gui_auto_scroll_percentage = newval;
697 /* We really should pop up a dialog box is newval < 0 or > 100 */