diff options
| -rw-r--r-- | configure.ac | 21 | ||||
| -rw-r--r-- | mate-session/Makefile.am | 26 | ||||
| -rw-r--r-- | mate-session/gsm-app.c | 135 | ||||
| -rw-r--r-- | mate-session/gsm-app.h | 11 | ||||
| -rw-r--r-- | mate-session/gsm-manager.c | 17 |
5 files changed, 140 insertions, 70 deletions
diff --git a/configure.ac b/configure.ac index 0bf02ca..c6d13c9 100644 --- a/configure.ac +++ b/configure.ac @@ -84,6 +84,26 @@ fi AM_CONDITIONAL([HAVE_GLESV2], [test "x$have_glesv2" = "xyes"]) dnl ==================================================================== +dnl libcanberra (optional) for sound events +dnl ==================================================================== + +AC_ARG_WITH([libcanberra], + AS_HELP_STRING([--without-libcanberra], [Disable sound events (default: auto)]), + [with_libcanberra=$withval], [with_libcanberra=auto]) + +have_libcanberra=no +if test "x$with_libcanberra" != "xno"; then + PKG_CHECK_MODULES(LIBCANBERRA, libcanberra-gtk3, + [AC_DEFINE(HAVE_LIBCANBERRA, 1, [Define if libcanberra-gtk3 is available]) + have_libcanberra=yes], have_libcanberra=no) + if test "x$have_libcanberra" = xno -a "x$with_libcanberra" = xyes; then + AC_MSG_ERROR([libcanberra support requested but library not found]) + fi +fi +AC_SUBST(LIBCANBERRA_CFLAGS) +AC_SUBST(LIBCANBERRA_LIBS) + +dnl ==================================================================== dnl Option to set the default window manager dnl ==================================================================== AC_ARG_WITH(default-wm, @@ -385,5 +405,6 @@ echo " XTest support: ${have_xtest} Build documentation: ${enable_docbook_docs} Native Language support: ${USE_NLS} + Libcanberra support: ${have_libcanberra} " diff --git a/mate-session/Makefile.am b/mate-session/Makefile.am index 448ee76..43b861b 100644 --- a/mate-session/Makefile.am +++ b/mate-session/Makefile.am @@ -23,8 +23,6 @@ mate_session_SOURCES = \ gsm-xsmp-client.c \ gsm-dbus-client.h \ gsm-dbus-client.c \ - gsm-marshal.h \ - gsm-marshal.c \ gsm-consolekit.c \ gsm-consolekit.h \ gsm-systemd.c \ @@ -55,7 +53,8 @@ mate_session_SOURCES = \ gsm-session-save.c \ gsm-session-save.h \ gsm-xsmp-server.c \ - gsm-xsmp-server.h + gsm-xsmp-server.h \ + $(BUILT_SOURCES) mate_session_CPPFLAGS = \ $(AM_CPPFLAGS) \ @@ -63,6 +62,7 @@ mate_session_CPPFLAGS = \ $(SM_CFLAGS) \ $(ICE_CFLAGS) \ $(XEXT_CFLAGS) \ + $(LIBCANBERRA_CFLAGS) \ -I$(top_srcdir)/mate-submodules/libegg \ -DLOCALE_DIR=\""$(datadir)/locale"\" \ -DDATA_DIR=\""$(datadir)/mate-session"\" \ @@ -82,7 +82,8 @@ mate_session_LDADD = \ $(MATE_SESSION_LIBS) \ $(SYSTEMD_LIBS) \ $(LIBELOGIND_LIBS) \ - $(EXECINFO_LIBS) + $(EXECINFO_LIBS) \ + $(LIBCANBERRA_LIBS) libgsmutil_la_SOURCES = \ gsm-util.c \ @@ -97,6 +98,15 @@ test_inhibit_LDADD = $(MATE_SESSION_LIBS) test_client_dbus_SOURCES = test-client-dbus.c test_client_dbus_LDADD = $(MATE_SESSION_LIBS) +org.gnome.SessionManager.App.h: org.gnome.SessionManager.App.xml Makefile.am + $(AM_V_GEN) gdbus-codegen --interface-prefix org.gnome.SessionManager.App. \ + --generate-c-code org.gnome.SessionManager.App \ + --c-namespace Gsm \ + --annotate "org.gnome.SessionManager.App" "org.gtk.GDBus.C.Name" ExportedApp \ + $(srcdir)/org.gnome.SessionManager.App.xml +org.gnome.SessionManager.App.c: org.gnome.SessionManager.App.h + @: # generated as a side-effect + gsm-marshal.c: gsm-marshal.list $(AM_V_GEN)echo "#include \"gsm-marshal.h\"" > $@ && \ $(GLIB_GENMARSHAL) $< --prefix=gsm_marshal --body >> $@ @@ -110,9 +120,6 @@ gsm-manager-glue.h: org.gnome.SessionManager.xml Makefile.am gsm-client-glue.h: org.gnome.SessionManager.Client.xml Makefile.am $(AM_V_GEN)dbus-binding-tool --prefix=gsm_client --mode=glib-server --output=gsm-client-glue.h $(srcdir)/org.gnome.SessionManager.Client.xml -gsm-app-glue.h: org.gnome.SessionManager.App.xml Makefile.am - $(AM_V_GEN)dbus-binding-tool --prefix=gsm_app --mode=glib-server --output=gsm-app-glue.h $(srcdir)/org.gnome.SessionManager.App.xml - gsm-inhibitor-glue.h: org.gnome.SessionManager.Inhibitor.xml Makefile.am $(AM_V_GEN)dbus-binding-tool --prefix=gsm_inhibitor --mode=glib-server --output=gsm-inhibitor-glue.h $(srcdir)/org.gnome.SessionManager.Inhibitor.xml @@ -122,11 +129,12 @@ gsm-presence-glue.h: org.gnome.SessionManager.Presence.xml Makefile.am BUILT_SOURCES = \ gsm-marshal.c \ gsm-marshal.h \ + org.gnome.SessionManager.App.h \ + org.gnome.SessionManager.App.c \ gsm-manager-glue.h \ gsm-presence-glue.h \ gsm-inhibitor-glue.h \ - gsm-client-glue.h \ - gsm-app-glue.h + gsm-client-glue.h EXTRA_DIST = \ README \ diff --git a/mate-session/gsm-app.c b/mate-session/gsm-app.c index 6d7a058..0260b21 100644 --- a/mate-session/gsm-app.c +++ b/mate-session/gsm-app.c @@ -28,14 +28,15 @@ #include <string.h> #include "gsm-app.h" -#include "gsm-app-glue.h" +#include "org.gnome.SessionManager.App.h" typedef struct { char *id; char *app_id; int phase; char *startup_id; - DBusGConnection *connection; + GDBusConnection *connection; + GsmExportedApp *skeleton; } GsmAppPrivate; enum { @@ -71,6 +72,52 @@ gsm_app_error_quark (void) } +static gboolean +gsm_app_get_app_id (GsmExportedApp *skeleton, + GDBusMethodInvocation *invocation, + GsmApp *app) +{ + const gchar *id; + + if (GSM_APP_GET_CLASS (app)->impl_get_app_id == NULL) { + g_dbus_method_invocation_return_error (invocation, + GSM_APP_ERROR, GSM_APP_ERROR_GENERAL, + "App ID not available"); + return TRUE; + } + + id = GSM_APP_GET_CLASS (app)->impl_get_app_id (app); + gsm_exported_app_complete_get_app_id (skeleton, invocation, + id != NULL ? id : ""); + + return TRUE; +} + +static gboolean +gsm_app_get_startup_id (GsmExportedApp *skeleton, + GDBusMethodInvocation *invocation, + GsmApp *app) +{ + GsmAppPrivate *priv; + + priv = gsm_app_get_instance_private (app); + gsm_exported_app_complete_get_startup_id (skeleton, invocation, priv->startup_id); + + return TRUE; +} + +static gboolean +gsm_app_get_phase (GsmExportedApp *skeleton, + GDBusMethodInvocation *invocation, + GsmApp *app) +{ + GsmAppPrivate *priv; + + priv = gsm_app_get_instance_private (app); + gsm_exported_app_complete_get_phase (skeleton, invocation, priv->phase); + return TRUE; +} + static guint32 get_next_app_serial (void) { @@ -90,20 +137,38 @@ register_app (GsmApp *app) { GError *error; GsmAppPrivate *priv; + GsmExportedApp *skeleton; error = NULL; priv = gsm_app_get_instance_private (app); - priv->connection = dbus_g_bus_get (DBUS_BUS_SESSION, &error); - if (priv->connection == NULL) { - if (error != NULL) { - g_critical ("error getting session bus: %s", error->message); - g_error_free (error); - } + priv->connection = g_bus_get_sync (G_BUS_TYPE_SESSION, NULL, &error); + if (error != NULL) { + g_critical ("error getting session bus: %s", error->message); + g_error_free (error); + return FALSE; + } + + skeleton = gsm_exported_app_skeleton_new (); + priv->skeleton = skeleton; + g_dbus_interface_skeleton_export (G_DBUS_INTERFACE_SKELETON (skeleton), + priv->connection, priv->id, + &error); + + if (error != NULL) { + g_critical ("error registering app on session bus: %s", error->message); + g_error_free (error); + g_clear_object (&priv->skeleton); + g_clear_object (&priv->connection); return FALSE; } - dbus_g_connection_register_g_object (priv->connection, priv->id, G_OBJECT (app)); + g_signal_connect (skeleton, "handle-get-app-id", + G_CALLBACK (gsm_app_get_app_id), app); + g_signal_connect (skeleton, "handle-get-phase", + G_CALLBACK (gsm_app_get_phase), app); + g_signal_connect (skeleton, "handle-get-startup-id", + G_CALLBACK (gsm_app_get_startup_id), app); return TRUE; } @@ -134,7 +199,7 @@ gsm_app_constructor (GType type, } static void -gsm_app_init (GsmApp *app) +gsm_app_init (GsmApp G_GNUC_UNUSED *app) { } @@ -185,7 +250,7 @@ static void gsm_app_set_property (GObject *object, guint prop_id, const GValue *value, - GParamSpec *pspec) + GParamSpec *pspec G_GNUC_UNUSED) { GsmApp *app = GSM_APP (object); @@ -208,7 +273,7 @@ static void gsm_app_get_property (GObject *object, guint prop_id, GValue *value, - GParamSpec *pspec) + GParamSpec *pspec G_GNUC_UNUSED) { GsmAppPrivate *priv; GsmApp *app = GSM_APP (object); @@ -244,6 +309,14 @@ gsm_app_dispose (GObject *object) g_free (priv->id); priv->id = NULL; + if (priv->skeleton != NULL) { + g_dbus_interface_skeleton_unexport_from_connection (G_DBUS_INTERFACE_SKELETON (priv->skeleton), + priv->connection); + g_clear_object (&priv->skeleton); + } + + g_clear_object (&priv->connection); + G_OBJECT_CLASS (gsm_app_parent_class)->dispose (object); } @@ -316,8 +389,6 @@ gsm_app_class_init (GsmAppClass *klass) g_cclosure_marshal_VOID__VOID, G_TYPE_NONE, 0); - - dbus_g_object_type_install_info (GSM_TYPE_APP, &dbus_glib_gsm_app_object_info); } const char * @@ -501,39 +572,3 @@ gsm_app_died (GsmApp *app) g_signal_emit (app, signals[DIED], 0); } - -gboolean -gsm_app_get_app_id (GsmApp *app, - char **id, - GError **error) -{ - g_return_val_if_fail (GSM_IS_APP (app), FALSE); - *id = g_strdup (GSM_APP_GET_CLASS (app)->impl_get_app_id (app)); - return TRUE; -} - -gboolean -gsm_app_get_startup_id (GsmApp *app, - char **id, - GError **error) -{ - GsmAppPrivate *priv; - g_return_val_if_fail (GSM_IS_APP (app), FALSE); - - priv = gsm_app_get_instance_private (app); - *id = g_strdup (priv->startup_id); - return TRUE; -} - -gboolean -gsm_app_get_phase (GsmApp *app, - guint *phase, - GError **error) -{ - GsmAppPrivate *priv; - g_return_val_if_fail (GSM_IS_APP (app), FALSE); - - priv = gsm_app_get_instance_private (app); - *phase = priv->phase; - return TRUE; -} diff --git a/mate-session/gsm-app.h b/mate-session/gsm-app.h index 96a06d1..8c2424a 100644 --- a/mate-session/gsm-app.h +++ b/mate-session/gsm-app.h @@ -104,17 +104,6 @@ gboolean gsm_app_has_autostart_condition (GsmApp *app, void gsm_app_registered (GsmApp *app); int gsm_app_peek_autostart_delay (GsmApp *app); -/* exported to bus */ -gboolean gsm_app_get_app_id (GsmApp *app, - char **id, - GError **error); -gboolean gsm_app_get_startup_id (GsmApp *app, - char **id, - GError **error); -gboolean gsm_app_get_phase (GsmApp *app, - guint *phase, - GError **error); - G_END_DECLS #endif /* __GSM_APP_H__ */ diff --git a/mate-session/gsm-manager.c b/mate-session/gsm-manager.c index 37ca39d..d67bed1 100644 --- a/mate-session/gsm-manager.c +++ b/mate-session/gsm-manager.c @@ -65,6 +65,10 @@ #endif #include "gsm-session-save.h" +#ifdef HAVE_LIBCANBERRA +#include <canberra-gtk.h> +#endif + #define GSM_MANAGER_GET_PRIVATE(o) (G_TYPE_INSTANCE_GET_PRIVATE ((o), GSM_TYPE_MANAGER, GsmManagerPrivate)) #define GSM_MANAGER_DBUS_PATH "/org/gnome/SessionManager" @@ -1548,6 +1552,13 @@ do_phase_query_end_session (GsmManager *manager) data.flags = 0; priv = gsm_manager_get_instance_private (manager); +#ifdef HAVE_LIBCANBERRA + ca_context_play (ca_gtk_context_get (), 0, + CA_PROP_EVENT_ID, "desktop-logout", + CA_PROP_EVENT_DESCRIPTION, "Session logout", + NULL); +#endif + if (priv->logout_mode == GSM_MANAGER_LOGOUT_MODE_FORCE) { data.flags |= GSM_CLIENT_END_SESSION_FLAG_FORCEFUL; } @@ -1620,6 +1631,12 @@ start_phase (GsmManager *manager) break; case GSM_MANAGER_PHASE_RUNNING: g_signal_emit (manager, signals[SESSION_RUNNING], 0); +#ifdef HAVE_LIBCANBERRA + ca_context_play (ca_gtk_context_get (), 0, + CA_PROP_EVENT_ID, "desktop-login", + CA_PROP_EVENT_DESCRIPTION, "Session login", + NULL); +#endif update_idle (manager); break; case GSM_MANAGER_PHASE_QUERY_END_SESSION: |
