[Sugar-devel] [PATCH sugar-toolkit-gtk3] Restore use of XSMP client
Simon Schampijer
simon at schampijer.de
Fri Nov 23 13:41:15 EST 2012
Pushed, thanks - seems to work.
Simon
On 11/14/2012 11:07 PM, Daniel Drake wrote:
> 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.
> ---
> 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 f25606b..be43461 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 33c9a5d..85e3a91 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 <gdk/gdk.h>
>
> -#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 0000000..1fbf5c5
> --- /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 <glib-object.h>
> +#include <X11/SM/SMlib.h>
> +
> +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 f89533d..c6ee2fe 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):
>
More information about the Sugar-devel
mailing list