Skip to content

Instantly share code, notes, and snippets.

@seffs
Last active April 16, 2024 21:49
Show Gist options
  • Save seffs/2395ca640d6d8d8228a19a9995418211 to your computer and use it in GitHub Desktop.
Save seffs/2395ca640d6d8d8228a19a9995418211 to your computer and use it in GitHub Desktop.
Raspbian Bookworm - Ultra Minimal Kiosk Setup

This was tested on a fresh Raspbian Bookworm Lite installation. Proceed with caution.

EDIT 23/12/2023: Removed dead download link and added own release


First Steps

Install core packages

sudo apt install wayfire seatd

Create ~/.config/wayfire.init

touch ~/.config/wayfire.init

Test wayfire

wayfire ---> A black screen will appear with the mouse pointer at the center.

Note: if you are controlling your Pi with a physical keyboard, you might not be able to terminate the process from the same session. This is because no keybindings exist in the config file yet. You can spawn a second tty with ctrl+alt+f2 and kill it from there.


Change display orientation

sudo apt install wlr-randr

Rotate display: WAYLAND_DISPLAY=wayland-1 wlr-randr --output HDMI-A-1 --transform 180
(------------------------has to be launched from within the session. Keep reading---------------------------)


Hide mouse pointer

You'll need the wayfire-plugins-extra package. Unfortunately it is not available in the Bookworm repos. You have two ways to install it [1]

1.1) Download compiled library

  1. Choose your arch
  1. Decompress with tar xf /path/to/wayfire-plugins-extra.tar.xz
  2. Each plugin comes with a .so and a an .xml file. You will need to copy those files to their correct paths:
    /usr/lib/aarch64-linux-gnu/wayfire/<desired-plugin>.so
    /usr/share/wayfire/metadata/<desired-plugin>.xml

1.2) Build from source

  1. Follow the instructions in https://github.com/seffs/wayfire-plugins-extra-raspbian/. Install source packages with
    sudo apt install libglibmm-2.4-dev libglm-dev libxml2-dev libpango1.0-dev libcairo2-dev wayfire-dev libwlroots-dev libwf-config-dev
  2. Each plugin comes with a .so and .xml file. meson should take care of the installation. Otherwise check if the following path exists for any new extra plugin:
    ls /usr/lib/aarch64-linux-gnu/wayfire/<new-extra-plugin>.so
    ls /usr/share/wayfire/metadata/<new-extra-plugin>.xml

2) Activate your plugin(s)

I was only interested in hiding the mouse pointer. This can be accomplished with the hide_cursor plugin. The same concept applies to the rest of plugins.

Open your ~/.config/wayfire.init file and paste the following:

[core]
plugins = \
        autostart \
        ### We need to add the extra plugin to the list ###
        hide-cursor

### Execute commands on compositor startup ###
[autostart]
rotate_display = WAYLAND_DISPLAY=wayland-1 wlr-randr --output HDMI-A-1 --transform 360
# my_script = /path/to/script

### We can tweak it to our liking. You will find the documentation inside of each plugin's XML file. ###
[hide-cursor]
#toggle = <alt> KEY_Z
#hide_delay = 3

Execute your script on startup

Adjust my_script = /path/to/script to your needs. Don't forget to uncomment it.

Start wayfire

wayfire -c ~/.config/wayfire.ini ---> See? No pointer!


[1] Based on bjtheone's instructions

@Torsten85
Copy link

