weston-fullscreen: Add cursor drawing support and properly handle WL_FULLSCREEN_SHELL_CAPABILITY_CURSOR_PLANE

Signed-off-by: Jason Ekstrand <jason@jlekstrand.net>
This commit is contained in:
Jason Ekstrand 2014-04-02 19:53:53 -05:00 committed by Kristian Høgsberg
parent 2bb72fe6fb
commit 7a17d42fb3
1 changed files with 99 additions and 4 deletions

View File

@ -48,6 +48,7 @@ struct fullscreen {
int width, height;
int fullscreen;
float pointer_x, pointer_y;
int focussed, draw_cursor;
struct wl_list output_list;
struct fs_output *current_output;
@ -186,7 +187,8 @@ redraw_handler(struct widget *widget, void *data)
x = 50;
cairo_set_line_width (cr, border);
while (x + 70 < fullscreen->width) {
if (fullscreen->pointer_x >= x && fullscreen->pointer_x < x + 50 &&
if (fullscreen->focussed &&
fullscreen->pointer_x >= x && fullscreen->pointer_x < x + 50 &&
fullscreen->pointer_y >= y && fullscreen->pointer_y < y + 40) {
cairo_set_source_rgb(cr, 1, 0, 0);
cairo_rectangle(cr,
@ -205,6 +207,44 @@ redraw_handler(struct widget *widget, void *data)
y += 50;
}
if (fullscreen->focussed && fullscreen->draw_cursor) {
cairo_set_source_rgb(cr, 1, 1, 1);
cairo_set_line_width (cr, 8);
cairo_move_to(cr,
fullscreen->pointer_x - 12,
fullscreen->pointer_y - 12);
cairo_line_to(cr,
fullscreen->pointer_x + 12,
fullscreen->pointer_y + 12);
cairo_stroke(cr);
cairo_move_to(cr,
fullscreen->pointer_x + 12,
fullscreen->pointer_y - 12);
cairo_line_to(cr,
fullscreen->pointer_x - 12,
fullscreen->pointer_y + 12);
cairo_stroke(cr);
cairo_set_source_rgb(cr, 0, 0, 0);
cairo_set_line_width (cr, 4);
cairo_move_to(cr,
fullscreen->pointer_x - 10,
fullscreen->pointer_y - 10);
cairo_line_to(cr,
fullscreen->pointer_x + 10,
fullscreen->pointer_y + 10);
cairo_stroke(cr);
cairo_move_to(cr,
fullscreen->pointer_x + 10,
fullscreen->pointer_y - 10);
cairo_line_to(cr,
fullscreen->pointer_x - 10,
fullscreen->pointer_y + 10);
cairo_stroke(cr);
}
cairo_destroy(cr);
}
@ -336,9 +376,37 @@ motion_handler(struct widget *widget,
fullscreen->pointer_y = y;
widget_schedule_redraw(widget);
return 0;
return fullscreen->draw_cursor ? CURSOR_BLANK : CURSOR_LEFT_PTR;
}
static int
enter_handler(struct widget *widget,
struct input *input,
float x, float y, void *data)
{
struct fullscreen *fullscreen = data;
fullscreen->focussed++;
fullscreen->pointer_x = x;
fullscreen->pointer_y = y;
widget_schedule_redraw(widget);
return fullscreen->draw_cursor ? CURSOR_BLANK : CURSOR_LEFT_PTR;
}
static void
leave_handler(struct widget *widget,
struct input *input, void *data)
{
struct fullscreen *fullscreen = data;
fullscreen->focussed--;
widget_schedule_redraw(widget);
}
static void
button_handler(struct widget *widget,
@ -369,6 +437,25 @@ touch_handler(struct widget *widget, struct input *input,
window_move(fullscreen->window, input, display_get_serial(fullscreen->display));
}
static void
fshell_capability_handler(void *data, struct _wl_fullscreen_shell *fshell,
uint32_t capability)
{
struct fullscreen *fullscreen = data;
switch (capability) {
case _WL_FULLSCREEN_SHELL_CAPABILITY_CURSOR_PLANE:
fullscreen->draw_cursor = 0;
break;
default:
break;
}
}
struct _wl_fullscreen_shell_listener fullscreen_shell_listener = {
fshell_capability_handler
};
static void
usage(int error_code)
{
@ -406,6 +493,9 @@ global_handler(struct display *display, uint32_t id, const char *interface,
fullscreen->fshell = display_bind(display, id,
&_wl_fullscreen_shell_interface,
1);
_wl_fullscreen_shell_add_listener(fullscreen->fshell,
&fullscreen_shell_listener,
fullscreen);
}
}
@ -418,6 +508,7 @@ int main(int argc, char *argv[])
fullscreen.width = 640;
fullscreen.height = 480;
fullscreen.fullscreen = 0;
fullscreen.focussed = 0;
fullscreen.present_method = _WL_FULLSCREEN_SHELL_PRESENT_METHOD_DEFAULT;
wl_list_init(&fullscreen.output_list);
fullscreen.current_output = NULL;
@ -457,9 +548,11 @@ int main(int argc, char *argv[])
window_get_wl_surface(fullscreen.window),
fullscreen.present_method,
NULL);
/* If we get the CURSOR_PLANE capability, we'll change this */
fullscreen.draw_cursor = 1;
} else {
fullscreen.window = window_create(d);
fullscreen.draw_cursor = 0;
}
fullscreen.widget =
@ -468,12 +561,14 @@ int main(int argc, char *argv[])
window_set_title(fullscreen.window, "Fullscreen");
widget_set_transparent(fullscreen.widget, 0);
widget_set_default_cursor(fullscreen.widget, CURSOR_LEFT_PTR);
widget_set_default_cursor(fullscreen.widget, CURSOR_LEFT_PTR);
widget_set_resize_handler(fullscreen.widget, resize_handler);
widget_set_redraw_handler(fullscreen.widget, redraw_handler);
widget_set_button_handler(fullscreen.widget, button_handler);
widget_set_motion_handler(fullscreen.widget, motion_handler);
widget_set_enter_handler(fullscreen.widget, enter_handler);
widget_set_leave_handler(fullscreen.widget, leave_handler);
widget_set_touch_down_handler(fullscreen.widget, touch_handler);