the mouse as little as possible). Primarily Tiled window management configuration - but normal “desktop- style” use also works • Zero-Config - inputs, visual features (animations), fonts etc. can all be tuned runtime without editing / rebuilding / reloading. • Complex cases, such as multiple heterogeneous displays (“mixed- DPI”) covered and prioritised • Global and Per Window clipboard with history • Highly configurable input model, rebind inputs globally and/or per window, support for game devices, switching keyboard layouts, ... • Fine grained control of individual window behavior in regard to locking, input translation, scaling, filtering, post-processing effects
to 10 workspaces per display • Each workspace has: layout mode (tile, float, vtab, tab, fullscreen) current display preferred display possible background possible text tag
gaps) border size (from 0 to gap_sz) workspace-transition animation, wallpaper • All Decorations are shader defined, can be made quite crazy :) • Custom tag to each window for searching / retrieval • Workspace Alert • Sound Controls (global or per window volume) • State Controls (suspend, resume, save, restore) • Remember Cursor Position, autolocking per window
g (main) or t (window) or d (launch) ) type to filter enter to launch selected both actions and groups can be bound to shortcut key arrow-keys to move selection [meta]escape to go back
!/global/input or special:bind_u8) • Generates dynamic helper contents that ties to widget regions Can be interactive (notes, todo, clock, cheat sheets, password generator, colour picker etc.) • Examples: (show existing bindings) (ASCII helper)
to titlebar decoration button [left or right] • Can be hidden in tiled mode • 3 pipes (config/system/ipc): control [in], output [out], status [in] • control - activate menu path externally, output - write messages to external listener, status - modify statusbar • Statusbar can be externally modified (lemonbar- like protocol) • e.g. echo "hi %{F#00ffff} There | %{F-} %{Aclickme} Button" > ipc/status [ set bar to (hi There | Button) with "clickme" written to output pipe on click ]
at the moment (and related driver issues).. • Workspace is ‘homed’ to a display • Display disappears? workspace is adopted • Display reappears? workspace moves back home • Windows / Workspaces can be migrated to a display manually (global/ workspace/migrate/[display name] or target/window/migrate/[display name]) • Caveats: manual- scan for display changes as event-driven turned out driver-crash prone (global/display/rescan), poor identification (bad EDID values on reconnect breaks autohoming!) • Display properties (RGB layout, pixel density, font size) are communicated to window / workspace / external processes on migration
For color- gamma- correction / special needs • Current arcan limitations makes ICC profile harder (no R10G10B10 or 3D LUT texture support) • Re- orientation • Per display : Toggle Horizontal / Vertical arrangement • Text • Font / Hinting / Size is managed per display, pushed to clients, synched on window- migration • Decoration, Font, Cursor follows display pixel density
and magnification • m2: align to selected window canvas, m1: switch anchor point, mouse motion to resize • (currently poor sound-source control / mixing) ** spawns and forwards to encoding frameserver, will also be used for OCR and text to speech path: global/display/region/
maps to symbol and utf-8 sequence. • key-press/combination can be bound per window to label (each connection can dynamically communicate supported labels and datatype) • Sore spot: no good converter from X etc. to internal format (yet) • meta+key can be bound to target or global menu path (including setting a specific value, e.g. config/visual/mouse_scale=5) • per- window Bind UTF-8 overrides to Keymap or Global or Window
Center, Lock to Window, Remember Window Position, Motion Scaling, Autohide • Bind buttons to Target / Global Menu action • Gamepads, switches etc. • Known devices (platform+string identifier) has a map in devmaps and gets "auto slotted" • Slot is expanded into label translation (=> PLAYERn_BUTTON1) • Can also be bound to menu paths like normal presses: input/bind/custom takes 'n' repeated inputs but currently only rising edge triggered, not level (hold) or falling (release)
Local (per window) and Global (shared) • Conservative History (no accidental duplicates) • meta_1 - activate to copy from local to global • Captures / Tracks URLs separately presents as completion sets in open/remote or open/media • Paste Modes • Strip leading / trailing / repeating whitespace / linefeeds
/ shows failed attempts count • one-time passwords • no PAM/what-have-you integration on purpose • authenticate to current desktop, not re-use system authentication primitives for something as mundane like “I needed to go to the bathroom” path: system/lock
activation • can be periodic (run every n ticks) • can be idle (run path#1 on enter-idle, path#2 on exit-idle) • and fire-once or repeated path: config/timers
presses without meta+ combination? query for rebind • Remove / Insert keyboard device resets rebind helper • Individual windows can be ‘delete protected’ • External Control Channel (if enabled) can run menu commands • current settings can be externally modified with arcan_db [ arcan_db drop_appl durden to reset ] • Run with arcan -b :self durden to relaunch and inherit external connections on script error
distribution, graphics set-up etc. this can be hairy (drm- kms on linux, device permisions etc.) • arcan /path/to/durden (if in APPLBASE, ~/.arcan/appl just arcan durden) • some basic things, m1+enter (terminal), m1+g (global menu) • if nothing happens, type frantically on the keyboard for some ~20 presses and it assumes your keybindings are broken and you see:
(for good reason) • There is a database that tracks what is permitted to be launched and with which arguments. • We call those ‘targets’ and ‘configurations’ (multiple per target). • There is a tool to manage this database, arcan_db (though distributions etc. might just want to handle this differently). • Database is used both for tracking user settings globally and individually for the targets / configurations. -b filename to switch • By default, it resides in your ~/.arcan/arcan.sqlite, but you can specify it somewhere else (and have multiple to switch between) with -d file
(libretro.com), the freeware game doukutsu (cave story) and the corresponding libretro core. arcan_db arcandb.sqlite add_target “cave story” “[ARCAN_RESOURCEPATH]/ cores/cave.dylib” RETRO “[ARCAN_RESOURCEPATH]/assets/cave/Doukutsu.exe” • the [ARCAN_RESOURCEPATH] will be expanded at runtime to the path set as resource path (arcan -p respath), the RETRO indicates the binary format (we want afsrv_game as loader) • now “cave story” will be available in my meta-d launch menu, in the way it was used in the demo video.
for device nodes in ARCAN_INPUT_SCANDIR ENV) • Need recent: (kernel >= 4.x, libdrm and MESA) + compatible card and luck (/s long live gpu drivers).. • OK (Intel), So-So (AMD), “Exotic” (Nvidia, egl-nvidia VIDEO_PLATFORM) • Environment tuning (primary): DISPLAY_CONNECTOR • Current limits: 1 GPU / instance, (but multiple concurrent instances possible), handles primary display connector loss poorly. • External Launch support not fully implemented (upgrade without losing state, temporarily release resources and hand over to other program etc.)
managers are in place (and quite a few more of our own). • Big improvements will be directed towards: • raising quality (redshift, color correction profiles, daltonization, latency vs. energy-efficiency tradeoffs) • controlled sharing (multimedia/VM state copy/paste, network transparency, LAN state migration, VM integration) • advanced input (macro record/replay, sticky combinations, tablet gestures, OCR, eye-trackers, OSD keyboard, keyboard to mouse) • Longer list in README.md (checklist and crazy ideas)
ulimit -c unlimited; ARCAN_LOGPATH=/some/path arcan -g -b :self durden &> mylog will retain most information • -b :self means fallback to self on script error • system/debug submenu comes with -g debuglevel (-g -g is too verbose) • What I do? 2 GPUs (i915 + AMD R380 atm.), 2 durden checkouts • 2nd instance with different envs/db that uses a different name for connection point (ARCAN_VIDEO_DEVICE, ARCAN_APPLTEMPPATH, ARCAN_RESOURCEPATH, ALSA_CARD, ARCAN_FRAMESERVER_DEBUGSTALL=1 + config/system/connection_path • started with added cmdline arg input_lock ; secret sauce - shares input device nodes with other instance, (see: keybindings.lua with input_lock_toggle and input_lock_on input_lock_off to control)