[PATCH weston 17/17] clients/clickdot: Use pointer confinement to confine drawed line
Jonas Ådahl
jadahl at gmail.com
Tue Dec 2 05:49:25 PST 2014
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 <jadahl at gmail.com>
---
clients/clickdot.c | 32 ++++++++++++++++++++++++++++++--
1 file changed, 30 insertions(+), 2 deletions(-)
diff --git a/clients/clickdot.c b/clients/clickdot.c
index 5137ba6..5d019c8 100644
--- a/clients/clickdot.c
+++ b/clients/clickdot.c
@@ -24,6 +24,7 @@
#include "config.h"
+#include <stdbool.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
@@ -61,6 +62,8 @@ struct clickdot {
struct input *cursor_timeout_input;
int cursor_timeout_fd;
struct task cursor_timeout_task;
+
+ bool pointer_confined;
};
static void
@@ -205,16 +208,31 @@ 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(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);
}
@@ -282,6 +300,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)
{
@@ -298,6 +324,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);
--
1.8.5.1
More information about the wayland-devel
mailing list