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 <simon@laptop.org>
This commit is contained in:
parent
6a01d9228d
commit
4234ca684e
@ -126,6 +126,8 @@ SugarExt_1_0_gir_FILES = \
|
|||||||
acme-volume-alsa.h \
|
acme-volume-alsa.h \
|
||||||
eggsmclient.c \
|
eggsmclient.c \
|
||||||
eggsmclient.h \
|
eggsmclient.h \
|
||||||
|
eggsmclient-xsmp.c \
|
||||||
|
eggsmclient-xsmp.h \
|
||||||
gsm-session.c \
|
gsm-session.c \
|
||||||
gsm-session.h \
|
gsm-session.h \
|
||||||
gsm-xsmp.c \
|
gsm-xsmp.c \
|
||||||
|
@ -26,6 +26,7 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "eggsmclient.h"
|
#include "eggsmclient.h"
|
||||||
|
#include "eggsmclient-xsmp.h"
|
||||||
#include "eggsmclient-private.h"
|
#include "eggsmclient-private.h"
|
||||||
|
|
||||||
#include "eggdesktopfile.h"
|
#include "eggdesktopfile.h"
|
||||||
@ -39,35 +40,6 @@
|
|||||||
|
|
||||||
#include <gdk/gdk.h>
|
#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[] = {
|
static const char *state_names[] = {
|
||||||
"start",
|
"start",
|
||||||
"idle",
|
"idle",
|
||||||
@ -81,40 +53,6 @@ static const char *state_names[] = {
|
|||||||
|
|
||||||
#define EGG_SM_CLIENT_XSMP_STATE(xsmp) (state_names[(xsmp)->state])
|
#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,
|
static void sm_client_xsmp_startup (EggSMClient *client,
|
||||||
const char *client_id);
|
const char *client_id);
|
||||||
static void sm_client_xsmp_set_restart_command (EggSMClient *client,
|
static void sm_client_xsmp_set_restart_command (EggSMClient *client,
|
||||||
|
96
src/sugar3/eggsmclient-xsmp.h
Normal file
96
src/sugar3/eggsmclient-xsmp.h
Normal file
@ -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__ */
|
@ -24,10 +24,8 @@ import os
|
|||||||
from gi.repository import SugarExt
|
from gi.repository import SugarExt
|
||||||
|
|
||||||
|
|
||||||
class XSMPClient(SugarExt.Client):
|
class XSMPClient(SugarExt.ClientXSMP):
|
||||||
|
pass
|
||||||
def __init__(self):
|
|
||||||
SugarExt.Client.__init__(self)
|
|
||||||
|
|
||||||
|
|
||||||
class SessionManager(object):
|
class SessionManager(object):
|
||||||
|
Loading…
Reference in New Issue
Block a user