Add GCC-style printf annotation to the routines that now take a format
[obnox/wireshark/wip.git] / gtk / main_statusbar.c
index b89a5d980caecf145db246526f91eb153247617c..315c21b63c18cfc5ee5bbf7302c536ab66872248 100644 (file)
 
 #include "../cfile.h"
 #include "../file.h"
+#ifdef HAVE_LIBPCAP
 #include "../capture_opts.h"
 #include "../capture_ui_utils.h"
-#ifdef HAVE_LIBPCAP
 #include "../capture.h"
 #endif
 
 #include "gtk/recent.h"
 #include "gtk/main.h"
-#include "gtk/main_statusbar.h"
 #include "gtk/main_statusbar_private.h"
 #include "gtk/gui_utils.h"
 #include "gtk/gtkglobals.h"
 #include "gtk/profile_dlg.h"
 #include "gtk/main_welcome.h"
 #include "gtk/expert_indicators.h"
+#include "gtk/keys.h"
+#include "gtk/menus.h"
+
+#include "main_statusbar.h"
 
 /*
  * The order below defines the priority of info bar contexts.
@@ -81,8 +84,8 @@ static GtkWidget    *info_bar, *info_bar_event, *packets_bar, *profile_bar, *pro
 static GtkWidget    *expert_info_error, *expert_info_warn, *expert_info_note;
 static GtkWidget    *expert_info_chat, *expert_info_none;
 
-static guint        main_ctx, file_ctx, help_ctx, filter_ctx, packets_ctx, profile_ctx;
-static guint        status_levels[NUM_STATUS_LEVELS];
+static guint         main_ctx, file_ctx, help_ctx, filter_ctx, packets_ctx, profile_ctx;
+static guint         status_levels[NUM_STATUS_LEVELS];
 static gchar        *packets_str = NULL;
 static gchar        *profile_str = NULL;
 
@@ -99,12 +102,18 @@ static void status_expert_new(void);
 static gint flash_time;
 static gboolean flash_highlight = FALSE;
 
+static void
+statusbar_push_file_msg(const gchar *msg_format, ...)
+    G_GNUC_PRINTF(1, 2);
+
 /*
- * Push a message referring to file access onto the statusbar.
+ * Push a formatted message referring to file access onto the statusbar.
  */
 static void
-statusbar_push_file_msg(const gchar *msg)
+statusbar_push_file_msg(const gchar *msg_format, ...)
 {
+    va_list ap;
+    gchar *msg;
     int i;
 
     /*g_warning("statusbar_push: %s", msg);*/
@@ -114,7 +123,12 @@ statusbar_push_file_msg(const gchar *msg)
     }
     status_levels[STATUS_LEVEL_FILE]++;
 
+    va_start(ap, msg_format);
+    msg = g_strdup_vprintf(msg_format, ap);
+    va_end(ap);
+
     gtk_statusbar_push(GTK_STATUSBAR(info_bar), file_ctx, msg);
+    g_free(msg);
 }
 
 /*
@@ -131,11 +145,14 @@ statusbar_pop_file_msg(void)
 }
 
 /*
- * Push a message referring to the currently-selected field onto the statusbar.
+ * Push a formatted message referring to the currently-selected field onto
+ * the statusbar.
  */
 void
-statusbar_push_field_msg(const gchar *msg)
+statusbar_push_field_msg(const gchar *msg_format, ...)
 {
+    va_list ap;
+    gchar *msg;
     int i;
 
     for (i = STATUS_LEVEL_HELP + 1; i < NUM_STATUS_LEVELS; i++) {
@@ -144,7 +161,12 @@ statusbar_push_field_msg(const gchar *msg)
     }
     status_levels[STATUS_LEVEL_HELP]++;
 
+    va_start(ap, msg_format);
+    msg = g_strdup_vprintf(msg_format, ap);
+    va_end(ap);
+
     gtk_statusbar_push(GTK_STATUSBAR(info_bar), help_ctx, msg);
+    g_free(msg);
 }
 
 /*
@@ -160,11 +182,13 @@ statusbar_pop_field_msg(void)
 }
 
 /*
- * Push a message referring to the current filter onto the statusbar.
+ * Push a formatted message referring to the current filter onto the statusbar.
  */
 void
