Skip to content

Live Draw

P3DROVFX edited this page Oct 12, 2026 · 1 revision

Live Draw

Draw on your screen, over every application — to point at something in a video call, annotate a screencast, sketch on a slide, or just scribble — with a pen, highlighter, laser pointer, shapes, a whiteboard mode, a spotlight and a magnifier. The ink belongs to the workspace it was drawn on and slides with it when you switch; you can copy it, export it as a PNG or SVG, or file it into Notes as a sketch.

It is the desktop twin of the tablet's pen tray: both are two surfaces over the same store (services/LiveDraw.qml), so the tools, palette and pen settings are shared. This page covers the desktop overlay; the touch-first version (with pressure, palm rejection and the floating bubble) is in Tablet Family.

Quick start

  1. Super + Alt + D — a toolbar appears and the screen is yours to draw on (every click becomes ink). Press again, or Esc, to close; the drawing stays on its workspace.
  2. Pick a tool in the toolbar or by key: P pen, H highlighter, L laser, A arrow, R rectangle, O ellipse, I line, E eraser. 1–9 pick an ink from the palette; [ / − and ] / + change thickness.
  3. D (or the "Drawing" button) puts the pen up: clicks go through to the applications, the ink stays visible; pick the pen up again to continue.
  4. Ctrl + Z undo, Ctrl + Shift + Z (or Y) redo, Delete clears this screen, S saves, C copies, T hides the toolbar, F zoom, M spotlight, W / K whiteboard / blackboard.

Live Draw is on by default and can be disabled in Settings → Overlays & OSD → Live Draw (liveDraw.enable), where there is also a Start drawing button. The same entry points also exist from the bar's utility buttons, the dock's Live Draw tile, the Dashboard quick toggle, the recording controls and the launcher.

The toolbar

A floating tray you can drag off whatever is being shown and fold down to just the pen (it stays within reach without covering the slide). It offers:

  • Pen, highlighter (drawn under the ink, see-through), laser pointer (fades on its own), shapes — arrow, rectangle, ellipse, line; click the shape button again to cycle through them, hold Shift to snap lines to angles and boxes to squares.
  • Eraser, undo / redo, clear this screen, thickness, and the ink palette (eight colours by default).
  • Spotlight — dims everything except a circle around the pointer, for pointing at one thing in a screen share. Zoom — magnifies around the pointer; scroll adjusts, Esc or a click leaves.
  • Board — a blank page over the screen: light or dark, with a pattern (Blank, Grid, Dots, Lines), for explaining something on a whiteboard instead of on top of the apps.
  • Save / copy menu: Copy the drawing (transparent PNG), Copy the screen with it, Save as PNG (transparent, cropped to the ink, into ~/Pictures/Drawings), a Screenshot option (the screen with the drawing, saved to Pictures/Screenshots too), Save as SVG (vector, sharp at any size), and Save to Notes — which files the drawing as a sketch note and clears the screen.

Where drawings live

  • Per workspace, per screen. Each sheet is keyed by monitor and workspace: a drawing on a monitor doesn't reappear on another after a hotplug, and switching workspace brings its own drawing. Drawings belong to — Each workspace (default) or The screen (one drawing per monitor that stays whatever workspace is in front).
  • Slide with the workspace. With Slide with the workspace (tablet.liveDraw.workspaceParallax) the ink travels with the windows during the switch animation, slightly less far, so it reads as sitting a little behind the glass; the cost is one extra canvas for the length of the transition, and only when one of the two sheets has ink.
  • In memory only — on purpose. A workspace annotation that outlived a reboot would be a surprise. It does survive a reload of the shell, so redrawing is not needed while you tweak things mid-presentation. Ink that must last has the Save button.
  • One surface only when there is a reason. A layer-shell surface is created per screen only while the tray is open or that screen holds ink; an always-mapped overlay is blended over every frame for nothing and keeps a fullscreen game off direct scanout.

