Compare commits
10 Commits
wip/carlos
...
wip/ssd-bl
Author | SHA1 | Date | |
---|---|---|---|
![]() |
8904c55a86 | ||
![]() |
7f4f5f5c4c | ||
![]() |
0d1cee5123 | ||
![]() |
24b9f2fabc | ||
![]() |
fbf7e0073e | ||
![]() |
db1adab828 | ||
![]() |
8369fde7f8 | ||
![]() |
80562bbb10 | ||
![]() |
c21d12c4ac | ||
![]() |
3488015d17 |
@@ -684,6 +684,9 @@ meta_compositor_sync_updates_frozen (MetaCompositor *compositor,
|
|||||||
MetaWindow *window)
|
MetaWindow *window)
|
||||||
{
|
{
|
||||||
MetaWindowActor *window_actor = META_WINDOW_ACTOR (meta_window_get_compositor_private (window));
|
MetaWindowActor *window_actor = META_WINDOW_ACTOR (meta_window_get_compositor_private (window));
|
||||||
|
if (!window_actor)
|
||||||
|
return;
|
||||||
|
|
||||||
meta_window_actor_sync_updates_frozen (window_actor);
|
meta_window_actor_sync_updates_frozen (window_actor);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -99,6 +99,20 @@ meta_surface_actor_wayland_add_frame_callbacks (MetaSurfaceActorWayland *self,
|
|||||||
wl_list_insert_list (&priv->frame_callback_list, frame_callbacks);
|
wl_list_insert_list (&priv->frame_callback_list, frame_callbacks);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
meta_surface_actor_wayland_set_frozen (MetaSurfaceActor *actor,
|
||||||
|
gboolean is_frozen)
|
||||||
|
{
|
||||||
|
MetaSurfaceActorWayland *self = META_SURFACE_ACTOR_WAYLAND (actor);
|
||||||
|
MetaWaylandSurface *surface = meta_surface_actor_wayland_get_surface (self);
|
||||||
|
|
||||||
|
META_SURFACE_ACTOR_CLASS (meta_surface_actor_wayland_parent_class)->set_frozen (actor,
|
||||||
|
is_frozen);
|
||||||
|
|
||||||
|
if (surface)
|
||||||
|
meta_wayland_surface_set_frozen (surface, is_frozen);
|
||||||
|
}
|
||||||
|
|
||||||
static MetaWindow *
|
static MetaWindow *
|
||||||
meta_surface_actor_wayland_get_window (MetaSurfaceActor *actor)
|
meta_surface_actor_wayland_get_window (MetaSurfaceActor *actor)
|
||||||
{
|
{
|
||||||
@@ -111,6 +125,17 @@ meta_surface_actor_wayland_get_window (MetaSurfaceActor *actor)
|
|||||||
return surface->window;
|
return surface->window;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
meta_surface_actor_wayland_size_changed (MetaSurfaceActor *actor)
|
||||||
|
{
|
||||||
|
MetaWindow *window;
|
||||||
|
|
||||||
|
window = meta_surface_actor_wayland_get_window (actor);
|
||||||
|
|
||||||
|
if (window)
|
||||||
|
meta_window_set_resize_pending (window, FALSE);
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
meta_surface_actor_wayland_get_preferred_width (ClutterActor *actor,
|
meta_surface_actor_wayland_get_preferred_width (ClutterActor *actor,
|
||||||
gfloat for_height,
|
gfloat for_height,
|
||||||
@@ -220,8 +245,11 @@ meta_surface_actor_wayland_class_init (MetaSurfaceActorWaylandClass *klass)
|
|||||||
surface_actor_class->set_unredirected = meta_surface_actor_wayland_set_unredirected;
|
surface_actor_class->set_unredirected = meta_surface_actor_wayland_set_unredirected;
|
||||||
surface_actor_class->is_unredirected = meta_surface_actor_wayland_is_unredirected;
|
surface_actor_class->is_unredirected = meta_surface_actor_wayland_is_unredirected;
|
||||||
|
|
||||||
|
surface_actor_class->set_frozen = meta_surface_actor_wayland_set_frozen;
|
||||||
surface_actor_class->get_window = meta_surface_actor_wayland_get_window;
|
surface_actor_class->get_window = meta_surface_actor_wayland_get_window;
|
||||||
|
|
||||||
|
surface_actor_class->size_changed = meta_surface_actor_wayland_size_changed;
|
||||||
|
|
||||||
object_class->dispose = meta_surface_actor_wayland_dispose;
|
object_class->dispose = meta_surface_actor_wayland_dispose;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -31,6 +31,9 @@ struct _MetaSurfaceActorPrivate
|
|||||||
|
|
||||||
static void cullable_iface_init (MetaCullableInterface *iface);
|
static void cullable_iface_init (MetaCullableInterface *iface);
|
||||||
|
|
||||||
|
void meta_surface_actor_real_set_frozen (MetaSurfaceActor *self,
|
||||||
|
gboolean frozen);
|
||||||
|
|
||||||
G_DEFINE_ABSTRACT_TYPE_WITH_CODE (MetaSurfaceActor, meta_surface_actor, CLUTTER_TYPE_ACTOR,
|
G_DEFINE_ABSTRACT_TYPE_WITH_CODE (MetaSurfaceActor, meta_surface_actor, CLUTTER_TYPE_ACTOR,
|
||||||
G_IMPLEMENT_INTERFACE (META_TYPE_CULLABLE, cullable_iface_init));
|
G_IMPLEMENT_INTERFACE (META_TYPE_CULLABLE, cullable_iface_init));
|
||||||
|
|
||||||
@@ -121,6 +124,8 @@ meta_surface_actor_class_init (MetaSurfaceActorClass *klass)
|
|||||||
object_class->dispose = meta_surface_actor_dispose;
|
object_class->dispose = meta_surface_actor_dispose;
|
||||||
actor_class->pick = meta_surface_actor_pick;
|
actor_class->pick = meta_surface_actor_pick;
|
||||||
|
|
||||||
|
klass->set_frozen = meta_surface_actor_real_set_frozen;
|
||||||
|
|
||||||
signals[REPAINT_SCHEDULED] = g_signal_new ("repaint-scheduled",
|
signals[REPAINT_SCHEDULED] = g_signal_new ("repaint-scheduled",
|
||||||
G_TYPE_FROM_CLASS (object_class),
|
G_TYPE_FROM_CLASS (object_class),
|
||||||
G_SIGNAL_RUN_LAST,
|
G_SIGNAL_RUN_LAST,
|
||||||
@@ -130,8 +135,8 @@ meta_surface_actor_class_init (MetaSurfaceActorClass *klass)
|
|||||||
|
|
||||||
signals[SIZE_CHANGED] = g_signal_new ("size-changed",
|
signals[SIZE_CHANGED] = g_signal_new ("size-changed",
|
||||||
G_TYPE_FROM_CLASS (object_class),
|
G_TYPE_FROM_CLASS (object_class),
|
||||||
G_SIGNAL_RUN_LAST,
|
G_SIGNAL_RUN_FIRST,
|
||||||
0,
|
G_STRUCT_OFFSET (MetaSurfaceActorClass, size_changed),
|
||||||
NULL, NULL, NULL,
|
NULL, NULL, NULL,
|
||||||
G_TYPE_NONE, 0);
|
G_TYPE_NONE, 0);
|
||||||
|
|
||||||
@@ -331,6 +336,13 @@ meta_surface_actor_is_visible (MetaSurfaceActor *self)
|
|||||||
void
|
void
|
||||||
meta_surface_actor_set_frozen (MetaSurfaceActor *self,
|
meta_surface_actor_set_frozen (MetaSurfaceActor *self,
|
||||||
gboolean frozen)
|
gboolean frozen)
|
||||||
|
{
|
||||||
|
return META_SURFACE_ACTOR_GET_CLASS (self)->set_frozen (self, frozen);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
meta_surface_actor_real_set_frozen (MetaSurfaceActor *self,
|
||||||
|
gboolean frozen)
|
||||||
{
|
{
|
||||||
MetaSurfaceActorPrivate *priv = self->priv;
|
MetaSurfaceActorPrivate *priv = self->priv;
|
||||||
|
|
||||||
|
@@ -36,7 +36,12 @@ struct _MetaSurfaceActorClass
|
|||||||
gboolean unredirected);
|
gboolean unredirected);
|
||||||
gboolean (* is_unredirected) (MetaSurfaceActor *actor);
|
gboolean (* is_unredirected) (MetaSurfaceActor *actor);
|
||||||
|
|
||||||
|
void (* set_frozen) (MetaSurfaceActor *actor,
|
||||||
|
gboolean is_frozen);
|
||||||
|
|
||||||
MetaWindow *(* get_window) (MetaSurfaceActor *actor);
|
MetaWindow *(* get_window) (MetaSurfaceActor *actor);
|
||||||
|
|
||||||
|
void (* size_changed) (MetaSurfaceActor *actor);
|
||||||
};
|
};
|
||||||
|
|
||||||
struct _MetaSurfaceActor
|
struct _MetaSurfaceActor
|
||||||
|
@@ -53,6 +53,8 @@ struct _MetaWindowActorPrivate
|
|||||||
MetaWindow *window;
|
MetaWindow *window;
|
||||||
MetaCompositor *compositor;
|
MetaCompositor *compositor;
|
||||||
|
|
||||||
|
MetaCompEffect pending_effect;
|
||||||
|
|
||||||
MetaSurfaceActor *surface;
|
MetaSurfaceActor *surface;
|
||||||
|
|
||||||
/* MetaShadowFactory only caches shadows that are actually in use;
|
/* MetaShadowFactory only caches shadows that are actually in use;
|
||||||
@@ -117,6 +119,7 @@ struct _MetaWindowActorPrivate
|
|||||||
|
|
||||||
guint updates_frozen : 1;
|
guint updates_frozen : 1;
|
||||||
guint first_frame_state : 2; /* FirstFrameState */
|
guint first_frame_state : 2; /* FirstFrameState */
|
||||||
|
guint has_pending_effect : 1;
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef struct _FrameData FrameData;
|
typedef struct _FrameData FrameData;
|
||||||
@@ -296,6 +299,7 @@ surface_size_changed (MetaSurfaceActor *actor,
|
|||||||
MetaWindowActor *self = META_WINDOW_ACTOR (user_data);
|
MetaWindowActor *self = META_WINDOW_ACTOR (user_data);
|
||||||
|
|
||||||
meta_window_actor_update_shape (self);
|
meta_window_actor_update_shape (self);
|
||||||
|
meta_window_actor_handle_updates (self);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@@ -345,8 +349,11 @@ meta_window_actor_freeze (MetaWindowActor *self)
|
|||||||
{
|
{
|
||||||
MetaWindowActorPrivate *priv = self->priv;
|
MetaWindowActorPrivate *priv = self->priv;
|
||||||
|
|
||||||
if (priv->freeze_count == 0 && priv->surface)
|
if (priv->freeze_count == 0)
|
||||||
meta_surface_actor_set_frozen (priv->surface, TRUE);
|
{
|
||||||
|
if (priv->surface)
|
||||||
|
meta_surface_actor_set_frozen (priv->surface, TRUE);
|
||||||
|
}
|
||||||
|
|
||||||
priv->freeze_count ++;
|
priv->freeze_count ++;
|
||||||
}
|
}
|
||||||
@@ -359,6 +366,12 @@ meta_window_actor_sync_thawed_state (MetaWindowActor *self)
|
|||||||
if (priv->first_frame_state == INITIALLY_FROZEN)
|
if (priv->first_frame_state == INITIALLY_FROZEN)
|
||||||
priv->first_frame_state = DRAWING_FIRST_FRAME;
|
priv->first_frame_state = DRAWING_FIRST_FRAME;
|
||||||
|
|
||||||
|
if (priv->has_pending_effect)
|
||||||
|
{
|
||||||
|
meta_window_actor_show (self, priv->pending_effect);
|
||||||
|
priv->has_pending_effect = FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
if (priv->surface)
|
if (priv->surface)
|
||||||
meta_surface_actor_set_frozen (priv->surface, FALSE);
|
meta_surface_actor_set_frozen (priv->surface, FALSE);
|
||||||
|
|
||||||
@@ -1317,6 +1330,13 @@ meta_window_actor_show (MetaWindowActor *self,
|
|||||||
|
|
||||||
g_return_if_fail (!priv->visible);
|
g_return_if_fail (!priv->visible);
|
||||||
|
|
||||||
|
if (is_frozen (self))
|
||||||
|
{
|
||||||
|
priv->pending_effect = effect;
|
||||||
|
priv->has_pending_effect = TRUE;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
self->priv->visible = TRUE;
|
self->priv->visible = TRUE;
|
||||||
|
|
||||||
switch (effect)
|
switch (effect)
|
||||||
@@ -1918,10 +1938,11 @@ meta_window_actor_handle_updates (MetaWindowActor *self)
|
|||||||
{
|
{
|
||||||
MetaWindowActorPrivate *priv = self->priv;
|
MetaWindowActorPrivate *priv = self->priv;
|
||||||
|
|
||||||
if (is_frozen (self))
|
if (is_frozen (self) || meta_window_resize_is_pending (priv->window))
|
||||||
{
|
{
|
||||||
/* The window is frozen due to a pending animation: we'll wait until
|
/* If the window is frozen due to a pending animation or a resize is
|
||||||
* the animation finishes to reshape and repair the window */
|
* pending then we'll wait until the animation or resize finishes to
|
||||||
|
* reshape and repair the window */
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -407,6 +407,12 @@ struct _MetaWindow
|
|||||||
/* whether or not the window is from a program running on another machine */
|
/* whether or not the window is from a program running on another machine */
|
||||||
guint is_remote : 1;
|
guint is_remote : 1;
|
||||||
|
|
||||||
|
/* if TRUE, the X server hasn't yet committed a new buffer following resize of the frame/client window */
|
||||||
|
guint resize_pending : 1;
|
||||||
|
|
||||||
|
/* if TRUE, the window frame has a redraw queued */
|
||||||
|
guint frame_redraw_pending : 1;
|
||||||
|
|
||||||
/* if non-NULL, the bounds of the window frame */
|
/* if non-NULL, the bounds of the window frame */
|
||||||
cairo_region_t *frame_bounds;
|
cairo_region_t *frame_bounds;
|
||||||
|
|
||||||
@@ -781,6 +787,12 @@ void meta_window_move_resize_internal (MetaWindow *window,
|
|||||||
MetaMoveResizeFlags flags,
|
MetaMoveResizeFlags flags,
|
||||||
int gravity,
|
int gravity,
|
||||||
MetaRectangle frame_rect);
|
MetaRectangle frame_rect);
|
||||||
|
void meta_window_set_resize_pending (MetaWindow *window,
|
||||||
|
gboolean is_resize_pending);
|
||||||
|
gboolean meta_window_resize_is_pending (MetaWindow *window);
|
||||||
|
|
||||||
|
void meta_window_set_frame_redraw_pending (MetaWindow *window,
|
||||||
|
gboolean is_frame_redraw_pending);
|
||||||
|
|
||||||
void meta_window_grab_op_began (MetaWindow *window, MetaGrabOp op);
|
void meta_window_grab_op_began (MetaWindow *window, MetaGrabOp op);
|
||||||
void meta_window_grab_op_ended (MetaWindow *window, MetaGrabOp op);
|
void meta_window_grab_op_ended (MetaWindow *window, MetaGrabOp op);
|
||||||
|
@@ -3730,6 +3730,9 @@ meta_window_updates_are_frozen (MetaWindow *window)
|
|||||||
if (window->sync_request_serial < window->sync_request_wait_serial)
|
if (window->sync_request_serial < window->sync_request_wait_serial)
|
||||||
return TRUE;
|
return TRUE;
|
||||||
|
|
||||||
|
if (window->frame_redraw_pending)
|
||||||
|
return TRUE;
|
||||||
|
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -6311,6 +6314,28 @@ meta_window_update_resize (MetaWindow *window,
|
|||||||
update_resize (window, snap, x, y, force);
|
update_resize (window, snap, x, y, force);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
meta_window_set_resize_pending (MetaWindow *window,
|
||||||
|
gboolean is_resize_pending)
|
||||||
|
{
|
||||||
|
window->resize_pending = is_resize_pending;
|
||||||
|
}
|
||||||
|
|
||||||
|
gboolean
|
||||||
|
meta_window_resize_is_pending (MetaWindow *window)
|
||||||
|
{
|
||||||
|
return window->resize_pending;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
meta_window_set_frame_redraw_pending (MetaWindow *window,
|
||||||
|
gboolean is_frame_redraw_pending)
|
||||||
|
{
|
||||||
|
window->frame_redraw_pending = is_frame_redraw_pending;
|
||||||
|
|
||||||
|
meta_compositor_sync_updates_frozen (window->display->compositor, window);
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
end_grab_op (MetaWindow *window,
|
end_grab_op (MetaWindow *window,
|
||||||
const ClutterEvent *event)
|
const ClutterEvent *event)
|
||||||
|
@@ -149,6 +149,7 @@ static void
|
|||||||
invalidate_whole_window (MetaUIFrame *frame)
|
invalidate_whole_window (MetaUIFrame *frame)
|
||||||
{
|
{
|
||||||
gdk_window_invalidate_rect (frame->window, NULL, FALSE);
|
gdk_window_invalidate_rect (frame->window, NULL, FALSE);
|
||||||
|
meta_window_set_frame_redraw_pending (frame->meta_window, TRUE);
|
||||||
}
|
}
|
||||||
|
|
||||||
static MetaStyleInfo *
|
static MetaStyleInfo *
|
||||||
@@ -484,6 +485,27 @@ meta_ui_frame_attach_style (MetaUIFrame *frame)
|
|||||||
variant));
|
variant));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
after_paint (GdkFrameClock *frame_clock,
|
||||||
|
MetaUIFrame *frame)
|
||||||
|
{
|
||||||
|
MetaFrames *frames = frame->frames;
|
||||||
|
MetaWindow *window = frame->meta_window;
|
||||||
|
|
||||||
|
/* Make sure the damage is posted to the X server before
|
||||||
|
* we mark the frame redraw finished and unfreeze, so there's
|
||||||
|
* a wayland surface commit waiting for us at unfreeze time
|
||||||
|
*/
|
||||||
|
if (meta_is_wayland_compositor ())
|
||||||
|
gdk_display_sync (gtk_widget_get_display (GTK_WIDGET (frames)));
|
||||||
|
|
||||||
|
meta_window_set_frame_redraw_pending (window, FALSE);
|
||||||
|
|
||||||
|
g_signal_handlers_disconnect_by_func (G_OBJECT (gdk_window_get_frame_clock (frame->window)),
|
||||||
|
G_CALLBACK (after_paint),
|
||||||
|
frame);
|
||||||
|
}
|
||||||
|
|
||||||
MetaUIFrame *
|
MetaUIFrame *
|
||||||
meta_frames_manage_window (MetaFrames *frames,
|
meta_frames_manage_window (MetaFrames *frames,
|
||||||
MetaWindow *meta_window,
|
MetaWindow *meta_window,
|
||||||
@@ -531,6 +553,10 @@ meta_ui_frame_unmanage (MetaUIFrame *frame)
|
|||||||
frame->xwindow,
|
frame->xwindow,
|
||||||
META_CURSOR_DEFAULT);
|
META_CURSOR_DEFAULT);
|
||||||
|
|
||||||
|
g_signal_handlers_disconnect_by_func (G_OBJECT (gdk_window_get_frame_clock (frame->window)),
|
||||||
|
G_CALLBACK (after_paint),
|
||||||
|
frame);
|
||||||
|
|
||||||
gdk_window_set_user_data (frame->window, NULL);
|
gdk_window_set_user_data (frame->window, NULL);
|
||||||
|
|
||||||
g_hash_table_remove (frames->frames, &frame->xwindow);
|
g_hash_table_remove (frames->frames, &frame->xwindow);
|
||||||
@@ -1396,6 +1422,11 @@ meta_frames_draw (GtkWidget *widget,
|
|||||||
meta_ui_frame_paint (frame, cr);
|
meta_ui_frame_paint (frame, cr);
|
||||||
cairo_region_destroy (region);
|
cairo_region_destroy (region);
|
||||||
|
|
||||||
|
g_signal_connect (G_OBJECT (gdk_window_get_frame_clock (frame->window)),
|
||||||
|
"after-paint",
|
||||||
|
G_CALLBACK (after_paint),
|
||||||
|
frame);
|
||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -703,6 +703,9 @@ cleanup:
|
|||||||
static void
|
static void
|
||||||
meta_wayland_surface_commit (MetaWaylandSurface *surface)
|
meta_wayland_surface_commit (MetaWaylandSurface *surface)
|
||||||
{
|
{
|
||||||
|
if (surface->is_frozen)
|
||||||
|
return;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* If this is a sub-surface and it is in effective synchronous mode, only
|
* If this is a sub-surface and it is in effective synchronous mode, only
|
||||||
* cache the pending surface state until either one of the following two
|
* cache the pending surface state until either one of the following two
|
||||||
@@ -1099,6 +1102,7 @@ meta_wayland_surface_set_window (MetaWaylandSurface *surface,
|
|||||||
"position-changed",
|
"position-changed",
|
||||||
G_CALLBACK (window_position_changed),
|
G_CALLBACK (window_position_changed),
|
||||||
surface, 0);
|
surface, 0);
|
||||||
|
meta_window_set_resize_pending (window, FALSE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1719,3 +1723,16 @@ meta_wayland_surface_is_shortcuts_inhibited (MetaWaylandSurface *surface,
|
|||||||
|
|
||||||
return g_hash_table_contains (surface->shortcut_inhibited_seats, seat);
|
return g_hash_table_contains (surface->shortcut_inhibited_seats, seat);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
meta_wayland_surface_set_frozen (MetaWaylandSurface *surface,
|
||||||
|
gboolean is_frozen)
|
||||||
|
{
|
||||||
|
if (surface->is_frozen == is_frozen)
|
||||||
|
return;
|
||||||
|
|
||||||
|
surface->is_frozen = is_frozen;
|
||||||
|
|
||||||
|
if (!surface->is_frozen && surface->pending)
|
||||||
|
meta_wayland_surface_commit (surface);
|
||||||
|
}
|
||||||
|
@@ -203,6 +203,8 @@ struct _MetaWaylandSurface
|
|||||||
|
|
||||||
/* table of seats for which shortcuts are inhibited */
|
/* table of seats for which shortcuts are inhibited */
|
||||||
GHashTable *shortcut_inhibited_seats;
|
GHashTable *shortcut_inhibited_seats;
|
||||||
|
|
||||||
|
guint32 is_frozen : 1;
|
||||||
};
|
};
|
||||||
|
|
||||||
void meta_wayland_shell_init (MetaWaylandCompositor *compositor);
|
void meta_wayland_shell_init (MetaWaylandCompositor *compositor);
|
||||||
@@ -302,5 +304,7 @@ void meta_wayland_surface_restore_shortcuts (MetaWaylandSurface *
|
|||||||
|
|
||||||
gboolean meta_wayland_surface_is_shortcuts_inhibited (MetaWaylandSurface *surface,
|
gboolean meta_wayland_surface_is_shortcuts_inhibited (MetaWaylandSurface *surface,
|
||||||
MetaWaylandSeat *seat);
|
MetaWaylandSeat *seat);
|
||||||
|
void meta_wayland_surface_set_frozen (MetaWaylandSurface *surface,
|
||||||
|
gboolean is_frozen);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@@ -71,6 +71,20 @@ meta_window_xwayland_shortcuts_inhibited (MetaWindow *window,
|
|||||||
return meta_wayland_compositor_is_shortcuts_inhibited (compositor, source);
|
return meta_wayland_compositor_is_shortcuts_inhibited (compositor, source);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
meta_window_xwayland_move_resize_internal (MetaWindow *window,
|
||||||
|
int gravity,
|
||||||
|
MetaRectangle unconstrained_rect,
|
||||||
|
MetaRectangle constrained_rect,
|
||||||
|
MetaMoveResizeFlags flags,
|
||||||
|
MetaMoveResizeResultFlags *result)
|
||||||
|
{
|
||||||
|
META_WINDOW_CLASS (meta_window_xwayland_parent_class)->move_resize_internal (window, gravity, unconstrained_rect, constrained_rect, flags, result);
|
||||||
|
|
||||||
|
if (*result & META_MOVE_RESIZE_RESULT_RESIZED)
|
||||||
|
meta_window_set_resize_pending (window, TRUE);
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
meta_window_xwayland_get_property (GObject *object,
|
meta_window_xwayland_get_property (GObject *object,
|
||||||
guint prop_id,
|
guint prop_id,
|
||||||
@@ -117,6 +131,7 @@ meta_window_xwayland_class_init (MetaWindowXwaylandClass *klass)
|
|||||||
|
|
||||||
window_class->force_restore_shortcuts = meta_window_xwayland_force_restore_shortcuts;
|
window_class->force_restore_shortcuts = meta_window_xwayland_force_restore_shortcuts;
|
||||||
window_class->shortcuts_inhibited = meta_window_xwayland_shortcuts_inhibited;
|
window_class->shortcuts_inhibited = meta_window_xwayland_shortcuts_inhibited;
|
||||||
|
window_class->move_resize_internal = meta_window_xwayland_move_resize_internal;
|
||||||
|
|
||||||
gobject_class->get_property = meta_window_xwayland_get_property;
|
gobject_class->get_property = meta_window_xwayland_get_property;
|
||||||
gobject_class->set_property = meta_window_xwayland_set_property;
|
gobject_class->set_property = meta_window_xwayland_set_property;
|
||||||
|
@@ -1244,8 +1244,9 @@ meta_window_x11_move_resize_internal (MetaWindow *window,
|
|||||||
{
|
{
|
||||||
meta_error_trap_push (window->display);
|
meta_error_trap_push (window->display);
|
||||||
|
|
||||||
if (window == window->display->grab_window &&
|
if ((window->constructing ||
|
||||||
meta_grab_op_is_resizing (window->display->grab_op) &&
|
(window == window->display->grab_window &&
|
||||||
|
meta_grab_op_is_resizing (window->display->grab_op))) &&
|
||||||
!window->disable_sync &&
|
!window->disable_sync &&
|
||||||
window->sync_request_counter != None &&
|
window->sync_request_counter != None &&
|
||||||
window->sync_request_alarm != None &&
|
window->sync_request_alarm != None &&
|
||||||
@@ -3496,27 +3497,32 @@ meta_window_x11_update_sync_request_counter (MetaWindow *window,
|
|||||||
window->sync_request_serial = new_counter_value;
|
window->sync_request_serial = new_counter_value;
|
||||||
meta_compositor_sync_updates_frozen (window->display->compositor, window);
|
meta_compositor_sync_updates_frozen (window->display->compositor, window);
|
||||||
|
|
||||||
if (window == window->display->grab_window &&
|
if (new_counter_value >= window->sync_request_wait_serial && window->sync_request_timeout_id)
|
||||||
meta_grab_op_is_resizing (window->display->grab_op) &&
|
|
||||||
new_counter_value >= window->sync_request_wait_serial &&
|
|
||||||
(!window->extended_sync_request_counter || new_counter_value % 2 == 0) &&
|
|
||||||
window->sync_request_timeout_id)
|
|
||||||
{
|
{
|
||||||
meta_topic (META_DEBUG_RESIZING,
|
if (!window->extended_sync_request_counter || new_counter_value % 2 == 0)
|
||||||
"Alarm event received last motion x = %d y = %d\n",
|
{
|
||||||
window->display->grab_latest_motion_x,
|
g_source_remove (window->sync_request_timeout_id);
|
||||||
window->display->grab_latest_motion_y);
|
window->sync_request_timeout_id = 0;
|
||||||
|
}
|
||||||
|
|
||||||
g_source_remove (window->sync_request_timeout_id);
|
if (window == window->display->grab_window &&
|
||||||
window->sync_request_timeout_id = 0;
|
meta_grab_op_is_resizing (window->display->grab_op) &&
|
||||||
|
!meta_window_resize_is_pending (window) &&
|
||||||
|
(!window->extended_sync_request_counter || new_counter_value % 2 == 0))
|
||||||
|
{
|
||||||
|
meta_topic (META_DEBUG_RESIZING,
|
||||||
|
"Alarm event received last motion x = %d y = %d\n",
|
||||||
|
window->display->grab_latest_motion_x,
|
||||||
|
window->display->grab_latest_motion_y);
|
||||||
|
|
||||||
/* This means we are ready for another configure;
|
/* This means we are ready for another configure;
|
||||||
* no pointer round trip here, to keep in sync */
|
* no pointer round trip here, to keep in sync */
|
||||||
meta_window_update_resize (window,
|
meta_window_update_resize (window,
|
||||||
window->display->grab_last_user_action_was_snap,
|
window->display->grab_last_user_action_was_snap,
|
||||||
window->display->grab_latest_motion_x,
|
window->display->grab_latest_motion_x,
|
||||||
window->display->grab_latest_motion_y,
|
window->display->grab_latest_motion_y,
|
||||||
TRUE);
|
TRUE);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* If sync was previously disabled, turn it back on and hope
|
/* If sync was previously disabled, turn it back on and hope
|
||||||
|
Reference in New Issue
Block a user