Use Frame_data also in graph_analysis_item_t, this should ultimately
[obnox/wireshark/wip.git] / gtk / recent.c
index e470cbb45d77cc47c6b52bf6803be62b58fbbcee..43e6aedbdec36849ccee9832f92fec7d17a45184 100644 (file)
 #ifdef HAVE_CONFIG_H
 # include "config.h"
 #endif
-
-#include <gtk/gtk.h>
 #include <stdio.h>
 #include <string.h>
 #include <ctype.h>
 
-#include "recent.h"
+#include <gtk/gtk.h>
+
 #include <epan/epan.h>
 #include <epan/filesystem.h>
-#include "main.h"
-#include "main_menu.h"
+#include <epan/emem.h>
 #include <epan/prefs.h>
 #include <epan/prefs-int.h>
 #include <epan/column.h>
-#include "gui_utils.h"
-#include "main_packet_list.h"
-#if 0
-#include "dlg_utils.h"
-#endif
-#include "file_dlg.h"
-#include "cfilter_combo_utils.h"
-#include "simple_dialog.h"
-#include "file_util.h"
-#include "u3.h"
 
+#include "../simple_dialog.h"
+#include "../u3.h"
+#include <wsutil/file_util.h>
+
+#include "gtk/recent.h"
+#include "gtk/main.h"
+#include "gtk/menus.h"
+#include "gtk/gui_utils.h"
+#include "gtk/new_packet_list.h"
+#include "gtk/file_dlg.h"
+#include "gtk/cfilter_combo_utils.h"
+
+#ifdef HAVE_PCAP_REMOTE
+#include "gtk/capture_dlg.h"
+#endif
 
 #define RECENT_KEY_MAIN_TOOLBAR_SHOW        "gui.toolbar_main_show"
 #define RECENT_KEY_FILTER_TOOLBAR_SHOW      "gui.filter_toolbar_show"
@@ -63,7 +66,9 @@
 #define RECENT_KEY_PACKET_LIST_COLORIZE     "gui.packet_list_colorize"
 #define RECENT_GUI_TIME_FORMAT              "gui.time_format"
 #define RECENT_GUI_TIME_PRECISION           "gui.time_precision"
+#define RECENT_GUI_SECONDS_FORMAT           "gui.seconds_format"
 #define RECENT_GUI_ZOOM_LEVEL               "gui.zoom_level"
+#define RECENT_GUI_BYTES_VIEW               "gui.bytes_view"
 #define RECENT_GUI_GEOMETRY_MAIN_X          "gui.geometry_main_x"
 #define RECENT_GUI_GEOMETRY_MAIN_Y          "gui.geometry_main_y"
 #define RECENT_GUI_GEOMETRY_MAIN_WIDTH      "gui.geometry_main_width"
 #define RECENT_GUI_GEOMETRY_MAIN_LOWER_PANE "gui.geometry_main_lower_pane"
 #define RECENT_GUI_GEOMETRY_STATUS_PANE_LEFT  "gui.geometry_status_pane"
 #define RECENT_GUI_GEOMETRY_STATUS_PANE_RIGHT "gui.geometry_status_pane_right"
+#define RECENT_GUI_GEOMETRY_WLAN_STATS_PANE "gui.geometry_status_wlan_stats_pane"
+#define RECENT_LAST_USED_PROFILE            "gui.last_used_profile"
 #define RECENT_GUI_FILEOPEN_REMEMBERED_DIR  "gui.fileopen_remembered_dir"
 #define RECENT_GUI_GEOMETRY                 "gui.geom."
 #define RECENT_KEY_PRIVS_WARN_IF_ELEVATED   "privs.warn_if_elevated"
 #define RECENT_KEY_PRIVS_WARN_IF_NO_NPF     "privs.warn_if_no_npf"
 
 #define RECENT_FILE_NAME "recent"
+#define RECENT_COMMON_FILE_NAME "recent_common"
 
 recent_settings_t recent;
 
 static const char *ts_type_text[] =
-  { "RELATIVE", "ABSOLUTE", "ABSOLUTE_WITH_DATE", "DELTA", "DELTA_DIS", "EPOCH", NULL };
+  { "RELATIVE", "ABSOLUTE", "ABSOLUTE_WITH_DATE", "DELTA", "DELTA_DIS", "EPOCH", "UTC", "UTC_WITH_DATE", NULL };
 
 static const char *ts_precision_text[] =
        { "AUTO", "SEC", "DSEC", "CSEC", "MSEC", "USEC", "NSEC", NULL };
 
+static const char *ts_seconds_text[] =
+  { "SECONDS", "HOUR_MIN_SEC", NULL };
+
 /* Takes an string and a pointer to an array of strings, and a default int value.
  * The array must be terminated by a NULL string. If the string is found in the array
  * of strings, the index of that string in the array is returned. Otherwise, the
@@ -114,9 +125,7 @@ free_col_width_info(recent_settings_t *rs)
 
   while (rs->col_width_list != NULL) {
     cfmt = rs->col_width_list->data;
-    if (cfmt->cfield) {
-      g_free(cfmt->cfield);
-    }
+    g_free(cfmt->cfield);
     g_free(cfmt);
     rs->col_width_list = g_list_remove_link(rs->col_width_list, rs->col_width_list);
   }
@@ -124,7 +133,7 @@ free_col_width_info(recent_settings_t *rs)
   rs->col_width_list = NULL;
 }
 
-/* Attempt to Write out "recent" to the user's recent file.
+/* Attempt to Write out "recent common" to the user's recent common file.
    If we got an error report it with a dialog box and return FALSE,
    otherwise return TRUE. */
 gboolean
