2 * Copyright 2008 Stig Bjorlykke <stig@bjorlykke.org>
6 * Wireshark - Network traffic analyzer
7 * By Gerald Combs <gerald@wireshark.org>
8 * Copyright 1998 Gerald Combs
10 * This program is free software; you can redistribute it and/or
11 * modify it under the terms of the GNU General Public License
12 * as published by the Free Software Foundation; either version 2
13 * of the License, or (at your option) any later version.
15 * This program is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 * GNU General Public License for more details.
20 * You should have received a copy of the GNU General Public License
21 * along with this program; if not, write to the Free Software
22 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
32 #include <epan/packet.h>
33 #include <epan/addr_resolv.h>
35 #include <epan/dissectors/packet-ieee80211.h>
36 #include <epan/strutil.h>
38 #include "ui/recent.h"
39 #include "ui/simple_dialog.h"
40 #include "ui/utf8_entities.h"
42 #include "../stat_menu.h"
44 #include "ui/gtk/gtkglobals.h"
45 #include "ui/gtk/dlg_utils.h"
46 #include "ui/gtk/filter_utils.h"
47 #include "ui/gtk/gui_stat_menu.h"
48 #include "ui/gtk/gui_utils.h"
49 #include "ui/gtk/help_dlg.h"
50 #include "ui/gtk/main.h"
52 #include "ui/gtk/old-gtk-compat.h"
72 static const gchar
*titles
[] = { "BSSID", "Ch.", "SSID", "% Packets", "Beacons", "Data Packets",
73 "Probe Req", "Probe Resp", "Auth", "Deauth", "Other", "Protection" };
86 PERCENT_VALUE_2_COLUMN
,
91 static const gchar
*detail_titles
[] = { "Address", "% Packets", "Data Sent", "Data Received",
92 "Probe Req", "Probe Resp", "Auth", "Deauth", "Other", "Comment" };
94 typedef struct wlan_details_ep
{
95 struct wlan_details_ep
*next
;
102 guint32 data_received
;
104 guint32 number_of_packets
;
109 typedef struct wlan_ep
{
110 struct wlan_ep
*next
;
112 struct _wlan_stats stats
;
114 guint32 number_of_packets
;
117 gboolean probe_req_searched
;
118 gboolean is_broadcast
;
119 struct wlan_details_ep
*details
;
122 static GtkWidget
*wlanstat_dlg_w
= NULL
;
123 static GtkWidget
*wlanstat_pane
= NULL
;
124 static GtkWidget
*wlanstat_name_lb
= NULL
;
125 static address broadcast
;
127 /* used to keep track of the statistics for an entire program interface */
128 typedef struct _wlan_stat_t
{
130 GtkTreeView
*details
;
132 GtkWidget
*details_menu
;
133 guint32 number_of_packets
;
136 gboolean resolve_names
;
137 gboolean use_dfilter
;
138 gboolean show_only_existing
;
143 dealloc_wlan_details_ep (wlan_details_ep_t
*details
)
145 wlan_details_ep_t
*tmp
;
149 details
= details
->next
;
155 wlanstat_reset (void *phs
)
157 wlanstat_t
*wlan_stat
= (wlanstat_t
*)phs
;
158 wlan_ep_t
*list
= wlan_stat
->ep_list
;
161 GString
*error_string
;
163 const char *filter
= NULL
;
165 if (wlanstat_dlg_w
!= NULL
) {
166 display_name
= cf_get_display_name(&cfile
);
167 g_snprintf (title
, sizeof(title
), "Wireshark: WLAN Traffic Statistics: %s",
169 g_free(display_name
);
170 gtk_window_set_title(GTK_WINDOW(wlanstat_dlg_w
), title
);
173 if (wlan_stat
->use_dfilter
) {
174 filter
= gtk_entry_get_text(GTK_ENTRY(main_display_filter_widget
));
177 error_string
= set_tap_dfilter (wlan_stat
, filter
);
179 simple_dialog(ESD_TYPE_ERROR
, ESD_BTN_OK
, "%s", error_string
->str
);
180 g_string_free(error_string
, TRUE
);
184 if (wlan_stat
->use_dfilter
) {
185 if (filter
&& strlen(filter
)) {
186 g_snprintf(title
, sizeof(title
), "Network Overview - Filter: %s", filter
);
188 g_snprintf(title
, sizeof(title
), "Network Overview - No Filter");
191 g_snprintf(title
, sizeof(title
), "Network Overview");
193 gtk_frame_set_label(GTK_FRAME(wlanstat_name_lb
), title
);
195 /* remove all entries from the list */
196 store
= GTK_LIST_STORE(gtk_tree_view_get_model(wlan_stat
->table
));
197 gtk_list_store_clear(store
);
198 store
= GTK_LIST_STORE(gtk_tree_view_get_model(wlan_stat
->details
));
199 gtk_list_store_clear(store
);
207 dealloc_wlan_details_ep(tmp
->details
);
212 wlan_stat
->ep_list
= NULL
;
213 wlan_stat
->number_of_packets
= 0;
217 invalidate_detail_iters (wlanstat_t
*hs
)
219 wlan_ep_t
*ep
= hs
->ep_list
;
220 wlan_details_ep_t
*d_ep
;
225 d_ep
->iter_valid
= FALSE
;
233 alloc_wlan_ep (struct _wlan_hdr
*si
, packet_info
*pinfo _U_
)
240 ep
= (wlan_ep_t
*)g_malloc (sizeof(wlan_ep_t
));
242 SE_COPY_ADDRESS (&ep
->bssid
, &si
->bssid
);
243 ep
->stats
.channel
= si
->stats
.channel
;
244 memcpy (ep
->stats
.ssid
, si
->stats
.ssid
, MAX_SSID_LEN
);
245 ep
->stats
.ssid_len
= si
->stats
.ssid_len
;
246 g_strlcpy (ep
->stats
.protection
, si
->stats
.protection
, MAX_PROTECT_LEN
);
247 memset(&ep
->type
, 0, sizeof (int) * 256);
248 ep
->number_of_packets
= 0;
250 ep
->iter_valid
= FALSE
;
251 ep
->probe_req_searched
= FALSE
;
252 ep
->is_broadcast
= FALSE
;
258 static wlan_details_ep_t
*
259 alloc_wlan_details_ep (address
*addr
)
261 wlan_details_ep_t
*d_ep
;
266 if (!(d_ep
= (wlan_details_ep_t
*)g_malloc (sizeof(wlan_details_ep_t
))))
269 SE_COPY_ADDRESS (&d_ep
->addr
, addr
);
275 d_ep
->data_received
= 0;
277 d_ep
->number_of_packets
= 0;
278 d_ep
->iter_valid
= FALSE
;
284 static wlan_details_ep_t
*
285 get_details_ep (wlan_ep_t
*te
, address
*addr
)
287 wlan_details_ep_t
*tmp
, *d_te
= NULL
;
290 te
->details
= alloc_wlan_details_ep (addr
);
293 for (tmp
= te
->details
; tmp
; tmp
= tmp
->next
) {
294 if (!CMP_ADDRESS (&tmp
->addr
, addr
)) {
301 if ((d_te
= alloc_wlan_details_ep (addr
)) != NULL
) {
302 d_te
->next
= te
->details
;
308 g_assert(d_te
!= NULL
);
314 wlanstat_packet_details (wlan_ep_t
*te
, guint32 type
, address
*addr
, gboolean src
)
316 wlan_details_ep_t
*d_te
= get_details_ep (te
, addr
);
326 /* No counting for beacons */
345 d_te
->data_received
++;
354 /* Do not count beacons in details */
355 d_te
->number_of_packets
++;
360 is_broadcast(address
*addr
)
363 /* doesn't work if MAC resolution is disable */
364 return strcmp(get_addr_name(addr
), "Broadcast") == 0;
366 return ADDRESSES_EQUAL(&broadcast
, addr
);
370 ssid_equal(struct _wlan_stats
*st1
, struct _wlan_stats
*st2
)
372 return (st1
->ssid_len
== st2
->ssid_len
) && (memcmp(st1
->ssid
, st2
->ssid
, st1
->ssid_len
) == 0);
376 wlanstat_packet (void *phs
, packet_info
*pinfo
, epan_dissect_t
*edt _U_
, const void *phi
)
378 wlanstat_t
*hs
= (wlanstat_t
*)phs
;
379 wlan_ep_t
*tmp
, *te
= NULL
;
380 struct _wlan_hdr
*si
= (struct _wlan_hdr
*) phi
;
385 hs
->number_of_packets
++;
387 hs
->ep_list
= alloc_wlan_ep (si
, pinfo
);
389 te
->is_broadcast
= is_broadcast(&si
->bssid
);
391 for (tmp
= hs
->ep_list
; tmp
; tmp
= tmp
->next
) {
392 if ((((si
->type
== 0x04) && (
393 ((tmp
->stats
.ssid_len
== 0) && (si
->stats
.ssid_len
== 0) && tmp
->is_broadcast
)
394 || ((si
->stats
.ssid_len
!= 0) && (ssid_equal(&tmp
->stats
, &si
->stats
)))
397 ((si
->type
!= 0x04) && !CMP_ADDRESS(&tmp
->bssid
, &si
->bssid
))) {
404 te
= alloc_wlan_ep (si
, pinfo
);
405 te
->is_broadcast
= is_broadcast(&si
->bssid
);
406 te
->next
= hs
->ep_list
;
410 if (!te
->probe_req_searched
&& (si
->type
!= 0x04) && (te
->type
[0x04] == 0) &&
411 (si
->stats
.ssid_len
> 1 || si
->stats
.ssid
[0] != 0)) {
413 * We have found a matching entry without Probe Requests.
414 * Search the rest of the entries for a corresponding entry
415 * matching the SSID and BSSID == Broadcast.
417 * This is because we can have a hidden SSID or Probe Request
418 * before we have a Beacon, Association Request, etc.
420 wlan_ep_t
*prev
= NULL
;
421 GtkListStore
*store
= GTK_LIST_STORE(gtk_tree_view_get_model(hs
->table
));
422 te
->probe_req_searched
= TRUE
;
423 for (tmp
= hs
->ep_list
; tmp
; tmp
= tmp
->next
) {
424 if (tmp
!= te
&& tmp
->is_broadcast
&& ssid_equal (&si
->stats
, &tmp
->stats
)) {
426 * Found a matching entry. Merge with the previous
427 * found entry and remove from list.
429 te
->type
[0x04] += tmp
->type
[0x04];
430 te
->number_of_packets
+= tmp
->number_of_packets
;
432 if (tmp
->details
&& tmp
->details
->next
) {
433 /* Adjust received probe requests */
434 wlan_details_ep_t
*d_te
;
435 d_te
= get_details_ep (te
, &tmp
->details
->addr
);
436 d_te
->probe_req
+= tmp
->type
[0x04];
437 d_te
->number_of_packets
+= tmp
->type
[0x04];
438 d_te
= get_details_ep (te
, &tmp
->details
->next
->addr
);
439 d_te
->probe_req
+= tmp
->type
[0x04];
440 d_te
->number_of_packets
+= tmp
->type
[0x04];
443 prev
->next
= tmp
->next
;
445 hs
->ep_list
= tmp
->next
;
447 dealloc_wlan_details_ep (tmp
->details
);
448 if (tmp
->iter_valid
) {
449 gtk_list_store_remove(store
, &tmp
->iter
);
459 if (te
->stats
.channel
== 0 && si
->stats
.channel
!= 0) {
460 te
->stats
.channel
= si
->stats
.channel
;
462 if (te
->stats
.ssid
[0] == 0 && si
->stats
.ssid_len
!= 0) {
463 memcpy (te
->stats
.ssid
, si
->stats
.ssid
, MAX_SSID_LEN
);
464 te
->stats
.ssid_len
= si
->stats
.ssid_len
;
466 if (te
->stats
.protection
[0] == 0 && si
->stats
.protection
[0] != 0) {
467 g_strlcpy (te
->stats
.protection
, si
->stats
.protection
, MAX_PROTECT_LEN
);
469 te
->type
[si
->type
]++;
470 te
->number_of_packets
++;
472 wlanstat_packet_details (te
, si
->type
, &si
->src
, TRUE
); /* Register source */
473 wlanstat_packet_details (te
, si
->type
, &si
->dst
, FALSE
); /* Register destination */
479 wlanstat_draw_details(wlanstat_t
*hs
, wlan_ep_t
*wlan_ep
, gboolean clear
)
481 wlan_details_ep_t
*tmp
;
482 char addr
[256], comment
[256], percent
[256];
483 gboolean broadcast_flag
, basestation_flag
;
487 store
= GTK_LIST_STORE(gtk_tree_view_get_model(hs
->details
));
489 gtk_list_store_clear(store
);
490 invalidate_detail_iters(hs
);
494 for (tmp
= wlan_ep
->details
; tmp
; tmp
=tmp
->next
) {
495 broadcast_flag
= is_broadcast(&tmp
->addr
);
496 basestation_flag
= !broadcast_flag
&& !CMP_ADDRESS(&tmp
->addr
, &wlan_ep
->bssid
);
498 if ((wlan_ep
->number_of_packets
- wlan_ep
->type
[0x08]) > 0) {
499 f
= (float)(((float)tmp
->number_of_packets
* 100.0) / (wlan_ep
->number_of_packets
- wlan_ep
->type
[0x08]));
504 if (hs
->resolve_names
) {
505 g_strlcpy (addr
, get_addr_name(&tmp
->addr
), sizeof(addr
));
507 g_strlcpy (addr
, ep_address_to_str(&tmp
->addr
), sizeof(addr
));
509 if (basestation_flag
) {
510 g_strlcpy (comment
, "Base station", sizeof(comment
));
512 g_strlcpy (comment
, " ", sizeof(comment
));
514 g_snprintf (percent
, sizeof(percent
), "%.2f %%", f
);
516 if (!tmp
->iter_valid
) {
517 gtk_list_store_append(store
, &tmp
->iter
);
518 tmp
->iter_valid
= TRUE
;
520 gtk_list_store_set(store
, &tmp
->iter
,
521 ADDRESS_COLUMN
, addr
,
522 PERCENT_2_COLUMN
, percent
,
523 DATA_SENT_COLUMN
, tmp
->data_sent
,
524 DATA_REC_COLUMN
, tmp
->data_received
,
525 PROBE_REQ_2_COLUMN
, tmp
->probe_req
,
526 PROBE_RESP_2_COLUMN
, tmp
->probe_rsp
,
527 AUTH_2_COLUMN
, tmp
->auth
,
528 DEAUTH_2_COLUMN
, tmp
->deauth
,
529 OTHER_2_COLUMN
, tmp
->other
,
530 COMMENT_COLUMN
, comment
,
531 PERCENT_VALUE_2_COLUMN
, f
,
540 wlanstat_draw(void *phs
)
542 wlanstat_t
*hs
= (wlanstat_t
*)phs
;
543 wlan_ep_t
*list
= hs
->ep_list
, *tmp
;
544 guint32 data
= 0, other
= 0;
545 char bssid
[256], channel
[256], ssid
[256], percent
[256];
548 GtkTreeSelection
*sel
;
552 store
= GTK_LIST_STORE(gtk_tree_view_get_model(hs
->table
));
555 for (tmp
= list
; tmp
; tmp
=tmp
->next
) {
557 if (hs
->show_only_existing
&& tmp
->is_broadcast
) {
558 if (tmp
->iter_valid
) {
559 gtk_list_store_remove(store
, &tmp
->iter
);
560 tmp
->iter_valid
= FALSE
;
565 data
= tmp
->type
[0x20] + tmp
->type
[0x21] + tmp
->type
[0x22] + tmp
->type
[0x23] +
566 tmp
->type
[0x28] + tmp
->type
[0x29] + tmp
->type
[0x2A] + tmp
->type
[0x2B];
567 other
= tmp
->number_of_packets
- data
- tmp
->type
[0x08] - tmp
->type
[0x04] -
568 tmp
->type
[0x05] - tmp
->type
[0x0B] - tmp
->type
[0x0C];
569 f
= (float)(((float)tmp
->number_of_packets
* 100.0) / hs
->number_of_packets
);
571 if (hs
->resolve_names
) {
572 g_strlcpy (bssid
, get_addr_name(&tmp
->bssid
), sizeof(bssid
));
574 g_strlcpy (bssid
, ep_address_to_str(&tmp
->bssid
), sizeof(bssid
));
576 if (tmp
->stats
.channel
) {
577 g_snprintf (channel
, sizeof(channel
), "%u", tmp
->stats
.channel
);
581 if (tmp
->stats
.ssid_len
== 0) {
582 g_strlcpy (ssid
, "<Broadcast>", sizeof(ssid
));
583 } else if (tmp
->stats
.ssid_len
== 1 && tmp
->stats
.ssid
[0] == 0) {
584 g_strlcpy (ssid
, "<Hidden>", sizeof(ssid
));
586 g_strlcpy (ssid
, format_text(tmp
->stats
.ssid
, tmp
->stats
.ssid_len
), sizeof(ssid
));
588 g_snprintf (percent
, sizeof(percent
), "%.2f %%", f
);
590 if (!tmp
->iter_valid
) {
591 gtk_list_store_append(store
, &tmp
->iter
);
592 tmp
->iter_valid
= TRUE
;
594 gtk_list_store_set (store
, &tmp
->iter
,
596 CHANNEL_COLUMN
, channel
,
598 PERCENT_COLUMN
, percent
,
599 BEACONS_COLUMN
, tmp
->type
[0x08],
601 PROBE_REQ_COLUMN
, tmp
->type
[0x04],
602 PROBE_RESP_COLUMN
, tmp
->type
[0x05],
603 AUTH_COLUMN
, tmp
->type
[0x0B],
604 DEAUTH_COLUMN
, tmp
->type
[0x0C],
606 PROTECTION_COLUMN
, tmp
->stats
.protection
,
607 PERCENT_VALUE_COLUMN
, f
,
614 sel
= gtk_tree_view_get_selection (GTK_TREE_VIEW(hs
->table
));
615 if (gtk_tree_selection_get_selected (sel
, &model
, &iter
)) {
618 gtk_tree_model_get (model
, &iter
, TABLE_COLUMN
, &ep
, -1);
619 wlanstat_draw_details (hs
, ep
, FALSE
);
623 /* What to do when a list item is selected/unselected */
625 wlan_select_cb(GtkTreeSelection
*sel
, gpointer data
)
627 wlanstat_t
*hs
= (wlanstat_t
*)data
;
632 if (gtk_tree_selection_get_selected (sel
, &model
, &iter
)) {
633 gtk_tree_model_get (model
, &iter
, TABLE_COLUMN
, &ep
, -1);
634 wlanstat_draw_details (hs
, ep
, TRUE
);
640 wlan_resolve_toggle_dest(GtkWidget
*widget
, gpointer data
)
642 wlanstat_t
*hs
= (wlanstat_t
*)data
;
644 hs
->resolve_names
= gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON (widget
));
650 wlan_filter_toggle_dest(GtkWidget
*widget
, gpointer data
)
652 wlanstat_t
*hs
= (wlanstat_t
*)data
;
654 hs
->use_dfilter
= gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON (widget
));
656 cf_retap_packets(&cfile
);
657 gdk_window_raise(gtk_widget_get_window(wlanstat_dlg_w
));
661 wlan_existing_toggle_dest(GtkWidget
*widget
, gpointer data
)
663 wlanstat_t
*hs
= (wlanstat_t
*)data
;
665 hs
->show_only_existing
= gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON (widget
));
671 csv_handle(GtkTreeModel
*model
, GtkTreePath
*path _U_
, GtkTreeIter
*iter
,
674 GString
*CSV_str
= (GString
*)data
;
679 for (i
=0; i
<=PROTECTION_COLUMN
; i
++) {
680 if (i
== BSSID_COLUMN
|| i
== CHANNEL_COLUMN
|| i
== SSID_COLUMN
||
681 i
== PERCENT_COLUMN
|| i
== PROTECTION_COLUMN
) {
682 gtk_tree_model_get(model
, iter
, i
, &table_text
, -1);
683 g_string_append_printf(CSV_str
, "\"%s\"", table_text
);
686 gtk_tree_model_get(model
, iter
, i
, &table_value
, -1);
687 g_string_append_printf(CSV_str
, "\"%u\"", table_value
);
689 if (i
!= PROTECTION_COLUMN
)
690 g_string_append(CSV_str
,",");
692 g_string_append(CSV_str
,"\n");
698 wlan_copy_as_csv(GtkWindow
*win _U_
, gpointer data
)
701 GString
*CSV_str
= g_string_new("");
703 GtkTreeView
*tree_view
= GTK_TREE_VIEW(data
);
706 /* Add the column headers to the CSV data */
707 for (i
=0; i
<=PROTECTION_COLUMN
; i
++) {
708 g_string_append_printf(CSV_str
, "\"%s\"", titles
[i
]);
709 if (i
!= PROTECTION_COLUMN
)
710 g_string_append(CSV_str
, ",");
712 g_string_append(CSV_str
,"\n");
714 /* Add the column values to the CSV data */
715 store
= GTK_LIST_STORE(gtk_tree_view_get_model(tree_view
));
716 gtk_tree_model_foreach(GTK_TREE_MODEL(store
), csv_handle
, CSV_str
);
718 /* Now that we have the CSV data, copy it into the default clipboard */
719 cb
= gtk_clipboard_get(GDK_SELECTION_CLIPBOARD
);
720 gtk_clipboard_set_text(cb
, CSV_str
->str
, -1);
721 g_string_free(CSV_str
, TRUE
);
725 win_destroy_cb (GtkWindow
*win _U_
, gpointer data
)
727 wlanstat_t
*hs
= (wlanstat_t
*)data
;
729 remove_tap_listener (hs
);
731 if (wlanstat_dlg_w
!= NULL
) {
732 window_destroy(wlanstat_dlg_w
);
733 wlanstat_dlg_w
= NULL
;
738 recent
.gui_geometry_wlan_stats_pane
=
739 gtk_paned_get_position(GTK_PANED(wlanstat_pane
));
743 #define VALUE_BSSID_ONLY 0
744 #define VALUE_SSID_ONLY 1
745 #define VALUE_BSSID_AND_SSID 2
746 #define VALUE_BSSID_OR_SSID 3
749 wlan_select_filter_cb(GtkWidget
*widget _U_
, gpointer callback_data
, guint callback_action
)
752 wlanstat_t
*hs
= (wlanstat_t
*)callback_data
;
755 GtkTreeSelection
*sel
;
759 sel
= gtk_tree_view_get_selection (GTK_TREE_VIEW(hs
->table
));
760 gtk_tree_selection_get_selected (sel
, &model
, &iter
);
761 gtk_tree_model_get (model
, &iter
, TABLE_COLUMN
, &ep
, -1);
763 value
= FILTER_EXTRA(callback_action
);
766 case VALUE_BSSID_ONLY
:
767 str
= g_strdup_printf("wlan.bssid==%s", ep_address_to_str(&ep
->bssid
));
769 case VALUE_SSID_ONLY
:
770 str
= g_strdup_printf("wlan_mgt.ssid==\"%s\"", format_text(ep
->stats
.ssid
, ep
->stats
.ssid_len
));
772 case VALUE_BSSID_AND_SSID
:
773 str
= g_strdup_printf("wlan.bssid==%s && wlan_mgt.ssid==\"%s\"",
774 ep_address_to_str(&ep
->bssid
), format_text(ep
->stats
.ssid
, ep
->stats
.ssid_len
));
776 case VALUE_BSSID_OR_SSID
:
777 str
= g_strdup_printf("wlan.bssid==%s || wlan_mgt.ssid==\"%s\"",
778 ep_address_to_str(&ep
->bssid
), format_text(ep
->stats
.ssid
, ep
->stats
.ssid_len
));
781 g_assert_not_reached();
784 apply_selected_filter (callback_action
, str
);
790 wlan_details_select_filter_cb(GtkWidget
*widget _U_
, gpointer callback_data
, guint callback_action
)
792 wlanstat_t
*hs
= (wlanstat_t
*)callback_data
;
794 wlan_details_ep_t
*ep
;
795 GtkTreeSelection
*sel
;
799 sel
= gtk_tree_view_get_selection (GTK_TREE_VIEW(hs
->details
));
800 gtk_tree_selection_get_selected (sel
, &model
, &iter
);
801 gtk_tree_model_get (model
, &iter
, DETAILS_COLUMN
, &ep
, -1);
803 str
= g_strdup_printf("wlan.addr==%s", ep_address_to_str(&ep
->addr
));
805 apply_selected_filter (callback_action
, str
);
811 wlan_show_popup_menu_cb(void *widg _U_
, GdkEvent
*event
, wlanstat_t
*et
)
813 GdkEventButton
*bevent
= (GdkEventButton
*)event
;
814 GtkTreeSelection
*sel
;
818 /* To qoute the "Gdk Event Structures" doc:
819 * "Normally button 1 is the left mouse button, 2 is the middle button, and 3 is the right button" */
820 if ((event
->type
== GDK_BUTTON_PRESS
) && (bevent
->button
== 3)) {
821 /* If this is a right click on one of our columns, popup the context menu */
822 sel
= gtk_tree_view_get_selection (GTK_TREE_VIEW(et
->table
));
823 if (gtk_tree_selection_get_selected (sel
, &model
, &iter
)) {
824 gtk_menu_popup(GTK_MENU(et
->menu
), NULL
, NULL
, NULL
, NULL
,
825 bevent
->button
, bevent
->time
);
832 /* Apply as Filter/Selected */
834 wlan_select_filter_as_selected_BSSID_cb(GtkWidget
*widget
, gpointer user_data
)
836 wlan_select_filter_cb( widget
, user_data
, CALLBACK_MATCH(ACTYPE_SELECTED
, VALUE_BSSID_ONLY
));
840 wlan_select_filter_as_selected_SSID_cb(GtkWidget
*widget
, gpointer user_data
)
842 wlan_select_filter_cb( widget
, user_data
, CALLBACK_MATCH(ACTYPE_SELECTED
, VALUE_SSID_ONLY
));
846 wlan_select_filter_as_selected_BSSID_and_SSID_cb(GtkWidget
*widget
, gpointer user_data
)
848 wlan_select_filter_cb( widget
, user_data
, CALLBACK_MATCH(ACTYPE_SELECTED
, VALUE_BSSID_AND_SSID
));
852 wlan_select_filter_as_selected_BSSID_or_SSID_cb(GtkWidget
*widget
, gpointer user_data
)
854 wlan_select_filter_cb( widget
, user_data
, CALLBACK_MATCH(ACTYPE_SELECTED
, VALUE_BSSID_OR_SSID
));
857 /* Apply as Filter/Not Selected */
859 wlan_select_filter_as_not_selected_BSSID_cb(GtkWidget
*widget
, gpointer user_data
)
861 wlan_select_filter_cb( widget
, user_data
, CALLBACK_MATCH(ACTYPE_NOT_SELECTED
, VALUE_BSSID_ONLY
));
865 wlan_select_filter_as_not_selected_SSID_cb(GtkWidget
*widget
, gpointer user_data
)
867 wlan_select_filter_cb( widget
, user_data
, CALLBACK_MATCH(ACTYPE_NOT_SELECTED
, VALUE_SSID_ONLY
));
871 wlan_select_filter_as_not_selected_BSSID_and_SSID_cb(GtkWidget
*widget
, gpointer user_data
)
873 wlan_select_filter_cb( widget
, user_data
, CALLBACK_MATCH(ACTYPE_NOT_SELECTED
, VALUE_BSSID_AND_SSID
));
877 wlan_select_filter_as_not_selected_BSSID_or_SSID_cb(GtkWidget
*widget
, gpointer user_data
)
879 wlan_select_filter_cb( widget
, user_data
, CALLBACK_MATCH(ACTYPE_NOT_SELECTED
, VALUE_BSSID_OR_SSID
));
882 /* /Apply as Filter/... and Selected */
884 wlan_select_filter_and_selected_BSSID_cb(GtkWidget
*widget
, gpointer user_data
)
886 wlan_select_filter_cb( widget
, user_data
, CALLBACK_MATCH(ACTYPE_AND_SELECTED
, VALUE_BSSID_ONLY
));
890 wlan_select_filter_and_selected_SSID_cb(GtkWidget
*widget
, gpointer user_data
)
892 wlan_select_filter_cb( widget
, user_data
, CALLBACK_MATCH(ACTYPE_AND_SELECTED
, VALUE_SSID_ONLY
));
896 wlan_select_filter_and_selected_BSSID_and_SSID_cb(GtkWidget
*widget
, gpointer user_data
)
898 wlan_select_filter_cb( widget
, user_data
, CALLBACK_MATCH(ACTYPE_AND_SELECTED
, VALUE_BSSID_AND_SSID
));
902 wlan_select_filter_and_selected_BSSID_or_SSID_cb(GtkWidget
*widget
, gpointer user_data
)
904 wlan_select_filter_cb( widget
, user_data
, CALLBACK_MATCH(ACTYPE_AND_SELECTED
, VALUE_BSSID_OR_SSID
));
907 /* /Apply as Filter/... or Selected */
909 wlan_select_filter_or_selected_BSSID_cb(GtkWidget
*widget
, gpointer user_data
)
911 wlan_select_filter_cb( widget
, user_data
, CALLBACK_MATCH(ACTYPE_OR_SELECTED
, VALUE_BSSID_ONLY
));
915 wlan_select_filter_or_selected_SSID_cb(GtkWidget
*widget
, gpointer user_data
)
917 wlan_select_filter_cb( widget
, user_data
, CALLBACK_MATCH(ACTYPE_OR_SELECTED
, VALUE_SSID_ONLY
));
921 wlan_select_filter_or_selected_BSSID_and_SSID_cb(GtkWidget
*widget
, gpointer user_data
)
923 wlan_select_filter_cb( widget
, user_data
, CALLBACK_MATCH(ACTYPE_OR_SELECTED
, VALUE_BSSID_AND_SSID
));
927 wlan_select_filter_or_selected_BSSID_or_SSID_cb(GtkWidget
*widget
, gpointer user_data
)
929 wlan_select_filter_cb( widget
, user_data
, CALLBACK_MATCH(ACTYPE_OR_SELECTED
, VALUE_BSSID_OR_SSID
));
932 /* /Apply as Filter/... and not Selected */
934 wlan_select_filter_and_not_selected_BSSID_cb(GtkWidget
*widget
, gpointer user_data
)
936 wlan_select_filter_cb( widget
, user_data
, CALLBACK_MATCH(ACTYPE_AND_NOT_SELECTED
, VALUE_BSSID_ONLY
));
940 wlan_select_filter_and_not_selected_SSID_cb(GtkWidget
*widget
, gpointer user_data
)
942 wlan_select_filter_cb( widget
, user_data
, CALLBACK_MATCH(ACTYPE_AND_NOT_SELECTED
, VALUE_SSID_ONLY
));
946 wlan_select_filter_and_not_selected_BSSID_and_SSID_cb(GtkWidget
*widget
, gpointer user_data
)
948 wlan_select_filter_cb( widget
, user_data
, CALLBACK_MATCH(ACTYPE_AND_NOT_SELECTED
, VALUE_BSSID_AND_SSID
));
952 wlan_select_filter_and_not_selected_BSSID_or_SSID_cb(GtkWidget
*widget
, gpointer user_data
)
954 wlan_select_filter_cb( widget
, user_data
, CALLBACK_MATCH(ACTYPE_AND_NOT_SELECTED
, VALUE_BSSID_OR_SSID
));
957 /* /Apply as Filter/... or not Selected */
959 wlan_select_filter_or_not_selected_BSSID_cb(GtkWidget
*widget
, gpointer user_data
)
961 wlan_select_filter_cb( widget
, user_data
, CALLBACK_MATCH(ACTYPE_OR_NOT_SELECTED
, VALUE_BSSID_ONLY
));
965 wlan_select_filter_or_not_selected_SSID_cb(GtkWidget
*widget
, gpointer user_data
)
967 wlan_select_filter_cb( widget
, user_data
, CALLBACK_MATCH(ACTYPE_OR_NOT_SELECTED
, VALUE_SSID_ONLY
));
971 wlan_select_filter_or_not_selected_BSSID_and_SSID_cb(GtkWidget
*widget
, gpointer user_data
)
973 wlan_select_filter_cb( widget
, user_data
, CALLBACK_MATCH(ACTYPE_OR_NOT_SELECTED
, VALUE_BSSID_AND_SSID
));
977 wlan_select_filter_or_not_selected_BSSID_or_SSID_cb(GtkWidget
*widget
, gpointer user_data
)
979 wlan_select_filter_cb( widget
, user_data
, CALLBACK_MATCH(ACTYPE_OR_NOT_SELECTED
, VALUE_BSSID_OR_SSID
));
983 /* Prepare a Filter/Selected */
985 wlan_prepare_filter_as_selected_BSSID_cb(GtkWidget
*widget
, gpointer user_data
)
987 wlan_select_filter_cb( widget
, user_data
, CALLBACK_PREPARE(ACTYPE_SELECTED
, VALUE_BSSID_ONLY
));
991 wlan_prepare_filter_as_selected_SSID_cb(GtkWidget
*widget
, gpointer user_data
)
993 wlan_select_filter_cb( widget
, user_data
, CALLBACK_PREPARE(ACTYPE_SELECTED
, VALUE_SSID_ONLY
));
997 wlan_prepare_filter_as_selected_BSSID_and_SSID_cb(GtkWidget
*widget
, gpointer user_data
)
999 wlan_select_filter_cb( widget
, user_data
, CALLBACK_PREPARE(ACTYPE_SELECTED
, VALUE_BSSID_AND_SSID
));
1003 wlan_prepare_filter_as_selected_BSSID_or_SSID_cb(GtkWidget
*widget
, gpointer user_data
)
1005 wlan_select_filter_cb( widget
, user_data
, CALLBACK_PREPARE(ACTYPE_SELECTED
, VALUE_BSSID_OR_SSID
));
1008 /* Prepare a Filter/Not Selected */
1010 wlan_prepare_filter_as_not_selected_BSSID_cb(GtkWidget
*widget
, gpointer user_data
)
1012 wlan_select_filter_cb( widget
, user_data
, CALLBACK_PREPARE(ACTYPE_NOT_SELECTED
, VALUE_BSSID_ONLY
));
1016 wlan_prepare_filter_as_not_selected_SSID_cb(GtkWidget
*widget
, gpointer user_data
)
1018 wlan_select_filter_cb( widget
, user_data
, CALLBACK_PREPARE(ACTYPE_NOT_SELECTED
, VALUE_SSID_ONLY
));
1022 wlan_prepare_filter_as_not_selected_BSSID_and_SSID_cb(GtkWidget
*widget
, gpointer user_data
)
1024 wlan_select_filter_cb( widget
, user_data
, CALLBACK_PREPARE(ACTYPE_NOT_SELECTED
, VALUE_BSSID_AND_SSID
));
1028 wlan_prepare_filter_as_not_selected_BSSID_or_SSID_cb(GtkWidget
*widget
, gpointer user_data
)
1030 wlan_select_filter_cb( widget
, user_data
, CALLBACK_PREPARE(ACTYPE_NOT_SELECTED
, VALUE_BSSID_OR_SSID
));
1033 /* /Prepare a Filter/... and Selected */
1035 wlan_prepare_filter_and_selected_BSSID_cb(GtkWidget
*widget
, gpointer user_data
)
1037 wlan_select_filter_cb( widget
, user_data
, CALLBACK_PREPARE(ACTYPE_AND_SELECTED
, VALUE_BSSID_ONLY
));
1041 wlan_prepare_filter_and_selected_SSID_cb(GtkWidget
*widget
, gpointer user_data
)
1043 wlan_select_filter_cb( widget
, user_data
, CALLBACK_PREPARE(ACTYPE_AND_SELECTED
, VALUE_SSID_ONLY
));
1047 wlan_prepare_filter_and_selected_BSSID_and_SSID_cb(GtkWidget
*widget
, gpointer user_data
)
1049 wlan_select_filter_cb( widget
, user_data
, CALLBACK_PREPARE(ACTYPE_AND_SELECTED
, VALUE_BSSID_AND_SSID
));
1053 wlan_prepare_filter_and_selected_BSSID_or_SSID_cb(GtkWidget
*widget
, gpointer user_data
)
1055 wlan_select_filter_cb( widget
, user_data
, CALLBACK_PREPARE(ACTYPE_AND_SELECTED
, VALUE_BSSID_OR_SSID
));
1058 /* /Prepare a Filter/... or Selected */
1060 wlan_prepare_filter_or_selected_BSSID_cb(GtkWidget
*widget
, gpointer user_data
)
1062 wlan_select_filter_cb( widget
, user_data
, CALLBACK_PREPARE(ACTYPE_OR_SELECTED
, VALUE_BSSID_ONLY
));
1066 wlan_prepare_filter_or_selected_SSID_cb(GtkWidget
*widget
, gpointer user_data
)
1068 wlan_select_filter_cb( widget
, user_data
, CALLBACK_PREPARE(ACTYPE_OR_SELECTED
, VALUE_SSID_ONLY
));
1072 wlan_prepare_filter_or_selected_BSSID_and_SSID_cb(GtkWidget
*widget
, gpointer user_data
)
1074 wlan_select_filter_cb( widget
, user_data
, CALLBACK_PREPARE(ACTYPE_OR_SELECTED
, VALUE_BSSID_AND_SSID
));
1078 wlan_prepare_filter_or_selected_BSSID_or_SSID_cb(GtkWidget
*widget
, gpointer user_data
)
1080 wlan_select_filter_cb( widget
, user_data
, CALLBACK_PREPARE(ACTYPE_OR_SELECTED
, VALUE_BSSID_OR_SSID
));
1083 /* /Prepare a Filter/... and not Selected */
1085 wlan_prepare_filter_and_not_selected_BSSID_cb(GtkWidget
*widget
, gpointer user_data
)
1087 wlan_select_filter_cb( widget
, user_data
, CALLBACK_PREPARE(ACTYPE_AND_NOT_SELECTED
, VALUE_BSSID_ONLY
));
1091 wlan_prepare_filter_and_not_selected_SSID_cb(GtkWidget
*widget
, gpointer user_data
)
1093 wlan_select_filter_cb( widget
, user_data
, CALLBACK_PREPARE(ACTYPE_AND_NOT_SELECTED
, VALUE_SSID_ONLY
));
1097 wlan_prepare_filter_and_not_selected_BSSID_and_SSID_cb(GtkWidget
*widget
, gpointer user_data
)
1099 wlan_select_filter_cb( widget
, user_data
, CALLBACK_PREPARE(ACTYPE_AND_NOT_SELECTED
, VALUE_BSSID_AND_SSID
));
1103 wlan_prepare_filter_and_not_selected_BSSID_or_SSID_cb(GtkWidget
*widget
, gpointer user_data
)
1105 wlan_select_filter_cb( widget
, user_data
, CALLBACK_PREPARE(ACTYPE_AND_NOT_SELECTED
, VALUE_BSSID_OR_SSID
));
1108 /* /Prepare a Filter/... or not Selected */
1110 wlan_prepare_filter_or_not_selected_BSSID_cb(GtkWidget
*widget
, gpointer user_data
)
1112 wlan_select_filter_cb( widget
, user_data
, CALLBACK_PREPARE(ACTYPE_OR_NOT_SELECTED
, VALUE_BSSID_ONLY
));
1116 wlan_prepare_filter_or_not_selected_SSID_cb(GtkWidget
*widget
, gpointer user_data
)
1118 wlan_select_filter_cb( widget
, user_data
, CALLBACK_PREPARE(ACTYPE_OR_NOT_SELECTED
, VALUE_SSID_ONLY
));
1122 wlan_prepare_filter_or_not_selected_BSSID_and_SSID_cb(GtkWidget
*widget
, gpointer user_data
)
1124 wlan_select_filter_cb( widget
, user_data
, CALLBACK_PREPARE(ACTYPE_OR_NOT_SELECTED
, VALUE_BSSID_AND_SSID
));
1127 wlan_prepare_filter_or_not_selected_BSSID_or_SSID_cb(GtkWidget
*widget
, gpointer user_data
)
1129 wlan_select_filter_cb( widget
, user_data
, CALLBACK_PREPARE(ACTYPE_OR_NOT_SELECTED
, VALUE_BSSID_OR_SSID
));
1132 /* /Find frame/Find Frame/ */
1134 wlan_find_frame_BSSID_cb(GtkWidget
*widget
, gpointer user_data
)
1136 wlan_select_filter_cb( widget
, user_data
, CALLBACK_FIND_FRAME(ACTYPE_SELECTED
, VALUE_BSSID_ONLY
));
1139 wlan_find_frame_SSID_cb(GtkWidget
*widget
, gpointer user_data
)
1141 wlan_select_filter_cb( widget
, user_data
, CALLBACK_FIND_FRAME(ACTYPE_SELECTED
, VALUE_SSID_ONLY
));
1144 wlan_find_frame_BSSID_and_SSID_cb(GtkWidget
*widget
, gpointer user_data
)
1146 wlan_select_filter_cb( widget
, user_data
, CALLBACK_FIND_FRAME(ACTYPE_SELECTED
, VALUE_BSSID_AND_SSID
));
1149 wlan_find_frame_BSSID_or_SSID_cb(GtkWidget
*widget
, gpointer user_data
)
1151 wlan_select_filter_cb( widget
, user_data
, CALLBACK_FIND_FRAME(ACTYPE_SELECTED
, VALUE_BSSID_OR_SSID
));
1154 /* /Find frame/Find Next/ */
1156 wlan_find_frame_next_BSSID_cb(GtkWidget
*widget
, gpointer user_data
)
1158 wlan_select_filter_cb( widget
, user_data
, CALLBACK_FIND_NEXT(ACTYPE_SELECTED
, VALUE_BSSID_ONLY
));
1161 wlan_find_frame_next_SSID_cb(GtkWidget
*widget
, gpointer user_data
)
1163 wlan_select_filter_cb( widget
, user_data
, CALLBACK_FIND_NEXT(ACTYPE_SELECTED
, VALUE_SSID_ONLY
));
1166 wlan_find_frame_next_BSSID_and_SSID_cb(GtkWidget
*widget
, gpointer user_data
)
1168 wlan_select_filter_cb( widget
, user_data
, CALLBACK_FIND_NEXT(ACTYPE_SELECTED
, VALUE_BSSID_AND_SSID
));
1171 wlan_find_frame_next_BSSID_or_SSID_cb(GtkWidget
*widget
, gpointer user_data
)
1173 wlan_select_filter_cb( widget
, user_data
, CALLBACK_FIND_NEXT(ACTYPE_SELECTED
, VALUE_BSSID_OR_SSID
));
1175 /* /Find frame/Find Previous/ */
1177 wlan_find_frame_previous_BSSID_cb(GtkWidget
*widget
, gpointer user_data
)
1179 wlan_select_filter_cb( widget
, user_data
, CALLBACK_FIND_PREVIOUS(ACTYPE_SELECTED
, VALUE_BSSID_ONLY
));
1182 wlan_find_frame_previous_SSID_cb(GtkWidget
*widget
, gpointer user_data
)
1184 wlan_select_filter_cb( widget
, user_data
, CALLBACK_FIND_PREVIOUS(ACTYPE_SELECTED
, VALUE_SSID_ONLY
));
1187 wlan_find_frame_previous_BSSID_and_SSID_cb(GtkWidget
*widget
, gpointer user_data
)
1189 wlan_select_filter_cb( widget
, user_data
, CALLBACK_FIND_PREVIOUS(ACTYPE_SELECTED
, VALUE_BSSID_AND_SSID
));
1192 wlan_find_frame_previous_BSSID_or_SSID_cb(GtkWidget
*widget
, gpointer user_data
)
1194 wlan_select_filter_cb( widget
, user_data
, CALLBACK_FIND_PREVIOUS(ACTYPE_SELECTED
, VALUE_BSSID_OR_SSID
));
1199 wlan_colorize_BSSID_cb(GtkWidget
*widget
, gpointer user_data
)
1201 wlan_select_filter_cb( widget
, user_data
, CALLBACK_COLORIZE(ACTYPE_SELECTED
, VALUE_BSSID_ONLY
));
1204 wlan_colorize_SSID_cb(GtkWidget
*widget
, gpointer user_data
)
1206 wlan_select_filter_cb( widget
, user_data
, CALLBACK_COLORIZE(ACTYPE_SELECTED
, VALUE_SSID_ONLY
));
1209 wlan_colorize_BSSID_and_SSID_cb(GtkWidget
*widget
, gpointer user_data
)
1211 wlan_select_filter_cb( widget
, user_data
, CALLBACK_COLORIZE(ACTYPE_SELECTED
, VALUE_BSSID_AND_SSID
));
1214 wlan_colorize_BSSID_or_SSID_cb(GtkWidget
*widget
, gpointer user_data
)
1216 wlan_select_filter_cb( widget
, user_data
, CALLBACK_COLORIZE(ACTYPE_SELECTED
, VALUE_BSSID_OR_SSID
));
1220 static const char *ui_desc_wlan_stat_filter_popup
=
1222 " <popup name='WlanStatFilterPopup' action='PopupAction'>\n"
1223 " <menu name= 'ApplyAsFilter' action='/Apply as Filter'>\n"
1224 " <menu name= 'ApplyAsFilterSelected' action='/Apply as Filter/Selected'>\n"
1225 " <menuitem action='/Apply as Filter/Selected/BSSID'/>\n"
1226 " <menuitem action='/Apply as Filter/Selected/SSID'/>\n"
1227 " <menuitem action='/Apply as Filter/Selected/BSSID and SSID'/>\n"
1228 " <menuitem action='/Apply as Filter/Selected/BSSID or SSID'/>\n"
1230 " <menu name= 'ApplyAsFilterNotSelected' action='/Apply as Filter/Not Selected'>\n"
1231 " <menuitem action='/Apply as Filter/Not Selected/BSSID'/>\n"
1232 " <menuitem action='/Apply as Filter/Not Selected/SSID'/>\n"
1233 " <menuitem action='/Apply as Filter/Not Selected/BSSID and SSID'/>\n"
1234 " <menuitem action='/Apply as Filter/Not Selected/BSSID or SSID'/>\n"
1236 " <menu name= 'ApplyAsFilterAndSelected' action='/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS
" and Selected'>\n"
1237 " <menuitem action='/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS
" and Selected/BSSID'/>\n"
1238 " <menuitem action='/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS
" and Selected/SSID'/>\n"
1239 " <menuitem action='/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS
" and Selected/BSSID and SSID'/>\n"
1240 " <menuitem action='/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS
" and Selected/BSSID or SSID'/>\n"
1242 " <menu name= 'ApplyAsFilterOrSelected' action='/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS
" or Selected'>\n"
1243 " <menuitem action='/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS
" or Selected/BSSID'/>\n"
1244 " <menuitem action='/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS
" or Selected/SSID'/>\n"
1245 " <menuitem action='/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS
" or Selected/BSSID and SSID'/>\n"
1246 " <menuitem action='/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS
" or Selected/BSSID or SSID'/>\n"
1248 " <menu name= 'ApplyAsFilterAndNotSelected' action='/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS
" and not Selected'>\n"
1249 " <menuitem action='/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS
" and not Selected/BSSID'/>\n"
1250 " <menuitem action='/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS
" and not Selected/SSID'/>\n"
1251 " <menuitem action='/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS
" and not Selected/BSSID and SSID'/>\n"
1252 " <menuitem action='/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS
" and not Selected/BSSID or SSID'/>\n"
1254 " <menu name= 'ApplyAsFilterOrNotSelected' action='/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS
" or not Selected'>\n"
1255 " <menuitem action='/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS
" or not Selected/BSSID'/>\n"
1256 " <menuitem action='/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS
" or not Selected/SSID'/>\n"
1257 " <menuitem action='/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS
" or not Selected/BSSID and SSID'/>\n"
1258 " <menuitem action='/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS
" or not Selected/BSSID or SSID'/>\n"
1261 " <menu name= 'PrepareAFilter' action='/Prepare a Filter'>\n"
1262 " <menu name= 'PrepareAFilterSelected' action='/Prepare a Filter/Selected'>\n"
1263 " <menuitem action='/Prepare a Filter/Selected/BSSID'/>\n"
1264 " <menuitem action='/Prepare a Filter/Selected/SSID'/>\n"
1265 " <menuitem action='/Prepare a Filter/Selected/BSSID and SSID'/>\n"
1266 " <menuitem action='/Prepare a Filter/Selected/BSSID or SSID'/>\n"
1268 " <menu name= 'PrepareAFilterNotSelected' action='/Prepare a Filter/Not Selected'>\n"
1269 " <menuitem action='/Prepare a Filter/Not Selected/BSSID'/>\n"
1270 " <menuitem action='/Prepare a Filter/Not Selected/SSID'/>\n"
1271 " <menuitem action='/Prepare a Filter/Not Selected/BSSID and SSID'/>\n"
1272 " <menuitem action='/Prepare a Filter/Not Selected/BSSID or SSID'/>\n"
1274 " <menu name= 'PrepareAFilterAndSelected' action='/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS
" and Selected'>\n"
1275 " <menuitem action='/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS
" and Selected/BSSID'/>\n"
1276 " <menuitem action='/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS
" and Selected/SSID'/>\n"
1277 " <menuitem action='/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS
" and Selected/BSSID and SSID'/>\n"
1278 " <menuitem action='/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS
" and Selected/BSSID or SSID'/>\n"
1280 " <menu name= 'PrepareAFilterOrSelected' action='/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS
" or Selected'>\n"
1281 " <menuitem action='/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS
" or Selected/BSSID'/>\n"
1282 " <menuitem action='/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS
" or Selected/SSID'/>\n"
1283 " <menuitem action='/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS
" or Selected/BSSID and SSID'/>\n"
1284 " <menuitem action='/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS
" or Selected/BSSID or SSID'/>\n"
1286 " <menu name= 'PrepareAFilterAndNotSelected' action='/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS
" and not Selected'>\n"
1287 " <menuitem action='/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS
" and not Selected/BSSID'/>\n"
1288 " <menuitem action='/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS
" and not Selected/SSID'/>\n"
1289 " <menuitem action='/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS
" and not Selected/BSSID and SSID'/>\n"
1290 " <menuitem action='/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS
" and not Selected/BSSID or SSID'/>\n"
1292 " <menu name= 'PrepareAFilterOrNotSelected' action='/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS
" or not Selected'>\n"
1293 " <menuitem action='/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS
" or not Selected/BSSID'/>\n"
1294 " <menuitem action='/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS
" or not Selected/SSID'/>\n"
1295 " <menuitem action='/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS
" or not Selected/BSSID and SSID'/>\n"
1296 " <menuitem action='/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS
" or not Selected/BSSID or SSID'/>\n"
1299 " <menu name= 'FindFrame' action='/Find Frame'>\n"
1300 " <menu name= 'FindFrameFindFrame' action='/Find Frame/Find Frame'>\n"
1301 " <menuitem action='/Find Frame/Find Frame/BSSID'/>\n"
1302 " <menuitem action='/Find Frame/Find Frame/SSID'/>\n"
1303 " <menuitem action='/Find Frame/Find Frame/BSSID and SSID'/>\n"
1304 " <menuitem action='/Find Frame/Find Frame/BSSID or SSID'/>\n"
1306 " <menu name= 'FindFrameNext' action='/Find Frame/Find Next'>\n"
1307 " <menuitem action='/Find Frame/Find Next/BSSID'/>\n"
1308 " <menuitem action='/Find Frame/Find Next/SSID'/>\n"
1309 " <menuitem action='/Find Frame/Find Next/BSSID and SSID'/>\n"
1310 " <menuitem action='/Find Frame/Find Next/BSSID or SSID'/>\n"
1312 " <menu name= 'FindFramePrevious' action='/Find Frame/Find Previous'>\n"
1313 " <menuitem action='/Find Frame/Find Previous/BSSID'/>\n"
1314 " <menuitem action='/Find Frame/Find Previous/SSID'/>\n"
1315 " <menuitem action='/Find Frame/Find Previous/BSSID and SSID'/>\n"
1316 " <menuitem action='/Find Frame/Find Previous/BSSID or SSID'/>\n"
1319 " <menu name= 'Colorize' action='/Colorize'>\n"
1320 " <menuitem action='/Colorize/BSSID'/>\n"
1321 " <menuitem action='/Colorize/SSID'/>\n"
1322 " <menuitem action='/Colorize/BSSID and SSID'/>\n"
1323 " <menuitem action='/Colorize/BSSID or SSID'/>\n"
1331 * const gchar *name;
1332 * const gchar *stock_id;
1333 * const gchar *label;
1334 * const gchar *accelerator;
1335 * const gchar *tooltip;
1336 * GCallback callback;
1338 * const gchar *name; The name of the action.
1339 * const gchar *stock_id; The stock id for the action, or the name of an icon from the icon theme.
1340 * const gchar *label; The label for the action. This field should typically be marked for translation,
1341 * see gtk_action_group_set_translation_domain().
1342 * If label is NULL, the label of the stock item with id stock_id is used.
1343 * const gchar *accelerator; The accelerator for the action, in the format understood by gtk_accelerator_parse().
1344 * const gchar *tooltip; The tooltip for the action. This field should typically be marked for translation,
1345 * see gtk_action_group_set_translation_domain().
1346 * GCallback callback; The function to call when the action is activated.
1349 static const GtkActionEntry wlans_stat_popup_entries
[] = {
1351 { "/Apply as Filter", NULL
, "Apply as Filter", NULL
, NULL
, NULL
},
1352 { "/Prepare a Filter", NULL
, "Prepare a Filter", NULL
, NULL
, NULL
},
1353 { "/Find Frame", NULL
, "Find Frame", NULL
, NULL
, NULL
},
1354 { "/Colorize", NULL
, "Colorize", NULL
, NULL
, NULL
},
1357 { "/Apply as Filter/Selected", NULL
, "Selected" , NULL
, NULL
, NULL
},
1358 { "/Apply as Filter/Not Selected", NULL
, "Not Selected", NULL
, NULL
, NULL
},
1359 { "/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS
" and Selected", NULL
, UTF8_HORIZONTAL_ELLIPSIS
" and Selected", NULL
, NULL
, NULL
},
1360 { "/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS
" or Selected", NULL
, UTF8_HORIZONTAL_ELLIPSIS
" or Selected", NULL
, NULL
, NULL
},
1361 { "/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS
" and not Selected", NULL
, UTF8_HORIZONTAL_ELLIPSIS
" and not Selected", NULL
, NULL
, NULL
},
1362 { "/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS
" or not Selected", NULL
, UTF8_HORIZONTAL_ELLIPSIS
" or not Selected", NULL
, NULL
, NULL
},
1364 /* Apply as Selected */
1365 { "/Apply as Filter/Selected/BSSID", NULL
, "BSSID", NULL
, "BSSID", G_CALLBACK(wlan_select_filter_as_selected_BSSID_cb
)},
1366 { "/Apply as Filter/Selected/SSID", NULL
, "SSID", NULL
, "SSID", G_CALLBACK(wlan_select_filter_as_selected_SSID_cb
)},
1367 { "/Apply as Filter/Selected/BSSID and SSID", NULL
, "BSSID and SSID", NULL
, "BSSID and SSID", G_CALLBACK(wlan_select_filter_as_selected_BSSID_and_SSID_cb
)},
1368 { "/Apply as Filter/Selected/BSSID or SSID", NULL
, "BSSID or SSID", NULL
, "BSSID or SSID", G_CALLBACK(wlan_select_filter_as_selected_BSSID_or_SSID_cb
)},
1370 /* Apply as Not Selected */
1371 { "/Apply as Filter/Not Selected/BSSID", NULL
, "BSSID", NULL
, "BSSID", G_CALLBACK(wlan_select_filter_as_not_selected_BSSID_cb
)},
1372 { "/Apply as Filter/Not Selected/SSID", NULL
, "SSID", NULL
, "SSID", G_CALLBACK(wlan_select_filter_as_not_selected_SSID_cb
)},
1373 { "/Apply as Filter/Not Selected/BSSID and SSID", NULL
, "BSSID and SSID", NULL
, "BSSID and SSID", G_CALLBACK(wlan_select_filter_as_not_selected_BSSID_and_SSID_cb
)},
1374 { "/Apply as Filter/Not Selected/BSSID or SSID", NULL
, "BSSID or SSID", NULL
, "BSSID or SSID", G_CALLBACK(wlan_select_filter_as_not_selected_BSSID_or_SSID_cb
)},
1376 /* Apply as and Selected */
1377 { "/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS
" and Selected/BSSID", NULL
, "BSSID", NULL
, "BSSID", G_CALLBACK(wlan_select_filter_and_selected_BSSID_cb
)},
1378 { "/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS
" and Selected/SSID", NULL
, "SSID", NULL
, "SSID", G_CALLBACK(wlan_select_filter_and_selected_SSID_cb
)},
1379 { "/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS
" and Selected/BSSID and SSID", NULL
, "BSSID and SSID", NULL
, "BSSID and SSID", G_CALLBACK(wlan_select_filter_and_selected_BSSID_and_SSID_cb
)},
1380 { "/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS
" and Selected/BSSID or SSID", NULL
, "BSSID or SSID", NULL
, "BSSID or SSID", G_CALLBACK(wlan_select_filter_and_selected_BSSID_or_SSID_cb
)},
1382 /* Apply as or Selected */
1383 { "/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS
" or Selected/BSSID", NULL
, "BSSID", NULL
, "BSSID", G_CALLBACK(wlan_select_filter_or_selected_BSSID_cb
)},
1384 { "/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS
" or Selected/SSID", NULL
, "SSID", NULL
, "SSID", G_CALLBACK(wlan_select_filter_or_selected_SSID_cb
)},
1385 { "/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS
" or Selected/BSSID and SSID", NULL
, "BSSID and SSID", NULL
, "BSSID and SSID", G_CALLBACK(wlan_select_filter_or_selected_BSSID_and_SSID_cb
)},
1386 { "/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS
" or Selected/BSSID or SSID", NULL
, "BSSID or SSID", NULL
, "BSSID or SSID", G_CALLBACK(wlan_select_filter_or_selected_BSSID_or_SSID_cb
)},
1388 /* /Apply as Filter/... and not Selected */
1389 { "/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS
" and not Selected/BSSID", NULL
, "BSSID", NULL
, "BSSID", G_CALLBACK(wlan_select_filter_and_not_selected_BSSID_cb
)},
1390 { "/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS
" and not Selected/SSID", NULL
, "SSID", NULL
, "SSID", G_CALLBACK(wlan_select_filter_and_not_selected_SSID_cb
)},
1391 { "/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS
" and not Selected/BSSID and SSID", NULL
, "BSSID and SSID", NULL
, "BSSID and SSID", G_CALLBACK(wlan_select_filter_and_not_selected_BSSID_and_SSID_cb
)},
1392 { "/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS
" and not Selected/BSSID or SSID", NULL
, "BSSID or SSID", NULL
, "BSSID or SSID", G_CALLBACK(wlan_select_filter_and_not_selected_BSSID_or_SSID_cb
)},
1394 /* /Apply as Filter/... or not Selected */
1395 { "/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS
" or not Selected/BSSID", NULL
, "BSSID", NULL
, "BSSID", G_CALLBACK(wlan_select_filter_or_not_selected_BSSID_cb
)},
1396 { "/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS
" or not Selected/SSID", NULL
, "SSID", NULL
, "SSID", G_CALLBACK(wlan_select_filter_or_not_selected_SSID_cb
)},
1397 { "/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS
" or not Selected/BSSID and SSID", NULL
, "BSSID and SSID", NULL
, "BSSID and SSID", G_CALLBACK(wlan_select_filter_or_not_selected_BSSID_and_SSID_cb
)},
1398 { "/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS
" or not Selected/BSSID or SSID", NULL
, "BSSID or SSID", NULL
, "BSSID or SSID", G_CALLBACK(wlan_select_filter_or_not_selected_BSSID_or_SSID_cb
)},
1401 { "/Prepare a Filter/Selected", NULL
, "Selected" , NULL
, NULL
, NULL
},
1402 { "/Prepare a Filter/Not Selected", NULL
, "Not Selected", NULL
, NULL
, NULL
},
1403 { "/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS
" and Selected", NULL
, UTF8_HORIZONTAL_ELLIPSIS
" and Selected", NULL
, NULL
, NULL
},
1404 { "/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS
" or Selected", NULL
, UTF8_HORIZONTAL_ELLIPSIS
" or Selected", NULL
, NULL
, NULL
},
1405 { "/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS
" and not Selected", NULL
, UTF8_HORIZONTAL_ELLIPSIS
" and not Selected", NULL
, NULL
, NULL
},
1406 { "/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS
" or not Selected", NULL
, UTF8_HORIZONTAL_ELLIPSIS
" or not Selected", NULL
, NULL
, NULL
},
1408 /* Prepare a Selected */
1409 { "/Prepare a Filter/Selected/BSSID", NULL
, "BSSID", NULL
, "BSSID", G_CALLBACK(wlan_prepare_filter_as_selected_BSSID_cb
)},
1410 { "/Prepare a Filter/Selected/SSID", NULL
, "SSID", NULL
, "SSID", G_CALLBACK(wlan_prepare_filter_as_selected_SSID_cb
)},
1411 { "/Prepare a Filter/Selected/BSSID and SSID",NULL
, "BSSID and SSID", NULL
, "BSSID and SSID", G_CALLBACK(wlan_prepare_filter_as_selected_BSSID_and_SSID_cb
)},
1412 { "/Prepare a Filter/Selected/BSSID or SSID", NULL
, "BSSID or SSID", NULL
, "BSSID or SSID", G_CALLBACK(wlan_prepare_filter_as_selected_BSSID_or_SSID_cb
)},
1414 /* Prepare a Not Selected */
1415 { "/Prepare a Filter/Not Selected/BSSID", NULL
, "BSSID", NULL
, "BSSID", G_CALLBACK(wlan_prepare_filter_as_not_selected_BSSID_cb
)},
1416 { "/Prepare a Filter/Not Selected/SSID", NULL
, "SSID", NULL
, "SSID", G_CALLBACK(wlan_prepare_filter_as_not_selected_SSID_cb
)},
1417 { "/Prepare a Filter/Not Selected/BSSID and SSID",NULL
, "BSSID and SSID", NULL
, "BSSID and SSID", G_CALLBACK(wlan_prepare_filter_as_not_selected_BSSID_and_SSID_cb
)},
1418 { "/Prepare a Filter/Not Selected/BSSID or SSID", NULL
, "BSSID or SSID", NULL
, "BSSID or SSID", G_CALLBACK(wlan_prepare_filter_as_not_selected_BSSID_or_SSID_cb
)},
1420 /* Prepare a and Selected */
1421 { "/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS
" and Selected/BSSID", NULL
, "BSSID", NULL
, "BSSID", G_CALLBACK(wlan_prepare_filter_and_selected_BSSID_cb
)},
1422 { "/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS
" and Selected/SSID", NULL
, "SSID", NULL
, "SSID", G_CALLBACK(wlan_prepare_filter_and_selected_SSID_cb
)},
1423 { "/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS
" and Selected/BSSID and SSID", NULL
, "BSSID and SSID", NULL
, "BSSID and SSID", G_CALLBACK(wlan_prepare_filter_and_selected_BSSID_and_SSID_cb
)},
1424 { "/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS
" and Selected/BSSID or SSID", NULL
, "BSSID or SSID", NULL
, "BSSID or SSID", G_CALLBACK(wlan_prepare_filter_and_selected_BSSID_or_SSID_cb
)},
1426 /* Prepare a or Selected */
1427 { "/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS
" or Selected/BSSID", NULL
, "BSSID", NULL
, "BSSID", G_CALLBACK(wlan_prepare_filter_or_selected_BSSID_cb
)},
1428 { "/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS
" or Selected/SSID", NULL
, "SSID", NULL
, "SSID", G_CALLBACK(wlan_prepare_filter_or_selected_SSID_cb
)},
1429 { "/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS
" or Selected/BSSID and SSID", NULL
, "BSSID and SSID", NULL
, "BSSID and SSID", G_CALLBACK(wlan_prepare_filter_or_selected_BSSID_and_SSID_cb
)},
1430 { "/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS
" or Selected/BSSID or SSID", NULL
, "BSSID or SSID", NULL
, "BSSID or SSID", G_CALLBACK(wlan_prepare_filter_or_selected_BSSID_or_SSID_cb
)},
1432 /* /Prepare a Filter/... and not Selected */
1433 { "/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS
" and not Selected/BSSID", NULL
, "BSSID", NULL
, "BSSID", G_CALLBACK(wlan_prepare_filter_and_not_selected_BSSID_cb
)},
1434 { "/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS
" and not Selected/SSID", NULL
, "SSID", NULL
, "SSID", G_CALLBACK(wlan_prepare_filter_and_not_selected_SSID_cb
)},
1435 { "/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS
" and not Selected/BSSID and SSID", NULL
, "BSSID and SSID", NULL
, "BSSID and SSID", G_CALLBACK(wlan_prepare_filter_and_not_selected_BSSID_and_SSID_cb
)},
1436 { "/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS
" and not Selected/BSSID or SSID", NULL
, "BSSID or SSID", NULL
, "BSSID or SSID", G_CALLBACK(wlan_prepare_filter_and_not_selected_BSSID_or_SSID_cb
)},
1438 /* /Prepare a Filter/... or not Selected */
1439 { "/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS
" or not Selected/BSSID", NULL
, "BSSID", NULL
, "BSSID", G_CALLBACK(wlan_prepare_filter_or_not_selected_BSSID_cb
)},
1440 { "/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS
" or not Selected/SSID", NULL
, "SSID", NULL
, "SSID", G_CALLBACK(wlan_prepare_filter_or_not_selected_SSID_cb
)},
1441 { "/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS
" or not Selected/BSSID and SSID", NULL
, "BSSID and SSID", NULL
, "BSSID and SSID", G_CALLBACK(wlan_prepare_filter_or_not_selected_BSSID_and_SSID_cb
)},
1442 { "/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS
" or not Selected/BSSID or SSID", NULL
, "BSSID or SSID", NULL
, "BSSID or SSID", G_CALLBACK(wlan_prepare_filter_or_not_selected_BSSID_or_SSID_cb
)},
1445 { "/Find Frame/Find Frame", NULL
, "Find Frame", NULL
, NULL
, NULL
},
1446 { "/Find Frame/Find Next", NULL
, "Find Next", NULL
, NULL
, NULL
},
1447 { "/Find Frame/Find Previous", NULL
, "Find Previous", NULL
, NULL
, NULL
},
1449 /* Find Frame/Find Frame*/
1450 { "/Find Frame/Find Frame/BSSID", NULL
, "BSSID", NULL
, "BSSID", G_CALLBACK(wlan_find_frame_BSSID_cb
)},
1451 { "/Find Frame/Find Frame/SSID", NULL
, "SSID", NULL
, "SSID", G_CALLBACK(wlan_find_frame_SSID_cb
)},
1452 { "/Find Frame/Find Frame/BSSID and SSID", NULL
, "SSID and SSID", NULL
, "SSID and SSID", G_CALLBACK(wlan_find_frame_BSSID_and_SSID_cb
)},
1453 { "/Find Frame/Find Frame/BSSID or SSID", NULL
, "BSSID", NULL
, "BSSID", G_CALLBACK(wlan_find_frame_BSSID_or_SSID_cb
)},
1455 /* Find Frame/Find Next*/
1456 { "/Find Frame/Find Next/BSSID", NULL
, "BSSID", NULL
, "BSSID", G_CALLBACK(wlan_find_frame_next_BSSID_cb
)},
1457 { "/Find Frame/Find Next/SSID", NULL
, "SSID", NULL
, "SSID", G_CALLBACK(wlan_find_frame_next_SSID_cb
)},
1458 { "/Find Frame/Find Next/BSSID and SSID", NULL
, "SSID and SSID", NULL
, "SSID and SSID", G_CALLBACK(wlan_find_frame_next_BSSID_and_SSID_cb
)},
1459 { "/Find Frame/Find Next/BSSID or SSID", NULL
, "BSSID", NULL
, "BSSID", G_CALLBACK(wlan_find_frame_next_BSSID_or_SSID_cb
)},
1461 /* Find Frame/Find Previous*/
1462 { "/Find Frame/Find Previous/BSSID", NULL
, "BSSID", NULL
, "BSSID", G_CALLBACK(wlan_find_frame_previous_BSSID_cb
)},
1463 { "/Find Frame/Find Previous/SSID", NULL
, "SSID", NULL
, "SSID", G_CALLBACK(wlan_find_frame_previous_SSID_cb
)},
1464 { "/Find Frame/Find Previous/BSSID and SSID", NULL
, "SSID and SSID", NULL
, "SSID and SSID", G_CALLBACK(wlan_find_frame_previous_BSSID_and_SSID_cb
)},
1465 { "/Find Frame/Find Previous/BSSID or SSID", NULL
, "BSSID", NULL
, "BSSID", G_CALLBACK(wlan_find_frame_previous_BSSID_or_SSID_cb
)},
1468 { "/Colorize/BSSID", NULL
, "BSSID", NULL
, "BSSID", G_CALLBACK(wlan_colorize_BSSID_cb
)},
1469 { "/Colorize/SSID", NULL
, "SSID", NULL
, "SSID", G_CALLBACK(wlan_colorize_SSID_cb
)},
1470 { "/Colorize/BSSID and SSID", NULL
, "BSSID and SSID", NULL
, "BSSID and SSID", G_CALLBACK(wlan_colorize_BSSID_and_SSID_cb
)},
1471 { "/Colorize/BSSID or SSID", NULL
, "BSSID or SSID", NULL
, "BSSID or SSID", G_CALLBACK(wlan_colorize_BSSID_or_SSID_cb
)},
1476 wlan_create_popup_menu(wlanstat_t
*hs
)
1478 GtkUIManager
*ui_manager
;
1479 GtkActionGroup
*action_group
;
1480 GError
*error
= NULL
;
1482 action_group
= gtk_action_group_new ("WlanFilterPopupActionGroup");
1483 gtk_action_group_add_actions (action_group
, /* the action group */
1484 (GtkActionEntry
*)wlans_stat_popup_entries
, /* an array of action descriptions */
1485 G_N_ELEMENTS(wlans_stat_popup_entries
), /* the number of entries */
1486 hs
); /* data to pass to the action callbacks */
1488 ui_manager
= gtk_ui_manager_new ();
1489 gtk_ui_manager_insert_action_group (ui_manager
, action_group
, 0);
1490 gtk_ui_manager_add_ui_from_string (ui_manager
,ui_desc_wlan_stat_filter_popup
, -1, &error
);
1493 fprintf (stderr
, "Warning: building Wlan Stat Filter popup failed: %s\n",
1495 g_error_free (error
);
1498 hs
->menu
= gtk_ui_manager_get_widget(ui_manager
, "/WlanStatFilterPopup");
1499 g_signal_connect(hs
->table
, "button_press_event", G_CALLBACK(wlan_show_popup_menu_cb
), hs
);
1504 wlan_details_show_popup_menu_cb(void *widg _U_
, GdkEvent
*event
, wlanstat_t
*et
)
1506 GdkEventButton
*bevent
= (GdkEventButton
*)event
;
1507 GtkTreeSelection
*sel
;
1508 GtkTreeModel
*model
;
1511 /* To qoute the "Gdk Event Structures" doc:
1512 * "Normally button 1 is the left mouse button, 2 is the middle button, and 3 is the right button" */
1513 if ((event
->type
== GDK_BUTTON_PRESS
) && (bevent
->button
== 3)) {
1514 /* if this is a right click on one of our columns, popup the context menu */
1515 sel
= gtk_tree_view_get_selection (GTK_TREE_VIEW(et
->details
));
1516 if (gtk_tree_selection_get_selected (sel
, &model
, &iter
)) {
1517 gtk_menu_popup(GTK_MENU(et
->details_menu
), NULL
, NULL
, NULL
, NULL
,
1518 bevent
->button
, bevent
->time
);
1525 /* Apply as Filter/ */
1528 wlan_details_apply_selected_cb(GtkWidget
*widget
, gpointer user_data
)
1530 wlan_details_select_filter_cb( widget
, user_data
, CALLBACK_MATCH(ACTYPE_SELECTED
, 0));
1534 wlan_details_apply_not_selected_cb(GtkWidget
*widget
, gpointer user_data
)
1536 wlan_details_select_filter_cb( widget
, user_data
, CALLBACK_MATCH(ACTYPE_NOT_SELECTED
, 0));
1540 wlan_details_apply_and_selected_cb(GtkWidget
*widget
, gpointer user_data
)
1542 wlan_details_select_filter_cb( widget
, user_data
, CALLBACK_MATCH(ACTYPE_AND_SELECTED
, 0));
1546 wlan_details_apply_or_selected_cb(GtkWidget
*widget
, gpointer user_data
)
1548 wlan_details_select_filter_cb( widget
, user_data
, CALLBACK_MATCH(ACTYPE_OR_SELECTED
, 0));
1552 wlan_details_apply_and_not_selected_cb(GtkWidget
*widget
, gpointer user_data
)
1554 wlan_details_select_filter_cb( widget
, user_data
, CALLBACK_MATCH(ACTYPE_AND_NOT_SELECTED
, 0));
1558 wlan_details_apply_or_not_selected_cb(GtkWidget
*widget
, gpointer user_data
)
1560 wlan_details_select_filter_cb( widget
, user_data
, CALLBACK_MATCH(ACTYPE_OR_NOT_SELECTED
, 0));
1562 /* Prepare a filter */
1564 wlan_details_prepare_selected_cb(GtkWidget
*widget
, gpointer user_data
)
1566 wlan_details_select_filter_cb( widget
, user_data
, CALLBACK_PREPARE(ACTYPE_SELECTED
, 0));
1570 wlan_details_prepare_not_selected_cb(GtkWidget
*widget
, gpointer user_data
)
1572 wlan_details_select_filter_cb( widget
, user_data
, CALLBACK_PREPARE(ACTYPE_NOT_SELECTED
, 0));
1576 wlan_details_prepare_and_selected_cb(GtkWidget
*widget
, gpointer user_data
)
1578 wlan_details_select_filter_cb( widget
, user_data
, CALLBACK_PREPARE(ACTYPE_AND_SELECTED
, 0));
1582 wlan_details_prepare_or_selected_cb(GtkWidget
*widget
, gpointer user_data
)
1584 wlan_details_select_filter_cb( widget
, user_data
, CALLBACK_PREPARE(ACTYPE_OR_SELECTED
, 0));
1588 wlan_details_prepare_and_not_selected_cb(GtkWidget
*widget
, gpointer user_data
)
1590 wlan_details_select_filter_cb( widget
, user_data
, CALLBACK_PREPARE(ACTYPE_AND_NOT_SELECTED
, 0));
1594 wlan_details_prepare_or_not_selected_cb(GtkWidget
*widget
, gpointer user_data
)
1596 wlan_details_select_filter_cb( widget
, user_data
, CALLBACK_PREPARE(ACTYPE_OR_NOT_SELECTED
, 0));
1600 wlan_details_find_frame_cb(GtkWidget
*widget
, gpointer user_data
)
1602 wlan_details_select_filter_cb( widget
, user_data
, CALLBACK_FIND_FRAME(ACTYPE_SELECTED
, 0));
1605 wlan_details_find_next_frame_cb(GtkWidget
*widget
, gpointer user_data
)
1607 wlan_details_select_filter_cb( widget
, user_data
, CALLBACK_FIND_FRAME(ACTYPE_OR_NOT_SELECTED
, 0));
1610 wlan_details_find_previous_frame_cb(GtkWidget
*widget
, gpointer user_data
)
1612 wlan_details_select_filter_cb( widget
, user_data
, CALLBACK_FIND_FRAME(ACTYPE_OR_NOT_SELECTED
, 0));
1616 static const char *ui_desc_wlan_details_filter_popup
=
1618 " <popup name='WlanStatFilterPopup' action='PopupAction'>\n"
1619 " <menu name= 'ApplyAsFilter' action='/Apply as Filter'>\n"
1620 " <menuitem action='/Apply as Filter/Selected'/>\n"
1621 " <menuitem action='/Apply as Filter/Not Selected'/>\n"
1622 " <menuitem action='/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS
" and Selected'/>\n"
1623 " <menuitem action='/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS
" or Selected'/>\n"
1624 " <menuitem action='/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS
" and not Selected'/>\n"
1625 " <menuitem action='/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS
" or not Selected'/>\n"
1627 " <menu name= 'PrepareAFilter' action='/Prepare a Filter'>\n"
1628 " <menuitem action='/Prepare a Filter/Selected'/>\n"
1629 " <menuitem action='/Prepare a Filter/Not Selected'/>\n"
1630 " <menuitem action='/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS
" and Selected'/>\n"
1631 " <menuitem action='/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS
" or Selected'/>\n"
1632 " <menuitem action='/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS
" and not Selected'/>\n"
1633 " <menuitem action='/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS
" or not Selected'/>\n"
1635 " <menu name= 'FindFrame' action='/Find Frame'>\n"
1636 " <menuitem action='/Find Frame/Find Frame'/>\n"
1637 " <menuitem action='/Find Frame/Find Next'/>\n"
1638 " <menuitem action='/Find Frame/Find Previous'/>\n"
1646 * const gchar *name;
1647 * const gchar *stock_id;
1648 * const gchar *label;
1649 * const gchar *accelerator;
1650 * const gchar *tooltip;
1651 * GCallback callback;
1653 * const gchar *name; The name of the action.
1654 * const gchar *stock_id; The stock id for the action, or the name of an icon from the icon theme.
1655 * const gchar *label; The label for the action. This field should typically be marked for translation,
1656 * see gtk_action_group_set_translation_domain().
1657 * If label is NULL, the label of the stock item with id stock_id is used.
1658 * const gchar *accelerator; The accelerator for the action, in the format understood by gtk_accelerator_parse().
1659 * const gchar *tooltip; The tooltip for the action. This field should typically be marked for translation,
1660 * see gtk_action_group_set_translation_domain().
1661 * GCallback callback; The function to call when the action is activated.
1664 static const GtkActionEntry wlan_details_list_popup_entries
[] = {
1666 { "/Apply as Filter", NULL
, "Apply as Filter", NULL
, NULL
, NULL
},
1667 { "/Prepare a Filter", NULL
, "Prepare a Filter", NULL
, NULL
, NULL
},
1668 { "/Find Frame", NULL
, "Find Frame", NULL
, NULL
, NULL
},
1671 { "/Apply as Filter/Selected", NULL
, "Selected" , NULL
, NULL
, G_CALLBACK(wlan_details_apply_selected_cb
) },
1672 { "/Apply as Filter/Not Selected", NULL
, "Not Selected", NULL
, NULL
, G_CALLBACK(wlan_details_apply_not_selected_cb
) },
1673 { "/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS
" and Selected", NULL
, UTF8_HORIZONTAL_ELLIPSIS
" and Selected", NULL
, NULL
, G_CALLBACK(wlan_details_apply_and_selected_cb
) },
1674 { "/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS
" or Selected", NULL
, UTF8_HORIZONTAL_ELLIPSIS
" or Selected", NULL
, NULL
, G_CALLBACK(wlan_details_apply_or_selected_cb
) },
1675 { "/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS
" and not Selected", NULL
, UTF8_HORIZONTAL_ELLIPSIS
" and not Selected", NULL
, NULL
, G_CALLBACK(wlan_details_apply_and_not_selected_cb
) },
1676 { "/Apply as Filter/" UTF8_HORIZONTAL_ELLIPSIS
" or not Selected", NULL
, UTF8_HORIZONTAL_ELLIPSIS
" or not Selected", NULL
, NULL
, G_CALLBACK(wlan_details_apply_or_not_selected_cb
) },
1678 { "/Prepare a Filter/Selected", NULL
, "Selected" , NULL
, NULL
, G_CALLBACK(wlan_details_prepare_selected_cb
) },
1679 { "/Prepare a Filter/Not Selected", NULL
, "Not Selected", NULL
, NULL
, G_CALLBACK(wlan_details_prepare_not_selected_cb
) },
1680 { "/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS
" and Selected", NULL
, UTF8_HORIZONTAL_ELLIPSIS
" and Selected", NULL
, NULL
, G_CALLBACK(wlan_details_prepare_and_selected_cb
) },
1681 { "/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS
" or Selected", NULL
, UTF8_HORIZONTAL_ELLIPSIS
" or Selected", NULL
, NULL
, G_CALLBACK(wlan_details_prepare_or_selected_cb
) },
1682 { "/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS
" and not Selected", NULL
, UTF8_HORIZONTAL_ELLIPSIS
" and not Selected", NULL
, NULL
, G_CALLBACK(wlan_details_prepare_and_not_selected_cb
) },
1683 { "/Prepare a Filter/" UTF8_HORIZONTAL_ELLIPSIS
" or not Selected", NULL
, UTF8_HORIZONTAL_ELLIPSIS
" or not Selected", NULL
, NULL
, G_CALLBACK(wlan_details_prepare_or_not_selected_cb
) },
1686 { "/Find Frame/Find Frame", NULL
, "Find Frame", NULL
, NULL
, G_CALLBACK(wlan_details_find_frame_cb
) },
1687 { "/Find Frame/Find Next", NULL
, "Find Next", NULL
, NULL
, G_CALLBACK(wlan_details_find_next_frame_cb
) },
1688 { "/Find Frame/Find Previous", NULL
, "Find Previous", NULL
, NULL
, G_CALLBACK(wlan_details_find_previous_frame_cb
) },
1693 wlan_details_create_popup_menu(wlanstat_t
*hs
)
1695 GtkUIManager
*ui_manager
;
1696 GtkActionGroup
*action_group
;
1697 GError
*error
= NULL
;
1699 action_group
= gtk_action_group_new ("WlanDetailsPopupActionGroup");
1700 gtk_action_group_add_actions (action_group
, /* the action group */
1701 (GtkActionEntry
*)wlan_details_list_popup_entries
, /* an array of action descriptions */
1702 G_N_ELEMENTS(wlan_details_list_popup_entries
), /* the number of entries */
1703 hs
); /* data to pass to the action callbacks */
1705 ui_manager
= gtk_ui_manager_new ();
1706 gtk_ui_manager_insert_action_group (ui_manager
, action_group
, 0);
1707 gtk_ui_manager_add_ui_from_string (ui_manager
,ui_desc_wlan_details_filter_popup
, -1, &error
);
1710 fprintf (stderr
, "Warning: building Wlan details list popup failed: %s\n",
1712 g_error_free (error
);
1715 hs
->details_menu
= gtk_ui_manager_get_widget(ui_manager
, "/WlanStatFilterPopup");
1716 g_signal_connect(hs
->details
, "button_press_event", G_CALLBACK(wlan_details_show_popup_menu_cb
), hs
);
1721 wlanstat_dlg_create (void)
1724 GString
*error_string
;
1725 GtkWidget
*scrolled_window
;
1730 GtkWidget
*selected_vb
;
1731 GtkWidget
*resolv_cb
;
1732 GtkWidget
*filter_cb
;
1733 GtkWidget
*existing_cb
;
1734 GtkWidget
*close_bt
;
1737 GtkListStore
*store
;
1738 GtkTreeView
*tree_view
;
1739 GtkCellRenderer
*renderer
;
1740 GtkTreeViewColumn
*column
;
1741 GtkTreeSelection
*sel
;
1746 hs
= (wlanstat_t
*)g_malloc (sizeof(wlanstat_t
));
1747 hs
->num_entries
= 0;
1749 hs
->number_of_packets
= 0;
1750 hs
->resolve_names
= TRUE
;
1751 hs
->use_dfilter
= FALSE
;
1752 hs
->show_only_existing
= FALSE
;
1754 display_name
= cf_get_display_name(&cfile
);
1755 g_snprintf (title
, sizeof(title
), "Wireshark: WLAN Traffic Statistics: %s",
1757 g_free(display_name
);
1758 wlanstat_dlg_w
= window_new_with_geom (GTK_WINDOW_TOPLEVEL
, title
, "WLAN Statistics");
1759 gtk_window_set_default_size (GTK_WINDOW(wlanstat_dlg_w
), 750, 400);
1761 vbox
=ws_gtk_box_new(GTK_ORIENTATION_VERTICAL
, 3, FALSE
);
1762 gtk_container_add(GTK_CONTAINER(wlanstat_dlg_w
), vbox
);
1763 gtk_container_set_border_width (GTK_CONTAINER(vbox
), 6);
1765 wlanstat_pane
= gtk_paned_new(GTK_ORIENTATION_VERTICAL
);
1766 gtk_box_pack_start (GTK_BOX (vbox
), wlanstat_pane
, TRUE
, TRUE
, 0);
1767 gtk_paned_set_position(GTK_PANED(wlanstat_pane
), recent
.gui_geometry_wlan_stats_pane
);
1768 gtk_widget_show(wlanstat_pane
);
1770 /* init a scrolled window for overview */
1771 wlanstat_name_lb
= gtk_frame_new("Network Overview");
1772 gtk_paned_pack1(GTK_PANED(wlanstat_pane
), wlanstat_name_lb
, FALSE
, TRUE
);
1773 selected_vb
= ws_gtk_box_new(GTK_ORIENTATION_VERTICAL
, 0, FALSE
);
1774 gtk_container_add(GTK_CONTAINER(wlanstat_name_lb
), selected_vb
);
1775 gtk_container_set_border_width(GTK_CONTAINER(selected_vb
), 5);
1777 scrolled_window
= scrolled_window_new (NULL
, NULL
);
1778 gtk_box_pack_start(GTK_BOX(selected_vb
), scrolled_window
, TRUE
, TRUE
, 0);
1779 gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrolled_window
),
1782 store
= gtk_list_store_new(NUM_COLUMNS
, G_TYPE_STRING
, G_TYPE_STRING
, G_TYPE_STRING
,
1783 G_TYPE_STRING
, G_TYPE_INT
, G_TYPE_INT
, G_TYPE_INT
,
1784 G_TYPE_INT
, G_TYPE_INT
, G_TYPE_INT
, G_TYPE_INT
,
1785 G_TYPE_STRING
, G_TYPE_FLOAT
, G_TYPE_POINTER
);
1786 hs
->table
= GTK_TREE_VIEW(tree_view_new(GTK_TREE_MODEL(store
)));
1787 gtk_container_add(GTK_CONTAINER (scrolled_window
), GTK_WIDGET(hs
->table
));
1788 g_object_unref(G_OBJECT(store
));
1790 tree_view
= hs
->table
;
1791 gtk_tree_view_set_headers_visible(tree_view
, TRUE
);
1792 gtk_tree_view_set_headers_clickable(tree_view
, TRUE
);
1794 for (i
= 0; i
<= PROTECTION_COLUMN
; i
++) {
1795 if (i
== PERCENT_COLUMN
) {
1796 /* XXX: "progess" rendering doesn't seem to work for Gtk3 ?? */
1797 renderer
= gtk_cell_renderer_progress_new();
1798 column
= gtk_tree_view_column_new_with_attributes(titles
[i
], renderer
,
1800 "value", PERCENT_VALUE_COLUMN
,
1802 gtk_tree_view_column_set_expand(column
, TRUE
);
1803 gtk_tree_view_column_set_sort_column_id(column
, PERCENT_VALUE_COLUMN
);
1805 renderer
= gtk_cell_renderer_text_new();
1806 column
= gtk_tree_view_column_new_with_attributes(titles
[i
], renderer
,
1809 gtk_tree_view_column_set_sort_column_id(column
, i
);
1812 if (i
!= BSSID_COLUMN
&& i
!= SSID_COLUMN
&& i
!= PROTECTION_COLUMN
) {
1813 /* Align all number columns */
1814 g_object_set(G_OBJECT(renderer
), "xalign", 1.0, NULL
);
1816 gtk_tree_view_column_set_sizing(column
, GTK_TREE_VIEW_COLUMN_AUTOSIZE
);
1817 gtk_tree_view_column_set_resizable(column
, TRUE
);
1818 gtk_tree_view_append_column(tree_view
, column
);
1820 if (i
== SSID_COLUMN
) {
1821 /* Sort the SSID column */
1822 gtk_tree_view_column_clicked(column
);
1826 sel
= gtk_tree_view_get_selection(GTK_TREE_VIEW(hs
->table
));
1827 gtk_tree_selection_set_mode(sel
, GTK_SELECTION_SINGLE
);
1828 g_signal_connect(sel
, "changed", G_CALLBACK(wlan_select_cb
), hs
);
1830 /* init a scrolled window for details */
1831 frame
= gtk_frame_new("Selected Network");
1832 gtk_paned_pack2(GTK_PANED(wlanstat_pane
), frame
, FALSE
, TRUE
);
1833 selected_vb
= ws_gtk_box_new(GTK_ORIENTATION_VERTICAL
, 0, FALSE
);
1834 gtk_container_add(GTK_CONTAINER(frame
), selected_vb
);
1835 gtk_container_set_border_width(GTK_CONTAINER(selected_vb
), 5);
1837 scrolled_window
= scrolled_window_new (NULL
, NULL
);
1838 gtk_box_pack_start(GTK_BOX(selected_vb
), scrolled_window
, TRUE
, TRUE
, 0);
1839 gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrolled_window
),
1842 store
= gtk_list_store_new(NUM_DETAIL_COLUMNS
, G_TYPE_STRING
, G_TYPE_STRING
,
1843 G_TYPE_INT
, G_TYPE_INT
, G_TYPE_INT
, G_TYPE_INT
,
1844 G_TYPE_INT
, G_TYPE_INT
, G_TYPE_INT
, G_TYPE_STRING
,
1845 G_TYPE_FLOAT
, G_TYPE_POINTER
);
1846 hs
->details
= GTK_TREE_VIEW(tree_view_new(GTK_TREE_MODEL(store
)));
1847 gtk_container_add(GTK_CONTAINER (scrolled_window
), GTK_WIDGET(hs
->details
));
1848 g_object_unref(G_OBJECT(store
));
1850 tree_view
= hs
->details
;
1851 gtk_tree_view_set_headers_visible(tree_view
, TRUE
);
1852 gtk_tree_view_set_headers_clickable(tree_view
, TRUE
);
1854 for (i
= 0; i
<= COMMENT_COLUMN
; i
++) {
1855 if (i
== PERCENT_2_COLUMN
) {
1856 /* XXX: "progess" rendering doesn't seem to work for Gtk3 ?? */
1857 renderer
= gtk_cell_renderer_progress_new();
1858 column
= gtk_tree_view_column_new_with_attributes(detail_titles
[i
], renderer
,
1860 "value", PERCENT_VALUE_2_COLUMN
,
1862 gtk_tree_view_column_set_expand(column
, TRUE
);
1863 gtk_tree_view_column_set_sort_column_id(column
, PERCENT_VALUE_2_COLUMN
);
1865 renderer
= gtk_cell_renderer_text_new();
1866 column
= gtk_tree_view_column_new_with_attributes(detail_titles
[i
], renderer
,
1869 gtk_tree_view_column_set_sort_column_id(column
, i
);
1872 if (i
!= ADDRESS_COLUMN
&& i
!= COMMENT_COLUMN
) {
1873 /* Align all number columns */
1874 g_object_set(G_OBJECT(renderer
), "xalign", 1.0, NULL
);
1876 gtk_tree_view_column_set_sizing(column
, GTK_TREE_VIEW_COLUMN_AUTOSIZE
);
1877 gtk_tree_view_column_set_resizable(column
, TRUE
);
1878 gtk_tree_view_append_column(tree_view
, column
);
1880 if (i
== ADDRESS_COLUMN
) {
1881 /* Sort the Address column */
1882 gtk_tree_view_column_clicked(column
);
1886 sel
= gtk_tree_view_get_selection(GTK_TREE_VIEW(hs
->table
));
1887 gtk_tree_selection_set_mode(sel
, GTK_SELECTION_SINGLE
);
1889 /* create popup menu for this table */
1890 wlan_create_popup_menu(hs
);
1891 wlan_details_create_popup_menu(hs
);
1893 error_string
=register_tap_listener ("wlan", hs
, NULL
, 0,
1894 wlanstat_reset
, wlanstat_packet
,
1897 simple_dialog (ESD_TYPE_ERROR
, ESD_BTN_OK
, "%s", error_string
->str
);
1898 g_string_free (error_string
, TRUE
);
1903 hbox
= ws_gtk_box_new(GTK_ORIENTATION_HORIZONTAL
, 3, FALSE
);
1904 gtk_box_pack_start(GTK_BOX(vbox
), hbox
, FALSE
, FALSE
, 0);
1906 resolv_cb
= gtk_check_button_new_with_mnemonic("Name resolution");
1907 gtk_box_pack_start(GTK_BOX(hbox
), resolv_cb
, FALSE
, FALSE
, 0);
1908 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(resolv_cb
), TRUE
);
1909 gtk_widget_set_tooltip_text(resolv_cb
, "Show results of name resolutions rather than the \"raw\" values. "
1910 "Please note: The corresponding name resolution must be enabled.");
1912 g_signal_connect(resolv_cb
, "toggled", G_CALLBACK(wlan_resolve_toggle_dest
), hs
);
1914 filter_cb
= gtk_check_button_new_with_mnemonic("Limit to display filter");
1915 gtk_box_pack_start(GTK_BOX(hbox
), filter_cb
, FALSE
, FALSE
, 0);
1916 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(filter_cb
), FALSE
);
1917 gtk_widget_set_tooltip_text(filter_cb
, "Limit the list to entries matching the current display filter.");
1918 g_signal_connect(filter_cb
, "toggled", G_CALLBACK(wlan_filter_toggle_dest
), hs
);
1920 existing_cb
= gtk_check_button_new_with_mnemonic("Only show existing networks");
1921 gtk_box_pack_start(GTK_BOX(hbox
), existing_cb
, FALSE
, FALSE
, 0);
1922 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(existing_cb
), FALSE
);
1923 gtk_widget_set_tooltip_text(existing_cb
, "This option disables probe requests for "
1924 "unknown networks.");
1925 g_signal_connect(existing_cb
, "toggled", G_CALLBACK(wlan_existing_toggle_dest
), hs
);
1928 bbox
= dlg_button_row_new (GTK_STOCK_CLOSE
, GTK_STOCK_COPY
, GTK_STOCK_HELP
, NULL
);
1930 gtk_box_pack_end (GTK_BOX(vbox
), bbox
, FALSE
, FALSE
, 0);
1932 close_bt
= (GtkWidget
*)g_object_get_data(G_OBJECT(bbox
), GTK_STOCK_CLOSE
);
1933 window_set_cancel_button (wlanstat_dlg_w
, close_bt
, window_cancel_button_cb
);
1935 copy_bt
= (GtkWidget
*)g_object_get_data(G_OBJECT(bbox
), GTK_STOCK_COPY
);
1936 /* gtk_button_set_label(GTK_BUTTON(copy_bt), "Copy Overview"); */
1937 gtk_widget_set_tooltip_text(copy_bt
,
1938 "Copy all statistical values of this page to the clipboard in CSV (Comma Separated Values) format.");
1939 g_signal_connect(copy_bt
, "clicked", G_CALLBACK(wlan_copy_as_csv
), hs
->table
);
1941 help_bt
= (GtkWidget
*)g_object_get_data(G_OBJECT(bbox
), GTK_STOCK_HELP
);
1942 g_signal_connect(help_bt
, "clicked", G_CALLBACK(topic_cb
), (gpointer
)HELP_STATS_WLAN_TRAFFIC_DIALOG
);
1944 g_signal_connect (wlanstat_dlg_w
, "delete_event", G_CALLBACK(window_delete_event_cb
), NULL
);
1945 g_signal_connect (wlanstat_dlg_w
, "destroy", G_CALLBACK(win_destroy_cb
), hs
);
1947 gtk_widget_show_all (wlanstat_dlg_w
);
1948 window_present (wlanstat_dlg_w
);
1950 cf_retap_packets (&cfile
);
1951 gdk_window_raise(gtk_widget_get_window(wlanstat_dlg_w
));
1955 wlanstat_launch (GtkAction
*action _U_
, gpointer user_data _U_
)
1957 if (wlanstat_dlg_w
) {
1958 reactivate_window(wlanstat_dlg_w
);
1960 wlanstat_dlg_create ();
1965 register_tap_listener_wlanstat (void)
1967 static const unsigned char src
[6] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};
1969 SET_ADDRESS(&broadcast
, AT_ETHER
, 6, src
);