I get the following error on my raspberry pi 5 with a fresh bookworm lite (64bit, 2023-12-11) when executing ´wayfire`:

II 20-01-24 12:15:25.043 - [src/main.cpp:280] Starting wayfire version 0.7.5
II 20-01-24 12:15:25.043 - [libseat] [libseat/libseat.c:73] Seat opened with backend 'seatd'
II 20-01-24 12:15:25.043 - [libseat] [libseat/backend/seatd.c:212] Enabling seat
II 20-01-24 12:15:25.043 - [backend/session/session.c:109] Successfully loaded libseat session
II 20-01-24 12:15:25.047 - [backend/backend.c:220] Found 1 GPUs
II 20-01-24 12:15:25.047 - [backend/drm/backend.c:186] Initializing DRM backend for /dev/dri/card1 (vc4)
II 20-01-24 12:15:25.048 - [backend/drm/drm.c:242] Found 4 DRM CRTCs
II 20-01-24 12:15:25.048 - [backend/drm/drm.c:200] Found 24 DRM planes
II 20-01-24 12:15:25.052 - [render/egl.c:201] Supported EGL client extensions: EGL_EXT_device_base EGL_EXT_device_enumeration EGL_EXT_device_query EGL_EXT_platform_base EGL_KHR_client_get_all_proc_addresses EGL_EXT_client_extensions EGL_KHR_debug EGL_EXT_platform_device EGL_EXT_platform_wayland EGL_KHR_platform_wayland EGL_EXT_platform_x11 EGL_KHR_platform_x11 EGL_EXT_platform_xcb EGL_MESA_platform_gbm EGL_KHR_platform_gbm EGL_MESA_platform_surfaceless
EE 20-01-24 12:15:25.053 - [EGL] command: eglQueryDeviceStringEXT, error: EGL_BAD_PARAMETER (0x300c), message: "eglQueryDeviceStringEXT"
EE 20-01-24 12:15:25.053 - [EGL] command: eglQueryDeviceStringEXT, error: EGL_BAD_PARAMETER (0x300c), message: "eglQueryDeviceStringEXT"
MESA-LOADER: failed to open vc4: /usr/lib/dri/vc4_dri.so: cannot open shared object file: No such file or directory (search paths /usr/lib/aarch64-linux-gnu/dri:\$${ORIGIN}/dri:/usr/lib/dri, suffix _dri)
MESA-LOADER: failed to open zink: /usr/lib/dri/zink_dri.so: cannot open shared object file: No such file or directory (search paths /usr/lib/aarch64-linux-gnu/dri:\$${ORIGIN}/dri:/usr/lib/dri, suffix _dri)
MESA-LOADER: failed to open kms_swrast: /usr/lib/dri/kms_swrast_dri.so: cannot open shared object file: No such file or directory (search paths /usr/lib/aarch64-linux-gnu/dri:\$${ORIGIN}/dri:/usr/lib/dri, suffix _dri)
MESA-LOADER: failed to open swrast: /usr/lib/dri/swrast_dri.so: cannot open shared object file: No such file or directory (search paths /usr/lib/aarch64-linux-gnu/dri:\$${ORIGIN}/dri:/usr/lib/dri, suffix _dri)
EE 20-01-24 12:15:25.054 - [render/egl.c:538] Failed to create GBM device
EE 20-01-24 12:15:25.054 - [render/egl.c:554] Failed to initialize EGL context
EE 20-01-24 12:15:25.054 - [render/gles2/renderer.c:688] Could not initialize EGL
EE 20-01-24 12:15:25.054 - [src/main.cpp:144] Fatal error: Segmentation fault
EE 20-01-24 12:15:25.066 - #1  wf::print_trace(bool) ??:?
addr2line: ',�': No such file
addr2line: ',�': No such file
EE 20-01-24 12:15:25.072 - #2  bv� bv�
EE 20-01-24 12:15:25.080 - #3  wlr_renderer_is_gles2 ??:?
EE 20-01-24 12:15:25.089 - #4  wlr_renderer_is_gles2 ??:?
EE 20-01-24 12:15:25.097 - #5  wlr_gles2_renderer_get_egl ??:?
EE 20-01-24 12:15:25.108 - #6  main ??:?
EE 20-01-24 12:15:25.224 - #7  __libc_start_call_main ../sysdeps/unix/sysv/linux/aarch64/libc-start.c:74
EE 20-01-24 12:15:25.320 - #8  call_init ../csu/libc-start.c:128
EE 20-01-24 12:15:25.329 - #9  _start ??:?

am I missing something?

@seffs
Copy link
Author

seffs commented Jan 31, 2024

EE 20-01-24 12:15:25.053 - [EGL] command: eglQueryDeviceStringEXT, error: EGL_BAD_PARAMETER (0x300c), message:
"eglQueryDeviceStringEXT"
MESA-LOADER: failed to open vc4: /usr/lib/dri/vc4_dri.so: cannot open shared object file: No such file or directory

A couple of things you can try:

Let me know what works for you. I'll consider adding them to the guide.

@attree
Copy link

attree commented Feb 3, 2024

This is great, thanks for this gist.

@swvalenti194
Copy link

I am somewhat of a novice but I think I followed all these instructions. I see the paths of the hide curser .so and .xml. I created the config and added hide-curser config. But the curser never disappears. When I start wayfire I get the below. I probably did something wrong but I don't know where. Anyway to dumb it down more? HA. Thanks

swvalenti@raspberrypiwx:~ $ wayfire -c ~/.config/wayfire.ini II 09-04-24 18:12:46.202 - [src/main.cpp:280] Starting wayfire version 0.7.5 EE 09-04-24 18:12:46.203 - [libseat] [libseat/backend/seatd.c:308] Could not poll connection: Broken pipe II 09-04-24 18:12:46.203 - [libseat] [libseat/libseat.c:76] Backend 'seatd' failed to open seat, skipping II 09-04-24 18:12:46.203 - [libseat] [libseat/libseat.c:76] Backend 'logind' failed to open seat, skipping II 09-04-24 18:12:46.205 - [libseat] [seatd/seat.c:39] Created VT-bound seat seat0 II 09-04-24 18:12:46.205 - [libseat] [seatd/server.c:145] New client connected (pid: 1924, uid: 1000, gid: 1000) II 09-04-24 18:12:46.205 - [libseat] [libseat/backend/seatd.c:633] Started embedded seatd EE 09-04-24 18:12:46.205 - [libseat] [common/terminal.c:162] Could not open target tty: Permission denied EE 09-04-24 18:12:46.205 - [libseat] [seatd/seat.c:61] Could not open tty0 to update VT: Permission denied II 09-04-24 18:12:46.205 - [libseat] [seatd/seat.c:170] Added client 0 to seat0 EE 09-04-24 18:12:46.205 - [libseat] [common/terminal.c:162] Could not open target tty: Permission denied EE 09-04-24 18:12:46.205 - [libseat] [seatd/seat.c:72] Could not open terminal for VT 0: Permission denied EE 09-04-24 18:12:46.205 - [libseat] [seatd/seat.c:461] Could not open VT for client EE 09-04-24 18:12:46.206 - [libseat] [common/terminal.c:162] Could not open target tty: Permission denied EE 09-04-24 18:12:46.206 - [libseat] [seatd/seat.c:86] Could not open terminal to clean up VT 0: Permission denied II 09-04-24 18:12:46.206 - [libseat] [libseat/libseat.c:73] Seat opened with backend 'builtin' II 09-04-24 18:12:46.206 - [backend/session/session.c:109] Successfully loaded libseat session II 09-04-24 18:12:46.206 - [backend/backend.c:91] Waiting for a session to become active EE 09-04-24 18:12:56.216 - [backend/backend.c:114] Timeout waiting session to become active EE 09-04-24 18:12:56.216 - [backend/backend.c:352] Failed to start a DRM session EE 09-04-24 18:12:56.217 - [src/main.cpp:144] Fatal error: Segmentation fault EE 09-04-24 18:12:56.299 - #1 wf::print_trace(bool) ??:? addr2line: '?,ߥ': No such file addr2line: '?,ߥ': No such file EE 09-04-24 18:12:56.317 - #2 ??? ??? EE 09-04-24 18:12:56.346 - #3 wlr_backend_get_drm_fd ??:? EE 09-04-24 18:12:56.379 - #4 main ??:? EE 09-04-24 18:12:56.742 - #5 __libc_start_call_main ../sysdeps/unix/sysv/linux/aarch64/libc-start.c:74 EE 09-04-24 18:12:56.928 - #6 call_init ../csu/libc-start.c:128 EE 09-04-24 18:12:56.948 - #7 _start ??:? II 09-04-24 18:12:56.949 - [libseat] [seatd/client.c:471] Client disconnected EE 09-04-24 18:12:56.950 - [libseat] [common/terminal.c:162] Could not open target tty: Permission denied

@seffs
Copy link
Author

seffs commented Apr 10, 2024 via email

@swvalenti194
Copy link

Seated was installed and already up to date

@seffs
Copy link
Author

seffs commented Apr 15, 2024

@swvalenti194 there could be a number of reasons for this to happen. I'm afraid I won't be able to help you troubleshoot this to the very end, but I'm willing to point you to other resources. I would suggest starting from scratch and document each step you followed before the error appears. What is your current setup (Pi model, connected hardware)? Are you using a fresh Bookworm Lite Image?

@swvalenti194
Copy link

@seffs I understand, I appreciate the effort. PI4 with bookworm desktop and touchscreen display. I guess the issue is it's not the lite version.

@seffs
Copy link
Author

seffs commented Apr 16, 2024

@swvalenti194 then you might not need to install seatd at all. Uninstall it and then execute the following command:

apt-get install --reinstall -o Dpkg::Options::="--force-confask" raspberrypi-ui-mods

This should bring your Desktop GUI back to default. After that, try to switch wayland -> X11-> wayland through raspi-config (see my second comment on this thread).

In (the best) case of a reinstall, skip the First Steps section. The wayfire.init file is already provided by the desktop image. Just fill in the missing sections.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment