On Tue, Nov 17, 2015 at 06:11:01PM +0800, Jonas Ådahl wrote:
> Use pointer confinement to make the line drawing not go outside the
> drawing area. It is toggled with the right pointer button.
> 
> Signed-off-by: Jonas Ådahl <jad...@gmail.com>

patch itself is Reviewed-by: Peter Hutterer <peter.hutte...@who-t.net>, but
seem my comment about shoving stuff into clickdot from patch 19.

Cheers,
   Peter

> ---
>  clients/clickdot.c | 33 +++++++++++++++++++++++++++++++--
>  1 file changed, 31 insertions(+), 2 deletions(-)
> 
> diff --git a/clients/clickdot.c b/clients/clickdot.c
> index 776f8da..1597e11 100644
> --- a/clients/clickdot.c
> +++ b/clients/clickdot.c
> @@ -25,6 +25,7 @@
>  
>  #include "config.h"
>  
> +#include <stdbool.h>
>  #include <stdint.h>
>  #include <stdio.h>
>  #include <stdlib.h>
> @@ -63,6 +64,8 @@ struct clickdot {
>       struct input *cursor_timeout_input;
>       int cursor_timeout_fd;
>       struct task cursor_timeout_task;
> +
> +     bool pointer_confined;
>  };
>  
>  static void
> @@ -207,16 +210,32 @@ key_handler(struct window *window, struct input *input, 
> uint32_t time,
>  }
>  
>  static void
> +toggle_pointer_confine(struct clickdot *clickdot, struct input *input)
> +{
> +     if (clickdot->pointer_confined) {
> +             window_unconfine_pointer(clickdot->window);
> +     } else {
> +             window_confine_pointer_to_widget(clickdot->window,
> +                                              clickdot->widget,
> +                                              input);
> +     }
> +
> +     clickdot->pointer_confined = !clickdot->pointer_confined;
> +}
> +
> +static void
>  button_handler(struct widget *widget,
>              struct input *input, uint32_t time,
>              uint32_t button,
>              enum wl_pointer_button_state state, void *data)
>  {
>       struct clickdot *clickdot = data;
> +     bool is_pressed = state == WL_POINTER_BUTTON_STATE_PRESSED;
>  
> -     if (state == WL_POINTER_BUTTON_STATE_PRESSED && button == BTN_LEFT)
> +     if (is_pressed && button == BTN_LEFT)
>               input_get_position(input, &clickdot->dot.x, &clickdot->dot.y);
> -
> +     else if (is_pressed && button == BTN_RIGHT)
> +             toggle_pointer_confine(clickdot, input);
>       widget_schedule_redraw(widget);
>  }
>  
> @@ -284,6 +303,14 @@ cursor_timeout_func(struct task *task, uint32_t events)
>                               CURSOR_LEFT_PTR);
>  }
>  
> +static void
> +pointer_unconfined(struct window *window, struct input *input, void *data)
> +{
> +     struct clickdot *clickdot = data;
> +
> +     clickdot->pointer_confined = false;
> +}
> +
>  static struct clickdot *
>  clickdot_create(struct display *display)
>  {
> @@ -300,6 +327,8 @@ clickdot_create(struct display *display)
>       window_set_user_data(clickdot->window, clickdot);
>       window_set_keyboard_focus_handler(clickdot->window,
>                                         keyboard_focus_handler);
> +     window_set_pointer_unconfined_handler(clickdot->window,
> +                                           pointer_unconfined);
>  
>       widget_set_redraw_handler(clickdot->widget, redraw_handler);
>       widget_set_button_handler(clickdot->widget, button_handler);
> -- 
> 2.4.3
> 
> _______________________________________________
> wayland-devel mailing list
> wayland-devel@lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/wayland-devel
> 
_______________________________________________
wayland-devel mailing list
wayland-devel@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/wayland-devel

Reply via email to