[PATCH 06/16] xdg-shell: Implement set_transient_for request.

Rafael Antognolli antognolli at gmail.com
Tue Dec 3 09:48:31 PST 2013


On Fri, Nov 29, 2013 at 9:39 PM, Kristian Høgsberg <hoegsberg at gmail.com> wrote:
> On Wed, Nov 27, 2013 at 03:50:22PM -0200, Rafael Antognolli wrote:
>> The implementation just sets a parent/child relationship between the
>> xdg_surface and its parent, passed as argument of this request. Stacking
>> might be affected (that's up to the compositor).
>>
>> This implementation does not affect the code that handles the previous
>> transient surface type. It should still work as expected, but it's not
>> possible to set that surface type to a xdg_surface.
>> ---
>>  src/shell.c | 50 +++++++++++++++++++++++++++++---------------------
>>  1 file changed, 29 insertions(+), 21 deletions(-)
>>
>> diff --git a/src/shell.c b/src/shell.c
>> index 6cbb4bd..98fb0fe 100644
>> --- a/src/shell.c
>> +++ b/src/shell.c
>> @@ -2955,6 +2955,18 @@ xdg_surface_destroy(struct wl_client *client,
>>  }
>>
>>  static void
>> +xdg_surface_set_transient_for(struct wl_client *client,
>> +                           struct wl_resource *resource,
>> +                           struct wl_resource *parent_resource)
>> +{
>> +     struct shell_surface *shsurf = wl_resource_get_user_data(resource);
>> +     struct weston_surface *parent =
>> +             wl_resource_get_user_data(parent_resource);
>> +
>> +     shsurf->parent = parent;
>> +}
>> +
>> +static void
>>  xdg_surface_pong(struct wl_client *client,
>>                struct wl_resource *resource,
>>                uint32_t serial)
>> @@ -3078,7 +3090,7 @@ xdg_surface_unset_maximized(struct wl_client *client,
>>
>>  static const struct xdg_surface_interface xdg_surface_implementation = {
>>       xdg_surface_destroy,
>> -     NULL, // set_transient_for
>> +     xdg_surface_set_transient_for,
>>       xdg_surface_set_title,
>>       xdg_surface_set_app_id,
>>       xdg_surface_pong,
>> @@ -4567,27 +4579,23 @@ map(struct desktop_shell *shell, struct shell_surface *shsurf,
>>       }
>>
>>       /* surface stacking order, see also activate() */
>> -     switch (shsurf->type) {
>> -     case SHELL_SURFACE_POPUP:
>> -     case SHELL_SURFACE_TRANSIENT:
>> -             /* TODO: Handle a parent with multiple views */
>> -             parent = get_default_view(shsurf->parent);
>> -             if (parent) {
>> -                     wl_list_remove(&shsurf->view->layer_link);
>> -                     wl_list_insert(parent->layer_link.prev,
>> -                                    &shsurf->view->layer_link);
>> +     if (shsurf->type != SHELL_SURFACE_NONE) {
>> +             if (shsurf->parent) {
>> +                     /* TODO: Handle a parent with multiple views */
>> +                     parent = get_default_view(shsurf->parent);
>> +                     if (parent) {
>> +                             wl_list_remove(&shsurf->view->layer_link);
>> +                             wl_list_insert(parent->layer_link.prev,
>> +                                            &shsurf->view->layer_link);
>> +                     }
>> +             } else {
>> +                     if (!shsurf->cur.fullscreen) {
>> +                             ws = get_current_workspace(shell);
>> +                             wl_list_remove(&shsurf->view->layer_link);
>> +                             wl_list_insert(&ws->layer.view_list,
>> +                                            &shsurf->view->layer_link);
>> +                     }
>>               }
>> -             break;
>> -     case SHELL_SURFACE_NONE:
>> -             break;
>> -     case SHELL_SURFACE_XWAYLAND:
>> -     default:
>> -             if (shsurf->cur.fullscreen)
>> -                     break;
>> -             ws = get_current_workspace(shell);
>> -             wl_list_remove(&shsurf->view->layer_link);
>> -             wl_list_insert(&ws->layer.view_list, &shsurf->view->layer_link);
>> -             break;
>
> Can we split this part that changes map() out in a separate patch that
> drops SHELL_SURFACE_TRANSIENT first like you did for
> SHELL_SURFACE_MAXIMIZE/FULLSCREEN?  Then shsurf->parent == NULL means
> "not transient_for" and shsurf->parent != NULL means "transient for
> that surface".

Done.

This wasn't entirely removing the SHELL_SURFACE_TRANSIENT, since it
was still meaningful for wl_shell. But I removed it now, and added a
state.relative flag to point it out when we are talking about
wl_shell's transient. SHELL_SURFACE_TRANSIENT is totally removed now,
see if you like it.

> Kristian
>
>>       }
>>
>>       if (shsurf->type != SHELL_SURFACE_NONE) {
>> --
>> 1.8.3.1
>>
>> _______________________________________________
>> wayland-devel mailing list
>> wayland-devel at lists.freedesktop.org
>> http://lists.freedesktop.org/mailman/listinfo/wayland-devel
> _______________________________________________
> wayland-devel mailing list
> wayland-devel at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/wayland-devel



-- 
Rafael Antognolli


More information about the wayland-devel mailing list