From 4234ca684e2e6074d94ab72d34c48324ca3df65b Mon Sep 17 00:00:00 2001 From: Daniel Drake Date: Wed, 14 Nov 2012 17:07:40 -0500 Subject: [PATCH] Restore use of XSMP client In the GTK3 port we mistakenly moved from using the EggSMClientXSMP class to the (stub-like) EggSMClient base class for Sugar's XSMPClient class, instantiated for every activity. This meant that the GTK3 activities weren't registering with the session manager, meaning that they won't automatically save their work when the user shuts down, and they can't inhibit shutdown, etc. Restore this functionality by adding the appropriate header so that EggSMClientXSMP is introspectable, and then use it from the Python code. Acked-by: Simon Schampijer --- src/sugar3/Makefile.am | 2 + src/sugar3/eggsmclient-xsmp.c | 64 +---------------------- src/sugar3/eggsmclient-xsmp.h | 96 +++++++++++++++++++++++++++++++++++ src/sugar3/session.py | 6 +-- 4 files changed, 101 insertions(+), 67 deletions(-) create mode 100644 src/sugar3/eggsmclient-xsmp.h diff --git a/src/sugar3/Makefile.am b/src/sugar3/Makefile.am index f25606bb..be43461c 100644 --- a/src/sugar3/Makefile.am +++ b/src/sugar3/Makefile.am @@ -126,6 +126,8 @@ SugarExt_1_0_gir_FILES = \ acme-volume-alsa.h \ eggsmclient.c \ eggsmclient.h \ + eggsmclient-xsmp.c \ + eggsmclient-xsmp.h \ gsm-session.c \ gsm-session.h \ gsm-xsmp.c \ diff --git a/src/sugar3/eggsmclient-xsmp.c b/src/sugar3/eggsmclient-xsmp.c index 33c9a5db..85e3a914 100644 --- a/src/sugar3/eggsmclient-xsmp.c +++ b/src/sugar3/eggsmclient-xsmp.c @@ -26,6 +26,7 @@ #endif #include "eggsmclient.h" +#include "eggsmclient-xsmp.h" #include "eggsmclient-private.h" #include "eggdesktopfile.h" @@ -39,35 +40,6 @@ #include -#define EGG_TYPE_SM_CLIENT_XSMP (egg_sm_client_xsmp_get_type ()) -#define EGG_SM_CLIENT_XSMP(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), EGG_TYPE_SM_CLIENT_XSMP, EggSMClientXSMP)) -#define EGG_SM_CLIENT_XSMP_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), EGG_TYPE_SM_CLIENT_XSMP, EggSMClientXSMPClass)) -#define EGG_IS_SM_CLIENT_XSMP(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), EGG_TYPE_SM_CLIENT_XSMP)) -#define EGG_IS_SM_CLIENT_XSMP_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), EGG_TYPE_SM_CLIENT_XSMP)) -#define EGG_SM_CLIENT_XSMP_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), EGG_TYPE_SM_CLIENT_XSMP, EggSMClientXSMPClass)) - -typedef struct _EggSMClientXSMP EggSMClientXSMP; -typedef struct _EggSMClientXSMPClass EggSMClientXSMPClass; - -/* These mostly correspond to the similarly-named states in section - * 9.1 of the XSMP spec. Some of the states there aren't represented - * here, because we don't need them. SHUTDOWN_CANCELLED is slightly - * different from the spec; we use it when the client is IDLE after a - * ShutdownCancelled message, but the application is still interacting - * and doesn't know the shutdown has been cancelled yet. - */ -typedef enum -{ - XSMP_STATE_START, - XSMP_STATE_IDLE, - XSMP_STATE_SAVE_YOURSELF, - XSMP_STATE_INTERACT_REQUEST, - XSMP_STATE_INTERACT, - XSMP_STATE_SAVE_YOURSELF_DONE, - XSMP_STATE_SHUTDOWN_CANCELLED, - XSMP_STATE_CONNECTION_CLOSED, -} EggSMClientXSMPState; - static const char *state_names[] = { "start", "idle", @@ -81,40 +53,6 @@ static const char *state_names[] = { #define EGG_SM_CLIENT_XSMP_STATE(xsmp) (state_names[(xsmp)->state]) -struct _EggSMClientXSMP -{ - EggSMClient parent; - - SmcConn connection; - char *client_id; - - EggSMClientXSMPState state; - char **restart_command; - gboolean set_restart_command; - int restart_style; - - guint idle; - - /* Current SaveYourself state */ - guint expecting_initial_save_yourself : 1; - guint need_save_state : 1; - guint need_quit_requested : 1; - guint interact_errors : 1; - guint shutting_down : 1; - - /* Todo list */ - guint waiting_to_emit_quit : 1; - guint waiting_to_emit_quit_cancelled : 1; - guint waiting_to_save_myself : 1; - -}; - -struct _EggSMClientXSMPClass -{ - EggSMClientClass parent_class; - -}; - static void sm_client_xsmp_startup (EggSMClient *client, const char *client_id); static void sm_client_xsmp_set_restart_command (EggSMClient *client, diff --git a/src/sugar3/eggsmclient-xsmp.h b/src/sugar3/eggsmclient-xsmp.h new file mode 100644 index 00000000..1fbf5c5b --- /dev/null +++ b/src/sugar3/eggsmclient-xsmp.h @@ -0,0 +1,96 @@ +/* eggsmclient.h + * Copyright (C) 2007 Novell, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library 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 + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#ifndef __EGG_SM_CLIENT_XSMP_H__ +#define __EGG_SM_CLIENT_XSMP_H__ + +#include +#include + +G_BEGIN_DECLS + + +#define EGG_TYPE_SM_CLIENT_XSMP (egg_sm_client_xsmp_get_type ()) +#define EGG_SM_CLIENT_XSMP(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), EGG_TYPE_SM_CLIENT_XSMP, EggSMClientXSMP)) +#define EGG_SM_CLIENT_XSMP_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), EGG_TYPE_SM_CLIENT_XSMP, EggSMClientXSMPClass)) +#define EGG_IS_SM_CLIENT_XSMP(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), EGG_TYPE_SM_CLIENT_XSMP)) +#define EGG_IS_SM_CLIENT_XSMP_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), EGG_TYPE_SM_CLIENT_XSMP)) +#define EGG_SM_CLIENT_XSMP_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), EGG_TYPE_SM_CLIENT_XSMP, EggSMClientXSMPClass)) + +typedef struct _EggSMClientXSMP EggSMClientXSMP; +typedef struct _EggSMClientXSMPClass EggSMClientXSMPClass; + +/* These mostly correspond to the similarly-named states in section + * 9.1 of the XSMP spec. Some of the states there aren't represented + * here, because we don't need them. SHUTDOWN_CANCELLED is slightly + * different from the spec; we use it when the client is IDLE after a + * ShutdownCancelled message, but the application is still interacting + * and doesn't know the shutdown has been cancelled yet. + */ +typedef enum +{ + XSMP_STATE_START, + XSMP_STATE_IDLE, + XSMP_STATE_SAVE_YOURSELF, + XSMP_STATE_INTERACT_REQUEST, + XSMP_STATE_INTERACT, + XSMP_STATE_SAVE_YOURSELF_DONE, + XSMP_STATE_SHUTDOWN_CANCELLED, + XSMP_STATE_CONNECTION_CLOSED, +} EggSMClientXSMPState; + +struct _EggSMClientXSMP +{ + EggSMClient parent; + + SmcConn connection; + char *client_id; + + EggSMClientXSMPState state; + char **restart_command; + gboolean set_restart_command; + int restart_style; + + guint idle; + + /* Current SaveYourself state */ + guint expecting_initial_save_yourself : 1; + guint need_save_state : 1; + guint need_quit_requested : 1; + guint interact_errors : 1; + guint shutting_down : 1; + + /* Todo list */ + guint waiting_to_emit_quit : 1; + guint waiting_to_emit_quit_cancelled : 1; + guint waiting_to_save_myself : 1; + +}; + +struct _EggSMClientXSMPClass +{ + EggSMClientClass parent_class; + +}; + +GType egg_sm_client_xsmp_get_type (void) G_GNUC_CONST; + +G_END_DECLS + +#endif /* __EGG_SM_CLIENT_XSMP_H__ */ diff --git a/src/sugar3/session.py b/src/sugar3/session.py index f89533d9..c6ee2fee 100644 --- a/src/sugar3/session.py +++ b/src/sugar3/session.py @@ -24,10 +24,8 @@ import os from gi.repository import SugarExt -class XSMPClient(SugarExt.Client): - - def __init__(self): - SugarExt.Client.__init__(self) +class XSMPClient(SugarExt.ClientXSMP): + pass class SessionManager(object):