merge_all_tap_menus() has been moved to menus.c.
[obnox/wireshark/wip.git] / gtk / prefs_gui.c
index 3de2fdd90453ec0fbbc3f1dd10563c97fc11534b..9cf675bc54d644f3252ac39e6b82d7effeb61f4f 100644 (file)
@@ -31,7 +31,6 @@
 
 #include <epan/prefs.h>
 
-#include "../globals.h"
 #include "../simple_dialog.h"
 
 #include "gtk/prefs_gui.h"
 #include "gtk/gui_utils.h"
 #include "gtk/dlg_utils.h"
 #include "gtk/main.h"
-#include "gtk/main_packet_list.h"
+#include "gtk/new_packet_list.h"
 #include "gtk/main_proto_draw.h"
 #include "gtk/main_toolbar.h"
 #include "gtk/font_utils.h"
 #include "gtk/recent.h"
 #include "gtk/webbrowser.h"
+#include "gtk/main_welcome.h"
 
 
 static gint fetch_enum_value(gpointer control, const enum_val_t *enumvals);
-static gint fileopen_dir_changed_cb(GtkWidget *myentry _U_, GdkEvent *event, gpointer parent_w);
-static gint fileopen_preview_changed_cb(GtkWidget *myentry _U_, GdkEvent *event, gpointer parent_w);
+static gboolean fileopen_dir_changed_cb(GtkWidget *myentry, GdkEvent *event _U_, gpointer parent_w _U_);
+static gboolean fileopen_preview_changed_cb(GtkWidget *myentry _U_, GdkEvent *event, gpointer parent_w);
 static void fileopen_selected_cb(GtkWidget *mybutton_rb _U_, gpointer parent_w);
