From b13e84f4e95faaef6ee259bf67edce853ddda732 Mon Sep 17 00:00:00 2001 From: Pekka Paalanen Date: Fri, 20 Jan 2012 13:04:56 +0200 Subject: [PATCH] clickdot: implement the purpose Remove all unneeded resizor features, and add the feature why clickdot exists: put a visible marker to exactly where mouse was clicked. This app can be used to check input coordinate transformations in a compositor. Signed-off-by: Pekka Paalanen --- clients/clickdot.c | 124 +++++++++------------------------------------ 1 file changed, 23 insertions(+), 101 deletions(-) diff --git a/clients/clickdot.c b/clients/clickdot.c index a707037c..71bc091c 100644 --- a/clients/clickdot.c +++ b/clients/clickdot.c @@ -1,5 +1,6 @@ /* * Copyright © 2010 Intel Corporation + * Copyright © 2012 Collabora, Ltd. * * Permission to use, copy, modify, distribute, and sell this software and its * documentation for any purpose is hereby granted without fee, provided that @@ -39,58 +40,14 @@ struct clickdot { struct display *display; struct window *window; struct widget *widget; - struct window *menu; - int32_t width; - - struct { - double current; - double target; - double previous; - } height; - struct wl_callback *frame_callback; -}; - -static void -frame_callback(void *data, struct wl_callback *callback, uint32_t time) -{ - struct clickdot *clickdot = data; - double force, height; - - assert(!callback || callback == clickdot->frame_callback); - height = clickdot->height.current; - force = (clickdot->height.target - height) / 10.0 + - (clickdot->height.previous - height); - - clickdot->height.current = - height + (height - clickdot->height.previous) + force; - clickdot->height.previous = height; - - if (clickdot->height.current >= 400) { - clickdot->height.current = 400; - clickdot->height.previous = 400; - } - - if (clickdot->height.current <= 200) { - clickdot->height.current = 200; - clickdot->height.previous = 200; - } - - widget_schedule_resize(clickdot->widget, clickdot->width, height + 0.5); - - if (clickdot->frame_callback) { - wl_callback_destroy(clickdot->frame_callback); - clickdot->frame_callback = NULL; - } -} - -static const struct wl_callback_listener listener = { - frame_callback + int32_t x, y; }; static void redraw_handler(struct widget *widget, void *data) { + static const double r = 10.0; struct clickdot *clickdot = data; cairo_surface_t *surface; cairo_t *cr; @@ -109,18 +66,20 @@ redraw_handler(struct widget *widget, void *data) allocation.height); cairo_set_source_rgba(cr, 0, 0, 0, 0.8); cairo_fill(cr); - cairo_destroy(cr); - cairo_surface_destroy(surface); + cairo_translate(cr, clickdot->x + 0.5, clickdot->y + 0.5); + cairo_set_line_width(cr, 1.0); + cairo_set_source_rgb(cr, 0.1, 0.9, 0.9); + cairo_move_to(cr, 0.0, -r); + cairo_line_to(cr, 0.0, r); + cairo_move_to(cr, -r, 0.0); + cairo_line_to(cr, r, 0.0); + cairo_arc(cr, 0.0, 0.0, r, 0.0, 2.0 * M_PI); + cairo_stroke(cr); - if (fabs(clickdot->height.previous - clickdot->height.target) > 0.1) { - clickdot->frame_callback = - wl_surface_frame( - window_get_wl_surface(clickdot->window)); - wl_callback_add_listener(clickdot->frame_callback, &listener, - clickdot); - } + cairo_destroy(cr); + cairo_surface_destroy(surface); } static void @@ -142,39 +101,12 @@ key_handler(struct window *window, struct input *input, uint32_t time, return; switch (sym) { - case XK_Down: - clickdot->height.target = 400; - frame_callback(clickdot, NULL, 0); - break; - case XK_Up: - clickdot->height.target = 200; - frame_callback(clickdot, NULL, 0); - break; case XK_Escape: display_exit(clickdot->display); break; } } -static void -menu_func(struct window *window, int index, void *user_data) -{ - fprintf(stderr, "picked entry %d\n", index); -} - -static void -show_menu(struct clickdot *clickdot, struct input *input, uint32_t time) -{ - int32_t x, y; - static const char *entries[] = { - "Roy", "Pris", "Leon", "Zhora" - }; - - input_get_position(input, &x, &y); - window_show_menu(clickdot->display, input, time, clickdot->window, - x - 10, y - 10, menu_func, entries, 4); -} - static void button_handler(struct widget *widget, struct input *input, uint32_t time, @@ -182,19 +114,16 @@ button_handler(struct widget *widget, { struct clickdot *clickdot = data; - switch (button) { - case BTN_RIGHT: - if (state) - show_menu(clickdot, input, time); - break; - } + if (state && button == BTN_LEFT) + input_get_position(input, &clickdot->x, &clickdot->y); + + widget_schedule_redraw(widget); } static struct clickdot * clickdot_create(struct display *display) { struct clickdot *clickdot; - int32_t height; clickdot = malloc(sizeof *clickdot); if (clickdot == NULL) @@ -203,24 +132,20 @@ clickdot_create(struct display *display) clickdot->window = window_create(display, 500, 400); clickdot->widget = frame_create(clickdot->window, clickdot); - window_set_title(clickdot->window, "Wayland Resizor"); + window_set_title(clickdot->window, "Wayland ClickDot"); clickdot->display = display; window_set_key_handler(clickdot->window, key_handler); window_set_user_data(clickdot->window, clickdot); - widget_set_redraw_handler(clickdot->widget, redraw_handler); window_set_keyboard_focus_handler(clickdot->window, keyboard_focus_handler); - clickdot->width = 300; - clickdot->height.current = 400; - clickdot->height.previous = clickdot->height.current; - clickdot->height.target = clickdot->height.current; - height = clickdot->height.current + 0.5; - + widget_set_redraw_handler(clickdot->widget, redraw_handler); widget_set_button_handler(clickdot->widget, button_handler); - widget_schedule_resize(clickdot->widget, clickdot->width, height); + widget_schedule_resize(clickdot->widget, 500, 400); + clickdot->x = 250; + clickdot->y = 200; return clickdot; } @@ -228,9 +153,6 @@ clickdot_create(struct display *display) static void clickdot_destroy(struct clickdot *clickdot) { - if (clickdot->frame_callback) - wl_callback_destroy(clickdot->frame_callback); - widget_destroy(clickdot->widget); window_destroy(clickdot->window); free(clickdot);