Compare commits
4 Commits
3.24.4
...
wip/tiling
Author | SHA1 | Date | |
---|---|---|---|
ea901abd61 | |||
4e5e6aa7f8 | |||
8e587e2e42 | |||
93901dc32f |
@ -817,13 +817,6 @@ meta_window_actor_has_shadow (MetaWindowActor *self)
|
||||
meta_window_is_fullscreen (priv->window))
|
||||
return FALSE;
|
||||
|
||||
/*
|
||||
* If we have two snap-tiled windows, we don't want the shadow to obstruct
|
||||
* the other window.
|
||||
*/
|
||||
if (meta_window_get_tile_match (priv->window))
|
||||
return FALSE;
|
||||
|
||||
/*
|
||||
* Always put a shadow around windows with a frame - This should override
|
||||
* the restriction about not putting a shadow around ARGB windows.
|
||||
|
@ -97,7 +97,7 @@ typedef enum
|
||||
PRIORITY_ENTIRELY_VISIBLE_ON_WORKAREA = 1,
|
||||
PRIORITY_SIZE_HINTS_INCREMENTS = 1,
|
||||
PRIORITY_MAXIMIZATION = 2,
|
||||
PRIORITY_TILING = 2,
|
||||
PRIORITY_CONSTRAINED_EDGES = 2,
|
||||
PRIORITY_FULLSCREEN = 2,
|
||||
PRIORITY_SIZE_HINTS_LIMITS = 3,
|
||||
PRIORITY_TITLEBAR_VISIBLE = 4,
|
||||
@ -152,7 +152,7 @@ static gboolean constrain_maximization (MetaWindow *window,
|
||||
ConstraintInfo *info,
|
||||
ConstraintPriority priority,
|
||||
gboolean check_only);
|
||||
static gboolean constrain_tiling (MetaWindow *window,
|
||||
static gboolean constrain_constrained_edges (MetaWindow *window,
|
||||
ConstraintInfo *info,
|
||||
ConstraintPriority priority,
|
||||
gboolean check_only);
|
||||
@ -213,7 +213,7 @@ typedef struct {
|
||||
static const Constraint all_constraints[] = {
|
||||
{constrain_modal_dialog, "constrain_modal_dialog"},
|
||||
{constrain_maximization, "constrain_maximization"},
|
||||
{constrain_tiling, "constrain_tiling"},
|
||||
{constrain_constrained_edges, "constrain_constrained_edges"},
|
||||
{constrain_fullscreen, "constrain_fullscreen"},
|
||||
{constrain_size_increments, "constrain_size_increments"},
|
||||
{constrain_size_limits, "constrain_size_limits"},
|
||||
@ -701,16 +701,11 @@ constrain_maximization (MetaWindow *window,
|
||||
return TRUE;
|
||||
|
||||
/* Determine whether constraint applies; exit if it doesn't */
|
||||
if ((!window->maximized_horizontally && !window->maximized_vertically) ||
|
||||
META_WINDOW_TILED_SIDE_BY_SIDE (window))
|
||||
if (!window->maximized_horizontally && !window->maximized_vertically)
|
||||
return TRUE;
|
||||
|
||||
/* Calculate target_size = maximized size of (window + frame) */
|
||||
if (META_WINDOW_TILED_MAXIMIZED (window))
|
||||
{
|
||||
meta_window_get_current_tile_area (window, &target_size);
|
||||
}
|
||||
else if (META_WINDOW_MAXIMIZED (window))
|
||||
if (META_WINDOW_MAXIMIZED (window))
|
||||
{
|
||||
target_size = info->work_area_monitor;
|
||||
}
|
||||
@ -773,58 +768,6 @@ constrain_maximization (MetaWindow *window,
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
constrain_tiling (MetaWindow *window,
|
||||
ConstraintInfo *info,
|
||||
ConstraintPriority priority,
|
||||
gboolean check_only)
|
||||
{
|
||||
MetaRectangle target_size;
|
||||
MetaRectangle min_size, max_size;
|
||||
gboolean hminbad, vminbad;
|
||||
gboolean horiz_equal, vert_equal;
|
||||
gboolean constraint_already_satisfied;
|
||||
|
||||
if (priority > PRIORITY_TILING)
|
||||
return TRUE;
|
||||
|
||||
/* Determine whether constraint applies; exit if it doesn't */
|
||||
if (!META_WINDOW_TILED_SIDE_BY_SIDE (window))
|
||||
return TRUE;
|
||||
|
||||
/* Calculate target_size - as the tile previews need this as well, we
|
||||
* use an external function for the actual calculation
|
||||
*/
|
||||
meta_window_get_current_tile_area (window, &target_size);
|
||||
|
||||
/* Check min size constraints; max size constraints are ignored as for
|
||||
* maximized windows.
|
||||
*/
|
||||
get_size_limits (window, &min_size, &max_size);
|
||||
hminbad = target_size.width < min_size.width;
|
||||
vminbad = target_size.height < min_size.height;
|
||||
if (hminbad || vminbad)
|
||||
return TRUE;
|
||||
|
||||
/* Determine whether constraint is already satisfied; exit if it is */
|
||||
horiz_equal = target_size.x == info->current.x &&
|
||||
target_size.width == info->current.width;
|
||||
vert_equal = target_size.y == info->current.y &&
|
||||
target_size.height == info->current.height;
|
||||
constraint_already_satisfied = horiz_equal && vert_equal;
|
||||
if (check_only || constraint_already_satisfied)
|
||||
return constraint_already_satisfied;
|
||||
|
||||
/*** Enforce constraint ***/
|
||||
info->current.x = target_size.x;
|
||||
info->current.width = target_size.width;
|
||||
info->current.y = target_size.y;
|
||||
info->current.height = target_size.height;
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
static gboolean
|
||||
constrain_fullscreen (MetaWindow *window,
|
||||
ConstraintInfo *info,
|
||||
@ -860,6 +803,45 @@ constrain_fullscreen (MetaWindow *window,
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
constrain_constrained_edges (MetaWindow *window,
|
||||
ConstraintInfo *info,
|
||||
ConstraintPriority priority,
|
||||
gboolean check_only)
|
||||
{
|
||||
MetaRectangle monitor, new_rectangle;
|
||||
gboolean constraint_already_satisfied;
|
||||
|
||||
if (priority > PRIORITY_CONSTRAINED_EDGES)
|
||||
return TRUE;
|
||||
|
||||
/* Determine whether constraint applies; exit if it doesn't */
|
||||
if (!window->constrained_edges)
|
||||
return TRUE;
|
||||
|
||||
new_rectangle = info->current;
|
||||
monitor = info->work_area_monitor;
|
||||
|
||||
if (window->constrained_edges & META_DIRECTION_LEFT)
|
||||
new_rectangle.x = monitor.x;
|
||||
if (window->constrained_edges & META_DIRECTION_RIGHT)
|
||||
new_rectangle.x = monitor.x + monitor.width - new_rectangle.width;
|
||||
if (window->constrained_edges & META_DIRECTION_TOP)
|
||||
new_rectangle.y = monitor.y;
|
||||
if (window->constrained_edges & META_DIRECTION_BOTTOM)
|
||||
new_rectangle.y = monitor.y + monitor.height - new_rectangle.height;
|
||||
|
||||
constraint_already_satisfied =
|
||||
meta_rectangle_equal (&info->current, &new_rectangle);
|
||||
|
||||
if (check_only || constraint_already_satisfied)
|
||||
return constraint_already_satisfied;
|
||||
|
||||
/*** Enforce constraint ***/
|
||||
info->current = new_rectangle;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
constrain_size_increments (MetaWindow *window,
|
||||
ConstraintInfo *info,
|
||||
@ -877,7 +859,6 @@ constrain_size_increments (MetaWindow *window,
|
||||
|
||||
/* Determine whether constraint applies; exit if it doesn't */
|
||||
if (META_WINDOW_MAXIMIZED (window) || window->fullscreen ||
|
||||
META_WINDOW_TILED_SIDE_BY_SIDE (window) ||
|
||||
info->action_type == ACTION_MOVE)
|
||||
return TRUE;
|
||||
|
||||
@ -1020,7 +1001,6 @@ constrain_aspect_ratio (MetaWindow *window,
|
||||
constraints_are_inconsistent = minr > maxr;
|
||||
if (constraints_are_inconsistent ||
|
||||
META_WINDOW_MAXIMIZED (window) || window->fullscreen ||
|
||||
META_WINDOW_TILED_SIDE_BY_SIDE (window) ||
|
||||
info->action_type == ACTION_MOVE)
|
||||
return TRUE;
|
||||
|
||||
|
@ -74,13 +74,6 @@ typedef enum {
|
||||
*/
|
||||
#define N_IGNORED_CROSSING_SERIALS 10
|
||||
|
||||
typedef enum {
|
||||
META_TILE_NONE,
|
||||
META_TILE_LEFT,
|
||||
META_TILE_RIGHT,
|
||||
META_TILE_MAXIMIZED
|
||||
} MetaTileMode;
|
||||
|
||||
typedef enum {
|
||||
/* Normal interaction where you're interacting with windows.
|
||||
* Events go to windows normally. */
|
||||
@ -211,8 +204,6 @@ struct _MetaDisplay
|
||||
int grab_anchor_root_x;
|
||||
int grab_anchor_root_y;
|
||||
MetaRectangle grab_anchor_window_pos;
|
||||
MetaTileMode grab_tile_mode;
|
||||
int grab_tile_monitor_number;
|
||||
int grab_latest_motion_x;
|
||||
int grab_latest_motion_y;
|
||||
guint grab_have_pointer : 1;
|
||||
|
@ -649,8 +649,6 @@ meta_display_open (void)
|
||||
|
||||
display->grab_op = META_GRAB_OP_NONE;
|
||||
display->grab_window = NULL;
|
||||
display->grab_tile_mode = META_TILE_NONE;
|
||||
display->grab_tile_monitor_number = -1;
|
||||
|
||||
display->grab_edge_resistance_data = NULL;
|
||||
|
||||
@ -1894,8 +1892,6 @@ meta_display_begin_grab_op (MetaDisplay *display,
|
||||
display->grab_op = op;
|
||||
display->grab_window = grab_window;
|
||||
display->grab_button = button;
|
||||
display->grab_tile_mode = grab_window->tile_mode;
|
||||
display->grab_tile_monitor_number = grab_window->tile_monitor_number;
|
||||
display->grab_anchor_root_x = root_x;
|
||||
display->grab_anchor_root_y = root_y;
|
||||
display->grab_latest_motion_x = root_x;
|
||||
@ -1993,8 +1989,6 @@ meta_display_end_grab_op (MetaDisplay *display,
|
||||
|
||||
display->event_route = META_EVENT_ROUTE_NORMAL;
|
||||
display->grab_window = NULL;
|
||||
display->grab_tile_mode = META_TILE_NONE;
|
||||
display->grab_tile_monitor_number = -1;
|
||||
|
||||
meta_display_update_cursor (display);
|
||||
|
||||
|
@ -274,12 +274,6 @@ meta_frame_get_flags (MetaFrame *frame)
|
||||
if (META_WINDOW_MAXIMIZED (frame->window))
|
||||
flags |= META_FRAME_MAXIMIZED;
|
||||
|
||||
if (META_WINDOW_TILED_LEFT (frame->window))
|
||||
flags |= META_FRAME_TILED_LEFT;
|
||||
|
||||
if (META_WINDOW_TILED_RIGHT (frame->window))
|
||||
flags |= META_FRAME_TILED_RIGHT;
|
||||
|
||||
if (frame->window->fullscreen)
|
||||
flags |= META_FRAME_FULLSCREEN;
|
||||
|
||||
@ -289,6 +283,18 @@ meta_frame_get_flags (MetaFrame *frame)
|
||||
if (frame->window->wm_state_above)
|
||||
flags |= META_FRAME_ABOVE;
|
||||
|
||||
if (frame->window->constrained_edges & META_DIRECTION_LEFT)
|
||||
flags |= META_FRAME_CONSTRAINED_LEFT_EDGE;
|
||||
|
||||
if (frame->window->constrained_edges & META_DIRECTION_RIGHT)
|
||||
flags |= META_FRAME_CONSTRAINED_RIGHT_EDGE;
|
||||
|
||||
if (frame->window->constrained_edges & META_DIRECTION_TOP)
|
||||
flags |= META_FRAME_CONSTRAINED_TOP_EDGE;
|
||||
|
||||
if (frame->window->constrained_edges & META_DIRECTION_BOTTOM)
|
||||
flags |= META_FRAME_CONSTRAINED_BOTTOM_EDGE;
|
||||
|
||||
return flags;
|
||||
}
|
||||
|
||||
|
@ -2001,23 +2001,13 @@ process_mouse_move_resize_grab (MetaDisplay *display,
|
||||
|
||||
if (event->keyval == CLUTTER_KEY_Escape)
|
||||
{
|
||||
/* Hide the tiling preview if necessary */
|
||||
if (window->tile_mode != META_TILE_NONE)
|
||||
meta_screen_hide_tile_preview (screen);
|
||||
|
||||
/* Restore the original tile mode */
|
||||
window->tile_mode = display->grab_tile_mode;
|
||||
window->tile_monitor_number = display->grab_tile_monitor_number;
|
||||
|
||||
/* End move or resize and restore to original state. If the
|
||||
* window was a maximized window that had been "shaken loose" we
|
||||
* need to remaximize it. In normal cases, we need to do a
|
||||
* moveresize now to get the position back to the original.
|
||||
*/
|
||||
if (window->shaken_loose || window->tile_mode == META_TILE_MAXIMIZED)
|
||||
if (window->shaken_loose)
|
||||
meta_window_maximize (window, META_MAXIMIZE_BOTH);
|
||||
else if (window->tile_mode != META_TILE_NONE)
|
||||
meta_window_tile (window);
|
||||
else
|
||||
meta_window_move_resize_frame (display->grab_window,
|
||||
TRUE,
|
||||
@ -2939,41 +2929,25 @@ handle_toggle_above (MetaDisplay *display,
|
||||
}
|
||||
|
||||
static void
|
||||
handle_toggle_tiled (MetaDisplay *display,
|
||||
MetaScreen *screen,
|
||||
MetaWindow *window,
|
||||
ClutterKeyEvent *event,
|
||||
MetaKeyBinding *binding,
|
||||
gpointer dummy)
|
||||
handle_toggle_tiled_left (MetaDisplay *display,
|
||||
MetaScreen *screen,
|
||||
MetaWindow *window,
|
||||
ClutterKeyEvent *event,
|
||||
MetaKeyBinding *binding,
|
||||
gpointer dummy)
|
||||
{
|
||||
MetaTileMode mode = binding->handler->data;
|
||||
meta_window_toggle_tile (window, META_TILE_ZONE_W);
|
||||
}
|
||||
|
||||
if ((META_WINDOW_TILED_LEFT (window) && mode == META_TILE_LEFT) ||
|
||||
(META_WINDOW_TILED_RIGHT (window) && mode == META_TILE_RIGHT))
|
||||
{
|
||||
window->tile_monitor_number = window->saved_maximize ? window->monitor->number
|
||||
: -1;
|
||||
window->tile_mode = window->saved_maximize ? META_TILE_MAXIMIZED
|
||||
: META_TILE_NONE;
|
||||
|
||||
if (window->saved_maximize)
|
||||
meta_window_maximize (window, META_MAXIMIZE_BOTH);
|
||||
else
|
||||
meta_window_unmaximize (window, META_MAXIMIZE_BOTH);
|
||||
}
|
||||
else if (meta_window_can_tile_side_by_side (window))
|
||||
{
|
||||
window->tile_monitor_number = window->monitor->number;
|
||||
window->tile_mode = mode;
|
||||
/* Maximization constraints beat tiling constraints, so if the window
|
||||
* is maximized, tiling won't have any effect unless we unmaximize it
|
||||
* horizontally first; rather than calling meta_window_unmaximize(),
|
||||
* we just set the flag and rely on meta_window_tile() syncing it to
|
||||
* save an additional roundtrip.
|
||||
*/
|
||||
window->maximized_horizontally = FALSE;
|
||||
meta_window_tile (window);
|
||||
}
|
||||
static void
|
||||
handle_toggle_tiled_right (MetaDisplay *display,
|
||||
MetaScreen *screen,
|
||||
MetaWindow *window,
|
||||
ClutterKeyEvent *event,
|
||||
MetaKeyBinding *binding,
|
||||
gpointer dummy)
|
||||
{
|
||||
meta_window_toggle_tile (window, META_TILE_ZONE_E);
|
||||
}
|
||||
|
||||
static void
|
||||
@ -3706,14 +3680,14 @@ init_builtin_key_bindings (MetaDisplay *display)
|
||||
mutter_keybindings,
|
||||
META_KEY_BINDING_PER_WINDOW,
|
||||
META_KEYBINDING_ACTION_TOGGLE_TILED_LEFT,
|
||||
handle_toggle_tiled, META_TILE_LEFT);
|
||||
handle_toggle_tiled_left, 0);
|
||||
|
||||
add_builtin_keybinding (display,
|
||||
"toggle-tiled-right",
|
||||
mutter_keybindings,
|
||||
META_KEY_BINDING_PER_WINDOW,
|
||||
META_KEYBINDING_ACTION_TOGGLE_TILED_RIGHT,
|
||||
handle_toggle_tiled, META_TILE_RIGHT);
|
||||
handle_toggle_tiled_right, 0);
|
||||
|
||||
add_builtin_keybinding (display,
|
||||
"toggle-above",
|
||||
|
@ -57,7 +57,13 @@ struct _MetaScreen
|
||||
MetaRectangle rect; /* Size of screen; rect.x & rect.y are always 0 */
|
||||
MetaUI *ui;
|
||||
|
||||
guint tile_preview_timeout_id;
|
||||
struct {
|
||||
gboolean exists;
|
||||
guint timeout_id;
|
||||
MetaWindow *window;
|
||||
MetaRectangle area;
|
||||
int monitor;
|
||||
} tile_preview;
|
||||
|
||||
MetaWorkspace *active_workspace;
|
||||
|
||||
@ -132,9 +138,12 @@ void meta_screen_foreach_window (MetaScreen *scree
|
||||
|
||||
void meta_screen_update_cursor (MetaScreen *screen);
|
||||
|
||||
void meta_screen_update_tile_preview (MetaScreen *screen,
|
||||
gboolean delay);
|
||||
void meta_screen_hide_tile_preview (MetaScreen *screen);
|
||||
void meta_screen_update_tile_preview (MetaScreen *screen,
|
||||
MetaWindow *window,
|
||||
MetaRectangle area,
|
||||
int monitor,
|
||||
gboolean delay);
|
||||
void meta_screen_hide_tile_preview (MetaScreen *screen);
|
||||
|
||||
MetaWindow* meta_screen_get_mouse_window (MetaScreen *screen,
|
||||
MetaWindow *not_this_one);
|
||||
|
@ -718,8 +718,6 @@ meta_screen_new (MetaDisplay *display,
|
||||
screen->ui = meta_ui_new (screen->display->xdisplay,
|
||||
screen->xscreen);
|
||||
|
||||
screen->tile_preview_timeout_id = 0;
|
||||
|
||||
screen->stack = meta_stack_new (screen);
|
||||
screen->stack_tracker = meta_stack_tracker_new (screen);
|
||||
|
||||
@ -807,8 +805,8 @@ meta_screen_free (MetaScreen *screen,
|
||||
|
||||
g_free (screen->monitor_infos);
|
||||
|
||||
if (screen->tile_preview_timeout_id)
|
||||
g_source_remove (screen->tile_preview_timeout_id);
|
||||
if (screen->tile_preview.timeout_id)
|
||||
g_source_remove (screen->tile_preview.timeout_id);
|
||||
|
||||
g_free (screen->screen_name);
|
||||
|
||||
@ -1288,44 +1286,20 @@ static gboolean
|
||||
meta_screen_update_tile_preview_timeout (gpointer data)
|
||||
{
|
||||
MetaScreen *screen = data;
|
||||
MetaWindow *window = screen->display->grab_window;
|
||||
gboolean needs_preview = FALSE;
|
||||
|
||||
screen->tile_preview_timeout_id = 0;
|
||||
screen->tile_preview.timeout_id = 0;
|
||||
|
||||
if (window)
|
||||
if (screen->tile_preview.exists)
|
||||
{
|
||||
switch (window->tile_mode)
|
||||
{
|
||||
case META_TILE_LEFT:
|
||||
case META_TILE_RIGHT:
|
||||
if (!META_WINDOW_TILED_SIDE_BY_SIDE (window))
|
||||
needs_preview = TRUE;
|
||||
break;
|
||||
|
||||
case META_TILE_MAXIMIZED:
|
||||
if (!META_WINDOW_MAXIMIZED (window))
|
||||
needs_preview = TRUE;
|
||||
break;
|
||||
|
||||
default:
|
||||
needs_preview = FALSE;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (needs_preview)
|
||||
{
|
||||
MetaRectangle tile_rect;
|
||||
int monitor;
|
||||
|
||||
monitor = meta_window_get_current_tile_monitor_number (window);
|
||||
meta_window_get_current_tile_area (window, &tile_rect);
|
||||
meta_compositor_show_tile_preview (screen->display->compositor,
|
||||
window, &tile_rect, monitor);
|
||||
screen->tile_preview.window,
|
||||
&screen->tile_preview.area,
|
||||
screen->tile_preview.monitor);
|
||||
}
|
||||
else
|
||||
meta_compositor_hide_tile_preview (screen->display->compositor);
|
||||
{
|
||||
meta_compositor_hide_tile_preview (screen->display->compositor);
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
@ -1333,37 +1307,47 @@ meta_screen_update_tile_preview_timeout (gpointer data)
|
||||
#define TILE_PREVIEW_TIMEOUT_MS 200
|
||||
|
||||
void
|
||||
meta_screen_update_tile_preview (MetaScreen *screen,
|
||||
gboolean delay)
|
||||
meta_screen_update_tile_preview (MetaScreen *screen,
|
||||
MetaWindow *window,
|
||||
MetaRectangle area,
|
||||
int monitor,
|
||||
gboolean delay)
|
||||
{
|
||||
screen->tile_preview.exists = TRUE;
|
||||
screen->tile_preview.window = window;
|
||||
screen->tile_preview.area = area;
|
||||
screen->tile_preview.monitor = monitor;
|
||||
|
||||
if (delay)
|
||||
{
|
||||
if (screen->tile_preview_timeout_id > 0)
|
||||
if (screen->tile_preview.timeout_id > 0)
|
||||
return;
|
||||
|
||||
screen->tile_preview_timeout_id =
|
||||
screen->tile_preview.timeout_id =
|
||||
g_timeout_add (TILE_PREVIEW_TIMEOUT_MS,
|
||||
meta_screen_update_tile_preview_timeout,
|
||||
screen);
|
||||
g_source_set_name_by_id (screen->tile_preview_timeout_id,
|
||||
g_source_set_name_by_id (screen->tile_preview.timeout_id,
|
||||
"[mutter] meta_screen_update_tile_preview_timeout");
|
||||
}
|
||||
else
|
||||
{
|
||||
if (screen->tile_preview_timeout_id > 0)
|
||||
g_source_remove (screen->tile_preview_timeout_id);
|
||||
if (screen->tile_preview.timeout_id > 0)
|
||||
g_source_remove (screen->tile_preview.timeout_id);
|
||||
|
||||
meta_screen_update_tile_preview_timeout ((gpointer)screen);
|
||||
meta_screen_update_tile_preview_timeout ((gpointer) screen);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
meta_screen_hide_tile_preview (MetaScreen *screen)
|
||||
{
|
||||
if (screen->tile_preview_timeout_id > 0)
|
||||
g_source_remove (screen->tile_preview_timeout_id);
|
||||
screen->tile_preview.exists = FALSE;
|
||||
|
||||
meta_compositor_hide_tile_preview (screen->display->compositor);
|
||||
if (screen->tile_preview.timeout_id > 0)
|
||||
g_source_remove (screen->tile_preview.timeout_id);
|
||||
|
||||
meta_screen_update_tile_preview_timeout ((gpointer) screen);
|
||||
}
|
||||
|
||||
MetaWindow*
|
||||
|
@ -117,7 +117,6 @@ meta_stack_add (MetaStack *stack,
|
||||
window->desc, window->stack_position);
|
||||
|
||||
stack_sync_to_xserver (stack);
|
||||
meta_stack_update_window_tile_matches (stack, window->screen->active_workspace);
|
||||
}
|
||||
|
||||
void
|
||||
@ -153,7 +152,6 @@ meta_stack_remove (MetaStack *stack,
|
||||
GUINT_TO_POINTER (window->frame->xwindow));
|
||||
|
||||
stack_sync_to_xserver (stack);
|
||||
meta_stack_update_window_tile_matches (stack, window->screen->active_workspace);
|
||||
}
|
||||
|
||||
void
|
||||
@ -163,7 +161,6 @@ meta_stack_update_layer (MetaStack *stack,
|
||||
stack->need_relayer = TRUE;
|
||||
|
||||
stack_sync_to_xserver (stack);
|
||||
meta_stack_update_window_tile_matches (stack, window->screen->active_workspace);
|
||||
}
|
||||
|
||||
void
|
||||
@ -173,7 +170,6 @@ meta_stack_update_transient (MetaStack *stack,
|
||||
stack->need_constrain = TRUE;
|
||||
|
||||
stack_sync_to_xserver (stack);
|
||||
meta_stack_update_window_tile_matches (stack, window->screen->active_workspace);
|
||||
}
|
||||
|
||||
/* raise/lower within a layer */
|
||||
@ -202,7 +198,6 @@ meta_stack_raise (MetaStack *stack,
|
||||
meta_window_set_stack_position_no_sync (window, max_stack_position);
|
||||
|
||||
stack_sync_to_xserver (stack);
|
||||
meta_stack_update_window_tile_matches (stack, window->screen->active_workspace);
|
||||
}
|
||||
|
||||
void
|
||||
@ -230,7 +225,6 @@ meta_stack_lower (MetaStack *stack,
|
||||
meta_window_set_stack_position_no_sync (window, min_stack_position);
|
||||
|
||||
stack_sync_to_xserver (stack);
|
||||
meta_stack_update_window_tile_matches (stack, window->screen->active_workspace);
|
||||
}
|
||||
|
||||
void
|
||||
@ -246,27 +240,6 @@ meta_stack_thaw (MetaStack *stack)
|
||||
|
||||
stack->freeze_count -= 1;
|
||||
stack_sync_to_xserver (stack);
|
||||
meta_stack_update_window_tile_matches (stack, NULL);
|
||||
}
|
||||
|
||||
void
|
||||
meta_stack_update_window_tile_matches (MetaStack *stack,
|
||||
MetaWorkspace *workspace)
|
||||
{
|
||||
GList *windows, *tmp;
|
||||
|
||||
if (stack->freeze_count > 0)
|
||||
return;
|
||||
|
||||
windows = meta_stack_list_windows (stack, workspace);
|
||||
tmp = windows;
|
||||
while (tmp)
|
||||
{
|
||||
meta_window_compute_tile_match ((MetaWindow *) tmp->data);
|
||||
tmp = tmp->next;
|
||||
}
|
||||
|
||||
g_list_free (windows);
|
||||
}
|
||||
|
||||
static gboolean
|
||||
@ -1448,7 +1421,6 @@ meta_stack_set_positions (MetaStack *stack,
|
||||
"Reset the stack positions of (nearly) all windows\n");
|
||||
|
||||
stack_sync_to_xserver (stack);
|
||||
meta_stack_update_window_tile_matches (stack, NULL);
|
||||
}
|
||||
|
||||
void
|
||||
@ -1511,6 +1483,4 @@ meta_window_set_stack_position (MetaWindow *window,
|
||||
{
|
||||
meta_window_set_stack_position_no_sync (window, position);
|
||||
stack_sync_to_xserver (window->screen->stack);
|
||||
meta_stack_update_window_tile_matches (window->screen->stack,
|
||||
window->screen->active_workspace);
|
||||
}
|
||||
|
@ -413,6 +413,4 @@ GList* meta_stack_get_positions (MetaStack *stack);
|
||||
void meta_stack_set_positions (MetaStack *stack,
|
||||
GList *windows);
|
||||
|
||||
void meta_stack_update_window_tile_matches (MetaStack *stack,
|
||||
MetaWorkspace *workspace);
|
||||
#endif
|
||||
|
@ -88,6 +88,20 @@ typedef enum
|
||||
META_MOVE_RESIZE_RESULT_FRAME_SHAPE_CHANGED = 1 << 2,
|
||||
} MetaMoveResizeResultFlags;
|
||||
|
||||
/* This contains all the "state" needed for a certain size configuration.
|
||||
* We have three of these size configurations: normal, tiled, and
|
||||
* maximized. The idea here is that if the user tiles a normal window,
|
||||
* then maximizes it, we should, upon unmaximizing and untiling the window,
|
||||
* return to a normal state. We need a way of storing this information
|
||||
* while maximized, so we use this structure. */
|
||||
struct _MetaWindowSizeState
|
||||
{
|
||||
guint maximized_horizontally : 1;
|
||||
guint maximized_vertically : 1;
|
||||
MetaRectangle rect;
|
||||
};
|
||||
typedef struct _MetaWindowSizeState MetaWindowSizeState;
|
||||
|
||||
struct _MetaWindow
|
||||
{
|
||||
GObject parent_instance;
|
||||
@ -157,14 +171,6 @@ struct _MetaWindow
|
||||
guint maximize_vertically_after_placement : 1;
|
||||
guint minimize_after_placement : 1;
|
||||
|
||||
/* The current or requested tile mode. If maximized_vertically is true,
|
||||
* this is the current mode. If not, it is the mode which will be
|
||||
* requested after the window grab is released */
|
||||
guint tile_mode : 2;
|
||||
/* The last "full" maximized/unmaximized state. We need to keep track of
|
||||
* that to toggle between normal/tiled or maximized/tiled states. */
|
||||
guint saved_maximize : 1;
|
||||
int tile_monitor_number;
|
||||
int preferred_output_winsys_id;
|
||||
|
||||
/* Whether we're shaded */
|
||||
@ -401,9 +407,6 @@ struct _MetaWindow
|
||||
/* The current window geometry of the window. */
|
||||
MetaRectangle rect;
|
||||
|
||||
/* The geometry to restore when we unmaximize. */
|
||||
MetaRectangle saved_rect;
|
||||
|
||||
/* This is the geometry the window will have if no constraints have
|
||||
* applied. We use this whenever we are moving implicitly (for example,
|
||||
* if we move to avoid a panel, we can snap back to this position if
|
||||
@ -441,11 +444,16 @@ struct _MetaWindow
|
||||
/* Focused window that is (directly or indirectly) attached to this one */
|
||||
MetaWindow *attached_focus_window;
|
||||
|
||||
/* The currently complementary tiled window, if any */
|
||||
MetaWindow *tile_match;
|
||||
|
||||
/* Bypass compositor hints */
|
||||
guint bypass_compositor;
|
||||
|
||||
/* This is where we store data while in another state. The information
|
||||
* above in MetaWindow is always the current state of the window. */
|
||||
struct {
|
||||
MetaWindowSizeState normal, tiled, maximized;
|
||||
} size_states;
|
||||
|
||||
MetaDirection constrained_edges;
|
||||
};
|
||||
|
||||
struct _MetaWindowClass
|
||||
@ -492,17 +500,8 @@ struct _MetaWindowClass
|
||||
(w)->maximized_vertically)
|
||||
#define META_WINDOW_MAXIMIZED_VERTICALLY(w) ((w)->maximized_vertically)
|
||||
#define META_WINDOW_MAXIMIZED_HORIZONTALLY(w) ((w)->maximized_horizontally)
|
||||
#define META_WINDOW_TILED_SIDE_BY_SIDE(w) ((w)->maximized_vertically && \
|
||||
!(w)->maximized_horizontally && \
|
||||
(w)->tile_mode != META_TILE_NONE)
|
||||
#define META_WINDOW_TILED_LEFT(w) (META_WINDOW_TILED_SIDE_BY_SIDE(w) && \
|
||||
(w)->tile_mode == META_TILE_LEFT)
|
||||
#define META_WINDOW_TILED_RIGHT(w) (META_WINDOW_TILED_SIDE_BY_SIDE(w) && \
|
||||
(w)->tile_mode == META_TILE_RIGHT)
|
||||
#define META_WINDOW_TILED_MAXIMIZED(w)(META_WINDOW_MAXIMIZED(w) && \
|
||||
(w)->tile_mode == META_TILE_MAXIMIZED)
|
||||
#define META_WINDOW_ALLOWS_MOVE(w) ((w)->has_move_func && !(w)->fullscreen)
|
||||
#define META_WINDOW_ALLOWS_RESIZE_EXCEPT_HINTS(w) ((w)->has_resize_func && !META_WINDOW_MAXIMIZED (w) && !META_WINDOW_TILED_SIDE_BY_SIDE(w) && !(w)->fullscreen && !(w)->shaded)
|
||||
#define META_WINDOW_ALLOWS_RESIZE_EXCEPT_HINTS(w) ((w)->has_resize_func && !META_WINDOW_MAXIMIZED (w) && !(w)->fullscreen && !(w)->shaded)
|
||||
#define META_WINDOW_ALLOWS_RESIZE(w) (META_WINDOW_ALLOWS_RESIZE_EXCEPT_HINTS (w) && \
|
||||
(((w)->size_hints.min_width < (w)->size_hints.max_width) || \
|
||||
((w)->size_hints.min_height < (w)->size_hints.max_height)))
|
||||
@ -522,7 +521,6 @@ void meta_window_unmanage (MetaWindow *window,
|
||||
guint32 timestamp);
|
||||
void meta_window_queue (MetaWindow *window,
|
||||
guint queuebits);
|
||||
void meta_window_tile (MetaWindow *window);
|
||||
void meta_window_maximize_internal (MetaWindow *window,
|
||||
MetaMaximizeFlags directions,
|
||||
MetaRectangle *saved_rect);
|
||||
@ -584,11 +582,6 @@ gboolean meta_window_handle_mouse_grab_op_event (MetaWindow *window,
|
||||
|
||||
GList* meta_window_get_workspaces (MetaWindow *window);
|
||||
|
||||
int meta_window_get_current_tile_monitor_number (MetaWindow *window);
|
||||
void meta_window_get_current_tile_area (MetaWindow *window,
|
||||
MetaRectangle *tile_area);
|
||||
|
||||
|
||||
gboolean meta_window_same_application (MetaWindow *window,
|
||||
MetaWindow *other_window);
|
||||
|
||||
@ -626,9 +619,6 @@ void meta_window_update_for_monitors_changed (MetaWindow *window);
|
||||
void meta_window_on_all_workspaces_changed (MetaWindow *window);
|
||||
|
||||
gboolean meta_window_should_attach_to_parent (MetaWindow *window);
|
||||
gboolean meta_window_can_tile_side_by_side (MetaWindow *window);
|
||||
|
||||
void meta_window_compute_tile_match (MetaWindow *window);
|
||||
|
||||
gboolean meta_window_updates_are_frozen (MetaWindow *window);
|
||||
|
||||
@ -695,4 +685,7 @@ gboolean meta_window_has_pointer (MetaWindow *window);
|
||||
|
||||
void meta_window_emit_size_changed (MetaWindow *window);
|
||||
|
||||
void meta_window_toggle_tile (MetaWindow *window,
|
||||
MetaTileZone tile_zone);
|
||||
|
||||
#endif
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -83,7 +83,11 @@ typedef enum
|
||||
META_FRAME_IS_FLASHING = 1 << 14,
|
||||
META_FRAME_ABOVE = 1 << 15,
|
||||
META_FRAME_TILED_LEFT = 1 << 16,
|
||||
META_FRAME_TILED_RIGHT = 1 << 17
|
||||
META_FRAME_TILED_RIGHT = 1 << 17,
|
||||
META_FRAME_CONSTRAINED_LEFT_EDGE = 1 << 18,
|
||||
META_FRAME_CONSTRAINED_RIGHT_EDGE = 1 << 19,
|
||||
META_FRAME_CONSTRAINED_TOP_EDGE = 1 << 20,
|
||||
META_FRAME_CONSTRAINED_BOTTOM_EDGE = 1 << 21,
|
||||
} MetaFrameFlags;
|
||||
|
||||
/**
|
||||
@ -317,6 +321,26 @@ typedef enum
|
||||
META_DIRECTION_VERTICAL = META_DIRECTION_UP | META_DIRECTION_DOWN,
|
||||
} MetaDirection;
|
||||
|
||||
/* Tile zones are specified in terms of their constrained edges.
|
||||
* So, "top left corner" is top and left, which should be obvious,
|
||||
* but "left side of the screen" is top, bottom, and left
|
||||
*/
|
||||
typedef enum {
|
||||
META_TILE_ZONE_MAXIMIZED_HORZ = META_DIRECTION_HORIZONTAL,
|
||||
META_TILE_ZONE_MAXIMIZED_VERT = META_DIRECTION_VERTICAL,
|
||||
META_TILE_ZONE_MAXIMIZED = META_TILE_ZONE_MAXIMIZED_HORZ | META_TILE_ZONE_MAXIMIZED_VERT,
|
||||
|
||||
META_TILE_ZONE_W = META_TILE_ZONE_MAXIMIZED_VERT | META_DIRECTION_LEFT,
|
||||
META_TILE_ZONE_E = META_TILE_ZONE_MAXIMIZED_VERT | META_DIRECTION_RIGHT,
|
||||
META_TILE_ZONE_N = META_TILE_ZONE_MAXIMIZED_HORZ | META_DIRECTION_TOP,
|
||||
META_TILE_ZONE_S = META_TILE_ZONE_MAXIMIZED_HORZ | META_DIRECTION_BOTTOM,
|
||||
|
||||
META_TILE_ZONE_NW = META_DIRECTION_TOP | META_DIRECTION_LEFT,
|
||||
META_TILE_ZONE_NE = META_DIRECTION_TOP | META_DIRECTION_RIGHT,
|
||||
META_TILE_ZONE_SW = META_DIRECTION_BOTTOM | META_DIRECTION_LEFT,
|
||||
META_TILE_ZONE_SE = META_DIRECTION_BOTTOM | META_DIRECTION_RIGHT,
|
||||
} MetaTileZone;
|
||||
|
||||
/**
|
||||
* MetaMotionDirection:
|
||||
* @META_MOTION_UP: Upwards motion
|
||||
|
@ -214,8 +214,6 @@ MetaFrameType meta_window_get_frame_type (MetaWindow *window);
|
||||
|
||||
cairo_region_t *meta_window_get_frame_bounds (MetaWindow *window);
|
||||
|
||||
MetaWindow *meta_window_get_tile_match (MetaWindow *window);
|
||||
|
||||
void meta_window_make_fullscreen (MetaWindow *window);
|
||||
void meta_window_unmake_fullscreen (MetaWindow *window);
|
||||
void meta_window_make_above (MetaWindow *window);
|
||||
@ -260,4 +258,8 @@ gboolean meta_window_is_client_decorated (MetaWindow *window);
|
||||
gboolean meta_window_titlebar_is_onscreen (MetaWindow *window);
|
||||
void meta_window_shove_titlebar_onscreen (MetaWindow *window);
|
||||
|
||||
void meta_window_tile (MetaWindow *window,
|
||||
MetaTileZone tile_zone);
|
||||
void meta_window_untile (MetaWindow *window);
|
||||
|
||||
#endif
|
||||
|
@ -100,22 +100,25 @@ meta_frame_layout_get_borders (const MetaFrameLayout *layout,
|
||||
|
||||
if (flags & META_FRAME_ALLOWS_HORIZONTAL_RESIZE)
|
||||
{
|
||||
borders->invisible.left = MAX (borders->invisible.left,
|
||||
draggable_borders - borders->visible.left);
|
||||
borders->invisible.right = MAX (borders->invisible.right,
|
||||
draggable_borders - borders->visible.right);
|
||||
if (!(flags & META_FRAME_CONSTRAINED_LEFT_EDGE))
|
||||
borders->invisible.left = MAX (borders->invisible.left,
|
||||
draggable_borders - borders->visible.left);
|
||||
if (!(flags & META_FRAME_CONSTRAINED_RIGHT_EDGE))
|
||||
borders->invisible.right = MAX (borders->invisible.right,
|
||||
draggable_borders - borders->visible.right);
|
||||
}
|
||||
|
||||
if (flags & META_FRAME_ALLOWS_VERTICAL_RESIZE)
|
||||
{
|
||||
borders->invisible.bottom = MAX (borders->invisible.bottom,
|
||||
draggable_borders - borders->visible.bottom);
|
||||
|
||||
/* borders.visible.top is the height of the *title bar*. We can't do the same
|
||||
* algorithm here, titlebars are expectedly much bigger. Just subtract a couple
|
||||
* pixels to get a proper feel. */
|
||||
if (type != META_FRAME_TYPE_ATTACHED)
|
||||
if (!(flags & META_FRAME_CONSTRAINED_TOP_EDGE) && type != META_FRAME_TYPE_ATTACHED)
|
||||
borders->invisible.top = MAX (borders->invisible.top, draggable_borders - 2);
|
||||
|
||||
if (!(flags & META_FRAME_CONSTRAINED_BOTTOM_EDGE))
|
||||
borders->invisible.bottom = MAX (borders->invisible.bottom,
|
||||
draggable_borders - borders->visible.bottom);
|
||||
}
|
||||
|
||||
borders->total.left = borders->invisible.left + borders->visible.left;
|
||||
|
@ -363,7 +363,9 @@ meta_window_wayland_main_monitor_changed (MetaWindow *window,
|
||||
/* Window size. */
|
||||
scale_rect_size (&window->rect, scale_factor);
|
||||
scale_rect_size (&window->unconstrained_rect, scale_factor);
|
||||
scale_rect_size (&window->saved_rect, scale_factor);
|
||||
scale_rect_size (&window->size_states.normal.rect, scale_factor);
|
||||
scale_rect_size (&window->size_states.tiled.rect, scale_factor);
|
||||
scale_rect_size (&window->size_states.maximized.rect, scale_factor);
|
||||
|
||||
/* Window geometry offset (XXX: Need a better place, see
|
||||
* meta_window_wayland_move_resize). */
|
||||
|
@ -965,10 +965,10 @@ save_state (void)
|
||||
{
|
||||
fprintf (outfile,
|
||||
" <maximized saved_x=\"%d\" saved_y=\"%d\" saved_width=\"%d\" saved_height=\"%d\"/>\n",
|
||||
window->saved_rect.x,
|
||||
window->saved_rect.y,
|
||||
window->saved_rect.width,
|
||||
window->saved_rect.height);
|
||||
window->size_states.normal.rect.x,
|
||||
window->size_states.normal.rect.y,
|
||||
window->size_states.normal.rect.width,
|
||||
window->size_states.normal.rect.height);
|
||||
}
|
||||
|
||||
/* Gravity */
|
||||
|
@ -413,10 +413,10 @@ meta_window_apply_session_info (MetaWindow *window,
|
||||
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;
|
||||
window->size_states.normal.rect.x = info->saved_rect.x;
|
||||
window->size_states.normal.rect.y = info->saved_rect.y;
|
||||
window->size_states.normal.rect.width = info->saved_rect.width;
|
||||
window->size_states.normal.rect.height = info->saved_rect.height;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user