@@ -145,16 +154,16 @@ write_recent(void)
   if (create_persconffile_dir(&pf_dir_path) == -1) {
      simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK,
       "Can't create directory\n\"%s\"\nfor recent file: %s.", pf_dir_path,
-      strerror(errno));
+      g_strerror(errno));
      g_free(pf_dir_path);
      return FALSE;
   }
 
-  rf_path = get_persconffile_path(RECENT_FILE_NAME, FALSE, TRUE);
-  if ((rf = eth_fopen(rf_path, "w")) == NULL) {
+  rf_path = get_persconffile_path(RECENT_COMMON_FILE_NAME, FALSE, TRUE);
+  if ((rf = ws_fopen(rf_path, "w")) == NULL) {
      simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK,
       "Can't open recent file\n\"%s\": %s.", rf_path,
-      strerror(errno));
+      g_strerror(errno));
     g_free(rf_path);
     return FALSE;
   }
@@ -182,6 +191,114 @@ write_recent(void)
 
   dfilter_recent_combo_write_all(rf);
 
+#ifdef HAVE_PCAP_REMOTE
+  fputs("\n"
+    "######## Recent remote hosts, cannot be altered through command line ########\n"
+    "\n", rf);
+
+  capture_remote_combo_recent_write_all(rf);
+#endif
+
+  fprintf(rf, "\n# Main window geometry.\n");
+  fprintf(rf, "# Decimal numbers.\n");
+  fprintf(rf, RECENT_GUI_GEOMETRY_MAIN_X ": %d\n", recent.gui_geometry_main_x);
+  fprintf(rf, RECENT_GUI_GEOMETRY_MAIN_Y ": %d\n", recent.gui_geometry_main_y);
+  fprintf(rf, RECENT_GUI_GEOMETRY_MAIN_WIDTH ": %d\n",
+                 recent.gui_geometry_main_width);
+  fprintf(rf, RECENT_GUI_GEOMETRY_MAIN_HEIGHT ": %d\n",
+                 recent.gui_geometry_main_height);
+
+  fprintf(rf, "\n# Main window maximized.\n");
+  fprintf(rf, "# TRUE or FALSE (case-insensitive).\n");
+  fprintf(rf, RECENT_GUI_GEOMETRY_MAIN_MAXIMIZED ": %s\n",
+                 recent.gui_geometry_main_maximized == TRUE ? "TRUE" : "FALSE");
+
+  fprintf(rf, "\n# Statusbar left pane size.\n");
+  fprintf(rf, "# Decimal number.\n");
+  if (recent.gui_geometry_status_pane_left != 0) {
+    fprintf(rf, RECENT_GUI_GEOMETRY_STATUS_PANE_LEFT ": %d\n",
+                 recent.gui_geometry_status_pane_left);
+  }
+  fprintf(rf, "\n# Statusbar middle pane size.\n");
+  fprintf(rf, "# Decimal number.\n");
+  if (recent.gui_geometry_status_pane_right != 0) {
+    fprintf(rf, RECENT_GUI_GEOMETRY_STATUS_PANE_RIGHT ": %d\n",
+                 recent.gui_geometry_status_pane_right);
+  }
+
+  fprintf(rf, "\n# Last used Configuration Profile.\n");
+  fprintf(rf, RECENT_LAST_USED_PROFILE ": %s\n", get_profile_name());
+
+  fprintf(rf, "\n# WLAN statistics upper pane size.\n");
+  fprintf(rf, "# Decimal number.\n");
+  fprintf(rf, RECENT_GUI_GEOMETRY_WLAN_STATS_PANE ": %d\n",
+         recent.gui_geometry_wlan_stats_pane);
+
+  fprintf(rf, "\n# Warn if running with elevated permissions (e.g. as root).\n");
+  fprintf(rf, "# TRUE or FALSE (case-insensitive).\n");
+  fprintf(rf, RECENT_KEY_PRIVS_WARN_IF_ELEVATED ": %s\n",
+                 recent.privs_warn_if_elevated == TRUE ? "TRUE" : "FALSE");
+
+  fprintf(rf, "\n# Warn if npf.sys isn't loaded on Windows >= 6.0.\n");
+  fprintf(rf, "# TRUE or FALSE (case-insensitive).\n");
+  fprintf(rf, RECENT_KEY_PRIVS_WARN_IF_NO_NPF ": %s\n",
+                 recent.privs_warn_if_no_npf == TRUE ? "TRUE" : "FALSE");
+
+  window_geom_recent_write_all(rf);
+
+  fclose(rf);
+
+  /* XXX - catch I/O errors (e.g. "ran out of disk space") and return
+     an error indication, or maybe write to a new recent file and
+     rename that file on top of the old one only if there are not I/O
+     errors. */
+  return TRUE;
+}
+
+
+/* Attempt to Write out profile "recent" to the user's profile recent file.
+   If we got an error report it with a dialog box and return FALSE,
+   otherwise return TRUE. */
+gboolean
+write_profile_recent(void)
+{
+  char        *pf_dir_path;
+  char        *rf_path;
+  FILE        *rf;
+
+  /* To do:
+   * - Split output lines longer than MAX_VAL_LEN
+   * - Create a function for the preference directory check/creation
+   *   so that duplication can be avoided with filter.c
+   */
+
+  /* Create the directory that holds personal configuration files, if
+     necessary.  */
+  if (create_persconffile_dir(&pf_dir_path) == -1) {
+     simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK,
+      "Can't create directory\n\"%s\"\nfor recent file: %s.", pf_dir_path,
+      g_strerror(errno));
+     g_free(pf_dir_path);
+     return FALSE;
+  }
+
+  rf_path = get_persconffile_path(RECENT_FILE_NAME, TRUE, TRUE);
+  if ((rf = ws_fopen(rf_path, "w")) == NULL) {
+     simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK,
+      "Can't open recent file\n\"%s\": %s.", rf_path,
+      g_strerror(errno));
+    g_free(rf_path);
+    return FALSE;
+  }
+  g_free(rf_path);
+
+  fputs("# Recent settings file for Wireshark " VERSION ".\n"
+    "#\n"
+    "# This file is regenerated each time Wireshark is quit\n"
+    "# and when changing configuration profile.\n"
+    "# So be careful, if you want to make manual changes here.\n"
+    "\n", rf);
+
   fprintf(rf, "\n# Main Toolbar show (hide).\n");
   fprintf(rf, "# TRUE or FALSE (case-insensitive).\n");
   fprintf(rf, RECENT_KEY_MAIN_TOOLBAR_SHOW ": %s\n",
@@ -232,7 +349,7 @@ write_recent(void)
                  recent.packet_list_colorize == TRUE ? "TRUE" : "FALSE");
 
   fprintf(rf, "\n# Timestamp display format.\n");
