From 902d6cc240c5ecb5a19cf67173b968bfed34c565 Mon Sep 17 00:00:00 2001 From: Scott Anderson Date: Tue, 6 Mar 2018 19:57:39 +1300 Subject: Use xcb atoms properly --- backend/x11/backend.c | 73 +++++++++++++++++++++++++++++++++++++-------------- 1 file changed, 53 insertions(+), 20 deletions(-) (limited to 'backend/x11/backend.c') diff --git a/backend/x11/backend.c b/backend/x11/backend.c index 8633ece3..87ba1570 100644 --- a/backend/x11/backend.c +++ b/backend/x11/backend.c @@ -15,7 +15,6 @@ #include #include #include -#include #include #ifdef __linux__ #include @@ -25,6 +24,8 @@ #include "backend/x11.h" #include "util/signal.h" +#define XCB_EVENT_RESPONSE_TYPE_MASK 0x7f + static struct wlr_backend_impl backend_impl; static struct wlr_output_impl output_impl; static struct wlr_input_device_impl input_device_impl = { 0 }; @@ -44,7 +45,7 @@ static uint32_t xcb_button_to_wl(uint32_t button) { static bool handle_x11_event(struct wlr_x11_backend *x11, xcb_generic_event_t *event) { struct wlr_x11_output *output = &x11->output; - switch (event->response_type) { + switch (event->response_type & XCB_EVENT_RESPONSE_TYPE_MASK) { case XCB_EXPOSE: { wlr_output_send_frame(&output->wlr_output); break; @@ -144,9 +145,14 @@ static bool handle_x11_event(struct wlr_x11_backend *x11, xcb_generic_event_t *e wlr_signal_emit_safe(&x11->pointer.events.motion_absolute, &abs); break; } - case XCB_GLX_DELETE_QUERIES_ARB: { - wl_display_terminate(x11->wl_display); - return true; + case XCB_CLIENT_MESSAGE: { + xcb_client_message_event_t *ev = (xcb_client_message_event_t *)event; + + if (ev->data.data32[0] == x11->atoms.wm_delete_window) { + wl_display_terminate(x11->wl_display); + return true; + } + break; } default: @@ -181,13 +187,6 @@ static int signal_frame(void *data) { return 0; } -static void init_atom(struct wlr_x11_backend *x11, struct wlr_x11_atom *atom, - uint8_t only_if_exists, const char *name) { - atom->cookie = xcb_intern_atom(x11->xcb_conn, only_if_exists, strlen(name), - name); - atom->reply = xcb_intern_atom_reply(x11->xcb_conn, atom->cookie, NULL); -} - static void parse_xcb_setup(struct wlr_output *output, xcb_connection_t *xcb_conn) { const xcb_setup_t *xcb_setup = xcb_get_setup(xcb_conn); @@ -231,20 +230,54 @@ static bool wlr_x11_backend_start(struct wlr_backend *backend) { return false; } - init_atom(x11, &x11->atoms.wm_protocols, 1, "WM_PROTOCOLS"); - init_atom(x11, &x11->atoms.wm_delete_window, 0, "WM_DELETE_WINDOW"); - init_atom(x11, &x11->atoms.net_wm_name, 1, "_NET_WM_NAME"); - init_atom(x11, &x11->atoms.utf8_string, 0, "UTF8_STRING"); + struct { + const char *name; + xcb_intern_atom_cookie_t cookie; + xcb_atom_t *atom; + } atom[] = { + { + .name = "WM_PROTOCOLS", + .atom = &x11->atoms.wm_protocols, + }, + { + .name = "WM_DELETE_WINDOW", + .atom = &x11->atoms.wm_delete_window, + }, + { + .name = "_NET_WM_NAME", + .atom = &x11->atoms.net_wm_name, + }, + { + .name = "UTF8_STRING", + .atom = &x11->atoms.utf8_string, + }, + }; + + for (size_t i = 0; i < sizeof(atom) / sizeof(atom[0]); ++i) { + atom[i].cookie = xcb_intern_atom(x11->xcb_conn, + true, strlen(atom[i].name), atom[i].name); + } + + for (size_t i = 0; i < sizeof(atom) / sizeof(atom[0]); ++i) { + xcb_intern_atom_reply_t *reply = xcb_intern_atom_reply( + x11->xcb_conn, atom[i].cookie, NULL); + + if (reply) { + *atom[i].atom = reply->atom; + free(reply); + } else { + *atom[i].atom = XCB_ATOM_NONE; + } + } xcb_change_property(x11->xcb_conn, XCB_PROP_MODE_REPLACE, output->win, - x11->atoms.wm_protocols.reply->atom, XCB_ATOM_ATOM, 32, 1, - &x11->atoms.wm_delete_window.reply->atom); + x11->atoms.wm_protocols, XCB_ATOM_ATOM, 32, 1, + &x11->atoms.wm_delete_window); char title[32]; if (snprintf(title, sizeof(title), "wlroots - %s", output->wlr_output.name)) { xcb_change_property(x11->xcb_conn, XCB_PROP_MODE_REPLACE, output->win, - x11->atoms.net_wm_name.reply->atom, - x11->atoms.utf8_string.reply->atom, 8, + x11->atoms.net_wm_name, x11->atoms.utf8_string, 8, strlen(title), title); } -- cgit v1.2.3 From 3c9fc7c68ec7e0474f40bedc33d55862e03af057 Mon Sep 17 00:00:00 2001 From: Scott Anderson Date: Tue, 6 Mar 2018 19:59:10 +1300 Subject: Add const to x11 and input interfaces --- backend/headless/input_device.c | 2 +- backend/libinput/events.c | 2 +- backend/x11/backend.c | 10 +++++----- include/wlr/interfaces/wlr_input_device.h | 2 +- include/wlr/types/wlr_input_device.h | 2 +- types/wlr_input_device.c | 2 +- 6 files changed, 10 insertions(+), 10 deletions(-) (limited to 'backend/x11/backend.c') diff --git a/backend/headless/input_device.c b/backend/headless/input_device.c index ea335aff..daa22436 100644 --- a/backend/headless/input_device.c +++ b/backend/headless/input_device.c @@ -15,7 +15,7 @@ static void input_device_destroy(struct wlr_input_device *wlr_dev) { free(device); } -static struct wlr_input_device_impl input_device_impl = { +static const struct wlr_input_device_impl input_device_impl = { .destroy = input_device_destroy, }; diff --git a/backend/libinput/events.c b/backend/libinput/events.c index 603eed07..d92de830 100644 --- a/backend/libinput/events.c +++ b/backend/libinput/events.c @@ -31,7 +31,7 @@ static void wlr_libinput_device_destroy(struct wlr_input_device *_dev) { free(dev); } -static struct wlr_input_device_impl input_device_impl = { +static const struct wlr_input_device_impl input_device_impl = { .destroy = wlr_libinput_device_destroy }; diff --git a/backend/x11/backend.c b/backend/x11/backend.c index 87ba1570..cb29e518 100644 --- a/backend/x11/backend.c +++ b/backend/x11/backend.c @@ -26,9 +26,9 @@ #define XCB_EVENT_RESPONSE_TYPE_MASK 0x7f -static struct wlr_backend_impl backend_impl; -static struct wlr_output_impl output_impl; -static struct wlr_input_device_impl input_device_impl = { 0 }; +static const struct wlr_backend_impl backend_impl; +static const struct wlr_output_impl output_impl; +static const struct wlr_input_device_impl input_device_impl = { 0 }; static uint32_t xcb_button_to_wl(uint32_t button) { switch (button) { @@ -337,7 +337,7 @@ static struct wlr_renderer *wlr_x11_backend_get_renderer( return x11->renderer; } -static struct wlr_backend_impl backend_impl = { +static const struct wlr_backend_impl backend_impl = { .start = wlr_x11_backend_start, .destroy = wlr_x11_backend_destroy, .get_egl = wlr_x11_backend_get_egl, @@ -465,7 +465,7 @@ static bool output_swap_buffers(struct wlr_output *wlr_output, return wlr_egl_swap_buffers(&x11->egl, output->surf, damage); } -static struct wlr_output_impl output_impl = { +static const struct wlr_output_impl output_impl = { .set_custom_mode = output_set_custom_mode, .transform = output_transform, .destroy = output_destroy, diff --git a/include/wlr/interfaces/wlr_input_device.h b/include/wlr/interfaces/wlr_input_device.h index 2a681ff8..a5c513b7 100644 --- a/include/wlr/interfaces/wlr_input_device.h +++ b/include/wlr/interfaces/wlr_input_device.h @@ -10,7 +10,7 @@ struct wlr_input_device_impl { void wlr_input_device_init( struct wlr_input_device *wlr_device, enum wlr_input_device_type type, - struct wlr_input_device_impl *impl, + const struct wlr_input_device_impl *impl, const char *name, int vendor, int product); void wlr_input_device_destroy(struct wlr_input_device *dev); diff --git a/include/wlr/types/wlr_input_device.h b/include/wlr/types/wlr_input_device.h index 306a1166..6d8e3631 100644 --- a/include/wlr/types/wlr_input_device.h +++ b/include/wlr/types/wlr_input_device.h @@ -24,7 +24,7 @@ enum wlr_input_device_type { struct wlr_input_device_impl; struct wlr_input_device { - struct wlr_input_device_impl *impl; + const struct wlr_input_device_impl *impl; enum wlr_input_device_type type; int vendor, product; diff --git a/types/wlr_input_device.c b/types/wlr_input_device.c index 65d4b1d6..713d911a 100644 --- a/types/wlr_input_device.c +++ b/types/wlr_input_device.c @@ -14,7 +14,7 @@ void wlr_input_device_init(struct wlr_input_device *dev, enum wlr_input_device_type type, - struct wlr_input_device_impl *impl, + const struct wlr_input_device_impl *impl, const char *name, int vendor, int product) { dev->type = type; dev->impl = impl; -- cgit v1.2.3