Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 16 additions & 5 deletions desktop/OmniMenu.qml
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,10 @@ Item {
// Named `navbar` to avoid colliding with the existing `nav: []`
// category-row array further down.
property var navbar: null
// Expose can host the palette's search state and result list inside its
// own layer-shell surface. In that mode the normal fullscreen panel and
// global shortcuts stay dormant; the owning surface handles focus.
property bool embedded: false

readonly property color paper: theme.paper
readonly property color ink: theme.ink
Expand Down Expand Up @@ -140,6 +144,7 @@ Item {
function collapseTile() { root.expandedTile = null; }

Bookmarks { id: bookmarks }
readonly property alias omniBookmarks: bookmarks

// ---------- Quick tiles ----------
// Split into a *static* base array (the Repeater's model) and a
Expand Down Expand Up @@ -249,6 +254,7 @@ Item {
active: root.procMode && !root.tldrMode && !root.llmMode
selectedItem: root.filteredItems[root.selectedIndex] || null
}
readonly property alias omniProcesses: processes
readonly property alias procItems: processes.items
readonly property alias procRunning: processes.running
readonly property alias procPreviewText: processes.previewText
Expand All @@ -258,6 +264,7 @@ Item {
id: themes
active: root.themeMode && !root.tldrMode && !root.llmMode
}
readonly property alias omniThemes: themes
readonly property alias themeItems: themes.items
readonly property alias themeLoaded: themes.loaded

Expand All @@ -282,6 +289,7 @@ Item {
active: root.llmMode
mode: root.cmdMode ? "command" : "chat"
}
readonly property alias omniOllamaChat: ollamaChat
readonly property alias chatItems: ollamaChat.items
readonly property alias chatRunning: ollamaChat.running
readonly property alias chatPreview: ollamaChat.previewText
Expand Down Expand Up @@ -387,6 +395,7 @@ Item {
// ||, &&, redirects) work alongside plain
// argv-style commands without a special case
Process { id: runner; running: false }
property var externalList: null
function activate(item) {
if (!item) return;
if (item.isCategory) {
Expand Down Expand Up @@ -680,7 +689,8 @@ Item {
next = wrap ? ((next % n) + n) % n
: Math.max(0, Math.min(n - 1, next));
root.selectedIndex = next;
resultListInstance.list.positionViewAtIndex(next, ListView.Contain);
const view = root.externalList || resultListInstance.list;
if (view) view.positionViewAtIndex(next, ListView.Contain);
}

// Grid-aware step for Quick mode. `delta` may exceed ±1 (arrow Up/Down
Expand Down Expand Up @@ -724,27 +734,28 @@ Item {
// bind = ALT, SPACE, global, quickshell:palette-quick
GlobalShortcut {
appid: "quickshell"
name: "palette-toggle"
name: root.embedded ? "palette-toggle-embedded" : "palette-toggle"
description: "Toggle omni-menu palette"
onPressed: root.toggle()
}
GlobalShortcut {
appid: "quickshell"
name: "palette-quick"
name: root.embedded ? "palette-quick-embedded" : "palette-quick"
description: "Open omni-menu pivoted to Quick"
onPressed: { root.open(); root.categoryFilter = "Quick"; }
}

// ---------- Panel ----------
PanelWindow {
id: panel
visible: root.visible_ || reveal > 0.001
visible: !root.embedded && (root.visible_ || reveal > 0.001)
color: "transparent"
anchors { top: true; bottom: true; left: true; right: true }
exclusionMode: ExclusionMode.Ignore
WlrLayershell.layer: WlrLayer.Overlay
WlrLayershell.namespace: "omni-menu"
WlrLayershell.keyboardFocus: root.visible_ ? WlrKeyboardFocus.Exclusive : WlrKeyboardFocus.None
WlrLayershell.keyboardFocus: !root.embedded && root.visible_
? WlrKeyboardFocus.Exclusive : WlrKeyboardFocus.None

property real reveal: root.visible_ ? 1 : 0
// Open and close are both instant: SUPER+SPACE paints the palette on
Expand Down
7 changes: 7 additions & 0 deletions desktop/omni/qmldir
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
module desktop.omni
Footer 1.0 Footer.qml
HeaderBar 1.0 HeaderBar.qml
PreviewPane 1.0 PreviewPane.qml
QuickContainer 1.0 QuickContainer.qml
ResultList 1.0 ResultList.qml
SearchInput 1.0 SearchInput.qml
50 changes: 50 additions & 0 deletions desktop/qmldir
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
module desktop
AppScan 1.0 AppScan.qml
AetherPopup 1.0 AetherPopup.qml
Bar 1.0 Bar.qml
BarHacker 1.0 BarHacker.qml
BarWhiterose 1.0 BarWhiterose.qml
Bloom 1.0 Bloom.qml
Bookmarks 1.0 Bookmarks.qml
CalendarChevron 1.0 CalendarChevron.qml
CalendarPopup 1.0 CalendarPopup.qml
CardWindow 1.0 CardWindow.qml
DisplayChip 1.0 DisplayChip.qml
DisplayPopup 1.0 DisplayPopup.qml
DisplaySlider 1.0 DisplaySlider.qml
FileSearch 1.0 FileSearch.qml
GhSearch 1.0 GhSearch.qml
HackerStat 1.0 HackerStat.qml
Module 1.0 Module.qml
NavbarApps 1.0 NavbarApps.qml
Navbar 1.0 Navbar.qml
OllamaChat 1.0 OllamaChat.qml
OmniMenu 1.0 OmniMenu.qml
Processes 1.0 Processes.qml
QuickAetherBody 1.0 QuickAetherBody.qml
QuickAudioBody 1.0 QuickAudioBody.qml
QuickBatteryBody 1.0 QuickBatteryBody.qml
QuickBluetoothBody 1.0 QuickBluetoothBody.qml
QuickButton 1.0 QuickButton.qml
QuickCalendarBody 1.0 QuickCalendarBody.qml
QuickCpuBody 1.0 QuickCpuBody.qml
QuickDisplayBody 1.0 QuickDisplayBody.qml
QuickPowerBody 1.0 QuickPowerBody.qml
QuickScreenshotsBody 1.0 QuickScreenshotsBody.qml
QuickSlider 1.0 QuickSlider.qml
QuickVideosBody 1.0 QuickVideosBody.qml
QuickWeatherBody 1.0 QuickWeatherBody.qml
QuickWifiBody 1.0 QuickWifiBody.qml
ScreenshotsPopup 1.0 ScreenshotsPopup.qml
Separator 1.0 Separator.qml
SystemPopup 1.0 SystemPopup.qml
Theme 1.0 Theme.qml
Themes 1.0 Themes.qml
TldrSearch 1.0 TldrSearch.qml
Tuis 1.0 Tuis.qml
TooltipOverlay 1.0 TooltipOverlay.qml
VideosPopup 1.0 VideosPopup.qml
WallhavenSource 1.0 WallhavenSource.qml
WeatherPopup 1.0 WeatherPopup.qml
WhiteRoseCell 1.0 WhiteRoseCell.qml
Workspace 1.0 Workspace.qml
18 changes: 10 additions & 8 deletions expose/README.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# expose

Mission-Control-style workspace overview with real per-workspace thumbnails. Triggered by IPC. Click a tile to jump, click a window inside the tile to focus it directly.
Mission-Control-style workspace overview with real per-workspace thumbnails and an inline omni search dock. Triggered by IPC. Click a tile to jump, click a window inside the tile to focus it directly.

```
┌──────────────┐ ┌──────────────┐ ┌──────────────┐
Expand Down Expand Up @@ -31,7 +31,7 @@ Wayland forbids a layer-shell client from screencapping arbitrary surfaces. So t

1. Tails Hyprland's `.socket2.sock` event stream.
2. On any `workspace`, `workspacev2`, `focusedmon`, `openwindow`, `closewindow`, `movewindow`, `fullscreen`, or `changefloatingmode` event, restarts a 400ms debounce.
3. When the debounce fires, runs `grim -o <monitor> -s 0.35` for every monitor's currently active workspace and writes the result to `~/.cache/quickshell/expose/ws-<id>.png` (~50KB).
3. When the debounce fires, runs `grim -o <monitor> -s 1` for every monitor's currently active workspace and writes a full-resolution result to `~/.cache/quickshell/expose/ws-<id>.png`.

A workspace shows as a real screenshot once you've visited it at least once during this session. Never-visited workspaces show a fallback schematic view (faint indigo rectangles labeled with their window class). The active-window outline overlay works in both modes.

Expand All @@ -58,11 +58,13 @@ qs -c expose ipc call expose capture # force a fresh capture of all visible wo

| Key | Action |
| --- | --- |
| arrows / hjkl | move selection |
| Tab / Shift+Tab | next / previous |
| 1-9 | jump directly to that workspace |
| Enter, Space | jump to selected workspace |
| Esc, q | dismiss |
| arrows / hjkl | move workspace selection |
| Tab / Shift+Tab | next / previous workspace |
| any printable key | open inline omni search |
| arrows / Tab / Shift+Tab | move through search results while typing |
| 1-9 | jump directly to that workspace when search is idle |
| Enter | jump to the selected workspace or run the selected search result |
| Esc | clear the search, then dismiss |

Click on the dim backdrop also dismisses. Hovering a tile selects it.

Expand All @@ -84,4 +86,4 @@ If `grim` is missing the module still works, it just falls back to the schematic

## Theming

Reads `~/.config/omarchy/current/theme/colors.toml` for `background`, `foreground`, `accent`, `color1`, `color7`, `color8`. Re-themes live on `omarchy theme set`. Serif for the kanji markers and overview title, JetBrainsMono for window class labels and badges.
Reads `~/.config/omarchy/current/theme/colors.toml` for `background`, `foreground`, `accent`, `color1`, `color7`, `color8`. Re-themes live on `omarchy theme set`. Serif for the workspace markers; JetBrainsMono for window class labels, badges, and the inline omni search.
8 changes: 6 additions & 2 deletions expose/WorkspaceTile.qml
Original file line number Diff line number Diff line change
Expand Up @@ -33,8 +33,12 @@ Item {
property int wsIndex: 0

// ---- derived ----
readonly property real monW: mon && mon.width ? mon.width : 1920
readonly property real monH: mon && mon.height ? mon.height : 1080
// Hyprland reports monitor dimensions in physical pixels, while client
// geometry and grim -s 1 screenshots use logical pixels.
readonly property real monW: mon && mon.width
? mon.width / (mon.scale || 1) : 1920
readonly property real monH: mon && mon.height
? mon.height / (mon.scale || 1) : 1080
readonly property color stripeColor: focused
? tile.shell.seal
: (current ? tile.shell.indigo : Qt.rgba(tile.shell.sumi.r, tile.shell.sumi.g, tile.shell.sumi.b, 0.45))
Expand Down
Loading