-  fprintf(rf, "# One of: RELATIVE, ABSOLUTE, ABSOLUTE_WITH_DATE, DELTA, DELTA_DIS, EPOCH\n");
+  fprintf(rf, "# One of: RELATIVE, ABSOLUTE, ABSOLUTE_WITH_DATE, DELTA, DELTA_DIS, EPOCH, UTC, UTC_WITH_DATE\n");
   fprintf(rf, RECENT_GUI_TIME_FORMAT ": %s\n",
           ts_type_text[recent.gui_time_format]);
 
@@ -241,24 +358,20 @@ write_recent(void)
   fprintf(rf, RECENT_GUI_TIME_PRECISION ": %s\n",
           ts_precision_text[recent.gui_time_precision]);
 
+  fprintf(rf, "\n# Seconds display format.\n");
+  fprintf(rf, "# One of: SECONDS, HOUR_MIN_SEC\n");
+  fprintf(rf, RECENT_GUI_SECONDS_FORMAT ": %s\n",
+          ts_seconds_text[recent.gui_seconds_format]);
+
   fprintf(rf, "\n# Zoom level.\n");
   fprintf(rf, "# A decimal number.\n");
   fprintf(rf, RECENT_GUI_ZOOM_LEVEL ": %d\n",
                  recent.gui_zoom_level);
 
-  fprintf(rf, "\n# Main window geometry.\n");
-  fprintf(rf, "# Decimal numbers.\n");
-  fprintf(rf, RECENT_GUI_GEOMETRY_MAIN_X ": %d\n", recent.gui_geometry_main_x);
-  fprintf(rf, RECENT_GUI_GEOMETRY_MAIN_Y ": %d\n", recent.gui_geometry_main_y);
-  fprintf(rf, RECENT_GUI_GEOMETRY_MAIN_WIDTH ": %d\n",
-                 recent.gui_geometry_main_width);
-  fprintf(rf, RECENT_GUI_GEOMETRY_MAIN_HEIGHT ": %d\n",
-                 recent.gui_geometry_main_height);
-
-  fprintf(rf, "\n# Main window maximized.\n");
-  fprintf(rf, "# TRUE or FALSE (case-insensitive).\n");
-  fprintf(rf, RECENT_GUI_GEOMETRY_MAIN_MAXIMIZED ": %s\n",
-                 recent.gui_geometry_main_maximized == TRUE ? "TRUE" : "FALSE");
+  fprintf(rf, "\n# Bytes view.\n");
+  fprintf(rf, "# A decimal number.\n");
+  fprintf(rf, RECENT_GUI_BYTES_VIEW ": %d\n",
+                 recent.gui_bytes_view);
 
   fprintf(rf, "\n# Main window upper (or leftmost) pane size.\n");
   fprintf(rf, "# Decimal number.\n");
@@ -272,32 +385,10 @@ write_recent(void)
     fprintf(rf, RECENT_GUI_GEOMETRY_MAIN_LOWER_PANE ": %d\n",
                  recent.gui_geometry_main_lower_pane);
   }
-  fprintf(rf, "\n# Statusbar left pane size.\n");
-  fprintf(rf, "# Decimal number.\n");
-  if (recent.gui_geometry_status_pane_left != 0) {
-    fprintf(rf, RECENT_GUI_GEOMETRY_STATUS_PANE_LEFT ": %d\n",
-                 recent.gui_geometry_status_pane_left);
-  }
-  fprintf(rf, "\n# Statusbar middle pane size.\n");
-  fprintf(rf, "# Decimal number.\n");
-  if (recent.gui_geometry_status_pane_right != 0) {
-    fprintf(rf, RECENT_GUI_GEOMETRY_STATUS_PANE_RIGHT ": %d\n",
-                 recent.gui_geometry_status_pane_right);
-  }
 
   fprintf(rf, "\n# Packet list column pixel widths.\n");
   fprintf(rf, "# Each pair of strings consists of a column format and its pixel width.\n");