-statusbar_push_filter_msg(const gchar *msg)
+statusbar_push_filter_msg(const gchar *msg_format, ...)
 {
+    va_list ap;
+    gchar *msg;
     int i;
 
     for (i = STATUS_LEVEL_FILTER + 1; i < NUM_STATUS_LEVELS; i++) {
@@ -173,7 +197,12 @@ statusbar_push_filter_msg(const gchar *msg)
     }
     status_levels[STATUS_LEVEL_FILTER]++;
 
+    va_start(ap, msg_format);
+    msg = g_strdup_vprintf(msg_format, ap);
+    va_end(ap);
+
     gtk_statusbar_push(GTK_STATUSBAR(info_bar), filter_ctx, msg);
+    g_free(msg);
 }
 
 /*
@@ -195,7 +224,7 @@ static gboolean
 statusbar_remove_temporary_msg(gpointer data)
 {
     guint msg_id = GPOINTER_TO_UINT(data);
-    
+
     gtk_statusbar_remove(GTK_STATUSBAR(info_bar), main_ctx, msg_id);
 
     return FALSE;
@@ -223,21 +252,28 @@ statusbar_flash_temporary_msg(gpointer data _U_)
         gtk_drag_unhighlight(info_bar);
     }
 
-    flash_time -= TEMPORARY_FLASH_INTERVAL;    
+    flash_time -= TEMPORARY_FLASH_INTERVAL;
 
     return retval;
 }
 
 /*
- * Push a temporary message onto the statusbar.
+ * Push a formatted temporary message onto the statusbar.
  */
 void
