On Thu, 12 Jun 2014 11:06:25 +0800 Xiong Zhang <[email protected]> wrote:
> From: Xiong Zhang <[email protected]> > > Signed-off-by: Xiong Zhang <[email protected]> > --- > clients/window.c | 26 +++++++++++++++++++++++++- > shared/cairo-util.h | 4 ++++ > shared/frame.c | 31 +++++++++++++++++++++++++++++++ > 3 files changed, 60 insertions(+), 1 deletion(-) > > diff --git a/clients/window.c b/clients/window.c > index b82a93e..7c9c518 100644 > --- a/clients/window.c > +++ b/clients/window.c > @@ -360,6 +360,9 @@ struct window_frame { > struct widget *widget; > struct widget *child; > struct frame *frame; > + > + uint32_t last_time; > + uint32_t did_double, double_click; > }; > > struct menu { > @@ -2335,6 +2338,7 @@ frame_handle_status(struct window_frame *frame, struct > input *input, > } > } > > +#define DOUBLE_CLICK_PERIOD 250 > static void > frame_button_handler(struct widget *widget, > struct input *input, uint32_t time, > @@ -2345,7 +2349,27 @@ frame_button_handler(struct widget *widget, > struct window_frame *frame = data; > enum theme_location location; > > - location = frame_pointer_button(frame->frame, input, button, state); > + frame->double_click = 0; > + if (state == WL_POINTER_BUTTON_STATE_PRESSED) { > + if (time - frame->last_time <= DOUBLE_CLICK_PERIOD) { > + frame->double_click = 1; > + frame->did_double = 1; > + } else > + frame->did_double = 0; > + > + frame->last_time = time; > + } else if (frame->did_double == 1) { > + frame->double_click = 1; > + frame->did_double = 0; > + } > + > + if (frame->double_click) > + location = frame_double_click(frame->frame, input, > + button, state); > + else > + location = frame_pointer_button(frame->frame, input, > + button, state); > + > frame_handle_status(frame, input, time, location); > } > > diff --git a/shared/cairo-util.h b/shared/cairo-util.h > index 4493b0d..4e736ef 100644 > --- a/shared/cairo-util.h > +++ b/shared/cairo-util.h > @@ -210,6 +210,10 @@ frame_touch_down(struct frame *frame, void *data, > int32_t id, int x, int y); > void > frame_touch_up(struct frame *frame, void *data, int32_t id); > > +enum theme_location > +frame_double_click(struct frame *frame, void *pointer, > + uint32_t button, enum frame_button_state state); > + > void > frame_repaint(struct frame *frame, cairo_t *cr); > > diff --git a/shared/frame.c b/shared/frame.c > index 35e6b65..768cc2e 100644 > --- a/shared/frame.c > +++ b/shared/frame.c > @@ -836,6 +836,37 @@ frame_touch_up(struct frame *frame, void *data, int32_t > id) > } > } > > +enum theme_location > +frame_double_click(struct frame *frame, void *data, > + uint32_t btn, enum frame_button_state state) > +{ > + struct frame_pointer *pointer = frame_pointer_get(frame, data); > + struct frame_button *button; > + enum theme_location location = THEME_LOCATION_EXTERIOR; > + > + location = theme_get_location(frame->theme, pointer->x, pointer->y, > + frame->width, frame->height, > + frame->flags & FRAME_FLAG_MAXIMIZED ? > + THEME_FRAME_MAXIMIZED : 0); > + > + button = frame_find_button(frame, pointer->x, pointer->y); > + > + if (location != THEME_LOCATION_TITLEBAR || btn != BTN_LEFT) > + return location; > + > + if (state == FRAME_BUTTON_PRESSED) { > + if (button) > + frame_button_press(button); > + else > + frame->status |= FRAME_STATUS_MAXIMIZE; > + } else if (state == FRAME_BUTTON_RELEASED) { > + if (button) > + frame_button_release(button); > + } > + > + return location; > +} > + > void > frame_repaint(struct frame *frame, cairo_t *cr) > { Yeah, that seems to work, and while I don't really know this part of the code base, it seems ok to me. Pushed. Thanks, pq _______________________________________________ wayland-devel mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/wayland-devel