-  packet_list_recent_write_all(rf);
-
-  fprintf(rf, "\n# Warn if running with elevated permissions (e.g. as root).\n");
-  fprintf(rf, "# TRUE or FALSE (case-insensitive).\n");
-  fprintf(rf, RECENT_KEY_PRIVS_WARN_IF_ELEVATED ": %s\n",
-                 recent.privs_warn_if_elevated == TRUE ? "TRUE" : "FALSE");
-
-  fprintf(rf, "\n# Warn if npf.sys isn't loaded on Windows >= 6.0.\n");
-  fprintf(rf, "# TRUE or FALSE (case-insensitive).\n");
-  fprintf(rf, RECENT_KEY_PRIVS_WARN_IF_NO_NPF ": %s\n",
-                 recent.privs_warn_if_no_npf == TRUE ? "TRUE" : "FALSE");
+  new_packet_list_recent_write_all(rf);
 
   if (get_last_open_dir() != NULL) {
     fprintf(rf, "\n# Last directory navigated to in File Open dialog.\n");
@@ -308,8 +399,6 @@ write_recent(void)
       fprintf(rf, RECENT_GUI_FILEOPEN_REMEMBERED_DIR ": %s\n", get_last_open_dir());
   }
 
-  window_geom_recent_write_all(rf);
-
   fclose(rf);
 
   /* XXX - catch I/O errors (e.g. "ran out of disk space") and return
@@ -341,17 +430,113 @@ write_recent_geom(gpointer key _U_, gpointer value, gpointer rf)
 
 }
 
+/* set one user's recent common file key/value pair */
+static prefs_set_pref_e
+read_set_recent_common_pair_static(gchar *key, gchar *value,
+                                  void *private_data _U_,
+                                  gboolean return_range_errors _U_)
+{
+  long num;
+  char *p;
+
+  if (strcmp(key, RECENT_GUI_GEOMETRY_MAIN_MAXIMIZED) == 0) {
+    if (g_ascii_strcasecmp(value, "true") == 0) {
+        recent.gui_geometry_main_maximized = TRUE;
+    }
+    else {
+        recent.gui_geometry_main_maximized = FALSE;
+    }
+
+  } else if (strcmp(key, RECENT_GUI_GEOMETRY_MAIN_X) == 0) {
+    num = strtol(value, &p, 0);
+    if (p == value || *p != '\0')
+      return PREFS_SET_SYNTAX_ERR;     /* number was bad */
+    recent.gui_geometry_main_x = num;
+  } else if (strcmp(key, RECENT_GUI_GEOMETRY_MAIN_Y) == 0) {
+    num = strtol(value, &p, 0);
+    if (p == value || *p != '\0')
+      return PREFS_SET_SYNTAX_ERR;     /* number was bad */
+    recent.gui_geometry_main_y = num;
+  } else if (strcmp(key, RECENT_GUI_GEOMETRY_MAIN_WIDTH) == 0) {
+    num = strtol(value, &p, 0);
+    if (p == value || *p != '\0')
+      return PREFS_SET_SYNTAX_ERR;     /* number was bad */
+    if (num <= 0)
+      return PREFS_SET_SYNTAX_ERR;     /* number must be positive */
+    recent.gui_geometry_main_width = num;
+  } else if (strcmp(key, RECENT_GUI_GEOMETRY_MAIN_HEIGHT) == 0) {
+    num = strtol(value, &p, 0);
+    if (p == value || *p != '\0')
+      return PREFS_SET_SYNTAX_ERR;     /* number was bad */
+    if (num <= 0)
+      return PREFS_SET_SYNTAX_ERR;     /* number must be positive */
+    recent.gui_geometry_main_height = num;
+  } else if (strcmp(key, RECENT_GUI_GEOMETRY_STATUS_PANE_RIGHT) == 0) {
+    num = strtol(value, &p, 0);
+    if (p == value || *p != '\0')
+      return PREFS_SET_SYNTAX_ERR;     /* number was bad */
+    if (num <= 0)
+      return PREFS_SET_SYNTAX_ERR;     /* number must be positive */
+    recent.gui_geometry_status_pane_right = num;
+    recent.has_gui_geometry_status_pane = TRUE;
+  } else if (strcmp(key, RECENT_GUI_GEOMETRY_STATUS_PANE_LEFT) == 0) {
+    num = strtol(value, &p, 0);
+    if (p == value || *p != '\0')
+      return PREFS_SET_SYNTAX_ERR;     /* number was bad */
+    if (num <= 0)
+      return PREFS_SET_SYNTAX_ERR;     /* number must be positive */
+    recent.gui_geometry_status_pane_left = num;
+    recent.has_gui_geometry_status_pane = TRUE;
+  } else if (strcmp(key, RECENT_LAST_USED_PROFILE) == 0) {
+    if ((strcmp(value, DEFAULT_PROFILE) != 0) && profile_exists (value, FALSE)) {
+      set_profile_name (value);
+    }
+  } else if (strcmp(key, RECENT_GUI_GEOMETRY_WLAN_STATS_PANE) == 0) {
+    num = strtol(value, &p, 0);
+    if (p == value || *p != '\0')
+      return PREFS_SET_SYNTAX_ERR;     /* number was bad */
+    if (num <= 0)
+      return PREFS_SET_SYNTAX_ERR;     /* number must be positive */
+    recent.gui_geometry_wlan_stats_pane = num;
+  } else if (strncmp(key, RECENT_GUI_GEOMETRY, sizeof(RECENT_GUI_GEOMETRY)-1) == 0) {
+    /* now have something like "gui.geom.main.x", split it into win and sub_key */
+    char *win = &key[sizeof(RECENT_GUI_GEOMETRY)-1];
+    char *sub_key = strchr(win, '.');
+    if(sub_key) {
+      *sub_key = '\0';
+      sub_key++;
+      window_geom_recent_read_pair(win, sub_key, value);
+    }
+  } else if (strcmp(key, RECENT_KEY_PRIVS_WARN_IF_ELEVATED) == 0) {
+    if (g_ascii_strcasecmp(value, "true") == 0) {
+        recent.privs_warn_if_elevated = TRUE;
+    }
+    else {
+        recent.privs_warn_if_elevated = FALSE;
+    }
+  } else if (strcmp(key, RECENT_KEY_PRIVS_WARN_IF_NO_NPF) == 0) {
+    if (g_ascii_strcasecmp(value, "true") == 0) {
+        recent.privs_warn_if_no_npf = TRUE;
+    }
+    else {
+        recent.privs_warn_if_no_npf = FALSE;
+    }
+  }
+
+  return PREFS_SET_OK;
+}
 
 /* set one user's recent file key/value pair */
 static prefs_set_pref_e
