Add Packet Editor Preference
[metze/wireshark/wip.git] / ui / 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
23  */
24
25 #include "config.h"
26 #include <string.h>
27
28 #include <gtk/gtk.h>
29
30 #include <epan/prefs.h>
31
32 #include "cfile.h"
33
34 #include "ui/recent.h"
35
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"
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 GEOMETRY_POSITION_KEY           "geometry_position"
64 #define GEOMETRY_SIZE_KEY               "geometry_size"
65 #define GEOMETRY_MAXIMIZED_KEY          "geometry_maximized"
66
67 #if defined(HAVE_IGE_MAC_INTEGRATION) || defined(HAVE_GTKOSXAPPLICATION)
68 #define MACOSX_STYLE_KEY                "macosx_style"
69 #endif
70
71 #ifdef _WIN32
72 #define GUI_CONSOLE_OPEN_KEY            "console_open"
73 #define ENABLE_UPDATE_KEY               "enable_update"
74 #endif
75
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"
90
91 static const enum_val_t filter_toolbar_placement_vals[] _U_ = {
92         { "FALSE", "Below the main toolbar", FALSE },
93         { "TRUE",  "Insert into statusbar",  TRUE },
94         { NULL,    NULL,                     0 }
95 };
96
97 static const enum_val_t highlight_style_vals[] _U_ = {
98         { "FALSE", "Bold",     FALSE },
99         { "TRUE",  "Inverse",  TRUE },
100         { NULL,    NULL,       0 }
101 };
102
103
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 },
108         { NULL,    NULL,             0 }
109 };
110
111 #ifdef _WIN32
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 },
116         { NULL,        NULL,                         0 }
117 };
118 #endif
119
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 },
125         { NULL,        NULL,                         0 }
126 };
127
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 },
131         { NULL,          NULL,                      0 }
132 };
133
134 /* Used to contain the string from the Recent Files Count Max pref item */
135 static char recent_files_count_max_str[128] = "";
136
137 /* Used to contain the string from the Recent Display Filter Max Entries pref item */
138 static char recent_df_entries_max_str[128] = "";
139
140 /* Used to contain the string from the Open File preview timeout pref item */
141 static char open_file_preview_str[128] = "";
142
143 /* Used to contain the string from the Auto Scroll Percentage pref item */
144 static char scroll_percent_preview_str[128] = "";
145
146 GtkWidget*
147 gui_prefs_show(void)
148 {
149         GtkWidget *main_grid, *main_vb;
150 #ifdef _WIN32
151         GtkWidget *console_open_om, *enable_update_cb;
152 #endif
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;
162 #endif
163         GtkWidget *expert_info_eyecandy_cb;
164         GtkWidget *packet_editor_cb;
165
166         int        pos = 0;
167         char       current_val_str[128];
168
169         /* The columns haven't been changed yet */
170         cfile.columns_changed = FALSE;
171
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 );
175
176         /* Main grid */
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 */
181 #endif
182         ws_gtk_grid_set_row_spacing(GTK_GRID(main_grid), 10);
183         ws_gtk_grid_set_column_spacing(GTK_GRID(main_grid), 15);
184
185         /* Geometry prefs */
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);
191
192         save_size_cb = create_preference_check_button(main_grid, pos++,
193             "Save window size:",
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);
197
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);
203
204 #ifdef _WIN32
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);
210 #endif
211
212 #if defined(HAVE_IGE_MAC_INTEGRATION) || defined(HAVE_GTKOSXAPPLICATION)
213         macosx_style_cb = create_preference_check_button(main_grid, pos++,
214             "Mac OS X style",
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);
220 #endif
221
222 #ifdef _WIN32
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);
230 #endif
231
232         /* Allow user to select where they want the File Open dialog to open to
233          * by default */
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);
238
239         /* Directory to default File Open dialog to */
240         fileopen_dir_te = create_preference_entry(main_grid, pos++,
241             "Directory:",
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);
249
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);
259
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);
269
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);
279
280         fileopen_selected_cb(NULL, main_vb);
281
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);
288
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);
295
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);
303
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);
310
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);
317
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);
327
328         /* Webbrowser */
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);
336         }
337
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);
344
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);
351
352         /* Show 'em what we got */
353         gtk_widget_show_all(main_vb);
354
355         return(main_vb);
356 }
357
358
359 static gint
360 fetch_enum_value(gpointer control, const enum_val_t *enumvals)
361 {
362         return fetch_preference_option_menu_val(GTK_WIDGET(control), enumvals);
363 }
364
365 void
366 gui_prefs_fetch(GtkWidget *w)
367 {
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));
374
375 #ifdef _WIN32
376         prefs.gui_update_enabled =
377                 gtk_toggle_button_get_active((GtkToggleButton *)g_object_get_data(G_OBJECT(w), ENABLE_UPDATE_KEY));
378 #endif
379
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));
383 #endif
384
385 #ifdef _WIN32
386         prefs.gui_console_open = fetch_enum_value(
387                 g_object_get_data(G_OBJECT(w), GUI_CONSOLE_OPEN_KEY), gui_console_open_vals);
388 #endif
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);
391
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))));
395
396         prefs.gui_ask_unsaved =
397                 gtk_toggle_button_get_active((GtkToggleButton *)g_object_get_data(G_OBJECT(w), GUI_ASK_UNSAVED_KEY));
398
399         prefs.gui_find_wrap =
400                 gtk_toggle_button_get_active((GtkToggleButton *)g_object_get_data(G_OBJECT(w), GUI_FIND_WRAP_KEY));
401
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));
404
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);
407
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));
410
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))));
415         }
416
417         prefs.gui_expert_composite_eyecandy =
418                 gtk_toggle_button_get_active((GtkToggleButton *)g_object_get_data(G_OBJECT(w), GUI_EXPERT_EYECANDY_KEY));
419
420         prefs.gui_packet_editor =
421                 gtk_toggle_button_get_active((GtkToggleButton *)g_object_get_data(G_OBJECT(w), GUI_PACKET_EDITOR));
422 }
423
424
425
426 void
427 gui_prefs_apply(GtkWidget *w _U_)
428 {
429
430 #ifdef _WIN32
431         /* user immediately wants to see a console */
432         if (prefs.gui_console_open == console_open_always) {
433                 create_console();
434         }
435 #endif
436
437         /* Redisplay the main window's title */
438         main_titlebar_update();
439
440         /* Redisplay the default welcome header message in case the "show
441          * version" option was changed. */
442         welcome_header_set_message(NULL);
443
444         /* Redraw the help window(s). */
445         supported_redraw();
446         help_redraw();
447
448         /* XXX: redraw the toolbar only, if style changed */
449         toolbar_redraw_all();
450
451         set_tree_styles_all();
452         main_widgets_rearrange();
453 }
454
455 void
456 gui_prefs_destroy(GtkWidget *w _U_)
457 {
458 }
459
460 static gboolean
461 recent_df_entries_changed_cb(GtkWidget *recent_df_entry _U_,
462                               GdkEvent *event _U_, gpointer parent_w)
463 {
464         GtkWidget       *recent_df_entries_count_te;
465         guint newval;
466
467         recent_df_entries_count_te = (GtkWidget *)g_object_get_data(G_OBJECT(parent_w), GUI_RECENT_DF_ENTRIES_KEY);
468
469         /*
470          * Now, just convert the string to a number and store it in the prefs
471          * filed ...
472          */
473
474         newval = (guint)strtol(gtk_entry_get_text (GTK_ENTRY(recent_df_entries_count_te)), NULL, 10);
475
476         if (newval > 0) {
477                 prefs.gui_recent_df_entries_max = newval;
478         }
479
480         /* We really should pop up a nasty dialog box if newval <= 0 */
481
482         return FALSE;
483 }
484
485 static gboolean
486 recent_files_count_changed_cb(GtkWidget *recent_files_entry _U_,
487                               GdkEvent *event _U_, gpointer parent_w)
488 {
489         GtkWidget       *recent_files_count_te;
490         guint newval;
491
492         recent_files_count_te = (GtkWidget *)g_object_get_data(G_OBJECT(parent_w), GUI_RECENT_FILES_COUNT_KEY);
493
494         /*
495          * Now, just convert the string to a number and store it in the prefs
496          * filed ...
497          */
498
499         newval = (guint)strtol(gtk_entry_get_text (GTK_ENTRY(recent_files_count_te)), NULL, 10);
500
501         if (newval > 0) {
502                 prefs.gui_recent_files_count_max = newval;
503         }
504
505         /* We really should pop up a nasty dialog box if newval <= 0 */
506
507         return FALSE;
508 }
509
510 static gboolean
511 fileopen_preview_changed_cb(GtkWidget *recent_files_entry _U_,
512                               GdkEvent *event _U_, gpointer parent_w)
513 {
514         GtkWidget       *fileopen_preview_te;
515         guint newval;
516
517         fileopen_preview_te = (GtkWidget *)g_object_get_data(G_OBJECT(parent_w), GUI_FILEOPEN_PREVIEW_KEY);
518
519         /*
520          * Now, just convert the string to a number and store it in the prefs
521          * filed ...
522          */
523
524         newval = (guint)strtol(gtk_entry_get_text (GTK_ENTRY(fileopen_preview_te)), NULL, 10);
525
526         if (newval > 0) {
527                 prefs.gui_fileopen_preview = newval;
528         }
529
530         /* We really should pop up a nasty dialog box if newval <= 0 */
531
532         return FALSE;
533 }
534
535 static gboolean
536 fileopen_dir_changed_cb(GtkWidget *fileopen_dir_te, GdkEvent *event _U_, gpointer parent_w _U_)
537 {
538         char *lastchar;
539         gint fileopen_dir_te_length;
540
541         fileopen_dir_te_length = (gint) strlen(gtk_entry_get_text (GTK_ENTRY(fileopen_dir_te)));
542         if (fileopen_dir_te_length == 0)
543                 return FALSE;
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 */
549         }
550         return FALSE;
551 }
552
553 static void
554 fileopen_selected_cb(GtkWidget *mybutton_rb _U_, gpointer parent_w)
555 {
556         GtkWidget       *fileopen_rb, *fileopen_dir_te;
557
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);
560
561         if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(fileopen_rb)))
562         {
563                 gtk_widget_set_sensitive(GTK_WIDGET(fileopen_dir_te), TRUE);
564         }
565         else
566         {
567                 gtk_widget_set_sensitive(GTK_WIDGET(fileopen_dir_te), FALSE);
568         }
569         return;
570 }
571
572 static gboolean
573 scroll_percent_changed_cb(GtkWidget *recent_files_entry _U_,
574                           GdkEvent *event _U_, gpointer parent_w)
575 {
576         GtkWidget *scroll_percent_te;
577         guint newval;
578
579         scroll_percent_te = (GtkWidget*)g_object_get_data(G_OBJECT(parent_w), GUI_SCROLL_PERCENT_KEY);
580
581         /*
582          * Now, just convert the string to a number and store it in the prefs field ...
583          */
584
585         newval = (guint)strtol(gtk_entry_get_text(GTK_ENTRY(scroll_percent_te)), NULL, 10);
586
587         if (newval <= 100) {
588                 prefs.gui_auto_scroll_percentage = newval;
589         }
590
591         if (newval <= 100) {
592                 prefs.gui_auto_scroll_percentage = newval;
593         }
594
595         /* We really should pop up a dialog box is newval < 0 or > 100 */
596         return FALSE;
597 }
598
599 /*
600  * Editor modelines  -  http://www.wireshark.org/tools/modelines.html
601  *
602  * Local variables:
603  * c-basic-offset: 8
604  * tab-width: 8
605  * indent-tabs-mode: t
606  * End:
607  *
608  * vi: set shiftwidth=8 tabstop=8 noexpandtab:
609  * :indentSize=8:tabSize=8:noTabs=false:
610  */