A Wayland window-stacking compositor https://labwc.github.io
Find a file
David Turner ff012fa331 Don't detect edge-resizes in configure timeout
If a client times out responding to a configure request then the
handle_configure_timeout() callback is run.  This cleans up the pending
state and moves the view to the pending location, but keeps the current
size. The idea is to stop slow applications causing too much lag when
the user manipulates the window.  This callback used
view_impl_apply_geometry() to actually apply the changes.

view_impl_apply_geometry() contains some heuristics to detect if we're
resizing a window from the top, left, or top-left, and if so to do the
expected behaviour of keeping the window's bottom/right corner in the
same place.  However, that code was erroneously triggering in the case
when the user requests to change a window from maximized to fullscreen
but the client times out on the configure request.
handle_configure_timeout() decides to enact the movement of the window
but keep its size at the old size and tells view_impl_apply_geometry()
to do that.

The current view position and size is 0,64 1920x1016, the pending
position/size is 0,0 1920x1080, and the last committed size is
1920x1016.  Looking at the current and pending position and size, the
height changes while the bottom edge stays in the same place so this
looks like a top-edge-resize and view_impl_apply_geometry() decides to
keep the window's bottom edge in the same place while setting the
position according to the last-committed size.  This results in the
window staying at position 0,64 size 1920x1016 despite being marked as
fullscreen.

My solution to this is just to change handle_configure_timeout() to
directly change the view's position and call view_moved() if necessary.
The idea of handle_configure_timeout() is to action the window movement
now while discarding the size change, and let the size change take place
later on when the client catches up.  The logic of
view_impl_apply_geometry() doesn't make sense in this case so just avoid
it entirely.

