mirror of
https://github.com/brl/mutter.git
synced 2024-12-24 20:12:06 +00:00
window: Move the session restoration and post-manage move_resize to window-x11
This commit is contained in:
parent
900ae2c1fa
commit
4c21a46452
@ -54,7 +54,6 @@
|
|||||||
#include "x11/window-x11.h"
|
#include "x11/window-x11.h"
|
||||||
#include "x11/window-props.h"
|
#include "x11/window-props.h"
|
||||||
#include "x11/xprops.h"
|
#include "x11/xprops.h"
|
||||||
#include "x11/session.h"
|
|
||||||
|
|
||||||
#include "wayland/window-wayland.h"
|
#include "wayland/window-wayland.h"
|
||||||
#include "wayland/meta-wayland-private.h"
|
#include "wayland/meta-wayland-private.h"
|
||||||
@ -108,8 +107,6 @@ static void meta_window_flush_calc_showing (MetaWindow *window);
|
|||||||
static gboolean queue_calc_showing_func (MetaWindow *window,
|
static gboolean queue_calc_showing_func (MetaWindow *window,
|
||||||
void *data);
|
void *data);
|
||||||
|
|
||||||
static void meta_window_apply_session_info (MetaWindow *window,
|
|
||||||
const MetaWindowSessionInfo *info);
|
|
||||||
static void meta_window_move_between_rects (MetaWindow *window,
|
static void meta_window_move_between_rects (MetaWindow *window,
|
||||||
const MetaRectangle *old_area,
|
const MetaRectangle *old_area,
|
||||||
const MetaRectangle *new_area);
|
const MetaRectangle *new_area);
|
||||||
@ -771,7 +768,6 @@ _meta_window_shared_new (MetaDisplay *display,
|
|||||||
{
|
{
|
||||||
MetaWindow *window;
|
MetaWindow *window;
|
||||||
MetaWorkspace *space;
|
MetaWorkspace *space;
|
||||||
MetaMoveResizeFlags flags;
|
|
||||||
|
|
||||||
g_assert (attrs != NULL);
|
g_assert (attrs != NULL);
|
||||||
|
|
||||||
@ -1153,34 +1149,6 @@ _meta_window_shared_new (MetaDisplay *display,
|
|||||||
else
|
else
|
||||||
window->layer = META_LAYER_OVERRIDE_REDIRECT; /* otherwise set by MetaStack */
|
window->layer = META_LAYER_OVERRIDE_REDIRECT; /* otherwise set by MetaStack */
|
||||||
|
|
||||||
/* Put our state back where it should be,
|
|
||||||
* passing TRUE for is_configure_request, ICCCM says
|
|
||||||
* initial map is handled same as configure request
|
|
||||||
*/
|
|
||||||
flags =
|
|
||||||
META_IS_CONFIGURE_REQUEST | META_IS_MOVE_ACTION | META_IS_RESIZE_ACTION;
|
|
||||||
if (!window->override_redirect)
|
|
||||||
meta_window_move_resize_internal (window,
|
|
||||||
flags,
|
|
||||||
window->size_hints.win_gravity,
|
|
||||||
window->size_hints.x,
|
|
||||||
window->size_hints.y,
|
|
||||||
window->size_hints.width,
|
|
||||||
window->size_hints.height);
|
|
||||||
|
|
||||||
/* Now try applying saved stuff from the session */
|
|
||||||
{
|
|
||||||
const MetaWindowSessionInfo *info;
|
|
||||||
|
|
||||||
info = meta_window_lookup_saved_state (window);
|
|
||||||
|
|
||||||
if (info)
|
|
||||||
{
|
|
||||||
meta_window_apply_session_info (window, info);
|
|
||||||
meta_window_release_saved_state (info);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!window->override_redirect)
|
if (!window->override_redirect)
|
||||||
{
|
{
|
||||||
/* FIXME we have a tendency to set this then immediately
|
/* FIXME we have a tendency to set this then immediately
|
||||||
@ -1296,144 +1264,6 @@ meta_window_wayland_new (MetaDisplay *display,
|
|||||||
return window;
|
return window;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* This function should only be called from the end of meta_window_new_with_attrs () */
|
|
||||||
static void
|
|
||||||
meta_window_apply_session_info (MetaWindow *window,
|
|
||||||
const MetaWindowSessionInfo *info)
|
|
||||||
{
|
|
||||||
if (info->stack_position_set)
|
|
||||||
{
|
|
||||||
meta_topic (META_DEBUG_SM,
|
|
||||||
"Restoring stack position %d for window %s\n",
|
|
||||||
info->stack_position, window->desc);
|
|
||||||
|
|
||||||
/* FIXME well, I'm not sure how to do this. */
|
|
||||||
}
|
|
||||||
|
|
||||||
if (info->minimized_set)
|
|
||||||
{
|
|
||||||
meta_topic (META_DEBUG_SM,
|
|
||||||
"Restoring minimized state %d for window %s\n",
|
|
||||||
info->minimized, window->desc);
|
|
||||||
|
|
||||||
if (window->has_minimize_func && info->minimized)
|
|
||||||
meta_window_minimize (window);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (info->maximized_set)
|
|
||||||
{
|
|
||||||
meta_topic (META_DEBUG_SM,
|
|
||||||
"Restoring maximized state %d for window %s\n",
|
|
||||||
info->maximized, window->desc);
|
|
||||||
|
|
||||||
if (window->has_maximize_func && info->maximized)
|
|
||||||
{
|
|
||||||
meta_window_maximize (window, META_MAXIMIZE_BOTH);
|
|
||||||
|
|
||||||
if (info->saved_rect_set)
|
|
||||||
{
|
|
||||||
meta_topic (META_DEBUG_SM,
|
|
||||||
"Restoring saved rect %d,%d %dx%d for window %s\n",
|
|
||||||
info->saved_rect.x,
|
|
||||||
info->saved_rect.y,
|
|
||||||
info->saved_rect.width,
|
|
||||||
info->saved_rect.height,
|
|
||||||
window->desc);
|
|
||||||
|
|
||||||
window->saved_rect.x = info->saved_rect.x;
|
|
||||||
window->saved_rect.y = info->saved_rect.y;
|
|
||||||
window->saved_rect.width = info->saved_rect.width;
|
|
||||||
window->saved_rect.height = info->saved_rect.height;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (info->on_all_workspaces_set)
|
|
||||||
{
|
|
||||||
window->on_all_workspaces_requested = info->on_all_workspaces;
|
|
||||||
meta_window_update_on_all_workspaces (window);
|
|
||||||
meta_topic (META_DEBUG_SM,
|
|
||||||
"Restoring sticky state %d for window %s\n",
|
|
||||||
window->on_all_workspaces_requested, window->desc);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (info->workspace_indices)
|
|
||||||
{
|
|
||||||
GSList *tmp;
|
|
||||||
GSList *spaces;
|
|
||||||
|
|
||||||
spaces = NULL;
|
|
||||||
|
|
||||||
tmp = info->workspace_indices;
|
|
||||||
while (tmp != NULL)
|
|
||||||
{
|
|
||||||
MetaWorkspace *space;
|
|
||||||
|
|
||||||
space =
|
|
||||||
meta_screen_get_workspace_by_index (window->screen,
|
|
||||||
GPOINTER_TO_INT (tmp->data));
|
|
||||||
|
|
||||||
if (space)
|
|
||||||
spaces = g_slist_prepend (spaces, space);
|
|
||||||
|
|
||||||
tmp = tmp->next;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (spaces)
|
|
||||||
{
|
|
||||||
/* This briefly breaks the invariant that we are supposed
|
|
||||||
* to always be on some workspace. But we paranoically
|
|
||||||
* ensured that one of the workspaces from the session was
|
|
||||||
* indeed valid, so we know we'll go right back to one.
|
|
||||||
*/
|
|
||||||
if (window->workspace)
|
|
||||||
meta_workspace_remove_window (window->workspace, window);
|
|
||||||
|
|
||||||
/* Only restore to the first workspace if the window
|
|
||||||
* happened to be on more than one, since we have replaces
|
|
||||||
* window->workspaces with window->workspace
|
|
||||||
*/
|
|
||||||
meta_workspace_add_window (spaces->data, window);
|
|
||||||
|
|
||||||
meta_topic (META_DEBUG_SM,
|
|
||||||
"Restoring saved window %s to workspace %d\n",
|
|
||||||
window->desc,
|
|
||||||
meta_workspace_index (spaces->data));
|
|
||||||
|
|
||||||
g_slist_free (spaces);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (info->geometry_set)
|
|
||||||
{
|
|
||||||
int x, y, w, h;
|
|
||||||
MetaMoveResizeFlags flags;
|
|
||||||
|
|
||||||
window->placed = TRUE; /* don't do placement algorithms later */
|
|
||||||
|
|
||||||
x = info->rect.x;
|
|
||||||
y = info->rect.y;
|
|
||||||
|
|
||||||
w = window->size_hints.base_width +
|
|
||||||
info->rect.width * window->size_hints.width_inc;
|
|
||||||
h = window->size_hints.base_height +
|
|
||||||
info->rect.height * window->size_hints.height_inc;
|
|
||||||
|
|
||||||
/* Force old gravity, ignoring anything now set */
|
|
||||||
window->size_hints.win_gravity = info->gravity;
|
|
||||||
|
|
||||||
meta_topic (META_DEBUG_SM,
|
|
||||||
"Restoring pos %d,%d size %d x %d for %s\n",
|
|
||||||
x, y, w, h, window->desc);
|
|
||||||
|
|
||||||
flags = META_DO_GRAVITY_ADJUST | META_IS_MOVE_ACTION | META_IS_RESIZE_ACTION;
|
|
||||||
meta_window_move_resize_internal (window,
|
|
||||||
flags,
|
|
||||||
window->size_hints.win_gravity,
|
|
||||||
x, y, w, h);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
detach_foreach_func (MetaWindow *window,
|
detach_foreach_func (MetaWindow *window,
|
||||||
void *data)
|
void *data)
|
||||||
|
@ -45,6 +45,8 @@
|
|||||||
#include "window-props.h"
|
#include "window-props.h"
|
||||||
#include "xprops.h"
|
#include "xprops.h"
|
||||||
#include "resizepopup.h"
|
#include "resizepopup.h"
|
||||||
|
#include "session.h"
|
||||||
|
#include "workspace-private.h"
|
||||||
|
|
||||||
struct _MetaWindowX11Class
|
struct _MetaWindowX11Class
|
||||||
{
|
{
|
||||||
@ -248,10 +250,148 @@ send_configure_notify (MetaWindow *window)
|
|||||||
meta_error_trap_pop (window->display);
|
meta_error_trap_pop (window->display);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
meta_window_apply_session_info (MetaWindow *window,
|
||||||
|
const MetaWindowSessionInfo *info)
|
||||||
|
{
|
||||||
|
if (info->stack_position_set)
|
||||||
|
{
|
||||||
|
meta_topic (META_DEBUG_SM,
|
||||||
|
"Restoring stack position %d for window %s\n",
|
||||||
|
info->stack_position, window->desc);
|
||||||
|
|
||||||
|
/* FIXME well, I'm not sure how to do this. */
|
||||||
|
}
|
||||||
|
|
||||||
|
if (info->minimized_set)
|
||||||
|
{
|
||||||
|
meta_topic (META_DEBUG_SM,
|
||||||
|
"Restoring minimized state %d for window %s\n",
|
||||||
|
info->minimized, window->desc);
|
||||||
|
|
||||||
|
if (window->has_minimize_func && info->minimized)
|
||||||
|
meta_window_minimize (window);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (info->maximized_set)
|
||||||
|
{
|
||||||
|
meta_topic (META_DEBUG_SM,
|
||||||
|
"Restoring maximized state %d for window %s\n",
|
||||||
|
info->maximized, window->desc);
|
||||||
|
|
||||||
|
if (window->has_maximize_func && info->maximized)
|
||||||
|
{
|
||||||
|
meta_window_maximize (window, META_MAXIMIZE_BOTH);
|
||||||
|
|
||||||
|
if (info->saved_rect_set)
|
||||||
|
{
|
||||||
|
meta_topic (META_DEBUG_SM,
|
||||||
|
"Restoring saved rect %d,%d %dx%d for window %s\n",
|
||||||
|
info->saved_rect.x,
|
||||||
|
info->saved_rect.y,
|
||||||
|
info->saved_rect.width,
|
||||||
|
info->saved_rect.height,
|
||||||
|
window->desc);
|
||||||
|
|
||||||
|
window->saved_rect.x = info->saved_rect.x;
|
||||||
|
window->saved_rect.y = info->saved_rect.y;
|
||||||
|
window->saved_rect.width = info->saved_rect.width;
|
||||||
|
window->saved_rect.height = info->saved_rect.height;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (info->on_all_workspaces_set)
|
||||||
|
{
|
||||||
|
window->on_all_workspaces_requested = info->on_all_workspaces;
|
||||||
|
meta_window_update_on_all_workspaces (window);
|
||||||
|
meta_topic (META_DEBUG_SM,
|
||||||
|
"Restoring sticky state %d for window %s\n",
|
||||||
|
window->on_all_workspaces_requested, window->desc);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (info->workspace_indices)
|
||||||
|
{
|
||||||
|
GSList *tmp;
|
||||||
|
GSList *spaces;
|
||||||
|
|
||||||
|
spaces = NULL;
|
||||||
|
|
||||||
|
tmp = info->workspace_indices;
|
||||||
|
while (tmp != NULL)
|
||||||
|
{
|
||||||
|
MetaWorkspace *space;
|
||||||
|
|
||||||
|
space =
|
||||||
|
meta_screen_get_workspace_by_index (window->screen,
|
||||||
|
GPOINTER_TO_INT (tmp->data));
|
||||||
|
|
||||||
|
if (space)
|
||||||
|
spaces = g_slist_prepend (spaces, space);
|
||||||
|
|
||||||
|
tmp = tmp->next;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (spaces)
|
||||||
|
{
|
||||||
|
/* This briefly breaks the invariant that we are supposed
|
||||||
|
* to always be on some workspace. But we paranoically
|
||||||
|
* ensured that one of the workspaces from the session was
|
||||||
|
* indeed valid, so we know we'll go right back to one.
|
||||||
|
*/
|
||||||
|
if (window->workspace)
|
||||||
|
meta_workspace_remove_window (window->workspace, window);
|
||||||
|
|
||||||
|
/* Only restore to the first workspace if the window
|
||||||
|
* happened to be on more than one, since we have replaces
|
||||||
|
* window->workspaces with window->workspace
|
||||||
|
*/
|
||||||
|
meta_workspace_add_window (spaces->data, window);
|
||||||
|
|
||||||
|
meta_topic (META_DEBUG_SM,
|
||||||
|
"Restoring saved window %s to workspace %d\n",
|
||||||
|
window->desc,
|
||||||
|
meta_workspace_index (spaces->data));
|
||||||
|
|
||||||
|
g_slist_free (spaces);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (info->geometry_set)
|
||||||
|
{
|
||||||
|
int x, y, w, h;
|
||||||
|
MetaMoveResizeFlags flags;
|
||||||
|
|
||||||
|
window->placed = TRUE; /* don't do placement algorithms later */
|
||||||
|
|
||||||
|
x = info->rect.x;
|
||||||
|
y = info->rect.y;
|
||||||
|
|
||||||
|
w = window->size_hints.base_width +
|
||||||
|
info->rect.width * window->size_hints.width_inc;
|
||||||
|
h = window->size_hints.base_height +
|
||||||
|
info->rect.height * window->size_hints.height_inc;
|
||||||
|
|
||||||
|
/* Force old gravity, ignoring anything now set */
|
||||||
|
window->size_hints.win_gravity = info->gravity;
|
||||||
|
|
||||||
|
meta_topic (META_DEBUG_SM,
|
||||||
|
"Restoring pos %d,%d size %d x %d for %s\n",
|
||||||
|
x, y, w, h, window->desc);
|
||||||
|
|
||||||
|
flags = META_DO_GRAVITY_ADJUST | META_IS_MOVE_ACTION | META_IS_RESIZE_ACTION;
|
||||||
|
meta_window_move_resize_internal (window,
|
||||||
|
flags,
|
||||||
|
window->size_hints.win_gravity,
|
||||||
|
x, y, w, h);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
meta_window_x11_manage (MetaWindow *window)
|
meta_window_x11_manage (MetaWindow *window)
|
||||||
{
|
{
|
||||||
MetaDisplay *display = window->display;
|
MetaDisplay *display = window->display;
|
||||||
|
MetaMoveResizeFlags flags;
|
||||||
|
|
||||||
meta_display_register_x_window (display, &window->xwindow, window);
|
meta_display_register_x_window (display, &window->xwindow, window);
|
||||||
meta_window_x11_update_shape_region (window);
|
meta_window_x11_update_shape_region (window);
|
||||||
@ -268,6 +408,33 @@ meta_window_x11_manage (MetaWindow *window)
|
|||||||
update_sm_hints (window); /* must come after transient_for */
|
update_sm_hints (window); /* must come after transient_for */
|
||||||
|
|
||||||
meta_window_x11_update_net_wm_type (window);
|
meta_window_x11_update_net_wm_type (window);
|
||||||
|
|
||||||
|
/* Now try applying saved stuff from the session */
|
||||||
|
{
|
||||||
|
const MetaWindowSessionInfo *info;
|
||||||
|
|
||||||
|
info = meta_window_lookup_saved_state (window);
|
||||||
|
|
||||||
|
if (info)
|
||||||
|
{
|
||||||
|
meta_window_apply_session_info (window, info);
|
||||||
|
meta_window_release_saved_state (info);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Put our state back where it should be,
|
||||||
|
* passing TRUE for is_configure_request, ICCCM says
|
||||||
|
* initial map is handled same as configure request
|
||||||
|
*/
|
||||||
|
flags = META_IS_CONFIGURE_REQUEST | META_IS_MOVE_ACTION | META_IS_RESIZE_ACTION;
|
||||||
|
if (!window->override_redirect)
|
||||||
|
meta_window_move_resize_internal (window,
|
||||||
|
flags,
|
||||||
|
window->size_hints.win_gravity,
|
||||||
|
window->size_hints.x,
|
||||||
|
window->size_hints.y,
|
||||||
|
window->size_hints.width,
|
||||||
|
window->size_hints.height);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
Loading…
Reference in New Issue
Block a user