[PATCH 1/2] shell: Implement the probe_area request on the shell surface

Pekka Paalanen ppaalanen at gmail.com
Tue Jan 29 00:48:09 PST 2013


On Mon, 28 Jan 2013 17:19:26 +0000
Rob Bradford <robert.bradford at intel.com> wrote:

> From: Rob Bradford <rob at linux.intel.com>
> 
> ---
>  src/shell.c | 81
> ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file
> changed, 80 insertions(+), 1 deletion(-)
> 
> diff --git a/src/shell.c b/src/shell.c
> index aa1c7c1..58b5892 100644
> --- a/src/shell.c
> +++ b/src/shell.c
> @@ -1914,6 +1914,84 @@ shell_surface_set_popup(struct wl_client
> *client, shsurf->popup.y = y;
>  }
>  
> +
> +static void
> +shell_surface_probe_area(struct wl_client *client,
> +			 struct wl_resource *resource,
> +			 int x,
> +			 int y,
> +			 int w,
> +			 int h,
> +			 uint32_t result_id)
> +{
> +	struct wl_resource result;
> +	struct shell_surface *shsurf = resource->data;
> +	struct {
> +		struct {
> +			int x;
> +			int y;
> +		} tl, br;
> +	} orig, new;
> +
> +	int output_w, output_h;
> +
> +	int new_x, new_y, new_w, new_h;
> +
> +	output_w = shsurf->surface->output->current->width;
> +	output_h = shsurf->surface->output->current->height;
> +
> +	/* orig and new are in global co-ordinates */
> +	orig.tl.x = shsurf->surface->geometry.x + x;
> +	orig.tl.y = shsurf->surface->geometry.y + y;

Whenever I see code accessing surface->geometry directly without
checking for surface->transform.enabled first, I think:
Shouldn't this be using weston_surface_{to,from}_global*()?

This is especially important if the 'surface' itself is a transient for
something, i.e. inherits its transformation from another surface, like
menus. In that case, geometry.{x,y} are relative to the parent surface,
not global coordinate system. IIRC.

I understand the actual rectangle calculations may become fairly
tricky. This patch still does its job on showing how the new protocol
works.

> +	orig.br.x = orig.tl.x + w;
> +	orig.br.y = orig.tl.y + h;
> +
> +	new = orig;
> +
> +	/* Clamp the top left so it is inside */
> +	if (orig.tl.x < 0)
> +	  new.tl.x = 0;
> +	if (orig.tl.y < 0)
> +	  new.tl.y = 0;
> +	if (orig.tl.x > output_w)
> +	  new.tl.x = output_w;
> +	if (orig.tl.y > output_h)
> +	  new.tl.y = output_h;
> +
> +	/* Clamp the bottom right so it is inside */
> +	if (orig.br.x < 0)
> +	  new.br.x = 0;
> +	if (orig.br.y < 0)
> +	  new.br.y = 0;
> +	if (orig.br.x > output_w)
> +	  new.br.x = output_w;
> +	if (orig.br.y > output_h)
> +	  new.br.y = output_h;
> +
> +	/* Translate back into relative co-ordinates */
> +	new_x = new.tl.x - shsurf->surface->geometry.x;
> +	new_y = new.tl.y - shsurf->surface->geometry.y;

And the same here.

> +	new_w = new.br.x - new.tl.x;
> +	new_h = new.br.y - new.tl.y;
> +
> +	memset(&result, 0, sizeof(result));
> +
> +	result.object.interface = &wl_probe_result_interface;
> +	result.object.id = result_id;
> +	result.destroy = NULL;
> +	result.client = client;
> +	result.data = NULL;
> +
> +	wl_client_add_resource(client, &result);
> +
> +	wl_resource_post_event(&result,
> +			       WL_PROBE_RESULT_VISIBLE_AREA,
> +			       new_x, new_y,
> +			       new_w, new_h);
> +
> +	wl_resource_destroy(&result);
> +}
> +
>  static const struct wl_shell_surface_interface
> shell_surface_implementation = { shell_surface_pong,
>  	shell_surface_move,
> @@ -1924,7 +2002,8 @@ static const struct wl_shell_surface_interface
> shell_surface_implementation = { shell_surface_set_popup,
>  	shell_surface_set_maximized,
>  	shell_surface_set_title,
> -	shell_surface_set_class
> +	shell_surface_set_class,
> +	shell_surface_probe_area
>  };
>  
>  static void


Thanks,
pq


More information about the wayland-devel mailing list