-statusbar_push_temporary_msg(const gchar *msg)
+statusbar_push_temporary_msg(const gchar *msg_format, ...)
 {
+    va_list ap;
+    gchar *msg;
     guint msg_id;
-    
+
+    va_start(ap, msg_format);
+    msg = g_strdup_vprintf(msg_format, ap);
+    va_end(ap);
+
     msg_id = gtk_statusbar_push(GTK_STATUSBAR(info_bar), main_ctx, msg);
-    
+    g_free(msg);
+
     flash_time = TEMPORARY_FLASH_TIMEOUT - 1;
     g_timeout_add(TEMPORARY_FLASH_INTERVAL, statusbar_flash_temporary_msg, NULL);
 
@@ -250,7 +286,7 @@ statusbar_new(void)
 {
     GtkWidget *status_hbox;
 
-    /* Sstatus hbox */
+    /* Status hbox */
     status_hbox = gtk_hbox_new(FALSE, 1);
     gtk_container_set_border_width(GTK_CONTAINER(status_hbox), 0);
 
@@ -411,9 +447,11 @@ profile_bar_new(void)
     profile_bar = gtk_statusbar_new();
     gtk_container_add(GTK_CONTAINER(profile_bar_event), profile_bar);
     g_signal_connect(profile_bar_event, "button_press_event", G_CALLBACK(profile_show_popup_cb), NULL);
+    g_signal_connect(profile_bar_event, "button_press_event", G_CALLBACK(popup_menu_handler),
+                    g_object_get_data(G_OBJECT(popup_menu_object), PM_STATUSBAR_PROFILES_KEY));
     profile_ctx = gtk_statusbar_get_context_id(GTK_STATUSBAR(profile_bar), "profile");
     gtk_tooltips_set_tip (tooltips, profile_bar_event,
-                         "Click to change configuration profile", NULL);
+                          "Click to change configuration profile", NULL);
     profile_bar_update();
 
     gtk_widget_show(profile_bar);
@@ -422,34 +460,40 @@ profile_bar_new(void)
 
 
 /*
- * update the packets statusbar to the current values
+ * Update the packets statusbar to the current values
  */
 void
 packets_bar_update(void)
 {
     if(packets_bar) {
-        /* remove old status */
+        /* Remove old status */
         if(packets_str) {
             g_free(packets_str);
             gtk_statusbar_pop(GTK_STATUSBAR(packets_bar), packets_ctx);
         }
 
-        /* do we have any packets? */
+        /* Do we have any packets? */
         if(cfile.count) {
             if(cfile.drops_known) {
                 packets_str = g_strdup_printf(" Packets: %u Displayed: %u Marked: %u Dropped: %u",
                     cfile.count, cfile.displayed_count, cfile.marked_count, cfile.drops);
-           } else if (cfile.ignored_count > 0) {
+            } else if (cfile.ignored_count > 0) {
                 packets_str = g_strdup_printf(" Packets: %u Displayed: %u Marked: %u Ignored: %u",
                     cfile.count, cfile.displayed_count, cfile.marked_count, cfile.ignored_count);
             } else {
-                gulong computed_elapsed = cf_get_computed_elapsed();
-
-                packets_str = g_strdup_printf(" Packets: %u Displayed: %u Marked: %u Load time: %lu:%02lu.%03lu",
-                    cfile.count, cfile.displayed_count, cfile.marked_count,
-                    computed_elapsed/60000,
-                    computed_elapsed%60000/1000,
-                    computed_elapsed%1000);
+                if(cfile.is_tempfile){
+                    /* Live capture */
+                    packets_str = g_strdup_printf(" Packets: %u Displayed: %u Marked: %u",
+                                                  cfile.count, cfile.displayed_count, cfile.marked_count);
+                }else{
+                    /* Loading an existing file */
+                    gulong computed_elapsed = cf_get_computed_elapsed();
+                    packets_str = g_strdup_printf(" Packets: %u Displayed: %u Marked: %u Load time: %lu:%02lu.%03lu",
+                                                  cfile.count, cfile.displayed_count, cfile.marked_count,
+                                                  computed_elapsed/60000,
+                                                  computed_elapsed%60000/1000,
+                                                  computed_elapsed%1000);
+                }
             }
         } else {
             packets_str = g_strdup(" No Packets");
@@ -459,7 +503,7 @@ packets_bar_update(void)
 }
 
 /*
- * update the packets statusbar to the current values
+ * Update the packets statusbar to the current values
  */
 void
 profile_bar_update(void)
@@ -471,12 +515,19 @@ profile_bar_update(void)
             gtk_statusbar_pop(GTK_STATUSBAR(profile_bar), profile_ctx);
         }
 
-       profile_str = g_strdup_printf (" Profile: %s", get_profile_name ());
-
+        profile_str = g_strdup_printf (" Profile: %s", get_profile_name ());
         gtk_statusbar_push(GTK_STATUSBAR(profile_bar), profile_ctx, profile_str);
+
+        set_menus_for_profiles(is_default_profile());
     }
 }
 
+static gboolean
+expert_comp_dlg_event_cb(GtkWidget *w _U_, GdkEventButton *event _U_, gpointer user_data _U_)
+{
+    expert_comp_dlg_launch();
+    return TRUE;
+}
 
 static void
 status_expert_new(void)
@@ -491,35 +542,35 @@ status_expert_new(void)
     gtk_widget_show(expert_image);
     expert_info_error = gtk_event_box_new();
     gtk_container_add(GTK_CONTAINER(expert_info_error), expert_image);
-    g_signal_connect(expert_info_error, "button_press_event", G_CALLBACK(expert_comp_dlg_cb), NULL);
+    g_signal_connect(expert_info_error, "button_press_event", G_CALLBACK(expert_comp_dlg_event_cb), NULL);
 
     expert_image = pixbuf_to_widget(expert_warn_pb_data);
     gtk_tooltips_set_tip(tooltips, expert_image, "WARNING is the highest expert info level", NULL);
     gtk_widget_show(expert_image);
     expert_info_warn = gtk_event_box_new();
     gtk_container_add(GTK_CONTAINER(expert_info_warn), expert_image);