-read_set_recent_pair_static(gchar *key, gchar *value, void *private_data _U_)
+read_set_recent_pair_static(gchar *key, gchar *value, void *private_data _U_,
+                           gboolean return_range_errors _U_)
 {
   long num;
   char *p;
   GList *col_l, *col_l_elt;
   col_width_data *cfmt;
   const gchar *cust_format = col_format_to_string(COL_CUSTOM);
-  int cust_format_len = strlen(cust_format);
+  int cust_format_len = (int) strlen(cust_format);
 
   if (strcmp(key, RECENT_KEY_MAIN_TOOLBAR_SHOW) == 0) {
     if (g_ascii_strcasecmp(value, "true") == 0) {
@@ -422,11 +607,19 @@ read_set_recent_pair_static(gchar *key, gchar *value, void *private_data _U_)
   } else if (strcmp(key, RECENT_GUI_TIME_PRECISION) == 0) {
     recent.gui_time_precision =
        find_index_from_string_array(value, ts_precision_text, TS_PREC_AUTO);
+  } else if (strcmp(key, RECENT_GUI_SECONDS_FORMAT) == 0) {
+    recent.gui_seconds_format =
+       find_index_from_string_array(value, ts_seconds_text, TS_SECONDS_DEFAULT);
   } else if (strcmp(key, RECENT_GUI_ZOOM_LEVEL) == 0) {
     num = strtol(value, &p, 0);
     if (p == value || *p != '\0')
       return PREFS_SET_SYNTAX_ERR;     /* number was bad */
     recent.gui_zoom_level = num;
+  } else if (strcmp(key, RECENT_GUI_BYTES_VIEW) == 0) {
+    num = strtol(value, &p, 0);
+    if (p == value || *p != '\0')
+      return PREFS_SET_SYNTAX_ERR;     /* number was bad */
+    recent.gui_bytes_view = num;
   } else if (strcmp(key, RECENT_GUI_GEOMETRY_MAIN_MAXIMIZED) == 0) {
     if (g_ascii_strcasecmp(value, "true") == 0) {
         recent.gui_geometry_main_maximized = TRUE;
@@ -435,30 +628,6 @@ read_set_recent_pair_static(gchar *key, gchar *value, void *private_data _U_)
         recent.gui_geometry_main_maximized = FALSE;
     }
 
-  } else if (strcmp(key, RECENT_GUI_GEOMETRY_MAIN_X) == 0) {
-    num = strtol(value, &p, 0);
-    if (p == value || *p != '\0')
-      return PREFS_SET_SYNTAX_ERR;     /* number was bad */
-    recent.gui_geometry_main_x = num;
-  } else if (strcmp(key, RECENT_GUI_GEOMETRY_MAIN_Y) == 0) {
-    num = strtol(value, &p, 0);
-    if (p == value || *p != '\0')
-      return PREFS_SET_SYNTAX_ERR;     /* number was bad */
-    recent.gui_geometry_main_y = num;
-  } else if (strcmp(key, RECENT_GUI_GEOMETRY_MAIN_WIDTH) == 0) {
-    num = strtol(value, &p, 0);
-    if (p == value || *p != '\0')
-      return PREFS_SET_SYNTAX_ERR;     /* number was bad */
-    if (num <= 0)
-      return PREFS_SET_SYNTAX_ERR;     /* number must be positive */
-    recent.gui_geometry_main_width = num;
-  } else if (strcmp(key, RECENT_GUI_GEOMETRY_MAIN_HEIGHT) == 0) {
-    num = strtol(value, &p, 0);
-    if (p == value || *p != '\0')
-      return PREFS_SET_SYNTAX_ERR;     /* number was bad */
-    if (num <= 0)
-      return PREFS_SET_SYNTAX_ERR;     /* number must be positive */
-    recent.gui_geometry_main_height = num;
   } else if (strcmp(key, RECENT_GUI_GEOMETRY_MAIN_UPPER_PANE) == 0) {
     num = strtol(value, &p, 0);
     if (p == value || *p != '\0')
@@ -475,51 +644,8 @@ read_set_recent_pair_static(gchar *key, gchar *value, void *private_data _U_)
       return PREFS_SET_SYNTAX_ERR;     /* number must be positive */
     recent.gui_geometry_main_lower_pane = num;
     recent.has_gui_geometry_main_lower_pane = TRUE;
-  } else if (strcmp(key, RECENT_GUI_GEOMETRY_STATUS_PANE_RIGHT) == 0) {
-    num = strtol(value, &p, 0);
-    if (p == value || *p != '\0')
-      return PREFS_SET_SYNTAX_ERR;     /* number was bad */
-    if (num <= 0)
-      return PREFS_SET_SYNTAX_ERR;     /* number must be positive */
-    recent.gui_geometry_status_pane_right = num;
-    recent.has_gui_geometry_status_pane = TRUE;
-  } else if (strcmp(key, RECENT_GUI_GEOMETRY_STATUS_PANE_LEFT) == 0) {
-    num = strtol(value, &p, 0);
-    if (p == value || *p != '\0')
-      return PREFS_SET_SYNTAX_ERR;     /* number was bad */
-    if (num <= 0)
-      return PREFS_SET_SYNTAX_ERR;     /* number must be positive */
-    recent.gui_geometry_status_pane_left = num;
-    recent.has_gui_geometry_status_pane = TRUE;
-  } else if (strcmp(key, RECENT_GUI_FILEOPEN_REMEMBERED_DIR) == 0) {
-    if(u3_active())
-      set_last_open_dir(u3_expand_device_path(value));
-    else
-      set_last_open_dir(value);
-  } else if (strncmp(key, RECENT_GUI_GEOMETRY, sizeof(RECENT_GUI_GEOMETRY)-1) == 0) {
-    /* now have something like "gui.geom.main.x", split it into win and sub_key */
-    char *win = &key[sizeof(RECENT_GUI_GEOMETRY)-1];
-    char *sub_key = strchr(win, '.');
-    if(sub_key) {
-      *sub_key = '\0';
-      sub_key++;
-      window_geom_recent_read_pair(win, sub_key, value);
-    }
-  } else if (strcmp(key, RECENT_KEY_PRIVS_WARN_IF_ELEVATED) == 0) {
-    if (g_ascii_strcasecmp(value, "true") == 0) {
-        recent.privs_warn_if_elevated = TRUE;
-    }
-    else {
-        recent.privs_warn_if_elevated = FALSE;
-    }
-  } else if (strcmp(key, RECENT_KEY_PRIVS_WARN_IF_NO_NPF) == 0) {
-    if (g_ascii_strcasecmp(value, "true") == 0) {
-        recent.privs_warn_if_no_npf = TRUE;
-    }
-    else {
-        recent.privs_warn_if_no_npf = FALSE;
-    }
-  } else if (strcmp(key, RECENT_KEY_COL_WIDTH) == 0) {
+  }
+  else if (strcmp(key, RECENT_KEY_COL_WIDTH) == 0) {
     col_l = prefs_get_string_list(value);
     if (col_l == NULL)
       return PREFS_SET_SYNTAX_ERR;
@@ -567,18 +693,35 @@ read_set_recent_pair_static(gchar *key, gchar *value, void *private_data _U_)
        cfmt->cfield = g_strdup(&fmt[cust_format_len+1]);  /* add 1 for ':' */
       }
       g_free (fmt);
-      if (cfmt->cfmt == -1)
+      if (cfmt->cfmt == -1) {
+        g_free(cfmt->cfield);
+       g_free(cfmt);
        return PREFS_SET_SYNTAX_ERR;   /* string was bad */
+      }
 
       col_l_elt      = col_l_elt->next;
       cfmt->width    = strtol(col_l_elt->data, &p, 0);
-      if (p == col_l_elt->data || *p != '\0')
+      if (p == col_l_elt->data || (*p != '\0' && *p != ':')) {
+       g_free(cfmt->cfield);
+       g_free(cfmt);
        return PREFS_SET_SYNTAX_ERR;    /* number was bad */
+      }
+
+      if (*p == ':') {
+        cfmt->xalign = *(++p);
+      } else {
+        cfmt->xalign = COLUMN_XALIGN_DEFAULT;
+      }
 
       col_l_elt      = col_l_elt->next;
       recent.col_width_list = g_list_append(recent.col_width_list, cfmt);
     }
     prefs_clear_string_list(col_l);
+  } else if (strcmp(key, RECENT_GUI_FILEOPEN_REMEMBERED_DIR) == 0) {
+    if (recent.gui_fileopen_remembered_dir) {
+      g_free (recent.gui_fileopen_remembered_dir);
+    }
+    recent.gui_fileopen_remembered_dir = g_strdup(value);
   }
 
   return PREFS_SET_OK;
