window: Add a widget default cursor convenience helper
In a few cases, we set a motion handler just to be able to set a fixed cursor. This adds a default cursor helper that can be used in those cases. In case of the 'transformed' test case, we also avoid a brief flicker of the pointer cursor, which is set on enter when the move grab is lifted.
This commit is contained in:
+1
-8
@@ -129,13 +129,6 @@ redraw_handler(struct widget *widget, void *data)
|
|||||||
cairo_surface_destroy(surface);
|
cairo_surface_destroy(surface);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
|
||||||
motion_handler(struct widget *widget, struct input *input,
|
|
||||||
uint32_t time, float x, float y, void *data)
|
|
||||||
{
|
|
||||||
return CURSOR_HAND1;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
button_handler(struct widget *widget,
|
button_handler(struct widget *widget,
|
||||||
struct input *input, uint32_t time,
|
struct input *input, uint32_t time,
|
||||||
@@ -184,8 +177,8 @@ int main(int argc, char *argv[])
|
|||||||
|
|
||||||
widget_set_resize_handler(flower.widget, resize_handler);
|
widget_set_resize_handler(flower.widget, resize_handler);
|
||||||
widget_set_redraw_handler(flower.widget, redraw_handler);
|
widget_set_redraw_handler(flower.widget, redraw_handler);
|
||||||
widget_set_motion_handler(flower.widget, motion_handler);
|
|
||||||
widget_set_button_handler(flower.widget, button_handler);
|
widget_set_button_handler(flower.widget, button_handler);
|
||||||
|
widget_set_default_cursor(flower.widget, CURSOR_HAND1);
|
||||||
|
|
||||||
window_schedule_resize(flower.window, flower.width, flower.height);
|
window_schedule_resize(flower.window, flower.width, flower.height);
|
||||||
|
|
||||||
|
|||||||
@@ -185,13 +185,6 @@ output_handler(struct window *window, struct output *output, int enter,
|
|||||||
window_schedule_redraw(window);
|
window_schedule_redraw(window);
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
|
||||||
motion_handler(struct widget *widget, struct input *input,
|
|
||||||
uint32_t time, float x, float y, void *data)
|
|
||||||
{
|
|
||||||
return CURSOR_BLANK;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
button_handler(struct widget *widget,
|
button_handler(struct widget *widget,
|
||||||
struct input *input, uint32_t time,
|
struct input *input, uint32_t time,
|
||||||
@@ -237,9 +230,9 @@ int main(int argc, char *argv[])
|
|||||||
window_set_title(transformed.window, "Transformed");
|
window_set_title(transformed.window, "Transformed");
|
||||||
|
|
||||||
widget_set_transparent(transformed.widget, 0);
|
widget_set_transparent(transformed.widget, 0);
|
||||||
|
widget_set_default_cursor(transformed.widget, CURSOR_BLANK);
|
||||||
|
|
||||||
widget_set_redraw_handler(transformed.widget, redraw_handler);
|
widget_set_redraw_handler(transformed.widget, redraw_handler);
|
||||||
widget_set_motion_handler(transformed.widget, motion_handler);
|
|
||||||
widget_set_button_handler(transformed.widget, button_handler);
|
widget_set_button_handler(transformed.widget, button_handler);
|
||||||
|
|
||||||
window_set_fullscreen_handler(transformed.window, fullscreen_handler);
|
window_set_fullscreen_handler(transformed.window, fullscreen_handler);
|
||||||
|
|||||||
+17
-5
@@ -253,6 +253,7 @@ struct widget {
|
|||||||
void *user_data;
|
void *user_data;
|
||||||
int opaque;
|
int opaque;
|
||||||
int tooltip_count;
|
int tooltip_count;
|
||||||
|
int default_cursor;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct input {
|
struct input {
|
||||||
@@ -1334,6 +1335,7 @@ widget_create(struct window *window, void *data)
|
|||||||
widget->opaque = 0;
|
widget->opaque = 0;
|
||||||
widget->tooltip = NULL;
|
widget->tooltip = NULL;
|
||||||
widget->tooltip_count = 0;
|
widget->tooltip_count = 0;
|
||||||
|
widget->default_cursor = CURSOR_LEFT_PTR;
|
||||||
|
|
||||||
return widget;
|
return widget;
|
||||||
}
|
}
|
||||||
@@ -1378,6 +1380,12 @@ widget_destroy(struct widget *widget)
|
|||||||
free(widget);
|
free(widget);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
widget_set_default_cursor(struct widget *widget, int cursor)
|
||||||
|
{
|
||||||
|
widget->default_cursor = cursor;
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
widget_get_allocation(struct widget *widget, struct rectangle *allocation)
|
widget_get_allocation(struct widget *widget, struct rectangle *allocation)
|
||||||
{
|
{
|
||||||
@@ -2241,7 +2249,7 @@ input_set_focus_widget(struct input *input, struct widget *focus,
|
|||||||
float x, float y)
|
float x, float y)
|
||||||
{
|
{
|
||||||
struct widget *old, *widget;
|
struct widget *old, *widget;
|
||||||
int pointer = CURSOR_LEFT_PTR;
|
int cursor;
|
||||||
|
|
||||||
if (focus == input->focus_widget)
|
if (focus == input->focus_widget)
|
||||||
return;
|
return;
|
||||||
@@ -2262,10 +2270,12 @@ input_set_focus_widget(struct input *input, struct widget *focus,
|
|||||||
widget = input->grab;
|
widget = input->grab;
|
||||||
input->focus_widget = focus;
|
input->focus_widget = focus;
|
||||||
if (widget->enter_handler)
|
if (widget->enter_handler)
|
||||||
pointer = widget->enter_handler(focus, input, x, y,
|
cursor = widget->enter_handler(focus, input, x, y,
|
||||||
widget->user_data);
|
widget->user_data);
|
||||||
|
else
|
||||||
|
cursor = widget->default_cursor;
|
||||||
|
|
||||||
input_set_pointer_image(input, pointer);
|
input_set_pointer_image(input, cursor);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2354,7 +2364,7 @@ pointer_handle_motion(void *data, struct wl_pointer *pointer,
|
|||||||
struct input *input = data;
|
struct input *input = data;
|
||||||
struct window *window = input->pointer_focus;
|
struct window *window = input->pointer_focus;
|
||||||
struct widget *widget;
|
struct widget *widget;
|
||||||
int cursor = CURSOR_LEFT_PTR;
|
int cursor;
|
||||||
float sx = wl_fixed_to_double(sx_w);
|
float sx = wl_fixed_to_double(sx_w);
|
||||||
float sy = wl_fixed_to_double(sy_w);
|
float sy = wl_fixed_to_double(sy_w);
|
||||||
|
|
||||||
@@ -2377,6 +2387,8 @@ pointer_handle_motion(void *data, struct wl_pointer *pointer,
|
|||||||
cursor = widget->motion_handler(input->focus_widget,
|
cursor = widget->motion_handler(input->focus_widget,
|
||||||
input, time, sx, sy,
|
input, time, sx, sy,
|
||||||
widget->user_data);
|
widget->user_data);
|
||||||
|
else
|
||||||
|
cursor = input->focus_widget->default_cursor;
|
||||||
|
|
||||||
input_set_pointer_image(input, cursor);
|
input_set_pointer_image(input, cursor);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -360,6 +360,8 @@ widget_add_widget(struct widget *parent, void *data);
|
|||||||
void
|
void
|
||||||
widget_destroy(struct widget *widget);
|
widget_destroy(struct widget *widget);
|
||||||
void
|
void
|
||||||
|
widget_set_default_cursor(struct widget *widget, int cursor);
|
||||||
|
void
|
||||||
widget_get_allocation(struct widget *widget, struct rectangle *allocation);
|
widget_get_allocation(struct widget *widget, struct rectangle *allocation);
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|||||||
Reference in New Issue
Block a user