mirror of
https://github.com/brl/mutter.git
synced 2024-11-22 08:00:42 -05:00
window: Move meta_window_move_resize_request to window-x11
This commit is contained in:
parent
d9a2443e53
commit
f2328f1105
@ -612,13 +612,6 @@ void meta_window_get_geometry (MetaWindow *window,
|
|||||||
|
|
||||||
void meta_window_update_unfocused_button_grabs (MetaWindow *window);
|
void meta_window_update_unfocused_button_grabs (MetaWindow *window);
|
||||||
|
|
||||||
void meta_window_move_resize_request(MetaWindow *window,
|
|
||||||
guint value_mask,
|
|
||||||
int gravity,
|
|
||||||
int x,
|
|
||||||
int y,
|
|
||||||
int width,
|
|
||||||
int height);
|
|
||||||
void meta_window_set_focused_internal (MetaWindow *window,
|
void meta_window_set_focused_internal (MetaWindow *window,
|
||||||
gboolean focused);
|
gboolean focused);
|
||||||
|
|
||||||
|
@ -5305,171 +5305,6 @@ meta_window_lower (MetaWindow *window)
|
|||||||
meta_stack_lower (window->screen->stack, window);
|
meta_stack_lower (window->screen->stack, window);
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
|
||||||
meta_window_move_resize_request (MetaWindow *window,
|
|
||||||
guint value_mask,
|
|
||||||
int gravity,
|
|
||||||
int new_x,
|
|
||||||
int new_y,
|
|
||||||
int new_width,
|
|
||||||
int new_height)
|
|
||||||
{
|
|
||||||
int x, y, width, height;
|
|
||||||
gboolean allow_position_change;
|
|
||||||
gboolean in_grab_op;
|
|
||||||
MetaMoveResizeFlags flags;
|
|
||||||
|
|
||||||
/* We ignore configure requests while the user is moving/resizing
|
|
||||||
* the window, since these represent the app sucking and fighting
|
|
||||||
* the user, most likely due to a bug in the app (e.g. pfaedit
|
|
||||||
* seemed to do this)
|
|
||||||
*
|
|
||||||
* Still have to do the ConfigureNotify and all, but pretend the
|
|
||||||
* app asked for the current size/position instead of the new one.
|
|
||||||
*/
|
|
||||||
in_grab_op = FALSE;
|
|
||||||
if (window->display->grab_op != META_GRAB_OP_NONE &&
|
|
||||||
window == window->display->grab_window)
|
|
||||||
{
|
|
||||||
switch (window->display->grab_op)
|
|
||||||
{
|
|
||||||
case META_GRAB_OP_MOVING:
|
|
||||||
case META_GRAB_OP_RESIZING_SE:
|
|
||||||
case META_GRAB_OP_RESIZING_S:
|
|
||||||
case META_GRAB_OP_RESIZING_SW:
|
|
||||||
case META_GRAB_OP_RESIZING_N:
|
|
||||||
case META_GRAB_OP_RESIZING_NE:
|
|
||||||
case META_GRAB_OP_RESIZING_NW:
|
|
||||||
case META_GRAB_OP_RESIZING_W:
|
|
||||||
case META_GRAB_OP_RESIZING_E:
|
|
||||||
in_grab_op = TRUE;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* it's essential to use only the explicitly-set fields,
|
|
||||||
* and otherwise use our current up-to-date position.
|
|
||||||
*
|
|
||||||
* Otherwise you get spurious position changes when the app changes
|
|
||||||
* size, for example, if window->rect is not in sync with the
|
|
||||||
* server-side position in effect when the configure request was
|
|
||||||
* generated.
|
|
||||||
*/
|
|
||||||
meta_window_get_gravity_position (window,
|
|
||||||
gravity,
|
|
||||||
&x, &y);
|
|
||||||
|
|
||||||
allow_position_change = FALSE;
|
|
||||||
|
|
||||||
if (meta_prefs_get_disable_workarounds ())
|
|
||||||
{
|
|
||||||
if (window->type == META_WINDOW_DIALOG ||
|
|
||||||
window->type == META_WINDOW_MODAL_DIALOG ||
|
|
||||||
window->type == META_WINDOW_SPLASHSCREEN)
|
|
||||||
; /* No position change for these */
|
|
||||||
else if ((window->size_hints.flags & PPosition) ||
|
|
||||||
/* USPosition is just stale if window is placed;
|
|
||||||
* no --geometry involved here.
|
|
||||||
*/
|
|
||||||
((window->size_hints.flags & USPosition) &&
|
|
||||||
!window->placed))
|
|
||||||
allow_position_change = TRUE;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
allow_position_change = TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (in_grab_op)
|
|
||||||
allow_position_change = FALSE;
|
|
||||||
|
|
||||||
if (allow_position_change)
|
|
||||||
{
|
|
||||||
if (value_mask & CWX)
|
|
||||||
x = new_x;
|
|
||||||
if (value_mask & CWY)
|
|
||||||
y = new_y;
|
|
||||||
if (value_mask & (CWX | CWY))
|
|
||||||
{
|
|
||||||
/* Once manually positioned, windows shouldn't be placed
|
|
||||||
* by the window manager.
|
|
||||||
*/
|
|
||||||
window->placed = TRUE;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
meta_topic (META_DEBUG_GEOMETRY,
|
|
||||||
"Not allowing position change for window %s PPosition 0x%lx USPosition 0x%lx type %u\n",
|
|
||||||
window->desc, window->size_hints.flags & PPosition,
|
|
||||||
window->size_hints.flags & USPosition,
|
|
||||||
window->type);
|
|
||||||
}
|
|
||||||
|
|
||||||
width = window->rect.width;
|
|
||||||
height = window->rect.height;
|
|
||||||
if (!in_grab_op)
|
|
||||||
{
|
|
||||||
if (value_mask & CWWidth)
|
|
||||||
width = new_width;
|
|
||||||
|
|
||||||
if (value_mask & CWHeight)
|
|
||||||
height = new_height;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* ICCCM 4.1.5 */
|
|
||||||
|
|
||||||
/* We're ignoring the value_mask here, since sizes
|
|
||||||
* not in the mask will be the current window geometry.
|
|
||||||
*/
|
|
||||||
window->size_hints.x = x;
|
|
||||||
window->size_hints.y = y;
|
|
||||||
window->size_hints.width = width;
|
|
||||||
window->size_hints.height = height;
|
|
||||||
|
|
||||||
/* NOTE: We consider ConfigureRequests to be "user" actions in one
|
|
||||||
* way, but not in another. Explanation of the two cases are in the
|
|
||||||
* next two big comments.
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* The constraints code allows user actions to move windows
|
|
||||||
* offscreen, etc., and configure request actions would often send
|
|
||||||
* windows offscreen when users don't want it if not constrained
|
|
||||||
* (e.g. hitting a dropdown triangle in a fileselector to show more
|
|
||||||
* options, which makes the window bigger). Thus we do not set
|
|
||||||
* META_IS_USER_ACTION in flags to the
|
|
||||||
* meta_window_move_resize_internal() call.
|
|
||||||
*/
|
|
||||||
flags = META_IS_CONFIGURE_REQUEST;
|
|
||||||
if (value_mask & (CWX | CWY))
|
|
||||||
flags |= META_IS_MOVE_ACTION;
|
|
||||||
if (value_mask & (CWWidth | CWHeight))
|
|
||||||
flags |= META_IS_RESIZE_ACTION;
|
|
||||||
|
|
||||||
if (flags & (META_IS_MOVE_ACTION | META_IS_RESIZE_ACTION))
|
|
||||||
meta_window_move_resize_internal (window,
|
|
||||||
flags,
|
|
||||||
gravity,
|
|
||||||
x,
|
|
||||||
y,
|
|
||||||
width,
|
|
||||||
height);
|
|
||||||
|
|
||||||
/* window->user_rect exists to allow "snapping-back" the window if a
|
|
||||||
* new strut is set (causing the window to move) and then the strut
|
|
||||||
* is later removed without the user moving the window in the
|
|
||||||
* interim. We'd like to "snap-back" to the position specified by
|
|
||||||
* ConfigureRequest events (at least the constrained version of the
|
|
||||||
* ConfigureRequest, since that is guaranteed to be onscreen) so we
|
|
||||||
* set user_rect here.
|
|
||||||
*
|
|
||||||
* See also bug 426519.
|
|
||||||
*/
|
|
||||||
meta_window_save_user_window_placement (window);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Move window to the requested workspace; append controls whether new WS
|
* Move window to the requested workspace; append controls whether new WS
|
||||||
* should be created if one does not exist.
|
* should be created if one does not exist.
|
||||||
|
@ -1583,6 +1583,171 @@ meta_window_same_client (MetaWindow *window,
|
|||||||
(other_window->xwindow & ~resource_mask));
|
(other_window->xwindow & ~resource_mask));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
meta_window_move_resize_request (MetaWindow *window,
|
||||||
|
guint value_mask,
|
||||||
|
int gravity,
|
||||||
|
int new_x,
|
||||||
|
int new_y,
|
||||||
|
int new_width,
|
||||||
|
int new_height)
|
||||||
|
{
|
||||||
|
int x, y, width, height;
|
||||||
|
gboolean allow_position_change;
|
||||||
|
gboolean in_grab_op;
|
||||||
|
MetaMoveResizeFlags flags;
|
||||||
|
|
||||||
|
/* We ignore configure requests while the user is moving/resizing
|
||||||
|
* the window, since these represent the app sucking and fighting
|
||||||
|
* the user, most likely due to a bug in the app (e.g. pfaedit
|
||||||
|
* seemed to do this)
|
||||||
|
*
|
||||||
|
* Still have to do the ConfigureNotify and all, but pretend the
|
||||||
|
* app asked for the current size/position instead of the new one.
|
||||||
|
*/
|
||||||
|
in_grab_op = FALSE;
|
||||||
|
if (window->display->grab_op != META_GRAB_OP_NONE &&
|
||||||
|
window == window->display->grab_window)
|
||||||
|
{
|
||||||
|
switch (window->display->grab_op)
|
||||||
|
{
|
||||||
|
case META_GRAB_OP_MOVING:
|
||||||
|
case META_GRAB_OP_RESIZING_SE:
|
||||||
|
case META_GRAB_OP_RESIZING_S:
|
||||||
|
case META_GRAB_OP_RESIZING_SW:
|
||||||
|
case META_GRAB_OP_RESIZING_N:
|
||||||
|
case META_GRAB_OP_RESIZING_NE:
|
||||||
|
case META_GRAB_OP_RESIZING_NW:
|
||||||
|
case META_GRAB_OP_RESIZING_W:
|
||||||
|
case META_GRAB_OP_RESIZING_E:
|
||||||
|
in_grab_op = TRUE;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* it's essential to use only the explicitly-set fields,
|
||||||
|
* and otherwise use our current up-to-date position.
|
||||||
|
*
|
||||||
|
* Otherwise you get spurious position changes when the app changes
|
||||||
|
* size, for example, if window->rect is not in sync with the
|
||||||
|
* server-side position in effect when the configure request was
|
||||||
|
* generated.
|
||||||
|
*/
|
||||||
|
meta_window_get_gravity_position (window,
|
||||||
|
gravity,
|
||||||
|
&x, &y);
|
||||||
|
|
||||||
|
allow_position_change = FALSE;
|
||||||
|
|
||||||
|
if (meta_prefs_get_disable_workarounds ())
|
||||||
|
{
|
||||||
|
if (window->type == META_WINDOW_DIALOG ||
|
||||||
|
window->type == META_WINDOW_MODAL_DIALOG ||
|
||||||
|
window->type == META_WINDOW_SPLASHSCREEN)
|
||||||
|
; /* No position change for these */
|
||||||
|
else if ((window->size_hints.flags & PPosition) ||
|
||||||
|
/* USPosition is just stale if window is placed;
|
||||||
|
* no --geometry involved here.
|
||||||
|
*/
|
||||||
|
((window->size_hints.flags & USPosition) &&
|
||||||
|
!window->placed))
|
||||||
|
allow_position_change = TRUE;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
allow_position_change = TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (in_grab_op)
|
||||||
|
allow_position_change = FALSE;
|
||||||
|
|
||||||
|
if (allow_position_change)
|
||||||
|
{
|
||||||
|
if (value_mask & CWX)
|
||||||
|
x = new_x;
|
||||||
|
if (value_mask & CWY)
|
||||||
|
y = new_y;
|
||||||
|
if (value_mask & (CWX | CWY))
|
||||||
|
{
|
||||||
|
/* Once manually positioned, windows shouldn't be placed
|
||||||
|
* by the window manager.
|
||||||
|
*/
|
||||||
|
window->placed = TRUE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
meta_topic (META_DEBUG_GEOMETRY,
|
||||||
|
"Not allowing position change for window %s PPosition 0x%lx USPosition 0x%lx type %u\n",
|
||||||
|
window->desc, window->size_hints.flags & PPosition,
|
||||||
|
window->size_hints.flags & USPosition,
|
||||||
|
window->type);
|
||||||
|
}
|
||||||
|
|
||||||
|
width = window->rect.width;
|
||||||
|
height = window->rect.height;
|
||||||
|
if (!in_grab_op)
|
||||||
|
{
|
||||||
|
if (value_mask & CWWidth)
|
||||||
|
width = new_width;
|
||||||
|
|
||||||
|
if (value_mask & CWHeight)
|
||||||
|
height = new_height;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ICCCM 4.1.5 */
|
||||||
|
|
||||||
|
/* We're ignoring the value_mask here, since sizes
|
||||||
|
* not in the mask will be the current window geometry.
|
||||||
|
*/
|
||||||
|
window->size_hints.x = x;
|
||||||
|
window->size_hints.y = y;
|
||||||
|
window->size_hints.width = width;
|
||||||
|
window->size_hints.height = height;
|
||||||
|
|
||||||
|
/* NOTE: We consider ConfigureRequests to be "user" actions in one
|
||||||
|
* way, but not in another. Explanation of the two cases are in the
|
||||||
|
* next two big comments.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* The constraints code allows user actions to move windows
|
||||||
|
* offscreen, etc., and configure request actions would often send
|
||||||
|
* windows offscreen when users don't want it if not constrained
|
||||||
|
* (e.g. hitting a dropdown triangle in a fileselector to show more
|
||||||
|
* options, which makes the window bigger). Thus we do not set
|
||||||
|
* META_IS_USER_ACTION in flags to the
|
||||||
|
* meta_window_move_resize_internal() call.
|
||||||
|
*/
|
||||||
|
flags = META_IS_CONFIGURE_REQUEST;
|
||||||
|
if (value_mask & (CWX | CWY))
|
||||||
|
flags |= META_IS_MOVE_ACTION;
|
||||||
|
if (value_mask & (CWWidth | CWHeight))
|
||||||
|
flags |= META_IS_RESIZE_ACTION;
|
||||||
|
|
||||||
|
if (flags & (META_IS_MOVE_ACTION | META_IS_RESIZE_ACTION))
|
||||||
|
meta_window_move_resize_internal (window,
|
||||||
|
flags,
|
||||||
|
gravity,
|
||||||
|
x,
|
||||||
|
y,
|
||||||
|
width,
|
||||||
|
height);
|
||||||
|
|
||||||
|
/* window->user_rect exists to allow "snapping-back" the window if a
|
||||||
|
* new strut is set (causing the window to move) and then the strut
|
||||||
|
* is later removed without the user moving the window in the
|
||||||
|
* interim. We'd like to "snap-back" to the position specified by
|
||||||
|
* ConfigureRequest events (at least the constrained version of the
|
||||||
|
* ConfigureRequest, since that is guaranteed to be onscreen) so we
|
||||||
|
* set user_rect here.
|
||||||
|
*
|
||||||
|
* See also bug 426519.
|
||||||
|
*/
|
||||||
|
meta_window_save_user_window_placement (window);
|
||||||
|
}
|
||||||
|
|
||||||
gboolean
|
gboolean
|
||||||
meta_window_x11_configure_request (MetaWindow *window,
|
meta_window_x11_configure_request (MetaWindow *window,
|
||||||
XEvent *event)
|
XEvent *event)
|
||||||
|
Loading…
Reference in New Issue
Block a user