On Wed, 20 Aug 2014 10:37:00 +0200
Jonny Lamb <jonny.l...@collabora.co.uk> wrote:

> Panels are always assumed to be on the top edge of the output. If this
> is not the case views will be placed under the panel, wherever it is,
> and maximize doesn't use the correct space allocated for views.
> 
> By telling the server on which edge the panel is located, it can
> correctly calculate where to put new views and how big maximized views
> should be.
> ---
>  desktop-shell/shell.c      | 29 ++++++++++++++++++++++++++---
>  desktop-shell/shell.h      |  2 ++
>  protocol/desktop-shell.xml | 20 +++++++++++++++++++-
>  3 files changed, 47 insertions(+), 4 deletions(-)
> 
> diff --git a/desktop-shell/shell.c b/desktop-shell/shell.c
> index ec72287..3b03513 100644
> --- a/desktop-shell/shell.c
> +++ b/desktop-shell/shell.c
> @@ -4124,13 +4124,34 @@ desktop_shell_desktop_ready(struct wl_client *client,
>       shell_fade_startup(shell);
>  }
>  
> +static void
> +desktop_shell_set_panel_position(struct wl_client *client,
> +                              struct wl_resource *resource,
> +                              uint32_t position)
> +{
> +     struct desktop_shell *shell = wl_resource_get_user_data(resource);
> +
> +     if (position != DESKTOP_SHELL_PANEL_POSITION_TOP &&
> +         position != DESKTOP_SHELL_PANEL_POSITION_BOTTOM &&
> +         position != DESKTOP_SHELL_PANEL_POSITION_LEFT &&
> +         position != DESKTOP_SHELL_PANEL_POSITION_RIGHT) {
> +             wl_resource_post_error(resource,
> +                                    WL_DISPLAY_ERROR_INVALID_OBJECT,
> +                                    "bad position argument");

Since 'resource' refers to a desktop_shell object, you should not use
a WL_DISPLAY_ERROR_* code, because it is in the wrong namespace.

We will need to add an error enum into desktop_shell. I would be fine
with just one generic error code, since this is a private protocol.

There may be similar existing abuses to fix in shell.c, but those can
be left for another patch.

> +             return;
> +     }
> +
> +     shell->panel_position = position;
> +}
> +
>  static const struct desktop_shell_interface desktop_shell_implementation = {
>       desktop_shell_set_background,
>       desktop_shell_set_panel,
>       desktop_shell_set_lock_surface,
>       desktop_shell_unlock,
>       desktop_shell_set_grab_surface,
> -     desktop_shell_desktop_ready
> +     desktop_shell_desktop_ready,
> +     desktop_shell_set_panel_position
>  };
>  
>  static enum shell_surface_type
> @@ -5344,7 +5365,7 @@ bind_desktop_shell(struct wl_client *client,
>       struct wl_resource *resource;
>  
>       resource = wl_resource_create(client, &desktop_shell_interface,
> -                                   MIN(version, 2), id);
> +                                   MIN(version, 3), id);
>  
>       if (client == shell->child.client) {
>               wl_resource_set_implementation(resource,
> @@ -6265,7 +6286,7 @@ module_init(struct weston_compositor *ec,
>               return -1;
>  
>       if (wl_global_create(ec->wl_display,
> -                          &desktop_shell_interface, 2,
> +                          &desktop_shell_interface, 3,
>                            shell, bind_desktop_shell) == NULL)
>               return -1;
>  
> @@ -6279,6 +6300,8 @@ module_init(struct weston_compositor *ec,
>  
>       shell->child.deathstamp = weston_compositor_get_time();
>  
> +     shell->panel_position = DESKTOP_SHELL_PANEL_POSITION_TOP;
> +
>       setup_output_destroy_handler(ec, shell);
>  
>       loop = wl_display_get_event_loop(ec->wl_display);
> diff --git a/desktop-shell/shell.h b/desktop-shell/shell.h
> index e994cdb..317f1dc 100644
> --- a/desktop-shell/shell.h
> +++ b/desktop-shell/shell.h
> @@ -205,6 +205,8 @@ struct desktop_shell {
>       struct wl_listener output_move_listener;
>       struct wl_list output_list;
>  
> +     uint32_t panel_position;

Could this be 'enum desktop_shell_panel_position' instead of uint32_t?

> +
>       char *client;
>  };
>  
> diff --git a/protocol/desktop-shell.xml b/protocol/desktop-shell.xml
> index fdcb17b..57c204a 100644
> --- a/protocol/desktop-shell.xml
> +++ b/protocol/desktop-shell.xml
> @@ -1,6 +1,6 @@
>  <protocol name="desktop">
>  
> -  <interface name="desktop_shell" version="2">
> +  <interface name="desktop_shell" version="3">
>      <description summary="create desktop widgets and helpers">
>        Traditional user interfaces can rely on this interface to define the
>        foundations of typical desktops. Currently it's possible to set up
> @@ -94,6 +94,24 @@
>        </description>
>      </request>
>  
> +    <!-- Version 3 additions -->
> +
> +    <enum name="panel_position">
> +      <entry name="top" value="0"/>
> +      <entry name="bottom" value="1"/>
> +      <entry name="left" value="2"/>
> +      <entry name="right" value="3"/>
> +    </enum>
> +
> +    <request name="set_panel_position" since="3">
> +      <arg name="position" type="uint"/>
> +      <description summary="set panel position">
> +        Tell the shell which side of the screen the panel is
> +        located. This is so that new windows do not overlap the panel
> +        and maximized windows maximize properly.
> +      </description>
> +    </request>
> +
>    </interface>
>  
>    <interface name="screensaver" version="1">

Looks good, I assume the compositor knows from the panel surface's size
how much it needs to reserve for it.


Thanks,
pq
_______________________________________________
wayland-devel mailing list
wayland-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/wayland-devel

Reply via email to