-    g_signal_connect(expert_info_warn, "button_press_event", G_CALLBACK(expert_comp_dlg_cb), NULL);
+    g_signal_connect(expert_info_warn, "button_press_event", G_CALLBACK(expert_comp_dlg_event_cb), NULL);
 
     expert_image = pixbuf_to_widget(expert_note_pb_data);
     gtk_tooltips_set_tip(tooltips, expert_image, "NOTE is the highest expert info level", NULL);
     gtk_widget_show(expert_image);
     expert_info_note = gtk_event_box_new();
     gtk_container_add(GTK_CONTAINER(expert_info_note), expert_image);
-    g_signal_connect(expert_info_note, "button_press_event", G_CALLBACK(expert_comp_dlg_cb), NULL);
+    g_signal_connect(expert_info_note, "button_press_event", G_CALLBACK(expert_comp_dlg_event_cb), NULL);
 
     expert_image = pixbuf_to_widget(expert_chat_pb_data);
     gtk_tooltips_set_tip(tooltips, expert_image, "CHAT is the highest expert info level", NULL);
     gtk_widget_show(expert_image);
     expert_info_chat = gtk_event_box_new();
     gtk_container_add(GTK_CONTAINER(expert_info_chat), expert_image);
-    g_signal_connect(expert_info_chat, "button_press_event", G_CALLBACK(expert_comp_dlg_cb), NULL);
+    g_signal_connect(expert_info_chat, "button_press_event", G_CALLBACK(expert_comp_dlg_event_cb), NULL);
 
     expert_image = pixbuf_to_widget(expert_none_pb_data);
     gtk_tooltips_set_tip(tooltips, expert_image, "No expert info", NULL);
     gtk_widget_show(expert_image);
     expert_info_none = gtk_event_box_new();
     gtk_container_add(GTK_CONTAINER(expert_info_none), expert_image);
-    g_signal_connect(expert_info_none, "button_press_event", G_CALLBACK(expert_comp_dlg_cb), NULL);
+    g_signal_connect(expert_info_none, "button_press_event", G_CALLBACK(expert_comp_dlg_event_cb), NULL);
     gtk_widget_show(expert_info_none);
 }
 
@@ -540,19 +591,19 @@ status_expert_update(void)
     status_expert_hide();
 
     switch(expert_get_highest_severity()) {
-        case(PI_ERROR):
+    case(PI_ERROR):
         gtk_widget_show(expert_info_error);
         break;
-        case(PI_WARN):
+    case(PI_WARN):
         gtk_widget_show(expert_info_warn);
         break;
-        case(PI_NOTE):
+    case(PI_NOTE):
         gtk_widget_show(expert_info_note);
         break;
-        case(PI_CHAT):
+    case(PI_CHAT):
         gtk_widget_show(expert_info_chat);
         break;
-        default:
+    default:
         gtk_widget_show(expert_info_none);
         break;
     }
