Sign Up
Log In
Log In
or
Sign Up
Places
All Projects
Status Monitor
Collapse sidebar
openSUSE:Leap:42.2:Ports
NetworkManager-gnome
nm-applet-app-indicator.patch
Overview
Repositories
Revisions
Requests
Users
Attributes
Meta
File nm-applet-app-indicator.patch of Package NetworkManager-gnome
diff --git a/configure.ac b/configure.ac index d930ff7..76dfc8c 100644 --- a/configure.ac +++ b/configure.ac @@ -156,6 +156,13 @@ with_firewalld="$withval",with_firewalld=yes) AM_CONDITIONAL(HAVE_FIREWALLD, test x"with_firewalld" = "xyes") +AC_ARG_WITH([appindicator], AS_HELP_STRING([--with-appindicator|--without-appindicator], [Build with libappindicator support instead of xembed systray support.])) +if test "$with_appindicator" == "yes"; then + PKG_CHECK_MODULES(APPINDICATOR, appindicator3-0.1) + AC_DEFINE([ENABLE_INDICATOR], 1, [Enable using libappindicator]) +fi + + dnl ModemManager1 with libmm-glib AC_ARG_WITH(modem-manager-1, AS_HELP_STRING([--with-modem-manager-1], [Enable new ModemManager1 interface support]),,[with_modem_manager_1=auto]) if (test "${with_modem_manager_1}" != "no"); then diff --git a/src/Makefile.am b/src/Makefile.am index 1986b3e..098a5b3 100644 --- a/src/Makefile.am +++ b/src/Makefile.am \ @@ -7,6 +7,7 @@ $(NMA_CFLAGS) \ $(LIBSECRET_CFLAGS) \ $(NOTIFY_CFLAGS) \ + $(APPINDICATOR_CFLAGS) \ -DNM_VERSION_MIN_REQUIRED=NM_VERSION_1_0 \ -DNM_VERSION_MAX_ALLOWED=NM_VERSION_1_0 \ -DICONDIR=\""$(datadir)/icons"\" \ @@ -78,6 +79,7 @@ $(NMA_LIBS) \ $(LIBSECRET_LIBS) \ $(NOTIFY_LIBS) \ + $(APPINDICATOR_LIBS) \ ${top_builddir}/src/marshallers/libmarshallers.la \ ${top_builddir}/src/utils/libutils.la \ ${top_builddir}/src/wireless-security/libwireless-security.la \ diff --git a/src/ap-menu-item.c b/src/ap-menu-item.c index 1f096c7..b2f0ab4 100644 --- a/src/ap-menu-item.c +++ b/src/ap-menu-item.c @@ -36,9 +36,28 @@ G_DEFINE_TYPE (NMNetworkMenuItem, nm_network_menu_item, GTK_TYPE_IMAGE_MENU_ITEM); +#define NM_NETWORK_MENU_ITEM_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_NETWORK_MENU_ITEM, NMNetworkMenuItemPrivate)) + +typedef struct { +#ifndef ENABLE_INDICATOR + GtkWidget * ssid; + GtkWidget * strength; + GtkWidget * hbox; +#endif + + char * ssid_string; + guint32 int_strength; + gchar * hash; + GSList * dupes; + gboolean has_connections; + gboolean is_adhoc; + gboolean is_encrypted; +} NMNetworkMenuItemPrivate; + static void nm_network_menu_item_init (NMNetworkMenuItem * item) { +#ifndef ENABLE_INDICATOR item->hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 6); item->ssid = gtk_label_new (NULL); gtk_misc_set_alignment (GTK_MISC (item->ssid), 0.0, 0.5); @@ -52,10 +71,16 @@ nm_network_menu_item_init (NMNetworkMenuItem * item) item->strength = gtk_image_new (); gtk_box_pack_end (GTK_BOX (item->hbox), item->strength, FALSE, TRUE, 0); - gtk_widget_show (item->ssid); - gtk_widget_show (item->strength); - gtk_widget_show (item->detail); - gtk_widget_show (item->hbox); + priv->strength = gtk_image_new (); + gtk_box_pack_end (GTK_BOX (priv->hbox), priv->strength, FALSE, TRUE, 0); + gtk_widget_show (priv->strength); + + gtk_widget_show (priv->ssid); + gtk_widget_show (priv->detail); + gtk_widget_show (priv->hbox); +#else + gtk_image_menu_item_set_always_show_image (GTK_IMAGE_MENU_ITEM (item), TRUE); +#endif } GtkWidget* @@ -82,11 +107,6 @@ nm_network_menu_item_dispose (GObject *object) return; } - gtk_widget_destroy (item->ssid); - gtk_widget_destroy (item->strength); - gtk_widget_destroy (item->detail); - gtk_widget_destroy (item->hbox); - item->destroyed = TRUE; g_free (item->hash); g_free (item->ssid_string); @@ -116,11 +136,16 @@ nm_network_menu_item_set_ssid (NMNetworkMenuItem *item, GByteArray *ssid) g_free (item->ssid_string); item->ssid_string = nm_utils_ssid_to_utf8 (ssid); + if (!item->ssid_string) { // FIXME: shouldn't happen; always coerce the SSID to _something_ item->ssid_string = g_strdup ("<unknown>"); } +#ifndef ENABLE_INDICATOR gtk_label_set_text (GTK_LABEL (item->ssid), item->ssid_string); +#else + nm_network_menu_item_set_active(item, FALSE); +#endif } const char * @@ -147,6 +172,7 @@ nm_network_menu_item_best_strength (NMNetworkMenuItem * item, NMApplet *applet) { GdkPixbuf *icon = NULL, *pixbuf, *top; + const char *icon_name = NULL; g_return_if_fail (item != NULL); g_return_if_fail (NM_IS_NETWORK_MENU_ITEM (item)); @@ -158,17 +184,19 @@ nm_network_menu_item_best_strength (NMNetworkMenuItem * item, return; item->int_strength = strength; - + if (strength > 80) - icon = nma_icon_check_and_load ("nm-signal-100", applet); + icon_name = "nm-signal-100"; else if (strength > 55) - icon = nma_icon_check_and_load ("nm-signal-75", applet); + icon_name = "nm-signal-75"; else if (strength > 30) - icon = nma_icon_check_and_load ("nm-signal-50", applet); + icon_name = "nm-signal-50"; else if (strength > 5) - icon = nma_icon_check_and_load ("nm-signal-25", applet); + icon_name = "nm-signal-25"; else - icon = nma_icon_check_and_load ("nm-signal-00", applet); + icon_name = "nm-signal-00"; + + icon = nma_icon_check_and_load (icon_name, applet); pixbuf = gdk_pixbuf_copy (icon); @@ -182,16 +210,28 @@ nm_network_menu_item_best_strength (NMNetworkMenuItem * item, } /* Scale to menu size if larger so the menu doesn't look awful */ - if (gdk_pixbuf_get_height (pixbuf) > 24 || gdk_pixbuf_get_width (pixbuf) > 24) { + if (gdk_pixbuf_get_height (pixbuf) > 40 || gdk_pixbuf_get_width (pixbuf) > 40) { GdkPixbuf *scaled; - scaled = gdk_pixbuf_scale_simple (pixbuf, 24, 24, GDK_INTERP_BILINEAR); + scaled = gdk_pixbuf_scale_simple (pixbuf, 40, 40, GDK_INTERP_BILINEAR); g_object_unref (pixbuf); pixbuf = scaled; } - +#ifdef ENABLE_INDICATOR +#ifdef DBUSMENU_PIXMAP_SUPPORT + gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (item), gtk_image_new_from_pixbuf (icon)); +#else + gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (item), + gtk_image_new_from_icon_name (icon_name, GTK_ICON_SIZE_MENU)); +#endif + /* For some reason we must always re-set always-show after setting the image */ + gtk_image_menu_item_set_always_show_image (GTK_IMAGE_MENU_ITEM (item), TRUE); +#else gtk_image_set_from_pixbuf (GTK_IMAGE (item->strength), pixbuf); +#endif + g_object_unref (pixbuf); + } const char * @@ -223,9 +263,10 @@ nm_network_menu_item_set_detail (NMNetworkMenuItem *item, item->is_encrypted = TRUE; if (nm_access_point_get_mode (ap) == NM_802_11_MODE_ADHOC) { - GdkPixbuf *scaled = NULL; item->is_adhoc = is_adhoc = TRUE; +#ifndef ENABLE_INDICATOR + GdkPixbuf *scaled = NULL; if (gdk_pixbuf_get_height (adhoc_icon) > 24 || gdk_pixbuf_get_width (adhoc_icon) > 24) scaled = gdk_pixbuf_scale_simple (adhoc_icon, 24, 24, GDK_INTERP_BILINEAR); @@ -233,6 +274,7 @@ nm_network_menu_item_set_detail (NMNetworkMenuItem *item, gtk_image_set_from_pixbuf (GTK_IMAGE (item->detail), scaled ? scaled : adhoc_icon); g_clear_object (&scaled); +#endif } else gtk_image_set_from_stock (GTK_IMAGE (item->detail), NULL, GTK_ICON_SIZE_MENU); @@ -267,21 +309,29 @@ nm_network_menu_item_find_dupe (NMNetworkMenuItem *item, NMAccessPoint *ap) return FALSE; } -void -nm_network_menu_item_set_active (NMNetworkMenuItem *item, gboolean active) +static void +update_label (NMNetworkMenuItem *item, gboolean use_bold) { - char *markup; - g_return_if_fail (item != NULL); - g_return_if_fail (NM_IS_NETWORK_MENU_ITEM (item)); +#ifdef ENABLE_INDICATOR + gtk_menu_item_set_label (GTK_MENU_ITEM (item), item->ssid_string); +#else + NMNetworkMenuItemPrivate *priv = NM_NETWORK_MENU_ITEM_GET_PRIVATE (item); + gtk_label_set_use_markup (GTK_LABEL (priv->ssid), use_bold); + if (use_bold) { + char *markup = g_markup_printf_escaped ("<b>%s</b>", priv->ssid_string); - gtk_label_set_use_markup (GTK_LABEL (item->ssid), active); - if (active) { - markup = g_markup_printf_escaped ("<b>%s</b>", item->ssid_string); - gtk_label_set_markup (GTK_LABEL (item->ssid), markup); + gtk_label_set_markup (GTK_LABEL (priv->ssid), markup); g_free (markup); } else - gtk_label_set_text (GTK_LABEL (item->ssid), item->ssid_string); + gtk_label_set_text (GTK_LABEL (priv->ssid), priv->ssid_string); +#endif +} + +void +nm_network_menu_item_set_active (NMNetworkMenuItem *item, gboolean active) +{ + update_label (item, active); } void diff --git a/src/applet-device-broadband.c b/src/applet-device-broadband.c index b302608..e453251 100644 --- a/src/applet-device-broadband.c +++ b/src/applet-device-broadband.c @@ -829,6 +829,7 @@ signal_quality_updated (GObject *object, BroadbandDeviceInfo *info) { applet_schedule_update_icon (info->applet); + applet_schedule_update_menu (info->applet); } static void @@ -837,6 +838,7 @@ access_technologies_updated (GObject *object, BroadbandDeviceInfo *info) { applet_schedule_update_icon (info->applet); + applet_schedule_update_menu (info->applet); } static void diff --git a/src/applet-device-wifi.c b/src/applet-device-wifi.c index 0ae44ad..1078feb 100644 --- a/src/applet-device-wifi.c +++ b/src/applet-device-wifi.c @@ -550,12 +550,12 @@ create_new_ap_item (NMDeviceWifi *device, item = NM_NETWORK_MENU_ITEM (nm_network_menu_item_new (dup_data->hash, !!g_slist_length (ap_connections))); - gtk_image_menu_item_set_always_show_image (GTK_IMAGE_MENU_ITEM (item), TRUE); ssid = nm_access_point_get_ssid (ap); nm_network_menu_item_set_ssid (item, (GByteArray *) ssid); dev_caps = nm_device_wifi_get_capabilities (device); + gtk_image_menu_item_set_always_show_image (GTK_IMAGE_MENU_ITEM (item), TRUE); nm_network_menu_item_set_detail (item, ap, nma_icon_check_and_load ("nm-adhoc", applet), dev_caps); nm_network_menu_item_best_strength (item, nm_access_point_get_strength (ap), applet); nm_network_menu_item_add_dupe (item, ap); @@ -1081,6 +1081,7 @@ access_point_added_cb (NMDeviceWifi *device, applet); queue_avail_access_point_notification (NM_DEVICE (device)); + applet_schedule_update_menu (applet); } static void @@ -1098,6 +1099,7 @@ access_point_removed_cb (NMDeviceWifi *device, if (old == ap) { g_object_set_data (G_OBJECT (device), ACTIVE_AP_TAG, NULL); applet_schedule_update_icon (applet); + applet_schedule_update_menu (applet); } } diff --git a/src/applet-device-wimax.c b/src/applet-device-wimax.c index 1741b2f..a23cecd 100644 --- a/src/applet-device-wimax.c +++ b/src/applet-device-wimax.c @@ -296,7 +296,10 @@ wimax_add_menu_item (NMDevice *device, static void nsp_quality_changed (NMWimaxNsp *nsp, GParamSpec *pspec, gpointer user_data) { - applet_schedule_update_icon (NM_APPLET (user_data)); + NMApplet *applet = NM_APPLET (user_data); + + applet_schedule_update_icon (applet); + applet_schedule_update_menu (applet); } static NMWimaxNsp * @@ -358,8 +361,11 @@ active_nsp_changed_cb (NMDeviceWimax *device, if (!s_wimax) return; - if (g_strcmp0 (nm_wimax_nsp_get_name (new), nm_setting_wimax_get_network_name (s_wimax)) != 0) - applet_schedule_update_icon (applet); + if (g_strcmp0 (nm_wimax_nsp_get_name (new), nm_setting_wimax_get_network_name (s_wimax)) == 0) + return; + + applet_schedule_update_icon (applet); + applet_schedule_update_menu (applet); } static void @@ -367,15 +373,16 @@ nsp_removed_cb (NMDeviceWimax *device, NMWimaxNsp *nsp, gpointer user_data) { - NMApplet *applet = NM_APPLET (user_data); - NMWimaxNsp *old; + NMApplet *applet = NM_APPLET (user_data); + + /* Ignore unkown nsp */ + if (g_object_get_data (G_OBJECT (device), ACTIVE_NSP_TAG) != nsp) + return; /* Clear the ACTIVE_NSP_TAG if the active NSP just got removed */ - old = g_object_get_data (G_OBJECT (device), ACTIVE_NSP_TAG); - if (old == nsp) { - g_object_set_data (G_OBJECT (device), ACTIVE_NSP_TAG, NULL); - applet_schedule_update_icon (applet); - } + g_object_set_data (G_OBJECT (device), ACTIVE_NSP_TAG, NULL); + applet_schedule_update_icon (applet); + applet_schedule_update_menu (applet); } static void diff --git a/src/applet.c b/src/applet.c index 39ea8e4..be4b68d 100644 --- a/src/applet.c +++ b/src/applet.c @@ -570,6 +570,8 @@ add_and_activate_cb (NMClient *client, GError *error, gpointer user_data) { + NMApplet *applet = NM_APPLET (user_data); + if (error) { const char *text = _("Failed to add/activate connection"); char *err_text = g_strdup_printf ("(%d) %s", error->code, @@ -580,7 +582,8 @@ add_and_activate_cb (NMClient *client, g_free (err_text); } - applet_schedule_update_icon (NM_APPLET (user_data)); + applet_schedule_update_icon (applet); + applet_schedule_update_menu (applet); } static void @@ -614,6 +617,8 @@ applet_menu_item_activate_helper_new_connection (NMConnection *connection, static void disconnect_cb (NMDevice *device, GError *error, gpointer user_data) { + NMApplet *applet = NM_APPLET (user_data); + if (error) { const char *text = _("Device disconnect failed"); char *err_text = g_strdup_printf ("(%d) %s", error->code, @@ -623,6 +628,9 @@ disconnect_cb (NMDevice *device, GError *error, gpointer user_data) utils_show_error_dialog (_("Disconnect failure"), text, err_text, FALSE, NULL); g_free (err_text); } + + applet_schedule_update_icon (applet); + applet_schedule_update_menu (applet); } void @@ -631,7 +639,7 @@ applet_menu_item_disconnect_helper (NMDevice *device, { g_return_if_fail (NM_IS_DEVICE (device)); - nm_device_disconnect (device, disconnect_cb, NULL); + nm_device_disconnect (device, disconnect_cb, applet); } static void @@ -701,6 +709,9 @@ applet_menu_item_add_complex_separator_helper (GtkWidget *menu, NMApplet *applet, const gchar* label) { +#ifdef ENABLE_INDICATOR + gtk_menu_shell_append (GTK_MENU_SHELL (menu), gtk_separator_menu_item_new ()); +#else GtkWidget *menu_item = gtk_image_menu_item_new (); GtkWidget *box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0); GtkWidget *xlabel = NULL; @@ -720,6 +731,7 @@ applet_menu_item_add_complex_separator_helper (GtkWidget *menu, "sensitive", FALSE, NULL); gtk_menu_shell_append (GTK_MENU_SHELL (menu), menu_item); +#endif } GtkWidget * @@ -727,14 +739,14 @@ applet_new_menu_item_helper (NMConnection *connection, NMConnection *active, gboolean add_active) { - GtkWidget *item; - NMSettingConnection *s_con; - char *markup; - GtkWidget *label; + NMSettingConnection *s_con = nm_connection_get_setting_connection (connection); + GtkWidget *item = gtk_image_menu_item_new_with_label (""); - s_con = nm_connection_get_setting_connection (connection); - item = gtk_image_menu_item_new_with_label (""); +#ifndef ENABLE_INDICATOR if (add_active && (active == connection)) { + char *markup; + GtkWidget *label; + /* Pure evil */ label = gtk_bin_get_child (GTK_BIN (item)); gtk_label_set_use_markup (GTK_LABEL (label), TRUE); @@ -742,12 +754,14 @@ applet_new_menu_item_helper (NMConnection *connection, gtk_label_set_markup (GTK_LABEL (label), markup); g_free (markup); } else +#endif gtk_menu_item_set_label (GTK_MENU_ITEM (item), nm_setting_connection_get_id (s_con)); gtk_image_menu_item_set_always_show_image (GTK_IMAGE_MENU_ITEM (item), TRUE); return item; } +#ifndef ENABLE_INDICATOR #define TITLE_TEXT_R ((double) 0x5e / 255.0 ) #define TITLE_TEXT_G ((double) 0x5e / 255.0 ) #define TITLE_TEXT_B ((double) 0x5e / 255.0 ) @@ -811,6 +825,7 @@ menu_title_item_draw (GtkWidget *widget, cairo_t *cr, gpointer user_data) menu_item_draw_generic (widget, cr); return TRUE; } +#endif /* ENABLE_INDICATOR */ GtkWidget * applet_menu_item_create_device_item_helper (NMDevice *device, @@ -821,7 +836,9 @@ applet_menu_item_create_device_item_helper (NMDevice *device, item = gtk_menu_item_new_with_label (text); gtk_widget_set_sensitive (item, FALSE); +#ifndef ENABLE_INDICATOR g_signal_connect (item, "draw", G_CALLBACK (menu_title_item_draw), NULL); +#endif return item; } @@ -879,8 +896,13 @@ applet_do_notify (NMApplet *applet, g_return_if_fail (summary != NULL); g_return_if_fail (message != NULL); +#ifdef ENABLE_INDICATOR + if (app_indicator_get_status (applet->app_indicator) == APP_INDICATOR_STATUS_PASSIVE) + return; +#else if (!gtk_status_icon_is_embedded (applet->status_icon)) return; +#endif /* if we're not acting as a secret agent, don't notify either */ if (!applet->agent) @@ -1159,6 +1181,7 @@ vpn_connection_state_changed (NMVPNConnection *vpn, clear_animation_timeout (applet); applet_schedule_update_icon (applet); + applet_schedule_update_menu (applet); } static const char * @@ -1214,10 +1237,15 @@ activate_vpn_cb (NMClient *client, } applet_schedule_update_icon (info->applet); + applet_schedule_update_menu (info->applet); g_free (info->vpn_name); g_free (info); } +#ifdef ENABLE_INDICATOR +static void nma_menu_disconnect_vpn_item_activate (GtkMenuItem *item, gpointer user_data); +#endif + static void nma_menu_vpn_item_clicked (GtkMenuItem *item, gpointer user_data) { @@ -1240,9 +1268,13 @@ nma_menu_vpn_item_clicked (GtkMenuItem *item, gpointer user_data) return; } - if (applet_get_active_for_connection (applet, connection)) + if (applet_get_active_for_connection (applet, connection)) { +#ifdef ENABLE_INDICATOR + nma_menu_disconnect_vpn_item_activate (item, applet); +#endif /* Connection already active; do nothing */ return; + } s_con = nm_connection_get_setting_connection (connection); info = g_malloc0 (sizeof (VPNActivateInfo)); @@ -1788,6 +1820,7 @@ nma_menu_add_vpn_submenu (GtkWidget *menu, NMApplet *applet) item = GTK_MENU_ITEM (gtk_menu_item_new_with_mnemonic (_("_VPN Connections"))); gtk_menu_item_set_submenu (item, GTK_WIDGET (vpn_menu)); gtk_menu_shell_append (GTK_MENU_SHELL (menu), GTK_WIDGET (item)); + gtk_widget_show (GTK_WIDGET (item)); list = get_vpn_connections (applet); for (iter = list; iter; iter = g_slist_next (iter)) { @@ -1801,13 +1834,11 @@ nma_menu_add_vpn_submenu (GtkWidget *menu, NMApplet *applet) NMConnection *connection = NM_CONNECTION (iter->data); NMActiveConnection *active; const char *name; - GtkWidget *image; NMState state; name = get_connection_id (connection); - item = GTK_MENU_ITEM (gtk_image_menu_item_new_with_label (name)); - gtk_image_menu_item_set_always_show_image(GTK_IMAGE_MENU_ITEM(item), TRUE); + item = GTK_MENU_ITEM (gtk_check_menu_item_new_with_label (name)); /* If no VPN connections are active, draw all menu items enabled. If * >= 1 VPN connections are active, only the active VPN menu item is @@ -1825,10 +1856,7 @@ nma_menu_add_vpn_submenu (GtkWidget *menu, NMApplet *applet) else gtk_widget_set_sensitive (GTK_WIDGET (item), FALSE); - if (active) { - image = gtk_image_new_from_stock (GTK_STOCK_CONNECT, GTK_ICON_SIZE_MENU); - gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (item), image); - } + gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), !!active); g_object_set_data_full (G_OBJECT (item), "connection", g_object_ref (connection), @@ -1836,6 +1864,7 @@ nma_menu_add_vpn_submenu (GtkWidget *menu, NMApplet *applet) g_signal_connect (item, "activate", G_CALLBACK (nma_menu_vpn_item_clicked), applet); gtk_menu_shell_append (GTK_MENU_SHELL (vpn_menu), GTK_WIDGET (item)); + gtk_widget_show (GTK_WIDGET (item)); } /* Draw a seperator, but only if we have VPN connections above it */ @@ -1845,12 +1874,14 @@ nma_menu_add_vpn_submenu (GtkWidget *menu, NMApplet *applet) item = GTK_MENU_ITEM (gtk_menu_item_new_with_mnemonic (_("_Configure VPN..."))); g_signal_connect (item, "activate", G_CALLBACK (nma_menu_configure_vpn_item_activate), applet); gtk_menu_shell_append (GTK_MENU_SHELL (vpn_menu), GTK_WIDGET (item)); + gtk_widget_show (GTK_WIDGET (item)); item = GTK_MENU_ITEM (gtk_menu_item_new_with_mnemonic (_("_Disconnect VPN"))); g_signal_connect (item, "activate", G_CALLBACK (nma_menu_disconnect_vpn_item_activate), applet); gtk_menu_shell_append (GTK_MENU_SHELL (vpn_menu), GTK_WIDGET (item)); if (num_vpn_active == 0) gtk_widget_set_sensitive (GTK_WIDGET (item), FALSE); + gtk_widget_show (GTK_WIDGET (item)); g_slist_free (list); } @@ -1901,6 +1932,7 @@ nma_set_networking_enabled_cb (GtkWidget *widget, NMApplet *applet) } +#ifndef ENABLE_INDICATOR static void nma_set_notifications_enabled_cb (GtkWidget *widget, NMApplet *applet) { @@ -1923,6 +1955,7 @@ nma_set_notifications_enabled_cb (GtkWidget *widget, NMApplet *applet) PREF_SUPPRESS_WIFI_NETWORKS_AVAILABLE, !state); } +#endif /* ENABLE_INDICATOR */ static gboolean has_usable_wifi (NMApplet *applet) @@ -1959,7 +1992,9 @@ static void nma_menu_show_cb (GtkWidget *menu, NMApplet *applet) g_return_if_fail (menu != NULL); g_return_if_fail (applet != NULL); +#ifndef ENABLE_INDICATOR gtk_status_icon_set_tooltip_text (applet->status_icon, NULL); +#endif if (!nm_client_get_manager_running (applet->nm_client)) { nma_menu_add_text_item (menu, _("NetworkManager is not running...")); @@ -1981,11 +2016,14 @@ static void nma_menu_show_cb (GtkWidget *menu, NMApplet *applet) nma_menu_add_create_network_item (menu, applet); } +#ifndef ENABLE_INDICATOR gtk_widget_show_all (menu); +#endif // nmi_dbus_signal_user_interface_activated (applet->connection); } +#ifndef ENABLE_INDICATOR static gboolean destroy_old_menu (gpointer user_data) { @@ -2007,6 +2045,7 @@ nma_menu_deactivate_cb (GtkWidget *widget, NMApplet *applet) /* Re-set the tooltip */ gtk_status_icon_set_tooltip_text (applet->status_icon, applet->tip); } +#endif static gboolean is_permission_yes (NMApplet *applet, NMClientPermission perm) @@ -2032,7 +2071,9 @@ nma_context_menu_update (NMApplet *applet) gboolean wifi_hw_enabled; gboolean wwan_hw_enabled; gboolean wimax_hw_enabled; +#ifndef ENABLE_INDICATOR gboolean notifications_enabled = TRUE; +#endif gboolean sensitive = FALSE; state = nm_client_get_state (applet->nm_client); @@ -2092,6 +2133,7 @@ nma_context_menu_update (NMApplet *applet) gtk_widget_set_sensitive (GTK_WIDGET (applet->wimax_enabled_item), wimax_hw_enabled && is_permission_yes (applet, NM_CLIENT_PERMISSION_ENABLE_DISABLE_WIMAX)); +#ifndef ENABLE_INDICATOR /* Enabled notifications */ g_signal_handler_block (G_OBJECT (applet->notifications_enabled_item), applet->notifications_enabled_toggled_id); @@ -2103,6 +2145,7 @@ nma_context_menu_update (NMApplet *applet) gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (applet->notifications_enabled_item), notifications_enabled); g_signal_handler_unblock (G_OBJECT (applet->notifications_enabled_item), applet->notifications_enabled_toggled_id); +#endif /* Don't show wifi-specific stuff if wifi is off */ if (state != NM_STATE_ASLEEP) { @@ -2178,7 +2221,9 @@ applet_connection_info_cb (NMApplet *applet) static GtkWidget *nma_context_menu_create (NMApplet *applet) { GtkMenuShell *menu; +#ifndef ENABLE_INDICATOR GtkWidget *menu_item; +#endif GtkWidget *image; guint id; @@ -2224,6 +2269,7 @@ static GtkWidget *nma_context_menu_create (NMApplet *applet) nma_menu_add_separator_item (GTK_WIDGET (menu)); +#ifndef ENABLE_INDICATOR /* Toggle notifications item */ applet->notifications_enabled_item = gtk_check_menu_item_new_with_mnemonic (_("Enable N_otifications")); id = g_signal_connect (applet->notifications_enabled_item, @@ -2234,6 +2280,7 @@ static GtkWidget *nma_context_menu_create (NMApplet *applet) gtk_menu_shell_append (menu, applet->notifications_enabled_item); nma_menu_add_separator_item (GTK_WIDGET (menu)); +#endif /* 'Connection Information' item */ applet->info_menu_item = gtk_image_menu_item_new_with_mnemonic (_("Connection _Information")); @@ -2258,6 +2305,7 @@ static GtkWidget *nma_context_menu_create (NMApplet *applet) /* Separator */ nma_menu_add_separator_item (GTK_WIDGET (menu)); +#ifndef ENABLE_INDICATOR #if 0 /* FIXME: Implement the help callback, nma_help_cb()! */ /* Help item */ menu_item = gtk_image_menu_item_new_with_mnemonic (_("_Help")); @@ -2274,6 +2322,7 @@ static GtkWidget *nma_context_menu_create (NMApplet *applet) image = gtk_image_new_from_stock (GTK_STOCK_ABOUT, GTK_ICON_SIZE_MENU); gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (menu_item), image); gtk_menu_shell_append (menu, menu_item); +#endif gtk_widget_show_all (GTK_WIDGET (menu)); @@ -2376,16 +2425,50 @@ applet_add_default_connection_item (NMDevice *device, gtk_menu_shell_append (GTK_MENU_SHELL (menu), item); } +#ifdef ENABLE_INDICATOR +static gboolean +applet_update_indicator_menu (gpointer user_data) +{ + NMApplet *applet = NM_APPLET (user_data); + GtkWidget *menu = nma_context_menu_create (applet); + + nma_menu_show_cb (menu, applet); + nma_menu_add_separator_item (menu); + nma_context_menu_update (applet); + + app_indicator_set_menu (applet->app_indicator, GTK_MENU (menu)); + + applet->update_menu_id = 0; + return FALSE; +} +#endif /* ENABLE_INDICATOR */ + +void +applet_schedule_update_menu (NMApplet *applet) +{ +#ifdef ENABLE_INDICATOR + if (!applet->update_menu_id) + applet->update_menu_id = g_idle_add (applet_update_indicator_menu, applet); +#endif +} /*****************************************************************************/ static void foo_set_icon (NMApplet *applet, guint32 layer, GdkPixbuf *pixbuf, char *icon_name) { - int i; - g_return_if_fail (layer == ICON_LAYER_LINK || layer == ICON_LAYER_VPN); +#ifdef ENABLE_INDICATOR + /* FIXME: We rely on the fact that VPN icon gets drawn later and therefore + * wins but we cannot currently set a combined pixmap made of both the link + * icon and the VPN icon. + */ + if (icon_name == NULL && layer == ICON_LAYER_LINK) + icon_name = g_strdup ("nm-no-connection"); + if (icon_name != NULL && g_strcmp0 (app_indicator_get_icon (applet->app_indicator), icon_name) != 0) + app_indicator_set_icon_full (applet->app_indicator, icon_name, applet->tip); +#else /* Ignore setting of the same icon as is already displayed */ if (applet->icon_layers[layer] == pixbuf) return; @@ -2414,10 +2497,12 @@ foo_set_icon (NMApplet *applet, guint32 layer, GdkPixbuf *pixbuf, char *icon_nam 0, 0, 1.0, 1.0, GDK_INTERP_NEAREST, 255); } - } + } else + pixbuf = g_object_ref (nma_icon_check_and_load ("nm-no-connection", applet)); gtk_status_icon_set_from_pixbuf (applet->status_icon, pixbuf); g_object_unref (pixbuf); +#endif } NMRemoteConnection * @@ -2525,6 +2610,7 @@ foo_device_state_changed_cb (NMDevice *device, } applet_schedule_update_icon (applet); + applet_schedule_update_menu (applet); } static void @@ -2568,7 +2654,19 @@ foo_client_state_changed_cb (NMClient *client, GParamSpec *pspec, gpointer user_ } applet_schedule_update_icon (applet); + applet_schedule_update_menu (applet); +} + +#ifdef ENABLE_INDICATOR +static void +foo_device_removed_cb (NMClient *client, NMDevice *device, gpointer user_data) +{ + NMApplet *applet = NM_APPLET (user_data); + + applet_schedule_update_icon (applet); + applet_schedule_update_menu (applet); } +#endif static void foo_manager_running_cb (NMClient *client, @@ -2585,6 +2683,7 @@ foo_manager_running_cb (NMClient *client, } applet_schedule_update_icon (applet); + applet_schedule_update_menu (applet); } #define VPN_STATE_ID_TAG "vpn-state-id" @@ -2614,6 +2713,7 @@ foo_active_connections_changed_cb (NMClient *client, } applet_schedule_update_icon (applet); + applet_schedule_update_menu (applet); } static void @@ -2664,6 +2764,11 @@ foo_client_setup (NMApplet *applet) g_signal_connect (applet->nm_client, "device-added", G_CALLBACK (foo_device_added_cb), applet); +#ifdef ENABLE_INDICATOR + g_signal_connect (applet->nm_client, "device-removed", + G_CALLBACK (foo_device_removed_cb), + applet); +#endif g_signal_connect (applet->nm_client, "notify::manager-running", G_CALLBACK (foo_manager_running_cb), applet); @@ -2936,7 +3041,11 @@ applet_update_icon (gpointer user_data) if (!nm_running) state = NM_STATE_UNKNOWN; +#ifdef ENABLE_INDICATOR + app_indicator_set_status (applet->app_indicator, nm_running ? APP_INDICATOR_STATUS_ACTIVE : APP_INDICATOR_STATUS_PASSIVE); +#else gtk_status_icon_set_visible (applet->status_icon, applet->visible); +#endif switch (state) { case NM_STATE_UNKNOWN: @@ -3005,7 +3114,13 @@ applet_update_icon (gpointer user_data) /* update tooltip */ g_free (applet->tip); applet->tip = g_strdup (vpn_tip ? vpn_tip : dev_tip); +#ifdef ENABLE_INDICATOR + /* FIXME: The applet->tip attribute seems to only be picked up by + * the next call to foo_set_icon() which is not particularly nice. + */ +#else gtk_status_icon_set_tooltip_text (applet->status_icon, applet->tip); +#endif g_free (vpn_tip); g_free (dev_tip); @@ -3279,13 +3394,13 @@ GdkPixbuf * nma_icon_check_and_load (const char *name, NMApplet *applet) { GError *error = NULL; - GdkPixbuf *icon = g_hash_table_lookup (applet->icon_cache, name); + GdkPixbuf *icon; g_assert (name != NULL); g_assert (applet != NULL); /* icon already loaded successfully */ - if (icon) + if ((icon = g_hash_table_lookup (applet->icon_cache, name))) return icon; /* Try to load the icon; if the load fails, log the problem, and set @@ -3349,26 +3464,22 @@ error: return FALSE; } -static void nma_icon_theme_changed (GtkIconTheme *icon_theme, NMApplet *applet) -{ - nma_icons_reload (applet); -} - static void nma_icons_init (NMApplet *applet) { - GdkScreen *screen; gboolean path_appended; if (applet->icon_theme) { g_signal_handlers_disconnect_by_func (applet->icon_theme, - G_CALLBACK (nma_icon_theme_changed), + G_CALLBACK (nma_icons_reload), applet); g_object_unref (G_OBJECT (applet->icon_theme)); } - screen = gtk_status_icon_get_screen (applet->status_icon); - g_assert (screen); - applet->icon_theme = gtk_icon_theme_get_for_screen (screen); +#ifdef ENABLE_INDICATOR + applet->icon_theme = gtk_icon_theme_get_default (); +#else + applet->icon_theme = gtk_icon_theme_get_for_screen (gtk_status_icon_get_screen (applet->status_icon)); +#endif /* If not done yet, append our search path */ path_appended = GPOINTER_TO_INT (g_object_get_data (G_OBJECT (applet->icon_theme), @@ -3380,16 +3491,17 @@ static void nma_icons_init (NMApplet *applet) GINT_TO_POINTER (TRUE)); } - g_signal_connect (applet->icon_theme, "changed", G_CALLBACK (nma_icon_theme_changed), applet); + g_signal_connect (applet->icon_theme, "changed", G_CALLBACK (nma_icons_reload), applet); } +#ifndef ENABLE_INDICATOR static void status_icon_screen_changed_cb (GtkStatusIcon *icon, GParamSpec *pspec, NMApplet *applet) { nma_icons_init (applet); - nma_icon_theme_changed (NULL, applet); + nma_icons_reload (applet); } static gboolean @@ -3454,15 +3566,20 @@ status_icon_popup_menu_cb (GtkStatusIcon *icon, gtk_status_icon_position_menu, icon, button, activate_time); } +#endif /* ENABLE_INDICATOR */ static gboolean setup_widgets (NMApplet *applet) { - g_return_val_if_fail (NM_IS_APPLET (applet), FALSE); - +#ifdef ENABLE_INDICATOR + applet->app_indicator = app_indicator_new + ("nm-applet", "nm-no-connection", + APP_INDICATOR_CATEGORY_SYSTEM_SERVICES); + app_indicator_set_title(applet->app_indicator, _("Network")); + applet_schedule_update_menu (applet); +#else applet->status_icon = gtk_status_icon_new (); - if (!applet->status_icon) - return FALSE; + if (shell_debug) gtk_status_icon_set_name (applet->status_icon, "adsfasdfasdfadfasdf"); @@ -3478,10 +3595,20 @@ setup_widgets (NMApplet *applet) applet->context_menu = nma_context_menu_create (applet); if (!applet->context_menu) return FALSE; +#endif return TRUE; } +#ifdef ENABLE_INDICATOR +static void +new_connection_cb (NMRemoteSettings *settings, NMRemoteConnection *connection, gpointer user_data) +{ + NMApplet *applet = NM_APPLET (user_data); + + applet_schedule_update_menu (applet); +} +#else static void applet_embedded_cb (GObject *object, GParamSpec *pspec, gpointer user_data) { @@ -3490,6 +3617,7 @@ applet_embedded_cb (GObject *object, GParamSpec *pspec, gpointer user_data) g_debug ("applet now %s the notification area", embedded ? "embedded in" : "removed from"); } +#endif static void register_agent (NMApplet *applet) @@ -3502,6 +3630,12 @@ register_agent (NMApplet *applet) G_CALLBACK (applet_agent_get_secrets_cb), applet); g_signal_connect (applet->agent, APPLET_AGENT_CANCEL_SECRETS, G_CALLBACK (applet_agent_cancel_secrets_cb), applet); +#ifdef ENABLE_INDICATOR + /* Watch for new connections */ + g_signal_connect (applet->settings, "new-connection", + G_CALLBACK (new_connection_cb), + applet); +#endif } static gboolean @@ -3546,7 +3680,9 @@ applet_gsettings_show_changed (GSettings *settings, applet->visible = g_settings_get_boolean (settings, key); +#ifndef ENABLE_INDICATOR gtk_status_icon_set_visible (applet->status_icon, applet->visible); +#endif } static gboolean @@ -3569,6 +3705,7 @@ initable_init (GInitable *initable, GCancellable *cancellable, GError **error) g_signal_connect (applet->gsettings, "changed::show-applet", G_CALLBACK (applet_gsettings_show_changed), applet); + foo_client_setup (applet); /* Load pixmaps and create applet widgets */ if (!setup_widgets (applet)) { @@ -3648,18 +3785,18 @@ initable_init (GInitable *initable, GCancellable *cancellable, GError **error) applet->infiniband_class = applet_device_infiniband_get_class (applet); g_assert (applet->infiniband_class); - foo_client_setup (applet); - #if WITH_MODEM_MANAGER_1 mm1_client_setup (applet); #endif +#ifndef ENABLE_INDICATOR /* Track embedding to help debug issues where user has removed the * notification area applet from the panel, and thus nm-applet too. */ g_signal_connect (applet->status_icon, "notify::embedded", G_CALLBACK (applet_embedded_cb), NULL); applet_embedded_cb (G_OBJECT (applet->status_icon), NULL, NULL); +#endif register_agent (applet); @@ -3688,12 +3825,18 @@ static void finalize (GObject *object) if (applet->update_icon_id) g_source_remove (applet->update_icon_id); - if (applet->menu) - g_object_unref (applet->menu); +#ifdef ENABLE_INDICATOR + g_clear_object (&applet->app_indicator); + if (applet->update_menu_id) + g_source_remove (applet->update_menu_id); +#else + g_clear_object (&applet->status_icon); + g_clear_object (&applet->menu); g_clear_pointer (&applet->icon_cache, g_hash_table_destroy); - nma_icons_free (applet); - + g_clear_object (&applet->fallback_icon); g_free (applet->tip); + nma_icons_free (applet); +#endif while (g_slist_length (applet->secrets_reqs)) applet_secrets_request_free ((SecretsRequest *) applet->secrets_reqs->data); @@ -3703,45 +3846,24 @@ static void finalize (GObject *object) g_object_unref (applet->notification); } - if (applet->info_dialog_ui) - g_object_unref (applet->info_dialog_ui); - - if (applet->gsettings) - g_object_unref (applet->gsettings); - - if (applet->status_icon) - g_object_unref (applet->status_icon); - - if (applet->nm_client) - g_object_unref (applet->nm_client); + g_clear_object (&applet->info_dialog_ui); + g_clear_object (&applet->gsettings); + g_clear_object (&applet->nm_client); #if WITH_MODEM_MANAGER_1 - if (applet->mm1) - g_object_unref (applet->mm1); + g_clear_object (&applet->mm1); #endif - if (applet->fallback_icon) - g_object_unref (applet->fallback_icon); - - if (applet->agent) - g_object_unref (applet->agent); - - if (applet->settings) - g_object_unref (applet->settings); - - if (applet->session_bus) - dbus_g_connection_unref (applet->session_bus); + g_clear_object (&applet->agent); + g_clear_object (&applet->settings); + g_clear_pointer (&applet->session_bus, dbus_g_connection_unref); G_OBJECT_CLASS (nma_parent_class)->finalize (object); } static void nma_init (NMApplet *applet) { - applet->animation_id = 0; - applet->animation_step = 0; - applet->icon_theme = NULL; - applet->notification = NULL; - applet->icon_size = 16; + applet->icon_size = 40; } static void nma_class_init (NMAppletClass *klass) diff --git a/src/applet.h b/src/applet.h index 66ca945..649af35 100644 --- a/src/applet.h +++ b/src/applet.h @@ -36,6 +36,10 @@ #include <libnotify/notify.h> +#ifdef ENABLE_INDICATOR +#include <libappindicator/app-indicator.h> +#endif + #include <nm-connection.h> #include <nm-client.h> #include <nm-access-point.h> @@ -120,28 +124,37 @@ typedef struct /* Data model elements */ guint update_icon_id; + char * tip; - GtkIconTheme * icon_theme; - GHashTable * icon_cache; + /* Animation stuff */ + int animation_step; + guint animation_id; #define NUM_CONNECTING_FRAMES 11 #define NUM_VPN_CONNECTING_FRAMES 14 + + GtkIconTheme * icon_theme; + GHashTable * icon_cache; GdkPixbuf * fallback_icon; /* Active status icon pixbufs */ GdkPixbuf * icon_layers[ICON_LAYER_MAX + 1]; - /* Animation stuff */ - int animation_step; - guint animation_id; - + /* Direct UI elements */ - GtkStatusIcon * status_icon; int icon_size; +#ifdef ENABLE_INDICATOR + AppIndicator * app_indicator; + guint update_menu_id; +#else + GtkStatusIcon * status_icon; GtkWidget * menu; - char * tip; - GtkWidget * context_menu; + + GtkWidget * notifications_enabled_item; + guint notifications_enabled_toggled_id; +#endif + GtkWidget * networking_enabled_item; guint networking_enabled_toggled_id; GtkWidget * wifi_enabled_item; @@ -151,9 +164,6 @@ typedef struct GtkWidget * wimax_enabled_item; guint wimax_enabled_toggled_id; - GtkWidget * notifications_enabled_item; - guint notifications_enabled_toggled_id; - GtkWidget * info_menu_item; GtkWidget * connections_menu_item; @@ -244,6 +254,7 @@ GType nma_get_type (void); NMApplet *nm_applet_new (void); void applet_schedule_update_icon (NMApplet *applet); +void applet_schedule_update_menu (NMApplet *applet); NMRemoteSettings *applet_get_settings (NMApplet *applet); diff --git a/src/mb-menu-item.c b/src/mb-menu-item.c index ee471e2..61d7d96 100644 --- a/src/mb-menu-item.c +++ b/src/mb-menu-item.c @@ -36,13 +36,17 @@ G_DEFINE_TYPE (NMMbMenuItem, nm_mb_menu_item, GTK_TYPE_IMAGE_MENU_ITEM); #define NM_MB_MENU_ITEM_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), NM_TYPE_MB_MENU_ITEM, NMMbMenuItemPrivate)) typedef struct { +#ifndef ENABLE_INDICATOR GtkWidget *desc; char *desc_string; GtkWidget *strength; guint32 int_strength; GtkWidget *detail; GtkWidget *hbox; +#endif + char *desc_string; + guint32 int_strength; gboolean destroyed; } NMMbMenuItemPrivate; @@ -80,6 +84,25 @@ get_tech_name (guint32 tech) return NULL; } +static void +update_label (NMMbMenuItem *item, gboolean use_bold) +{ + NMMbMenuItemPrivate *priv = NM_MB_MENU_ITEM_GET_PRIVATE (item); + +#ifdef ENABLE_INDICATOR + gtk_menu_item_set_label (GTK_MENU_ITEM (item), priv->desc_string); +#else + gtk_label_set_use_markup (GTK_LABEL (priv->desc), use_bold); + if (use_bold) { + char *markup = g_markup_printf_escaped ("<b>%s</b>", priv->desc_string); + + gtk_label_set_markup (GTK_LABEL (priv->desc), markup); + g_free (markup); + } else + gtk_label_set_text (GTK_LABEL (priv->desc), priv->desc_string); +#endif +} + GtkWidget * nm_mb_menu_item_new (const char *connection_name, guint32 strength, @@ -170,24 +193,26 @@ nm_mb_menu_item_new (const char *connection_name, break; } - if (enabled && connection_name && active) { - char *markup; - - gtk_label_set_use_markup (GTK_LABEL (priv->desc), TRUE); - markup = g_markup_printf_escaped ("<b>%s</b>", priv->desc_string); - gtk_label_set_markup (GTK_LABEL (priv->desc), markup); - g_free (markup); - } else { - /* Disconnected and disabled states */ - gtk_label_set_use_markup (GTK_LABEL (priv->desc), FALSE); - gtk_label_set_text (GTK_LABEL (priv->desc), priv->desc_string); - } + update_label (item, (enabled && connection_name && active)); /* And the strength icon, if we have strength information at all */ - if (enabled && strength) { - GdkPixbuf *pixbuf = nma_icon_check_and_load (mobile_helper_get_quality_icon_name (strength), applet); - + if (enabled && strength) { + const char *icon_name = mobile_helper_get_quality_icon_name (strength); + GdkPixbuf *pixbuf = nma_icon_check_and_load (icon_name, applet); + +#ifdef ENABLE_INDICATOR +#ifdef DBUSMENU_PIXMAP_SUPPORT + gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (item), gtk_image_new_from_pixbuf (pixbuf)); +#else + gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (item), + gtk_image_new_from_icon_name (icon_name, GTK_ICON_SIZE_MENU)); + pixbuf = NULL; +#endif + /* For some reason we must always re-set always-show after setting the image */ + gtk_image_menu_item_set_always_show_image (GTK_IMAGE_MENU_ITEM (item), TRUE); +#else gtk_image_set_from_pixbuf (GTK_IMAGE (priv->strength), pixbuf); +#endif } return GTK_WIDGET (item); @@ -198,6 +223,7 @@ nm_mb_menu_item_new (const char *connection_name, static void nm_mb_menu_item_init (NMMbMenuItem *self) { +#ifndef ENABLE_INDICATOR NMMbMenuItemPrivate *priv = NM_MB_MENU_ITEM_GET_PRIVATE (self); priv->hbox = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 6); @@ -213,11 +239,15 @@ nm_mb_menu_item_init (NMMbMenuItem *self) gtk_widget_show (priv->desc); gtk_widget_show (priv->strength); gtk_widget_show (priv->hbox); +#else + gtk_image_menu_item_set_always_show_image (GTK_IMAGE_MENU_ITEM (self), TRUE); +#endif } static void -dispose (GObject *object) +finalize (GObject *object) { +#ifndef ENABLE_INDICATOR NMMbMenuItem *self = NM_MB_MENU_ITEM (object); NMMbMenuItemPrivate *priv = NM_MB_MENU_ITEM_GET_PRIVATE (self); @@ -230,9 +260,11 @@ dispose (GObject *object) gtk_widget_destroy (priv->desc); gtk_widget_destroy (priv->strength); gtk_widget_destroy (priv->hbox); - g_free (priv->desc_string); G_OBJECT_CLASS (nm_mb_menu_item_parent_class)->dispose (object); +#endif + g_free (NM_MB_MENU_ITEM_GET_PRIVATE (object)->desc_string); + } static void @@ -243,6 +275,6 @@ nm_mb_menu_item_class_init (NMMbMenuItemClass *klass) g_type_class_add_private (klass, sizeof (NMMbMenuItemPrivate)); /* virtual methods */ - object_class->dispose = dispose; + object_class->finalize = finalize; }
Locations
Projects
Search
Status Monitor
Help
OpenBuildService.org
Documentation
API Documentation
Code of Conduct
Contact
Support
@OBShq
Terms
openSUSE Build Service is sponsored by
The Open Build Service is an
openSUSE project
.
Sign Up
Log In
Places
Places
All Projects
Status Monitor