Fixes #1922
2024-09-24 19:45:16 +01:00
.github/workflows CI: Install libwlroots-0.18-dev for the Debian runner 2024-08-06 15:25:50 +02:00
data meson.build: install badges for labwc and migrate to data/ 2024-02-03 22:05:28 +00:00
docs theme: finish titleLayout implementation (#2150) 2024-09-23 19:17:12 +01:00
include xdg: handle show_window_menu requests 2024-09-21 18:34:17 +01:00
po Translation updates from weblate 2024-09-23 21:03:27 +01:00
protocols chase: move to stable tablet protocol and require w-p >= 1.35 2024-07-17 21:28:59 +01:00
scripts CI: increase speed of codestyle check 2024-08-04 21:01:50 +02:00
src Don't detect edge-resizes in configure timeout 2024-09-24 19:45:16 +01:00
subprojects chase: wlroots.wrap: track the wlroots 0.18 branch 2024-07-17 21:28:59 +01:00
t buf: add buf_add_fmt() 2024-08-21 16:09:44 +02:00
.clang-format add .clang-format (with a disclaimer) 2024-04-18 21:52:38 +01:00
.editorconfig .editorconfig: set max_line_length=80 for *.md 2024-04-27 22:09:16 +01:00
.gitattributes Exclude checkpatch.pl from language stats 2022-12-20 22:17:10 +00:00
.gitignore exclude IDE settings in .gitignore 2024-04-18 21:51:25 +01:00
CONTRIBUTING.md Add unit test for common/buf.c 2024-08-20 18:31:53 +02:00
LICENSE Initial commit 2019-05-11 21:21:58 +01:00
meson.build ci: use -Wno-expansion-to-defined to avoid Arch CI error 2024-09-24 07:15:13 +09:00
meson_options.txt Add unit test for common/buf.c 2024-08-20 18:31:53 +02:00
NEWS.md NEWS.md: interim update 2024-09-16 18:45:50 +01:00
README.md README.md: update config files to six 2024-08-26 03:52:52 +02:00

labwc

[Website] [Scope] [IRC Channel] [Release Notes]

1. Project Description

1.1 What Is This?

Labwc stands for Lab Wayland Compositor, where lab can mean any of the following:

  • sense of experimentation and treading new ground
  • inspired by BunsenLabs and ArchLabs
  • your favorite pet

Labwc is a wlroots-based window-stacking compositor for wayland, inspired by openbox.

It is light-weight and independent with a focus on simply stacking windows well and rendering some window decorations. It takes a no-bling/frills approach and says no to features such as animations. It relies on clients for panels, screenshots, wallpapers and so on to create a full desktop environment.

Labwc tries to stay in keeping with wlroots and sway in terms of general approach and coding style.

Labwc has no reliance on any particular Desktop Environment, Desktop Shell or session. Nor does it depend on any UI toolkits such as Qt or GTK.

1.2 Why?

Firstly, we believe that there is a need for a simple Wayland window-stacking compositor which strikes a balance between minimalism and bloat approximately at the level where Window Managers like Openbox reside in the X11 domain. Most of the core developers are accustomed to low resource Desktop Environments such as Mate/XFCE or standalone Window Managers such as Openbox under X11. Labwc aims to make a similar setup possible under Wayland, with small and independent components rather than a large, integrated software eco-system.

Secondly, the Wayland community has achieved an amazing amount so far, and we want to help solve the unsolved problems to make Wayland viable for more people. We think that standardisation and de-fragmentation is a route to greater Wayland adoption, and wanting to play our part in this, Labwc only understands wayland-protocols & wlr-protocols, and it cannot be controlled with dbus, sway/i3/custom-IPC or other technology.

Thirdly, it is important to us that scope is tightly controlled so that the compositor matures to production quality. On the whole, we value robustness, reliability, stability and simplicity over new features. Coming up with new ideas and features is easy - maintaining and stabilising them is not.

Fourthly, we are of the view that a compositor should be boring in order to do its job well. In this regard we follow in the footsteps of metacity which describes itself as a "Boring window manager for the adult in you. Many window managers are like Marshmallow Froot Loops; Metacity is like Cheerios."

Finally, we think that an elegant solution to all of this does not need feel square and pixelated like something out of the 1990s, but should look contemporary and enable cutting-edge performance.

1.3 Why The Openbox Theme Specification?

In order to avoid reinventing configuration and theme syntaxes, the openbox 3.6 specification is used. This does not mean that labwc is an openbox clone but rather that configuration files will look and feel familiar.

Also, parsing GTK3+ and Qt themes for window decorations is very complicated, so using much simpler specs such as those used by openbox and xfwm makes sense for a compositor such as labwc, both in terms of implementation and for user modification.

Openbox spec is somewhat of a stable standard considering how long it has remained unchanged for and how wide-spread its adoption is by lightweight distributions such as LXDE, LXQt, BunsenLabs, ArchLabs, Mabox and Raspbian. Some widely used themes (for example Numix and Arc) have built-in support.

We could have invented a whole new syntax, but that's not where we want to spend our effort.

1.4 Very High Level Scope

A lot of emphasis is put on code simplicity when considering features.

The main development effort is focused on producing a solid foundation for a stacking compositor rather than adding configuration and theming options.

See scope for full details on implemented features.

High-level summary of items that Labwc supports:

  • Config files (rc.xml, autostart, shutdown, environment, menu.xml)
  • Theme files and xbm/png/svg icons
  • Basic desktop and client menus
  • HiDPI
  • wlroots protocols such as output-management, layer-shell and foreign-toplevel
  • Optionally xwayland

1.5 Videos

video link date duration
0.7.2-release-video 24-May-2024 3:17
0.6.0-release-video 31-Oct-2022 2:48
0.3.0-release-video 05-Aug-2021 1:10
pre-0.1.0-release-video 25-Feb-2021 3:42

1.6 Screenshot

The obligatory screenshot:


Screenshot description

2. Build and Installation

To build, simply run:

meson setup build/
meson compile -C build/

Run-time dependencies include:

  • wlroots, wayland, libinput, xkbcommon
  • libxml2, cairo, pango, glib-2.0
  • libpng
  • librsvg >=2.46 (optional)
  • xwayland, xcb (optional)

Build dependencies include:

  • meson, ninja, gcc/clang
  • wayland-protocols

Disable xwayland with meson -Dxwayland=disabled build/

For OS/distribution specific details see wiki.

If the right version of wlroots is not found on the system, the build setup will automatically download the wlroots repo. If this fallback is not desired please use:

meson setup --wrap-mode=nodownload build/

To enforce the supplied wlroots.wrap file, run:

meson setup --force-fallback-for=wlroots build/

If installing after using the wlroots.wrap file, use the following to prevent installing the wlroots headers:

meson install --skip-subprojects -C build/

3. Configuration

User config files are located at ${XDG_CONFIG_HOME:-$HOME/.config/labwc/} with the following six files being used: rc.xml, menu.xml, autostart, shutdown, environment and themerc-override.

Run labwc --reconfigure to reload configuration and theme.

For a step-by-step initial configuration guide, see getting-started.

4. Theming

Themes are located at ~/.local/share/themes/\<theme-name\>/openbox-3/ or equivalent XDG_DATA_{DIRS,HOME} location in accordance with freedesktop XDG directory specification.

For full theme options, see labwc-theme(5) or the themerc example file.

For themes, search the internet for "openbox themes" and place them in ~/.local/share/themes/. Some good starting points include:

5. Translations

The default window bar menu can be translated on the weblate platform.

Translation status

6. Usage

./build/labwc [-s <command>]

NOTE: If you are running on NVIDIA, you will need the nvidia-drm.modeset=1 kernel parameter.

If you have not created an rc.xml config file, default bindings will be:

combination action
alt-tab activate next window
super-return alacritty
alt-F3 bemenu
alt-F4 close window
super-a toggle maximize
alt-mouse-left move window
alt-mouse-right resize window
alt-arrow move window to edge
super-arrow resize window to fill half the output
alt-space show the window menu
XF86_AudioLowerVolume amixer sset Master 5%-
XF86_AudioRaiseVolume amixer sset Master 5%+
XF86_AudioMute amixer sset Master toggle
XF86_MonBrightnessUp brightnessctl set +10%
XF86_MonBrightnessDown brightnessctl set 10%-

A root-menu can be opened by clicking on the desktop.

6.1 Gaming

Cursor confinement is supported from version 0.6.2. If using older versions, use a nested gamescope instance for gaming. It can be added to steam via game launch option: gamescope -f -- %command%.

7. Integration

Suggested apps to use with labwc:

See integration for further details.