#!/bin/sh # mjdev desktop wayland session # started by the display manager via /usr/share/wayland-sessions/mjdev.desktop export XDG_CURRENT_DESKTOP=mjdev export XDG_SESSION_TYPE=wayland export MOZ_ENABLE_WAYLAND=1 export QT_QPA_PLATFORM="wayland;xcb" export _JAVA_AWT_WM_NONREPARENTING=1 # allow wlroots to start on llvmpipe (software GL). On real hardware mesa uses the # GPU and this is ignored; in a VM / headless box without GPU passthrough mesa falls # back to llvmpipe and wlroots otherwise refuses to create a renderer ("Software # rendering detected, please use WLR_RENDERER_ALLOW_SOFTWARE") and the compositor # exits immediately -> black screen + tty1 autologin crash-loop. export WLR_RENDERER_ALLOW_SOFTWARE=1 # the Compose shell renders via Skiko. On a software/llvmpipe stack (VM, or a box with # no GPU) the compositor's XWayland has no glamor, so Skiko cannot create an OpenGL/GLX # context -> "org.jetbrains.skiko.RenderException: Cannot create Linux GL context" and the # shell crash-loops. Skiko's CPU raster backend needs no GL context and works everywhere. # (On real GPUs this is the safe-but-slower path; revisit once GPU detection is added.) export SKIKO_RENDER_API=SOFTWARE # desktop shell binary - deb/appimage install location, gradle dev fallback SHELL_CMD="/opt/mjdev-desktop/bin/mjdev-desktop" if [ ! -x "$SHELL_CMD" ]; then SHELL_CMD="$HOME/.local/bin/mjdev-desktop" fi # compositor binary - /usr/bin (deb) or /usr/local/bin (manual install) MJDEVC="$(command -v mjdevc 2>/dev/null)" if [ -z "$MJDEVC" ]; then MJDEVC="/usr/bin/mjdevc" fi # clean up the activation environment the compositor exported into the # persistent systemd --user manager. with KillUserProcesses=no (the distro # default) that manager survives logout, so leaving a stale WAYLAND_DISPLAY / # DISPLAY behind poisons the next login - of any session, not just ours. # run on every exit path (normal exit, crash, signal) - no exec, so we get here. cleanup() { systemctl --user unset-environment \ WAYLAND_DISPLAY DISPLAY XDG_CURRENT_DESKTOP XDG_SESSION_TYPE \ 2>/dev/null || true } trap cleanup EXIT HUP INT TERM # log the compositor + shell output so a failed start is diagnosable (otherwise the # tty1 session just dies to a black screen with no trace). keep the previous run. LOG_DIR="${XDG_CACHE_HOME:-$HOME/.cache}/mjdev-desktop" mkdir -p "$LOG_DIR" [ -f "$LOG_DIR/session.log" ] && mv -f "$LOG_DIR/session.log" "$LOG_DIR/session.log.1" "$MJDEVC" --session --shell-cmd "$SHELL_CMD" >"$LOG_DIR/session.log" 2>&1