[PATCH 2/2] clients: Maximize window when double touch on title bar

Pekka Paalanen ppaalanen at gmail.com
Thu Sep 4 07:07:00 PDT 2014


On Thu, 12 Jun 2014 11:06:26 +0800
Xiong Zhang <xiong.y.zhang at intel.com> wrote:

> Signed-off-by: Xiong Zhang <xiong.y.zhang at intel.com>
> ---
>  clients/window.c    | 26 ++++++++++++++++++++++++--
>  shared/cairo-util.h |  7 +++++++
>  shared/frame.c      | 49 +++++++++++++++++++++++++++++++++++++++++++++++++
>  3 files changed, 80 insertions(+), 2 deletions(-)
> 
> diff --git a/clients/window.c b/clients/window.c
> index 7c9c518..a608a84 100644
> --- a/clients/window.c
> +++ b/clients/window.c
> @@ -363,6 +363,7 @@ struct window_frame {
>  
>  	uint32_t last_time;
>  	uint32_t did_double, double_click;
> +	int32_t last_id, double_id;
>  };
>  
>  struct menu {
> @@ -2380,7 +2381,23 @@ frame_touch_down_handler(struct widget *widget, struct input *input,
>  {
>  	struct window_frame *frame = data;
>  
> -	frame_touch_down(frame->frame, input, id, x, y);
> +	frame->double_click = 0;
> +	if (time - frame->last_time <= DOUBLE_CLICK_PERIOD &&
> +	    frame->last_id == id) {
> +		frame->double_click = 1;
> +		frame->did_double = 1;
> +		frame->double_id = id;
> +	} else
> +		frame->did_double = 0;
> +
> +	frame->last_time = time;
> +	frame->last_id = id;
> +
> +	if (frame->double_click)
> +		frame_double_touch_down(frame->frame, input, id, x, y);
> +	else
> +		frame_touch_down(frame->frame, input, id, x, y);
> +
>  	frame_handle_status(frame, input, time, THEME_LOCATION_CLIENT_AREA);

Hi,

hmm, should this perhaps be restricted to the case, where you start
with no touches down, then one touch id does down-up, then again
down-up, and only interpret that as a double-touch?

With your current code, isn't is possible to keep, say, one finger down
while double-touching with another finger? Is that intended?


Thanks,
pq


>  }
>  
> @@ -2391,7 +2408,12 @@ frame_touch_up_handler(struct widget *widget,
>  {
>  	struct window_frame *frame = data;
>  
> -	frame_touch_up(frame->frame, input, id);
> +	if (frame->double_id == id && frame->did_double) {
> +		frame->did_double = 0;
> +		frame->double_id = 0;
> +		frame_double_touch_up(frame->frame, input, id);
> +	} else
> +		frame_touch_up(frame->frame, input, id);
>  	frame_handle_status(frame, input, time, THEME_LOCATION_CLIENT_AREA);
>  }
>  
> diff --git a/shared/cairo-util.h b/shared/cairo-util.h
> index 4e736ef..92f9e74 100644
> --- a/shared/cairo-util.h
> +++ b/shared/cairo-util.h
> @@ -215,6 +215,13 @@ frame_double_click(struct frame *frame, void *pointer,
>  		   uint32_t button, enum frame_button_state state);
>  
>  void
> +frame_double_touch_down(struct frame *frame, void *data, int32_t id,
> +			int x, int y);
> +
> +void
> +frame_double_touch_up(struct frame *frame, void *data, int32_t id);
> +
> +void
>  frame_repaint(struct frame *frame, cairo_t *cr);
>  
>  #endif
> diff --git a/shared/frame.c b/shared/frame.c
> index 768cc2e..774f499 100644
> --- a/shared/frame.c
> +++ b/shared/frame.c
> @@ -868,6 +868,55 @@ frame_double_click(struct frame *frame, void *data,
>  }
>  
>  void
> +frame_double_touch_down(struct frame *frame, void *data, int32_t id,
> +			int x, int y)
> +{
> +	struct frame_touch *touch = frame_touch_get(frame, data);
> +	struct frame_button *button = frame_find_button(frame, x, y);
> +	enum theme_location location;
> +
> +	if (touch && button) {
> +		touch->button = button;
> +		frame_button_press(touch->button);
> +		return;
> +	}
> +
> +	location = theme_get_location(frame->theme, x, y,
> +				      frame->width, frame->height,
> +				      frame->flags & FRAME_FLAG_MAXIMIZED ?
> +				      THEME_FRAME_MAXIMIZED : 0);
> +
> +	switch (location) {
> +	case THEME_LOCATION_TITLEBAR:
> +		frame->status |= FRAME_STATUS_MAXIMIZE;
> +		break;
> +	case THEME_LOCATION_RESIZING_TOP:
> +	case THEME_LOCATION_RESIZING_BOTTOM:
> +	case THEME_LOCATION_RESIZING_LEFT:
> +	case THEME_LOCATION_RESIZING_RIGHT:
> +	case THEME_LOCATION_RESIZING_TOP_LEFT:
> +	case THEME_LOCATION_RESIZING_TOP_RIGHT:
> +	case THEME_LOCATION_RESIZING_BOTTOM_LEFT:
> +	case THEME_LOCATION_RESIZING_BOTTOM_RIGHT:
> +		frame->status |= FRAME_STATUS_RESIZE;
> +		break;
> +	default:
> +		break;
> +	}
> +}
> +
> +void
> +frame_double_touch_up(struct frame *frame, void *data, int32_t id)
> +{
> +	struct frame_touch *touch = frame_touch_get(frame, data);
> +
> +	if (touch && touch->button) {
> +		frame_button_release(touch->button);
> +		frame_touch_destroy(touch);
> +	}
> +}
> +
> +void
>  frame_repaint(struct frame *frame, cairo_t *cr)
>  {
>  	struct frame_button *button;



More information about the wayland-devel mailing list