kick/meson.build

522 lines
23 KiB
Meson

project('kick', 'c',
version: '0.1.0',
meson_version: '>=1.0',
default_options: ['c_std=c11', 'warning_level=2'])
wlroots_ver = '>=0.20,<0.21'
# wlroots' pkg-config name varies between distributions (wlroots-0.20 on
# Debian/Ubuntu, plain wlroots on Arch/Fedora). Prefer the system copy, and
# fall back to a pinned source build from subprojects/wlroots.wrap when no
# matching system library is found.
wlroots = dependency('wlroots-0.20', version: wlroots_ver, required: false)
if not wlroots.found()
wlroots = dependency('wlroots', version: wlroots_ver, required: false)
endif
if not wlroots.found()
wlroots_subproj = subproject('wlroots',
default_options: ['examples=false', 'werror=false'])
wlroots = wlroots_subproj.get_variable('wlroots')
endif
deps = [
wlroots,
dependency('wayland-server'),
dependency('wayland-client'),
dependency('wayland-egl'),
dependency('xkbcommon'),
dependency('egl'),
dependency('glesv2'),
# Overlay tab-title text via Pango+Cairo (the labwc/sway/mutter stack):
# shaping, UTF-8 and fontconfig fallback in, no hand-rolled atlas.
dependency('pangocairo'),
dependency('libpng'),
dependency('librsvg-2.0'),
# Direct pixman use in kick.c (pointer-constraint region extents).
dependency('pixman-1'),
# Server-side/client-side window decorations via libdecor (nested mode).
dependency('libdecor-0'),
]
cc = meson.get_compiler('c')
libm = cc.find_library('m', required: false)
if libm.found()
deps += libm
endif
# --- XWayland (optional) ------------------------------------------------
# Enabling XWayland needs two things: the linked wlroots built with xwayland
# (advertised publicly as WLR_HAS_XWAYLAND in <wlr/config.h>, checked in
# kick.c) and the xcb dev packages pulled in by <wlr/xwayland/xwayland.h>.
# When either is missing the build stays green and kick simply runs without
# X11 support.
xcb_deps = []
xcb_all = true
foreach depname : ['xcb', 'xcb-icccm', 'xcb-ewmh']
d = dependency(depname, required: false)
if d.found()
xcb_deps += d
else
xcb_all = false
endif
endforeach
deps += xcb_deps
kick_c_args = ['-DWLR_USE_UNSTABLE']
if xcb_all
kick_c_args += ['-DKICK_HAVE_XCB=1']
endif
# --- Wayland protocol stubs -------------------------------------------
# The protocol implementation and headers are generated at build time by
# wayland-scanner instead of being committed, so they always match the
# installed wayland-protocols (the previously committed copies were produced
# by wayland-scanner 1.24/1.26 and drifted apart). Outputs land in the build
# directory, which Meson adds to every target's include path automatically;
# that also satisfies the bundled wlroots subproject's wlr_xdg_shell.h and its
# quoted #include "xdg-shell-protocol.h".
wayland_protocols = dependency('wayland-protocols', version: '>=1.17',
fallback: 'wayland-protocols', default_options: ['tests=false'])
wl_protocols_dir = wayland_protocols.get_variable('pkgdatadir')
wayland_scanner_dep = dependency('wayland-scanner', native: true)
wayland_scanner = find_program(
wayland_scanner_dep.get_variable('wayland_scanner'))
# (input xml, output base name). The output base names keep historical
# suffixes: xdg-shell is generated plain because the sources #include that
# exact name.
protocols = {
'xdg-shell': [
wl_protocols_dir / 'stable/xdg-shell/xdg-shell.xml',
'xdg-shell',
],
# xdg-decoration is the unstable-v1 protocol but keeps the plain
# "xdg-decoration" base name because the host-window code includes
# those exact generated names (SSD-compositor direct path).
'xdg-decoration': [
wl_protocols_dir / 'unstable/xdg-decoration/xdg-decoration-unstable-v1.xml',
'xdg-decoration',
],
'ext-data-control': [
wl_protocols_dir / 'staging/ext-data-control/ext-data-control-v1.xml',
'ext-data-control-v1',
],
# wlr-layer-shell is what waybar and other panels use to make an
# always-visible bar. Bundled locally (like the foreign-toplevel and
# output-management XMLs) rather than referenced from the wlroots tree,
# so it works with either a system wlroots or the pinned subproject.
'wlr-layer-shell-unstable-v1': [
'wlr-protocols/wlr-layer-shell-unstable-v1.xml',
'wlr-layer-shell-unstable-v1',
],
# wlr-foreign-toplevel-management is the taskbar protocol: a per-window
# handle with client-pull state. Bundled locally (like the layer-shell
# XML) so it works with either a system wlroots or the pinned subproject.
'wlr-foreign-toplevel-management-unstable-v1': [
'wlr-protocols/wlr-foreign-toplevel-management-unstable-v1.xml',
'wlr-foreign-toplevel-management',
],
# ext-foreign-toplevel-list ships as a staging protocol in
# wayland-protocols (>= 1.36); it is the shipman/taskbar-side read of the
# same per-window list, driven server-side rather than by the client.
'ext-foreign-toplevel-list': [
wl_protocols_dir / 'staging/ext-foreign-toplevel-list/ext-foreign-toplevel-list-v1.xml',
'ext-foreign-toplevel-list-v1',
],
# Idle: ext-idle-notify (a client asks for a timeout, the compositor fires
# "idle" once that much time passes without input) and idle-inhibit (a
# client can suppress idle notifications while its buffer stays up).
'ext-idle-notify': [
wl_protocols_dir / 'staging/ext-idle-notify/ext-idle-notify-v1.xml',
'ext-idle-notify-v1',
],
'idle-inhibit-unstable-v1': [
wl_protocols_dir / 'unstable/idle-inhibit/idle-inhibit-unstable-v1.xml',
'idle-inhibit-unstable-v1',
],
# Session lock: the lock client (swaylock) grabs the session and private
# protocol surfaces cover each output; the compositor blanking the screen
# while locked.
'ext-session-lock': [
wl_protocols_dir / 'staging/ext-session-lock/ext-session-lock-v1.xml',
'ext-session-lock-v1',
],
# Screen capture (ext-image-copy-capture-v1 + ext-image-capture-source-v1),
# the protocol grim uses. Staging protocols from wayland-protocols; the
# XMLs are referenced from the installed package.
'ext-image-copy-capture': [
wl_protocols_dir / 'staging/ext-image-copy-capture/ext-image-copy-capture-v1.xml',
'ext-image-copy-capture-v1',
],
'ext-image-capture-source': [
wl_protocols_dir / 'staging/ext-image-capture-source/ext-image-capture-source-v1.xml',
'ext-image-capture-source-v1',
],
# Tearing control (a surface asks for unthrottled presentation) and
# fractional scale (a surface learns a non-integer output scale).
# Both are staging protocols; tearing drives the output commit's
# async-flip flag from the shown surface's hint, fractional scale is
# notified from the output scale on claim.
'tearing-control': [
wl_protocols_dir / 'staging/tearing-control/tearing-control-v1.xml',
'tearing-control-v1',
],
'fractional-scale': [
wl_protocols_dir / 'staging/fractional-scale/fractional-scale-v1.xml',
'fractional-scale-v1',
],
# Output power management (a client blanks/unblanks an output). Bundled
# locally like the other wlr-protocols XMLs (copied from the pinned
# wlroots subproject).
'wlr-output-power-management-unstable-v1': [
'wlr-protocols/wlr-output-power-management-unstable-v1.xml',
'wlr-output-power-management-unstable-v1',
],
# Keyboard shortcuts inhibit (a fullscreen game/VM grabs the compositor's
# shortcuts). Unstable protocol; the test client binds it to prove the
# compositor activates the inhibitor for the focused surface.
'keyboard-shortcuts-inhibit': [
wl_protocols_dir / 'unstable/keyboard-shortcuts-inhibit/keyboard-shortcuts-inhibit-unstable-v1.xml',
'keyboard-shortcuts-inhibit-unstable-v1',
],
# Virtual keyboard/pointer (synthesised input from clients like wtype).
# Bundled locally (copied from the pinned wlroots subproject).
'virtual-keyboard-unstable-v1': [
'wlr-protocols/virtual-keyboard-unstable-v1.xml',
'virtual-keyboard-unstable-v1',
],
'wlr-virtual-pointer-unstable-v1': [
'wlr-protocols/wlr-virtual-pointer-unstable-v1.xml',
'wlr-virtual-pointer-unstable-v1',
],
# Xdg-activation (launchers focus windows by token). Staging protocol.
'xdg-activation': [
wl_protocols_dir / 'staging/xdg-activation/xdg-activation-v1.xml',
'xdg-activation-v1',
],
'cursor-shape': [
wl_protocols_dir / 'staging/cursor-shape/cursor-shape-v1.xml',
'cursor-shape-v1',
],
# cursor-shape-v1's get_tablet_tool_v2 request points at zwp_tablet_tool_v2,
# so its private code needs tablet-v2's generated code (wlroots' own copy is
# not exported: wlroots.syms keeps every non-wlr_* symbol local).
'tablet-v2': [
wl_protocols_dir / 'stable/tablet/tablet-v2.xml',
'tablet-v2',
],
'pointer-constraints': [
wl_protocols_dir / 'unstable/pointer-constraints/pointer-constraints-unstable-v1.xml',
'pointer-constraints-unstable-v1',
],
'relative-pointer': [
wl_protocols_dir / 'unstable/relative-pointer/relative-pointer-unstable-v1.xml',
'relative-pointer-unstable-v1',
],
'primary-selection': [
wl_protocols_dir / 'unstable/primary-selection/primary-selection-unstable-v1.xml',
'primary-selection-unstable-v1',
],
# Text input (OSK/IME): zwp_text_input_v3 (clients) + input-method-v2
# (the IME side). text-input comes from the system wayland-protocols;
# input-method-v2 only ships inside wlroots, so like the other bundled
# wlr-protocols XMLs it is vendored under wlr-protocols/ (Meson forbids
# referencing a nested subproject's files from the parent project).
'text-input': [
wl_protocols_dir / 'unstable/text-input/text-input-unstable-v3.xml',
'text-input-unstable-v3',
],
'input-method': [
'wlr-protocols/input-method-unstable-v2.xml',
'input-method-unstable-v2',
],
# Gamma control (night-light tools like wlsunset/gammastep): wlroots
# extension, vendored like the other wlr-protocols XMLs.
'gamma-control': [
'wlr-protocols/wlr-gamma-control-unstable-v1.xml',
'wlr-gamma-control-unstable-v1',
],
# xdg-dialog (modal toplevels): staging protocol from the system
# wayland-protocols. Only the client stub is generated for wltest;
# the server side is wlroots' wlr_xdg_wm_dialog_v1 (no quoted
# server-header include, so no extra custom_target needed).
'xdg-dialog': [
wl_protocols_dir / 'staging/xdg-dialog/xdg-dialog-v1.xml',
'xdg-dialog-v1',
],
# Pointer gestures (touchpad swipe/pinch/hold): unstable protocol
# from the system wayland-protocols. Only client stubs are needed
# for wltest; the server side is wlroots' wlr_pointer_gestures_v1
# (no quoted server-header include).
'pointer-gestures': [
wl_protocols_dir / 'unstable/pointer-gestures/pointer-gestures-unstable-v1.xml',
'pointer-gestures-unstable-v1',
],
# Toplevel icons (exact window artwork from the client): staging
# protocol from the system wayland-protocols. Only client stubs are
# needed for wltest; the server side is wlroots'
# wlr_xdg_toplevel_icon_manager_v1 (no quoted server-header include).
'toplevel-icon': [
wl_protocols_dir / 'staging/xdg-toplevel-icon/xdg-toplevel-icon-v1.xml',
'xdg-toplevel-icon-v1',
],
# Toplevel tags (client-supplied window labels like "settings" plus a
# translated description): staging protocol from the system
# wayland-protocols. Only client stubs are needed for wltest; the
# server side is wlroots' wlr_xdg_toplevel_tag_manager_v1 (no quoted
# server-header include).
'toplevel-tag': [
wl_protocols_dir / 'staging/xdg-toplevel-tag/xdg-toplevel-tag-v1.xml',
'xdg-toplevel-tag-v1',
],
# Color representation (a surface declares its alpha mode / matrix
# coefficients / range): staging protocol from the system
# wayland-protocols. Only client stubs are needed for wltest; the
# server side is wlroots' wlr_color_representation_manager_v1 (the
# generated enum header ships with wayland-protocols).
'color-representation': [
wl_protocols_dir / 'staging/color-representation/color-representation-v1.xml',
'color-representation-v1',
],
# Color management (clients describe surface colors, outputs advertise
# image descriptions): staging protocol from the system
# wayland-protocols. Only client stubs are needed for wltest; the
# server side is wlroots' wlr_color_manager_v1 (the generated enum
# header ships with wayland-protocols).
'color-management': [
wl_protocols_dir / 'staging/color-management/color-management-v1.xml',
'color-management-v1',
],
# System bell (a client asks the compositor to ring the bell):
# staging protocol from the system wayland-protocols. Only client
# stubs are needed for wltest; the server side is wlroots'
# wlr_xdg_system_bell_v1.
'system-bell': [
wl_protocols_dir / 'staging/xdg-system-bell/xdg-system-bell-v1.xml',
'xdg-system-bell-v1',
],
# Output management (kanshi/wdisplays reconfigure the output):
# wlroots extension, vendored like the other wlr-protocols XMLs.
'output-management': [
'wlr-protocols/wlr-output-management-unstable-v1.xml',
'wlr-output-management-unstable-v1',
],
# Content hints (photo/video/game) + single-pixel buffers (1x1 solid
# color without a shm pool). Both are staging protocols from the
# system wayland-protocols, like wlroots itself uses.
'content-type': [
wl_protocols_dir / 'staging/content-type/content-type-v1.xml',
'content-type-v1',
],
'single-pixel': [
wl_protocols_dir / 'staging/single-pixel-buffer/single-pixel-buffer-v1.xml',
'single-pixel-buffer-v1',
],
# Alpha modifier (a surface multiplies its own alpha): staging
# protocol from the system wayland-protocols. Only client stubs are
# needed for wltest; the server side is wlroots'
# wlr_alpha_modifier_v1.
'alpha-modifier': [
wl_protocols_dir / 'staging/alpha-modifier/alpha-modifier-v1.xml',
'alpha-modifier-v1',
],
# Viewporter (stable): only the client stub is needed (the server side
# is wlroots' wlr_viewporter_create). wltest uses it to scale a 1x1
# single-pixel buffer up to the window size.
'viewporter': [
wl_protocols_dir / 'stable/viewporter/viewporter.xml',
'viewporter',
],
}
protocol_sources = []
protocol_headers = []
client_headers = {}
code_by_name = {}
foreach protocol, p : protocols
xml = p[0]
base = p[1]
code = custom_target(protocol + ' protocol code',
input: xml,
output: base + '-protocol.c',
command: [wayland_scanner, 'private-code', '@INPUT@', '@OUTPUT@'])
protocol_sources += code
code_by_name += { protocol: code }
client_header = custom_target(protocol + ' client header',
input: xml,
output: base + '-client.h',
command: [wayland_scanner, 'client-header', '@INPUT@', '@OUTPUT@'])
protocol_headers += client_header
client_headers += { protocol: client_header }
if protocol == 'xdg-shell'
protocol_headers += custom_target(protocol + ' server header',
input: xml,
output: base + '-protocol.h',
command: [wayland_scanner, 'server-header', '@INPUT@', '@OUTPUT@'])
endif
if protocol == 'cursor-shape'
# Serves the wlroots header's quoted #include "cursor-shape-v1-protocol.h";
# the system wlroots packages don't install the generated protocol headers.
protocol_headers += custom_target(protocol + ' server header',
input: xml,
output: base + '-protocol.h',
command: [wayland_scanner, 'server-header', '@INPUT@', '@OUTPUT@'])
endif
if protocol == 'pointer-constraints'
# Serves wlr_pointer_constraints_v1.h's quoted
# #include "pointer-constraints-unstable-v1-protocol.h".
protocol_headers += custom_target(protocol + ' server header',
input: xml,
output: base + '-protocol.h',
command: [wayland_scanner, 'server-header', '@INPUT@', '@OUTPUT@'])
endif
if protocol == 'wlr-layer-shell-unstable-v1'
# Serves wlr_layer_shell_v1.h's quoted
# #include "wlr-layer-shell-unstable-v1-protocol.h".
protocol_headers += custom_target(protocol + ' server header',
input: xml,
output: base + '-protocol.h',
command: [wayland_scanner, 'server-header', '@INPUT@', '@OUTPUT@'])
endif
if protocol == 'tearing-control'
# Serves wlr_tearing_control_v1.h's quoted
# #include "tearing-control-v1-protocol.h".
protocol_headers += custom_target(protocol + ' server header',
input: xml,
output: base + '-protocol.h',
command: [wayland_scanner, 'server-header', '@INPUT@', '@OUTPUT@'])
endif
if protocol == 'content-type'
# Serves wlr_content_type_v1.h's quoted
# #include "content-type-v1-protocol.h".
protocol_headers += custom_target(protocol + ' server header',
input: xml,
output: base + '-protocol.h',
command: [wayland_scanner, 'server-header', '@INPUT@', '@OUTPUT@'])
endif
if protocol == 'wlr-output-power-management-unstable-v1'
# Serves wlr_output_power_management_v1.h's quoted
# #include "wlr-output-power-management-unstable-v1-protocol.h".
protocol_headers += custom_target(protocol + ' server header',
input: xml,
output: base + '-protocol.h',
command: [wayland_scanner, 'server-header', '@INPUT@', '@OUTPUT@'])
endif
endforeach
executable('kick',
'kick.c',
protocol_sources,
protocol_headers,
dependencies: deps,
c_args: kick_c_args)
# wltest needs the xdg-shell stub plus the cursor-shape client stack (whose
# private code references zwp_tablet_tool_v2, hence tablet-v2 too). The
# --layer mode uses the wlr-layer-shell client protocol; the --foreign mode
# uses the wlr-foreign-toplevel and ext-foreign-toplevel-list client stubs.
# --idle mode uses ext-idle-notify and idle-inhibit. --tearing and
# --fractional-out need their own protocol code linked in.
executable('wltest',
'tests/wltest.c',
code_by_name['xdg-shell'],
code_by_name['cursor-shape'],
code_by_name['tablet-v2'],
code_by_name['tearing-control'],
code_by_name['fractional-scale'],
code_by_name['pointer-constraints'],
code_by_name['relative-pointer'],
code_by_name['primary-selection'],
code_by_name['ext-data-control'],
code_by_name['wlr-layer-shell-unstable-v1'],
code_by_name['wlr-foreign-toplevel-management-unstable-v1'],
code_by_name['ext-foreign-toplevel-list'],
code_by_name['ext-idle-notify'],
code_by_name['idle-inhibit-unstable-v1'],
code_by_name['ext-session-lock'],
code_by_name['ext-image-copy-capture'],
code_by_name['ext-image-capture-source'],
code_by_name['keyboard-shortcuts-inhibit'],
code_by_name['wlr-output-power-management-unstable-v1'],
code_by_name['virtual-keyboard-unstable-v1'],
code_by_name['wlr-virtual-pointer-unstable-v1'],
code_by_name['xdg-activation'],
code_by_name['text-input'],
code_by_name['input-method'],
code_by_name['content-type'],
code_by_name['single-pixel'],
code_by_name['alpha-modifier'],
code_by_name['viewporter'],
code_by_name['gamma-control'],
code_by_name['xdg-dialog'],
code_by_name['pointer-gestures'],
code_by_name['toplevel-icon'],
code_by_name['color-representation'],
code_by_name['color-management'],
code_by_name['system-bell'],
code_by_name['toplevel-tag'],
code_by_name['output-management'],
client_headers['xdg-shell'],
client_headers['cursor-shape'],
client_headers['wlr-layer-shell-unstable-v1'],
client_headers['wlr-foreign-toplevel-management-unstable-v1'],
client_headers['ext-foreign-toplevel-list'],
client_headers['ext-idle-notify'],
client_headers['idle-inhibit-unstable-v1'],
client_headers['ext-session-lock'],
client_headers['ext-image-copy-capture'],
client_headers['ext-image-capture-source'],
client_headers['keyboard-shortcuts-inhibit'],
client_headers['virtual-keyboard-unstable-v1'],
client_headers['wlr-virtual-pointer-unstable-v1'],
client_headers['xdg-activation'],
client_headers['text-input'],
client_headers['input-method'],
client_headers['content-type'],
client_headers['single-pixel'],
client_headers['alpha-modifier'],
client_headers['viewporter'],
client_headers['gamma-control'],
client_headers['xdg-dialog'],
client_headers['pointer-gestures'],
client_headers['tearing-control'],
client_headers['fractional-scale'],
client_headers['toplevel-icon'],
client_headers['color-representation'],
client_headers['color-management'],
client_headers['system-bell'],
client_headers['toplevel-tag'],
client_headers['output-management'],
client_headers['ext-data-control'],
dependencies: [dependency('wayland-client'),
dependency('xkbcommon')])
# xdeco: xdg-decoration mode probe for the client-side regression test --
# maps one toplevel and reports the configured decoration mode.
executable('xdeco', 'tests/xdeco.c',
code_by_name['xdg-shell'],
code_by_name['xdg-decoration'],
client_headers['xdg-shell'],
client_headers['xdg-decoration'],
dependencies: [dependency('wayland-client')])
# xleader: X11 twin-window probe used by the leader-window regression test --
# an unmapped GTK-style leader plus a mapped frame, both carrying _NET_WM_PID.
x11_dep = dependency('x11', required: false)
if x11_dep.found()
executable('xleader', 'tests/xleader.c', dependencies: x11_dep)
# xpopup: instantly-mapped managed transient (synthetic menu) for the
# late-association regression test.
executable('xpopup', 'tests/xpopup.c', dependencies: x11_dep)
# xormenu: override-redirect focus-stealing menu probe (frame + menu in
# separate processes) for the or_focus_owner regression test.
executable('xormenu', 'tests/xormenu.c', dependencies: x11_dep)
# xclass: WM_CLASS set-then-delete probe for the set_class NULL
# app_id regression test.
executable('xclass', 'tests/xclass.c', dependencies: x11_dep)
# xreqs: client-request probe driving a managed X11 window through
# retitle/minimize/fullscreen/move+resize/raise/maximize/close, plus an
# unmapped create+destroy for the pending-surface teardown path.
executable('xreqs', 'tests/xreqs.c', dependencies: x11_dep)
endif