Skip to content

feat: implement Phase 3 (Global App Menu) and Phase 4 (System Tray) - #4

Merged
Chintanpatel24 merged 1 commit into
mainfrom
feat/macos-tahoe-bar
Sep 1, 2026
Merged

feat: implement Phase 3 (Global App Menu) and Phase 4 (System Tray)#4
Chintanpatel24 merged 1 commit into
mainfrom
feat/macos-tahoe-bar

Conversation

@Chintanpatel24

Copy link
Copy Markdown
Member
  • Phase 3 (Global App Menu):
    • Added AppMenu widget with File, Edit, View, Window, and Help menus
    • Contextual action popovers with keyboard shortcuts and Niri window actions
    • Integrated cleanly next to active application name in LeftSection
  • Phase 4 (System Tray):
    • Added SystemTray widget connecting to org.kde.StatusNotifierWatcher on DBus
    • Real-time rendering of third-party tray icons (Discord, Telegram, Steam, etc.)
    • Click-to-activate support
    • Integrated into RightSection with macOS liquid glass styling
  • Documentation and roadmap updated

- Phase 3 (Global App Menu):
  - Added AppMenu widget with File, Edit, View, Window, and Help menus
  - Contextual action popovers with keyboard shortcuts and Niri window actions
  - Integrated cleanly next to active application name in LeftSection
- Phase 4 (System Tray):
  - Added SystemTray widget connecting to org.kde.StatusNotifierWatcher on DBus
  - Real-time rendering of third-party tray icons (Discord, Telegram, Steam, etc.)
  - Click-to-activate support
  - Integrated into RightSection with macOS liquid glass styling
- Documentation and roadmap updated
Copilot AI lite review requested due to automatic review settings September 1, 2026 16:23
@Chintanpatel24
Chintanpatel24 merged commit 3e83eb5 into main Sep 1, 2026
1 check passed

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Implements the next two UI milestones in Mistbar by adding a macOS-style global application menu and a StatusNotifier-based system tray, then wiring both into the existing bar layout and styling.

Changes:

  • Added AppMenu widget that renders File/Edit/View/Window/Help menus with actions and shortcut labels.
  • Added SystemTray widget that polls org.kde.StatusNotifierWatcher and renders clickable tray icons.
  • Integrated new widgets into LeftSection/RightSection, added SCSS styling, and updated the roadmap in README.md.

Reviewed changes

Copilot reviewed 6 out of 6 changed files in this pull request and generated 3 comments.

Show a summary per file
File Description
src/widgets/SystemTray.tsx New system tray widget: polls StatusNotifierWatcher and renders tray items.
src/widgets/AppMenu.tsx New global app menu widget with popover menus and action handlers.
src/styles/style.scss Adds styling for the app menu and tray; tweaks popover separator spacing.
src/bar/RightSection.tsx Inserts SystemTray into the right-side widget stack.
src/bar/LeftSection.tsx Inserts AppMenu next to the active window label.
README.md Updates project structure list and marks Phase 3/4 as complete.
Suppressed comments (1)

src/widgets/AppMenu.tsx:58

  • The "Quit" menu item is currently wired to the same niri msg action close-window command as "Close Window", but it advertises Ctrl+Q. This mismatch will surprise users and (for multi-window apps) may not actually perform an application quit.
            <button
              class="menu-option-btn"
              onClicked={() => execAsync(["bash", "-c", "niri msg action close-window 2>/dev/null || true"]).catch(console.error)}
            >
              <box spacing={16}>
                <label class="menu-option-label" label="Quit" hexpand halign={Gtk.Align.START} />
                <label class="menu-shortcut" label="Ctrl+Q" />
              </box>

💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

Comment thread src/widgets/AppMenu.tsx
Comment on lines +41 to +44
<button
class="menu-option-btn"
onClicked={() => execAsync(["bash", "-c", "niri msg action close-window 2>/dev/null || true"]).catch(console.error)}
>
Comment on lines +12 to +16
const trayItemsJson = createPoll(
"[]",
3000,
["bash", "-c", `python3 -c '
import subprocess, json
Comment on lines +30 to +31
content = raw[raw.index("[")+1:raw.index("]")]
entries = [x.strip().strip("\\x27\\"") for x in content.split(",") if x.strip()]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants