diff options
Diffstat (limited to 'gtk')
-rw-r--r-- | gtk/file_dlg.c | 85 | ||||
-rw-r--r-- | gtk/file_dlg.h | 2 | ||||
-rw-r--r-- | gtk/packet_list.c | 2 | ||||
-rw-r--r-- | gtk/range_utils.c | 144 | ||||
-rw-r--r-- | gtk/range_utils.h | 14 |
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 |