c– layout: default —

Workspace Background Fonts Shaders Per Target Tuning Mouse Cursor Borders Animations Slicing UI scheme

Visual Enhancements

Most parts of the user interface can be tuned to look more or less bland, and almost all tuning can be accessed from the menu from either the global/config/visual path or the target/video path with the exception of some minor details like the palette used to colorize widget text (see durden/gconf.lua).

Workspace Background

Workspace background image is set with the global/config/workspace/background and default-background paths. The default-background path changes the global default for newly created workspaces. To unset, simply cancel the browser being spawned.

It is also possible to assign the contents of a window as a background image source. This feature is accessed with the target/window/workspace-background path.


The same font settings are used for all windows except terminals and TUI clients. Font settings are found via the global/config/visual/font menu path and covers the size, hinting, typeface and a fallback. The fallback is used when a specific glyph (for internationalization or emojii support) is not found in the main typeface.

As a security/safety feature, arcan limits font access to the ARCAN_FONTPATH namespace, which can be controlled as an startup environment variable parameter. It defaults to applname/fonts (so durden/fonts) in this case.


For more advanced configuration, it is also possible to associate UI elements with a shader, with a few predefined roles and states for each UI component. These can be found in the source tree as durden/shaders/ui and cover some lua- defined metadata an a vertex/fragment step in GLSL120.

The uniforms defined in a shader can be accessed in-UI from global/config/visual/shaders/target/shader state.

Values changed in this way do not currently persist, either change the default values in the shader file, or activate the menu path through the durden/autorun.lua file for the time being.

There are also shader groups for last-stage display corrections, per window canvas scaling effects and workspace background.


For cases when you are only interested in a portion of a window, want a clone of a window, optionally with different scaling behavior and so on, there’s the option to create a window slice. The feature can be found via target/window/slice_clone=Active or =Passive. This turns the mouse cursor into selection mode where you can select the region you want to slice out. The difference between active and passive mode is that in active mode, all input that the window receives will be forwarded to the source.

A trick that can be done here is to combine slicing with the overlay

Per Target Tuning

Default settings for a window comes from its archetype profile. The accepted profiles are found in the source tree at durden/atypes/*.lua. Media and game clients, for instance, will have different default shader and scaling behavior than terminals and text clients.

Server-Side Scaling

The actual size of a window is partly determined by the workspace layout mode and partly by the current scaling settings. target/video/scaling allows you to switch between different sizing behaviors.

With normal, a window will prefer the client supplied dimensions, and in tiling modes, force a downscale if the client exceeds the alloted size and ignores sizing hints.

With stretch a window will use whatever size you set to it and the client will be force-scaled to those dimensions.

aspect behaves like stretch but will maintain the width/height ratio of the source transfer size.

With client a window will bias towards the dimensions a possible connected client itself has provided, and the display dimension hint that is sent to clients as a friendly suggestion will not be the user-set size but rather the slot allocated maximum.

You can also enable a post-processing shader via the target/video/shader path.

Density Override

If you activate target/video/advanced/source fullscreen these settings, any shaders and filtering will be ignored in favor of direct mode. Check display management for more details.

It is also possible to override the expected output density per window. This is useful in cases where you’d want the contents of a (density-aware client) to appear bigger or smaller. Normally, the client gets these values on a per-display basis, but an override can be found at target/video/advanced/density_override.

Mouse Cursor

There are three options that affect the visual look of the mouse cursor.

The first is the scale parameter, controlled by global/config/visual/mouse scale. The second is the reveal animation from global/input/mouse/reveal,hide that spawns little green squared when returning from a hidden state.

The last is the local mouse state, which is partly controlled by the client (it can send hints) or forced by your own hand through target/input/mouse/cursor where you can force-hide the cursor on a client that insists on software rendering its own.

Borders <a name=borders”/>

Window border decorations are split in two parameters: border area and border thickness. They are accessed via global/config/visual/border area and border thickness respectively.

Area covers the entire space that will be reserved, and border area is constrained to a subset of this space. This is to allow for gaps between tiles in tiling workspace mode.


Durden distinguishes between animations and transitions. Animations cover the small effects, like the path indicators in the menu. Transitions cover larger shifts from switching between workspaces and going between workspace view and the menu HUD.

Animation speed can be tuned via the global/config/visual/animation speed setting. There is also a separate window animation speed property that, if set, adds animations to window resizing, movement and swapping when in tile mode and in float mode.

The ‘switch workspaces’ transition effect can be controlled from the global/config/visual/transition-in,out and you can have different behavior for the workspace that is leaving and the workspace that is entering.

The speed is controlled from the global/config/visual/transition speed.


Visual schemes are profiles that are scanned on startup from the devmaps/schemes filesystem path. They can be applied globally, per display, per workspace or for a single window. Arbitrary menu paths for both the global and the target menu namespace can be added, and also forward color scheme information to clients that support that feature. The idea is to provide more comprehensive presets to mimic other desktop environments and dynamically switch. See the default.lua profile for an example, which is also activated by the autorun.lua startup script.

This is an advanced feature that may terminate or render the current session useless if you are not careful. There is no filtering of which menu paths that can be activated, but the main intent is to batch actions that changes the visual/interactive profile in a non-destructive way.

Future Changes

  • Shader lookup texture support
  • Window canvas contents as lookup texture input
  • Icon support, multi-channel signed distance fields
  • Loader for RetroArch shader format
  • Switchable mouse cursor themes
  • Border-area shadow controls
  • Multipass target- shader effects
  • Consistent settings persistance
  • Mouse reveal/hide effect control
  • Invisible ‘padding’ windows for non-uniform tiling mode gaps
  • Workspace-mode sensitive border configuration