-static gint recent_files_count_changed_cb(GtkWidget *recent_files_entry _U_, 
-                                         GdkEvent *event _U_, gpointer parent_w);
-static gint recent_df_entries_changed_cb(GtkWidget *recent_df_entry _U_,
+static gboolean recent_files_count_changed_cb(GtkWidget *recent_files_entry _U_,
+                                             GdkEvent *event _U_, gpointer parent_w);
+static gboolean recent_df_entries_changed_cb(GtkWidget *recent_df_entry _U_,
+                                            GdkEvent *event _U_, gpointer parent_w);
+static gint scroll_percent_changed_cb(GtkWidget *recent_df_entry _U_,
                                          GdkEvent *event _U_, gpointer parent_w);
 #define PLIST_SEL_BROWSE_KEY           "plist_sel_browse"
 #define PTREE_SEL_BROWSE_KEY           "ptree_sel_browse"
@@ -66,17 +68,20 @@ static gint recent_df_entries_changed_cb(GtkWidget *recent_df_entry _U_,
 
 #define MACOSX_STYLE_KEY               "macosx_style"
 
-#define GUI_CONSOLE_OPEN_KEY "console_open"
-#define GUI_FILEOPEN_KEY       "fileopen_behavior"
-#define GUI_FILEOPEN_PREVIEW_KEY "fileopen_preview_timeout"
-#define GUI_RECENT_FILES_COUNT_KEY "recent_files_count"
-#define GUI_RECENT_DF_ENTRIES_KEY "recent_display_filter_entries"
-#define GUI_FILEOPEN_DIR_KEY   "fileopen_directory"
-#define GUI_ASK_UNSAVED_KEY     "ask_unsaved"
-#define GUI_WEBBROWSER_KEY         "webbrowser"
-#define GUI_FIND_WRAP_KEY       "find_wrap"
-#define GUI_USE_PREF_SAVE_KEY   "use_pref_save"
-#define GUI_SHOW_VERSION_KEY    "show_version"
+#define GUI_CONSOLE_OPEN_KEY           "console_open"
+#define GUI_FILEOPEN_KEY               "fileopen_behavior"
+#define GUI_FILEOPEN_PREVIEW_KEY       "fileopen_preview_timeout"
+#define GUI_RECENT_FILES_COUNT_KEY     "recent_files_count"
+#define GUI_RECENT_DF_ENTRIES_KEY      "recent_display_filter_entries"
+#define GUI_FILEOPEN_DIR_KEY           "fileopen_directory"
+#define GUI_ASK_UNSAVED_KEY            "ask_unsaved"
+#define GUI_WEBBROWSER_KEY             "webbrowser"
+#define GUI_FIND_WRAP_KEY              "find_wrap"
+#define GUI_USE_PREF_SAVE_KEY          "use_pref_save"
+#define GUI_SHOW_VERSION_KEY           "show_version"
+#define GUI_EXPERT_EYECANDY_KEY                "expert_eyecandy"
+#define GUI_AUTO_SCROLL_KEY            "auto_scroll_on_expand"
+#define GUI_SCROLL_PERCENT_KEY         "scroll_percent_on_expand"
 
 static const enum_val_t scrollbar_placement_vals[] _U_ = {
        { "FALSE", "Left", FALSE },
@@ -103,16 +108,16 @@ static const enum_val_t filter_toolbar_placement_vals[] _U_ = {
 };
 
 static const enum_val_t highlight_style_vals[] _U_ = {
-       { "FALSE", "Bold",     FALSE },
-       { "TRUE",  "Inverse",  TRUE },
+       { "FALSE", "Bold",     FALSE },
+       { "TRUE",  "Inverse",  TRUE },
        { NULL,    NULL,       0 }
 };
 
 
 static const enum_val_t toolbar_style_vals[] _U_ = {
-       { "ICONS", "Icons only",     TB_STYLE_ICONS },
-       { "TEXT",  "Text only",      TB_STYLE_TEXT },
-       { "BOTH",  "Icons & Text",   TB_STYLE_BOTH },
+       { "ICONS", "Icons only",     TB_STYLE_ICONS },
+       { "TEXT",  "Text only",      TB_STYLE_TEXT },
+       { "BOTH",  "Icons & Text",   TB_STYLE_BOTH },
        { NULL,    NULL,             0 }
 };
 
@@ -152,6 +157,9 @@ static char recent_df_entries_max_str[128] = "";
 /* Used to contain the string from the Open File preview timeout pref item */
 static char open_file_preview_str[128] = "";
 
+/* Used to contain the string from the Auto Scroll Percentage pref item */
+static char scroll_percent_preview_str[128] = "";
+
 #define GUI_TABLE_ROWS 4
 
 GtkWidget*
@@ -167,13 +175,13 @@ gui_prefs_show(void)
        GtkWidget *recent_files_count_max_te, *recent_df_entries_max_te, *ask_unsaved_cb, *find_wrap_cb;
        GtkWidget *use_pref_save_cb;
        GtkWidget *show_version_cb;
+       GtkWidget *auto_scroll_cb, *scroll_percent_te;
        GtkWidget *webbrowser_te;
        GtkWidget *save_position_cb, *save_size_cb, *save_maximized_cb;
-#ifdef HAVE_IGE_MAC_INTEGRATION
+#if defined(HAVE_IGE_MAC_INTEGRATION) || defined(HAVE_GTKOSXAPPLICATION)
        GtkWidget *macosx_style_cb;
 #endif
-
-       GtkTooltips *tooltips = gtk_tooltips_new();
+       GtkWidget *expert_info_eyecandy_cb;
 
        int        pos = 0;
        char       current_val_str[128];
@@ -188,50 +196,49 @@ gui_prefs_show(void)
        main_vb = gtk_vbox_new(FALSE, 7);
        gtk_container_set_border_width( GTK_CONTAINER(main_vb), 5 );
 
-        /* Main table */
-        main_tb = gtk_table_new(GUI_TABLE_ROWS, 2, FALSE);
-        gtk_box_pack_start(GTK_BOX(main_vb), main_tb, FALSE, FALSE, 0);
-        gtk_table_set_row_spacings(GTK_TABLE(main_tb), 10);
-        gtk_table_set_col_spacings(GTK_TABLE(main_tb), 15);
-       g_object_set_data(G_OBJECT(main_tb), E_TOOLTIPS_KEY, tooltips);
+       /* Main table */
+       main_tb = gtk_table_new(GUI_TABLE_ROWS, 2, FALSE);
+       gtk_box_pack_start(GTK_BOX(main_vb), main_tb, FALSE, FALSE, 0);
+       gtk_table_set_row_spacings(GTK_TABLE(main_tb), 10);
+       gtk_table_set_col_spacings(GTK_TABLE(main_tb), 15);
 
        /* Packet list selection browseable */
        plist_browse_om = create_preference_option_menu(main_tb, pos++,
-           "Packet list selection mode:", 
+           "Packet list selection mode:",
            "Choose to browse or select a packet for detailed dissection.",
            selection_mode_vals, prefs.gui_plist_sel_browse);
        g_object_set_data(G_OBJECT(main_vb), PLIST_SEL_BROWSE_KEY, plist_browse_om);
 
        /* Proto tree selection browseable */
        ptree_browse_om = create_preference_option_menu(main_tb, pos++,
-           "Protocol tree selection mode:", 
+           "Protocol tree selection mode:",
            "Choose to browse or select.",
            selection_mode_vals, prefs.gui_ptree_sel_browse);
        g_object_set_data(G_OBJECT(main_vb), PTREE_SEL_BROWSE_KEY, ptree_browse_om);
 
        /* Geometry prefs */
        save_position_cb = create_preference_check_button(main_tb, pos++,
-           "Save window position:", 
+           "Save window position:",
            "Whether to save the position of the main window.",
            prefs.gui_geometry_save_position);
        g_object_set_data(G_OBJECT(main_vb), GEOMETRY_POSITION_KEY, save_position_cb);
 
        save_size_cb = create_preference_check_button(main_tb, pos++,
-           "Save window size:", 
+           "Save window size:",
            "Whether to save the size of the main window.",
            prefs.gui_geometry_save_size);
        g_object_set_data(G_OBJECT(main_vb), GEOMETRY_SIZE_KEY, save_size_cb);
 
        save_maximized_cb = create_preference_check_button(main_tb, pos++,
-           "Save maximized state:", 
+           "Save maximized state:",
            "Whether to save the maximized state of the main window.",
            prefs.gui_geometry_save_maximized);
        g_object_set_data(G_OBJECT(main_vb), GEOMETRY_MAXIMIZED_KEY, save_maximized_cb);
 
-#ifdef HAVE_IGE_MAC_INTEGRATION
+#if defined(HAVE_IGE_MAC_INTEGRATION) || defined(HAVE_GTKOSXAPPLICATION)
        macosx_style_cb = create_preference_check_button(main_tb, pos++,
-           "MacOS X style", 
-           "Whether to create a MacOS X look and feel. Checking this box will move the "
+           "Mac OS X style",
+           "Whether to create a Mac OS X look and feel. Checking this box will move the "
            "menu bar to the top of the screen instead of the top of the Wireshark window. "
            "Requires a restart of Wireshark to take effect.",
            prefs.gui_macosx_style);
@@ -241,7 +248,7 @@ gui_prefs_show(void)
 #ifdef _WIN32
        /* How the console window should be opened */
        console_open_om = create_preference_option_menu(main_tb, pos++,
-           "Open a console window", 
+           "Open a console window",
            "Whether to open a console window "
            "(Automatic will open a console if messages appear).",
            gui_console_open_vals, prefs.gui_console_open);
@@ -251,13 +258,13 @@ gui_prefs_show(void)
        /* Allow user to select where they want the File Open dialog to open to
         * by default */
        fileopen_rb = create_preference_radio_buttons(main_tb, pos++,
-           "\"File Open\" dialog behavior:", 
-           "Which directory the \"File Open\" dialog should start with.", 
+           "\"File Open\" dialog behavior:",
+           "Which directory the \"File Open\" dialog should start with.",
            gui_fileopen_vals, prefs.gui_fileopen_style);
 
        /* Directory to default File Open dialog to */
-       fileopen_dir_te = create_preference_entry(main_tb, pos++, 
-           "Directory:", 
+       fileopen_dir_te = create_preference_entry(main_tb, pos++,
+           "Directory:",
            "The \"File Open\" dialog defaults always to this directory.",
            prefs.gui_fileopen_dir);
        g_object_set_data(G_OBJECT(main_vb), GUI_FILEOPEN_KEY, fileopen_rb);
@@ -268,7 +275,7 @@ gui_prefs_show(void)
 
        /* File Open dialog preview timeout */
        fileopen_preview_te = create_preference_entry(main_tb, pos++,
-           "\"File Open\" preview timeout:", 
+           "\"File Open\" preview timeout:",
            "Reading preview data in the \"File Open\" dialog will be stopped after given seconds.",
            open_file_preview_str);
        g_snprintf(current_val_str, sizeof(current_val_str), "%d", prefs.gui_fileopen_preview);
@@ -278,7 +285,7 @@ gui_prefs_show(void)
 
        /* Number of recent entries in the display filter list ... */
        recent_df_entries_max_te = create_preference_entry(main_tb, pos++,
-           "Filter display max. list entries:", 
+           "Filter display max. list entries:",
            "Maximum number of recent entries in filter display list.",
            recent_df_entries_max_str);
        g_snprintf(current_val_str, sizeof(current_val_str), "%d", prefs.gui_recent_df_entries_max);
@@ -288,7 +295,7 @@ gui_prefs_show(void)
 
        /* Number of entries in the recent_files list ... */
        recent_files_count_max_te = create_preference_entry(main_tb, pos++,
-           "\"Open Recent\" max. list entries:", 
+           "\"Open Recent\" max. list entries:",
            "Maximum number of entries in the \"File/Open Recent\" list.",
            recent_files_count_max_str);
        g_snprintf(current_val_str, sizeof(current_val_str), "%d", prefs.gui_recent_files_count_max);
@@ -307,7 +314,7 @@ gui_prefs_show(void)
 
        /* do we want to wrap when searching for data? */
        find_wrap_cb = create_preference_check_button(main_tb, pos++,
-           "Wrap to end/beginning of file during a find:", 
+           "Wrap to end/beginning of file during a find:",
            "Whether a search should wrap in a capture file.",
            prefs.gui_find_wrap);
        g_object_set_data(G_OBJECT(main_vb), GUI_FIND_WRAP_KEY, find_wrap_cb);
@@ -322,21 +329,45 @@ gui_prefs_show(void)
 
        /* Show version in welcome screen */
        show_version_cb = create_preference_check_button(main_tb, pos++,
-           "Welcome screen shows version:",
-           "Whether version should be shown in the start page or not.",
+           "Welcome screen and title bar shows version:",
+           "Whether version should be shown in the start page and main screen's title bar.",
            prefs.gui_version_in_start_page );
        g_object_set_data(G_OBJECT(main_vb), GUI_SHOW_VERSION_KEY, show_version_cb);
 
+       /* Whether to auto scroll when expanding items */
+       auto_scroll_cb = create_preference_check_button(main_tb, pos++,
+               "Auto scroll on expansion:",
+           "Whether the details view should be automatically scrolled up when expanding an item.",
+           prefs.gui_auto_scroll_on_expand );
+       g_object_set_data(G_OBJECT(main_vb), GUI_AUTO_SCROLL_KEY, auto_scroll_cb);
+
+       /* Where to auto scroll to when expanding items */
+       scroll_percent_te = create_preference_entry(main_tb, pos++,
+               "Auto scroll percentage:",
+           "Where to scroll the expanded item to within the view e.g. 0% = top of view, 50% = center of view.",
+           scroll_percent_preview_str);
+       g_snprintf(current_val_str, sizeof(current_val_str), "%d", prefs.gui_auto_scroll_percentage);
+       gtk_entry_set_text(GTK_ENTRY(scroll_percent_te), current_val_str);
+       g_object_set_data(G_OBJECT(main_vb), GUI_SCROLL_PERCENT_KEY, scroll_percent_te);
+       g_signal_connect(scroll_percent_te, "focus_out_event", G_CALLBACK(scroll_percent_changed_cb), main_vb);
+
        /* Webbrowser */
        if (browser_needs_pref()) {
-           webbrowser_te = create_preference_entry(main_tb, pos++, 
-                "Web browser command:",
-                "Command line to desired browser.",
-                prefs.gui_webbrowser);
+           webbrowser_te = create_preference_entry(main_tb, pos++,
+                                                   "Web browser command:",
+                                                   "Command line to desired browser.",
+                                                   prefs.gui_webbrowser);
            gtk_entry_set_text(GTK_ENTRY(webbrowser_te), prefs.gui_webbrowser);
            g_object_set_data(G_OBJECT(main_vb), GUI_WEBBROWSER_KEY, webbrowser_te);
        }
 
+       /* Enable Expert Infos Dialog Tab Label "eye-candy" */
+       expert_info_eyecandy_cb = create_preference_check_button(main_tb, pos++,
+           "Display LEDs in the Expert Infos dialog tab labels:",
+           "Whether colored LED images should be displayed in the Expert Infos dialog tab labels.",
+           prefs.gui_expert_composite_eyecandy );
+       g_object_set_data(G_OBJECT(main_vb), GUI_EXPERT_EYECANDY_KEY, expert_info_eyecandy_cb);
+
        /* Show 'em what we got */
        gtk_widget_show_all(main_vb);
 
@@ -394,49 +425,56 @@ void
 gui_prefs_fetch(GtkWidget *w)
 {
        prefs.gui_plist_sel_browse = fetch_enum_value(
-           g_object_get_data(G_OBJECT(w), PLIST_SEL_BROWSE_KEY), selection_mode_vals);
+               g_object_get_data(G_OBJECT(w), PLIST_SEL_BROWSE_KEY), selection_mode_vals);
        prefs.gui_ptree_sel_browse = fetch_enum_value(
-           g_object_get_data(G_OBJECT(w), PTREE_SEL_BROWSE_KEY), selection_mode_vals);
+               g_object_get_data(G_OBJECT(w), PTREE_SEL_BROWSE_KEY), selection_mode_vals);
        prefs.gui_geometry_save_position =
-           gtk_toggle_button_get_active(g_object_get_data(G_OBJECT(w), GEOMETRY_POSITION_KEY));
+               gtk_toggle_button_get_active(g_object_get_data(G_OBJECT(w), GEOMETRY_POSITION_KEY));
        prefs.gui_geometry_save_size =
-           gtk_toggle_button_get_active(g_object_get_data(G_OBJECT(w), GEOMETRY_SIZE_KEY));
+               gtk_toggle_button_get_active(g_object_get_data(G_OBJECT(w), GEOMETRY_SIZE_KEY));
        prefs.gui_geometry_save_maximized =
-           gtk_toggle_button_get_active(g_object_get_data(G_OBJECT(w), GEOMETRY_MAXIMIZED_KEY));
+               gtk_toggle_button_get_active(g_object_get_data(G_OBJECT(w), GEOMETRY_MAXIMIZED_KEY));
 
-#ifdef HAVE_IGE_MAC_INTEGRATION
+#if defined(HAVE_IGE_MAC_INTEGRATION) || defined(HAVE_GTKOSXAPPLICATION)
        prefs.gui_macosx_style =
-           gtk_toggle_button_get_active(g_object_get_data(G_OBJECT(w), MACOSX_STYLE_KEY));
+               gtk_toggle_button_get_active(g_object_get_data(G_OBJECT(w), MACOSX_STYLE_KEY));
 #endif
 
 #ifdef _WIN32
        prefs.gui_console_open = fetch_enum_value(
-           g_object_get_data(G_OBJECT(w), GUI_CONSOLE_OPEN_KEY), gui_console_open_vals);
+               g_object_get_data(G_OBJECT(w), GUI_CONSOLE_OPEN_KEY), gui_console_open_vals);
 #endif
        prefs.gui_fileopen_style = fetch_preference_radio_buttons_val(
-           g_object_get_data(G_OBJECT(w), GUI_FILEOPEN_KEY), gui_fileopen_vals);
-       
+               g_object_get_data(G_OBJECT(w), GUI_FILEOPEN_KEY), gui_fileopen_vals);
+
        g_free(prefs.gui_fileopen_dir);
        prefs.gui_fileopen_dir = g_strdup(gtk_entry_get_text(
-                                              GTK_ENTRY(g_object_get_data(G_OBJECT(w), GUI_FILEOPEN_DIR_KEY))));
+                                                 GTK_ENTRY(g_object_get_data(G_OBJECT(w), GUI_FILEOPEN_DIR_KEY))));
 
