Merge pull request #707 from ascent12/xcb_fixes

Xcb fixes
master
emersion 7 years ago committed by GitHub
commit 36dcad13d0
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -15,7 +15,7 @@ static void input_device_destroy(struct wlr_input_device *wlr_dev) {
free(device); 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, .destroy = input_device_destroy,
}; };

@ -31,7 +31,7 @@ static void wlr_libinput_device_destroy(struct wlr_input_device *_dev) {
free(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 .destroy = wlr_libinput_device_destroy
}; };

@ -15,7 +15,6 @@
#include <wlr/render/gles2.h> #include <wlr/render/gles2.h>
#include <wlr/util/log.h> #include <wlr/util/log.h>
#include <X11/Xlib-xcb.h> #include <X11/Xlib-xcb.h>
#include <xcb/glx.h>
#include <xcb/xcb.h> #include <xcb/xcb.h>
#ifdef __linux__ #ifdef __linux__
#include <linux/input-event-codes.h> #include <linux/input-event-codes.h>
@ -25,9 +24,11 @@
#include "backend/x11.h" #include "backend/x11.h"
#include "util/signal.h" #include "util/signal.h"
static struct wlr_backend_impl backend_impl; #define XCB_EVENT_RESPONSE_TYPE_MASK 0x7f
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) { static uint32_t xcb_button_to_wl(uint32_t button) {
switch (button) { switch (button) {
@ -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) { static bool handle_x11_event(struct wlr_x11_backend *x11, xcb_generic_event_t *event) {
struct wlr_x11_output *output = &x11->output; struct wlr_x11_output *output = &x11->output;
switch (event->response_type) { switch (event->response_type & XCB_EVENT_RESPONSE_TYPE_MASK) {
case XCB_EXPOSE: { case XCB_EXPOSE: {
wlr_output_send_frame(&output->wlr_output); wlr_output_send_frame(&output->wlr_output);
break; 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); wlr_signal_emit_safe(&x11->pointer.events.motion_absolute, &abs);
break; break;
} }
case XCB_GLX_DELETE_QUERIES_ARB: { case XCB_CLIENT_MESSAGE: {
wl_display_terminate(x11->wl_display); xcb_client_message_event_t *ev = (xcb_client_message_event_t *)event;
return true;
if (ev->data.data32[0] == x11->atoms.wm_delete_window) {
wl_display_terminate(x11->wl_display);
return true;
}
break; break;
} }
default: default:
@ -181,13 +187,6 @@ static int signal_frame(void *data) {
return 0; 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) { 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); 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; return false;
} }
init_atom(x11, &x11->atoms.wm_protocols, 1, "WM_PROTOCOLS"); struct {
init_atom(x11, &x11->atoms.wm_delete_window, 0, "WM_DELETE_WINDOW"); const char *name;
init_atom(x11, &x11->atoms.net_wm_name, 1, "_NET_WM_NAME"); xcb_intern_atom_cookie_t cookie;
init_atom(x11, &x11->atoms.utf8_string, 0, "UTF8_STRING"); 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, 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_protocols, XCB_ATOM_ATOM, 32, 1,
&x11->atoms.wm_delete_window.reply->atom); &x11->atoms.wm_delete_window);
char title[32]; char title[32];
if (snprintf(title, sizeof(title), "wlroots - %s", output->wlr_output.name)) { if (snprintf(title, sizeof(title), "wlroots - %s", output->wlr_output.name)) {
xcb_change_property(x11->xcb_conn, XCB_PROP_MODE_REPLACE, output->win, xcb_change_property(x11->xcb_conn, XCB_PROP_MODE_REPLACE, output->win,
x11->atoms.net_wm_name.reply->atom, x11->atoms.net_wm_name, x11->atoms.utf8_string, 8,
x11->atoms.utf8_string.reply->atom, 8,
strlen(title), title); strlen(title), title);
} }
@ -304,7 +337,7 @@ static struct wlr_renderer *wlr_x11_backend_get_renderer(
return x11->renderer; return x11->renderer;
} }
static struct wlr_backend_impl backend_impl = { static const struct wlr_backend_impl backend_impl = {
.start = wlr_x11_backend_start, .start = wlr_x11_backend_start,
.destroy = wlr_x11_backend_destroy, .destroy = wlr_x11_backend_destroy,
.get_egl = wlr_x11_backend_get_egl, .get_egl = wlr_x11_backend_get_egl,
@ -432,7 +465,7 @@ static bool output_swap_buffers(struct wlr_output *wlr_output,
return wlr_egl_swap_buffers(&x11->egl, output->surf, damage); 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, .set_custom_mode = output_set_custom_mode,
.transform = output_transform, .transform = output_transform,
.destroy = output_destroy, .destroy = output_destroy,

@ -17,11 +17,6 @@ struct wlr_x11_output {
EGLSurface surf; EGLSurface surf;
}; };
struct wlr_x11_atom {
xcb_intern_atom_cookie_t cookie;
xcb_intern_atom_reply_t *reply;
};
struct wlr_x11_backend { struct wlr_x11_backend {
struct wlr_backend backend; struct wlr_backend backend;
struct wl_display *wl_display; struct wl_display *wl_display;
@ -44,10 +39,10 @@ struct wlr_x11_backend {
struct wl_event_source *frame_timer; struct wl_event_source *frame_timer;
struct { struct {
struct wlr_x11_atom wm_protocols; xcb_atom_t wm_protocols;
struct wlr_x11_atom wm_delete_window; xcb_atom_t wm_delete_window;
struct wlr_x11_atom net_wm_name; xcb_atom_t net_wm_name;
struct wlr_x11_atom utf8_string; xcb_atom_t utf8_string;
} atoms; } atoms;
// The time we last received an event // The time we last received an event

@ -10,7 +10,7 @@ struct wlr_input_device_impl {
void wlr_input_device_init( void wlr_input_device_init(
struct wlr_input_device *wlr_device, struct wlr_input_device *wlr_device,
enum wlr_input_device_type type, 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); const char *name, int vendor, int product);
void wlr_input_device_destroy(struct wlr_input_device *dev); void wlr_input_device_destroy(struct wlr_input_device *dev);

@ -24,7 +24,7 @@ enum wlr_input_device_type {
struct wlr_input_device_impl; struct wlr_input_device_impl;
struct wlr_input_device { struct wlr_input_device {
struct wlr_input_device_impl *impl; const struct wlr_input_device_impl *impl;
enum wlr_input_device_type type; enum wlr_input_device_type type;
int vendor, product; int vendor, product;

@ -14,7 +14,7 @@
void wlr_input_device_init(struct wlr_input_device *dev, void wlr_input_device_init(struct wlr_input_device *dev,
enum wlr_input_device_type type, 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) { const char *name, int vendor, int product) {
dev->type = type; dev->type = type;
dev->impl = impl; dev->impl = impl;

Loading…
Cancel
Save