aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--gtk/file_dlg.c85
-rw-r--r--gtk/file_dlg.h2
-rw-r--r--gtk/packet_list.c2
-rw-r--r--gtk/range_utils.c144
-rw-r--r--gtk/range_utils.h14
5 files changed, 108 insertions, 139 deletions
diff --git a/gtk/file_dlg.c b/gtk/file_dlg.c
index a2a6dd0da8..5943bcb00c 100644
--- a/gtk/file_dlg.c
+++ b/gtk/file_dlg.c
@@ -1161,20 +1161,8 @@ can_save_with_wiretap(int ft)
}
-/* Generate a list of the file types we can save this file as.
-
- "filetype" is the type it has now.
-
- "encap" is the encapsulation for its packets (which could be
- "unknown" or "per-packet").
-
- "filtered" is TRUE if we're to save only the packets that passed
- the display filter (in which case we have to save it using Wiretap)
- and FALSE if we're to save the entire file (in which case, if we're
- saving it in the type it has already, we can just copy it).
-
- The same applies for sel_curr, sel_all, sel_m_only, sel_m_range and sel_man_range
-*/
+/* Generate a list of the file types we can save this file as, by
+ checking what Wiretap supports. */
static void
set_file_type_list(GtkWidget *option_menu)
{
@@ -1192,23 +1180,19 @@ set_file_type_list(GtkWidget *option_menu)
/* Check all file types. */
index = 0;
for (ft = 0; ft < WTAP_NUM_FILE_TYPES; ft++) {
- if (!packet_range_process_all(&range) || ft != cfile.cd_t) {
- /* not all unfiltered packets or a different file type. We have to use Wiretap. */
- if (!can_save_with_wiretap(ft))
- continue; /* We can't. */
- }
-
- /* OK, we can write it out in this type. */
- ft_menu_item = gtk_menu_item_new_with_label(wtap_file_type_string(ft));
- if (ft == filetype) {
- /* Default to the same format as the file, if it's supported. */
- item_to_select = index;
+ if (can_save_with_wiretap(ft)) {
+ /* OK, we can write it out in this type. */
+ ft_menu_item = gtk_menu_item_new_with_label(wtap_file_type_string(ft));
+ if (ft == filetype) {
+ /* Default to the same format as the file, if it's supported. */
+ item_to_select = index;
+ }
+ SIGNAL_CONNECT(ft_menu_item, "activate", select_file_type_cb,
+ GINT_TO_POINTER(ft));
+ gtk_menu_append(GTK_MENU(ft_menu), ft_menu_item);
+ gtk_widget_show(ft_menu_item);
+ index++;
}
- SIGNAL_CONNECT(ft_menu_item, "activate", select_file_type_cb,
- GINT_TO_POINTER(ft));
- gtk_menu_append(GTK_MENU(ft_menu), ft_menu_item);
- gtk_widget_show(ft_menu_item);
- index++;
}
gtk_option_menu_set_menu(GTK_OPTION_MENU(option_menu), ft_menu);
@@ -1222,46 +1206,26 @@ select_file_type_cb(GtkWidget *w _U_, gpointer data)
GtkWidget *compressed_cb;
if (filetype != new_filetype) {
- /* We can select only the filtered or marked packets to be saved if we can
- use Wiretap to save the file. */
- if (range_tb != NULL)
- range_set_displayed_sensitive(range_tb, can_save_with_wiretap(new_filetype));
filetype = new_filetype;
- file_set_save_marked_sensitive();
- compressed_cb = OBJECT_GET_DATA(file_save_as_w, "compressed");
- gtk_widget_set_sensitive(compressed_cb, wtap_dump_can_compress(new_filetype));
+ compressed_cb = OBJECT_GET_DATA(file_save_as_w, "compressed");
+ gtk_widget_set_sensitive(compressed_cb, wtap_dump_can_compress(new_filetype));
}
}
/*
- * Set the "Save only marked packets" toggle button as appropriate for
- * the current output file type and count of marked packets.
- *
- * Called when the "Save As..." dialog box is created and when either
- * the file type or the marked count changes.
+ * Update various dynamic parts of the range controls; called from outside
+ * the file dialog code whenever the packet counts change.
*/
void
-file_set_save_marked_sensitive(void)
+file_save_update_dynamics(void)
{
if (file_save_as_w == NULL) {
/* We don't currently have a "Save As..." dialog box up. */
return;
}
- /* We can request that only the marked packets be saved only if we
- can use Wiretap to save the file and if there *are* marked packets. */
- if (can_save_with_wiretap(filetype) && cfile.marked_count > 0) {
- range_set_marked_sensitive(range_tb, TRUE);
- }
- else {
- /* Force the "Save only marked packets" toggle to "false", turn
- off the flag it controls, and update the list of types we can
- save the file as. */
- range.process = range_process_all;
- set_file_type_list(ft_om);
- range_set_marked_sensitive(range_tb, FALSE);
- }
+ range_update_dynamics(range_tb);
}
@@ -1345,15 +1309,6 @@ file_save_as_cmd(action_after_save_e action_after_save, gpointer action_after_sa
gtk_box_pack_start(GTK_BOX(ft_hb), ft_om, FALSE, FALSE, 0);
gtk_widget_show(ft_om);
- /*
- * Set the sensitivity of the "Save only marked packets" toggle
- * button
- *
- * This has to be done after we create the file type menu option,
- * as the routine that sets it also sets that menu.
- */
- file_set_save_marked_sensitive();
-
/* dynamic values in the range frame */
range_update_dynamics(range_tb);
diff --git a/gtk/file_dlg.h b/gtk/file_dlg.h
index 7a86136362..9ad1511242 100644
--- a/gtk/file_dlg.h
+++ b/gtk/file_dlg.h
@@ -115,6 +115,6 @@ void file_color_export_cmd_cb(GtkWidget *widget, gpointer data);
* Called when the "Save As..." dialog box is created and when either
* the file type or the marked count changes.
*/
-void file_set_save_marked_sensitive(void);
+void file_save_update_dynamics(void);
#endif /* file_dlg.h */
diff --git a/gtk/packet_list.c b/gtk/packet_list.c
index 8b1e2bc789..4792efc24d 100644
--- a/gtk/packet_list.c
+++ b/gtk/packet_list.c
@@ -314,7 +314,7 @@ set_frame_mark(gboolean set, frame_data *frame, gint row) {
/* call this after last set_frame_mark is done */
static void mark_frames_ready(void) {
- file_set_save_marked_sensitive();
+ file_save_update_dynamics();
packets_bar_update();
}
diff --git a/gtk/range_utils.c b/gtk/range_utils.c
index 703826bd3a..12371f2ca4 100644
--- a/gtk/range_utils.c
+++ b/gtk/range_utils.c
@@ -44,6 +44,7 @@
#define RANGE_CAPTURED_BT_KEY "range_captured_button"
#define RANGE_DISPLAYED_BT_KEY "range_displayed_button"
+#define RANGE_SELECT_ALL_KEY "range_select_all_rb"
#define RANGE_SELECT_ALL_C_KEY "range_select_all_c_lb"
#define RANGE_SELECT_ALL_D_KEY "range_select_all_d_lb"
#define RANGE_SELECT_CURR_KEY "range_select_curr_rb"
@@ -86,65 +87,127 @@ range_check_validity(packet_range_t *range)
/* update all "dynamic" things */
void
-range_update_dynamics(gpointer data) {
+range_update_dynamics(gpointer data)
+{
+ packet_range_t *range;
+ GtkWidget *range_displayed_bt;
gboolean filtered_active;
- gchar label_text[100];
gint selected_num;
- GtkWidget *bt;
- packet_range_t *range;
+ gboolean can_select;
+ gchar label_text[100];
range = OBJECT_GET_DATA(data, RANGE_VALUES_KEY);
- bt = OBJECT_GET_DATA(data, RANGE_DISPLAYED_BT_KEY);
- filtered_active = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(bt));
+ range_displayed_bt = OBJECT_GET_DATA(data, RANGE_DISPLAYED_BT_KEY);
+ filtered_active = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(range_displayed_bt));
- gtk_widget_set_sensitive(bt, TRUE);
+ /* Enable saving only the displayed packets only if there *are*
+ displayed packets. */
+ if (range->displayed_cnt != 0)
+ gtk_widget_set_sensitive(range_displayed_bt, TRUE);
+ else {
+ /* If saving the displayed packets is selected, select saving the
+ captured packets. */
+ filtered_active = FALSE;
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(OBJECT_GET_DATA(data, RANGE_SELECT_ALL_KEY)), FALSE);
+ gtk_widget_set_sensitive(range_displayed_bt, FALSE);
+ }
gtk_widget_set_sensitive(OBJECT_GET_DATA(data, RANGE_SELECT_ALL_C_KEY), !filtered_active);
g_snprintf(label_text, sizeof(label_text), "%u", cfile.count);
gtk_label_set_text(GTK_LABEL(OBJECT_GET_DATA(data, RANGE_SELECT_ALL_C_KEY)), label_text);
gtk_widget_set_sensitive(OBJECT_GET_DATA(data, RANGE_SELECT_ALL_D_KEY), filtered_active);
g_snprintf(label_text, sizeof(label_text), "%u", range->displayed_cnt);
-
gtk_label_set_text(GTK_LABEL(OBJECT_GET_DATA(data, RANGE_SELECT_ALL_D_KEY)), label_text);
+ /* Enable saving the currently-selected packet only if there *is* a
+ currently-selected packet. */
selected_num = (cfile.current_frame) ? cfile.current_frame->num : 0;
+ can_select = (selected_num != 0);
+ if (can_select) {
+ gtk_widget_set_sensitive(OBJECT_GET_DATA(data, RANGE_SELECT_CURR_KEY), TRUE);
+ gtk_widget_set_sensitive(OBJECT_GET_DATA(data, RANGE_SELECT_CURR_C_KEY), !filtered_active);
+ gtk_widget_set_sensitive(OBJECT_GET_DATA(data, RANGE_SELECT_CURR_D_KEY), filtered_active);
+ } else {
+ /* If "save selected packet" is selected, select "save all packets". */
+ if (range->process == range_process_selected) {
+ range->process = range_process_all;
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(OBJECT_GET_DATA(data, RANGE_SELECT_ALL_KEY)), TRUE);
+ }
+ gtk_widget_set_sensitive(OBJECT_GET_DATA(data, RANGE_SELECT_CURR_KEY), FALSE);
+ gtk_widget_set_sensitive(OBJECT_GET_DATA(data, RANGE_SELECT_CURR_C_KEY), FALSE);
+ gtk_widget_set_sensitive(OBJECT_GET_DATA(data, RANGE_SELECT_CURR_D_KEY), FALSE);
+ }
/* XXX: how to update the radio button label but keep the mnemonic? */
-/* g_snprintf(label_text, sizeof(label_text), "_Selected packet #%u only", selected_num);
+/*g_snprintf(label_text, sizeof(label_text), "_Selected packet #%u only", selected_num);
gtk_label_set_text(GTK_LABEL(GTK_BIN(select_curr_rb)->child), label_text);*/
- gtk_widget_set_sensitive(OBJECT_GET_DATA(data, RANGE_SELECT_CURR_KEY), selected_num);
g_snprintf(label_text, sizeof(label_text), "%u", selected_num ? 1 : 0);
gtk_label_set_text(GTK_LABEL(OBJECT_GET_DATA(data, RANGE_SELECT_CURR_C_KEY)), label_text);
- gtk_widget_set_sensitive(OBJECT_GET_DATA(data, RANGE_SELECT_CURR_C_KEY), selected_num && !filtered_active);
g_snprintf(label_text, sizeof(label_text), "%u", selected_num ? 1 : 0);
gtk_label_set_text(GTK_LABEL(OBJECT_GET_DATA(data, RANGE_SELECT_CURR_D_KEY)), label_text);
- gtk_widget_set_sensitive(OBJECT_GET_DATA(data, RANGE_SELECT_CURR_D_KEY), selected_num && filtered_active);
- gtk_widget_set_sensitive(OBJECT_GET_DATA(data, RANGE_SELECT_MARKED_KEY), cfile.marked_count > 0);
+ /* Enable the buttons for saving marked packets only if there *are*
+ marked packets. */
+ if (filtered_active)
+ can_select = (range->displayed_marked_cnt != 0);
+ else
+ can_select = (cfile.marked_count > 0);
+ if (can_select) {
+ gtk_widget_set_sensitive(OBJECT_GET_DATA(data, RANGE_SELECT_MARKED_KEY), TRUE);
+ gtk_widget_set_sensitive(OBJECT_GET_DATA(data, RANGE_SELECT_MARKED_C_KEY), !filtered_active);
+ gtk_widget_set_sensitive(OBJECT_GET_DATA(data, RANGE_SELECT_MARKED_D_KEY), filtered_active);
+ }
+ else {
+ /* If "save marked packet" is selected, select "save all packets". */
+ if (range->process == range_process_marked) {
+ range->process = range_process_all;
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(OBJECT_GET_DATA(data, RANGE_SELECT_ALL_KEY)), TRUE);
+ }
+ gtk_widget_set_sensitive(OBJECT_GET_DATA(data, RANGE_SELECT_MARKED_KEY), FALSE);
+ gtk_widget_set_sensitive(OBJECT_GET_DATA(data, RANGE_SELECT_MARKED_C_KEY), FALSE);
+ gtk_widget_set_sensitive(OBJECT_GET_DATA(data, RANGE_SELECT_MARKED_D_KEY), FALSE);
+ }
g_snprintf(label_text, sizeof(label_text), "%u", cfile.marked_count);
gtk_label_set_text(GTK_LABEL(OBJECT_GET_DATA(data, RANGE_SELECT_MARKED_C_KEY)), label_text);
- gtk_widget_set_sensitive(OBJECT_GET_DATA(data, RANGE_SELECT_MARKED_C_KEY), cfile.marked_count > 0 && !filtered_active);
g_snprintf(label_text, sizeof(label_text), "%u", range->displayed_marked_cnt);
gtk_label_set_text(GTK_LABEL(OBJECT_GET_DATA(data, RANGE_SELECT_MARKED_D_KEY)), label_text);
- gtk_widget_set_sensitive(OBJECT_GET_DATA(data, RANGE_SELECT_MARKED_D_KEY), range->displayed_marked_cnt && filtered_active);
- gtk_widget_set_sensitive(OBJECT_GET_DATA(data, RANGE_SELECT_MARKED_RANGE_KEY), range->mark_range_cnt);
- g_snprintf(label_text, sizeof(label_text), "%u", range->mark_range_cnt);
+ /* Enable the buttons for saving the range of marked packets only if
+ there *is* a range of marked packets. */
+ if (filtered_active)
+ can_select = (range->displayed_mark_range_cnt != 0);
+ else
+ can_select = (range->mark_range_cnt != 0);
+ if (can_select) {
+ gtk_widget_set_sensitive(OBJECT_GET_DATA(data, RANGE_SELECT_MARKED_RANGE_KEY), TRUE);
+ gtk_widget_set_sensitive(OBJECT_GET_DATA(data, RANGE_SELECT_MARKED_RANGE_C_KEY), !filtered_active);
+ gtk_widget_set_sensitive(OBJECT_GET_DATA(data, RANGE_SELECT_MARKED_RANGE_D_KEY), filtered_active);
+ }
+ else {
+ /* If "save range between first and last marked packet" is selected,
+ select "save all packets". */
+ if (range->process == range_process_marked_range) {
+ range->process = range_process_all;
+ gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(OBJECT_GET_DATA(data, RANGE_SELECT_ALL_KEY)), TRUE);
+ }
+ gtk_widget_set_sensitive(OBJECT_GET_DATA(data, RANGE_SELECT_MARKED_RANGE_KEY), FALSE);
+ gtk_widget_set_sensitive(OBJECT_GET_DATA(data, RANGE_SELECT_MARKED_RANGE_C_KEY), FALSE);
+ gtk_widget_set_sensitive(OBJECT_GET_DATA(data, RANGE_SELECT_MARKED_RANGE_D_KEY), FALSE);
+ }
gtk_label_set_text(GTK_LABEL(OBJECT_GET_DATA(data, RANGE_SELECT_MARKED_RANGE_C_KEY)), label_text);
- gtk_widget_set_sensitive(OBJECT_GET_DATA(data, RANGE_SELECT_MARKED_RANGE_C_KEY), range->mark_range_cnt && !filtered_active);
g_snprintf(label_text, sizeof(label_text), "%u", range->displayed_mark_range_cnt);
gtk_label_set_text(GTK_LABEL(OBJECT_GET_DATA(data, RANGE_SELECT_MARKED_RANGE_D_KEY)), label_text);
- gtk_widget_set_sensitive(OBJECT_GET_DATA(data, RANGE_SELECT_MARKED_RANGE_D_KEY), range->displayed_mark_range_cnt && filtered_active);
+ g_snprintf(label_text, sizeof(label_text), "%u", range->mark_range_cnt);
gtk_widget_set_sensitive(OBJECT_GET_DATA(data, RANGE_SELECT_USER_KEY), TRUE);
+ gtk_widget_set_sensitive(OBJECT_GET_DATA(data, RANGE_SELECT_USER_C_KEY), !filtered_active);
+ gtk_widget_set_sensitive(OBJECT_GET_DATA(data, RANGE_SELECT_USER_D_KEY), filtered_active);
g_snprintf(label_text, sizeof(label_text), "%u", range->user_range_cnt);
gtk_label_set_text(GTK_LABEL(OBJECT_GET_DATA(data, RANGE_SELECT_USER_C_KEY)), label_text);
- gtk_widget_set_sensitive(OBJECT_GET_DATA(data, RANGE_SELECT_USER_C_KEY), !filtered_active);
g_snprintf(label_text, sizeof(label_text), "%u", range->displayed_user_range_cnt);
gtk_label_set_text(GTK_LABEL(OBJECT_GET_DATA(data, RANGE_SELECT_USER_D_KEY)), label_text);
- gtk_widget_set_sensitive(OBJECT_GET_DATA(data, RANGE_SELECT_USER_D_KEY), filtered_active);
}
@@ -313,42 +376,6 @@ range_entry_in_event(GtkWidget *widget, GdkEventFocus *event _U_, gpointer user_
}
-/* set the "Process only marked packets" toggle button as appropriate */
-void
-range_set_marked_sensitive(gpointer data, gboolean marked_valid)
-{
- packet_range_t *range;
-
-
- range = OBJECT_GET_DATA(data, RANGE_VALUES_KEY);
-
- /* We can request that only the marked packets be processed only if we
- if there *are* marked packets. */
- if (marked_valid) {
- gtk_widget_set_sensitive(OBJECT_GET_DATA(data, RANGE_SELECT_MARKED_KEY), TRUE);
- gtk_widget_set_sensitive(OBJECT_GET_DATA(data, RANGE_SELECT_MARKED_RANGE_KEY), TRUE);
- }
- else {
- /* Force the "Process only marked packets" toggle to "false", turn
- off the flag it controls. */
- range->process = range_process_all;
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(OBJECT_GET_DATA(data, RANGE_SELECT_MARKED_KEY)), FALSE);
- gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(OBJECT_GET_DATA(data, RANGE_SELECT_MARKED_RANGE_KEY)), FALSE);
- gtk_widget_set_sensitive(OBJECT_GET_DATA(data, RANGE_SELECT_MARKED_KEY), FALSE);
- gtk_widget_set_sensitive(OBJECT_GET_DATA(data, RANGE_SELECT_MARKED_RANGE_KEY), FALSE);
- }
-}
-
-
-/* set the "displayed" button as appropriate */
-void
-range_set_displayed_sensitive(gpointer data, gboolean displayed_valid)
-{
-
- gtk_widget_set_sensitive(OBJECT_GET_DATA(data, RANGE_DISPLAYED_BT_KEY), displayed_valid);
-}
-
-
/* create a new range "widget" */
GtkWidget *range_new(packet_range_t *range
#if GTK_MAJOR_VERSION < 2
@@ -477,6 +504,7 @@ GtkWidget *range_new(packet_range_t *range
OBJECT_SET_DATA(range_tb, RANGE_CAPTURED_BT_KEY, captured_bt);
OBJECT_SET_DATA(range_tb, RANGE_DISPLAYED_BT_KEY, displayed_bt);
+ OBJECT_SET_DATA(range_tb, RANGE_SELECT_ALL_KEY, select_all_rb);
OBJECT_SET_DATA(range_tb, RANGE_SELECT_ALL_C_KEY, select_all_c_lb);
OBJECT_SET_DATA(range_tb, RANGE_SELECT_ALL_D_KEY, select_all_d_lb);
@@ -515,7 +543,7 @@ GtkWidget *range_new(packet_range_t *range
gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(select_user_range_rb), TRUE);
break;
default:
- g_assert_not_reached();
+ g_assert_not_reached();
}
return range_tb;
diff --git a/gtk/range_utils.h b/gtk/range_utils.h
index 2da6fd272b..8d7ff239c5 100644
--- a/gtk/range_utils.h
+++ b/gtk/range_utils.h
@@ -65,18 +65,4 @@ extern GtkWidget *range_new(packet_range_t *range
*/
extern void range_update_dynamics(gpointer data);
-/** Set the "Process only marked packets" toggle button as appropriate.
- *
- * @param data range widget
- * @param marked_valid TRUE, if marked packets available
- */
-extern void range_set_marked_sensitive(gpointer data, gboolean marked_valid);
-
-/** Set the "displayed" button as appropriate.
- *
- * @param data range widget
- * @param displayed_valid TRUE, if displayed packets available
- */
-extern void range_set_displayed_sensitive(gpointer data, gboolean displayed_valid);
-
#endif