Add a framework for restarting the compositor with nice visuals
The current GNOME Shell Alt-F2 restart looks very messy and also provides no indication to the user what is going on. We need to restart the compositor to switch in and out of stereo mode, so add a framework for doing this more cleanly: Additions: meta_restart(): restarts the compositor with a message MetaDisplay::show-restart-message: signal the embedding shell to show a message MetaDisplay::restart: signal the embedding shell to restart itself. meta_is_restart(): indicates whether the current instance is a restart so we can suppress login animations. A helper program meta-restart-helper holds the composite overlay window up during the restart to avoid visual artifacts.
This commit is contained in:
@@ -130,6 +130,8 @@ enum
|
||||
WINDOW_MARKED_URGENT,
|
||||
GRAB_OP_BEGIN,
|
||||
GRAB_OP_END,
|
||||
SHOW_RESTART_MESSAGE,
|
||||
RESTART,
|
||||
LAST_SIGNAL
|
||||
};
|
||||
|
||||
@@ -306,6 +308,59 @@ meta_display_class_init (MetaDisplayClass *klass)
|
||||
META_TYPE_WINDOW,
|
||||
META_TYPE_GRAB_OP);
|
||||
|
||||
/**
|
||||
* MetaDisplay::show-restart-message:
|
||||
* @display: the #MetaDisplay instance
|
||||
* @message: (allow-none): The message to display, or %NULL
|
||||
* to clear a previous restart message.
|
||||
*
|
||||
* The ::show-restart-message signal will be emitted to indicate
|
||||
* that the compositor should show a message during restart. This is
|
||||
* emitted when meta_restart() is called, either by Mutter
|
||||
* internally or by the embedding compositor. The message should be
|
||||
* immediately added to the Clutter stage in its final form -
|
||||
* ::restart will be emitted to exit the application and leave the
|
||||
* stage contents frozen as soon as the the stage is painted again.
|
||||
*
|
||||
* On case of failure to restart, this signal will be emitted again
|
||||
* with %NULL for @message.
|
||||
*
|
||||
* Returns: %TRUE means the message was added to the stage; %FALSE
|
||||
* indicates that the compositor did not show the message.
|
||||
*/
|
||||
display_signals[SHOW_RESTART_MESSAGE] =
|
||||
g_signal_new ("show-restart-message",
|
||||
G_TYPE_FROM_CLASS (klass),
|
||||
G_SIGNAL_RUN_LAST,
|
||||
0,
|
||||
g_signal_accumulator_true_handled,
|
||||
NULL, NULL,
|
||||
G_TYPE_BOOLEAN, 1,
|
||||
G_TYPE_STRING);
|
||||
|
||||
/**
|
||||
* MetaDisplay::restart:
|
||||
* @display: the #MetaDisplay instance
|
||||
*
|
||||
* The ::restart signal is emitted to indicate that compositor
|
||||
* should reexec the process. This is
|
||||
* emitted when meta_restart() is called, either by Mutter
|
||||
* internally or by the embedding compositor. See also
|
||||
* ::show-restart-message.
|
||||
*
|
||||
* Returns: %FALSE to indicate that the compositor could not
|
||||
* be restarted. When the compositor is restarted, the signal
|
||||
* should not return.
|
||||
*/
|
||||
display_signals[RESTART] =
|
||||
g_signal_new ("restart",
|
||||
G_TYPE_FROM_CLASS (klass),
|
||||
G_SIGNAL_RUN_LAST,
|
||||
0,
|
||||
g_signal_accumulator_true_handled,
|
||||
NULL, NULL,
|
||||
G_TYPE_BOOLEAN, 0);
|
||||
|
||||
g_object_class_install_property (object_class,
|
||||
PROP_FOCUS_WINDOW,
|
||||
g_param_spec_object ("focus-window",
|
||||
@@ -5939,3 +5994,28 @@ meta_display_clear_mouse_mode (MetaDisplay *display)
|
||||
{
|
||||
display->mouse_mode = FALSE;
|
||||
}
|
||||
|
||||
gboolean
|
||||
meta_display_show_restart_message (MetaDisplay *display,
|
||||
const char *message)
|
||||
{
|
||||
gboolean result = FALSE;
|
||||
|
||||
g_signal_emit (display,
|
||||
display_signals[SHOW_RESTART_MESSAGE], 0,
|
||||
message, &result);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
gboolean
|
||||
meta_display_request_restart (MetaDisplay *display)
|
||||
{
|
||||
gboolean result = FALSE;
|
||||
|
||||
g_signal_emit (display,
|
||||
display_signals[RESTART], 0,
|
||||
&result);
|
||||
|
||||
return result;
|
||||
}
|
||||
|
Reference in New Issue
Block a user