mirror of
https://github.com/brl/mutter.git
synced 2025-02-04 15:44:10 +00:00
x11/session: Make state tracking context aware
Instead of passing around state using GINT_TO_POINTER() pass around a state struct that also carries a pointer to the context. This allows avoiding using old singletons for getting a window list. Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/2718>
This commit is contained in:
parent
1b737190cc
commit
3a1ded73ad
@ -71,6 +71,16 @@ meta_window_release_saved_state (const MetaWindowSessionInfo *info)
|
|||||||
#include "meta/main.h"
|
#include "meta/main.h"
|
||||||
#include "meta/workspace.h"
|
#include "meta/workspace.h"
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
grefcount ref_count;
|
||||||
|
|
||||||
|
MetaContext *context;
|
||||||
|
|
||||||
|
gboolean shutdown;
|
||||||
|
gboolean successful;
|
||||||
|
} SessionState;
|
||||||
|
|
||||||
typedef struct _MetaIceConnection
|
typedef struct _MetaIceConnection
|
||||||
{
|
{
|
||||||
IceConn ice_connection;
|
IceConn ice_connection;
|
||||||
@ -82,12 +92,41 @@ static void ice_io_error_handler (IceConn connection);
|
|||||||
static void new_ice_connection (IceConn connection, IcePointer client_data,
|
static void new_ice_connection (IceConn connection, IcePointer client_data,
|
||||||
Bool opening, IcePointer *watch_data);
|
Bool opening, IcePointer *watch_data);
|
||||||
|
|
||||||
static void save_state (void);
|
static void save_state (MetaContext *context);
|
||||||
static char* load_state (const char *previous_save_file);
|
static char* load_state (const char *previous_save_file);
|
||||||
static void regenerate_save_file (void);
|
static void regenerate_save_file (void);
|
||||||
static const char* full_save_file (void);
|
static const char* full_save_file (void);
|
||||||
static void disconnect (void);
|
static void disconnect (void);
|
||||||
|
|
||||||
|
static SessionState *
|
||||||
|
session_state_new (MetaContext *context,
|
||||||
|
Bool shutdown)
|
||||||
|
{
|
||||||
|
SessionState *state;
|
||||||
|
|
||||||
|
state = g_new0 (SessionState, 1);
|
||||||
|
g_ref_count_init (&state->ref_count);
|
||||||
|
state->successful = TRUE;
|
||||||
|
state->shutdown = shutdown;
|
||||||
|
state->context = context;
|
||||||
|
|
||||||
|
return state;
|
||||||
|
}
|
||||||
|
|
||||||
|
static SessionState *
|
||||||
|
session_state_ref (SessionState *state)
|
||||||
|
{
|
||||||
|
g_ref_count_inc (&state->ref_count);
|
||||||
|
return state;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
session_state_unref (SessionState *state)
|
||||||
|
{
|
||||||
|
if (g_ref_count_dec (&state->ref_count))
|
||||||
|
g_free (state);
|
||||||
|
}
|
||||||
|
|
||||||
/* This is called when data is available on an ICE connection. */
|
/* This is called when data is available on an ICE connection. */
|
||||||
static gboolean
|
static gboolean
|
||||||
process_ice_messages (GIOChannel *channel,
|
process_ice_messages (GIOChannel *channel,
|
||||||
@ -289,7 +328,7 @@ meta_session_init (MetaContext *context,
|
|||||||
|
|
||||||
session_connection =
|
session_connection =
|
||||||
SmcOpenConnection (NULL, /* use SESSION_MANAGER env */
|
SmcOpenConnection (NULL, /* use SESSION_MANAGER env */
|
||||||
NULL, /* means use existing ICE connection */
|
context,
|
||||||
SmProtoMajor,
|
SmProtoMajor,
|
||||||
SmProtoMinor,
|
SmProtoMinor,
|
||||||
mask,
|
mask,
|
||||||
@ -403,12 +442,11 @@ disconnect (void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
save_yourself_possibly_done (gboolean shutdown,
|
save_yourself_possibly_done (SessionState *state)
|
||||||
gboolean successful)
|
|
||||||
{
|
{
|
||||||
meta_topic (META_DEBUG_SM,
|
meta_topic (META_DEBUG_SM,
|
||||||
"save possibly done shutdown = %d success = %d",
|
"save possibly done shutdown = %d success = %d",
|
||||||
shutdown, successful);
|
state->shutdown, state->successful);
|
||||||
|
|
||||||
if (current_state == STATE_SAVING_PHASE_1)
|
if (current_state == STATE_SAVING_PHASE_1)
|
||||||
{
|
{
|
||||||
@ -416,10 +454,12 @@ save_yourself_possibly_done (gboolean shutdown,
|
|||||||
|
|
||||||
status = SmcRequestSaveYourselfPhase2 (session_connection,
|
status = SmcRequestSaveYourselfPhase2 (session_connection,
|
||||||
save_phase_2_callback,
|
save_phase_2_callback,
|
||||||
GINT_TO_POINTER (shutdown));
|
session_state_ref (state));
|
||||||
|
|
||||||
if (status)
|
if (status)
|
||||||
current_state = STATE_WAITING_FOR_PHASE_2;
|
current_state = STATE_WAITING_FOR_PHASE_2;
|
||||||
|
else
|
||||||
|
session_state_unref (state);
|
||||||
|
|
||||||
meta_topic (META_DEBUG_SM,
|
meta_topic (META_DEBUG_SM,
|
||||||
"Requested phase 2, status = %d", status);
|
"Requested phase 2, status = %d", status);
|
||||||
@ -436,10 +476,12 @@ save_yourself_possibly_done (gboolean shutdown,
|
|||||||
*/
|
*/
|
||||||
SmDialogNormal,
|
SmDialogNormal,
|
||||||
interact_callback,
|
interact_callback,
|
||||||
GINT_TO_POINTER (shutdown));
|
session_state_ref (state));
|
||||||
|
|
||||||
if (status)
|
if (status)
|
||||||
current_state = STATE_WAITING_FOR_INTERACT;
|
current_state = STATE_WAITING_FOR_INTERACT;
|
||||||
|
else
|
||||||
|
session_state_unref (state);
|
||||||
|
|
||||||
meta_topic (META_DEBUG_SM,
|
meta_topic (META_DEBUG_SM,
|
||||||
"Requested interact, status = %d", status);
|
"Requested interact, status = %d", status);
|
||||||
@ -453,29 +495,31 @@ save_yourself_possibly_done (gboolean shutdown,
|
|||||||
meta_topic (META_DEBUG_SM, "Sending SaveYourselfDone");
|
meta_topic (META_DEBUG_SM, "Sending SaveYourselfDone");
|
||||||
|
|
||||||
SmcSaveYourselfDone (session_connection,
|
SmcSaveYourselfDone (session_connection,
|
||||||
successful);
|
state->successful);
|
||||||
|
|
||||||
if (shutdown)
|
if (state->shutdown)
|
||||||
current_state = STATE_FROZEN;
|
current_state = STATE_FROZEN;
|
||||||
else
|
else
|
||||||
current_state = STATE_IDLE;
|
current_state = STATE_IDLE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
session_state_unref (state);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
save_phase_2_callback (SmcConn smc_conn, SmPointer client_data)
|
save_phase_2_callback (SmcConn smc_conn, SmPointer client_data)
|
||||||
{
|
{
|
||||||
gboolean shutdown;
|
SessionState *state = client_data;
|
||||||
|
|
||||||
meta_topic (META_DEBUG_SM, "Phase 2 save");
|
meta_topic (META_DEBUG_SM, "Phase 2 save");
|
||||||
|
|
||||||
shutdown = GPOINTER_TO_INT (client_data);
|
|
||||||
|
|
||||||
current_state = STATE_SAVING_PHASE_2;
|
current_state = STATE_SAVING_PHASE_2;
|
||||||
|
|
||||||
save_state ();
|
save_state (state->context);
|
||||||
|
|
||||||
save_yourself_possibly_done (shutdown, TRUE);
|
state->successful = TRUE;
|
||||||
|
|
||||||
|
save_yourself_possibly_done (state);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -486,12 +530,11 @@ save_yourself_callback (SmcConn smc_conn,
|
|||||||
int interact_style,
|
int interact_style,
|
||||||
Bool fast)
|
Bool fast)
|
||||||
{
|
{
|
||||||
gboolean successful;
|
MetaContext *context = META_CONTEXT (client_data);
|
||||||
|
SessionState *state;
|
||||||
|
|
||||||
meta_topic (META_DEBUG_SM, "SaveYourself received");
|
meta_topic (META_DEBUG_SM, "SaveYourself received");
|
||||||
|
|
||||||
successful = TRUE;
|
|
||||||
|
|
||||||
/* The first SaveYourself after registering for the first time
|
/* The first SaveYourself after registering for the first time
|
||||||
* is a special case (SM specs 7.2).
|
* is a special case (SM specs 7.2).
|
||||||
*/
|
*/
|
||||||
@ -513,6 +556,8 @@ save_yourself_callback (SmcConn smc_conn,
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
state = session_state_new (context, shutdown);
|
||||||
|
|
||||||
/* ignore Global style saves
|
/* ignore Global style saves
|
||||||
*
|
*
|
||||||
* This interpretaion of the Local/Global/Both styles
|
* This interpretaion of the Local/Global/Both styles
|
||||||
@ -523,7 +568,7 @@ save_yourself_callback (SmcConn smc_conn,
|
|||||||
if (save_style == SmSaveGlobal)
|
if (save_style == SmSaveGlobal)
|
||||||
{
|
{
|
||||||
current_state = STATE_SKIPPING_GLOBAL_SAVE;
|
current_state = STATE_SKIPPING_GLOBAL_SAVE;
|
||||||
save_yourself_possibly_done (shutdown, successful);
|
save_yourself_possibly_done (session_state_ref (state));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -535,7 +580,8 @@ save_yourself_callback (SmcConn smc_conn,
|
|||||||
|
|
||||||
set_clone_restart_commands ();
|
set_clone_restart_commands ();
|
||||||
|
|
||||||
save_yourself_possibly_done (shutdown, successful);
|
save_yourself_possibly_done (session_state_ref (state));
|
||||||
|
session_state_unref (state);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -586,18 +632,17 @@ shutdown_cancelled_callback (SmcConn smc_conn, SmPointer client_data)
|
|||||||
static void
|
static void
|
||||||
interact_callback (SmcConn smc_conn, SmPointer client_data)
|
interact_callback (SmcConn smc_conn, SmPointer client_data)
|
||||||
{
|
{
|
||||||
/* nothing */
|
SessionState *state = client_data;
|
||||||
gboolean shutdown;
|
|
||||||
|
|
||||||
meta_topic (META_DEBUG_SM, "Interaction permission received");
|
meta_topic (META_DEBUG_SM, "Interaction permission received");
|
||||||
|
|
||||||
shutdown = GPOINTER_TO_INT (client_data);
|
|
||||||
|
|
||||||
current_state = STATE_DONE_WITH_INTERACT;
|
current_state = STATE_DONE_WITH_INTERACT;
|
||||||
|
|
||||||
SmcInteractDone (session_connection, False /* don't cancel logout */);
|
SmcInteractDone (session_connection, False /* don't cancel logout */);
|
||||||
|
|
||||||
save_yourself_possibly_done (shutdown, TRUE);
|
state->successful = TRUE;
|
||||||
|
|
||||||
|
save_yourself_possibly_done (state);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -840,8 +885,9 @@ decode_text_from_utf8 (const char *text)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
save_state (void)
|
save_state (MetaContext *context)
|
||||||
{
|
{
|
||||||
|
MetaDisplay *display = meta_context_get_display (context);
|
||||||
char *mutter_dir;
|
char *mutter_dir;
|
||||||
char *session_dir;
|
char *session_dir;
|
||||||
FILE *outfile;
|
FILE *outfile;
|
||||||
@ -913,7 +959,7 @@ save_state (void)
|
|||||||
fprintf (outfile, "<mutter_session id=\"%s\">\n",
|
fprintf (outfile, "<mutter_session id=\"%s\">\n",
|
||||||
client_id);
|
client_id);
|
||||||
|
|
||||||
windows = meta_display_list_windows (meta_get_display (), META_LIST_DEFAULT);
|
windows = meta_display_list_windows (display, META_LIST_DEFAULT);
|
||||||
stack_position = 0;
|
stack_position = 0;
|
||||||
|
|
||||||
windows = g_slist_sort (windows, meta_display_stack_cmp);
|
windows = g_slist_sort (windows, meta_display_stack_cmp);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user