Repository navigation
Tablet Family
ii-p3drovfx ships three panel families — three different shells drawn over the same settings and services:
| Family | What it is |
|---|---|
illogical-impulse (ii, the default) |
The full desktop shell: sidebars, dock, overview and every optional surface |
| Tablet | Touch-first: a status bar, a home screen, an app drawer and edge gestures |
| Waffle | A taskbar, a start menu and an action centre, in the shape of a familiar desktop |
This page is about the Tablet family — the one that turns a touchscreen device into something close to an Android tablet, and turns back into a desktop the moment you switch families. Most of it was built without a touchscreen to test on, so the commit history is candid about which gestures were verified by reasoning rather than by finger; if something misbehaves on real hardware, an issue with the device model helps.
- Settings → Interface & Fonts → Shell family — a row of three cards with the current family's description under it. Switching rebuilds every surface, so the screen goes briefly blank; your settings are kept, each family simply draws a different set of them.
- Ctrl + Super + P cycles through the families.
- A chooser — the same three cards over a dimmed backdrop — is a gesture action (Switch Shell), and in the tablet family it has a button in the notification shade's bottom row next to Settings and Power, so a device with no keyboard can always get out again.
- IPC:
qs -c ii ipc call panelFamily pick | set <ii|tablet|waffle> | list | cycle. The setting isConfig.options.panelFamily. - The Settings search knows tablet mode, waffle and switch shell.
Two of the family's capabilities are native helpers that ship as source: the daemon that raises the on-screen keyboard when a text field is tapped, and the one that reads touch gestures. The first time the tablet family runs without them it says so in a small window — one row per helper with its own Build button, Build both, and Do it later — and shows cargo's progress while it compiles. The dismissal is remembered for that set of missing helpers; a different helper going missing later prompts again.
Each workspace is a home screen. Long-press an app in the drawer and choose Add to home screen to put its icon on the current one (or set the long press to drop it straight away); drag icons around (they snap to a coarser grid than the desktop's, Icon grid step in Settings); long-press an icon to arm a remove badge that takes a second, deliberate tap, plus badges that move the icon to the page on either side. Drop one icon onto another to make a folder — tap it to launch, rename, send an app back to the home screen or add more. In Edit Mode, the Add drawer also offers New App Pair (one icon that opens two apps side by side) and New App Folder. Dots above the dock show which page you are on. Swiping across bare wallpaper changes workspace, and the Home button always lands on the same workspace (Home workspace, 0 = the monitor's first).
An Android-style taskbar written for a finger: pinned apps (shared with the desktop dock), a divider, the apps that are actually running (as many as fit; what does not fit is grouped into a folder in the last slot), and the drawer button. Around it:
- A search pill on the left that opens the drawer with the field focused. It can shrink to a Compact circle, and its leading and trailing buttons are yours to pick — Search, App drawer, Clipboard, Files, Emojis, Translator or None.
- Navigation buttons — back, home, recents — which stay visible even when the app row hides.
- Workspace arrows at either end and a page counter, for moving between home screens without a swipe.
- Dock background — none (icons straight on the wallpaper, outlined), translucent or solid, optionally floating; and whether the dock reserves screen space.
- Tapping a running app focuses its window (focus) or launches another copy (launch); a double tap always launches. The long-press menu also offers Open beside current app, which puts the app on the current workspace so Hyprland tiles the two.
Swipe up from the bottom edge (see gestures), tap the dock's drawer button, or qs -c ii ipc call appDrawer toggle (appDrawerToggle is also a global shortcut you can bind). It is the family's launcher:
- A grid of every installed app under a pinned search field, with a Most used row above it and an A–Z rail down the side you can scrub.
-
Sorting — Name A–Z / Z–A, Category, Most used — plus category chips from the
.desktopfiles. While you type, the order is relevance. - Search reaches more than apps — the shell's tool panels are tiles in the grid and open inside the drawer; clipboard entries and file matches get their own column; typing wifi or dark lists the matching quick toggles as switches. (Search files across the whole system widens file matches beyond the launcher's search directory.)
-
Long-press opens a menu: the app's own
.desktopshortcuts, Open, Add to home screen, Pin to dock. - Drag an app out to open it — hold an app and move it: the drawer steps aside and shows where the app will open; resting at a side edge moves to the next workspace.
- Workspace overview — Show GNOME-style workspace overview puts a strip of live workspace thumbnails between the search bar and the grid, for reordering windows and switching workspaces.
-
Shell surfaces as apps — App Usage, Modes & Routines, the on-screen keyboard, the Cheat Sheet's tabs (Keybinds, plus Timetable, Periodic Table, Amino Acids, Commands, Workspaces, Email, Typing Test and Dev Tools when enabled), the video editor, the scratchpad, Notes, and the six former policies-sidebar tabs (Intelligence, Translator, Media, Wallpapers, Anime, Phone) each open as their own window with a Back and a Close button. They are filed A–Z in the grid with everything else; a disabled feature's entry is left out.
qs -c ii ipc call tabletApp open <id>opens one from a script.
Swipe up and hold, tap the dock's recents button, or bind recentsToggle. Every open window is a card — icon and title over a live capture — scrubbed sideways (or paged as a grid). Tap a card to go there, fling it upward to close it, tap its header for Screenshot this window / Float / Fullscreen / Close and, when it makes sense, Split with current app (move the window next to what is on the workspace you are returning to). Screenshot and Split also sit under whichever card is centred (Actions under the centred card). A Clear all pill arms and asks before closing everything, a New workspace pill lands on an empty one, and the pinned apps stay along the bottom.
Settings → Tablet → Gestures:
- Bottom edge — Home, drawer, recents (swipe up = Home, swipe up from Home = the drawer following your finger, swipe up and hold = Recents; a sideways swipe along the edge quick-switches between the apps you were just in) or App drawer only, the older behaviour.
- Side edges — Back on both edges, Policies on the left (the Intelligence app on the left edge, Back on the right), or Unclaimed (both edges go to whatever you bound under Edge and corner bindings).
-
Back closes the topmost thing first — a quick toggle's dialog before the shade, a menu before the drawer, the keyboard unless it is pinned — then the shell's surfaces in order. Let Back reach the focused app sends a key to the window once nothing is left to close: Alt + Left (default), the browser Back key, Escape or Backspace (a custom mods/key pair can be set in the config file:
backKey: "custom"withcustomBackMods/customBackKeyundertablet.navigation). - Multi-finger swipes — three fingers by default: workspaces sideways, the app drawer up, the shade down; the finger count, the distance and all four directions are adjustable.
-
Notification shade — pulled down from the top edge (the Pull-down edge height strip sits above the bar). Quick toggles keep a tablet layout of their own (
sidebar.quickToggles.androidTablet), borrowing the desktop arrangement until first edited.
Open new windows floating — off, all windows, or keep dialogs where the compositor put them — sized as a share of the usable area, cascaded so a second window does not land on the first, with an exclusion list by app id. A title strip of touch handles (drag it by the strip, centre, tile, fullscreen, close, plus a corner handle to resize) sits over the focused floating window, and a split-view handle between tiled windows can be dragged to resize them or tapped to swap, even out, float or close.
Settings → Tablet → Pen. Pen mode is off by default. Use a pen for the pointer swaps the arrow for a small ring at the size you choose. The stylus's barrel buttons (lower and upper) are bound to shell actions here, from the same registry the gestures use; Drag window is the one action that works while held. Nothing needs configuring in OpenTabletDriver — it passes the buttons through as ordinary stylus buttons, which the shell's input helper already watches (scripts/tablet/pen-buttons.py shows what your pen sends). Leaving pen mode, or quitting the shell, restores your cursor theme.
Write over whatever is on screen. While drawing, the overlay takes every touch; once kept, the ink stays on top but taps pass through to the apps. A sheet belongs to the workspace it was drawn on and slides along when you switch (Slide drawings with their workspace), lasts until it is rubbed out, and is in memory only — the save button files it, cropped to the ink, into Notes. Pressure from a stylus varies the line; smoothing and thickness are adjustable. Reach it from the floating bubble, a gesture (Draw on Screen), the search, or qs -c ii ipc call liveDraw draw | stop | toggle | save | clear.
Charging and left alone, the tablet turns into a clock, weather and now-playing display readable from across a room — what a Pixel Tablet does when docked. Off by default (Turn into a display when idle). Only while charging can be turned off to use it as a desk display; Stay out of the way while something is playing; idle seconds before it takes over (120 by default); any touch brings the tablet back. Show me what it looks like previews it without waiting (also qs -c ii ipc call hubMode preview | hide | toggle, or the Hub Mode (Display) gesture action); the preview leaves on its own after 45 s if nothing is tapped.
- Raise the keyboard when a text field is tapped — only focus caused by a finger or a pen counts, so a mouse click never raises it. The keyboard reserves its height so the field it was raised for is pushed up, not covered. Needs the keyboard helper (built from the first-launch window, or Build it now under Settings → Tablet → Keyboard).
- Keyboard on the lock screen — the regular on-screen keyboard cannot appear over a session lock, so the lock screen draws its own: Auto (on for a touch-first family), Always or Never, as Letters (with a symbols layer) or a PIN pad.
- Split the keyboard for thumb typing (in the on-screen keyboard's settings) pushes the halves apart for a tablet held in two hands — off by default.
A small circle you can drag anywhere, which stays put even over a fullscreen application. Tapping it opens a sheet of eight large actions of your choosing; Draw on screen is drawn as a wide bar at the top.
- The bar is sized for a finger (a 48 px floor) and the Dynamic Island corner style is drawn as Hug in this family.
- Every right-click to configure in the shared controls can be reached by holding instead.
- Keyboard-shortcut hints are hidden from the search panels in this family.
- Edit Mode works here too.
- In the ii family, Settings → Overview → Change Overview to an App Drawer (Experimental) replaces the overview with the tablet's app drawer (
Config.options.overview.useAppDrawer) — offered as-is, built for the tablet family.
Settings → Tablet (listed only while the tablet family runs): Notification shade, Dock, App drawer, Home screen, Recent apps, Windows, Floating bubble, Pen, Draw on screen, Hub mode, Keyboard, Gestures. Options persist under Config.options.tablet (dock, recents, navigation, windows, bubble, pen, liveDraw, hubMode, gestures, appDrawer); a few live beside the features they belong to — sidebar.tabletShade, sidebar.quickToggles.androidTablet, lock.touchKeyboard, osk.autoShow, interactions.touchGestures.multiFinger. Home-screen icon placement is state, in ~/.local/state/quickshell/states.json.
| Piece | Role |
|---|---|
panelFamilies/TabletFamily.qml |
The family's composition root — the one file allowed to reach into ii for tool panels and hosted apps |
modules/common/PanelFamily.qml, modules/common/panels/shellSwitcher/
|
The family catalogue and the chooser |
modules/tablet/appDrawer/, modules/tablet/appWindow/, modules/tablet/navigation/, modules/tablet/windows/, modules/tablet/menu/
|
Drawer (grid, overview strip, drag-to-open), hosted app windows and the system-app registry, edge and back handling, touch handles and split geometry, inline menus |
modules/settings/configs/TabletConfig.qml (+ widgets/TabletAppDrawerConfig.qml, TabletWindowsConfig.qml) |
The Tablet settings page |
modules/common/TouchGestureActionRegistry.qml, services/RustHelperBuild.qml
|
Gesture and bubble actions; building the native helpers |