summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBeniamino Galvani <bgalvani@redhat.com>2017-04-05 14:23:33 +0200
committerBeniamino Galvani <bgalvani@redhat.com>2017-04-05 14:23:33 +0200
commit397d5541c0a0d785ab56891b131e2ceb6fe6a643 (patch)
treeaebe896e676c23ed40a3ee0988a6788422251bb0
parente34efe17239dfafa6a66f1ea51498278aac8cd4a (diff)
parent0ab08a566177f527daaf9ae5f068b28d934419c1 (diff)
downloadnetwork-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.c3
-rw-r--r--src/applet.c138
-rw-r--r--src/applet.h2
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,