-       prefs.gui_ask_unsaved = 
+       prefs.gui_ask_unsaved =
                gtk_toggle_button_get_active(g_object_get_data(G_OBJECT(w), GUI_ASK_UNSAVED_KEY));
 
-       prefs.gui_find_wrap = 
+       prefs.gui_find_wrap =
                gtk_toggle_button_get_active(g_object_get_data(G_OBJECT(w), GUI_FIND_WRAP_KEY));
 
-       prefs.gui_use_pref_save = 
+       prefs.gui_use_pref_save =
                gtk_toggle_button_get_active(g_object_get_data(G_OBJECT(w), GUI_USE_PREF_SAVE_KEY));
 
-       prefs.gui_version_in_start_page  = 
+       prefs.gui_version_in_start_page  =
                gtk_toggle_button_get_active(g_object_get_data(G_OBJECT(w), GUI_SHOW_VERSION_KEY));
 
+       prefs.gui_auto_scroll_on_expand = 
+               gtk_toggle_button_get_active(g_object_get_data(G_OBJECT(w), GUI_AUTO_SCROLL_KEY));
+
        if (browser_needs_pref()) {
                g_free(prefs.gui_webbrowser);
                prefs.gui_webbrowser = g_strdup(gtk_entry_get_text(
                                                        GTK_ENTRY(g_object_get_data(G_OBJECT(w), GUI_WEBBROWSER_KEY))));
        }
