diff options
-rw-r--r-- | gtk/capture_dlg.c | 390 | ||||
-rw-r--r-- | gtk/capture_dlg.h | 5 | ||||
-rw-r--r-- | gtk/main_welcome.c | 6 | ||||
-rw-r--r-- | gtk/main_welcome.h | 2 |
4 files changed, 231 insertions, 172 deletions
diff --git a/gtk/capture_dlg.c b/gtk/capture_dlg.c index df419ba94b..b0490cbff4 100644 --- a/gtk/capture_dlg.c +++ b/gtk/capture_dlg.c @@ -220,6 +220,9 @@ capture_dlg_prep(gpointer parent_w); extern gint if_list_comparator_alph (const void *first_arg, const void *second_arg); +static void +make_and_fill_rows(void); + /* stop the currently running capture */ void capture_stop_cb(GtkWidget *w _U_, gpointer d _U_) @@ -1591,11 +1594,6 @@ update_options_table(gint index) #endif g_array_append_val(global_capture_opts.ifaces, interface_opts); } - path_str = g_strdup_printf("%d", index); - path = gtk_tree_path_new_from_string(path_str); - if_cb = (GtkTreeView *) g_object_get_data(G_OBJECT(cap_open_w), E_CAP_IFACE_KEY); - model = gtk_tree_view_get_model(if_cb); - gtk_tree_model_get_iter (model, &iter, path); if (row.no_addresses == 0) { temp = g_strdup_printf("<b>%s</b>", row.display_name); } else { @@ -1608,30 +1606,39 @@ update_options_table(gint index) break; } } - gtk_tree_model_get(model, &iter, CAPTURE, &enabled, -1); - if (enabled == FALSE) { - num_selected++; - } if (row.has_snaplen) { snaplen_string = g_strdup_printf("%d", row.snaplen); } else { snaplen_string = g_strdup("default"); } + if (cap_open_w) { + if_cb = (GtkTreeView *) g_object_get_data(G_OBJECT(cap_open_w), E_CAP_IFACE_KEY); + path_str = g_strdup_printf("%d", marked_row); + path = gtk_tree_path_new_from_string(path_str); + model = gtk_tree_view_get_model(if_cb); + gtk_tree_model_get_iter (model, &iter, path); + gtk_tree_model_get(model, &iter, CAPTURE, &enabled, -1); + if (enabled == FALSE) { + num_selected++; + } + #if defined(HAVE_PCAP_CREATE) - gtk_list_store_set (GTK_LIST_STORE(model), &iter, CAPTURE, TRUE, INTERFACE, temp, LINK, link->name, PMODE, row.pmode?"enabled":"disabled", SNAPLEN, snaplen_string, BUFFER, (guint) row.buffer, MONITOR, row.monitor_mode_supported?(row.monitor_mode_enabled?"enabled":"disabled"):"n/a", FILTER, row.cfilter, -1); + gtk_list_store_set (GTK_LIST_STORE(model), &iter, CAPTURE, TRUE, INTERFACE, temp, LINK, link->name, PMODE, row.pmode?"enabled":"disabled", SNAPLEN, snaplen_string, BUFFER, (guint) row.buffer, MONITOR, row.monitor_mode_supported?(row.monitor_mode_enabled?"enabled":"disabled"):"n/a", FILTER, row.cfilter, -1); #elif defined(_WIN32) && !defined(HAVE_PCAP_CREATE) - gtk_list_store_set (GTK_LIST_STORE(model), &iter, CAPTURE, TRUE, INTERFACE, temp,LINK, link->name, PMODE, row.pmode?"enabled":"disabled", SNAPLEN, snaplen_string, BUFFER, (guint) row.buffer, FILTER, row.cfilter, -1); + gtk_list_store_set (GTK_LIST_STORE(model), &iter, CAPTURE, TRUE, INTERFACE, temp,LINK, link->name, PMODE, row.pmode?"enabled":"disabled", SNAPLEN, snaplen_string, BUFFER, (guint) row.buffer, FILTER, row.cfilter, -1); #else - gtk_list_store_set (GTK_LIST_STORE(model), &iter, CAPTURE, TRUE, INTERFACE, temp,LINK, link->name, PMODE, row.pmode?"enabled":"disabled", SNAPLEN, snaplen_string, FILTER, row.cfilter, -1); + gtk_list_store_set (GTK_LIST_STORE(model), &iter, CAPTURE, TRUE, INTERFACE, temp,LINK, link->name, PMODE, row.pmode?"enabled":"disabled", SNAPLEN, snaplen_string, FILTER, row.cfilter, -1); #endif #ifdef USE_THREADS - if (num_selected > 0) { + if (num_selected > 0) { #else - if (num_selected == 1) { + if (num_selected == 1) { #endif - gtk_widget_set_sensitive(ok_bt, TRUE); - } else { - gtk_widget_set_sensitive(ok_bt, FALSE); + gtk_widget_set_sensitive(ok_bt, TRUE); + } else { + gtk_widget_set_sensitive(ok_bt, FALSE); + } + gtk_tree_path_free (path); } if (interfaces_dialog_window_present()) { update_selected_interface(g_strdup(row.name), TRUE); @@ -1639,7 +1646,6 @@ update_options_table(gint index) if (get_welcome_window() != NULL) { change_interface_selection(g_strdup(row.name), TRUE); } - gtk_tree_path_free (path); } static void @@ -1729,7 +1735,7 @@ adjust_snap_sensitivity(GtkWidget *tb _U_, gpointer parent_w _U_) g_array_insert_val(rows, marked_row, row); } -static void options_interface_cb(GtkTreeView *view, GtkTreePath *path, GtkTreeViewColumn *column _U_, gpointer userdata) +void options_interface_cb(GtkTreeView *view, GtkTreePath *path, GtkTreeViewColumn *column _U_, gpointer userdata) { GtkWidget *caller, *window, *swindow=NULL, *if_view, *main_vb, *if_hb, *if_lb, *if_lb_name, @@ -1765,11 +1771,13 @@ static void options_interface_cb(GtkTreeView *view, GtkTreePath *path, GtkTreeVi GtkWidget *advanced_bt; #endif interface_row row; + displayed_interface d_interface; GtkTreeModel *model; GtkTreeIter iter; link_row *temp; gboolean found = FALSE; gint num_supported_link_types; + guint i; gchar *tok; GtkCellRenderer *renderer; GtkListStore *store; @@ -1782,11 +1790,38 @@ static void options_interface_cb(GtkTreeView *view, GtkTreePath *path, GtkTreeVi return; } + row.display_name = NULL; + row.no_addresses = 0; + row.addresses = NULL; + row.links = NULL; + row.active_dlt = -1; + row.pmode = FALSE; + row.monitor_mode_enabled = FALSE; + row.monitor_mode_supported = FALSE; + row.has_snaplen = FALSE; + row.snaplen = 65535; + row.cfilter = NULL; + row.buffer = 1; + model = gtk_tree_view_get_model(view); gtk_tree_model_get_iter (model, &iter, path); marked_row = atoi(gtk_tree_path_to_string(path)); - row = g_array_index(rows, interface_row, marked_row); + if (cap_open_w) { + row = g_array_index(rows, interface_row, marked_row); + } else if (get_welcome_window() != NULL) { + d_interface = get_interface_data(marked_row); + if (!rows || rows->len == 0) { + make_and_fill_rows(); + } + for (i = 0; i < rows->len; i++) { + row = g_array_index(rows, interface_row, i); + if (strcmp(row.name, (char*)d_interface.name)==0) { + marked_row = i; + break; + } + } + } opt_edit_w = dlg_window_new("Edit Interface Settings"); g_object_set_data(G_OBJECT(opt_edit_w), E_OPT_EDIT_CALLER_PTR_KEY, caller); g_object_set_data(G_OBJECT(caller), E_OPT_EDIT_DIALOG_PTR_KEY, opt_edit_w); @@ -1827,6 +1862,7 @@ static void options_interface_cb(GtkTreeView *view, GtkTreePath *path, GtkTreeVi gtk_box_pack_start(GTK_BOX(if_vb_left), if_ip_lb, FALSE, FALSE, 0); if (row.no_addresses > 0) { + gchar *temp_addresses = g_strdup(row.addresses); gtk_box_pack_start(GTK_BOX(capture_vb), if_ip_hb, TRUE, TRUE, 0); gtk_box_pack_start(GTK_BOX(if_ip_hb), if_vb_right, TRUE, TRUE, 3); swindow = gtk_scrolled_window_new (NULL, NULL); @@ -1842,13 +1878,14 @@ static void options_interface_cb(GtkTreeView *view, GtkTreePath *path, GtkTreeVi NULL); gtk_tree_view_append_column(GTK_TREE_VIEW(if_view), column); store = gtk_list_store_new(1, G_TYPE_STRING); - for (tok = strtok (row.addresses, "\n"); tok; tok = strtok(NULL, "\n")) { + for (tok = strtok (temp_addresses, "\n"); tok; tok = strtok(NULL, "\n")) { gtk_list_store_append (store, &iter); gtk_list_store_set (store, &iter, 0, tok, -1); } gtk_tree_view_set_model(GTK_TREE_VIEW(if_view), GTK_TREE_MODEL (store)); gtk_container_add (GTK_CONTAINER (swindow), if_view); gtk_box_pack_start(GTK_BOX(if_vb_right), swindow, TRUE, TRUE, 0); + g_free(temp_addresses); } else { gtk_box_pack_start(GTK_BOX(capture_vb), if_ip_hb, FALSE, FALSE, 0); gtk_box_pack_start(GTK_BOX(if_ip_hb), if_vb_right, FALSE, FALSE, 3); @@ -2559,6 +2596,7 @@ capture_prep_cb(GtkWidget *w _U_, gpointer d _U_) simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "%s", err_str); g_free(err_str); } + if_list = g_list_sort (if_list, if_list_comparator_alph); #ifdef HAVE_AIRPCAP /* update airpcap interface list */ @@ -2653,7 +2691,7 @@ capture_prep_cb(GtkWidget *w _U_, gpointer d _U_) column = gtk_tree_view_column_new_with_attributes("Capture Filter", renderer, "text", FILTER, NULL); gtk_tree_view_append_column(GTK_TREE_VIEW(view), column); gtk_tree_view_column_set_alignment(column, 0.5); - create_and_fill_model(if_list, TRUE, GTK_TREE_VIEW(view)); + create_and_fill_model(GTK_TREE_VIEW(view)); selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(view)); gtk_tree_selection_set_mode(selection, GTK_SELECTION_SINGLE); gtk_container_add (GTK_CONTAINER (swindow), view); @@ -3498,30 +3536,178 @@ capture_dlg_prep(gpointer parent_w) { return TRUE; } -GtkTreeModel *create_and_fill_model(GList *if_list, gboolean do_hide, GtkTreeView *view) +static void +make_and_fill_rows(void) { - GtkListStore *store; - GtkTreeIter iter; - GList *if_entry, *list; + GList *if_entry, *if_list; if_info_t *if_info; - char *if_string="", *temp="", *snaplen_string; + char *if_string="", *temp=""; gchar *descr; if_capabilities_t *caps=NULL; gint linktype_count; cap_settings_t cap_settings; GSList *curr_addr; - int ips = 0; - guint i, j; + int ips = 0, err; + guint i; if_addr_t *addr; GList *lt_entry; link_row *link = NULL; data_link_info_t *data_link_info; - gchar *str, *link_type_name = NULL; + gchar *str, *err_str = NULL, *link_type_name = NULL; interface_row row; interface_options interface_opts; gboolean found = FALSE; GString *ip_str; + rows = g_array_new(TRUE, TRUE, sizeof(interface_row)); + /* Scan through the list and build a list of strings to display. */ + if_list = capture_interface_list(&err, &err_str); + if_list = g_list_sort (if_list, if_list_comparator_alph); + if (if_list == NULL && err == CANT_GET_INTERFACE_LIST) { + simple_dialog(ESD_TYPE_ERROR, ESD_BTN_OK, "%s", err_str); + g_free(err_str); + return; + } else if (err_str) { + g_free(err_str); + } + for (if_entry = if_list; if_entry != NULL; if_entry = g_list_next(if_entry)) { + if_info = if_entry->data; + ip_str = g_string_new(""); + str = ""; + ips = 0; + row.name = g_strdup(if_info->name); + /* Is this interface hidden and, if so, should we include it anyway? */ + if (!prefs_is_capture_device_hidden(if_info->name)) { + /* It's not hidden, or it is but we should include it in the list. */ + /* Do we have a user-supplied description? */ + descr = capture_dev_user_descr_find(if_info->name); + if (descr != NULL) { + /* Yes, we have a user-supplied description; use it. */ + if_string = g_strdup_printf("%s: %s", descr, if_info->name); + g_free(descr); + } else { + /* No, we don't have a user-supplied description; did we get + one from the OS or libpcap? */ + if (if_info->description != NULL) { + /* Yes - use it. */ + if_string = g_strdup_printf("%s: %s", if_info->description, if_info->name); + } else { + /* No. */ + if_string = g_strdup(if_info->name); + } + } + if (if_info->loopback) { + row.display_name = g_strdup_printf("%s (loopback)", if_string); + } else { + row.display_name = g_strdup(if_string); + } + found = FALSE; + for (i = 0; i < global_capture_opts.ifaces->len; i++) { + interface_opts = g_array_index(global_capture_opts.ifaces, interface_options, i); + if (!interface_opts.name || strcmp(interface_opts.name, (char*)row.name)!=0) { + continue; + } else { + found = TRUE; + break; + } + } + if (found) { +#if defined(_WIN32) || defined(HAVE_PCAP_CREATE) + row.buffer = interface_opts.buffer_size; +#endif + row.pmode = interface_opts.promisc_mode; + row.has_snaplen = interface_opts.has_snaplen; + row.snaplen = interface_opts.snaplen; + row.cfilter = g_strdup(interface_opts.cfilter); + } else { +#if defined(_WIN32) || defined(HAVE_PCAP_CREATE) + row.buffer = global_capture_opts.default_options.buffer_size; +#endif + row.pmode = global_capture_opts.default_options.promisc_mode; + row.has_snaplen = global_capture_opts.default_options.has_snaplen; + row.snaplen = global_capture_opts.default_options.snaplen; + row.cfilter = g_strdup(global_capture_opts.default_options.cfilter); + } + cap_settings = capture_get_cap_settings(if_info->name); + caps = capture_get_if_capabilities(if_info->name, cap_settings.monitor_mode, NULL); + for (; (curr_addr = g_slist_nth(if_info->addrs, ips)) != NULL; ips++) { + if (ips != 0) { + g_string_append(ip_str, "\n"); + } + addr = (if_addr_t *)curr_addr->data; + switch (addr->ifat_type) { + case IF_AT_IPv4: + g_string_append(ip_str, ip_to_str((guint8 *)&addr->addr.ip4_addr)); + break; + case IF_AT_IPv6: + g_string_append(ip_str, ip6_to_str((struct e_in6_addr *)&addr->addr.ip6_addr)); + break; + default: + /* In case we add non-IP addresses */ + break; + } + } + linktype_count = 0; + row.links = NULL; + if (caps != NULL) { +#ifdef HAVE_PCAP_CREATE + row.monitor_mode_enabled = cap_settings.monitor_mode; + row.monitor_mode_supported = caps->can_set_rfmon; +#endif + for (lt_entry = caps->data_link_types; lt_entry != NULL; lt_entry = g_list_next(lt_entry)) { + data_link_info = lt_entry->data; + if (data_link_info->description != NULL) { + str = g_strdup_printf("%s", data_link_info->description); + } else { + str = g_strdup_printf("%s (not supported)", data_link_info->name); + } + if (linktype_count == 0) { + link_type_name = g_strdup(str); + row.active_dlt = data_link_info->dlt; + } + link = (link_row *)g_malloc(sizeof(link_row)); + link->dlt = data_link_info->dlt; + link->name = g_strdup(str); + row.links = g_list_append(row.links, link); + linktype_count++; + } + } else { + cap_settings.monitor_mode = FALSE; +#ifdef HAVE_PCAP_CREATE + row.monitor_mode_enabled = FALSE; + row.monitor_mode_supported = FALSE; +#endif + row.active_dlt = -1; + link_type_name = g_strdup("default"); + } + row.addresses = g_strdup(ip_str->str); + row.no_addresses = ips; + if (ips == 0) { + temp = g_strdup_printf("<b>%s</b>", row.display_name); + } else { + temp = g_strdup_printf("<b>%s</b>\n<span size='small'>%s</span>", row.display_name, row.addresses); + } + g_array_append_val(rows, row); + if (caps != NULL) { + free_if_capabilities(caps); + } + } + g_string_free(ip_str, TRUE); + } +} + +GtkTreeModel *create_and_fill_model(GtkTreeView *view) +{ + GtkListStore *store; + GtkTreeIter iter; + GList *list; + char *temp="", *snaplen_string; + guint i, j; + link_row *link = NULL; + interface_row row; + interface_options interface_opts; + gboolean found = FALSE; + #if defined(HAVE_PCAP_CREATE) store = gtk_list_store_new (8, G_TYPE_BOOLEAN, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_UINT, G_TYPE_STRING, G_TYPE_STRING); #elif defined(_WIN32) && !defined (HAVE_PCAP_CREATE) @@ -3530,6 +3716,9 @@ GtkTreeModel *create_and_fill_model(GList *if_list, gboolean do_hide, GtkTreeVie store = gtk_list_store_new (6, G_TYPE_BOOLEAN, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING); #endif + if (!rows || rows->len == 0) { + make_and_fill_rows(); + } if (rows && rows->len > 0) { for (i = 0; i < rows->len; i++) { row = g_array_index(rows, interface_row, i); @@ -3569,147 +3758,6 @@ GtkTreeModel *create_and_fill_model(GList *if_list, gboolean do_hide, GtkTreeVie gtk_list_store_set (store, &iter, CAPTURE, found, INTERFACE, temp, LINK, link->name, PMODE, row.pmode?"enabled":"disabled", SNAPLEN, snaplen_string, FILTER, row.cfilter, -1); #endif } - } else { - rows = g_array_new(TRUE, TRUE, sizeof(interface_row)); - /* Scan through the list and build a list of strings to display. */ - for (if_entry = if_list; if_entry != NULL; if_entry = g_list_next(if_entry)) { - if_info = if_entry->data; - ip_str = g_string_new(""); - str = ""; - ips = 0; - row.name = g_strdup(if_info->name); - /* Is this interface hidden and, if so, should we include it anyway? */ - if (!prefs_is_capture_device_hidden(if_info->name) || !do_hide) { - /* It's not hidden, or it is but we should include it in the list. */ - /* Do we have a user-supplied description? */ - descr = capture_dev_user_descr_find(if_info->name); - if (descr != NULL) { - /* Yes, we have a user-supplied description; use it. */ - if_string = g_strdup_printf("%s: %s", descr, if_info->name); - g_free(descr); - } else { - /* No, we don't have a user-supplied description; did we get - one from the OS or libpcap? */ - if (if_info->description != NULL) { - /* Yes - use it. */ - if_string = g_strdup_printf("%s: %s", if_info->description, if_info->name); - } else { - /* No. */ - if_string = g_strdup(if_info->name); - } - } - if (if_info->loopback) { - row.display_name = g_strdup_printf("%s (loopback)", if_string); - } else { - row.display_name = g_strdup(if_string); - } - found = FALSE; - for (i = 0; i < global_capture_opts.ifaces->len; i++) { - interface_opts = g_array_index(global_capture_opts.ifaces, interface_options, i); - if (!interface_opts.name || strcmp(interface_opts.name, (char*)row.name)!=0) { - continue; - } else { - found = TRUE; - num_selected++; - break; - } - } - if (found) { -#if defined(_WIN32) || defined(HAVE_PCAP_CREATE) - row.buffer = interface_opts.buffer_size; -#endif - row.pmode = interface_opts.promisc_mode; - row.has_snaplen = interface_opts.has_snaplen; - row.snaplen = interface_opts.snaplen; - row.cfilter = g_strdup(interface_opts.cfilter); - } else { -#if defined(_WIN32) || defined(HAVE_PCAP_CREATE) - row.buffer = global_capture_opts.default_options.buffer_size; -#endif - row.pmode = global_capture_opts.default_options.promisc_mode; - row.has_snaplen = global_capture_opts.default_options.has_snaplen; - row.snaplen = global_capture_opts.default_options.snaplen; - row.cfilter = g_strdup(global_capture_opts.default_options.cfilter); - } - cap_settings = capture_get_cap_settings(if_info->name); - gtk_list_store_append (store, &iter); - caps = capture_get_if_capabilities(if_info->name, cap_settings.monitor_mode, NULL); - for (; (curr_addr = g_slist_nth(if_info->addrs, ips)) != NULL; ips++) { - if (ips != 0) { - g_string_append(ip_str, "\n"); - } - addr = (if_addr_t *)curr_addr->data; - switch (addr->ifat_type) { - case IF_AT_IPv4: - g_string_append(ip_str, ip_to_str((guint8 *)&addr->addr.ip4_addr)); - break; - case IF_AT_IPv6: - g_string_append(ip_str, ip6_to_str((struct e_in6_addr *)&addr->addr.ip6_addr)); - break; - default: - /* In case we add non-IP addresses */ - break; - } - } - linktype_count = 0; - row.links = NULL; - if (caps != NULL) { -#ifdef HAVE_PCAP_CREATE - row.monitor_mode_enabled = cap_settings.monitor_mode; - row.monitor_mode_supported = caps->can_set_rfmon; -#endif - for (lt_entry = caps->data_link_types; lt_entry != NULL; lt_entry = g_list_next(lt_entry)) { - data_link_info = lt_entry->data; - if (data_link_info->description != NULL) { - str = g_strdup_printf("%s", data_link_info->description); - } else { - str = g_strdup_printf("%s (not supported)", data_link_info->name); - } - if (linktype_count == 0) { - link_type_name = g_strdup(str); - row.active_dlt = data_link_info->dlt; - } - link = (link_row *)g_malloc(sizeof(link_row)); - link->dlt = data_link_info->dlt; - link->name = g_strdup(str); - row.links = g_list_append(row.links, link); - linktype_count++; - } - } else { - cap_settings.monitor_mode = FALSE; -#ifdef HAVE_PCAP_CREATE - row.monitor_mode_enabled = FALSE; - row.monitor_mode_supported = FALSE; -#endif - row.active_dlt = -1; - link_type_name = g_strdup("default"); - } - row.addresses = g_strdup(ip_str->str); - row.no_addresses = ips; - if (ips == 0) { - temp = g_strdup_printf("<b>%s</b>", row.display_name); - } else { - temp = g_strdup_printf("<b>%s</b>\n<span size='small'>%s</span>", row.display_name, row.addresses); - } - g_array_append_val(rows, row); - if (row.has_snaplen) { - snaplen_string = g_strdup_printf("%d", row.snaplen); - } else { - snaplen_string = g_strdup("default"); - } -#if defined(HAVE_PCAP_CREATE) - gtk_list_store_set (store, &iter, CAPTURE, found, INTERFACE, temp, LINK, link_type_name, PMODE, row.pmode?"enabled":"disabled", SNAPLEN, snaplen_string, BUFFER, (guint) row.buffer, MONITOR, row.monitor_mode_supported?(row.monitor_mode_enabled?"enabled":"disabled"):"n/a", FILTER, row.cfilter, -1); -#elif defined(_WIN32) && !defined(HAVE_PCAP_CREATE) - gtk_list_store_set (store, &iter, CAPTURE, found, INTERFACE, temp, LINK, link_type_name, PMODE, row.pmode?"enabled":"disabled", SNAPLEN, snaplen_string, BUFFER, (guint) row.buffer, FILTER, row.cfilter, -1); -#else - gtk_list_store_set (store, &iter, CAPTURE, found, INTERFACE, temp, LINK, link_type_name, PMODE, row.pmode?"enabled":"disabled", SNAPLEN, snaplen_string, FILTER, row.cfilter, -1); -#endif - if (caps != NULL) { - free_if_capabilities(caps); - } - } - g_string_free(ip_str, TRUE); - } } gtk_tree_view_set_model(GTK_TREE_VIEW(view), GTK_TREE_MODEL(store)); return GTK_TREE_MODEL(store); diff --git a/gtk/capture_dlg.h b/gtk/capture_dlg.h index f127a87c51..2cb006486f 100644 --- a/gtk/capture_dlg.h +++ b/gtk/capture_dlg.h @@ -161,7 +161,7 @@ cap_settings_t capture_get_cap_settings (gchar *if_name); GtkTreeModel* -create_and_fill_model (GList *if_list, gboolean do_hide, GtkTreeView *view); +create_and_fill_model (GtkTreeView *view); gboolean query_tooltip_tree_view_cb (GtkWidget *widget, @@ -200,4 +200,7 @@ dlg_window_present(void); void enable_selected_interface(gchar *name, gboolean enable); +void +options_interface_cb(GtkTreeView *view, GtkTreePath *path, GtkTreeViewColumn *column _U_, gpointer userdata); + #endif /* capture_dlg.h */ diff --git a/gtk/main_welcome.c b/gtk/main_welcome.c index 6abc9253d9..c2bc30943b 100644 --- a/gtk/main_welcome.c +++ b/gtk/main_welcome.c @@ -1214,6 +1214,7 @@ welcome_new(void) if_view = gtk_tree_view_new (); g_object_set(G_OBJECT(if_view), "headers-visible", FALSE, NULL); + g_signal_connect(if_view, "row-activated", G_CALLBACK(options_interface_cb), (gpointer)welcome_hb); g_object_set_data(G_OBJECT(welcome_hb), TREE_VIEW_INTERFACES, if_view); renderer = gtk_cell_renderer_pixbuf_new(); column = gtk_tree_view_column_new_with_attributes ("", @@ -1428,3 +1429,8 @@ GtkWidget* get_welcome_window(void) return welcome_hb; } +displayed_interface get_interface_data(gint index) +{ + return g_array_index(interfaces, displayed_interface, index); +} + diff --git a/gtk/main_welcome.h b/gtk/main_welcome.h index 75f0d0fae1..566f7669e2 100644 --- a/gtk/main_welcome.h +++ b/gtk/main_welcome.h @@ -89,4 +89,6 @@ void change_selection_for_all(gboolean enable); void add_interface_to_list(gchar *name, gchar *descr, remote_options *remote_opts); #endif +displayed_interface get_interface_data(gint index); + #endif /* __MAIN_WELCOME_H__ */ |