[network-manager-applet/dcbw/applet-async-update: 2/2] adsfsadf
- From: Dan Williams <dcbw src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [network-manager-applet/dcbw/applet-async-update: 2/2] adsfsadf
- Date: Mon, 10 Jul 2017 17:50:10 +0000 (UTC)
commit 16d3108c26a997a649b20e7c188313fb3606e5d4
Author: Dan Williams <dcbw redhat com>
Date: Mon Jul 10 12:49:06 2017 -0500
adsfsadf
src/applet.c | 246 ++++++++++++++++++++++++++++------------------------------
1 files changed, 119 insertions(+), 127 deletions(-)
---
diff --git a/src/applet.c b/src/applet.c
index 0bd4d0a..8b46f0d 100644
--- a/src/applet.c
+++ b/src/applet.c
@@ -1502,34 +1502,10 @@ nma_menu_add_vpn_submenu (GtkWidget *menu, NMApplet *applet)
}
-static gboolean
-has_usable_wifi (NMApplet *applet)
-{
- const GPtrArray *devices;
- int i;
-
- if (!nm_client_wireless_get_enabled (applet->nm_client))
- return FALSE;
-
- devices = nm_client_get_devices (applet->nm_client);
- if (!devices)
- return FALSE;
-
- for (i = 0; i < devices->len; i++) {
- NMDevice *device = devices->pdata[i];
-
- if ( NM_IS_DEVICE_WIFI (device)
- && (nm_device_get_state (device) >= NM_DEVICE_STATE_DISCONNECTED))
- return TRUE;
- }
-
- return FALSE;
-}
-
/*
* nma_menu_show_cb
*
- * Pop up the wifi networks menu
+ * Pop up the network menu
*
*/
static void nma_menu_show_cb (GtkWidget *menu, NMApplet *applet)
@@ -1540,52 +1516,26 @@ static void nma_menu_show_cb (GtkWidget *menu, NMApplet *applet)
if (applet->status_icon)
gtk_status_icon_set_tooltip_text (applet->status_icon, NULL);
- if (!nm_client_get_nm_running (applet->nm_client)) {
- nma_menu_add_text_item (menu, _("NetworkManager is not running…"));
- return;
- }
-
- if (nm_client_get_state (applet->nm_client) == NM_STATE_ASLEEP) {
- nma_menu_add_text_item (menu, _("Networking disabled"));
- return;
- }
-
- nma_menu_add_devices (menu, applet);
- nma_menu_add_vpn_submenu (menu, applet);
+ /* Have clicking on the applet act also as acknowledgement
+ * of the notification.
+ */
+ applet_clear_notify (applet);
- if (has_usable_wifi (applet)) {
- /* Add the "Hidden Wi-Fi network..." entry */
- nma_menu_add_separator_item (menu);
- nma_menu_add_hidden_network_item (menu, applet);
- nma_menu_add_create_network_item (menu, applet);
- }
+ applet_start_wifi_scan (applet, NULL);
if (!INDICATOR_ENABLED (applet))
gtk_widget_show_all (menu);
}
-static gboolean
-destroy_old_menu (gpointer user_data)
-{
- g_object_unref (user_data);
- return FALSE;
-}
-
static void
nma_menu_deactivate_cb (GtkWidget *widget, NMApplet *applet)
{
- /* Must punt the destroy to a low-priority idle to ensure that
- * the menu items don't get destroyed before any 'activate' signal
- * fires for an item.
- */
- g_signal_handlers_disconnect_by_func (applet->menu, G_CALLBACK (nma_menu_deactivate_cb), applet);
- g_idle_add_full (G_PRIORITY_LOW, destroy_old_menu, applet->menu, NULL);
- applet->menu = NULL;
+ GtkMenu *menu = GTK_MENU (widget);
+ g_signal_handlers_disconnect_by_func (menu, G_CALLBACK (nma_menu_deactivate_cb), applet);
applet_stop_wifi_scan (applet, NULL);
-
- /* Re-set the tooltip */
- gtk_status_icon_set_tooltip_text (applet->status_icon, applet->tip);
+ if (applet->status_icon)
+ gtk_status_icon_set_tooltip_text (applet->status_icon, applet->tip);
}
typedef struct {
@@ -1685,41 +1635,32 @@ applet_add_default_connection_item (NMDevice *device,
gtk_menu_shell_append (GTK_MENU_SHELL (menu), item);
}
-static gboolean
-applet_update_menu (gpointer user_data)
+static GtkMenu *
+applet_get_menu (NMApplet *applet)
{
- NMApplet *applet = NM_APPLET (user_data);
- GList *children, *elt;
- GtkMenu *menu;
-
if (INDICATOR_ENABLED (applet)) {
#ifdef WITH_APPINDICATOR
- 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);
- }
+ return app_indicator_get_menu (applet->app_indicator);
#else
- g_return_val_if_reached (G_SOURCE_REMOVE);
+ g_return_val_if_reached (NULL);
#endif /* WITH_APPINDICATOR */
- } else {
- menu = GTK_MENU (applet->menu);
- if (!menu) {
- /* Menu not open */
- goto out;
- }
}
- /* 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);
+ return GTK_MENU (applet->menu);
+}
+
+static gboolean
+applet_update_menu (gpointer user_data)
+{
+ NMApplet *applet = NM_APPLET (user_data);
+ GtkMenu *menu;
+
+ menu = applet_get_menu (applet);
- /* Update the menu */
if (INDICATOR_ENABLED (applet)) {
+ /* Show the network menu; indicator only gets one menu so
+ * the context menu items are added to the bottom.
+ */
nma_menu_show_cb (GTK_WIDGET (menu), applet);
nma_menu_add_separator_item (GTK_WIDGET (menu));
nma_context_menu_populate (applet, menu);
@@ -1727,7 +1668,6 @@ applet_update_menu (gpointer user_data)
} else
nma_menu_show_cb (GTK_WIDGET (menu), applet);
-out:
applet->update_menu_id = 0;
return G_SOURCE_REMOVE;
}
@@ -2818,45 +2758,22 @@ status_icon_size_changed_cb (GtkStatusIcon *icon,
}
static void
-status_icon_activate_cb (GtkStatusIcon *icon, NMApplet *applet)
+status_icon_show_network_menu_cb (GtkStatusIcon *icon, NMApplet *applet)
{
- /* Have clicking on the applet act also as acknowledgement
- * of the notification.
- */
applet_clear_notify (applet);
-
applet_start_wifi_scan (applet, NULL);
-
- /* Kill any old menu */
- if (applet->menu)
- g_object_unref (applet->menu);
-
- /* And make a fresh new one */
- applet->menu = gtk_menu_new ();
- /* Sink the ref so we can explicitly destroy the menu later */
- g_object_ref_sink (G_OBJECT (applet->menu));
-
- gtk_container_set_border_width (GTK_CONTAINER (applet->menu), 0);
- g_signal_connect (applet->menu, "show", G_CALLBACK (nma_menu_show_cb), applet);
- g_signal_connect (applet->menu, "deactivate", G_CALLBACK (nma_menu_deactivate_cb), applet);
-
- /* Display the new menu */
- gtk_menu_popup (GTK_MENU (applet->menu), NULL, NULL,
+ gtk_menu_popup (applet_get_menu (applet), NULL, NULL,
gtk_status_icon_position_menu, icon,
1, gtk_get_current_event_time ());
}
static void
-status_icon_popup_menu_cb (GtkStatusIcon *icon,
- guint button,
- guint32 activate_time,
- NMApplet *applet)
+status_icon_show_context_menu_cb (GtkStatusIcon *icon,
+ guint button,
+ guint32 activate_time,
+ NMApplet *applet)
{
- /* Have clicking on the applet act also as acknowledgement
- * of the notification.
- */
applet_clear_notify (applet);
-
nma_context_menu_update (applet);
gtk_menu_popup (GTK_MENU (applet->context_menu), NULL, NULL,
gtk_status_icon_position_menu, icon,
@@ -2864,17 +2781,83 @@ status_icon_popup_menu_cb (GtkStatusIcon *icon,
}
static gboolean
+has_usable_wifi (NMApplet *applet)
+{
+ const GPtrArray *devices;
+ int i;
+
+ if (!nm_client_wireless_get_enabled (applet->nm_client))
+ return FALSE;
+
+ devices = nm_client_get_devices (applet->nm_client);
+ if (!devices)
+ return FALSE;
+
+ for (i = 0; i < devices->len; i++) {
+ NMDevice *device = devices->pdata[i];
+
+ if ( NM_IS_DEVICE_WIFI (device)
+ && (nm_device_get_state (device) >= NM_DEVICE_STATE_DISCONNECTED))
+ return TRUE;
+ }
+
+ return FALSE;
+}
+
+/* Create the initial network menu; it will be updated asynchronously
+ * based on libnm events.
+ */
+static GtkWidget *
+applet_network_menu_new (NMApplet *applet)
+{
+ GtkWidget *menu;
+
+ menu = gtk_menu_new ();
+ gtk_container_set_border_width (GTK_CONTAINER (menu), 0);
+
+ if (!nm_client_get_nm_running (applet->nm_client)) {
+ nma_menu_add_text_item (menu, _("NetworkManager is not running…"));
+ return menu;
+ }
+
+ if (nm_client_get_state (applet->nm_client) == NM_STATE_ASLEEP) {
+ nma_menu_add_text_item (menu, _("Networking disabled"));
+ return menu;
+ }
+
+ nma_menu_add_devices (menu, applet);
+ nma_menu_add_vpn_submenu (menu, applet);
+
+ if (has_usable_wifi (applet)) {
+ /* Add the "Hidden Wi-Fi network..." entry */
+ nma_menu_add_separator_item (menu);
+ nma_menu_add_hidden_network_item (menu, applet);
+ nma_menu_add_create_network_item (menu, applet);
+ }
+
+ /* Start/stop wifi scans when the menu is dropped down and cleared */
+ 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);
+
+ return menu;
+}
+
+static gboolean
setup_widgets (NMApplet *applet)
{
#ifdef WITH_APPINDICATOR
if (with_appindicator) {
+ GtkMenu *network_menu;
+
applet->app_indicator = app_indicator_new ("nm-applet",
"nm-no-connection",
APP_INDICATOR_CATEGORY_SYSTEM_SERVICES);
if (!applet->app_indicator)
return FALSE;
app_indicator_set_title(applet->app_indicator, _("Network"));
- applet_schedule_update_menu (applet);
+
+ network_menu = GTK_MENU (applet_network_menu_new (applet));
+ app_indicator_set_menu (applet->app_indicator, network_menu);
}
#endif /* WITH_APPINDICATOR */
@@ -2882,6 +2865,9 @@ setup_widgets (NMApplet *applet)
if (!INDICATOR_ENABLED (applet)) {
applet->status_icon = gtk_status_icon_new ();
+ /* Set an unrecognized status icon name so that GNOME Shell doesn't
+ * hide the applet. Only for debugging.
+ */
if (shell_debug)
gtk_status_icon_set_name (applet->status_icon, "adsfasdfasdfadfasdf");
@@ -2890,10 +2876,16 @@ setup_widgets (NMApplet *applet)
g_signal_connect (applet->status_icon, "size-changed",
G_CALLBACK (status_icon_size_changed_cb), applet);
g_signal_connect (applet->status_icon, "activate",
- G_CALLBACK (status_icon_activate_cb), applet);
+ G_CALLBACK (status_icon_show_network_menu_cb), applet);
g_signal_connect (applet->status_icon, "popup-menu",
- G_CALLBACK (status_icon_popup_menu_cb), applet);
+ G_CALLBACK (status_icon_show_context_menu_cb), applet);
+
+ /* Create the network menu */
+ applet->menu = applet_network_menu_new (applet);
+ g_signal_connect (applet->menu, "show", G_CALLBACK (nma_menu_show_cb), applet);
+ g_signal_connect (applet->menu, "deactivate", G_CALLBACK (nma_menu_deactivate_cb), applet);
+ /* Create the context menu */
applet->context_menu = gtk_menu_new ();
nma_context_menu_populate (applet, GTK_MENU (applet->context_menu));
}
@@ -2989,14 +2981,6 @@ applet_startup (GApplication *app, gpointer user_data)
foo_client_setup (applet);
- /* Load pixmaps and create applet widgets */
- if (!setup_widgets (applet)) {
- g_warning ("Could not initialize applet widgets.");
- g_application_quit (app);
- return;
- }
- g_assert (INDICATOR_ENABLED (applet) || applet->status_icon);
-
applet->icon_cache = g_hash_table_new_full (g_str_hash,
g_str_equal,
g_free,
@@ -3025,6 +3009,14 @@ applet_startup (GApplication *app, gpointer user_data)
mm1_client_setup (applet);
#endif
+ /* Load pixmaps and create applet widgets */
+ if (!setup_widgets (applet)) {
+ g_warning ("Could not initialize applet widgets.");
+ g_application_quit (app);
+ return;
+ }
+ g_assert (INDICATOR_ENABLED (applet) || applet->status_icon);
+
if (applet->status_icon) {
/* Track embedding to help debug issues where user has removed the
* notification area applet from the panel, and thus nm-applet too.
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]