[PATCH weston 1/3] desktop-shell: add set_panel_position to help place views onscreen

Pekka Paalanen ppaalanen at gmail.com
Wed Aug 20 06:05:23 PDT 2014


On Wed, 20 Aug 2014 10:37:00 +0200
Jonny Lamb <jonny.lamb at 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


More information about the wayland-devel mailing list