[PATCH v2] xwm: Update input region on resize
Scott Moreau
oreaus at gmail.com
Fri Mar 16 23:42:45 UTC 2018
Hi Pekka,
On Fri, Mar 16, 2018 at 9:20 AM, Pekka Paalanen <ppaalanen at gmail.com> wrote:
> On Tue, 13 Mar 2018 21:22:04 -0600
> Scott Moreau <oreaus at gmail.com> wrote:
>
> > Commit 332d1892 introduced a bug because the window was
> > shaped only when the frame was created, leaving the input
> > region unchanged regardless if the window was resized.
> > This patch updates the input region shape on resize,
> > fixing the problem.
> >
> > ---
> >
> > Changed in v2:
> >
> > - Bail in shape function if (window->override_redirect || !window->frame)
> > - Call shape function from send_configure()
> >
> > xwayland/window-manager.c | 53 +++++++++++++++++++++++++++++-
> -----------------
> > 1 file changed, 33 insertions(+), 20 deletions(-)
>
> Hi,
>
> while trying to wrap my head around this, I started feeling dizzy. For
> real. So I have to keep this short.
>
I think this is what happens when trying to sync two display servers.
>
> The first decision we should make is, do we want a quick patch for an
> immediate issue at hand, or do we want to make things better in the long
> run. Taking in this patch as is seems to be the former to me, and given
> the phase of the release cycle can be justified.
>
> The following mind flow is for a long term solution, and the comments
> inlined with the code below are for the quick patch.
>
>
> Taking a step back, the aim to keep the input shape up-to-date whenever
> something happens.
>
> If we have a frame window with decorations, then we call
> frame_resize_inside() to adjust its size. Would it not be logical to
> set the input shape in at least all those cases?
>
Yes, maybe there can be a function that calls frame_resize_inside and the
shape function to replace calls to frame_resize_inside.
>
> Except it looks like we can have decorated O-R windows, and those
> should be exempt? Oh, I'm told decorated O-R windows don't make sense,
> but I see some code in weston that would only apply in such case...
> if (window->override_redirect) { ... if (window->frame)
> frame_resize_inside(...)
>
> All windows that go through map_request handler will get the frame
> window (window->frame_id) and the frame (window->frame) created. The
> only windows that don't get this treatment are therefore windows that
> are O-R at the time of mapping them. It's somewhat complicated by the
> fact that XWM does not support dynamically changing O-R flag... or
> maybe it makes it easier.
>
> Now, we have configure_request and configure_notify handlers. O-R
> windows will not hit configure_request handler, and the X server
> processes XWM's configure commands immediately. This sounds like
> configure_request handler would be a good place to update the input
> shape.
>
Yes
>
> configure_notify handler gets called for O-R as well, and it happens
> after the fact, so updating there would be a tiny bit late. Would you
> agree?
>
I was thinking there might be some change that comes in configure notify
that we don't know about until the event happens.
>
> That leaves the XWM originated resizes, which boils down to...
> send_configure(), or actually weston_wm_window_configure()?
>
Yes
>
> It looks like configure_request handler is open-coding all of
> weston_wm_window_configure() but it also adds some bits specific to the
> configure request.
>
> Am I making sense?
>
Yes, and thanks for taking the time to try and help unravel this.
>
> > diff --git a/xwayland/window-manager.c b/xwayland/window-manager.c
> > index c307e19..cd72a59 100644
> > --- a/xwayland/window-manager.c
> > +++ b/xwayland/window-manager.c
> > @@ -659,6 +659,33 @@ weston_wm_window_get_input_rect(struct
> weston_wm_window *window,
> > }
> >
> > static void
> > +weston_wm_window_shape(struct weston_wm_window *window)
> > +{
> > + struct weston_wm *wm = window->wm;
> > + xcb_rectangle_t rect;
> > + int x, y, width, height;
> > +
> > + if (window->override_redirect || !window->frame)
> > + return;
> > +
> > + weston_wm_window_get_input_rect(window, &x, &y, &width, &height);
> > +
> > + rect.x = x;
> > + rect.y = y;
> > + rect.width = width;
> > + rect.height = height;
> > +
> > + /* The window frame was created with position and size which
> include
> > + * an offset for margins and shadow. Set the input region to ignore
> > + * shadow. */
> > + xcb_shape_rectangles(wm->conn,
> > + XCB_SHAPE_SO_SET,
> > + XCB_SHAPE_SK_INPUT,
> > + 0, window->frame_id,
> > + 0, 0, 1, &rect);
> > +}
> > +
> > +static void
> > weston_wm_window_send_configure_notify(struct weston_wm_window *window)
> > {
> > xcb_configure_notify_event_t configure_notify;
> > @@ -789,6 +816,8 @@ weston_wm_handle_configure_notify(struct weston_wm
> *wm, xcb_generic_event_t *eve
> > xwayland_api->set_xwayland(window->shsurf,
> > window->x, window->y);
> > }
> > +
> > + weston_wm_window_shape(window);
>
> From Daniel I understood that there would have been a better place to
> call this?
>
I must have misunderstood.
>
> > }
> >
> > static void
> > @@ -983,7 +1012,6 @@ weston_wm_window_create_frame(struct
> weston_wm_window *window)
> > {
> > struct weston_wm *wm = window->wm;
> > uint32_t values[3];
> > - xcb_rectangle_t rect;
> > int x, y, width, height;
> > int buttons = FRAME_BUTTON_CLOSE;
> >
> > @@ -1040,26 +1068,9 @@ weston_wm_window_create_frame(struct
> weston_wm_window *window)
> >
> &wm->format_rgba,
> > width,
> height);
> >
> > - weston_wm_window_get_input_rect(window, &x, &y, &width, &height);
> > - rect.x = x;
> > - rect.y = y;
> > - rect.width = width;
> > - rect.height = height;
> > -
> > - /* The window frame was created with position and size which
> include
> > - * an offset for margins and shadow. Set the input region to ignore
> > - * shadow. */
> > - xcb_shape_rectangles(wm->conn,
> > - XCB_SHAPE_SO_SET,
> > - XCB_SHAPE_SK_INPUT,
> > - 0,
> > - window->frame_id,
> > - 0,
> > - 0,
> > - 1,
> > - &rect);
> > -
> > hash_table_insert(wm->window_hash, window->frame_id, window);
> > +
> > + weston_wm_window_shape(window);
> > }
> >
> > /*
> > @@ -2726,6 +2737,8 @@ send_configure(struct weston_surface *surface,
> int32_t width, int32_t height)
> > window->configure_source =
> > wl_event_loop_add_idle(wm->server->loop,
> > weston_wm_window_configure, window);
> > +
> > + weston_wm_window_shape(window);
>
> This means we do the shaping immediately, but the configure is postponed
> to the idle handler. Shouldn't those go together?
>
Yes but what are you proposing to do to make them go together, call the
shape function from weston_wm_window_configure() instead?
>
> OTOH, weston_wm_window_configure() is also called from
> weston_mw_window_set_toplevel(). To me it seems it would be appropriate
> to call weston_wm_window_shape() from weston_wm_window_configure(). Is it?
>
> > }
> >
> > static void
>
>
> Thanks,
> pq
>
Thanks,
Scott
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.freedesktop.org/archives/wayland-devel/attachments/20180316/f71e0738/attachment-0001.html>
More information about the wayland-devel
mailing list