Set xwayland root cursor

This commit is contained in:
emersion 2017-11-02 00:03:55 +01:00
parent 63a46c6550
commit bdaf66a292
No known key found for this signature in database
GPG Key ID: 0FDE7BE0E88F5E48
3 changed files with 33 additions and 5 deletions

View File

@ -52,6 +52,7 @@ pixman = dependency('pixman-1')
xcb = dependency('xcb') xcb = dependency('xcb')
xcb_composite = dependency('xcb-composite') xcb_composite = dependency('xcb-composite')
xcb_xfixes = dependency('xcb-xfixes') xcb_xfixes = dependency('xcb-xfixes')
xcb_image = dependency('xcb-image')
xcb_icccm = dependency('xcb-icccm', required: false) xcb_icccm = dependency('xcb-icccm', required: false)
x11_xcb = dependency('x11-xcb') x11_xcb = dependency('x11-xcb')
libcap = dependency('libcap', required: false) libcap = dependency('libcap', required: false)

View File

@ -11,6 +11,7 @@ lib_wlr_xwayland = static_library(
xcb, xcb,
xcb_composite, xcb_composite,
xcb_xfixes, xcb_xfixes,
xcb_image,
xcb_icccm, xcb_icccm,
pixman, pixman,
], ],

View File

@ -5,6 +5,7 @@
#include <unistd.h> #include <unistd.h>
#include <xcb/composite.h> #include <xcb/composite.h>
#include <xcb/xfixes.h> #include <xcb/xfixes.h>
#include <xcb/xcb_image.h>
#include "wlr/util/log.h" #include "wlr/util/log.h"
#include "wlr/types/wlr_surface.h" #include "wlr/types/wlr_surface.h"
#include "wlr/xwayland.h" #include "wlr/xwayland.h"
@ -1220,15 +1221,40 @@ struct wlr_xwm *xwm_create(struct wlr_xwayland *wlr_xwayland) {
xwm_get_resources(xwm); xwm_get_resources(xwm);
xwm_get_visual_and_colormap(xwm); xwm_get_visual_and_colormap(xwm);
uint32_t values[1]; xcb_cursor_t cursor = xcb_generate_id(xwm->xcb_conn);
values[0] =
{
// Create root cursor
uint8_t data[] = {
0x00, 0x00, 0xfe, 0x07, 0xfe, 0x03, 0xfe, 0x01, 0xfe, 0x01, 0xfe, 0x03,
0xfe, 0x07, 0xfe, 0x0f, 0xfe, 0x1f, 0xe6, 0x0f, 0xc2, 0x07, 0x80, 0x03,
0x00, 0x01, 0x00, 0x00
};
uint8_t mask[] = {
0xff, 0x3f, 0xff, 0x1f, 0xff, 0x07, 0xff, 0x03, 0xff, 0x03, 0xff, 0x07,
0xff, 0x0f, 0xff, 0x1f, 0xff, 0x3f, 0xff, 0x1f, 0xe7, 0x0f, 0xc3, 0x07,
0x83, 0x03, 0x01, 0x01
};
xcb_pixmap_t cp = xcb_create_pixmap_from_bitmap_data(xwm->xcb_conn, xwm->screen->root, data, 14, 14, 1, 0, 0, 0);
xcb_pixmap_t mp = xcb_create_pixmap_from_bitmap_data(xwm->xcb_conn, xwm->screen->root, mask, 14, 14, 1, 0, 0, 0);
xcb_create_cursor(xwm->xcb_conn, cursor, cp, mp, 0, 0, 0, 0xFFFF, 0xFFFF, 0xFFFF, 0, 0);
xcb_free_pixmap(xwm->xcb_conn, cp);
xcb_free_pixmap(xwm->xcb_conn, mp);
}
uint32_t values[] = {
XCB_EVENT_MASK_SUBSTRUCTURE_NOTIFY | XCB_EVENT_MASK_SUBSTRUCTURE_NOTIFY |
XCB_EVENT_MASK_SUBSTRUCTURE_REDIRECT | XCB_EVENT_MASK_SUBSTRUCTURE_REDIRECT |
XCB_EVENT_MASK_PROPERTY_CHANGE; XCB_EVENT_MASK_PROPERTY_CHANGE,
cursor,
};
xcb_change_window_attributes(xwm->xcb_conn, xcb_change_window_attributes(xwm->xcb_conn,
xwm->screen->root, xwm->screen->root,
XCB_CW_EVENT_MASK /* | XCB_CW_CURSOR */, XCB_CW_EVENT_MASK | XCB_CW_CURSOR,
values); values);
xcb_composite_redirect_subwindows(xwm->xcb_conn, xcb_composite_redirect_subwindows(xwm->xcb_conn,