@@ -561,30 +612,27 @@ status_expert_update(void)
 static void
 statusbar_set_filename(const char *file_name, gint64 file_length, nstime_t *file_elapsed_time)
 {
-  gchar       *size_str;
-  gchar       *status_msg;
+    gchar       *size_str;
 
-  /* expert info indicator */
-  status_expert_update();
+    /* expert info indicator */
+    status_expert_update();
 
-  /* statusbar */
-  /* convert file size */
-  if (file_length/1024/1024 > 10) {
-    size_str = g_strdup_printf("%" G_GINT64_MODIFIER "d MB", file_length/1024/1024);
-  } else if (file_length/1024 > 10) {
-    size_str = g_strdup_printf("%" G_GINT64_MODIFIER "d KB", file_length/1024);
-  } else {
-    size_str = g_strdup_printf("%" G_GINT64_MODIFIER "d Bytes", file_length);
-  }
+    /* statusbar */
+    /* convert file size */
+    if (file_length/1024/1024 > 10) {
+        size_str = g_strdup_printf("%" G_GINT64_MODIFIER "d MB", file_length/1024/1024);
+    } else if (file_length/1024 > 10) {
+        size_str = g_strdup_printf("%" G_GINT64_MODIFIER "d KB", file_length/1024);
+    } else {
+        size_str = g_strdup_printf("%" G_GINT64_MODIFIER "d Bytes", file_length);
+    }
 
-  status_msg = g_strdup_printf(" File: \"%s\" %s %02lu:%02lu:%02lu",
-    (file_name) ? file_name : "", size_str,
-    (long)file_elapsed_time->secs/3600,
-    (long)file_elapsed_time->secs%3600/60,
-    (long)file_elapsed_time->secs%60);
-  g_free(size_str);
-  statusbar_push_file_msg(status_msg);
-  g_free(status_msg);
+    statusbar_push_file_msg(" File: \"%s\" %s %02lu:%02lu:%02lu",
+                            (file_name) ? file_name : "", size_str,
+                            (long)file_elapsed_time->secs/3600,
+                            (long)file_elapsed_time->secs%3600/60,
+                            (long)file_elapsed_time->secs%60);
+    g_free(size_str);
 }
 
 
@@ -605,25 +653,22 @@ statusbar_cf_file_closing_cb(capture_file *cf _U_)
 static void
 statusbar_cf_file_closed_cb(capture_file *cf _U_)
 {
-  /* go back to "No packets" */
-  packets_bar_update();
+    /* go back to "No packets" */
+    packets_bar_update();
 }
 
 
 static void
 statusbar_cf_file_read_started_cb(capture_file *cf)
 {
-  const gchar *name_ptr;
-  gchar       *load_msg;
+    const gchar *name_ptr;
 
-  /* Ensure we pop any previous loaded filename */
-  statusbar_pop_file_msg();
+    /* Ensure we pop any previous loaded filename */
+    statusbar_pop_file_msg();
 
-  name_ptr = get_basename(cf->filename);
+    name_ptr = get_basename(cf->filename);
 
-  load_msg = g_strdup_printf(" Loading: %s", name_ptr);
-  statusbar_push_file_msg(load_msg);
-  g_free(load_msg);
+    statusbar_push_file_msg(" Loading: %s", name_ptr);
 }
 
 
@@ -639,7 +684,7 @@ statusbar_cf_file_read_finished_cb(capture_file *cf)
 static void
 statusbar_capture_prepared_cb(capture_options *capture_opts _U_)
 {
-    gchar *msg = " Waiting for capture input data ...";
+    static const gchar msg[] = " Waiting for capture input data ...";
     statusbar_push_file_msg(msg);
     welcome_header_push_msg(msg);
 }