@@ -587,7 +730,8 @@ read_set_recent_pair_static(gchar *key, gchar *value, void *private_data _U_)
 
 /* set one user's recent file key/value pair */
 static prefs_set_pref_e
-read_set_recent_pair_dynamic(gchar *key, gchar *value, void *private_data _U_)
+read_set_recent_pair_dynamic(gchar *key, gchar *value, void *private_data _U_,
+                            gboolean return_range_errors _U_)
 {
   if (strcmp(key, RECENT_KEY_CAPTURE_FILE) == 0) {
     if(u3_active())
@@ -598,6 +742,10 @@ read_set_recent_pair_dynamic(gchar *key, gchar *value, void *private_data _U_)
        dfilter_combo_add_recent(value);
   } else if (strcmp(key, RECENT_KEY_CAPTURE_FILTER) == 0) {
        cfilter_combo_add_recent(value);
+#ifdef HAVE_PCAP_REMOTE
+  } else if (strcmp(key, RECENT_KEY_REMOTE_HOST) == 0) {
+       capture_remote_combo_add_recent(value);
+#endif
   }
 
   return PREFS_SET_OK;
@@ -640,19 +788,67 @@ recent_set_arg(char *prefarg)
                return PREFS_SET_SYNTAX_ERR;
        }
 