+
+       prefs.gui_expert_composite_eyecandy =
+               gtk_toggle_button_get_active(g_object_get_data(G_OBJECT(w), GUI_EXPERT_EYECANDY_KEY));
+
        /*
         * XXX - we need to have a way to fetch the preferences into
         * local storage and only set the permanent preferences if there
@@ -466,7 +504,7 @@ gui_prefs_apply(GtkWidget *w _U_ , gboolean redissect)
 #endif
 
        if (font_changed) {
-               /* This redraws the hex dump windows. */
+               /* This redraws the packet bytes windows. */
                switch (user_font_apply()) {
 
                case FA_SUCCESS:
@@ -488,12 +526,19 @@ gui_prefs_apply(GtkWidget *w _U_ , gboolean redissect)
                        break;
                }
        } else if (!redissect) {
-               /* Redraw the hex dump windows, in case the
+               /* Redraw the packet bytes windows, in case the
                   highlight style changed, only if we aren't redissecting the whole file.
                   XXX - do it only if the highlight style *did* change. */
-               redraw_hex_dump_all();
+               redraw_packet_bytes_all();
        }
 
+       /* Redisplay the main window's title */
+       update_main_window_title();
+
+       /* Redisplay the default welcome header message in case the "show 
+        * version" option was changed. */
+       welcome_header_set_message(NULL);
+
        /* Redraw the help window(s). */
        supported_redraw();
        help_redraw();