@@ -647,55 +692,44 @@ statusbar_capture_prepared_cb(capture_options *capture_opts _U_)
 static void
 statusbar_capture_update_started_cb(capture_options *capture_opts)
 {
-    gchar *capture_msg;
-
-
     statusbar_pop_file_msg();
     welcome_header_pop_msg();
 
     if(capture_opts->iface) {
-        capture_msg = g_strdup_printf(" %s: <live capture in progress> to file: %s",
-                                     get_iface_description(capture_opts),
-                                     (capture_opts->save_file) ? capture_opts->save_file : "");
+        statusbar_push_file_msg(" %s: <live capture in progress> to file: %s",
+                                get_iface_description(capture_opts),
+                                (capture_opts->save_file) ? capture_opts->save_file : "");
     } else {
-        capture_msg = g_strdup_printf(" <live capture in progress> to file: %s",
-            (capture_opts->save_file) ? capture_opts->save_file : "");
+        statusbar_push_file_msg(" <live capture in progress> to file: %s",
+                                (capture_opts->save_file) ? capture_opts->save_file : "");
     }
-
-    statusbar_push_file_msg(capture_msg);
-
-    g_free(capture_msg);
 }
 
 static void
 statusbar_capture_update_continue_cb(capture_options *capture_opts)
 {
     capture_file *cf = capture_opts->cf;
-    gchar *capture_msg;
-
 
     status_expert_update();
 
     statusbar_pop_file_msg();
 
     if (cf->f_datalen/1024/1024 > 10) {
-        capture_msg = g_strdup_printf(" %s: <live capture in progress> File: %s %" G_GINT64_MODIFIER "d MB",
-                                     get_iface_description(capture_opts),
-                                     capture_opts->save_file,
-                                     cf->f_datalen/1024/1024);
+        statusbar_push_file_msg(" %s: <live capture in progress> File: %s %" G_GINT64_MODIFIER "d MB",
+                                get_iface_description(capture_opts),
+                                capture_opts->save_file,
+                                cf->f_datalen/1024/1024);
     } else if (cf->f_datalen/1024 > 10) {
-        capture_msg = g_strdup_printf(" %s: <live capture in progress> File: %s %" G_GINT64_MODIFIER "d KB",
-                                     get_iface_description(capture_opts),
-                                     capture_opts->save_file,
-                                     cf->f_datalen/1024);
+        statusbar_push_file_msg(" %s: <live capture in progress> File: %s %" G_GINT64_MODIFIER "d KB",
+                                get_iface_description(capture_opts),
+                                capture_opts->save_file,
+                                cf->f_datalen/1024);
     } else {
-        capture_msg = g_strdup_printf(" %s: <live capture in progress> File: %s %" G_GINT64_MODIFIER "d Bytes",
-                                     get_iface_description(capture_opts),
-                                     capture_opts->save_file,
-                                     cf->f_datalen);
+        statusbar_push_file_msg(" %s: <live capture in progress> File: %s %" G_GINT64_MODIFIER "d Bytes",
+                                get_iface_description(capture_opts),
+                                capture_opts->save_file,
+                                cf->f_datalen);
     }
-
-    statusbar_push_file_msg(capture_msg);
 }
 
 static void
@@ -706,24 +740,19 @@ statusbar_capture_update_finished_cb(capture_options *capture_opts)
     /* Pop the "<live capture in progress>" message off the status bar. */
     statusbar_pop_file_msg();
     statusbar_set_filename(cf->filename, cf->f_datalen, &(cf->elapsed_time));
+    packets_bar_update();
 }
 
 static void
 statusbar_capture_fixed_started_cb(capture_options *capture_opts)
 {
-    gchar *capture_msg;
-
-
     statusbar_pop_file_msg();
 
-    capture_msg = g_strdup_printf(" %s: <live capture in progress> to file: %s",
-                                 get_iface_description(capture_opts),
-                                 (capture_opts->save_file) ? capture_opts->save_file : "");
+    statusbar_push_file_msg(" %s: <live capture in progress> to file: %s",
+                            get_iface_description(capture_opts),
+                            (capture_opts->save_file) ? capture_opts->save_file : "");
 
-    statusbar_push_file_msg(capture_msg);
     gtk_statusbar_push(GTK_STATUSBAR(packets_bar), packets_ctx, " Packets: 0");
-
-    g_free(capture_msg);
 }
 
 static void
@@ -767,12 +796,8 @@ statusbar_cf_field_unselected_cb(capture_file *cf _U_)
 static void
 statusbar_cf_file_save_started_cb(gchar *filename)
 {
-    gchar        *save_msg;
-
     statusbar_pop_file_msg();
-    save_msg = g_strdup_printf(" Saving: %s...", get_basename(filename));
-    statusbar_push_file_msg(save_msg);
-    g_free(save_msg);
+    statusbar_push_file_msg(" Saving: %s...", get_basename(filename));
 }
 
 static void