docs(floating-pane): clarify shortcut behavior and modifier combos
Document toggle-vs-close semantics and Alt-key conflict caveats so floating pane bindings are predictable. Add unit coverage for ctrl+alt and ctrl+shift floating profile shortcuts to keep docs aligned with behavior.
- commit
- af377b45714e850a32809cac41afc52017fb5bdd
- author
- brice · · 2026-02-09 10:59 UTC
- parent
- 482d014
- signature
- GPG Verified
CD88F9E564E0102646FB6077A1A07C7C7C3E349D· arch-gpg Verified for the committer email
8 files · +120 -5
M README.md +10 -0
| @@ -23,6 +23,7 @@ https://github.com/user-attachments/assets/232822af-08e4-4a74-9416-87f79c96b118 | |||
| 23 | 23 | ||
| 24 | 24 | **Features:** | |
| 25 | 25 | - Zellij-style panes with modal keyboard navigation | |
| 26 | + | - Floating workspace pane with profile shortcuts | |
| 26 | 27 | - Wayland native (Sway, Hyprland, River, Niri) | |
| 27 | 28 | - Session resurrection with auto-snapshots | |
| 28 | 29 | - Built-in ad blocking (UBlock-based) | |
| @@ -90,6 +91,15 @@ Four modal modes. Enter a mode, take action, escape out. Vim and Zellij users wi | |||
| 90 | 91 | | Resize | `Ctrl+N` | Grow · Shrink · hjkl/arrows | | |
| 91 | 92 | | Session | `Ctrl+O` | Save · Restore · Browse | | |
| 92 | 93 | ||
| 94 | + | ## Floating Pane | |
| 95 | + | ||
| 96 | + | - `Alt+F` toggles the floating pane and preserves its state while hidden. | |
| 97 | + | - `Ctrl+W` closes the active pane; if the floating pane is active, it is fully released for a fresh next open. | |
| 98 | + | - Profile shortcuts like `Alt+G` are optional and configured under `workspace.floating_pane.profiles`. | |
| 99 | + | - Some `Alt+<key>` bindings may conflict with default WebKit shortcuts or desktop-level handlers. | |
| 100 | + | ||
| 101 | + | See [Floating Pane Reference](https://dumber.bnema.dev/docs/reference/floating-pane) for setup and behavior details. | |
| 102 | + | ||
| 93 | 103 | ## Development | |
| 94 | 104 | ||
| 95 | 105 | Dumber uses pure-Go bindings (no CGO) but requires GTK4/WebKitGTK runtime libraries for the GUI. | |
| @@ -23,6 +23,7 @@ https://github.com/user-attachments/assets/232822af-08e4-4a74-9416-87f79c96b118 | |||||
| 23 | 23 | ||||
| 24 | **Features:** | 24 | **Features:** | ||
| 25 | - Zellij-style panes with modal keyboard navigation | 25 | - Zellij-style panes with modal keyboard navigation | ||
| 26 | + | - Floating workspace pane with profile shortcuts | |||
| 26 | - Wayland native (Sway, Hyprland, River, Niri) | 27 | - Wayland native (Sway, Hyprland, River, Niri) | ||
| 27 | - Session resurrection with auto-snapshots | 28 | - Session resurrection with auto-snapshots | ||
| 28 | - Built-in ad blocking (UBlock-based) | 29 | - Built-in ad blocking (UBlock-based) | ||
| @@ -90,6 +91,15 @@ Four modal modes. Enter a mode, take action, escape out. Vim and Zellij users wi | |||||
| 90 | | Resize | `Ctrl+N` | Grow · Shrink · hjkl/arrows | | 91 | | Resize | `Ctrl+N` | Grow · Shrink · hjkl/arrows | | ||
| 91 | | Session | `Ctrl+O` | Save · Restore · Browse | | 92 | | Session | `Ctrl+O` | Save · Restore · Browse | | ||
| 92 | 93 | ||||
| 94 | + | ## Floating Pane | |||
| 95 | + | ||||
| 96 | + | - `Alt+F` toggles the floating pane and preserves its state while hidden. | |||
| 97 | + | - `Ctrl+W` closes the active pane; if the floating pane is active, it is fully released for a fresh next open. | |||
| 98 | + | - Profile shortcuts like `Alt+G` are optional and configured under `workspace.floating_pane.profiles`. | |||
| 99 | + | - Some `Alt+<key>` bindings may conflict with default WebKit shortcuts or desktop-level handlers. | |||
| 100 | + | ||||
| 101 | + | See [Floating Pane Reference](https://dumber.bnema.dev/docs/reference/floating-pane) for setup and behavior details. | |||
| 102 | + | ||||
| 93 | ## Development | 103 | ## Development | ||
| 94 | 104 | ||||
| 95 | Dumber uses pure-Go bindings (no CGO) but requires GTK4/WebKitGTK runtime libraries for the GUI. | 105 | Dumber uses pure-Go bindings (no CGO) but requires GTK4/WebKitGTK runtime libraries for the GUI. | ||
M docs/config/index.md +4 -1
| @@ -301,7 +301,7 @@ Global shortcuts are configured under `workspace.shortcuts.actions` using the sa | |||
| 301 | 301 | | Action | Default Keys | Description | | |
| 302 | 302 | |--------|--------------|-------------| | |
| 303 | 303 | | `toggle_floating_pane` | `alt+f` | Toggle the workspace floating pane (persistent session) | | |
| 304 | - | | `close_pane` | `ctrl+w` | Close active pane (closes tab if last pane) | | |
| 304 | + | | `close_pane` | `ctrl+w` | Close active pane (or release floating pane when floating is active) | | |
| 305 | 305 | | `next_tab` | `ctrl+tab` | Switch to next tab | | |
| 306 | 306 | | `previous_tab` | `ctrl+shift+tab` | Switch to previous tab | | |
| 307 | 307 | | `consume_or_expel_left` | `alt+[` | Consume into left sibling stack, or expel left if stacked | | |
| @@ -339,6 +339,9 @@ The floating workspace pane is a persistent overlay session: hiding it does not | |||
| 339 | 339 | ||
| 340 | 340 | - Default behavior includes exactly one floating shortcut: `Alt+F` (`toggle_floating_pane`). | |
| 341 | 341 | - URL shortcuts (for example `Alt+G`) are user-defined via `workspace.floating_pane.profiles` and are empty by default. | |
| 342 | + | - `Alt+F` toggles visibility only and preserves floating state. | |
| 343 | + | - `Ctrl+W` on an active floating pane closes and releases that floating session for a fresh next open. | |
| 344 | + | - Floating profile keybindings support modifier combos with `ctrl`, `shift`, and `alt` (for example `ctrl+shift+y` or `ctrl+alt+m`). | |
| 342 | 345 | ||
| 343 | 346 | | Key | Type | Default | Description | | |
| 344 | 347 | |-----|------|---------|-------------| | |
| @@ -301,7 +301,7 @@ Global shortcuts are configured under `workspace.shortcuts.actions` using the sa | |||||
| 301 | | Action | Default Keys | Description | | 301 | | Action | Default Keys | Description | | ||
| 302 | |--------|--------------|-------------| | 302 | |--------|--------------|-------------| | ||
| 303 | | `toggle_floating_pane` | `alt+f` | Toggle the workspace floating pane (persistent session) | | 303 | | `toggle_floating_pane` | `alt+f` | Toggle the workspace floating pane (persistent session) | | ||
| 304 | - | | `close_pane` | `ctrl+w` | Close active pane (closes tab if last pane) | | 304 | + | | `close_pane` | `ctrl+w` | Close active pane (or release floating pane when floating is active) | |
| 305 | | `next_tab` | `ctrl+tab` | Switch to next tab | | 305 | | `next_tab` | `ctrl+tab` | Switch to next tab | | ||
| 306 | | `previous_tab` | `ctrl+shift+tab` | Switch to previous tab | | 306 | | `previous_tab` | `ctrl+shift+tab` | Switch to previous tab | | ||
| 307 | | `consume_or_expel_left` | `alt+[` | Consume into left sibling stack, or expel left if stacked | | 307 | | `consume_or_expel_left` | `alt+[` | Consume into left sibling stack, or expel left if stacked | | ||
| @@ -339,6 +339,9 @@ The floating workspace pane is a persistent overlay session: hiding it does not | |||||
| 339 | 339 | ||||
| 340 | - Default behavior includes exactly one floating shortcut: `Alt+F` (`toggle_floating_pane`). | 340 | - Default behavior includes exactly one floating shortcut: `Alt+F` (`toggle_floating_pane`). | ||
| 341 | - URL shortcuts (for example `Alt+G`) are user-defined via `workspace.floating_pane.profiles` and are empty by default. | 341 | - URL shortcuts (for example `Alt+G`) are user-defined via `workspace.floating_pane.profiles` and are empty by default. | ||
| 342 | + | - `Alt+F` toggles visibility only and preserves floating state. | |||
| 343 | + | - `Ctrl+W` on an active floating pane closes and releases that floating session for a fresh next open. | |||
| 344 | + | - Floating profile keybindings support modifier combos with `ctrl`, `shift`, and `alt` (for example `ctrl+shift+y` or `ctrl+alt+m`). | |||
| 342 | 345 | ||||
| 343 | | Key | Type | Default | Description | | 346 | | Key | Type | Default | Description | | ||
| 344 | |-----|------|---------|-------------| | 347 | |-----|------|---------|-------------| | ||
M docs/getting-started.md +8 -0
| @@ -35,6 +35,14 @@ Press `Ctrl+L` to open the omnibox for: | |||
| 35 | 35 | - Search (uses default search engine) | |
| 36 | 36 | - Bang shortcuts (`!g query` for Google, `!gh query` for GitHub) | |
| 37 | 37 | ||
| 38 | + | ## Floating Pane | |
| 39 | + | ||
| 40 | + | - Press `Alt+F` to toggle the floating pane. | |
| 41 | + | - Press `Ctrl+W` to close the active pane; if floating is active, this fully releases it for a fresh next open. | |
| 42 | + | - Some `Alt+<key>` bindings can conflict with default WebKit shortcuts or desktop-level handlers. | |
| 43 | + | ||
| 44 | + | See [Floating Pane](./reference/floating-pane.md) for profile shortcuts and configuration. | |
| 45 | + | ||
| 38 | 46 | ## Configuration | |
| 39 | 47 | ||
| 40 | 48 | Edit `~/.config/dumber/config.toml` or use: | |
| @@ -35,6 +35,14 @@ Press `Ctrl+L` to open the omnibox for: | |||||
| 35 | - Search (uses default search engine) | 35 | - Search (uses default search engine) | ||
| 36 | - Bang shortcuts (`!g query` for Google, `!gh query` for GitHub) | 36 | - Bang shortcuts (`!g query` for Google, `!gh query` for GitHub) | ||
| 37 | 37 | ||||
| 38 | + | ## Floating Pane | |||
| 39 | + | ||||
| 40 | + | - Press `Alt+F` to toggle the floating pane. | |||
| 41 | + | - Press `Ctrl+W` to close the active pane; if floating is active, this fully releases it for a fresh next open. | |||
| 42 | + | - Some `Alt+<key>` bindings can conflict with default WebKit shortcuts or desktop-level handlers. | |||
| 43 | + | ||||
| 44 | + | See [Floating Pane](./reference/floating-pane.md) for profile shortcuts and configuration. | |||
| 45 | + | ||||
| 38 | ## Configuration | 46 | ## Configuration | ||
| 39 | 47 | ||||
| 40 | Edit `~/.config/dumber/config.toml` or use: | 48 | Edit `~/.config/dumber/config.toml` or use: | ||
M docs/index.md +1 -0
| @@ -33,6 +33,7 @@ A browser designed for Wayland compositors that works like your favorite termina | |||
| 33 | 33 | ||
| 34 | 34 | - [Dependencies](./reference/dependencies.md) - System dependencies for Arch and Debian/Ubuntu | |
| 35 | 35 | - [Keybindings](./reference/keybindings.md) - Keyboard shortcuts reference | |
| 36 | + | - [Floating Pane](./reference/floating-pane.md) - Floating pane behavior, shortcuts, and profiles | |
| 36 | 37 | - [Troubleshooting](./reference/troubleshooting.md) - Common issues and solutions | |
| 37 | 38 | ||
| 38 | 39 | ## Requirements | |
| @@ -33,6 +33,7 @@ A browser designed for Wayland compositors that works like your favorite termina | |||||
| 33 | 33 | ||||
| 34 | - [Dependencies](./reference/dependencies.md) - System dependencies for Arch and Debian/Ubuntu | 34 | - [Dependencies](./reference/dependencies.md) - System dependencies for Arch and Debian/Ubuntu | ||
| 35 | - [Keybindings](./reference/keybindings.md) - Keyboard shortcuts reference | 35 | - [Keybindings](./reference/keybindings.md) - Keyboard shortcuts reference | ||
| 36 | + | - [Floating Pane](./reference/floating-pane.md) - Floating pane behavior, shortcuts, and profiles | |||
| 36 | - [Troubleshooting](./reference/troubleshooting.md) - Common issues and solutions | 37 | - [Troubleshooting](./reference/troubleshooting.md) - Common issues and solutions | ||
| 37 | 38 | ||||
| 38 | ## Requirements | 39 | ## Requirements | ||
A docs/reference/floating-pane.md +57 -0
| @@ -0,0 +1,57 @@ | |||
| 1 | + | # Floating Pane | |
| 2 | + | ||
| 3 | + | The floating pane is an overlay workspace pane for quick-access pages like search, chat, email, or docs. | |
| 4 | + | ||
| 5 | + | ## Core Behavior | |
| 6 | + | ||
| 7 | + | | Action | Default Key | Result | | |
| 8 | + | |--------|-------------|--------| | |
| 9 | + | | Toggle floating pane | `Alt+F` | Show or hide the floating pane while keeping its current page and state | | |
| 10 | + | | Open profile in floating pane | User-defined (for example `Alt+G`) | Open or focus a named floating profile URL | | |
| 11 | + | | Close active pane | `Ctrl+W` | Close active pane; if floating is active, fully release floating session/WebView | | |
| 12 | + | ||
| 13 | + | ### Toggle vs Close | |
| 14 | + | ||
| 15 | + | - `Alt+F` is a visibility toggle. It hides or shows the floating pane without resetting content. | |
| 16 | + | - `Ctrl+W` on an active floating pane is a full close. It releases that floating session and its WebView. | |
| 17 | + | - After a floating pane is closed with `Ctrl+W`, opening it again starts from a fresh state. | |
| 18 | + | ||
| 19 | + | ## Configuration | |
| 20 | + | ||
| 21 | + | | Key | Type | Default | Description | | |
| 22 | + | |-----|------|---------|-------------| | |
| 23 | + | | `workspace.floating_pane.width_pct` | float | `0.82` | Floating pane width as a fraction of workspace width (`(0,1]`) | | |
| 24 | + | | `workspace.floating_pane.height_pct` | float | `0.72` | Floating pane height as a fraction of workspace height (`(0,1]`) | | |
| 25 | + | | `workspace.floating_pane.profiles.<name>.keys` | `[]string` | - | Shortcut keys for a profile | | |
| 26 | + | | `workspace.floating_pane.profiles.<name>.url` | string | - | URL to load for the profile | | |
| 27 | + | | `workspace.floating_pane.profiles.<name>.desc` | string | - | Optional description | | |
| 28 | + | ||
| 29 | + | ## Example | |
| 30 | + | ||
| 31 | + | ```toml | |
| 32 | + | [workspace.shortcuts.actions.toggle_floating_pane] | |
| 33 | + | keys = ["alt+f"] | |
| 34 | + | desc = "Toggle floating pane" | |
| 35 | + | ||
| 36 | + | [workspace.floating_pane] | |
| 37 | + | width_pct = 0.82 | |
| 38 | + | height_pct = 0.72 | |
| 39 | + | ||
| 40 | + | [workspace.floating_pane.profiles.gmail] | |
| 41 | + | keys = ["alt+m"] | |
| 42 | + | url = "https://mail.google.com" | |
| 43 | + | desc = "Open Gmail in floating pane" | |
| 44 | + | ||
| 45 | + | [workspace.floating_pane.profiles.google] | |
| 46 | + | keys = ["alt+g"] | |
| 47 | + | url = "https://google.com" | |
| 48 | + | desc = "Open Google in floating pane" | |
| 49 | + | ``` | |
| 50 | + | ||
| 51 | + | ## Practical Notes | |
| 52 | + | ||
| 53 | + | - The default install only binds `Alt+F` for floating pane toggle. | |
| 54 | + | - Profile shortcuts are opt-in and empty by default. | |
| 55 | + | - Profile shortcuts support multi-modifier combos using `ctrl`, `shift`, and `alt` (for example `ctrl+shift+y` or `ctrl+alt+m`). | |
| 56 | + | - Some `Alt+<key>` shortcuts can conflict with default WebKit shortcuts, website handlers, or your desktop environment. | |
| 57 | + | - If a shortcut does not fire in Dumber, bind a different key. | |
| @@ -0,0 +1,57 @@ | |||||
| 1 | + | # Floating Pane | |||
| 2 | + | ||||
| 3 | + | The floating pane is an overlay workspace pane for quick-access pages like search, chat, email, or docs. | |||
| 4 | + | ||||
| 5 | + | ## Core Behavior | |||
| 6 | + | ||||
| 7 | + | | Action | Default Key | Result | | |||
| 8 | + | |--------|-------------|--------| | |||
| 9 | + | | Toggle floating pane | `Alt+F` | Show or hide the floating pane while keeping its current page and state | | |||
| 10 | + | | Open profile in floating pane | User-defined (for example `Alt+G`) | Open or focus a named floating profile URL | | |||
| 11 | + | | Close active pane | `Ctrl+W` | Close active pane; if floating is active, fully release floating session/WebView | | |||
| 12 | + | ||||
| 13 | + | ### Toggle vs Close | |||
| 14 | + | ||||
| 15 | + | - `Alt+F` is a visibility toggle. It hides or shows the floating pane without resetting content. | |||
| 16 | + | - `Ctrl+W` on an active floating pane is a full close. It releases that floating session and its WebView. | |||
| 17 | + | - After a floating pane is closed with `Ctrl+W`, opening it again starts from a fresh state. | |||
| 18 | + | ||||
| 19 | + | ## Configuration | |||
| 20 | + | ||||
| 21 | + | | Key | Type | Default | Description | | |||
| 22 | + | |-----|------|---------|-------------| | |||
| 23 | + | | `workspace.floating_pane.width_pct` | float | `0.82` | Floating pane width as a fraction of workspace width (`(0,1]`) | | |||
| 24 | + | | `workspace.floating_pane.height_pct` | float | `0.72` | Floating pane height as a fraction of workspace height (`(0,1]`) | | |||
| 25 | + | | `workspace.floating_pane.profiles.<name>.keys` | `[]string` | - | Shortcut keys for a profile | | |||
| 26 | + | | `workspace.floating_pane.profiles.<name>.url` | string | - | URL to load for the profile | | |||
| 27 | + | | `workspace.floating_pane.profiles.<name>.desc` | string | - | Optional description | | |||
| 28 | + | ||||
| 29 | + | ## Example | |||
| 30 | + | ||||
| 31 | + | ```toml | |||
| 32 | + | [workspace.shortcuts.actions.toggle_floating_pane] | |||
| 33 | + | keys = ["alt+f"] | |||
| 34 | + | desc = "Toggle floating pane" | |||
| 35 | + | ||||
| 36 | + | [workspace.floating_pane] | |||
| 37 | + | width_pct = 0.82 | |||
| 38 | + | height_pct = 0.72 | |||
| 39 | + | ||||
| 40 | + | [workspace.floating_pane.profiles.gmail] | |||
| 41 | + | keys = ["alt+m"] | |||
| 42 | + | url = "https://mail.google.com" | |||
| 43 | + | desc = "Open Gmail in floating pane" | |||
| 44 | + | ||||
| 45 | + | [workspace.floating_pane.profiles.google] | |||
| 46 | + | keys = ["alt+g"] | |||
| 47 | + | url = "https://google.com" | |||
| 48 | + | desc = "Open Google in floating pane" | |||
| 49 | + | ``` | |||
| 50 | + | ||||
| 51 | + | ## Practical Notes | |||
| 52 | + | ||||
| 53 | + | - The default install only binds `Alt+F` for floating pane toggle. | |||
| 54 | + | - Profile shortcuts are opt-in and empty by default. | |||
| 55 | + | - Profile shortcuts support multi-modifier combos using `ctrl`, `shift`, and `alt` (for example `ctrl+shift+y` or `ctrl+alt+m`). | |||
| 56 | + | - Some `Alt+<key>` shortcuts can conflict with default WebKit shortcuts, website handlers, or your desktop environment. | |||
| 57 | + | - If a shortcut does not fire in Dumber, bind a different key. | |||
M docs/reference/index.md +1 -0
| @@ -6,6 +6,7 @@ | |||
| 6 | 6 | - [Permissions](./permissions.md) - Website permission handling (mic, camera, screen sharing) | |
| 7 | 7 | - [Dependencies](./dependencies.md) - System dependencies for Arch and Debian/Ubuntu | |
| 8 | 8 | - [Keybindings](./keybindings.md) - All keyboard shortcuts | |
| 9 | + | - [Floating Pane](./floating-pane.md) - Floating-pane behavior, profiles, and shortcut semantics | |
| 9 | 10 | - [Troubleshooting](./troubleshooting.md) - Common issues and solutions | |
| 10 | 11 | - [Session Exit Classification Runbook](./session-exit-classification-runbook.md) - Marker-based exit classification and optional system-log correlation | |
| 11 | 12 | ||
| @@ -6,6 +6,7 @@ | |||||
| 6 | - [Permissions](./permissions.md) - Website permission handling (mic, camera, screen sharing) | 6 | - [Permissions](./permissions.md) - Website permission handling (mic, camera, screen sharing) | ||
| 7 | - [Dependencies](./dependencies.md) - System dependencies for Arch and Debian/Ubuntu | 7 | - [Dependencies](./dependencies.md) - System dependencies for Arch and Debian/Ubuntu | ||
| 8 | - [Keybindings](./keybindings.md) - All keyboard shortcuts | 8 | - [Keybindings](./keybindings.md) - All keyboard shortcuts | ||
| 9 | + | - [Floating Pane](./floating-pane.md) - Floating-pane behavior, profiles, and shortcut semantics | |||
| 9 | - [Troubleshooting](./troubleshooting.md) - Common issues and solutions | 10 | - [Troubleshooting](./troubleshooting.md) - Common issues and solutions | ||
| 10 | - [Session Exit Classification Runbook](./session-exit-classification-runbook.md) - Marker-based exit classification and optional system-log correlation | 11 | - [Session Exit Classification Runbook](./session-exit-classification-runbook.md) - Marker-based exit classification and optional system-log correlation | ||
| 11 | 12 | ||||
M docs/reference/keybindings.md +9 -4
| @@ -80,7 +80,7 @@ These work outside modal modes: | |||
| 80 | 80 | | Action | Keys | | |
| 81 | 81 | |--------|------| | |
| 82 | 82 | | Toggle floating pane | `Alt+F` | | |
| 83 | - | | Close pane | `Ctrl+W` | | |
| 83 | + | | Close pane (or release floating pane) | `Ctrl+W` | | |
| 84 | 84 | | Next tab | `Ctrl+Tab` | | |
| 85 | 85 | | Previous tab | `Ctrl+Shift+Tab` | | |
| 86 | 86 | | Consume/expel left | `Alt+[` | | |
| @@ -88,12 +88,17 @@ These work outside modal modes: | |||
| 88 | 88 | | Consume/expel up | `Alt+{` | | |
| 89 | 89 | | Consume/expel down | `Alt+}` | | |
| 90 | 90 | ||
| 91 | - | `Alt+F` is the only floating-pane shortcut enabled by default. | |
| 92 | - | Any URL-opening shortcut (for example `Alt+G`) must be defined explicitly in `workspace.floating_pane.profiles`. | |
| 91 | + | - `Alt+F` is the only floating-pane shortcut enabled by default. | |
| 92 | + | - `Alt+F` toggles floating visibility and keeps floating pane state intact. | |
| 93 | + | - `Ctrl+W` closes the active pane; when the floating pane is active, it fully releases that floating session. | |
| 94 | + | - Any URL shortcut (for example `Alt+G`) must be defined explicitly in `workspace.floating_pane.profiles`. | |
| 95 | + | - Floating profile shortcuts support modifier combos with `ctrl`, `shift`, and `alt` (for example `ctrl+shift+y` or `ctrl+alt+m`). | |
| 93 | 96 | ||
| 94 | - | Warning: some `Alt+<key>` combinations may already be handled by WebKit, websites, or your desktop environment. | |
| 97 | + | Warning: some `Alt+<key>` combinations may conflict with default WebKit shortcuts, website handlers, or your desktop environment. | |
| 95 | 98 | If a shortcut does not trigger in Dumber, choose a different keybinding. | |
| 96 | 99 | ||
| 100 | + | For details, see [Floating Pane](./floating-pane.md). | |
| 101 | + | ||
| 97 | 102 | ## Customization | |
| 98 | 103 | ||
| 99 | 104 | All keybindings can be customized in `~/.config/dumber/config.toml`: | |
| @@ -80,7 +80,7 @@ These work outside modal modes: | |||||
| 80 | | Action | Keys | | 80 | | Action | Keys | | ||
| 81 | |--------|------| | 81 | |--------|------| | ||
| 82 | | Toggle floating pane | `Alt+F` | | 82 | | Toggle floating pane | `Alt+F` | | ||
| 83 | - | | Close pane | `Ctrl+W` | | 83 | + | | Close pane (or release floating pane) | `Ctrl+W` | |
| 84 | | Next tab | `Ctrl+Tab` | | 84 | | Next tab | `Ctrl+Tab` | | ||
| 85 | | Previous tab | `Ctrl+Shift+Tab` | | 85 | | Previous tab | `Ctrl+Shift+Tab` | | ||
| 86 | | Consume/expel left | `Alt+[` | | 86 | | Consume/expel left | `Alt+[` | | ||
| @@ -88,12 +88,17 @@ These work outside modal modes: | |||||
| 88 | | Consume/expel up | `Alt+{` | | 88 | | Consume/expel up | `Alt+{` | | ||
| 89 | | Consume/expel down | `Alt+}` | | 89 | | Consume/expel down | `Alt+}` | | ||
| 90 | 90 | ||||
| 91 | - | `Alt+F` is the only floating-pane shortcut enabled by default. | 91 | + | - `Alt+F` is the only floating-pane shortcut enabled by default. |
| 92 | - | Any URL-opening shortcut (for example `Alt+G`) must be defined explicitly in `workspace.floating_pane.profiles`. | 92 | + | - `Alt+F` toggles floating visibility and keeps floating pane state intact. |
| 93 | + | - `Ctrl+W` closes the active pane; when the floating pane is active, it fully releases that floating session. | |||
| 94 | + | - Any URL shortcut (for example `Alt+G`) must be defined explicitly in `workspace.floating_pane.profiles`. | |||
| 95 | + | - Floating profile shortcuts support modifier combos with `ctrl`, `shift`, and `alt` (for example `ctrl+shift+y` or `ctrl+alt+m`). | |||
| 93 | 96 | ||||
| 94 | - | Warning: some `Alt+<key>` combinations may already be handled by WebKit, websites, or your desktop environment. | 97 | + | Warning: some `Alt+<key>` combinations may conflict with default WebKit shortcuts, website handlers, or your desktop environment. |
| 95 | If a shortcut does not trigger in Dumber, choose a different keybinding. | 98 | If a shortcut does not trigger in Dumber, choose a different keybinding. | ||
| 96 | 99 | ||||
| 100 | + | For details, see [Floating Pane](./floating-pane.md). | |||
| 101 | + | ||||
| 97 | ## Customization | 102 | ## Customization | ||
| 98 | 103 | ||||
| 99 | All keybindings can be customized in `~/.config/dumber/config.toml`: | 104 | All keybindings can be customized in `~/.config/dumber/config.toml`: | ||
M internal/ui/input/floating_shortcuts_test.go +30 -0
| @@ -162,3 +162,33 @@ func TestShortcutSet_FloatingProfilesWithSameURLGetDistinctSessionIDs(t *testing | |||
| 162 | 162 | assert.Equal(t, "https://mail.google.com", personalTarget.URL) | |
| 163 | 163 | assert.NotEqual(t, workTarget.SessionID, personalTarget.SessionID) | |
| 164 | 164 | } | |
| 165 | + | ||
| 166 | + | func TestShortcutSet_FloatingProfiles_SupportModifierCombos(t *testing.T) { | |
| 167 | + | cfg := config.DefaultConfig() | |
| 168 | + | cfg.Workspace.FloatingPane.Profiles = map[string]config.FloatingPaneProfile{ | |
| 169 | + | "mail": { | |
| 170 | + | Keys: []string{"ctrl+alt+m"}, | |
| 171 | + | URL: "https://mail.example.com", | |
| 172 | + | }, | |
| 173 | + | "search": { | |
| 174 | + | Keys: []string{"ctrl+shift+y"}, | |
| 175 | + | URL: "https://search.example.com", | |
| 176 | + | }, | |
| 177 | + | } | |
| 178 | + | ||
| 179 | + | set := NewShortcutSet(context.Background(), cfg) | |
| 180 | + | ||
| 181 | + | mailAction, ok := set.Lookup(KeyBinding{Keyval: uint(gdk.KEY_m), Modifiers: ModCtrl | ModAlt}, ModeNormal) | |
| 182 | + | require.True(t, ok) | |
| 183 | + | mailTarget, ok := ParseFloatingProfileTarget(mailAction) | |
| 184 | + | require.True(t, ok) | |
| 185 | + | assert.Equal(t, "mail", mailTarget.SessionID) | |
| 186 | + | assert.Equal(t, "https://mail.example.com", mailTarget.URL) | |
| 187 | + | ||
| 188 | + | searchAction, ok := set.Lookup(KeyBinding{Keyval: uint(gdk.KEY_y), Modifiers: ModCtrl | ModShift}, ModeNormal) | |
| 189 | + | require.True(t, ok) | |
| 190 | + | searchTarget, ok := ParseFloatingProfileTarget(searchAction) | |
| 191 | + | require.True(t, ok) | |
| 192 | + | assert.Equal(t, "search", searchTarget.SessionID) | |
| 193 | + | assert.Equal(t, "https://search.example.com", searchTarget.URL) | |
| 194 | + | } | |
| @@ -162,3 +162,33 @@ func TestShortcutSet_FloatingProfilesWithSameURLGetDistinctSessionIDs(t *testing | |||||
| 162 | assert.Equal(t, "https://mail.google.com", personalTarget.URL) | 162 | assert.Equal(t, "https://mail.google.com", personalTarget.URL) | ||
| 163 | assert.NotEqual(t, workTarget.SessionID, personalTarget.SessionID) | 163 | assert.NotEqual(t, workTarget.SessionID, personalTarget.SessionID) | ||
| 164 | } | 164 | } | ||
| 165 | + | ||||
| 166 | + | func TestShortcutSet_FloatingProfiles_SupportModifierCombos(t *testing.T) { | |||
| 167 | + | cfg := config.DefaultConfig() | |||
| 168 | + | cfg.Workspace.FloatingPane.Profiles = map[string]config.FloatingPaneProfile{ | |||
| 169 | + | "mail": { | |||
| 170 | + | Keys: []string{"ctrl+alt+m"}, | |||
| 171 | + | URL: "https://mail.example.com", | |||
| 172 | + | }, | |||
| 173 | + | "search": { | |||
| 174 | + | Keys: []string{"ctrl+shift+y"}, | |||
| 175 | + | URL: "https://search.example.com", | |||
| 176 | + | }, | |||
| 177 | + | } | |||
| 178 | + | ||||
| 179 | + | set := NewShortcutSet(context.Background(), cfg) | |||
| 180 | + | ||||
| 181 | + | mailAction, ok := set.Lookup(KeyBinding{Keyval: uint(gdk.KEY_m), Modifiers: ModCtrl | ModAlt}, ModeNormal) | |||
| 182 | + | require.True(t, ok) | |||
| 183 | + | mailTarget, ok := ParseFloatingProfileTarget(mailAction) | |||
| 184 | + | require.True(t, ok) | |||
| 185 | + | assert.Equal(t, "mail", mailTarget.SessionID) | |||
| 186 | + | assert.Equal(t, "https://mail.example.com", mailTarget.URL) | |||
| 187 | + | ||||
| 188 | + | searchAction, ok := set.Lookup(KeyBinding{Keyval: uint(gdk.KEY_y), Modifiers: ModCtrl | ModShift}, ModeNormal) | |||
| 189 | + | require.True(t, ok) | |||
| 190 | + | searchTarget, ok := ParseFloatingProfileTarget(searchAction) | |||
| 191 | + | require.True(t, ok) | |||
| 192 | + | assert.Equal(t, "search", searchTarget.SessionID) | |||
| 193 | + | assert.Equal(t, "https://search.example.com", searchTarget.URL) | |||
| 194 | + | } | |||