Fix the wireless settings button for AirPCap devices in the
[obnox/wireshark/wip.git] / gtk / prefs_gui.c
1 /* gui_prefs.c
2  * Dialog box for GUI preferences
3  *
4  * $Id$
5  *
6  * Wireshark - Network traffic analyzer
7  * By Gerald Combs <gerald@wireshark.org>
8  * Copyright 1998 Gerald Combs
9  *
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.
14  *
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.
19  *
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.
23  */
24
25 #ifdef HAVE_CONFIG_H
26 #include "config.h"
27 #endif
28 #include <string.h>
29
30 #include <gtk/gtk.h>
31
32 #include <epan/prefs.h>
33
34 #include "../simple_dialog.h"
35
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"
43 #include "gtk/main.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"
51
52
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"
68
69 #define MACOSX_STYLE_KEY                "macosx_style"
70
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"
85
86 static const enum_val_t scrollbar_placement_vals[] _U_ = {
87         { "FALSE", "Left", FALSE },
88         { "TRUE",  "Right", TRUE },
89         { NULL,    NULL,    0 }
90 };
91
92 static const enum_val_t selection_mode_vals[] = {
93         { "FALSE", "Selects", FALSE },
94         { "TRUE",  "Browses", TRUE },
95         { NULL,    NULL,      0 }
96 };
97
98 static const enum_val_t altern_colors_vals[] _U_ = {
99         { "FALSE", "No",  FALSE },
100         { "TRUE",  "Yes", TRUE },
101         { NULL,    NULL,  0 }
102 };
103
104 static const enum_val_t filter_toolbar_placement_vals[] _U_ = {
105         { "FALSE", "Below the main toolbar", FALSE },
106         { "TRUE",  "Insert into statusbar",  TRUE },
107         { NULL,    NULL,                     0 }
108 };
109
110 static const enum_val_t highlight_style_vals[] _U_ = {
111         { "FALSE", "Bold",     FALSE },
112         { "TRUE",  "Inverse",  TRUE },
113         { NULL,    NULL,       0 }
114 };
115
116
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 },
121         { NULL,    NULL,             0 }
122 };
123
124 #ifdef _WIN32
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 },
129         { NULL,        NULL,                         0 }
130 };
131 #endif
132
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 },
136         { NULL,          NULL,                      0 }
137 };
138
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
142    of that */
143 static gboolean font_changed;
144
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;
148
149 static GtkWidget *font_browse_w;
150
151 /* Used to contain the string from the Recent Files Count Max pref item */
152 static char recent_files_count_max_str[128] = "";
153
154 /* Used to contain the string from the Recent Display Filter Max Entries pref item */
155 static char recent_df_entries_max_str[128] = "";
156
157 /* Used to contain the string from the Open File preview timeout pref item */
158 static char open_file_preview_str[128] = "";
159
160 /* Used to contain the string from the Auto Scroll Percentage pref item */
161 static char scroll_percent_preview_str[128] = "";
162
163 #define GUI_TABLE_ROWS 4
164
165 GtkWidget*
166 gui_prefs_show(void)
167 {
168         GtkWidget *main_tb, *main_vb;
169         GtkWidget *plist_browse_om;
170         GtkWidget *ptree_browse_om;
171 #ifdef _WIN32
172         GtkWidget *console_open_om;
173 #endif
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;
183 #endif
184         GtkWidget *expert_info_eyecandy_cb;
185
186         int        pos = 0;
187         char       current_val_str[128];
188
189         /* The font haven't been changed yet. */
190         font_changed = FALSE;
191
192         /* The columns haven't been changed yet */
193         cfile.cinfo.columns_changed = FALSE;
194
195         /* Main vertical box */
196         main_vb = gtk_vbox_new(FALSE, 7);
197         gtk_container_set_border_width( GTK_CONTAINER(main_vb), 5 );
198
199         /* Main table */
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);
204
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);
211
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);
218
219         /* Geometry prefs */
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);
225
226         save_size_cb = create_preference_check_button(main_tb, pos++,
227             "Save window size:",
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);
231
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);
237
238 #if defined(HAVE_IGE_MAC_INTEGRATION) || defined(HAVE_GTKOSXAPPLICATION)
239         macosx_style_cb = create_preference_check_button(main_tb, pos++,
240             "Mac OS X style",
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);
246 #endif
247
248 #ifdef _WIN32
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);
256 #endif
257
258         /* Allow user to select where they want the File Open dialog to open to
259          * by default */
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);
264
265         /* Directory to default File Open dialog to */
266         fileopen_dir_te = create_preference_entry(main_tb, pos++,
267             "Directory:",
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);
275
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);
285
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);
295
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);
305
306         fileopen_selected_cb(NULL, main_vb);
307
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);
314
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);
321
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);
329
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);
336
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);
343
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);
353
354         /* Webbrowser */
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);
362         }
363
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);
370
371         /* Show 'em what we got */
372         gtk_widget_show_all(main_vb);
373
374         return(main_vb);
375 }
376
377
378 /* Create a font widget for browsing. */
379 GtkWidget *
380 gui_font_prefs_show(void)
381 {
382         /* Create the font selection widget. */
383         font_browse_w = (GtkWidget *) gtk_font_selection_new();
384         gtk_widget_show(font_browse_w);
385
386         return font_browse_w;
387 }
388
389
390 static gboolean
391 font_fetch(void)
392 {
393         gchar   *font_name;
394
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
400                    try again. */
401                 simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK,
402                    "You have not selected a font.");
403                 return FALSE;
404         }
405
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
409                    dialog. */
410                 g_free(font_name);
411                 return FALSE;
412         }
413         new_font_name = font_name;
414         return TRUE;
415 }
416
417
418 static gint
419 fetch_enum_value(gpointer control, const enum_val_t *enumvals)
420 {
421         return fetch_preference_option_menu_val(GTK_WIDGET(control), enumvals);
422 }
423
424 void
425 gui_prefs_fetch(GtkWidget *w)
426 {
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));
437
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));
441 #endif
442
443 #ifdef _WIN32
444         prefs.gui_console_open = fetch_enum_value(
445                 g_object_get_data(G_OBJECT(w), GUI_CONSOLE_OPEN_KEY), gui_console_open_vals);
446 #endif
447         prefs.gui_fileopen_style = fetch_preference_radio_buttons_val(
448                 g_object_get_data(G_OBJECT(w), GUI_FILEOPEN_KEY), gui_fileopen_vals);
449
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))));
453
454         prefs.gui_ask_unsaved =
455                 gtk_toggle_button_get_active(g_object_get_data(G_OBJECT(w), GUI_ASK_UNSAVED_KEY));
456
457         prefs.gui_find_wrap =
458                 gtk_toggle_button_get_active(g_object_get_data(G_OBJECT(w), GUI_FIND_WRAP_KEY));
459
460         prefs.gui_use_pref_save =
461                 gtk_toggle_button_get_active(g_object_get_data(G_OBJECT(w), GUI_USE_PREF_SAVE_KEY));
462
463         prefs.gui_version_in_start_page  =
464                 gtk_toggle_button_get_active(g_object_get_data(G_OBJECT(w), GUI_SHOW_VERSION_KEY));
465
466         prefs.gui_auto_scroll_on_expand = 
467                 gtk_toggle_button_get_active(g_object_get_data(G_OBJECT(w), GUI_AUTO_SCROLL_KEY));
468
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))));
473         }
474
475         prefs.gui_expert_composite_eyecandy =
476                 gtk_toggle_button_get_active(g_object_get_data(G_OBJECT(w), GUI_EXPERT_EYECANDY_KEY));
477
478         /*
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.
483          */
484         if (font_fetch()) {
485                 if (strcmp(new_font_name, prefs.gui_font_name) != 0) {
486                         font_changed = TRUE;
487                         g_free(prefs.gui_font_name);
488                         prefs.gui_font_name = g_strdup(new_font_name);
489                 }
490         }
491 }
492
493
494
495 void
496 gui_prefs_apply(GtkWidget *w _U_ , gboolean redissect)
497 {
498
499 #ifdef _WIN32
500         /* user immediately wants to see a console */
501         if (prefs.gui_console_open == console_open_always) {
502                 create_console();
503         }
504 #endif
505
506         if (font_changed) {
507                 /* This redraws the packet bytes windows. */
508                 switch (user_font_apply()) {
509
510                 case FA_SUCCESS:
511                         break;
512
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;
517                         break;
518
519                 case FA_FONT_NOT_AVAILABLE:
520                         /* We assume this means that the specified size
521                            isn't available. */
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;
526                         break;
527                 }
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();
533         }
534
535         /* Redisplay the main window's title */
536         update_main_window_title();
537
538         /* Redisplay the default welcome header message in case the "show 
539          * version" option was changed. */
540         welcome_header_set_message(NULL);
541
542         /* Redraw the help window(s). */
543         supported_redraw();
544         help_redraw();
545
546         /* XXX: redraw the toolbar only, if style changed */
547         toolbar_redraw_all();
548
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();
554 }
555
556 void
557 gui_prefs_destroy(GtkWidget *w _U_)
558 {
559         /* Free up any saved font name. */
560         if (new_font_name != NULL) {
561                 g_free(new_font_name);
562                 new_font_name = NULL;
563         }
564 }
565
566 static gboolean
567 recent_df_entries_changed_cb(GtkWidget *recent_df_entry _U_,
568                               GdkEvent *event _U_, gpointer parent_w)
569 {
570         GtkWidget       *recent_df_entries_count_te;
571         guint newval;
572
573         recent_df_entries_count_te = (GtkWidget *)g_object_get_data(G_OBJECT(parent_w), GUI_RECENT_DF_ENTRIES_KEY);
574
575         /*
576          * Now, just convert the string to a number and store it in the prefs
577          * filed ...
578          */
579
580         newval = strtol(gtk_entry_get_text (GTK_ENTRY(recent_df_entries_count_te)), NULL, 10);
581
582         if (newval > 0) {
583                 prefs.gui_recent_df_entries_max = newval;
584         }
585
586         /* We really should pop up a nasty dialog box if newval <= 0 */
587
588         return FALSE;
589 }
590
591 static gboolean
592 recent_files_count_changed_cb(GtkWidget *recent_files_entry _U_,
593                               GdkEvent *event _U_, gpointer parent_w)
594 {
595         GtkWidget       *recent_files_count_te;
596         guint newval;
597
598         recent_files_count_te = (GtkWidget *)g_object_get_data(G_OBJECT(parent_w), GUI_RECENT_FILES_COUNT_KEY);
599
600         /*
601          * Now, just convert the string to a number and store it in the prefs
602          * filed ...
603          */
604
605         newval = strtol(gtk_entry_get_text (GTK_ENTRY(recent_files_count_te)), NULL, 10);
606
607         if (newval > 0) {
608                 prefs.gui_recent_files_count_max = newval;
609         }
610
611         /* We really should pop up a nasty dialog box if newval <= 0 */
612
613         return FALSE;
614 }
615
616 static gboolean
617 fileopen_preview_changed_cb(GtkWidget *recent_files_entry _U_,
618                               GdkEvent *event _U_, gpointer parent_w)
619 {
620         GtkWidget       *fileopen_preview_te;
621         guint newval;
622
623         fileopen_preview_te = (GtkWidget *)g_object_get_data(G_OBJECT(parent_w), GUI_FILEOPEN_PREVIEW_KEY);
624
625         /*
626          * Now, just convert the string to a number and store it in the prefs
627          * filed ...
628          */
629
630         newval = strtol(gtk_entry_get_text (GTK_ENTRY(fileopen_preview_te)), NULL, 10);
631
632         if (newval > 0) {
633                 prefs.gui_fileopen_preview = newval;
634         }
635
636         /* We really should pop up a nasty dialog box if newval <= 0 */
637
638         return FALSE;
639 }
640
641 static gboolean
642 fileopen_dir_changed_cb(GtkWidget *fileopen_dir_te, GdkEvent *event _U_, gpointer parent_w _U_)
643 {
644         char *lastchar;
645         gint fileopen_dir_te_length;
646
647         fileopen_dir_te_length = (gint) strlen(gtk_entry_get_text (GTK_ENTRY(fileopen_dir_te)));
648         if (fileopen_dir_te_length == 0)
649                 return FALSE;
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 */
655         }
656         return FALSE;
657 }
658
659 static void
660 fileopen_selected_cb(GtkWidget *mybutton_rb _U_, gpointer parent_w)
661 {
662         GtkWidget       *fileopen_rb, *fileopen_dir_te;
663
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);
666
667         if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(fileopen_rb)))
668         {
669                 gtk_widget_set_sensitive(GTK_WIDGET(fileopen_dir_te), TRUE);
670         }
671         else
672         {
673                 gtk_widget_set_sensitive(GTK_WIDGET(fileopen_dir_te), FALSE);
674         }
675         return;
676 }
677
678 static gboolean
679 scroll_percent_changed_cb(GtkWidget *recent_files_entry _U_, 
680                           GdkEvent *event _U_, gpointer parent_w)
681 {
682   GtkWidget *scroll_percent_te;
683   guint newval;
684
685   scroll_percent_te = (GtkWidget*)g_object_get_data(G_OBJECT(parent_w), GUI_SCROLL_PERCENT_KEY);
686
687   /* 
688    * Now, just convert the string to a number and store it in the prefs field ...
689    */
690
691   newval = strtol(gtk_entry_get_text(GTK_ENTRY(scroll_percent_te)), NULL, 10);
692   
693   if (newval <= 100) {
694     prefs.gui_auto_scroll_percentage = newval;
695   }
696
697   /* We really should pop up a dialog box is newval < 0 or > 100 */
698   return FALSE;
699 }