window: Move frame field to WindowX11

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/3254>
This commit is contained in:
Bilal Elmoussaoui 2023-09-07 09:27:43 +02:00 committed by Marge Bot
parent 503c70e284
commit bcb069f454
20 changed files with 356 additions and 231 deletions

View File

@ -125,13 +125,14 @@ send_frame_messages_timeout (gpointer data)
MetaWindow *window = MetaWindow *window =
meta_window_actor_get_meta_window (META_WINDOW_ACTOR (actor_x11)); meta_window_actor_get_meta_window (META_WINDOW_ACTOR (actor_x11));
MetaSyncCounter *sync_counter; MetaSyncCounter *sync_counter;
MetaFrame *frame = meta_window_x11_get_frame (window);
sync_counter = meta_window_x11_get_sync_counter (window); sync_counter = meta_window_x11_get_sync_counter (window);
meta_sync_counter_finish_incomplete (sync_counter); meta_sync_counter_finish_incomplete (sync_counter);
if (window->frame) if (frame)
{ {
sync_counter = meta_frame_get_sync_counter (window->frame); sync_counter = meta_frame_get_sync_counter (frame);
meta_sync_counter_finish_incomplete (sync_counter); meta_sync_counter_finish_incomplete (sync_counter);
} }
@ -200,6 +201,7 @@ assign_frame_counter_to_frames (MetaWindowActorX11 *actor_x11)
meta_window_actor_get_meta_window (META_WINDOW_ACTOR (actor_x11)); meta_window_actor_get_meta_window (META_WINDOW_ACTOR (actor_x11));
MetaCompositor *compositor = window->display->compositor; MetaCompositor *compositor = window->display->compositor;
ClutterStage *stage = meta_compositor_get_stage (compositor); ClutterStage *stage = meta_compositor_get_stage (compositor);
MetaFrame *frame;
MetaSyncCounter *sync_counter; MetaSyncCounter *sync_counter;
/* If the window is obscured, then we're expecting to deal with sending /* If the window is obscured, then we're expecting to deal with sending
@ -211,10 +213,10 @@ assign_frame_counter_to_frames (MetaWindowActorX11 *actor_x11)
sync_counter = meta_window_x11_get_sync_counter (window); sync_counter = meta_window_x11_get_sync_counter (window);
meta_sync_counter_assign_counter_to_frames (sync_counter, meta_sync_counter_assign_counter_to_frames (sync_counter,
clutter_stage_get_frame_counter (stage)); clutter_stage_get_frame_counter (stage));
frame = meta_window_x11_get_frame (window);
if (window->frame) if (frame)
{ {
sync_counter = meta_frame_get_sync_counter (window->frame); sync_counter = meta_frame_get_sync_counter (frame);
meta_sync_counter_assign_counter_to_frames (sync_counter, meta_sync_counter_assign_counter_to_frames (sync_counter,
clutter_stage_get_frame_counter (stage)); clutter_stage_get_frame_counter (stage));
} }
@ -226,6 +228,7 @@ meta_window_actor_x11_frame_complete (MetaWindowActor *actor,
int64_t presentation_time) int64_t presentation_time)
{ {
MetaWindow *window = meta_window_actor_get_meta_window (actor); MetaWindow *window = meta_window_actor_get_meta_window (actor);
MetaFrame *frame = meta_window_x11_get_frame (window);
MetaSyncCounter *sync_counter; MetaSyncCounter *sync_counter;
if (meta_window_actor_is_destroyed (actor)) if (meta_window_actor_is_destroyed (actor))
@ -236,9 +239,9 @@ meta_window_actor_x11_frame_complete (MetaWindowActor *actor,
frame_info, frame_info,
presentation_time); presentation_time);
if (window->frame) if (frame)
{ {
sync_counter = meta_frame_get_sync_counter (window->frame); sync_counter = meta_frame_get_sync_counter (frame);
meta_sync_counter_complete_frame (sync_counter, meta_sync_counter_complete_frame (sync_counter,
frame_info, frame_info,
presentation_time); presentation_time);
@ -411,7 +414,7 @@ has_shadow (MetaWindowActorX11 *actor_x11)
* Let the frames client put a shadow around frames - This should override * Let the frames client put a shadow around frames - This should override
* the restriction about not putting a shadow around ARGB windows. * the restriction about not putting a shadow around ARGB windows.
*/ */
if (meta_window_get_frame (window)) if (meta_window_x11_get_frame (window))
return FALSE; return FALSE;
/* /*
@ -568,7 +571,7 @@ clip_shadow_under_window (MetaWindowActorX11 *actor_x11)
MetaWindow *window = MetaWindow *window =
meta_window_actor_get_meta_window (META_WINDOW_ACTOR (actor_x11)); meta_window_actor_get_meta_window (META_WINDOW_ACTOR (actor_x11));
if (window->frame) if (meta_window_x11_get_frame (window))
return TRUE; return TRUE;
return meta_window_actor_is_opaque (META_WINDOW_ACTOR (actor_x11)); return meta_window_actor_is_opaque (META_WINDOW_ACTOR (actor_x11));
@ -798,6 +801,7 @@ build_and_scan_frame_mask (MetaWindowActorX11 *actor_x11,
CoglContext *ctx = clutter_backend_get_cogl_context (backend); CoglContext *ctx = clutter_backend_get_cogl_context (backend);
MetaSurfaceActor *surface = MetaSurfaceActor *surface =
meta_window_actor_get_surface (META_WINDOW_ACTOR (actor_x11)); meta_window_actor_get_surface (META_WINDOW_ACTOR (actor_x11));
MetaFrame *frame = meta_window_x11_get_frame (window);
uint8_t *mask_data; uint8_t *mask_data;
unsigned int tex_width, tex_height; unsigned int tex_width, tex_height;
MetaShapedTexture *stex; MetaShapedTexture *stex;
@ -830,7 +834,7 @@ build_and_scan_frame_mask (MetaWindowActorX11 *actor_x11,
region_to_cairo_path (shape_region, cr); region_to_cairo_path (shape_region, cr);
cairo_fill (cr); cairo_fill (cr);
if (window->frame) if (frame)
{ {
g_autoptr (MtkRegion) frame_paint_region = NULL; g_autoptr (MtkRegion) frame_paint_region = NULL;
g_autoptr (MtkRegion) scanned_region = NULL; g_autoptr (MtkRegion) scanned_region = NULL;
@ -864,8 +868,8 @@ build_and_scan_frame_mask (MetaWindowActorX11 *actor_x11,
cairo_rectangle (cr, cairo_rectangle (cr,
0, 0, 0, 0,
window->frame->rect.width, frame->rect.width,
window->frame->rect.height); frame->rect.height);
cairo_set_source_rgb (cr, 0, 0, 0); cairo_set_source_rgb (cr, 0, 0, 0);
cairo_fill (cr); cairo_fill (cr);
@ -921,10 +925,11 @@ update_shape_region (MetaWindowActorX11 *actor_x11)
MetaWindowX11Private *priv = meta_window_x11_get_private (META_WINDOW_X11 (window)); MetaWindowX11Private *priv = meta_window_x11_get_private (META_WINDOW_X11 (window));
MtkRegion *region = NULL; MtkRegion *region = NULL;
MtkRectangle client_area; MtkRectangle client_area;
MetaFrame *frame = meta_window_x11_get_frame (window);
get_client_area_rect (actor_x11, &client_area); get_client_area_rect (actor_x11, &client_area);
if (window->frame && priv->shape_region) if (frame && priv->shape_region)
{ {
region = mtk_region_copy (priv->shape_region); region = mtk_region_copy (priv->shape_region);
mtk_region_translate (region, client_area.x, client_area.y); mtk_region_translate (region, client_area.x, client_area.y);
@ -941,7 +946,7 @@ update_shape_region (MetaWindowActorX11 *actor_x11)
region = mtk_region_create_rectangle (&client_area); region = mtk_region_create_rectangle (&client_area);
} }
if (priv->shape_region || window->frame) if (priv->shape_region || frame)
build_and_scan_frame_mask (actor_x11, region); build_and_scan_frame_mask (actor_x11, region);
g_clear_pointer (&actor_x11->shape_region, mtk_region_unref); g_clear_pointer (&actor_x11->shape_region, mtk_region_unref);
@ -1029,16 +1034,16 @@ update_opaque_region (MetaWindowActorX11 *actor_x11)
gboolean is_maybe_transparent; gboolean is_maybe_transparent;
g_autoptr (MtkRegion) opaque_region = NULL; g_autoptr (MtkRegion) opaque_region = NULL;
MetaSurfaceActor *surface; MetaSurfaceActor *surface;
MetaFrame *frame = meta_window_x11_get_frame (window);
is_maybe_transparent = is_actor_maybe_transparent (actor_x11); is_maybe_transparent = is_actor_maybe_transparent (actor_x11);
if (is_maybe_transparent && if (is_maybe_transparent &&
(priv->opaque_region || (priv->opaque_region || (frame && frame->opaque_region)))
(window->frame && window->frame->opaque_region)))
{ {
MtkRectangle client_area; MtkRectangle client_area;
if (window->frame && window->frame->opaque_region) if (frame && frame->opaque_region)
opaque_region = mtk_region_copy (window->frame->opaque_region); opaque_region = mtk_region_copy (frame->opaque_region);
get_client_area_rect (actor_x11, &client_area); get_client_area_rect (actor_x11, &client_area);
@ -1279,6 +1284,7 @@ meta_window_actor_x11_after_paint (MetaWindowActor *actor,
MetaSyncCounter *sync_counter; MetaSyncCounter *sync_counter;
MetaWindowDrag *window_drag; MetaWindowDrag *window_drag;
MetaWindow *window; MetaWindow *window;
MetaFrame *frame;
actor_x11->repaint_scheduled = FALSE; actor_x11->repaint_scheduled = FALSE;
@ -1295,10 +1301,10 @@ meta_window_actor_x11_after_paint (MetaWindowActor *actor,
{ {
sync_counter = meta_window_x11_get_sync_counter (window); sync_counter = meta_window_x11_get_sync_counter (window);
meta_sync_counter_send_frame_drawn (sync_counter); meta_sync_counter_send_frame_drawn (sync_counter);
frame = meta_window_x11_get_frame (window);
if (window->frame) if (frame)
{ {
sync_counter = meta_frame_get_sync_counter (window->frame); sync_counter = meta_frame_get_sync_counter (frame);
meta_sync_counter_send_frame_drawn (sync_counter); meta_sync_counter_send_frame_drawn (sync_counter);
} }
} }

View File

@ -1299,6 +1299,9 @@ update_move (MetaWindowDrag *window_drag,
const MetaLogicalMonitor *wmonitor; const MetaLogicalMonitor *wmonitor;
MtkRectangle work_area; MtkRectangle work_area;
int monitor; int monitor;
#ifdef HAVE_X11_CLIENT
MetaFrame *frame;
#endif
window->tile_mode = META_TILE_NONE; window->tile_mode = META_TILE_NONE;
wmonitor = window->monitor; wmonitor = window->monitor;
@ -1323,12 +1326,14 @@ update_move (MetaWindowDrag *window_drag,
window->saved_rect.x = work_area.x; window->saved_rect.x = work_area.x;
window->saved_rect.y = work_area.y; window->saved_rect.y = work_area.y;
if (window->frame) #ifdef HAVE_X11_CLIENT
frame = META_IS_WINDOW_X11 (window) ? meta_window_x11_get_frame (window) : NULL;
if (frame)
{ {
window->saved_rect.x += window->frame->child_x; window->saved_rect.x += frame->child_x;
window->saved_rect.y += window->frame->child_y; window->saved_rect.y += frame->child_y;
} }
#endif
window->unconstrained_rect.x = window->saved_rect.x; window->unconstrained_rect.x = window->saved_rect.x;
window->unconstrained_rect.y = window->saved_rect.y; window->unconstrained_rect.y = window->saved_rect.y;

View File

@ -37,7 +37,11 @@
#include "core/place.h" #include "core/place.h"
#include "core/workspace-private.h" #include "core/workspace-private.h"
#include "meta/prefs.h" #include "meta/prefs.h"
#ifdef HAVE_X11_CLIENT
#include "x11/meta-x11-frame.h" #include "x11/meta-x11-frame.h"
#include "x11/window-x11-private.h"
#endif
/* /*
This is the short and sweet version of how to hack on this file; see This is the short and sweet version of how to hack on this file; see
@ -1782,6 +1786,9 @@ constrain_titlebar_visible (MetaWindow *window,
int horiz_amount_offscreen, vert_amount_offscreen; int horiz_amount_offscreen, vert_amount_offscreen;
int horiz_amount_onscreen, vert_amount_onscreen; int horiz_amount_onscreen, vert_amount_onscreen;
MetaWindowDrag *window_drag; MetaWindowDrag *window_drag;
#ifdef HAVE_X11_CLIENT
MetaFrameBorders borders;
#endif
if (priority > PRIORITY_TITLEBAR_VISIBLE) if (priority > PRIORITY_TITLEBAR_VISIBLE)
return TRUE; return TRUE;
@ -1824,19 +1831,18 @@ constrain_titlebar_visible (MetaWindow *window,
vert_amount_offscreen = info->current.height - vert_amount_onscreen; vert_amount_offscreen = info->current.height - vert_amount_onscreen;
horiz_amount_offscreen = MAX (horiz_amount_offscreen, 0); horiz_amount_offscreen = MAX (horiz_amount_offscreen, 0);
vert_amount_offscreen = MAX (vert_amount_offscreen, 0); vert_amount_offscreen = MAX (vert_amount_offscreen, 0);
bottom_amount = vert_amount_offscreen;
/* Allow the titlebar to touch the bottom panel; If there is no titlebar, /* Allow the titlebar to touch the bottom panel; If there is no titlebar,
* require vert_amount to remain on the screen. * require vert_amount to remain on the screen.
*/ */
if (window->frame) #ifdef HAVE_X11_CLIENT
if (window->client_type == META_WINDOW_CLIENT_TYPE_X11 &&
meta_window_x11_get_frame_borders (window, &borders))
{ {
MetaFrameBorders borders;
meta_frame_calc_borders (window->frame, &borders);
bottom_amount = info->current.height - borders.visible.top; bottom_amount = info->current.height - borders.visible.top;
vert_amount_onscreen = borders.visible.top; vert_amount_onscreen = borders.visible.top;
} }
else #endif
bottom_amount = vert_amount_offscreen;
/* Extend the region, have a helper function handle the constraint, /* Extend the region, have a helper function handle the constraint,
* then return the region to its original size. * then return the region to its original size.
@ -1874,6 +1880,9 @@ constrain_partially_onscreen (MetaWindow *window,
int top_amount, bottom_amount; int top_amount, bottom_amount;
int horiz_amount_offscreen, vert_amount_offscreen; int horiz_amount_offscreen, vert_amount_offscreen;
int horiz_amount_onscreen, vert_amount_onscreen; int horiz_amount_onscreen, vert_amount_onscreen;
#ifdef HAVE_X11_CLIENT
MetaFrameBorders borders;
#endif
if (priority > PRIORITY_PARTIALLY_VISIBLE_ON_WORKAREA) if (priority > PRIORITY_PARTIALLY_VISIBLE_ON_WORKAREA)
return TRUE; return TRUE;
@ -1903,19 +1912,18 @@ constrain_partially_onscreen (MetaWindow *window,
horiz_amount_offscreen = MAX (horiz_amount_offscreen, 0); horiz_amount_offscreen = MAX (horiz_amount_offscreen, 0);
vert_amount_offscreen = MAX (vert_amount_offscreen, 0); vert_amount_offscreen = MAX (vert_amount_offscreen, 0);
top_amount = vert_amount_offscreen; top_amount = vert_amount_offscreen;
bottom_amount = vert_amount_offscreen;
/* Allow the titlebar to touch the bottom panel; If there is no titlebar, /* Allow the titlebar to touch the bottom panel; If there is no titlebar,
* require vert_amount to remain on the screen. * require vert_amount to remain on the screen.
*/ */
if (window->frame) #ifdef HAVE_X11_CLIENT
if (window->client_type == META_WINDOW_CLIENT_TYPE_X11 &&
meta_window_x11_get_frame_borders (window, &borders))
{ {
MetaFrameBorders borders;
meta_frame_calc_borders (window->frame, &borders);
bottom_amount = info->current.height - borders.visible.top; bottom_amount = info->current.height - borders.visible.top;
vert_amount_onscreen = borders.visible.top; vert_amount_onscreen = borders.visible.top;
} }
else #endif
bottom_amount = vert_amount_offscreen;
/* Extend the region, have a helper function handle the constraint, /* Extend the region, have a helper function handle the constraint,
* then return the region to its original size. * then return the region to its original size.

View File

@ -1220,6 +1220,7 @@ meta_change_button_grab (MetaKeyBindingManager *keys,
XIEventMask mask = { XIAllMasterDevices, sizeof (mask_bits), mask_bits }; XIEventMask mask = { XIAllMasterDevices, sizeof (mask_bits), mask_bits };
Window xwindow; Window xwindow;
GArray *mods; GArray *mods;
MetaFrame *frame;
if (meta_is_wayland_compositor ()) if (meta_is_wayland_compositor ())
return; return;
@ -1236,9 +1237,9 @@ meta_change_button_grab (MetaKeyBindingManager *keys,
mods = calc_grab_modifiers (keys, modmask); mods = calc_grab_modifiers (keys, modmask);
mtk_x11_error_trap_push (xdisplay); mtk_x11_error_trap_push (xdisplay);
frame = meta_window_x11_get_frame (window);
if (window->frame) if (frame)
xwindow = window->frame->xwindow; xwindow = frame->xwindow;
else else
xwindow = meta_window_x11_get_xwindow (window); xwindow = meta_window_x11_get_xwindow (window);
@ -1646,9 +1647,9 @@ meta_window_grab_keys (MetaWindow *window)
if (priv->keys_grabbed) if (priv->keys_grabbed)
{ {
if (window->frame && !priv->grab_on_frame) if (priv->frame && !priv->grab_on_frame)
change_window_keygrabs (keys, meta_window_x11_get_xwindow (window), FALSE); change_window_keygrabs (keys, meta_window_x11_get_xwindow (window), FALSE);
else if (window->frame == NULL && else if (priv->frame == NULL &&
priv->grab_on_frame) priv->grab_on_frame)
; /* continue to regrab on client window */ ; /* continue to regrab on client window */
else else
@ -1660,7 +1661,7 @@ meta_window_grab_keys (MetaWindow *window)
TRUE); TRUE);
priv->keys_grabbed = TRUE; priv->keys_grabbed = TRUE;
priv->grab_on_frame = window->frame != NULL; priv->grab_on_frame = priv->frame != NULL;
} }
void void
@ -1677,10 +1678,10 @@ meta_window_ungrab_keys (MetaWindow *window)
{ {
MetaDisplay *display = window->display; MetaDisplay *display = window->display;
MetaKeyBindingManager *keys = &display->key_binding_manager; MetaKeyBindingManager *keys = &display->key_binding_manager;
MetaFrame *frame = meta_window_x11_get_frame (window);
if (priv->grab_on_frame && if (priv->grab_on_frame && frame != NULL)
window->frame != NULL) change_window_keygrabs (keys, frame->xwindow, FALSE);
change_window_keygrabs (keys, window->frame->xwindow, FALSE);
else if (!priv->grab_on_frame) else if (!priv->grab_on_frame)
change_window_keygrabs (keys, meta_window_x11_get_xwindow (window), FALSE); change_window_keygrabs (keys, meta_window_x11_get_xwindow (window), FALSE);

View File

@ -571,6 +571,9 @@ on_stack_changed (MetaStack *stack,
GList *l; GList *l;
GArray *hidden_stack_ids; GArray *hidden_stack_ids;
GList *sorted; GList *sorted;
#ifdef HAVE_X11_CLIENT
MetaFrame *frame;
#endif
COGL_TRACE_BEGIN_SCOPED (StackChanged, "Meta::StackTracker::on_stack_changed()"); COGL_TRACE_BEGIN_SCOPED (StackChanged, "Meta::StackTracker::on_stack_changed()");
@ -586,34 +589,33 @@ on_stack_changed (MetaStack *stack,
for (l = sorted; l; l = l->next) for (l = sorted; l; l = l->next)
{ {
MetaWindow *w = l->data; MetaWindow *w = l->data;
uint64_t stack_id; uint64_t stack_id = w->stamp;
if (w->unmanaging) if (w->unmanaging)
continue; continue;
meta_topic (META_DEBUG_STACK, " %u:%d - %s ", meta_topic (META_DEBUG_STACK, " %u:%d - %s ",
w->layer, w->stack_position, w->desc); w->layer, w->stack_position, w->desc);
#ifdef HAVE_X11_CLIENT #ifdef HAVE_X11_CLIENT
if (w->client_type == META_WINDOW_CLIENT_TYPE_X11) if (w->client_type == META_WINDOW_CLIENT_TYPE_X11)
{ {
if (w->frame) frame = meta_window_x11_get_frame (w);
stack_id = w->frame->xwindow; if (frame)
stack_id = frame->xwindow;
else else
stack_id = meta_window_x11_get_xwindow (w); stack_id = meta_window_x11_get_xwindow (w);
} }
else
#endif #endif
stack_id = w->stamp;
/* We don't restack hidden windows along with the rest, though they are /* We don't restack hidden windows along with the rest, though they are
* reflected in the _NET hints. Hidden windows all get pushed below * reflected in the _NET hints. Hidden windows all get pushed below
* the screens fullscreen guard_window. */ * the screens fullscreen guard_window. */
if (w->hidden) if (w->hidden)
{ {
g_array_append_val (hidden_stack_ids, stack_id); g_array_append_val (hidden_stack_ids, stack_id);
continue; continue;
} }
g_array_append_val (all_root_children_stacked, stack_id); g_array_append_val (all_root_children_stacked, stack_id);
} }
@ -1031,6 +1033,9 @@ meta_stack_tracker_sync_stack (MetaStackTracker *tracker)
GList *meta_windows; GList *meta_windows;
int n_windows; int n_windows;
int i; int i;
#ifdef HAVE_X11_CLIENT
MetaFrame *frame;
#endif
if (tracker->sync_stack_later) if (tracker->sync_stack_later)
{ {
@ -1065,9 +1070,10 @@ meta_stack_tracker_sync_stack (MetaStackTracker *tracker)
* XID => window table. (Wine uses a toplevel for _NET_WM_USER_TIME_WINDOW; * XID => window table. (Wine uses a toplevel for _NET_WM_USER_TIME_WINDOW;
* see window-prop.c:reload_net_wm_user_time_window() for registration.) * see window-prop.c:reload_net_wm_user_time_window() for registration.)
*/ */
frame = meta_window ? meta_window_x11_get_frame (meta_window) : NULL;
if (meta_window && if (meta_window &&
((Window)window == meta_window_x11_get_xwindow (meta_window) || ((Window)window == meta_window_x11_get_xwindow (meta_window) ||
(meta_window->frame && (Window)window == meta_window->frame->xwindow))) (frame && (Window)window == frame->xwindow)))
meta_windows = g_list_prepend (meta_windows, meta_window); meta_windows = g_list_prepend (meta_windows, meta_window);
} }
else else

View File

@ -786,8 +786,8 @@ void meta_window_set_opacity (MetaWindow *window,
gboolean meta_window_handle_ungrabbed_event (MetaWindow *window, gboolean meta_window_handle_ungrabbed_event (MetaWindow *window,
const ClutterEvent *event); const ClutterEvent *event);
void meta_window_get_client_area_rect (const MetaWindow *window, void meta_window_get_client_area_rect (MetaWindow *window,
MtkRectangle *rect); MtkRectangle *rect);
void meta_window_activate_full (MetaWindow *window, void meta_window_activate_full (MetaWindow *window,
guint32 timestamp, guint32 timestamp,

View File

@ -1027,7 +1027,6 @@ meta_window_constructed (GObject *object)
window->title = NULL; window->title = NULL;
window->frame = NULL;
window->has_focus = FALSE; window->has_focus = FALSE;
window->attached_focus_window = NULL; window->attached_focus_window = NULL;
@ -4302,6 +4301,10 @@ meta_window_client_rect_to_frame_rect (MetaWindow *window,
MtkRectangle *client_rect, MtkRectangle *client_rect,
MtkRectangle *frame_rect) MtkRectangle *frame_rect)
{ {
#ifdef HAVE_X11_CLIENT
MetaFrameBorders borders;
#endif
if (!frame_rect) if (!frame_rect)
return; return;
@ -4311,28 +4314,29 @@ meta_window_client_rect_to_frame_rect (MetaWindow *window,
* constraints.c:get_size_limits() and not something that we provide * constraints.c:get_size_limits() and not something that we provide
* in other locations or document. * in other locations or document.
*/ */
if (window->frame) #ifdef HAVE_X11_CLIENT
if (window->client_type == META_WINDOW_CLIENT_TYPE_X11 &&
meta_window_x11_get_frame_borders (window, &borders))
{ {
MetaFrameBorders borders;
meta_frame_calc_borders (window->frame, &borders);
frame_rect->x -= borders.visible.left; frame_rect->x -= borders.visible.left;
frame_rect->y -= borders.visible.top; frame_rect->y -= borders.visible.top;
if (frame_rect->width != G_MAXINT) if (frame_rect->width != G_MAXINT)
frame_rect->width += borders.visible.left + borders.visible.right; frame_rect->width += borders.visible.left + borders.visible.right;
if (frame_rect->height != G_MAXINT) if (frame_rect->height != G_MAXINT)
frame_rect->height += borders.visible.top + borders.visible.bottom; frame_rect->height += borders.visible.top + borders.visible.bottom;
} }
else else
{ #endif
const MetaFrameBorder *extents = &window->custom_frame_extents; {
frame_rect->x += extents->left; const MetaFrameBorder *extents = &window->custom_frame_extents;
frame_rect->y += extents->top;
if (frame_rect->width != G_MAXINT) frame_rect->x += extents->left;
frame_rect->width -= extents->left + extents->right; frame_rect->y += extents->top;
if (frame_rect->height != G_MAXINT) if (frame_rect->width != G_MAXINT)
frame_rect->height -= extents->top + extents->bottom; frame_rect->width -= extents->left + extents->right;
} if (frame_rect->height != G_MAXINT)
frame_rect->height -= extents->top + extents->bottom;
}
} }
/** /**
@ -4349,29 +4353,34 @@ meta_window_frame_rect_to_client_rect (MetaWindow *window,
MtkRectangle *frame_rect, MtkRectangle *frame_rect,
MtkRectangle *client_rect) MtkRectangle *client_rect)
{ {
#ifdef HAVE_X11_CLIENT
MetaFrameBorders borders;
#endif
if (!client_rect) if (!client_rect)
return; return;
*client_rect = *frame_rect; *client_rect = *frame_rect;
if (window->frame) #ifdef HAVE_X11_CLIENT
if (window->client_type == META_WINDOW_CLIENT_TYPE_X11 &&
meta_window_x11_get_frame_borders (window, &borders))
{ {
MetaFrameBorders borders;
meta_frame_calc_borders (window->frame, &borders);
client_rect->x += borders.visible.left; client_rect->x += borders.visible.left;
client_rect->y += borders.visible.top; client_rect->y += borders.visible.top;
client_rect->width -= borders.visible.left + borders.visible.right; client_rect->width -= borders.visible.left + borders.visible.right;
client_rect->height -= borders.visible.top + borders.visible.bottom; client_rect->height -= borders.visible.top + borders.visible.bottom;
} }
else else
{ #endif
const MetaFrameBorder *extents = &window->custom_frame_extents; {
client_rect->x -= extents->left; const MetaFrameBorder *extents = &window->custom_frame_extents;
client_rect->y -= extents->top;
client_rect->width += extents->left + extents->right; client_rect->x -= extents->left;
client_rect->height += extents->top + extents->bottom; client_rect->y -= extents->top;
} client_rect->width += extents->left + extents->right;
client_rect->height += extents->top + extents->bottom;
}
} }
/** /**
@ -4401,12 +4410,14 @@ meta_window_get_frame_rect (const MetaWindow *window,
* to the buffer rect. * to the buffer rect.
*/ */
void void
meta_window_get_client_area_rect (const MetaWindow *window, meta_window_get_client_area_rect (MetaWindow *window,
MtkRectangle *rect) MtkRectangle *rect)
{ {
MetaFrameBorders borders; MetaFrameBorders borders = { 0, };
#ifdef HAVE_X11_CLIENT
meta_frame_calc_borders (window->frame, &borders); if (window->client_type == META_WINDOW_CLIENT_TYPE_X11)
meta_window_x11_get_frame_borders (window, &borders);
#endif
rect->x = borders.total.left; rect->x = borders.total.left;
rect->y = borders.total.top; rect->y = borders.total.top;
@ -5363,11 +5374,16 @@ meta_window_type_changed (MetaWindow *window)
if (!window->override_redirect) if (!window->override_redirect)
set_net_wm_state (window); set_net_wm_state (window);
/* Update frame */ #ifdef HAVE_X11_CLIENT
if (window->decorated) if (window->client_type == META_WINDOW_CLIENT_TYPE_X11)
meta_window_ensure_frame (window); {
else /* Update frame */
meta_window_destroy_frame (window); if (window->decorated)
meta_window_ensure_frame (window);
else
meta_window_destroy_frame (window);
}
#endif
/* update stacking constraints */ /* update stacking constraints */
meta_window_update_layer (window); meta_window_update_layer (window);
@ -5398,8 +5414,16 @@ meta_window_set_type (MetaWindow *window,
void void
meta_window_frame_size_changed (MetaWindow *window) meta_window_frame_size_changed (MetaWindow *window)
{ {
if (window->frame) #ifdef HAVE_X11_CLIENT
meta_frame_clear_cached_borders (window->frame); MetaFrame *frame;
if (window->client_type == META_WINDOW_CLIENT_TYPE_X11)
{
frame = meta_window_x11_get_frame (window);
if (frame)
meta_frame_clear_cached_borders (frame);
}
#endif
} }
static void static void
@ -6240,17 +6264,6 @@ meta_window_unset_demands_attention (MetaWindow *window)
} }
} }
/**
* meta_window_get_frame: (skip)
* @window: a #MetaWindow
*
*/
MetaFrame *
meta_window_get_frame (MetaWindow *window)
{
return window->frame;
}
/** /**
* meta_window_appears_focused: * meta_window_appears_focused:
* @window: a #MetaWindow * @window: a #MetaWindow
@ -6793,8 +6806,14 @@ meta_window_get_frame_bounds (MetaWindow *window)
{ {
if (!window->frame_bounds) if (!window->frame_bounds)
{ {
if (window->frame) #ifdef HAVE_X11_CLIENT
window->frame_bounds = meta_frame_get_frame_bounds (window->frame); MetaFrame *frame = meta_window_x11_get_frame (window);
#else
/* Only for now, as this method would be moved to a window-x11 in the upcoming commits */
MetaFrame *frame = NULL;
#endif
if (frame)
window->frame_bounds = meta_frame_get_frame_bounds (frame);
} }
return window->frame_bounds; return window->frame_bounds;

View File

@ -103,9 +103,6 @@ typedef struct _MetaWindowClass MetaWindowClass;
META_EXPORT META_EXPORT
GType meta_window_get_type (void); GType meta_window_get_type (void);
META_EXPORT
MetaFrame *meta_window_get_frame (MetaWindow *window);
META_EXPORT META_EXPORT
gboolean meta_window_has_focus (MetaWindow *window); gboolean meta_window_has_focus (MetaWindow *window);

View File

@ -37,6 +37,7 @@
#include "wayland/meta-wayland.h" #include "wayland/meta-wayland.h"
#include "wayland/meta-window-wayland.h" #include "wayland/meta-window-wayland.h"
#include "x11/meta-x11-display-private.h" #include "x11/meta-x11-display-private.h"
#include "x11/window-x11.h"
typedef struct { typedef struct {
MetaContext *context; MetaContext *context;
@ -1392,7 +1393,7 @@ test_case_do (TestCase *test,
if (!window) if (!window)
return FALSE; return FALSE;
if (meta_window_get_frame (window)) if (META_IS_WINDOW_X11 (window) && meta_window_x11_get_frame (window))
{ {
g_set_error (error, g_set_error (error,
META_TEST_CLIENT_ERROR, META_TEST_CLIENT_ERROR,

View File

@ -30,7 +30,6 @@
#include "backends/meta-pointer-constraint.h" #include "backends/meta-pointer-constraint.h"
#include "core/window-private.h" #include "core/window-private.h"
#include "meta/meta-backend.h" #include "meta/meta-backend.h"
#include "x11/meta-x11-frame.h"
#include "wayland/meta-pointer-confinement-wayland.h" #include "wayland/meta-pointer-confinement-wayland.h"
#include "wayland/meta-pointer-lock-wayland.h" #include "wayland/meta-pointer-lock-wayland.h"
#include "wayland/meta-wayland-pointer.h" #include "wayland/meta-wayland-pointer.h"
@ -42,6 +41,8 @@
#ifdef HAVE_XWAYLAND #ifdef HAVE_XWAYLAND
#include "wayland/meta-xwayland.h" #include "wayland/meta-xwayland.h"
#include "x11/meta-x11-frame.h"
#include "x11/window-x11.h"
#endif #endif
#include "pointer-constraints-unstable-v1-server-protocol.h" #include "pointer-constraints-unstable-v1-server-protocol.h"
@ -627,32 +628,40 @@ MtkRegion *
meta_wayland_pointer_constraint_calculate_effective_region (MetaWaylandPointerConstraint *constraint) meta_wayland_pointer_constraint_calculate_effective_region (MetaWaylandPointerConstraint *constraint)
{ {
MtkRegion *region; MtkRegion *region;
#ifdef HAVE_XWAYLAND
MetaWindow *window; MetaWindow *window;
MetaFrame *frame;
#endif
region = meta_wayland_surface_calculate_input_region (constraint->surface); region = meta_wayland_surface_calculate_input_region (constraint->surface);
if (constraint->region) if (constraint->region)
mtk_region_intersect (region, constraint->region); mtk_region_intersect (region, constraint->region);
#ifdef HAVE_XWAYLAND
window = meta_wayland_surface_get_window (constraint->surface); window = meta_wayland_surface_get_window (constraint->surface);
if (window && window->frame) if (window && window->client_type == META_WINDOW_CLIENT_TYPE_X11)
{ {
MetaFrame *frame = window->frame; frame = meta_window_x11_get_frame (window);
int actual_width, actual_height; if (frame)
g_assert (meta_wayland_surface_is_xwayland (constraint->surface));
actual_width = window->buffer_rect.width - (frame->child_x +
frame->right_width);
actual_height = window->buffer_rect.height - (frame->child_y +
frame->bottom_height);
if (actual_width > 0 && actual_height > 0)
{ {
mtk_region_intersect_rectangle (region, &MTK_RECTANGLE_INIT (frame->child_x, int actual_width, actual_height;
frame->child_y,
actual_width, g_assert (meta_wayland_surface_is_xwayland (constraint->surface));
actual_height));
actual_width = window->buffer_rect.width - (frame->child_x +
frame->right_width);
actual_height = window->buffer_rect.height - (frame->child_y +
frame->bottom_height);
if (actual_width > 0 && actual_height > 0)
{
mtk_region_intersect_rectangle (region, &MTK_RECTANGLE_INIT (frame->child_x,
frame->child_y,
actual_width,
actual_height));
}
} }
} }
#endif
return region; return region;
} }

View File

@ -269,8 +269,6 @@ meta_window_wayland_move_resize_internal (MetaWindow *window,
int new_buffer_x; int new_buffer_x;
int new_buffer_y; int new_buffer_y;
g_assert (window->frame == NULL);
/* don't do anything if we're dropping the window, see #751847 */ /* don't do anything if we're dropping the window, see #751847 */
if (window->unmanaging) if (window->unmanaging)
return; return;

View File

@ -197,7 +197,7 @@ apply_allow_commits_x11_property (MetaWindowXwayland *xwayland_window,
if (!x11_display) if (!x11_display)
return; return;
frame = meta_window_get_frame (window); frame = meta_window_x11_get_frame (window);
if (!frame) if (!frame)
xwin = meta_window_x11_get_xwindow (window); xwin = meta_window_x11_get_xwindow (window);
else else

View File

@ -804,15 +804,18 @@ handle_window_focus_event (MetaX11Display *x11_display,
MetaWindow *focus_window; MetaWindow *focus_window;
#ifdef WITH_VERBOSE_MODE #ifdef WITH_VERBOSE_MODE
const char *window_type; const char *window_type;
MetaFrame *frame;
/* Note the event can be on either the window or the frame, /* Note the event can be on either the window or the frame,
* we focus the frame for output-only windows * we focus the frame for output-only windows
*/ */
if (window) if (window)
{ {
frame = meta_window_x11_get_frame (window);
if (event->event == meta_window_x11_get_xwindow (window)) if (event->event == meta_window_x11_get_xwindow (window))
window_type = "client window"; window_type = "client window";
else if (window->frame && event->event == window->frame->xwindow) else if (frame && event->event == frame->xwindow)
window_type = "frame window"; window_type = "frame window";
else else
window_type = "unknown client window"; window_type = "unknown client window";
@ -1249,12 +1252,16 @@ notify_bell (MetaX11Display *x11_display,
MetaDisplay *display = x11_display->display; MetaDisplay *display = x11_display->display;
XkbBellNotifyEvent *xkb_bell_event = (XkbBellNotifyEvent*) xkb_ev; XkbBellNotifyEvent *xkb_bell_event = (XkbBellNotifyEvent*) xkb_ev;
MetaWindow *window; MetaWindow *window;
MetaFrame *frame;
window = meta_x11_display_lookup_x_window (x11_display, window = meta_x11_display_lookup_x_window (x11_display,
xkb_bell_event->window); xkb_bell_event->window);
if (!window && display->focus_window && display->focus_window->frame) if (!window && display->focus_window)
window = display->focus_window; {
frame = meta_window_x11_get_frame (display->focus_window);
if (frame)
window = display->focus_window;
}
x11_display->last_bell_time = xkb_ev->time; x11_display->last_bell_time = xkb_ev->time;
if (!meta_bell_notify (display, window) && if (!meta_bell_notify (display, window) &&
meta_prefs_bell_is_audible ()) meta_prefs_bell_is_audible ())
@ -1278,10 +1285,13 @@ handle_other_xevent (MetaX11Display *x11_display,
MetaWindow *window; MetaWindow *window;
MetaWindow *property_for_window; MetaWindow *property_for_window;
gboolean frame_was_receiver; gboolean frame_was_receiver;
MetaFrame *frame = NULL;
modified = event_get_modified_window (x11_display, event); modified = event_get_modified_window (x11_display, event);
window = modified != None ? meta_x11_display_lookup_x_window (x11_display, modified) : NULL; window = modified != None ? meta_x11_display_lookup_x_window (x11_display, modified) : NULL;
frame_was_receiver = (window && window->frame && modified == window->frame->xwindow); if (window)
frame = meta_window_x11_get_frame (window);
frame_was_receiver = frame && modified == frame->xwindow;
/* We only want to respond to _NET_WM_USER_TIME property notify /* We only want to respond to _NET_WM_USER_TIME property notify
* events on _NET_WM_USER_TIME_WINDOW windows; in particular, * events on _NET_WM_USER_TIME_WINDOW windows; in particular,
@ -1388,7 +1398,7 @@ handle_other_xevent (MetaX11Display *x11_display,
if (frame_was_receiver) if (frame_was_receiver)
{ {
mtk_x11_error_trap_push (x11_display->xdisplay); mtk_x11_error_trap_push (x11_display->xdisplay);
meta_window_destroy_frame (window->frame->window); meta_window_destroy_frame (frame->window);
mtk_x11_error_trap_pop (x11_display->xdisplay); mtk_x11_error_trap_pop (x11_display->xdisplay);
} }
else else
@ -1570,9 +1580,9 @@ handle_other_xevent (MetaX11Display *x11_display,
{ {
meta_window_x11_configure_request (window, event); meta_window_x11_configure_request (window, event);
} }
else if (frame_was_receiver && window->frame) else if (frame_was_receiver && frame)
{ {
meta_frame_handle_xevent (window->frame, event); meta_frame_handle_xevent (frame, event);
} }
break; break;
case GravityNotify: case GravityNotify:
@ -1592,7 +1602,7 @@ handle_other_xevent (MetaX11Display *x11_display,
else if (property_for_window && !frame_was_receiver) else if (property_for_window && !frame_was_receiver)
meta_window_x11_property_notify (property_for_window, event); meta_window_x11_property_notify (property_for_window, event);
else if (frame_was_receiver) else if (frame_was_receiver)
meta_frame_handle_xevent (window->frame, event); meta_frame_handle_xevent (frame, event);
group = meta_x11_display_lookup_group (x11_display, group = meta_x11_display_lookup_group (x11_display,
event->xproperty.window); event->xproperty.window);
@ -1781,10 +1791,13 @@ static gboolean
window_has_xwindow (MetaWindow *window, window_has_xwindow (MetaWindow *window,
Window xwindow) Window xwindow)
{ {
MetaFrame *frame;
if (meta_window_x11_get_xwindow (window) == xwindow) if (meta_window_x11_get_xwindow (window) == xwindow)
return TRUE; return TRUE;
if (window->frame && window->frame->xwindow == xwindow) frame = meta_window_x11_get_frame (window);
if (frame && frame->xwindow == xwindow)
return TRUE; return TRUE;
return FALSE; return FALSE;

View File

@ -2086,6 +2086,7 @@ meta_x11_display_set_input_focus (MetaX11Display *x11_display,
{ {
Window xwindow = x11_display->no_focus_window; Window xwindow = x11_display->no_focus_window;
gulong serial; gulong serial;
MetaFrame *frame;
#ifdef HAVE_X11 #ifdef HAVE_X11
MetaDisplay *display = x11_display->display; MetaDisplay *display = x11_display->display;
ClutterStage *stage = CLUTTER_STAGE (meta_get_stage_for_display (display)); ClutterStage *stage = CLUTTER_STAGE (meta_get_stage_for_display (display));
@ -2093,14 +2094,15 @@ meta_x11_display_set_input_focus (MetaX11Display *x11_display,
if (window && META_IS_WINDOW_X11 (window)) if (window && META_IS_WINDOW_X11 (window))
{ {
frame = meta_window_x11_get_frame (window);
/* For output-only windows, focus the frame. /* For output-only windows, focus the frame.
* This seems to result in the client window getting key events * This seems to result in the client window getting key events
* though, so I don't know if it's icccm-compliant. * though, so I don't know if it's icccm-compliant.
* *
* Still, we have to do this or keynav breaks for these windows. * Still, we have to do this or keynav breaks for these windows.
*/ */
if (window->frame && !meta_window_is_focusable (window)) if (frame && !meta_window_is_focusable (window))
xwindow = window->frame->xwindow; xwindow = frame->xwindow;
else else
xwindow = meta_window_x11_get_xwindow (window); xwindow = meta_window_x11_get_xwindow (window);
} }

View File

@ -65,8 +65,10 @@ meta_window_x11_set_frame_xwindow (MetaWindow *window,
XSetWindowAttributes attrs; XSetWindowAttributes attrs;
gulong create_serial = 0; gulong create_serial = 0;
MetaFrame *frame; MetaFrame *frame;
MetaWindowX11 *window_x11 = META_WINDOW_X11 (window);
MetaWindowX11Private *priv = meta_window_x11_get_private (window_x11);
if (window->frame) if (priv->frame)
return; return;
frame = g_new0 (MetaFrame, 1); frame = g_new0 (MetaFrame, 1);
@ -84,7 +86,7 @@ meta_window_x11_set_frame_xwindow (MetaWindow *window,
meta_sync_counter_init (&frame->sync_counter, window, frame->xwindow); meta_sync_counter_init (&frame->sync_counter, window, frame->xwindow);
window->frame = frame; priv->frame = frame;
meta_verbose ("Frame geometry %d,%d %dx%d", meta_verbose ("Frame geometry %d,%d %dx%d",
frame->rect.x, frame->rect.y, frame->rect.x, frame->rect.y,
@ -142,7 +144,7 @@ meta_window_x11_set_frame_xwindow (MetaWindow *window,
window->restore_focus_on_map = TRUE; window->restore_focus_on_map = TRUE;
/* stick frame to the window */ /* stick frame to the window */
window->frame = frame; priv->frame = frame;
meta_window_reload_property_from_xwindow (window, frame->xwindow, meta_window_reload_property_from_xwindow (window, frame->xwindow,
x11_display->atom__NET_WM_SYNC_REQUEST_COUNTER, x11_display->atom__NET_WM_SYNC_REQUEST_COUNTER,
@ -172,14 +174,17 @@ meta_window_destroy_frame (MetaWindow *window)
MetaFrameBorders borders; MetaFrameBorders borders;
MetaX11Display *x11_display; MetaX11Display *x11_display;
if (window->frame == NULL) MetaWindowX11 *window_x11 = META_WINDOW_X11 (window);
MetaWindowX11Private *priv = meta_window_x11_get_private (window_x11);
if (priv->frame == NULL)
return; return;
x11_display = window->display->x11_display; x11_display = window->display->x11_display;
meta_verbose ("Unframing window %s", window->desc); meta_verbose ("Unframing window %s", window->desc);
frame = window->frame; frame = priv->frame;
meta_frame_calc_borders (frame, &borders); meta_frame_calc_borders (frame, &borders);
@ -214,8 +219,8 @@ meta_window_destroy_frame (MetaWindow *window)
* coordinates here means we'll need to ensure a configure * coordinates here means we'll need to ensure a configure
* notify event is sent; see bug 399552. * notify event is sent; see bug 399552.
*/ */
window->frame->rect.x + borders.invisible.left, priv->frame->rect.x + borders.invisible.left,
window->frame->rect.y + borders.invisible.top); priv->frame->rect.y + borders.invisible.top);
window->reparents_pending += 1; window->reparents_pending += 1;
} }
@ -236,7 +241,7 @@ meta_window_destroy_frame (MetaWindow *window)
meta_x11_display_unregister_x_window (x11_display, frame->xwindow); meta_x11_display_unregister_x_window (x11_display, frame->xwindow);
window->frame = NULL; priv->frame = NULL;
g_clear_pointer (&window->frame_bounds, mtk_region_unref); g_clear_pointer (&window->frame_bounds, mtk_region_unref);
g_clear_pointer (&frame->opaque_region, mtk_region_unref); g_clear_pointer (&frame->opaque_region, mtk_region_unref);

View File

@ -124,17 +124,20 @@ stack_window_removed_cb (MetaStack *stack,
MetaWindow *window, MetaWindow *window,
MetaX11Stack *x11_stack) MetaX11Stack *x11_stack)
{ {
MetaFrame *frame;
if (window->client_type != META_WINDOW_CLIENT_TYPE_X11) if (window->client_type != META_WINDOW_CLIENT_TYPE_X11)
return; return;
frame = meta_window_x11_get_frame (window);
x11_stack->added = g_list_remove (x11_stack->added, window); x11_stack->added = g_list_remove (x11_stack->added, window);
x11_stack->removed = g_list_prepend (x11_stack->removed, x11_stack->removed = g_list_prepend (x11_stack->removed,
GUINT_TO_POINTER (meta_window_x11_get_xwindow (window))); GUINT_TO_POINTER (meta_window_x11_get_xwindow (window)));
if (window->frame) if (frame)
{ {
x11_stack->removed = g_list_prepend (x11_stack->removed, x11_stack->removed = g_list_prepend (x11_stack->removed,
GUINT_TO_POINTER (window->frame->xwindow)); GUINT_TO_POINTER (frame->xwindow));
} }
} }

View File

@ -652,6 +652,7 @@ reload_opaque_region (MetaWindow *window,
gboolean initial) gboolean initial)
{ {
MtkRegion *opaque_region = NULL; MtkRegion *opaque_region = NULL;
MetaFrame *frame;
if (value->type != META_PROP_VALUE_INVALID) if (value->type != META_PROP_VALUE_INVALID)
{ {
@ -695,10 +696,11 @@ reload_opaque_region (MetaWindow *window,
} }
out: out:
frame = meta_window_x11_get_frame (window);
if (value->source_xwindow == meta_window_x11_get_xwindow (window)) if (value->source_xwindow == meta_window_x11_get_xwindow (window))
meta_window_set_opaque_region (window, opaque_region); meta_window_set_opaque_region (window, opaque_region);
else if (window->frame && value->source_xwindow == window->frame->xwindow) else if (frame && value->source_xwindow == frame->xwindow)
meta_frame_set_opaque_region (window->frame, opaque_region); meta_frame_set_opaque_region (frame, opaque_region);
g_clear_pointer (&opaque_region, mtk_region_unref); g_clear_pointer (&opaque_region, mtk_region_unref);
} }
@ -1040,11 +1042,12 @@ reload_update_counter (MetaWindow *window,
if (value->type != META_PROP_VALUE_INVALID) if (value->type != META_PROP_VALUE_INVALID)
{ {
MetaSyncCounter *sync_counter; MetaSyncCounter *sync_counter;
MetaFrame *frame = meta_window_x11_get_frame (window);
if (value->source_xwindow == meta_window_x11_get_xwindow (window)) if (value->source_xwindow == meta_window_x11_get_xwindow (window))
sync_counter = meta_window_x11_get_sync_counter (window); sync_counter = meta_window_x11_get_sync_counter (window);
else if (window->frame && value->source_xwindow == window->frame->xwindow) else if (frame && value->source_xwindow == frame->xwindow)
sync_counter = meta_frame_get_sync_counter (window->frame); sync_counter = meta_frame_get_sync_counter (frame);
else else
g_assert_not_reached (); g_assert_not_reached ();

View File

@ -99,6 +99,8 @@ struct _MetaWindowX11Private
/* maintained by group.c */ /* maintained by group.c */
MetaGroup *group; MetaGroup *group;
/* may be NULL! not all windows get decorated */
MetaFrame *frame;
gboolean has_custom_frame_extents; gboolean has_custom_frame_extents;
MetaSyncCounter sync_counter; MetaSyncCounter sync_counter;
@ -142,5 +144,8 @@ void meta_window_x11_get_session_geometry (MetaWindow *window,
int *width, int *width,
int *height); int *height);
gboolean
meta_window_x11_get_frame_borders (MetaWindow *window,
MetaFrameBorders *borders);
G_END_DECLS G_END_DECLS

View File

@ -256,7 +256,7 @@ send_configure_notify (MetaWindow *window)
event.xconfigure.window = priv->xwindow; event.xconfigure.window = priv->xwindow;
event.xconfigure.x = priv->client_rect.x - priv->border_width; event.xconfigure.x = priv->client_rect.x - priv->border_width;
event.xconfigure.y = priv->client_rect.y - priv->border_width; event.xconfigure.y = priv->client_rect.y - priv->border_width;
if (window->frame) if (priv->frame)
{ {
if (window->withdrawn) if (window->withdrawn)
{ {
@ -265,16 +265,16 @@ send_configure_notify (MetaWindow *window)
* where the visible top-left of the frame window currently is. * where the visible top-left of the frame window currently is.
*/ */
meta_frame_calc_borders (window->frame, &borders); meta_frame_calc_borders (priv->frame, &borders);
event.xconfigure.x = window->frame->rect.x + borders.invisible.left; event.xconfigure.x = priv->frame->rect.x + borders.invisible.left;
event.xconfigure.y = window->frame->rect.y + borders.invisible.top; event.xconfigure.y = priv->frame->rect.y + borders.invisible.top;
} }
else else
{ {
/* Need to be in root window coordinates */ /* Need to be in root window coordinates */
event.xconfigure.x += window->frame->rect.x; event.xconfigure.x += priv->frame->rect.x;
event.xconfigure.y += window->frame->rect.y; event.xconfigure.y += priv->frame->rect.y;
} }
} }
event.xconfigure.width = priv->client_rect.width; event.xconfigure.width = priv->client_rect.width;
@ -326,7 +326,7 @@ adjust_for_gravity (MetaWindow *window,
else else
bw = 0; bw = 0;
meta_frame_calc_borders (window->frame, &borders); meta_frame_calc_borders (priv->frame, &borders);
child_x = borders.visible.left; child_x = borders.visible.left;
child_y = borders.visible.top; child_y = borders.visible.top;
@ -719,7 +719,7 @@ meta_window_x11_unmanage (MetaWindow *window)
mtk_x11_error_trap_pop (x11_display->xdisplay); mtk_x11_error_trap_pop (x11_display->xdisplay);
if (window->frame) if (priv->frame)
{ {
/* The XReparentWindow call in meta_window_destroy_frame() moves the /* The XReparentWindow call in meta_window_destroy_frame() moves the
* window so we need to send a configure notify; see bug 399552. (We * window so we need to send a configure notify; see bug 399552. (We
@ -998,7 +998,7 @@ meta_window_x11_focus (MetaWindow *window,
gboolean is_output_only_with_frame; gboolean is_output_only_with_frame;
is_output_only_with_frame = is_output_only_with_frame =
window->frame && !meta_window_is_focusable (window); priv->frame && !meta_window_is_focusable (window);
if (window->input || is_output_only_with_frame) if (window->input || is_output_only_with_frame)
{ {
@ -1060,10 +1060,10 @@ meta_window_get_client_root_coords (MetaWindow *window,
*rect = priv->client_rect; *rect = priv->client_rect;
if (window->frame) if (priv->frame)
{ {
rect->x += window->frame->rect.x; rect->x += priv->frame->rect.x;
rect->y += window->frame->rect.y; rect->y += priv->frame->rect.y;
} }
} }
@ -1136,13 +1136,15 @@ meta_window_x11_grab_op_ended (MetaWindow *window,
static void static void
update_net_frame_extents (MetaWindow *window) update_net_frame_extents (MetaWindow *window)
{ {
MetaWindowX11 *window_x11 = META_WINDOW_X11 (window);
MetaWindowX11Private *priv = meta_window_x11_get_instance_private (window_x11);
MetaX11Display *x11_display = window->display->x11_display; MetaX11Display *x11_display = window->display->x11_display;
unsigned long data[4]; unsigned long data[4];
MetaFrameBorders borders; MetaFrameBorders borders;
Window xwindow = meta_window_x11_get_xwindow (window); Window xwindow = meta_window_x11_get_xwindow (window);
meta_frame_calc_borders (window->frame, &borders); meta_frame_calc_borders (priv->frame, &borders);
/* Left */ /* Left */
data[0] = borders.visible.left; data[0] = borders.visible.left;
/* Right */ /* Right */
@ -1228,6 +1230,8 @@ edge_constraints_to_gtk_edge_constraints (MetaWindow *window)
static void static void
update_gtk_edge_constraints (MetaWindow *window) update_gtk_edge_constraints (MetaWindow *window)
{ {
MetaWindowX11 *window_x11 = META_WINDOW_X11 (window);
MetaWindowX11Private *priv = meta_window_x11_get_instance_private (window_x11);
MetaX11Display *x11_display = window->display->x11_display; MetaX11Display *x11_display = window->display->x11_display;
unsigned long data[1]; unsigned long data[1];
@ -1237,7 +1241,7 @@ update_gtk_edge_constraints (MetaWindow *window)
mtk_x11_error_trap_push (x11_display->xdisplay); mtk_x11_error_trap_push (x11_display->xdisplay);
XChangeProperty (x11_display->xdisplay, XChangeProperty (x11_display->xdisplay,
window->frame ? window->frame->xwindow : meta_window_x11_get_xwindow (window), priv->frame ? priv->frame->xwindow : meta_window_x11_get_xwindow (window),
x11_display->atom__GTK_EDGE_CONSTRAINTS, x11_display->atom__GTK_EDGE_CONSTRAINTS,
XA_CARDINAL, 32, PropModeReplace, XA_CARDINAL, 32, PropModeReplace,
(guchar*) data, 1); (guchar*) data, 1);
@ -1321,14 +1325,14 @@ meta_window_x11_move_resize_internal (MetaWindow *window,
is_configure_request = (flags & META_MOVE_RESIZE_CONFIGURE_REQUEST) != 0; is_configure_request = (flags & META_MOVE_RESIZE_CONFIGURE_REQUEST) != 0;
meta_frame_calc_borders (window->frame, &borders); meta_frame_calc_borders (priv->frame, &borders);
size_dx = constrained_rect.width - window->rect.width; size_dx = constrained_rect.width - window->rect.width;
size_dy = constrained_rect.height - window->rect.height; size_dy = constrained_rect.height - window->rect.height;
window->rect = constrained_rect; window->rect = constrained_rect;
if (window->frame) if (priv->frame)
{ {
int new_w, new_h; int new_w, new_h;
int new_x, new_y; int new_x, new_y;
@ -1337,24 +1341,24 @@ meta_window_x11_move_resize_internal (MetaWindow *window,
new_w = window->rect.width + borders.invisible.left + borders.invisible.right; new_w = window->rect.width + borders.invisible.left + borders.invisible.right;
new_h = window->rect.height + borders.invisible.top + borders.invisible.bottom; new_h = window->rect.height + borders.invisible.top + borders.invisible.bottom;
if (new_w != window->frame->rect.width || if (new_w != priv->frame->rect.width ||
new_h != window->frame->rect.height) new_h != priv->frame->rect.height)
{ {
need_resize_frame = TRUE; need_resize_frame = TRUE;
window->frame->rect.width = new_w; priv->frame->rect.width = new_w;
window->frame->rect.height = new_h; priv->frame->rect.height = new_h;
} }
/* Compute new frame coords */ /* Compute new frame coords */
new_x = window->rect.x - borders.invisible.left; new_x = window->rect.x - borders.invisible.left;
new_y = window->rect.y - borders.invisible.top; new_y = window->rect.y - borders.invisible.top;
if (new_x != window->frame->rect.x || if (new_x != priv->frame->rect.x ||
new_y != window->frame->rect.y) new_y != priv->frame->rect.y)
{ {
need_move_frame = TRUE; need_move_frame = TRUE;
window->frame->rect.x = new_x; priv->frame->rect.x = new_x;
window->frame->rect.y = new_y; priv->frame->rect.y = new_y;
} }
} }
@ -1365,7 +1369,7 @@ meta_window_x11_move_resize_internal (MetaWindow *window,
* values we need to pass to XConfigureWindow are in parent * values we need to pass to XConfigureWindow are in parent
* coordinates, so if the window is in a frame, we need to * coordinates, so if the window is in a frame, we need to
* correct the x/y positions here. */ * correct the x/y positions here. */
if (window->frame) if (priv->frame)
{ {
client_rect.x = borders.total.left; client_rect.x = borders.total.left;
client_rect.y = borders.total.top; client_rect.y = borders.total.top;
@ -1389,16 +1393,16 @@ meta_window_x11_move_resize_internal (MetaWindow *window,
/* If frame extents have changed, fill in other frame fields and /* If frame extents have changed, fill in other frame fields and
change frame's extents property. */ change frame's extents property. */
if (window->frame && if (priv->frame &&
(window->frame->child_x != borders.total.left || (priv->frame->child_x != borders.total.left ||
window->frame->child_y != borders.total.top || priv->frame->child_y != borders.total.top ||
window->frame->right_width != borders.total.right || priv->frame->right_width != borders.total.right ||
window->frame->bottom_height != borders.total.bottom)) priv->frame->bottom_height != borders.total.bottom))
{ {
window->frame->child_x = borders.total.left; priv->frame->child_x = borders.total.left;
window->frame->child_y = borders.total.top; priv->frame->child_y = borders.total.top;
window->frame->right_width = borders.total.right; priv->frame->right_width = borders.total.right;
window->frame->bottom_height = borders.total.bottom; priv->frame->bottom_height = borders.total.bottom;
update_net_frame_extents (window); update_net_frame_extents (window);
} }
@ -1430,7 +1434,7 @@ meta_window_x11_move_resize_internal (MetaWindow *window,
* PROGRAM_POSITION/USER_POSITION hints aren't set, mutter seems to send a * PROGRAM_POSITION/USER_POSITION hints aren't set, mutter seems to send a
* ConfigureNotify anyway due to the above code.) * ConfigureNotify anyway due to the above code.)
*/ */
if (window->constructing && window->frame && if (window->constructing && priv->frame &&
((window->size_hints.flags & META_SIZE_HINTS_PROGRAM_POSITION) || ((window->size_hints.flags & META_SIZE_HINTS_PROGRAM_POSITION) ||
(window->size_hints.flags & META_SIZE_HINTS_USER_POSITION))) (window->size_hints.flags & META_SIZE_HINTS_USER_POSITION)))
need_configure_notify = TRUE; need_configure_notify = TRUE;
@ -1506,12 +1510,12 @@ meta_window_x11_move_resize_internal (MetaWindow *window,
meta_grab_op_is_resizing (meta_window_drag_get_grab_op (window_drag))) meta_grab_op_is_resizing (meta_window_drag_get_grab_op (window_drag)))
{ {
meta_sync_counter_send_request (&priv->sync_counter); meta_sync_counter_send_request (&priv->sync_counter);
if (window->frame) if (priv->frame)
meta_sync_counter_send_request (meta_frame_get_sync_counter (window->frame)); meta_sync_counter_send_request (meta_frame_get_sync_counter (priv->frame));
} }
if (configure_frame_first && window->frame) if (configure_frame_first && priv->frame)
frame_shape_changed = meta_frame_sync_to_window (window->frame, need_resize_frame); frame_shape_changed = meta_frame_sync_to_window (priv->frame, need_resize_frame);
if (mask != 0) if (mask != 0)
{ {
@ -1521,13 +1525,13 @@ meta_window_x11_move_resize_internal (MetaWindow *window,
&values); &values);
} }
if (!configure_frame_first && window->frame) if (!configure_frame_first && priv->frame)
frame_shape_changed = meta_frame_sync_to_window (window->frame, need_resize_frame); frame_shape_changed = meta_frame_sync_to_window (priv->frame, need_resize_frame);
mtk_x11_error_trap_pop (window->display->x11_display->xdisplay); mtk_x11_error_trap_pop (window->display->x11_display->xdisplay);
if (window->frame) if (priv->frame)
window->buffer_rect = window->frame->rect; window->buffer_rect = priv->frame->rect;
else else
window->buffer_rect = client_rect; window->buffer_rect = client_rect;
@ -1830,8 +1834,8 @@ meta_window_x11_are_updates_frozen (MetaWindow *window)
MetaWindowX11 *window_x11 = META_WINDOW_X11 (window); MetaWindowX11 *window_x11 = META_WINDOW_X11 (window);
MetaWindowX11Private *priv = meta_window_x11_get_instance_private (window_x11); MetaWindowX11Private *priv = meta_window_x11_get_instance_private (window_x11);
if (window->frame && if (priv->frame &&
meta_sync_counter_is_waiting (meta_frame_get_sync_counter (window->frame))) meta_sync_counter_is_waiting (meta_frame_get_sync_counter (priv->frame)))
return TRUE; return TRUE;
return meta_sync_counter_is_waiting (&priv->sync_counter); return meta_sync_counter_is_waiting (&priv->sync_counter);
@ -2038,8 +2042,11 @@ meta_window_x11_set_transient_for (MetaWindow *window,
gboolean gboolean
meta_window_x11_is_ssd (MetaWindow *window) meta_window_x11_is_ssd (MetaWindow *window)
{ {
/* Will be updated in the next commits once frame field is moved to WindowX11 */ MetaWindowX11 *window_x11 = META_WINDOW_X11 (window);
return window->frame != NULL; MetaWindowX11Private *priv =
meta_window_x11_get_instance_private (window_x11);
return priv->frame != NULL;
} }
static void static void
@ -2080,6 +2087,7 @@ meta_window_x11_constructed (GObject *object)
priv->user_time_window = None; priv->user_time_window = None;
priv->frame = NULL;
window->decorated = TRUE; window->decorated = TRUE;
window->hidden = FALSE; window->hidden = FALSE;
priv->border_width = attrs.border_width; priv->border_width = attrs.border_width;
@ -2290,10 +2298,10 @@ meta_window_x11_set_net_wm_state (MetaWindow *window)
XA_ATOM, XA_ATOM,
32, PropModeReplace, (guchar*) data, i); 32, PropModeReplace, (guchar*) data, i);
if (window->frame) if (priv->frame)
{ {
XChangeProperty (x11_display->xdisplay, XChangeProperty (x11_display->xdisplay,
window->frame->xwindow, priv->frame->xwindow,
x11_display->atom__NET_WM_STATE, x11_display->atom__NET_WM_STATE,
XA_ATOM, XA_ATOM,
32, PropModeReplace, (guchar*) data, i); 32, PropModeReplace, (guchar*) data, i);
@ -2417,7 +2425,7 @@ meta_window_x11_update_input_region (MetaWindow *window)
meta_window_set_input_region (window, NULL); meta_window_set_input_region (window, NULL);
return; return;
} }
xwindow = window->frame->xwindow; xwindow = priv->frame->xwindow;
bounding_rect.width = window->buffer_rect.width; bounding_rect.width = window->buffer_rect.width;
bounding_rect.height = window->buffer_rect.height; bounding_rect.height = window->buffer_rect.height;
} }
@ -2617,6 +2625,8 @@ meta_window_x11_get_gravity_position (MetaWindow *window,
int *root_x, int *root_x,
int *root_y) int *root_y)
{ {
MetaWindowX11Private *priv =
meta_window_x11_get_private (META_WINDOW_X11 (window));
MtkRectangle frame_extents; MtkRectangle frame_extents;
int w, h; int w, h;
int x, y; int x, y;
@ -2627,18 +2637,18 @@ meta_window_x11_get_gravity_position (MetaWindow *window,
if (gravity == META_GRAVITY_STATIC) if (gravity == META_GRAVITY_STATIC)
{ {
frame_extents = window->rect; frame_extents = window->rect;
if (window->frame) if (priv->frame)
{ {
frame_extents.x = window->frame->rect.x + window->frame->child_x; frame_extents.x = priv->frame->rect.x + priv->frame->child_x;
frame_extents.y = window->frame->rect.y + window->frame->child_y; frame_extents.y = priv->frame->rect.y + priv->frame->child_y;
} }
} }
else else
{ {
if (window->frame == NULL) if (priv->frame == NULL)
frame_extents = window->rect; frame_extents = window->rect;
else else
frame_extents = window->frame->rect; frame_extents = priv->frame->rect;
} }
x = frame_extents.x; x = frame_extents.x;
@ -4208,7 +4218,7 @@ meta_window_x11_configure_notify (MetaWindow *window,
MetaWindowX11Private *priv = meta_window_x11_get_instance_private (window_x11); MetaWindowX11Private *priv = meta_window_x11_get_instance_private (window_x11);
g_assert (window->override_redirect); g_assert (window->override_redirect);
g_assert (window->frame == NULL); g_assert (priv->frame == NULL);
window->rect.x = event->x; window->rect.x = event->x;
window->rect.y = event->y; window->rect.y = event->y;
@ -4235,6 +4245,8 @@ meta_window_x11_configure_notify (MetaWindow *window,
void void
meta_window_x11_set_allowed_actions_hint (MetaWindow *window) meta_window_x11_set_allowed_actions_hint (MetaWindow *window)
{ {
MetaWindowX11 *window_x11 = META_WINDOW_X11 (window);
MetaWindowX11Private *priv = meta_window_x11_get_instance_private (window_x11);
MetaX11Display *x11_display = window->display->x11_display; MetaX11Display *x11_display = window->display->x11_display;
#define MAX_N_ACTIONS 12 #define MAX_N_ACTIONS 12
unsigned long data[MAX_N_ACTIONS]; unsigned long data[MAX_N_ACTIONS];
@ -4297,10 +4309,10 @@ meta_window_x11_set_allowed_actions_hint (MetaWindow *window)
XA_ATOM, XA_ATOM,
32, PropModeReplace, (guchar*) data, i); 32, PropModeReplace, (guchar*) data, i);
if (window->frame) if (priv->frame)
{ {
XChangeProperty (x11_display->xdisplay, XChangeProperty (x11_display->xdisplay,
window->frame->xwindow, priv->frame->xwindow,
x11_display->atom__NET_WM_ALLOWED_ACTIONS, x11_display->atom__NET_WM_ALLOWED_ACTIONS,
XA_ATOM, XA_ATOM,
32, PropModeReplace, (guchar*) data, i); 32, PropModeReplace, (guchar*) data, i);
@ -4316,8 +4328,8 @@ meta_window_x11_create_sync_request_alarm (MetaWindow *window)
MetaWindowX11 *window_x11 = META_WINDOW_X11 (window); MetaWindowX11 *window_x11 = META_WINDOW_X11 (window);
MetaWindowX11Private *priv = meta_window_x11_get_instance_private (window_x11); MetaWindowX11Private *priv = meta_window_x11_get_instance_private (window_x11);
if (window->frame) if (priv->frame)
meta_sync_counter_create_sync_alarm (meta_frame_get_sync_counter (window->frame)); meta_sync_counter_create_sync_alarm (meta_frame_get_sync_counter (priv->frame));
meta_sync_counter_create_sync_alarm (&priv->sync_counter); meta_sync_counter_create_sync_alarm (&priv->sync_counter);
} }
@ -4328,8 +4340,8 @@ meta_window_x11_destroy_sync_request_alarm (MetaWindow *window)
MetaWindowX11 *window_x11 = META_WINDOW_X11 (window); MetaWindowX11 *window_x11 = META_WINDOW_X11 (window);
MetaWindowX11Private *priv = meta_window_x11_get_instance_private (window_x11); MetaWindowX11Private *priv = meta_window_x11_get_instance_private (window_x11);
if (window->frame) if (priv->frame)
meta_sync_counter_destroy_sync_alarm (meta_frame_get_sync_counter (window->frame)); meta_sync_counter_destroy_sync_alarm (meta_frame_get_sync_counter (priv->frame));
meta_sync_counter_destroy_sync_alarm (&priv->sync_counter); meta_sync_counter_destroy_sync_alarm (&priv->sync_counter);
} }
@ -4337,7 +4349,10 @@ meta_window_x11_destroy_sync_request_alarm (MetaWindow *window)
Window Window
meta_window_x11_get_toplevel_xwindow (MetaWindow *window) meta_window_x11_get_toplevel_xwindow (MetaWindow *window)
{ {
return window->frame ? window->frame->xwindow : meta_window_x11_get_xwindow (window); MetaWindowX11 *window_x11 = META_WINDOW_X11 (window);
MetaWindowX11Private *priv = meta_window_x11_get_instance_private (window_x11);
return priv->frame ? priv->frame->xwindow : meta_window_x11_get_xwindow (window);
} }
void void
@ -4387,11 +4402,13 @@ meta_window_x11_surface_rect_to_frame_rect (MetaWindow *window,
MtkRectangle *frame_rect) MtkRectangle *frame_rect)
{ {
MetaWindowX11 *window_x11 = META_WINDOW_X11 (window);
MetaWindowX11Private *priv = meta_window_x11_get_instance_private (window_x11);
MetaFrameBorders borders; MetaFrameBorders borders;
g_return_if_fail (window->frame); g_return_if_fail (priv->frame);
meta_frame_calc_borders (window->frame, &borders); meta_frame_calc_borders (priv->frame, &borders);
*frame_rect = *surface_rect; *frame_rect = *surface_rect;
frame_rect->x += borders.invisible.left; frame_rect->x += borders.invisible.left;
@ -4405,9 +4422,11 @@ meta_window_x11_surface_rect_to_client_rect (MetaWindow *window,
MtkRectangle *surface_rect, MtkRectangle *surface_rect,
MtkRectangle *client_rect) MtkRectangle *client_rect)
{ {
MetaWindowX11 *window_x11 = META_WINDOW_X11 (window);
MetaWindowX11Private *priv = meta_window_x11_get_instance_private (window_x11);
MetaFrameBorders borders; MetaFrameBorders borders;
meta_frame_calc_borders (window->frame, &borders); meta_frame_calc_borders (priv->frame, &borders);
*client_rect = *surface_rect; *client_rect = *surface_rect;
client_rect->x += borders.total.left; client_rect->x += borders.total.left;
@ -4483,14 +4502,36 @@ meta_window_x11_get_sync_counter (MetaWindow *window)
return &priv->sync_counter; return &priv->sync_counter;
} }
MetaFrame*
meta_window_x11_get_frame (MetaWindow *window)
{
MetaWindowX11 *window_x11 = META_WINDOW_X11 (window);
MetaWindowX11Private *priv = meta_window_x11_get_instance_private (window_x11);
return priv->frame;
}
gboolean
meta_window_x11_get_frame_borders (MetaWindow *window,
MetaFrameBorders *borders)
{
MetaFrame *frame = meta_window_x11_get_frame (window);
if (!frame)
return FALSE;
meta_frame_calc_borders (frame, borders);
return TRUE;
}
gboolean gboolean
meta_window_x11_is_awaiting_sync_response (MetaWindow *window) meta_window_x11_is_awaiting_sync_response (MetaWindow *window)
{ {
MetaWindowX11 *window_x11 = META_WINDOW_X11 (window); MetaWindowX11 *window_x11 = META_WINDOW_X11 (window);
MetaWindowX11Private *priv = meta_window_x11_get_instance_private (window_x11); MetaWindowX11Private *priv = meta_window_x11_get_instance_private (window_x11);
if (window->frame && if (priv->frame &&
meta_sync_counter_is_waiting_response (meta_frame_get_sync_counter (window->frame))) meta_sync_counter_is_waiting_response (meta_frame_get_sync_counter (priv->frame)))
return TRUE; return TRUE;
return meta_sync_counter_is_waiting_response (&priv->sync_counter); return meta_sync_counter_is_waiting_response (&priv->sync_counter);
@ -4503,8 +4544,8 @@ meta_window_x11_check_update_resize (MetaWindow *window)
MetaWindowX11Private *priv = meta_window_x11_get_instance_private (window_x11); MetaWindowX11Private *priv = meta_window_x11_get_instance_private (window_x11);
MetaWindowDrag *window_drag; MetaWindowDrag *window_drag;
if (window->frame && if (priv->frame &&
meta_sync_counter_is_waiting (meta_frame_get_sync_counter (window->frame))) meta_sync_counter_is_waiting (meta_frame_get_sync_counter (priv->frame)))
return; return;
if (meta_sync_counter_is_waiting (&priv->sync_counter)) if (meta_sync_counter_is_waiting (&priv->sync_counter))

View File

@ -100,6 +100,9 @@ void meta_window_x11_surface_rect_to_client_rect (MetaWindow *window,
MtkRectangle meta_window_x11_get_client_rect (MetaWindowX11 *window_x11); MtkRectangle meta_window_x11_get_client_rect (MetaWindowX11 *window_x11);
META_EXPORT_TEST
MetaFrame * meta_window_x11_get_frame (MetaWindow *window);
gboolean meta_window_x11_can_unredirect (MetaWindowX11 *window_x11); gboolean meta_window_x11_can_unredirect (MetaWindowX11 *window_x11);
MetaSyncCounter * meta_window_x11_get_sync_counter (MetaWindow *window); MetaSyncCounter * meta_window_x11_get_sync_counter (MetaWindow *window);