@@ -502,9 +547,7 @@ gui_prefs_apply(GtkWidget *w _U_ , gboolean redissect)
        toolbar_redraw_all();
 
        set_scrollbar_placement_all();
-#ifndef NEW_PACKET_LIST
-       packet_list_set_sel_browse(prefs.gui_plist_sel_browse, FALSE);
-#endif
+       new_packet_list_set_sel_browse(prefs.gui_plist_sel_browse, FALSE);
        set_ptree_sel_browse_all(prefs.gui_ptree_sel_browse);
        set_tree_styles_all();
        main_widgets_rearrange();
@@ -520,7 +563,7 @@ gui_prefs_destroy(GtkWidget *w _U_)
        }
 }
 
-static gint
+static gboolean
 recent_df_entries_changed_cb(GtkWidget *recent_df_entry _U_,
                              GdkEvent *event _U_, gpointer parent_w)
 {
@@ -545,13 +588,13 @@ recent_df_entries_changed_cb(GtkWidget *recent_df_entry _U_,
        return FALSE;
 }
 
-static gint
-recent_files_count_changed_cb(GtkWidget *recent_files_entry _U_, 
+static gboolean
+recent_files_count_changed_cb(GtkWidget *recent_files_entry _U_,
                              GdkEvent *event _U_, gpointer parent_w)
 {
        GtkWidget       *recent_files_count_te;
        guint newval;
-    
+
        recent_files_count_te = (GtkWidget *)g_object_get_data(G_OBJECT(parent_w), GUI_RECENT_FILES_COUNT_KEY);
 
        /*
@@ -570,13 +613,13 @@ recent_files_count_changed_cb(GtkWidget *recent_files_entry _U_,
        return FALSE;
 }
 
-static gint
-fileopen_preview_changed_cb(GtkWidget *recent_files_entry _U_, 
+static gboolean
+fileopen_preview_changed_cb(GtkWidget *recent_files_entry _U_,
                              GdkEvent *event _U_, gpointer parent_w)
 {
        GtkWidget       *fileopen_preview_te;
        guint newval;
-    
+
        fileopen_preview_te = (GtkWidget *)g_object_get_data(G_OBJECT(parent_w), GUI_FILEOPEN_PREVIEW_KEY);
 
        /*
@@ -595,20 +638,21 @@ fileopen_preview_changed_cb(GtkWidget *recent_files_entry _U_,
        return FALSE;
 }
 
-static gint
-fileopen_dir_changed_cb(GtkWidget *fileopen_entry _U_, GdkEvent *event _U_, gpointer parent_w)
+static gboolean
+fileopen_dir_changed_cb(GtkWidget *fileopen_dir_te, GdkEvent *event _U_, gpointer parent_w _U_)
 {
-       GtkWidget       *fileopen_dir_te;
        char *lastchar;
        gint fileopen_dir_te_length;
-    
-       fileopen_dir_te = (GtkWidget *)g_object_get_data(G_OBJECT(parent_w), GUI_FILEOPEN_DIR_KEY);
-       fileopen_dir_te_length = (gint) strlen(gtk_entry_get_text (GTK_ENTRY(fileopen_entry)));
+
+       fileopen_dir_te_length = (gint) strlen(gtk_entry_get_text (GTK_ENTRY(fileopen_dir_te)));
        if (fileopen_dir_te_length == 0)
                return FALSE;
-       lastchar = gtk_editable_get_chars(GTK_EDITABLE(fileopen_entry), fileopen_dir_te_length-1, -1);
-       if (strcmp(lastchar, G_DIR_SEPARATOR_S) != 0)
-               gtk_entry_append_text(GTK_ENTRY(fileopen_entry), G_DIR_SEPARATOR_S);
+       lastchar = gtk_editable_get_chars(GTK_EDITABLE(fileopen_dir_te), fileopen_dir_te_length-1, -1);
+       if (strcmp(lastchar, G_DIR_SEPARATOR_S) != 0){
+               gtk_editable_insert_text(GTK_EDITABLE(fileopen_dir_te), G_DIR_SEPARATOR_S,
+                                        1, /* new_text_length */
+                                        &fileopen_dir_te_length); /* *position */
+       }
        return FALSE;
 }
 
