LinuxKMS Backend
The LinuxKMS backend runs only on Linux and eliminates the need for a windowing system such as Wayland or X11. Instead it uses the following libraries and interface to render directly to the screen and react to touch, mouse, and keyboard input.
- OpenGL via KMS/DRI.
- Vulkan via wgpu and the Vulkan KHR Display Extension.
- DRM dumb buffers for software rendering, as well as legacy LinuxFB rendering.
- libinput/libudev for input event handling from mice, touch screens, or keyboards. (optional)
- libseat for GPU and input device access without requiring root access. (optional)
Dependencies
Section titled “Dependencies”For compilation, pkg-config is used to determine the location of the system libraries needed by the features you select. None of them are needed by every configuration:
| pkg-config package name | Package name on Debian based distros | Needed for |
|---|---|---|
gbm | libgbm-dev | the FemtoVG and Skia OpenGL renderers |
libseat | libseat-dev | libseat support |
libinput | libinput-dev | libinput support |
libudev | libudev-dev | libinput support |
xkbcommon | libxkbcommon-dev | libinput support |
The software renderer needs none of these: it renders through DRM dumb buffers, which Slint drives
directly without a C library. Font handling is separate from this table and needs fontconfig
(libfontconfig-dev) in every configuration.
Selecting libseat and libinput
Section titled “Selecting libseat and libinput”libseat provides access to the GPU and to input devices without running as root. libinput delivers mouse, touch, and keyboard events. Both are optional, and how you select them differs between Rust and C++.
Disable the default features, select the compat-1-18 feature, and then combine
backend-linuxkms with the capabilities you need:
| Cargo features | libseat | libinput |
|---|---|---|
backend-linuxkms | no | no |
backend-linuxkms-libseat | yes | no |
backend-linuxkms-libinput | no | yes |
backend-linuxkms-libseat and backend-linuxkms-libinput | yes | yes |
[dependencies]slint = { version = "1.18.0", default-features = false, features = [ "compat-1-18", "backend-linuxkms", "backend-linuxkms-libinput", "renderer-software",] }With the default features instead, the compat-1-2 feature is enabled and backend-linuxkms
implies libseat and libinput, as it did before Slint 1.18.
The backend-linuxkms-noseat feature is deprecated; use backend-linuxkms-libinput, which selects
the same combination.
SLINT_FEATURE_BACKEND_LINUXKMS enables the backend with both libraries and turns either off
when you don’t need it. _LIBSEAT and _LIBINPUT also enable the backend on their own and
combine, so SLINT_FEATURE_BACKEND_LINUXKMS is not a prerequisite:
| CMake options | libseat | libinput |
|---|---|---|
SLINT_FEATURE_BACKEND_LINUXKMS | yes | yes |
SLINT_FEATURE_BACKEND_LINUXKMS and ..._LIBSEAT=OFF | no | yes |
SLINT_FEATURE_BACKEND_LINUXKMS and ..._LIBSEAT=OFF ..._LIBINPUT=OFF | no | no |
SLINT_FEATURE_BACKEND_LINUXKMS_LIBSEAT | yes | no |
SLINT_FEATURE_BACKEND_LINUXKMS_LIBINPUT | no | yes |
SLINT_FEATURE_BACKEND_LINUXKMS_LIBSEAT and ..._LIBINPUT | yes | yes |
cmake -DSLINT_FEATURE_BACKEND_LINUXKMS=ON ..The configure output reports which of the two libraries the build ends up with.
SLINT_FEATURE_BACKEND_LINUXKMS_NOSEAT is deprecated; use
SLINT_FEATURE_BACKEND_LINUXKMS_LIBINPUT, which selects the same combination.
Renderers
Section titled “Renderers”The LinuxKMS backend supports different renderers. They can be explicitly selected for use through the
SLINT_BACKEND environment variable.
| Renderer name | Required Graphics APIs | SLINT_BACKEND value to select renderer |
|---|---|---|
| FemtoVG | OpenGL ES 2.0 | linuxkms-femtovg |
| FemtoVG (wgpu) | Vulkan | linuxkms-femtovg-wgpu |
| Skia | OpenGL ES 2.0, Vulkan | linuxkms-skia-opengl, linuxkms-skia-vulkan, or linuxkms-skia-software |
| Software | None | linuxkms-software |
Display Selection
Section titled “Display Selection”All renderers use Linux’s direct rendering manager (DRM) subsystem to configure display outputs. Slint defaults to selecting the first connected
display and configures it at either its preferred resolution (if available) or its highest. Set the SLINT_DRM_OUTPUT
environment variable to select a specific display. To get a list of available outputs, set SLINT_DRM_OUTPUT
to list, run your program, and observe the output.
For example, the output may look like this on a laptop with a built-in screen (eDP-1) and an externally connected monitor (DP-3):
DRM Output List Requested:eDP-1 (connected: true)DP-1 (connected: false)DP-2 (connected: false)DP-3 (connected: true)DP-4 (connected: false)Setting SLINT_DRM_OUTPUT to DP-3 will render on the second monitor.
To select a specific resolution and refresh rate (mode), set the SLINT_DRM_MODE variable. Set it to list and
run your program to get a list of available modes. For example the program output could look like this:
DRM Mode List Requested:Index: 0 Width: 3840 Height: 2160 Refresh Rate: 60Index: 1 Width: 3840 Height: 2160 Refresh Rate: 50Index: 2 Width: 3840 Height: 2160 Refresh Rate: 30Index: 3 Width: 2560 Height: 1440 Refresh Rate: 59Index: 4 Width: 1920 Height: 1080 Refresh Rate: 60Index: 5 Width: 1680 Height: 1050 Refresh Rate: 59...Set SLINT_DRM_MODE to 4 to select 1920x1080@60.
Configuring the Keyboard
Section titled “Configuring the Keyboard”By default the keyboard layout and model is assumed to be a US model and layout. Set the following environment variables to configure support for different keyboards:
XKB_DEFAULT_LAYOUT: A comma separated list of layouts (languages) to include in the keymap. See the layouts section in xkeyboard-config(7) ↗ for a list of accepted language codes. for a list of supported layouts.XKB_DEFAULT_MODEL: The keyboard model by which to interpreter keys. See the models section in xkeyboard-config(7) ↗ for a list of accepted model codes.XKB_DEFAULT_VARIANT: A comma separated list of variants, one per layout, which configures layout specific variants. See the values in parentheses in the layouts section in xkeyboard-config(7) ↗ for a list of accepted variant codes.XKB_DEFAULT_OPTIONS: A comma separated list of options to configure layout-independent key combinations. See the options section in xkeyboard-config(7) ↗ for a list of accepted option codes.
Display Rotation
Section titled “Display Rotation”If your display’s default orientation does not match the desired orientation of your user interface, then you can
set the SLINT_KMS_ROTATION environment variable to instruct Slint to rotate at rendering time. Supported values
are the rotation in degrees: 0, 90, 180, and 270.
Note that this variable merely rotates the rendering output. If you’re using a touch screen attached to the same
display, then you may need to configure it to also apply a rotation on the touch events generated. For configuring
libinput’s LIBINPUT_CALIBRATION_MATRIX see the libinput Documentation ↗
for a list of valid values. Values can typically be set by writing them into a rules file under /etc/udev/rules.d.
The following example configures libinput to apply a 90 degree clockwise rotation for any attached touch screen:
echo 'ENV{LIBINPUT_CALIBRATION_MATRIX}="0 -1 1 1 0 0"' > /etc/udev/rules.d/libinput.rulesudevadm control --reload-rulesudevadm triggerLegacy LinuxFB Interface
Section titled “Legacy LinuxFB Interface”For software rendering, DRM dumb buffers are the preferred default way of posting frame buffers to the display. If DRM dumb buffers are not supported, the LinuxKMS backend falls back to using the Linux legacy
framebuffer interface (/dev/fbX).
To override this default and use only the legacy framebuffer interface, set the SLINT_BACKEND_LINUXFB=1 environment variable.
© 2026 SixtyFPS GmbH