More cleanups; added missing request_cursor functionality

This commit is contained in:
Keith Bowes 2020-02-22 21:30:44 -05:00
parent 8bc4352eb8
commit cd96e1c124
6 changed files with 43 additions and 17 deletions

View file

@ -25,9 +25,11 @@ struct wb_cursor {
struct wl_listener cursor_button; struct wl_listener cursor_button;
struct wl_listener cursor_axis; struct wl_listener cursor_axis;
struct wl_listener cursor_frame; struct wl_listener cursor_frame;
struct wl_listener request_cursor;
}; };
struct wb_cursor *wb_cursor_create(); struct wb_cursor *wb_cursor_create(struct wb_server *server);
void wb_cursor_destroy(struct wb_cursor *cursor); void wb_cursor_destroy(struct wb_cursor *cursor);
#endif // cursor.h #endif // cursor.h

View file

@ -20,7 +20,6 @@
struct wb_output { struct wb_output {
struct wlr_output *wlr_output; struct wlr_output *wlr_output;
struct wb_server *server; struct wb_server *server;
struct timespec last_frame;
struct wl_listener destroy; struct wl_listener destroy;
struct wl_listener frame; struct wl_listener frame;

View file

@ -6,7 +6,6 @@
#endif #endif
#define _POSIX_C_SOURCE 200112L #define _POSIX_C_SOURCE 200112L
#include <assert.h>
#include <stdio.h> #include <stdio.h>
#include <wlr/backend.h> #include <wlr/backend.h>
@ -28,7 +27,6 @@
struct wb_server { struct wb_server {
struct wl_display *wl_display; struct wl_display *wl_display;
struct wl_event_loop *wl_event_loop;
struct wlr_backend *backend; struct wlr_backend *backend;
struct wlr_compositor *compositor; struct wlr_compositor *compositor;

View file

@ -140,9 +140,30 @@ static void handle_cursor_frame(struct wl_listener *listener, void *data) {
wlr_seat_pointer_notify_frame(cursor->server->seat->seat); wlr_seat_pointer_notify_frame(cursor->server->seat->seat);
} }
struct wb_cursor *wb_cursor_create() { static void handle_cursor_request(struct wl_listener *listener, void *data) {
struct wb_cursor *cursor = wl_container_of(
listener, cursor, request_cursor);
/* This event is rasied by the seat when a client provides a cursor image */
struct wlr_seat_pointer_request_set_cursor_event *event = data;
struct wlr_seat_client *focused_client =
cursor->server->seat->seat->pointer_state.focused_client;
/* This can be sent by any client, so we check to make sure this one is
* actually has pointer focus first. */
if (focused_client == event->seat_client) {
/* Once we've vetted the client, we can tell the cursor to use the
* provided surface as the cursor image. It will set the hardware cursor
* on the output that it's currently on and continue to do so as the
* cursor moves between outputs. */
wlr_cursor_set_surface(cursor->cursor, event->surface,
event->hotspot_x, event->hotspot_y);
}
}
struct wb_cursor *wb_cursor_create(struct wb_server *server) {
struct wb_cursor *cursor = malloc(sizeof(struct wb_cursor)); struct wb_cursor *cursor = malloc(sizeof(struct wb_cursor));
cursor->cursor = wlr_cursor_create(); cursor->cursor = wlr_cursor_create();
cursor->server = server;
cursor->xcursor_manager = wlr_xcursor_manager_create("default", 24); cursor->xcursor_manager = wlr_xcursor_manager_create("default", 24);
wlr_xcursor_manager_load(cursor->xcursor_manager, 1); wlr_xcursor_manager_load(cursor->xcursor_manager, 1);
@ -161,6 +182,12 @@ struct wb_cursor *wb_cursor_create() {
cursor->cursor_frame.notify = handle_cursor_frame; cursor->cursor_frame.notify = handle_cursor_frame;
wl_signal_add(&cursor->cursor->events.frame, &cursor->cursor_frame); wl_signal_add(&cursor->cursor->events.frame, &cursor->cursor_frame);
cursor->request_cursor.notify = handle_cursor_request;
wl_signal_add(&server->seat->seat->events.request_set_cursor,
&cursor->request_cursor);
wlr_cursor_attach_output_layout(cursor->cursor, server->layout);
return cursor; return cursor;
} }

View file

@ -105,7 +105,6 @@ void output_frame_notify(struct wl_listener *listener, void *data) {
wlr_renderer_end(renderer); wlr_renderer_end(renderer);
wlr_output_commit(wlr_output); wlr_output_commit(wlr_output);
output->last_frame = now;
} }
void output_destroy_notify(struct wl_listener *listener, void *data) { void output_destroy_notify(struct wl_listener *listener, void *data) {
@ -134,7 +133,6 @@ void new_output_notify(struct wl_listener *listener, void *data) {
} }
struct wb_output *output = calloc(1, sizeof(struct wb_output)); struct wb_output *output = calloc(1, sizeof(struct wb_output));
clock_gettime(CLOCK_MONOTONIC, &output->last_frame);
output->server = server; output->server = server;
output->wlr_output = wlr_output; output->wlr_output = wlr_output;
wl_list_insert(&server->outputs, &output->link); wl_list_insert(&server->outputs, &output->link);

View file

@ -5,15 +5,13 @@ bool init_wb(struct wb_server* server) {
// create display // create display
server->wl_display = wl_display_create(); server->wl_display = wl_display_create();
assert(server->wl_display); if (server->wl_display == NULL) {
fprintf(stderr, "Failed to connect to a Wayland display\n");
// event loop stuff return false;
server->wl_event_loop = wl_display_get_event_loop(server->wl_display); }
assert(server->wl_event_loop);
// create backend // create backend
server->backend = wlr_backend_autocreate(server->wl_display, NULL); server->backend = wlr_backend_autocreate(server->wl_display, NULL);
assert(server->backend);
if (server->backend == NULL) { if (server->backend == NULL) {
printf("Failed to create backend\n"); printf("Failed to create backend\n");
return false; return false;
@ -23,10 +21,8 @@ bool init_wb(struct wb_server* server) {
wlr_renderer_init_wl_display(server->renderer, server->wl_display); wlr_renderer_init_wl_display(server->renderer, server->wl_display);
server->layout = wlr_output_layout_create(); server->layout = wlr_output_layout_create();
server->cursor = wb_cursor_create();
server->cursor->server = server;
wlr_cursor_attach_output_layout(server->cursor->cursor, server->layout);
server->seat = wb_seat_create(server); server->seat = wb_seat_create(server);
server->cursor = wb_cursor_create(server);
return true; return true;
} }
@ -38,10 +34,15 @@ bool start_wb(struct wb_server* server) {
wl_signal_add(&server->backend->events.new_output, &server->new_output); wl_signal_add(&server->backend->events.new_output, &server->new_output);
const char *socket = wl_display_add_socket_auto(server->wl_display); const char *socket = wl_display_add_socket_auto(server->wl_display);
assert(socket); if (!socket)
{
wlr_backend_destroy(server->backend);
return false;
}
if (!wlr_backend_start(server->backend)) { if (!wlr_backend_start(server->backend)) {
fprintf(stderr, "Failed to start backend\n"); fprintf(stderr, "Failed to start backend\n");
wlr_backend_destroy(server->backend);
wl_display_destroy(server->wl_display); wl_display_destroy(server->wl_display);
return false; return false;
} }
@ -64,6 +65,7 @@ bool start_wb(struct wb_server* server) {
} }
bool terminate_wb(struct wb_server* server) { bool terminate_wb(struct wb_server* server) {
wl_display_destroy_clients(server->wl_display);
wb_cursor_destroy(server->cursor); wb_cursor_destroy(server->cursor);
wb_seat_destroy(server->seat); wb_seat_destroy(server->seat);
wlr_output_layout_destroy(server->layout); wlr_output_layout_destroy(server->layout);