From a34f531da4f03eecfc38414295ebe70742dfad71 Mon Sep 17 00:00:00 2001 From: yetist Date: Tue, 4 Sep 2018 14:27:45 +0800 Subject: Migrate mate-panel from dbus-glib to gdbus - Code optimization - Put GDBusProxy in PanelSessionManager struct --- mate-panel/libpanel-util/Makefile.am | 2 - mate-panel/libpanel-util/panel-dbus-service.c | 307 ----------------------- mate-panel/libpanel-util/panel-dbus-service.h | 78 ------ mate-panel/libpanel-util/panel-session-manager.c | 157 +++++------- mate-panel/libpanel-util/panel-session-manager.h | 29 +-- 5 files changed, 67 insertions(+), 506 deletions(-) delete mode 100644 mate-panel/libpanel-util/panel-dbus-service.c delete mode 100644 mate-panel/libpanel-util/panel-dbus-service.h (limited to 'mate-panel') diff --git a/mate-panel/libpanel-util/Makefile.am b/mate-panel/libpanel-util/Makefile.am index ce796e9e..8f7e4d09 100644 --- a/mate-panel/libpanel-util/Makefile.am +++ b/mate-panel/libpanel-util/Makefile.am @@ -14,8 +14,6 @@ AM_CFLAGS = $(WARN_CFLAGS) libpanel_util_la_SOURCES = \ panel-cleanup.c \ panel-cleanup.h \ - panel-dbus-service.c \ - panel-dbus-service.h \ panel-color.c \ panel-color.h \ panel-error.c \ diff --git a/mate-panel/libpanel-util/panel-dbus-service.c b/mate-panel/libpanel-util/panel-dbus-service.c deleted file mode 100644 index 405b8bf0..00000000 --- a/mate-panel/libpanel-util/panel-dbus-service.c +++ /dev/null @@ -1,307 +0,0 @@ -/* - * panel-dbus-service.c: a simple base object to use a DBus service. Only - * useful when subclassed. - * - * Copyright (C) 2008 Novell, Inc. - * - * Based on code from panel-power-manager.c: - * Copyright (C) 2006 Ray Strode - * (not sure the copyright header was complete) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA - * 02110-1301, USA. - * - * Authors: - * Vincent Untz - */ - -#include - -#include -#include - -#include - -#include "panel-dbus-service.h" - -struct _PanelDBusServicePrivate { - DBusGConnection *dbus_connection; - DBusGProxy *bus_proxy; - DBusGProxy *service_proxy; - guint32 is_connected : 1; - - const char *service_name; - const char *service_path; - const char *service_interface; -}; - -static void panel_dbus_service_finalize (GObject *object); -static void panel_dbus_service_class_install_properties (PanelDBusServiceClass *service_class); - -static void panel_dbus_service_get_property (GObject *object, - guint prop_id, - GValue *value, - GParamSpec *pspec); - -enum { - PROP_0 = 0, - PROP_IS_CONNECTED -}; - -G_DEFINE_TYPE (PanelDBusService, panel_dbus_service, G_TYPE_OBJECT); - -static void -panel_dbus_service_class_init (PanelDBusServiceClass *service_class) -{ - GObjectClass *object_class; - - object_class = G_OBJECT_CLASS (service_class); - - object_class->finalize = panel_dbus_service_finalize; - - panel_dbus_service_class_install_properties (service_class); - - g_type_class_add_private (service_class, - sizeof (PanelDBusServicePrivate)); -} - -static void -panel_dbus_service_class_install_properties (PanelDBusServiceClass *service_class) -{ - GObjectClass *object_class; - GParamSpec *param_spec; - - object_class = G_OBJECT_CLASS (service_class); - object_class->get_property = panel_dbus_service_get_property; - - param_spec = g_param_spec_boolean ("is-connected", - "Is connected", - "Whether the panel is connected to " - "a DBus service", - FALSE, - G_PARAM_READABLE); - g_object_class_install_property (object_class, PROP_IS_CONNECTED, - param_spec); -} - -static void -panel_dbus_service_init (PanelDBusService *service) -{ - service->priv = G_TYPE_INSTANCE_GET_PRIVATE (service, - PANEL_TYPE_DBUS_SERVICE, - PanelDBusServicePrivate); - - service->priv->dbus_connection = NULL; - service->priv->bus_proxy = NULL; - service->priv->service_proxy = NULL; - service->priv->is_connected = FALSE; - - service->priv->service_name = NULL; - service->priv->service_path = NULL; - service->priv->service_interface = NULL; -} - -static void -panel_dbus_service_finalize (GObject *object) -{ - PanelDBusService *service; - - service = PANEL_DBUS_SERVICE (object); - - if (service->priv->dbus_connection != NULL) { - dbus_g_connection_unref (service->priv->dbus_connection); - service->priv->dbus_connection = NULL; - } - - if (service->priv->bus_proxy != NULL) { - g_object_unref (service->priv->bus_proxy); - service->priv->bus_proxy = NULL; - } - - if (service->priv->service_proxy != NULL) { - g_object_unref (service->priv->service_proxy); - service->priv->service_proxy = NULL; - } - - G_OBJECT_CLASS (panel_dbus_service_parent_class)->finalize (object); -} - -static void -panel_dbus_service_get_property (GObject *object, - guint prop_id, - GValue *value, - GParamSpec *pspec) -{ - PanelDBusService *service; - - service = PANEL_DBUS_SERVICE (object); - - switch (prop_id) { - case PROP_IS_CONNECTED: - g_value_set_boolean (value, - service->priv->is_connected); - break; - - default: - G_OBJECT_WARN_INVALID_PROPERTY_ID (object, - prop_id, - pspec); - } -} - -static void -panel_dbus_service_on_name_owner_changed (DBusGProxy *bus_proxy, - const char *name, - const char *prev_owner, - const char *new_owner, - PanelDBusService *service) -{ - g_assert (service->priv->service_name != NULL); - - if (name && strcmp (name, service->priv->service_name) != 0) - return; - - if (service->priv->service_proxy != NULL) { - g_object_unref (service->priv->service_proxy); - service->priv->service_proxy = NULL; - } - - panel_dbus_service_ensure_connection (service, NULL); -} - -gboolean -panel_dbus_service_ensure_connection (PanelDBusService *service, - GError **error) -{ - GError *connection_error; - gboolean is_connected; - - g_return_val_if_fail (PANEL_IS_DBUS_SERVICE (service), FALSE); - - if (!service->priv->service_name || - !service->priv->service_path || - !service->priv->service_interface) - return FALSE; - - connection_error = NULL; - if (service->priv->dbus_connection == NULL) { - service->priv->dbus_connection = dbus_g_bus_get (DBUS_BUS_SESSION, - &connection_error); - - if (service->priv->dbus_connection == NULL) { - g_propagate_error (error, connection_error); - is_connected = FALSE; - goto out; - } - } - - if (service->priv->bus_proxy == NULL) { - service->priv->bus_proxy = - dbus_g_proxy_new_for_name_owner (service->priv->dbus_connection, - DBUS_SERVICE_DBUS, - DBUS_PATH_DBUS, - DBUS_INTERFACE_DBUS, - &connection_error); - - if (service->priv->bus_proxy == NULL) { - g_propagate_error (error, connection_error); - is_connected = FALSE; - goto out; - } - - dbus_g_proxy_add_signal (service->priv->bus_proxy, - "NameOwnerChanged", - G_TYPE_STRING, - G_TYPE_STRING, - G_TYPE_STRING, - G_TYPE_INVALID); - dbus_g_proxy_connect_signal (service->priv->bus_proxy, - "NameOwnerChanged", - G_CALLBACK (panel_dbus_service_on_name_owner_changed), - service, NULL); - } - - if (service->priv->service_proxy == NULL) { - service->priv->service_proxy = - dbus_g_proxy_new_for_name_owner ( - service->priv->dbus_connection, - service->priv->service_name, - service->priv->service_path, - service->priv->service_interface, - &connection_error); - - if (service->priv->service_proxy == NULL) { - g_propagate_error (error, connection_error); - is_connected = FALSE; - goto out; - } - } - is_connected = TRUE; - -out: - if (service->priv->is_connected != is_connected) { - service->priv->is_connected = is_connected; - g_object_notify (G_OBJECT (service), "is-connected"); - } - - if (!is_connected) { - if (service->priv->dbus_connection == NULL) { - if (service->priv->bus_proxy != NULL) { - g_object_unref (service->priv->bus_proxy); - service->priv->bus_proxy = NULL; - } - - if (service->priv->service_proxy != NULL) { - g_object_unref (service->priv->service_proxy); - service->priv->service_proxy = NULL; - } - } else if (service->priv->bus_proxy == NULL) { - if (service->priv->service_proxy != NULL) { - g_object_unref (service->priv->service_proxy); - service->priv->service_proxy = NULL; - } - } - } - - return is_connected; -} - -void -panel_dbus_service_define_service (PanelDBusService *service, - const char *name, - const char *path, - const char *interface) -{ - g_return_if_fail (PANEL_IS_DBUS_SERVICE (service)); - - g_assert (name != NULL); - g_assert (path != NULL); - g_assert (interface != NULL); - g_assert (service->priv->service_name == NULL); - g_assert (service->priv->service_path == NULL); - g_assert (service->priv->service_interface == NULL); - - service->priv->service_name = name; - service->priv->service_path = path; - service->priv->service_interface = interface; -} - -DBusGProxy * -panel_dbus_service_get_proxy (PanelDBusService *service) -{ - g_return_val_if_fail (PANEL_IS_DBUS_SERVICE (service), NULL); - - return service->priv->service_proxy; -} diff --git a/mate-panel/libpanel-util/panel-dbus-service.h b/mate-panel/libpanel-util/panel-dbus-service.h deleted file mode 100644 index 3d488a71..00000000 --- a/mate-panel/libpanel-util/panel-dbus-service.h +++ /dev/null @@ -1,78 +0,0 @@ -/* - * panel-dbus-service.h: a simple base object to use a DBus service. Only - * useful when subclassed. - * - * Copyright (C) 2008 Novell, Inc. - * - * Based on code from panel-power-manager.h: - * Copyright (C) 2006 Ray Strode - * (not sure the copyright header was complete) - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA - * 02110-1301, USA. - * - * Authors: - * Vincent Untz - */ - -#ifndef PANEL_DBUS_SERVICE_H -#define PANEL_DBUS_SERVICE_H - -#include -#include - -#ifdef __cplusplus -extern "C" { -#endif - -#define PANEL_TYPE_DBUS_SERVICE (panel_dbus_service_get_type ()) -#define PANEL_DBUS_SERVICE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), PANEL_TYPE_DBUS_SERVICE, PanelDBusService)) -#define PANEL_DBUS_SERVICE_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), PANEL_TYPE_DBUS_SERVICE, PanelDBusServiceClass)) -#define PANEL_IS_DBUS_SERVICE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), PANEL_TYPE_DBUS_SERVICE)) -#define PANEL_IS_DBUS_SERVICE_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), PANEL_TYPE_DBUS_SERVICE)) -#define PANEL_DBUS_SERVICE_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), PANEL_TYPE_DBUS_SERVICE, PanelDBusServiceClass)) - -typedef struct _PanelDBusService PanelDBusService; -typedef struct _PanelDBusServiceClass PanelDBusServiceClass; -typedef struct _PanelDBusServicePrivate PanelDBusServicePrivate; - -struct _PanelDBusService { - GObject parent; - - /*< private > */ - PanelDBusServicePrivate *priv; -}; - -struct _PanelDBusServiceClass { - GObjectClass parent_class; -}; - -GType panel_dbus_service_get_type (void); - -void panel_dbus_service_define_service (PanelDBusService *service, - const char *name, - const char *path, - const char *interface); - -gboolean panel_dbus_service_ensure_connection (PanelDBusService *service, - GError **error); - -DBusGProxy *panel_dbus_service_get_proxy (PanelDBusService *service); - -#ifdef __cplusplus -} -#endif - -#endif /* PANEL_DBUS_SERVICE_H */ diff --git a/mate-panel/libpanel-util/panel-session-manager.c b/mate-panel/libpanel-util/panel-session-manager.c index 65a1e330..191ca2dd 100644 --- a/mate-panel/libpanel-util/panel-session-manager.c +++ b/mate-panel/libpanel-util/panel-session-manager.c @@ -22,18 +22,27 @@ * Vincent Untz */ -#include - +#include #include "panel-cleanup.h" -#include "panel-dbus-service.h" - #include "panel-session-manager.h" -static GObject *panel_session_manager_constructor (GType type, - guint n_construct_properties, - GObjectConstructParam *construct_properties); +struct _PanelSessionManager { + GObject parent; + GDBusProxy *proxy; +}; + +G_DEFINE_TYPE (PanelSessionManager, panel_session_manager, G_TYPE_OBJECT) + +static void +panel_session_manager_finalize (GObject *object) +{ + PanelSessionManager *manager = PANEL_SESSION_MANAGER (object); + + if (manager->proxy != NULL) + g_object_unref (manager->proxy); -G_DEFINE_TYPE (PanelSessionManager, panel_session_manager, PANEL_TYPE_DBUS_SERVICE); + G_OBJECT_CLASS (panel_session_manager_parent_class)->finalize (object); +} static void panel_session_manager_class_init (PanelSessionManagerClass *klass) @@ -42,136 +51,98 @@ panel_session_manager_class_init (PanelSessionManagerClass *klass) object_class = G_OBJECT_CLASS (klass); - object_class->constructor = panel_session_manager_constructor; + object_class->finalize = panel_session_manager_finalize; } static void panel_session_manager_init (PanelSessionManager *manager) { -} - -static GObject * -panel_session_manager_constructor (GType type, - guint n_construct_properties, - GObjectConstructParam *construct_properties) -{ - GObject *obj; - GError *error; - - obj = G_OBJECT_CLASS (panel_session_manager_parent_class)->constructor ( - type, - n_construct_properties, - construct_properties); - - - panel_dbus_service_define_service (PANEL_DBUS_SERVICE (obj), - "org.gnome.SessionManager", - "/org/gnome/SessionManager", - "org.gnome.SessionManager"); - - error = NULL; - if (!panel_dbus_service_ensure_connection (PANEL_DBUS_SERVICE (obj), - &error)) { - g_message ("Could not connect to session manager: %s", - error->message); + GError *error = NULL; + + manager->proxy = g_dbus_proxy_new_for_bus_sync (G_BUS_TYPE_SESSION, + G_DBUS_PROXY_FLAGS_NONE, + NULL, + "org.gnome.SessionManager", + "/org/gnome/SessionManager", + "org.gnome.SessionManager", + NULL, + &error); + if (manager->proxy == NULL) { + g_warning ("Unable to contact session manager daemon: %s\n", error->message); g_error_free (error); } - - return obj; } void panel_session_manager_request_logout (PanelSessionManager *manager, PanelSessionManagerLogoutType mode) { - GError *error; - DBusGProxy *proxy; + GError *error = NULL; + GVariant *ret; g_return_if_fail (PANEL_IS_SESSION_MANAGER (manager)); - error = NULL; - - if (!panel_dbus_service_ensure_connection (PANEL_DBUS_SERVICE (manager), - &error)) { - g_warning ("Could not connect to session manager: %s", - error->message); - g_error_free (error); - return; - } - - proxy = panel_dbus_service_get_proxy (PANEL_DBUS_SERVICE (manager)); - - if (!dbus_g_proxy_call (proxy, "Logout", &error, - G_TYPE_UINT, mode, G_TYPE_INVALID, - G_TYPE_INVALID) && - error != NULL) { + ret = g_dbus_proxy_call_sync (manager->proxy, "Logout", + g_variant_new ("(u)", mode), + G_DBUS_CALL_FLAGS_NONE, + -1, + NULL, + &error); + if (ret == NULL) { g_warning ("Could not ask session manager to log out: %s", error->message); g_error_free (error); + } else { + g_variant_unref (ret); } } void panel_session_manager_request_shutdown (PanelSessionManager *manager) { - GError *error; - DBusGProxy *proxy; + GError *error = NULL; + GVariant *ret; g_return_if_fail (PANEL_IS_SESSION_MANAGER (manager)); - error = NULL; - - if (!panel_dbus_service_ensure_connection (PANEL_DBUS_SERVICE (manager), - &error)) { - g_warning ("Could not connect to session manager: %s", - error->message); - g_error_free (error); - return; - } - - proxy = panel_dbus_service_get_proxy (PANEL_DBUS_SERVICE (manager)); - - if (!dbus_g_proxy_call (proxy, "Shutdown", &error, - G_TYPE_INVALID, - G_TYPE_INVALID) && - error != NULL) { + ret = g_dbus_proxy_call_sync (manager->proxy, "Shutdown", + g_variant_new ("()"), + G_DBUS_CALL_FLAGS_NONE, + -1, + NULL, + &error); + if (ret == NULL) { g_warning ("Could not ask session manager to shut down: %s", error->message); g_error_free (error); + } else { + g_variant_unref (ret); } } gboolean panel_session_manager_is_shutdown_available (PanelSessionManager *manager) { - GError *error; - DBusGProxy *proxy; + GError *error = NULL; gboolean is_shutdown_available; + GVariant *ret; g_return_val_if_fail (PANEL_IS_SESSION_MANAGER (manager), FALSE); - error = NULL; - - if (!panel_dbus_service_ensure_connection (PANEL_DBUS_SERVICE (manager), - &error)) { - g_warning ("Could not connect to session manager: %s", - error->message); - g_error_free (error); - - return FALSE; - } - - proxy = panel_dbus_service_get_proxy (PANEL_DBUS_SERVICE (manager)); - - if (!dbus_g_proxy_call (proxy, "CanShutdown", &error, - G_TYPE_INVALID, G_TYPE_BOOLEAN, - &is_shutdown_available, G_TYPE_INVALID) && - error != NULL) { + ret = g_dbus_proxy_call_sync (manager->proxy, "CanShutdown", + g_variant_new ("()"), + G_DBUS_CALL_FLAGS_NONE, + -1, + NULL, + &error); + if (ret == NULL) { g_warning ("Could not ask session manager if shut down is available: %s", error->message); g_error_free (error); - return FALSE; + } else { + g_variant_get (ret, "(b)", &is_shutdown_available); + g_variant_unref (ret); } return is_shutdown_available; diff --git a/mate-panel/libpanel-util/panel-session-manager.h b/mate-panel/libpanel-util/panel-session-manager.h index 1e1d8fc5..98d09c94 100644 --- a/mate-panel/libpanel-util/panel-session-manager.h +++ b/mate-panel/libpanel-util/panel-session-manager.h @@ -27,31 +27,10 @@ #include -#include "panel-dbus-service.h" - -#ifdef __cplusplus -extern "C" { -#endif +G_BEGIN_DECLS #define PANEL_TYPE_SESSION_MANAGER (panel_session_manager_get_type ()) -#define PANEL_SESSION_MANAGER(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), PANEL_TYPE_SESSION_MANAGER, PanelSessionManager)) -#define PANEL_SESSION_MANAGER_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), PANEL_TYPE_SESSION_MANAGER, PanelSessionManagerClass)) -#define PANEL_IS_SESSION_MANAGER(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), PANEL_TYPE_SESSION_MANAGER)) -#define PANEL_IS_SESSION_MANAGER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), PANEL_TYPE_SESSION_MANAGER)) -#define PANEL_SESSION_MANAGER_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS((obj), PANEL_TYPE_SESSION_MANAGER, PanelSessionManagerClass)) - -typedef struct _PanelSessionManager PanelSessionManager; -typedef struct _PanelSessionManagerClass PanelSessionManagerClass; - -struct _PanelSessionManager { - PanelDBusService parent; -}; - -struct _PanelSessionManagerClass { - PanelDBusServiceClass parent_class; -}; - -GType panel_session_manager_get_type (void); +G_DECLARE_FINAL_TYPE (PanelSessionManager, panel_session_manager, PANEL, SESSION_MANAGER, GObject); /* Keep in sync with the values defined in mate-session/session.h */ typedef enum { @@ -68,8 +47,6 @@ void panel_session_manager_request_shutdown (PanelSessionManager *session); gboolean panel_session_manager_is_shutdown_available (PanelSessionManager *session); -#ifdef __cplusplus -} -#endif +G_END_DECLS #endif /* PANEL_SESSION_MANAGER_H */ -- cgit v1.2.1