-       ret = read_set_recent_pair_static(prefarg, p, NULL);
+       ret = read_set_recent_pair_static(prefarg, p, NULL, TRUE);
        *colonp = ':';  /* put the colon back */
        return ret;
 }
 
 
-/* opens the user's recent file and read the first part */
+/* opens the user's recent common file and read the first part */
 void
 recent_read_static(char **rf_path_return, int *rf_errno_return)
 {
   char       *rf_path;
   FILE       *rf;
 
+  /* set defaults */
+  recent.gui_geometry_main_x        =        20;
+  recent.gui_geometry_main_y        =        20;
+  recent.gui_geometry_main_width    = DEF_WIDTH;
+  recent.gui_geometry_main_height   = DEF_HEIGHT;
+  recent.gui_geometry_main_maximized=     FALSE;
+
+  recent.gui_geometry_status_pane_left  = (DEF_WIDTH/3);
+  recent.gui_geometry_status_pane_right = (DEF_WIDTH/3);
+  recent.gui_geometry_wlan_stats_pane = 200;
+
+  recent.privs_warn_if_elevated = TRUE;
+  recent.privs_warn_if_no_npf = TRUE;
+
+  recent.col_width_list = NULL;
+  recent.gui_fileopen_remembered_dir = NULL;
+
+  /* Construct the pathname of the user's recent common file. */
+  rf_path = get_persconffile_path(RECENT_COMMON_FILE_NAME, FALSE, FALSE);
+
+  /* Read the user's recent common file, if it exists. */
+  *rf_path_return = NULL;
+  if ((rf = ws_fopen(rf_path, "r")) != NULL) {
+    /* We succeeded in opening it; read it. */
+    read_prefs_file(rf_path, rf, read_set_recent_common_pair_static, NULL);
+
+    fclose(rf);
+    g_free(rf_path);
+    rf_path = NULL;
+  } else {
+    /* We failed to open it.  If we failed for some reason other than
+       "it doesn't exist", return the errno and the pathname, so our
+       caller can report the error. */
+    if (errno != ENOENT) {
+      *rf_errno_return = errno;
+      *rf_path_return = rf_path;
+    }
+  }
+}
+
+
+
+/* opens the user's recent file and read the first part */
+void
+recent_read_profile_static(char **rf_path_return, int *rf_errno_return)
+{
+  char       *rf_path, *rf_common_path;
+  FILE       *rf;
 
   /* set defaults */
   recent.main_toolbar_show      = TRUE;
@@ -666,38 +862,53 @@ recent_read_static(char **rf_path_return, int *rf_errno_return)
   recent.packet_list_colorize   = TRUE;
   recent.gui_time_format        = TS_RELATIVE;
   recent.gui_time_precision     = TS_PREC_AUTO;
+  recent.gui_seconds_format     = TS_SECONDS_DEFAULT;
   recent.gui_zoom_level         = 0;
-
-  recent.gui_geometry_main_x        =        20;
-  recent.gui_geometry_main_y        =        20;
-  recent.gui_geometry_main_width    = DEF_WIDTH;
-  recent.gui_geometry_main_height   = DEF_HEIGHT;
-  recent.gui_geometry_main_maximized=     FALSE;
+  recent.gui_bytes_view         = 0;
 
   /* pane size of zero will autodetect */
   recent.gui_geometry_main_upper_pane   = 0;
   recent.gui_geometry_main_lower_pane   = 0;
-  recent.gui_geometry_status_pane_left  = (DEF_WIDTH/3);
-  recent.gui_geometry_status_pane_right = (DEF_WIDTH/3);
 
   recent.has_gui_geometry_main_upper_pane = TRUE;
   recent.has_gui_geometry_main_lower_pane = TRUE;
   recent.has_gui_geometry_status_pane = TRUE;
 
-  recent.privs_warn_if_elevated = TRUE;
-  recent.privs_warn_if_no_npf = TRUE;
+  if (recent.col_width_list) {
+    free_col_width_info(&recent);
+  }
 
-  recent.col_width_list = NULL;
+  if (recent.gui_fileopen_remembered_dir) {
+    g_free (recent.gui_fileopen_remembered_dir);
+    recent.gui_fileopen_remembered_dir = NULL;
+  }
 
-  /* Construct the pathname of the user's recent file. */
-  rf_path = get_persconffile_path(RECENT_FILE_NAME, FALSE, FALSE);
+  /* Construct the pathname of the user's profile recent file. */
+  rf_path = get_persconffile_path(RECENT_FILE_NAME, TRUE, FALSE);
 
   /* Read the user's recent file, if it exists. */
   *rf_path_return = NULL;
-  if ((rf = eth_fopen(rf_path, "r")) != NULL) {
+  if ((rf = ws_fopen(rf_path, "r")) != NULL) {
     /* We succeeded in opening it; read it. */
     read_prefs_file(rf_path, rf, read_set_recent_pair_static, NULL);
     fclose(rf);
+
+    /* XXX: The following code doesn't actually do anything since
+     *  the "recent common file" always exists. Presumably the
+     *  "if (!file_exists())" should actually be "if (file_exists())".
+     *  However, I've left the code as is because this
+     *  behaviour has existed for quite some time and I don't
+     *  know what's supposed to happen at this point.
+     *  ToDo: Determine if the "recent common file" should be read at this point
+     */
+    rf_common_path = get_persconffile_path(RECENT_COMMON_FILE_NAME, FALSE, FALSE);
+    if (!file_exists(rf_common_path)) {
+      /* Read older common settings from recent file */
+      rf = ws_fopen(rf_path, "r");
+      read_prefs_file(rf_path, rf, read_set_recent_common_pair_static, NULL);
+      fclose(rf);
+    }
+    g_free(rf_common_path);
     g_free(rf_path);
     rf_path = NULL;
   } else {
@@ -711,8 +922,6 @@ recent_read_static(char **rf_path_return, int *rf_errno_return)
   }
 }
 
-
-
 /* opens the user's recent file and read it out */
 void
 recent_read_dynamic(char **rf_path_return, int *rf_errno_return)
@@ -721,16 +930,23 @@ recent_read_dynamic(char **rf_path_return, int *rf_errno_return)
   FILE       *rf;
 
 
-  /* Construct the pathname of the user's recent file. */
-  rf_path = get_persconffile_path(RECENT_FILE_NAME, FALSE, FALSE);
+  /* Construct the pathname of the user's recent common file. */
+  rf_path = get_persconffile_path(RECENT_COMMON_FILE_NAME, FALSE, FALSE);
+  if (!file_exists (rf_path)) {
+    /* Recent common file does not exist, read from default recent */
+    g_free (rf_path);
+    rf_path = get_persconffile_path(RECENT_FILE_NAME, FALSE, FALSE);
+  }
 
   /* Read the user's recent file, if it exists. */
   *rf_path_return = NULL;
-  if ((rf = eth_fopen(rf_path, "r")) != NULL) {
+  if ((rf = ws_fopen(rf_path, "r")) != NULL) {
     /* We succeeded in opening it; read it. */
     read_prefs_file(rf_path, rf, read_set_recent_pair_dynamic, NULL);
-       /* set dfilter combobox to have an empty line */
+#if 0
+    /* set dfilter combobox to have an empty line */
     dfilter_combo_add_empty();
+#endif
     fclose(rf);
     g_free(rf_path);
     rf_path = NULL;
@@ -771,3 +987,113 @@ recent_get_column_width(gint col)
 
   return -1;
 }
+
+void
+recent_set_column_width(gint col, gint width)
+{
+  GList *col_l;
+  col_width_data *col_w;
+  gint cfmt;
+  const gchar *cfield = NULL;
+  gboolean found = FALSE;
+
+  cfmt = get_column_format(col);
+  if (cfmt == COL_CUSTOM) {
+    cfield = get_column_custom_field(col);
+  }
+
+  col_l = g_list_first(recent.col_width_list);
+  while (col_l) {
+    col_w = (col_width_data *) col_l->data;
+    if (col_w->cfmt == cfmt) {
+      if (cfmt != COL_CUSTOM || strcmp (cfield, col_w->cfield) == 0) {
+       col_w->width = width;
+       found = TRUE;
+       break;
+      }
+    }
+    col_l = col_l->next;
+  }
+
+  if (!found) {
+    col_w = (col_width_data *) g_malloc(sizeof(col_width_data));
+    col_w->cfmt = cfmt;
+    if (cfield) {
+      col_w->cfield = g_strdup(cfield);
+    } else {
+      col_w->cfield = NULL;
+    }
+    col_w->width = width;
+    col_w->xalign = COLUMN_XALIGN_DEFAULT;
+    recent.col_width_list = g_list_append(recent.col_width_list, col_w);
+  }
+}
+
+gchar
+recent_get_column_xalign(gint col)
+{
+  GList *col_l;
+  col_width_data *col_w;
+  gint cfmt;
+  const gchar *cfield = NULL;
+
+  cfmt = get_column_format(col);
+  if (cfmt == COL_CUSTOM) {
+    cfield = get_column_custom_field(col);
+  }
+
+  col_l = g_list_first(recent.col_width_list);
+  while (col_l) {
+    col_w = (col_width_data *) col_l->data;
+    if (col_w->cfmt == cfmt) {
+      if (cfmt != COL_CUSTOM || strcmp (cfield, col_w->cfield) == 0) {
+        return col_w->xalign;
+      }
+    }
+    col_l = col_l->next;
+  }
+
+  return 0;
+}
+
+void
+recent_set_column_xalign(gint col, gchar xalign)
+{
+  GList *col_l;
+  col_width_data *col_w;
+  gint cfmt;
+  const gchar *cfield = NULL;
+  gboolean found = FALSE;
+
+  cfmt = get_column_format(col);
+  if (cfmt == COL_CUSTOM) {
+    cfield = get_column_custom_field(col);
+  }
+
+  col_l = g_list_first(recent.col_width_list);
+  while (col_l) {
+    col_w = (col_width_data *) col_l->data;
+    if (col_w->cfmt == cfmt) {
+      if (cfmt != COL_CUSTOM || strcmp (cfield, col_w->cfield) == 0) {
+        col_w->xalign = xalign;
+        found = TRUE;
+        break;
+      }
+    }
+    col_l = col_l->next;
+  }
+
+  if (!found) {
+    col_w = (col_width_data *) g_malloc(sizeof(col_width_data));
+    col_w->cfmt = cfmt;
+    if (cfield) {
+      col_w->cfield = g_strdup(cfield);
+    } else {
+      col_w->cfield = NULL;
+    }
+    col_w->width = 40;
+    col_w->xalign = xalign;
+    recent.col_width_list = g_list_append(recent.col_width_list, col_w);
+  }
+}
+