Pen and mouse feel

  • Pressure. Stylus pressure varies the width (Pen pressure, with a floor of a third of the nominal width, so strokes don't taper to nothing at their ends); a mouse or finger always draws an even line. The setting reads Waiting for a pen — a mouse always draws even lines until a stylus is seen (pressure strictly between 0 and 1 identifies a real pressure device, independent of how the driver presents itself — this is what makes an OpenTabletDriver virtual tablet work).
  • Smoothing. Line smoothing (0–95, default 55) rounds off every line at the cost of trailing the tip; Mouse smoothing (0–100, default 60) additionally steadies a hand on a mouse or touchpad by letting the brush trail the pointer on a short string. A pen is never smoothed that way. The pipeline is three passes in StrokeGeometry.js: thin (drop samples closer than ~1.6 px), exponential smoothing of position only, then width from pressure; strokes are drawn with the midpoint trick so consecutive curves meet with equal tangents.
  • Cursor. System crosshair uses the real cursor instead of the drawn ring (which redraws a screen-sized surface on every pointer move).

Script it

qs -c ii ipc call liveDraw toggle|draw|stop|quick      # quick = draw with no toolbar; `stop` ends it (hold-to-draw)
qs -c ii ipc call liveDraw pen on|off|toggle           # pen down / up (clicks go through)
qs -c ii ipc call liveDraw tool arrow                  # pen, highlighter, laser, line, arrow, rect, ellipse, eraser
qs -c ii ipc call liveDraw color "#e53935"             # or 1-9 for the palette
qs -c ii ipc call liveDraw width 8
qs -c ii ipc call liveDraw board light|dark|off|toggle
qs -c ii ipc call liveDraw spotlight | zoom | toolbar show|hide|toggle | sheet workspace|screen
qs -c ii ipc call liveDraw undo | redo | clear | clearAll
qs -c ii ipc call liveDraw copy | copyScreen | exportAs png|svg | save
qs -c ii ipc call liveDraw status                      # the whole state as JSON

Every function answers with what it did. Two other global shortcuts exist for binding to your own keys: liveDrawSpotlight and liveDrawZoom. A key held to draw is easy: bind quick to the press and stop to the release.

Configuration

Key Default Meaning
liveDraw.enable on Master switch (desktop)
liveDraw.mouseSmoothing 60 0–100
liveDraw.sheetMode workspace workspace or screen
liveDraw.nativeCursor off System crosshair
liveDraw.boardPattern grid none, grid, dots, lines
liveDraw.boardLight / boardDark #f7f6f2 / #1f2124 Board tones — literal colours on purpose: paper and chalkboard must not change with the wallpaper
tablet.liveDraw.width 4 Nominal width in px
tablet.liveDraw.pressure on Pressure-sensitive width
tablet.liveDraw.smoothing 55
tablet.liveDraw.palette white, near-black, red, orange, yellow, green, blue, purple Literal pigment colours (the one place colours are not themed: ink that recoloured with the theme couldn't be trusted)
tablet.liveDraw.workspaceParallax on Slide with the workspace

The pen's own keys live under tablet.liveDraw because the tablet got there first; both families read them, and all of them are edited from the toolbar's settings popup.

Under the hood

Piece Role
services/LiveDraw.qml The store: sheets (kept across shell reloads in a PersistentProperties), tools, colours, board, spotlight, zoom, undo/redo, save
modules/ii/liveDraw/LiveDrawOverlay.qml The desktop scope: global shortcuts, IPC, one window per screen when needed
modules/common/draw/ Shared by desktop and tablet: LiveDrawWindow, DrawSurface (the live stroke), DrawCanvas (finished strokes, repainted only when the sheet changes), DrawToolbar, LiveDrawSettings, StrokeGeometry.js
modules/tablet/liveDraw/ The tablet's pen tray

Implementation notes: the surface switches between drawing (its input mask covers the whole screen, every touch is ink) and pen up (the mask covers only the toolbar, so clicks pass through to the apps below); a tablet stylus never produces mouse events, so the toolbar buttons carry a tablet-only tap handler. Canvas.save() cannot be used under Quickshell (all base URLs are qs:), so images are saved with grabToImage + saveToFile.


Related pages

← Back to Home

Clone this wiki locally