@@ -616,10 +660,10 @@ static void
 fileopen_selected_cb(GtkWidget *mybutton_rb _U_, gpointer parent_w)
 {
        GtkWidget       *fileopen_rb, *fileopen_dir_te;
-    
+
        fileopen_rb = (GtkWidget *)g_object_get_data(G_OBJECT(parent_w), GUI_FILEOPEN_KEY);
        fileopen_dir_te = (GtkWidget *)g_object_get_data(G_OBJECT(parent_w), GUI_FILEOPEN_DIR_KEY);
-    
+
        if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(fileopen_rb)))
        {
                gtk_widget_set_sensitive(GTK_WIDGET(fileopen_dir_te), TRUE);
@@ -631,3 +675,25 @@ fileopen_selected_cb(GtkWidget *mybutton_rb _U_, gpointer parent_w)
        return;
 }
 
+static gboolean
+scroll_percent_changed_cb(GtkWidget *recent_files_entry _U_, 
+                         GdkEvent *event _U_, gpointer parent_w)
+{
+  GtkWidget *scroll_percent_te;
+  guint newval;
+
+  scroll_percent_te = (GtkWidget*)g_object_get_data(G_OBJECT(parent_w), GUI_SCROLL_PERCENT_KEY);
+
+  /* 
+   * Now, just convert the string to a number and store it in the prefs field ...
+   */
+
+  newval = strtol(gtk_entry_get_text(GTK_ENTRY(scroll_percent_te)), NULL, 10);
+  
+  if (newval <= 100) {
+    prefs.gui_auto_scroll_percentage = newval;
+  }
+
+  /* We really should pop up a dialog box is newval < 0 or > 100 */
+  return FALSE;
+}