xwayland: parse normal hints

This commit is contained in:
emersion 2017-10-05 12:32:12 +02:00
parent ef5914bdb6
commit ed9796ec68
No known key found for this signature in database
GPG Key ID: 0FDE7BE0E88F5E48
4 changed files with 25 additions and 3 deletions

View File

@ -6,6 +6,10 @@
#include <wlr/types/wlr_compositor.h> #include <wlr/types/wlr_compositor.h>
#include <xcb/xcb.h> #include <xcb/xcb.h>
#ifdef HAS_XCB_ICCCM
#include <xcb/xcb_icccm.h>
#endif
struct wlr_xwm; struct wlr_xwm;
struct wlr_xwayland { struct wlr_xwayland {
@ -54,6 +58,9 @@ struct wlr_xwayland_surface {
size_t protocols_len; size_t protocols_len;
uint32_t motif_hints[5]; uint32_t motif_hints[5];
#ifdef HAS_XCB_ICCCM
xcb_size_hints_t size_hints;
#endif
struct { struct {
struct wl_signal destroy; struct wl_signal destroy;

View File

@ -45,12 +45,17 @@ udev = dependency('libudev')
pixman = dependency('pixman-1') pixman = dependency('pixman-1')
xcb = dependency('xcb') xcb = dependency('xcb')
xcb_composite = dependency('xcb-composite') xcb_composite = dependency('xcb-composite')
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)
systemd = dependency('libsystemd', required: false) systemd = dependency('libsystemd', required: false)
elogind = dependency('libelogind', required: false) elogind = dependency('libelogind', required: false)
math = cc.find_library('m', required: false) math = cc.find_library('m', required: false)
if xcb_icccm.found()
add_project_arguments('-DHAS_XCB_ICCCM', language: 'c')
endif
if libcap.found() and get_option('enable_libcap') if libcap.found() and get_option('enable_libcap')
add_project_arguments('-DHAS_LIBCAP', language: 'c') add_project_arguments('-DHAS_LIBCAP', language: 'c')
endif endif

View File

@ -6,5 +6,5 @@ lib_wlr_xwayland = static_library(
'xwm.c', 'xwm.c',
), ),
include_directories: wlr_inc, include_directories: wlr_inc,
dependencies: [wayland_server, xcb, xcb_composite, pixman], dependencies: [wayland_server, xcb, xcb_composite, xcb_icccm, pixman],
) )

View File

@ -8,6 +8,10 @@
#include "wlr/xwayland.h" #include "wlr/xwayland.h"
#include "xwm.h" #include "xwm.h"
#ifdef HAS_XCB_ICCCM
#include <xcb/xcb_icccm.h>
#endif
const char *atom_map[ATOM_LAST] = { const char *atom_map[ATOM_LAST] = {
"WL_SURFACE_ID", "WL_SURFACE_ID",
"WM_DELETE_WINDOW", "WM_DELETE_WINDOW",
@ -272,17 +276,23 @@ static void read_surface_protocols(struct wlr_xwm *xwm,
wlr_log(L_DEBUG, "WM_PROTOCOLS (%zu)", atoms_len); wlr_log(L_DEBUG, "WM_PROTOCOLS (%zu)", atoms_len);
} }
#ifdef HAS_XCB_ICCCM
static void read_surface_normal_hints(struct wlr_xwm *xwm, static void read_surface_normal_hints(struct wlr_xwm *xwm,
struct wlr_xwayland_surface *surface, xcb_get_property_reply_t *reply) { struct wlr_xwayland_surface *surface, xcb_get_property_reply_t *reply) {
if (reply->type != xwm->atoms[WM_SIZE_HINTS]) { if (reply->type != xwm->atoms[WM_SIZE_HINTS]) {
return; return;
} }
// TODO: xcb_icccm_get_wm_size_hints_from_reply xcb_icccm_get_wm_size_hints_from_reply(&surface->size_hints, reply);
// See https://github.com/i3/i3/blob/55bc6741796e8b179b6111a721a3e9631934bb86/src/handlers.c#L994
wlr_log(L_DEBUG, "WM_NORMAL_HINTS (%d)", reply->value_len); wlr_log(L_DEBUG, "WM_NORMAL_HINTS (%d)", reply->value_len);
} }
#else
static void read_surface_normal_hints(struct wlr_xwm *xwm,
struct wlr_xwayland_surface *surface, xcb_get_property_reply_t *reply) {
// Do nothing
}
#endif
static void read_surface_motif_hints(struct wlr_xwm *xwm, static void read_surface_motif_hints(struct wlr_xwm *xwm,
struct wlr_xwayland_surface *surface, xcb_get_property_reply_t *reply) { struct wlr_xwayland_surface *surface, xcb_get_property_reply_t *reply) {