diff options
| -rw-r--r-- | mate-settings-daemon/Makefile.am | 21 | ||||
| -rw-r--r-- | mate-settings-daemon/main.c | 459 | ||||
| -rw-r--r-- | mate-settings-daemon/mate-settings-manager.c | 121 | ||||
| -rw-r--r-- | mate-settings-daemon/mate-settings-manager.h | 25 | ||||
| -rw-r--r-- | mate-settings-daemon/mate-settings-manager.xml | 1 | ||||
| -rw-r--r-- | mate-settings-daemon/mate-settings-plugin-info.c | 4 | 
6 files changed, 283 insertions, 348 deletions
| diff --git a/mate-settings-daemon/Makefile.am b/mate-settings-daemon/Makefile.am index 4acc62f..0dda4ac 100644 --- a/mate-settings-daemon/Makefile.am +++ b/mate-settings-daemon/Makefile.am @@ -41,20 +41,8 @@ msddir = $(libexecdir)  msd_PROGRAMS = \  	mate-settings-daemon -mate-settings-manager-glue.h: mate-settings-manager.xml Makefile.am -	$(AM_V_GEN) dbus-binding-tool --prefix=mate_settings_manager --mode=glib-server $< > $@ - -mate-settings-client.h: mate-settings-manager.xml Makefile.am -	$(AM_V_GEN) dbus-binding-tool --prefix=mate_settings_manager --mode=glib-client $< > $@ - -BUILT_SOURCES = 			\ -	mate-settings-manager-glue.h	\ -	mate-settings-client.h		\ -	$(NULL) -  apidir   = $(includedir)/mate-settings-daemon  api_DATA = 				\ -	mate-settings-client.h		\  	mate-settings-plugin.h  mate_settings_daemon_SOURCES =		\ @@ -87,15 +75,6 @@ mate_settings_daemon_LDADD = 		\  	$(MATE_DESKTOP_LIBS)    \  	$(LIBNOTIFY_LIBS) -EXTRA_DIST = 				\ -	$(Dbusapi_DATA)			\ -	mate-settings-manager.xml	\ -	$(NULL) - -CLEANFILES = 				\ -	$(BUILT_SOURCES)		\ -	$(NULL) -  -include $(top_srcdir)/git.mk  # vim: ts=8 diff --git a/mate-settings-daemon/main.c b/mate-settings-daemon/main.c index dcff17c..11d8687 100644 --- a/mate-settings-daemon/main.c +++ b/mate-settings-daemon/main.c @@ -31,11 +31,10 @@  #include <glib/gi18n.h>  #include <glib/gstdio.h> +#include <glib-unix.h> +#include <gio/gio.h>  #include <gtk/gtk.h> -#include <dbus/dbus-glib.h> -#include <dbus/dbus-glib-lowlevel.h> -  #ifdef HAVE_LIBNOTIFY  #include <libnotify/notify.h>  #endif /* HAVE_LIBNOTIFY */ @@ -56,16 +55,16 @@  #define MATE_SESSION_PRIVATE_DBUS_INTERFACE "org.gnome.SessionManager.ClientPrivate"  /* this is kept only for compatibility with custom .desktop files */ -static gboolean   no_daemon    = TRUE;  static gboolean   replace      = FALSE;  static gboolean   debug        = FALSE;  static gboolean   do_timed_exit = FALSE; +static guint      name_id      = 0;  static int        term_signal_pipe_fds[2]; +static MateSettingsManager *manager = NULL;  static GOptionEntry entries[] = {          { "debug", 0, 0, G_OPTION_ARG_NONE, &debug, N_("Enable debugging code"), NULL },          { "replace", 0, 0, G_OPTION_ARG_NONE, &replace, N_("Replace the current daemon"), NULL }, -        { "no-daemon", 0, G_OPTION_FLAG_HIDDEN, G_OPTION_ARG_NONE, &no_daemon, N_("Don't become a daemon"), NULL },          { "timed-exit", 0, 0, G_OPTION_ARG_NONE, &do_timed_exit, N_("Exit after a time (for debugging)"), NULL },          { NULL, 0, 0, G_OPTION_ARG_NONE, NULL, NULL, NULL }  }; @@ -73,207 +72,177 @@ static GOptionEntry entries[] = {  static gboolean  timed_exit_cb (void)  { +        g_debug ("Doing timed exit");          gtk_main_quit ();          return G_SOURCE_REMOVE;  } -static DBusGProxy * -get_bus_proxy (DBusGConnection *connection) +static void +stop_manager (void)  { -        DBusGProxy *bus_proxy; - -        bus_proxy = dbus_g_proxy_new_for_name (connection, -                                               DBUS_SERVICE_DBUS, -                                               DBUS_PATH_DBUS, -                                               DBUS_INTERFACE_DBUS); - -        return bus_proxy; +        gtk_main_quit ();  } -static gboolean -acquire_name_on_proxy (DBusGProxy *bus_proxy) +static void +on_session_over (GDBusProxy *proxy, +                 gchar      *sender_name, +                 gchar      *signal_name, +                 GVariant   *parameters, +                 gpointer    user_data)  { -        GError     *error; -        guint       result; -        gboolean    res; -        gboolean    ret; -        guint32     flags; - -        ret = FALSE; - -        flags = DBUS_NAME_FLAG_DO_NOT_QUEUE|DBUS_NAME_FLAG_ALLOW_REPLACEMENT; -        if (replace) -            flags |= DBUS_NAME_FLAG_REPLACE_EXISTING; - -        error = NULL; -        res = dbus_g_proxy_call (bus_proxy, -                                 "RequestName", -                                 &error, -                                 G_TYPE_STRING, MSD_DBUS_NAME, -                                 G_TYPE_UINT, flags, -                                 G_TYPE_INVALID, -                                 G_TYPE_UINT, &result, -                                 G_TYPE_INVALID); -        if (! res) { -                if (error != NULL) { -                        g_warning ("Failed to acquire %s: %s", MSD_DBUS_NAME, error->message); -                        g_error_free (error); -                } else { -                        g_warning ("Failed to acquire %s", MSD_DBUS_NAME); -                } -                goto out; +        if (g_strcmp0 (signal_name, "SessionOver") == 0) { +                g_debug ("Got a SessionOver signal - stopping"); +                stop_manager ();          } +} -        if (result != DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER) { -                if (error != NULL) { -                        g_warning ("Failed to acquire %s: %s", MSD_DBUS_NAME, error->message); -                        g_error_free (error); -                } else { -                        g_warning ("Failed to acquire %s", MSD_DBUS_NAME); -                } -                goto out; -        } - -        ret = TRUE; - - out: -        return ret; +static void +respond_to_end_session (GDBusProxy *proxy) +{ +        /* we must answer with "EndSessionResponse" */ +        g_dbus_proxy_call (proxy, "EndSessionResponse", +                           g_variant_new ("(bs)", +                                          TRUE, ""), +                           G_DBUS_CALL_FLAGS_NONE, +                           -1, NULL, NULL, NULL);  } -static DBusHandlerResult -bus_message_handler (DBusConnection *connection, -                     DBusMessage    *message, -                     void           *user_data) +static void +client_proxy_signal_cb (GDBusProxy *proxy, +                        gchar *sender_name, +                        gchar *signal_name, +                        GVariant *parameters, +                        gpointer user_data)  { -        if (dbus_message_is_signal (message, -                                    DBUS_INTERFACE_LOCAL, -                                    "Disconnected")) { -                gtk_main_quit (); -                return DBUS_HANDLER_RESULT_HANDLED; +        if (g_strcmp0 (signal_name, "QueryEndSession") == 0) { +                g_debug ("Got QueryEndSession signal"); +                respond_to_end_session (proxy); +        } else if (g_strcmp0 (signal_name, "EndSession") == 0) { +                g_debug ("Got EndSession signal"); +                respond_to_end_session (proxy); +        } else if (g_strcmp0 (signal_name, "Stop") == 0) { +                g_debug ("Got Stop signal"); +                stop_manager ();          } -        else if (dbus_message_is_signal (message, -                                         DBUS_INTERFACE_DBUS, -                                         "NameLost")) { -                g_warning ("D-Bus name lost, quitting"); -                gtk_main_quit (); -                return DBUS_HANDLER_RESULT_HANDLED; -        } - -        return DBUS_HANDLER_RESULT_NOT_YET_HANDLED;  } -static DBusGConnection * -get_session_bus (void) +static void +got_client_proxy (GObject *object, +                  GAsyncResult *res, +                  gpointer user_data)  { -        GError          *error; -        DBusGConnection *bus; -        DBusConnection  *connection; +        GDBusProxy *client_proxy; +        GError *error = NULL; -        error = NULL; -        bus = dbus_g_bus_get (DBUS_BUS_SESSION, &error); -        if (bus == NULL) { -                g_warning ("Couldn't connect to session bus: %s", -                           error->message); +        client_proxy = g_dbus_proxy_new_for_bus_finish (res, &error); + +        if (error != NULL) { +                g_debug ("Unable to get the session client proxy: %s", error->message);                  g_error_free (error); -                goto out; +                return;          } -        connection = dbus_g_connection_get_connection (bus); -        dbus_connection_add_filter (connection, -                                    (DBusHandleMessageFunction) -                                    bus_message_handler, -                                    NULL, NULL); - -        dbus_connection_set_exit_on_disconnect (connection, FALSE); - - out: -        return bus; +        g_signal_connect (client_proxy, "g-signal", +                          G_CALLBACK (client_proxy_signal_cb), manager);  } -static gboolean -bus_register (DBusGConnection *bus) +static void +start_settings_manager (void)  { -        DBusGProxy      *bus_proxy; -        gboolean         ret; - -        mate_settings_profile_start (NULL); - -        ret = FALSE; - -        bus_proxy = get_bus_proxy (bus); +        gboolean res; +        GError *error; -        if (bus_proxy == NULL) { -                g_warning ("Could not construct bus_proxy object"); -                goto out; +        mate_settings_profile_start ("mate_settings_manager_new"); +        manager = mate_settings_manager_new (); +        mate_settings_profile_end ("mate_settings_manager_new"); +        if (manager == NULL) { +                g_warning ("Unable to register object"); +                gtk_main_quit ();          } -        ret = acquire_name_on_proxy (bus_proxy); -        g_object_unref (bus_proxy); - -        if (!ret) { -                g_warning ("Could not acquire name"); -                goto out; +        /* If we aren't started by dbus then load the plugins automatically during the +         * Initialization phase. Otherwise, wait for an Awake etc. */ +        if (g_getenv ("DBUS_STARTER_BUS_TYPE") == NULL) { +                error = NULL; +                res = mate_settings_manager_start (manager, PLUGIN_LOAD_INIT, &error); +                if (! res) { +                        g_warning ("Unable to start: %s", error->message); +                        g_error_free (error); +                }          } - -        g_debug ("Successfully connected to D-Bus"); - - out: -        mate_settings_profile_end (NULL); - -        return ret;  }  static void -on_session_over (DBusGProxy *proxy, MateSettingsManager *manager) -{ -        /* not used, see on_session_end instead */ -} - -static void -on_session_query_end (DBusGProxy *proxy, guint flags, MateSettingsManager *manager) +on_client_registered (GObject             *source_object, +                      GAsyncResult        *res, +                      gpointer             user_data)  { +        GVariant *variant;          GError *error = NULL; -        gboolean ret = FALSE; - -        /* send response */ -        ret = dbus_g_proxy_call (proxy, "EndSessionResponse", &error, -                                 G_TYPE_BOOLEAN, TRUE /* ok */, -                                 G_TYPE_STRING, NULL /* reason */, -                                 G_TYPE_INVALID, -                                 G_TYPE_INVALID); -        if (!ret) { -                g_warning ("failed to send session response: %s", error->message); +        gchar *object_path = NULL; + +        variant = g_dbus_proxy_call_finish (G_DBUS_PROXY (source_object), res, &error); +        if (error != NULL) { +                g_warning ("Unable to register client: %s", error->message);                  g_error_free (error); +        } else { +                g_variant_get (variant, "(o)", &object_path); + +                g_debug ("Registered client at path %s", object_path); + +                g_dbus_proxy_new_for_bus (G_BUS_TYPE_SESSION, 0, NULL, +                                          MATE_SESSION_DBUS_NAME, +                                          object_path, +                                          MATE_SESSION_PRIVATE_DBUS_INTERFACE, +                                          NULL, +                                          got_client_proxy, +                                          manager); + +                g_free (object_path); +                g_variant_unref (variant);          }  }  static void -on_session_end (DBusGProxy *proxy, guint flags, MateSettingsManager *manager) +register_with_mate_session (void)  { +        const char *startup_id;          GError *error = NULL; -        gboolean ret = FALSE; - -        /* send response */ -        ret = dbus_g_proxy_call (proxy, "EndSessionResponse", &error, -                                 G_TYPE_BOOLEAN, TRUE /* ok */, -                                 G_TYPE_STRING, NULL /* reason */, -                                 G_TYPE_INVALID, -                                 G_TYPE_INVALID); -        if (!ret) { -                g_warning ("failed to send session response: %s", error->message); +        GDBusProxy *proxy; + +        proxy = g_dbus_proxy_new_for_bus_sync (G_BUS_TYPE_SESSION, +                                               G_DBUS_PROXY_FLAGS_NONE, +                                               NULL, +                                               MATE_SESSION_DBUS_NAME, +                                               MATE_SESSION_DBUS_OBJECT, +                                               MATE_SESSION_DBUS_INTERFACE, +                                               NULL, +                                               &error); + +        if (proxy == NULL) { +                g_warning ("Unable to contact session manager daemon: %s\n", error->message);                  g_error_free (error);          } - -        mate_settings_manager_stop (manager); -        gtk_main_quit (); +        g_signal_connect (G_OBJECT (proxy), "g-signal", +                          G_CALLBACK (on_session_over), NULL); +        startup_id = g_getenv ("DESKTOP_AUTOSTART_ID"); +        g_dbus_proxy_call (proxy, +                           "RegisterClient", +                           g_variant_new ("(ss)", "mate-settings-daemon", startup_id ? startup_id : ""), +                           G_DBUS_CALL_FLAGS_NONE, +                           -1, +                           NULL, +                           (GAsyncReadyCallback) on_client_registered, +                           manager);  } -static void -on_term_signal (int signal) +static gboolean +on_term_signal (gpointer signal)  {          /* Wake up main loop to tell it to shutdown */          close (term_signal_pipe_fds[1]);          term_signal_pipe_fds[1] = -1; +        return G_SOURCE_REMOVE;  }  static gboolean @@ -291,7 +260,7 @@ on_term_signal_pipe_closed (GIOChannel *source,  }  static void -watch_for_term_signal (MateSettingsManager *manager) +watch_for_term_signal (void)  {          GIOChannel *channel; @@ -308,90 +277,66 @@ watch_for_term_signal (MateSettingsManager *manager)          g_io_add_watch (channel, G_IO_HUP, on_term_signal_pipe_closed, manager);          g_io_channel_unref (channel); -        signal (SIGTERM, on_term_signal); - +        g_unix_signal_add (SIGTERM, on_term_signal, manager);  }  static void -set_session_over_handler (DBusGConnection *bus, MateSettingsManager *manager) +name_acquired_handler (GDBusConnection *connection, +                       const gchar *name, +                       gpointer user_data)  { -        DBusGProxy *session_proxy; -        DBusGProxy *private_proxy; -        gchar *client_id = NULL; -        const char *startup_id; -        GError *error = NULL;          gboolean res; +        g_autoptr (GError) error = NULL; -        g_assert (bus != NULL); +        start_settings_manager (); +        register_with_mate_session (); -        mate_settings_profile_start (NULL); +        /* If we aren't started by dbus then load the plugins automatically after +         * mate-settings-daemon has registered itself. Otherwise, wait for an Awake etc. */ +        if (g_getenv ("DBUS_STARTER_BUS_TYPE") == NULL) { +                error = NULL; +                res = mate_settings_manager_start (manager, PLUGIN_LOAD_DEFER, &error); +                if (! res) { +                        g_warning ("Unable to start: %s", error->message); +                        g_error_free (error); +                        gtk_main_quit (); +                } +        } -        session_proxy = -                 dbus_g_proxy_new_for_name (bus, -                                            MATE_SESSION_DBUS_NAME, -                                            MATE_SESSION_DBUS_OBJECT, -                                            MATE_SESSION_DBUS_INTERFACE); +        watch_for_term_signal (); +} -        dbus_g_object_register_marshaller ( -                g_cclosure_marshal_VOID__VOID, -                G_TYPE_NONE, -                G_TYPE_INVALID); +static void +name_lost_handler (GDBusConnection *connection, +                   const gchar *name, +                   gpointer user_data) +{ +        /* Name was already taken, or the bus went away */ -        dbus_g_proxy_add_signal (session_proxy, -                                 "SessionOver", -                                 G_TYPE_INVALID); +        g_warning ("Name taken or bus went away - shutting down"); -        dbus_g_proxy_connect_signal (session_proxy, -                                     "SessionOver", -                                     G_CALLBACK (on_session_over), -                                     manager, -                                     NULL); +        gtk_main_quit (); -        /* Register with mate-session */ -        startup_id = g_getenv ("DESKTOP_AUTOSTART_ID"); -        if (startup_id != NULL && *startup_id != '\0') { -                res = dbus_g_proxy_call (session_proxy, -                                         "RegisterClient", -                                         &error, -                                         G_TYPE_STRING, "mate-settings-daemon", -                                         G_TYPE_STRING, startup_id, -                                         G_TYPE_INVALID, -                                         DBUS_TYPE_G_OBJECT_PATH, &client_id, -                                         G_TYPE_INVALID); -                if (!res) { -                        g_warning ("failed to register client '%s': %s", startup_id, error->message); -                        g_error_free (error); -                } -                else { -                        /* get org.gnome.SessionManager.ClientPrivate interface */ -                        private_proxy = dbus_g_proxy_new_for_name_owner (bus, MATE_SESSION_DBUS_NAME, -                                                                         client_id, MATE_SESSION_PRIVATE_DBUS_INTERFACE, -                                                                         &error); -                        if (private_proxy == NULL) { -                                g_warning ("DBUS error: %s", error->message); -                                g_error_free (error); -                        } -                        else { - -                            /* get QueryEndSession */ -                            dbus_g_proxy_add_signal (private_proxy, "QueryEndSession", G_TYPE_UINT, G_TYPE_INVALID); -                            dbus_g_proxy_connect_signal (private_proxy, "QueryEndSession", -                                                         G_CALLBACK (on_session_query_end), -                                                         manager, NULL); - -                            /* get EndSession */ -                            dbus_g_proxy_add_signal (private_proxy, "EndSession", G_TYPE_UINT, G_TYPE_INVALID); -                            dbus_g_proxy_connect_signal (private_proxy, "EndSession", -                                                         G_CALLBACK (on_session_end), manager, NULL); - -                        } - -                        g_free (client_id); -                } -        } +} -        watch_for_term_signal (manager); -        mate_settings_profile_end (NULL); +static void +bus_register (void) +{ +        GBusNameOwnerFlags flags; + +        flags = G_BUS_NAME_OWNER_FLAGS_ALLOW_REPLACEMENT; + +        if (replace) +                flags |= G_BUS_NAME_OWNER_FLAGS_REPLACE; + +        name_id = g_bus_own_name (G_BUS_TYPE_SESSION, +                                  MSD_DBUS_NAME, +                                  flags, +                                  NULL, +                                  (GBusNameAcquiredCallback) name_acquired_handler, +                                  (GBusNameLostCallback) name_lost_handler, +                                  NULL, +                                  NULL);  }  static void @@ -461,10 +406,6 @@ static void debug_changed (GSettings *settings,  int  main (int argc, char *argv[])  { -        MateSettingsManager *manager; -        DBusGConnection      *bus; -        gboolean              res; -        GError               *error;          GSettings            *debug_settings = NULL;          manager = NULL; @@ -499,52 +440,12 @@ main (int argc, char *argv[])          g_log_set_default_handler (msd_log_default_handler, NULL); -        bus = get_session_bus (); -        if (bus == NULL) { -                g_warning ("Could not get a connection to the bus"); -                goto out; -        } - -        if (! bus_register (bus)) { -                goto out; -        } +        bus_register ();  #ifdef HAVE_LIBNOTIFY          notify_init ("mate-settings-daemon");  #endif /* HAVE_LIBNOTIFY */ -        mate_settings_profile_start ("mate_settings_manager_new"); -        manager = mate_settings_manager_new (); -        mate_settings_profile_end ("mate_settings_manager_new"); -        if (manager == NULL) { -                g_warning ("Unable to register object"); -                goto out; -        } - -        /* If we aren't started by dbus then load the plugins automatically during the -         * Initialization phase. Otherwise, wait for an Awake etc. */ -        if (g_getenv ("DBUS_STARTER_BUS_TYPE") == NULL) { -                error = NULL; -                res = mate_settings_manager_start (manager, PLUGIN_LOAD_INIT, &error); -                if (! res) { -                        g_warning ("Unable to start: %s", error->message); -                        g_error_free (error); -                } -        } - -        set_session_over_handler (bus, manager); - -        /* If we aren't started by dbus then load the plugins automatically after -         * mate-settings-daemon has registered itself. Otherwise, wait for an Awake etc. */ -        if (g_getenv ("DBUS_STARTER_BUS_TYPE") == NULL) { -                error = NULL; -                res = mate_settings_manager_start (manager, PLUGIN_LOAD_DEFER, &error); -                if (! res) { -                        g_warning ("Unable to start: %s", error->message); -                        g_error_free (error); -                        goto out; -                } -        }          if (do_timed_exit) {                  g_timeout_add_seconds (30, G_SOURCE_FUNC (timed_exit_cb), NULL); @@ -552,12 +453,12 @@ main (int argc, char *argv[])          gtk_main (); - out: +        g_debug ("Shutting down"); -        if (bus != NULL) { -                dbus_g_connection_unref (bus); +        if (name_id > 0) { +                g_bus_unown_name (name_id); +                name_id = 0;          } -          if (manager != NULL) {                  g_object_unref (manager);          } diff --git a/mate-settings-daemon/mate-settings-manager.c b/mate-settings-daemon/mate-settings-manager.c index 7796e3d..d32a446 100644 --- a/mate-settings-daemon/mate-settings-manager.c +++ b/mate-settings-daemon/mate-settings-manager.c @@ -26,28 +26,45 @@  #include <unistd.h>  #include <string.h> -#include <glib.h>  #include <glib/gi18n.h> -#include <glib-object.h> -#define DBUS_API_SUBJECT_TO_CHANGE -#include <dbus/dbus-glib.h> -#include <dbus/dbus-glib-lowlevel.h>  #include <gio/gio.h> +#include <gtk/gtk.h>  #include "mate-settings-plugin-info.h"  #include "mate-settings-manager.h" -#include "mate-settings-manager-glue.h"  #include "mate-settings-profile.h"  #define MSD_MANAGER_DBUS_PATH "/org/mate/SettingsDaemon" +#define MSD_MANAGER_DBUS_NAME "org.mate.SettingsDaemon"  #define DEFAULT_SETTINGS_PREFIX "org.mate.SettingsDaemon"  #define PLUGIN_EXT ".mate-settings-plugin" +static void +mate_settings_manager_finalize (GObject *object); + +static const gchar introspection_xml[] = +"<node name='/org/mate/SettingsDaemon'>" +"  <interface name='org.mate.SettingsDaemon'>" +"    <method name='Awake'/>" +"    <method name='Start'/>" +"    <signal name='PluginActivated'>" +"      <arg name='name' type='s'/>" +"    </signal>" +"    <signal name='PluginDeactivated'>" +"      <arg name='name' type='s'/>" +"    </signal>" +"  </interface>" +"</node>"; +  struct MateSettingsManagerPrivate  { -        DBusGConnection            *connection; +        GDBusNodeInfo              *introspection_data; +        GDBusConnection            *connection; +        guint                       dbus_register_object_id; +        GCancellable               *cancellable; +          GSList                     *plugins;          gint                        init_load_priority;          gint                        load_init_flag; @@ -61,8 +78,6 @@ enum {  static guint signals [LAST_SIGNAL] = { 0, }; -static void     mate_settings_manager_finalize    (GObject *object); -  G_DEFINE_TYPE_WITH_PRIVATE (MateSettingsManager, mate_settings_manager, G_TYPE_OBJECT)  static gpointer manager_object = NULL; @@ -318,23 +333,78 @@ mate_settings_manager_awake (MateSettingsManager *manager,          return mate_settings_manager_start (manager, PLUGIN_LOAD_ALL, error);  } -static gboolean -register_manager (MateSettingsManager *manager) +static void +handle_method_call (GDBusConnection       *connection, +                    const gchar           *sender, +                    const gchar           *object_path, +                    const gchar           *interface_name, +                    const gchar           *method_name, +                    GVariant              *parameters, +                    GDBusMethodInvocation *invocation, +                    gpointer               user_data)  { +        MateSettingsManager *manager = (MateSettingsManager *) user_data;          GError *error = NULL; -        manager->priv->connection = dbus_g_bus_get (DBUS_BUS_SESSION, &error); -        if (manager->priv->connection == NULL) { -                if (error != NULL) { -                        g_critical ("error getting system bus: %s", error->message); -                        g_error_free (error); -                } -                return FALSE; +        g_debug ("Calling method '%s' for settings daemon", method_name); + +        if (g_strcmp0 (method_name, "Awake") == 0) { +                if (mate_settings_manager_awake (manager, &error) == FALSE) +                        g_dbus_method_invocation_return_gerror (invocation, error); +                else +                        g_dbus_method_invocation_return_value (invocation, NULL); +        } else if (g_strcmp0 (method_name, "Start") == 0) { +                if (mate_settings_manager_start (manager, PLUGIN_LOAD_INIT, &error) == FALSE) +                        g_dbus_method_invocation_return_gerror (invocation, error); +                else +                        g_dbus_method_invocation_return_value (invocation, NULL);          } +} -        dbus_g_connection_register_g_object (manager->priv->connection, MSD_MANAGER_DBUS_PATH, G_OBJECT (manager)); +static const GDBusInterfaceVTable interface_vtable = +{ +  .method_call = handle_method_call +}; -        return TRUE; +static void +on_bus_gotten (GObject             *source_object, +               GAsyncResult        *res, +               MateSettingsManager *manager) +{ +        GDBusConnection *connection; +        GError *error = NULL; + +        connection = g_bus_get_finish (res, &error); +        if (connection == NULL) { +                if (!g_error_matches (error, G_IO_ERROR, G_IO_ERROR_CANCELLED)) +                        g_warning ("Could not get session bus: %s", error->message); +                g_error_free (error); +                return; +        } +        manager->priv->connection = connection; + +        manager->priv->dbus_register_object_id = g_dbus_connection_register_object (connection, +                                                                                    MSD_MANAGER_DBUS_PATH, +                                                                                    manager->priv->introspection_data->interfaces[0], +										    &interface_vtable, +                                                                                    manager, +                                                                                    NULL, +                                                                                    NULL); +        g_assert (manager->priv->dbus_register_object_id > 0); +} + +static void +register_manager (MateSettingsManager *manager) +{ +        manager->priv->introspection_data = g_dbus_node_info_new_for_xml (introspection_xml, NULL); +        g_assert (manager->priv->introspection_data != NULL); + +        manager->priv->cancellable = g_cancellable_new (); + +        g_bus_get (G_BUS_TYPE_SESSION, +                   manager->priv->cancellable, +                   (GAsyncReadyCallback) on_bus_gotten, +                   manager);  }  gboolean @@ -362,6 +432,7 @@ mate_settings_manager_start (MateSettingsManager *manager,          manager->priv->load_init_flag = load_init_flag;          _load_all (manager); +        mate_settings_profile_end ("initializing plugins");          ret = TRUE;   out: @@ -418,8 +489,6 @@ mate_settings_manager_class_init (MateSettingsManagerClass *klass)                                g_cclosure_marshal_VOID__STRING,                                G_TYPE_NONE,                                1, G_TYPE_STRING); - -        dbus_g_object_type_install_info (MATE_TYPE_SETTINGS_MANAGER, &dbus_glib_mate_settings_manager_object_info);  }  static void @@ -461,17 +530,11 @@ mate_settings_manager_new (void)          if (manager_object != NULL) {                  g_object_ref (manager_object);          } else { -                gboolean res; -                  manager_object = g_object_new (MATE_TYPE_SETTINGS_MANAGER,                                                 NULL);                  g_object_add_weak_pointer (manager_object,                                             (gpointer *) &manager_object); -                res = register_manager (manager_object); -                if (! res) { -                        g_object_unref (manager_object); -                        return NULL; -                } +                register_manager (manager_object);          }          return MATE_SETTINGS_MANAGER (manager_object); diff --git a/mate-settings-daemon/mate-settings-manager.h b/mate-settings-daemon/mate-settings-manager.h index f8737e6..fbcd294 100644 --- a/mate-settings-daemon/mate-settings-manager.h +++ b/mate-settings-daemon/mate-settings-manager.h @@ -24,9 +24,7 @@  #include <glib-object.h> -#ifdef __cplusplus -extern "C" { -#endif +G_BEGIN_DECLS  #define MATE_TYPE_SETTINGS_MANAGER         (mate_settings_manager_get_type ())  #define MATE_SETTINGS_MANAGER(o)           (G_TYPE_CHECK_INSTANCE_CAST ((o), MATE_TYPE_SETTINGS_MANAGER, MateSettingsManager)) @@ -67,21 +65,18 @@ enum  #define MATE_SETTINGS_MANAGER_ERROR mate_settings_manager_error_quark () -GQuark                 mate_settings_manager_error_quark         (void); -GType                  mate_settings_manager_get_type   (void); +GQuark                 mate_settings_manager_error_quark   (void); +GType                  mate_settings_manager_get_type      (void);  MateSettingsManager * mate_settings_manager_new        (void); -gboolean               mate_settings_manager_start      (MateSettingsManager *manager, -                                                          gint                load_init_flag, -                                                          GError            **error); -void                   mate_settings_manager_stop       (MateSettingsManager *manager); +gboolean              mate_settings_manager_start      (MateSettingsManager *manager, +                                                        gint                 load_init_flag, +                                                        GError             **error); +void                  mate_settings_manager_stop       (MateSettingsManager *manager); +gboolean              mate_settings_manager_awake      (MateSettingsManager *manager, +                                                        GError              **error); -gboolean               mate_settings_manager_awake      (MateSettingsManager *manager, -                                                          GError              **error); - -#ifdef __cplusplus -} -#endif +G_END_DECLS  #endif /* __MATE_SETTINGS_MANAGER_H */ diff --git a/mate-settings-daemon/mate-settings-manager.xml b/mate-settings-daemon/mate-settings-manager.xml index b1e316f..00c9f25 100644 --- a/mate-settings-daemon/mate-settings-manager.xml +++ b/mate-settings-daemon/mate-settings-manager.xml @@ -1,7 +1,6 @@  <!DOCTYPE node PUBLIC "-//freedesktop//DTD D-BUS Object Introspection 1.0//EN" "http://www.freedesktop.org/standards/dbus/1.0/introspect.dtd">  <node name="/org/mate/SettingsDaemon">    <interface name="org.mate.SettingsDaemon"> -    <annotation name="org.freedesktop.DBus.GLib.CSymbol" value="mate_settings_manager"/>      <method name="Awake"/>      <method name="Start"/>      <signal name="PluginActivated"> diff --git a/mate-settings-daemon/mate-settings-plugin-info.c b/mate-settings-daemon/mate-settings-plugin-info.c index b258612..50508cb 100644 --- a/mate-settings-daemon/mate-settings-plugin-info.c +++ b/mate-settings-daemon/mate-settings-plugin-info.c @@ -33,8 +33,6 @@  #include "mate-settings-plugin.h"  #include "mate-settings-profile.h" -#define MATE_SETTINGS_PLUGIN_INFO_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), MATE_TYPE_SETTINGS_PLUGIN_INFO, MateSettingsPluginInfoPrivate)) -  #define PLUGIN_GROUP "MATE Settings Plugin"  #define PLUGIN_PRIORITY_MAX 1 @@ -148,7 +146,7 @@ mate_settings_plugin_info_class_init (MateSettingsPluginInfoClass *klass)  static void  mate_settings_plugin_info_init (MateSettingsPluginInfo *info)  { -        info->priv = MATE_SETTINGS_PLUGIN_INFO_GET_PRIVATE (info); +        info->priv = mate_settings_plugin_info_get_instance_private (info);  }  static void | 
