diff options
author | Beniamino Galvani <bgalvani@redhat.com> | 2017-04-05 14:23:33 +0200 |
---|---|---|
committer | Beniamino Galvani <bgalvani@redhat.com> | 2017-04-05 14:23:33 +0200 |
commit | 397d5541c0a0d785ab56891b131e2ceb6fe6a643 (patch) | |
tree | aebe896e676c23ed40a3ee0988a6788422251bb0 | |
parent | e34efe17239dfafa6a66f1ea51498278aac8cd4a (diff) | |
parent | 0ab08a566177f527daaf9ae5f068b28d934419c1 (diff) | |
download | network-manager-applet-397d5541c0a0d785ab56891b131e2ceb6fe6a643.tar.gz |
applet: merge branch 'bg/menu-wifi-scan-bgo774848'
https://bugzilla.gnome.org/show_bug.cgi?id=774848
-rw-r--r-- | src/applet-device-wifi.c | 3 | ||||
-rw-r--r-- | src/applet.c | 138 | ||||
-rw-r--r-- | src/applet.h | 2 |
3 files changed, 107 insertions, 36 deletions
diff --git a/src/applet-device-wifi.c b/src/applet-device-wifi.c index 7b706212..98fe6a2d 100644 --- a/src/applet-device-wifi.c +++ b/src/applet-device-wifi.c @@ -1177,8 +1177,9 @@ access_point_removed_cb (NMDeviceWifi *device, if (old == ap) { _active_ap_set (applet, (NMDevice *) device, NULL); applet_schedule_update_icon (applet); - applet_schedule_update_menu (applet); } + + applet_schedule_update_menu (applet); } static void diff --git a/src/applet.c b/src/applet.c index 43eb85dd..dda73119 100644 --- a/src/applet.c +++ b/src/applet.c @@ -66,6 +66,42 @@ G_DEFINE_TYPE (NMApplet, nma, G_TYPE_APPLICATION) /********************************************************************/ +static gboolean +applet_request_wifi_scan (NMApplet *applet) +{ + const GPtrArray *devices; + NMDevice *device; + int i; + + g_debug ("requesting wifi scan"); + + /* Request scan for all wifi devices */ + devices = nm_client_get_devices (applet->nm_client); + for (i = 0; devices && i < devices->len; i++) { + device = g_ptr_array_index (devices, i); + if (NM_IS_DEVICE_WIFI (device)) + nm_device_wifi_request_scan ((NMDeviceWifi *) device, NULL, NULL); + } + + return G_SOURCE_CONTINUE; +} + +static void +applet_start_wifi_scan (NMApplet *applet, gpointer unused) +{ + nm_clear_g_source (&applet->wifi_scan_id); + applet->wifi_scan_id = g_timeout_add_seconds (15, + (GSourceFunc) applet_request_wifi_scan, + applet); + applet_request_wifi_scan (applet); +} + +static void +applet_stop_wifi_scan (NMApplet *applet, gpointer unused) +{ + nm_clear_g_source (&applet->wifi_scan_id); +} + static inline NMADeviceClass * get_device_class (NMDevice *device, NMApplet *applet) { @@ -1641,6 +1677,8 @@ nma_menu_deactivate_cb (GtkWidget *widget, NMApplet *applet) g_idle_add_full (G_PRIORITY_LOW, destroy_old_menu, applet->menu, NULL); applet->menu = NULL; + applet_stop_wifi_scan (applet, NULL); + /* Re-set the tooltip */ gtk_status_icon_set_tooltip_text (applet->status_icon, applet->tip); } @@ -1788,23 +1826,23 @@ applet_connection_info_cb (NMApplet *applet) } /* - * nma_context_menu_create + * nma_context_menu_populate * - * Generate the contextual popup menu. + * Populate the contextual popup menu. * */ -static GtkWidget *nma_context_menu_create (NMApplet *applet) +static void nma_context_menu_populate (NMApplet *applet, GtkMenu *menu) { - GtkMenuShell *menu; + GtkMenuShell *menu_shell; guint id; static gboolean icons_shown = FALSE; - g_return_val_if_fail (applet != NULL, NULL); + g_return_if_fail (applet != NULL); - menu = GTK_MENU_SHELL (gtk_menu_new ()); + menu_shell = GTK_MENU_SHELL (menu); if (G_UNLIKELY (icons_shown == FALSE)) { - GtkSettings *settings = gtk_widget_get_settings (GTK_WIDGET (menu)); + GtkSettings *settings = gtk_widget_get_settings (GTK_WIDGET (menu_shell)); /* We always want our icons displayed */ if (settings) @@ -1819,7 +1857,7 @@ static GtkWidget *nma_context_menu_create (NMApplet *applet) G_CALLBACK (nma_set_networking_enabled_cb), applet); applet->networking_enabled_toggled_id = id; - gtk_menu_shell_append (menu, applet->networking_enabled_item); + gtk_menu_shell_append (menu_shell, applet->networking_enabled_item); /* 'Enable Wi-Fi' item */ applet->wifi_enabled_item = gtk_check_menu_item_new_with_mnemonic (_("Enable _Wi-Fi")); @@ -1828,7 +1866,7 @@ static GtkWidget *nma_context_menu_create (NMApplet *applet) G_CALLBACK (nma_set_wifi_enabled_cb), applet); applet->wifi_enabled_toggled_id = id; - gtk_menu_shell_append (menu, applet->wifi_enabled_item); + gtk_menu_shell_append (menu_shell, applet->wifi_enabled_item); /* 'Enable Mobile Broadband' item */ applet->wwan_enabled_item = gtk_check_menu_item_new_with_mnemonic (_("Enable _Mobile Broadband")); @@ -1837,9 +1875,9 @@ static GtkWidget *nma_context_menu_create (NMApplet *applet) G_CALLBACK (nma_set_wwan_enabled_cb), applet); applet->wwan_enabled_toggled_id = id; - gtk_menu_shell_append (menu, applet->wwan_enabled_item); + gtk_menu_shell_append (menu_shell, applet->wwan_enabled_item); - nma_menu_add_separator_item (GTK_WIDGET (menu)); + nma_menu_add_separator_item (GTK_WIDGET (menu_shell)); if (!INDICATOR_ENABLED (applet)) { /* Toggle notifications item */ @@ -1849,9 +1887,9 @@ static GtkWidget *nma_context_menu_create (NMApplet *applet) G_CALLBACK (nma_set_notifications_enabled_cb), applet); applet->notifications_enabled_toggled_id = id; - gtk_menu_shell_append (menu, applet->notifications_enabled_item); + gtk_menu_shell_append (menu_shell, applet->notifications_enabled_item); - nma_menu_add_separator_item (GTK_WIDGET (menu)); + nma_menu_add_separator_item (GTK_WIDGET (menu_shell)); } /* 'Connection Information' item */ @@ -1860,7 +1898,7 @@ static GtkWidget *nma_context_menu_create (NMApplet *applet) "activate", G_CALLBACK (applet_connection_info_cb), applet); - gtk_menu_shell_append (menu, applet->info_menu_item); + gtk_menu_shell_append (menu_shell, applet->info_menu_item); /* 'Edit Connections...' item */ applet->connections_menu_item = gtk_menu_item_new_with_mnemonic (_("Edit Connections…")); @@ -1868,10 +1906,10 @@ static GtkWidget *nma_context_menu_create (NMApplet *applet) "activate", G_CALLBACK (nma_edit_connections_cb), applet); - gtk_menu_shell_append (menu, applet->connections_menu_item); + gtk_menu_shell_append (menu_shell, applet->connections_menu_item); /* Separator */ - nma_menu_add_separator_item (GTK_WIDGET (menu)); + nma_menu_add_separator_item (GTK_WIDGET (menu_shell)); if (!INDICATOR_ENABLED (applet)) { /* About item */ @@ -1879,12 +1917,10 @@ static GtkWidget *nma_context_menu_create (NMApplet *applet) menu_item = gtk_menu_item_new_with_mnemonic (_("_About")); g_signal_connect_swapped (menu_item, "activate", G_CALLBACK (applet_about_dialog_show), applet); - gtk_menu_shell_append (menu, menu_item); + gtk_menu_shell_append (menu_shell, menu_item); } - gtk_widget_show_all (GTK_WIDGET (menu)); - - return GTK_WIDGET (menu); + gtk_widget_show_all (GTK_WIDGET (menu_shell)); } typedef struct { @@ -1985,20 +2021,48 @@ applet_add_default_connection_item (NMDevice *device, } static gboolean -applet_update_indicator_menu (gpointer user_data) +applet_update_menu (gpointer user_data) { NMApplet *applet = NM_APPLET (user_data); + GList *children, *elt; + GtkMenu *menu; + + if (INDICATOR_ENABLED (applet)) { #ifdef WITH_APPINDICATOR - GtkWidget *menu; + menu = app_indicator_get_menu (applet->app_indicator); + if (!menu) { + menu = GTK_MENU (gtk_menu_new ()); + app_indicator_set_menu (applet->app_indicator, menu); + g_signal_connect_swapped (menu, "show", G_CALLBACK (applet_start_wifi_scan), applet); + g_signal_connect_swapped (menu, "hide", G_CALLBACK (applet_stop_wifi_scan), applet); + } +#else + g_return_val_if_reached (G_SOURCE_REMOVE); +#endif /* WITH_APPINDICATOR */ + } else { + menu = GTK_MENU (applet->menu); + if (!menu) { + /* Menu not open */ + goto out; + } + } - menu = nma_context_menu_create (applet); - nma_menu_show_cb (menu, applet); - nma_menu_add_separator_item (menu); - nma_context_menu_update (applet); + /* Clear all entries */ + children = gtk_container_get_children (GTK_CONTAINER (menu)); + for (elt = children; elt; elt = g_list_next (elt)) + gtk_container_remove (GTK_CONTAINER (menu), GTK_WIDGET (elt->data)); + g_list_free (children); - app_indicator_set_menu (applet->app_indicator, GTK_MENU (menu)); -#endif /* WITH_APPINDICATOR */ + /* Update the menu */ + if (INDICATOR_ENABLED (applet)) { + nma_context_menu_populate (applet, menu); + nma_menu_show_cb (GTK_WIDGET (menu), applet); + nma_menu_add_separator_item (GTK_WIDGET (menu)); + nma_context_menu_update (applet); + } else + nma_menu_show_cb (GTK_WIDGET (menu), applet); +out: applet->update_menu_id = 0; return G_SOURCE_REMOVE; } @@ -2006,10 +2070,8 @@ applet_update_indicator_menu (gpointer user_data) void applet_schedule_update_menu (NMApplet *applet) { - if (INDICATOR_ENABLED (applet)) { - if (!applet->update_menu_id) - applet->update_menu_id = g_idle_add (applet_update_indicator_menu, applet); - } + if (!applet->update_menu_id) + applet->update_menu_id = g_idle_add (applet_update_menu, applet); } /*****************************************************************************/ @@ -3083,6 +3145,8 @@ status_icon_activate_cb (GtkStatusIcon *icon, NMApplet *applet) */ applet_clear_notify (applet); + applet_start_wifi_scan (applet, NULL); + /* Kill any old menu */ if (applet->menu) g_object_unref (applet->menu); @@ -3122,6 +3186,8 @@ status_icon_popup_menu_cb (GtkStatusIcon *icon, static gboolean setup_widgets (NMApplet *applet) { + GtkMenu *menu; + #ifdef WITH_APPINDICATOR if (with_appindicator) { applet->app_indicator = app_indicator_new ("nm-applet", @@ -3150,7 +3216,9 @@ setup_widgets (NMApplet *applet) g_signal_connect (applet->status_icon, "popup-menu", G_CALLBACK (status_icon_popup_menu_cb), applet); - applet->context_menu = nma_context_menu_create (applet); + menu = GTK_MENU (gtk_menu_new ()); + nma_context_menu_populate (applet, menu); + applet->context_menu = GTK_WIDGET (menu); if (!applet->context_menu) return FALSE; } @@ -3308,8 +3376,8 @@ static void finalize (GObject *object) #endif g_slice_free (NMADeviceClass, applet->bt_class); - if (applet->update_icon_id) - g_source_remove (applet->update_icon_id); + nm_clear_g_source (&applet->update_icon_id); + nm_clear_g_source (&applet->wifi_scan_id); #ifdef WITH_APPINDICATOR g_clear_object (&applet->app_indicator); diff --git a/src/applet.h b/src/applet.h index b28dfa2c..5392a3eb 100644 --- a/src/applet.h +++ b/src/applet.h @@ -145,6 +145,8 @@ typedef struct { /* Tracker objects for secrets requests */ GSList * secrets_reqs; + + guint wifi_scan_id; } NMApplet; typedef void (*AppletNewAutoConnectionCallback) (NMConnection *connection, |