The globalShowHide shortcut called mainWin.hide() unconditionally. On
Windows/Linux hide() removes the taskbar entry, so with no tray icon
the window became unreachable.
- macOS: use hide() (dock icon always remains).
- Windows/Linux: hide to tray only when minimize-to-tray is on AND the
tray was created; otherwise minimize() to keep a taskbar handle.
- Log whether Windows tray creation used the GUID path, to help diagnose
cases where the icon lands in the hidden overflow area.
Refs #7282
Rename the "overlay indicator" feature to "task widget" across the
entire codebase for clearer naming. Includes file renames, config key
migration, IPC event rename, and translation key updates.
Migration handles old persisted data from both the `overlayIndicator`
config key and the deprecated `misc.isOverlayIndicatorEnabled` field.
The `taskWidget` type is made optional in GlobalConfigState to prevent
Typia auto-fix from overwriting migrated values during upgrade.
- Make overlay window resizable with persisted bounds via simpleStore
- Add new OverlayIndicatorConfig section (isEnabled, isAlwaysShow, opacity)
- Move setting from misc.isOverlayIndicatorEnabled to overlayIndicator
with migration in reducer
- Add responsive CSS with scale variable (full/tiny modes)
- Add always-show mode that keeps overlay visible when main window is open
- Add opacity slider (10-100%) applied as CSS variable
- Consolidate overlay init into single updateOverlayEnabled path
- Remove dead code: updateOverlayTheme, setIgnoreMouseEvents, unused
shortcut param
Guard the SET_PROGRESS_BAR tray icon update with an _isRunning check so
that late IPC events (e.g. trailing throttle emissions from focus mode)
cannot override the correct stopped icon after a task is unset.
Closes#3410
Previously the tray icon only changed from "stopped" to "running" when
SET_PROGRESS_BAR fired on the first addTimeSpent tick, which could take
up to 60 seconds depending on the tracking interval. Now the
CURRENT_TASK_UPDATED handler sets the running icon immediately.
Extracts getRunningIconPath() helper to share icon selection logic
between SET_PROGRESS_BAR and CURRENT_TASK_UPDATED handlers.
Closes#6566
Windows ties tray icon GUIDs to the executable path when unsigned.
Portable and NSIS builds have different exe paths, so sharing a single
GUID caused silent tray creation failure in whichever distribution
registered second. Each distribution type now gets its own stable GUID.
Portable keeps the original GUID to avoid disrupting existing users.
NSIS and Store get new GUIDs for a clean start.
Also adds a try/catch fallback that retries without GUID if creation
fails (e.g., stale GUID registrations).
Closes#6647
The tray icon was jumping between showing task time and focus session time
when focus mode was active with a task being tracked. This occurred because
the tray display logic didn't know which focus mode was active.
Changes:
- Send focus mode type (Countdown/Pomodoro/Flowtime) from frontend to Electron
- Update IPC handler to receive and pass focus mode type to tray message creation
- Implement three-mode priority logic in createIndicatorMessage():
1. Countdown/Pomodoro modes: Show focus session countdown timer
2. Flowtime mode: Show task estimate or title (no timer)
3. No focus mode: Show normal task time (existing behavior)
- Update TypeScript type definitions for updateCurrentTask()
- Update unit tests to mock the new mode() signal
This ensures the tray displays the correct timer without jumping based on
the active focus mode, matching the behavior of the overlay indicator.
Fixes jumping tray indicator during focus mode + tracking
Electron validates the GUID argument even when undefined is passed,
causing "Invalid GUID format" error on Linux/macOS. Only pass the
GUID argument on Windows where it's needed.
Add a static GUID to the Electron Tray constructor on Windows to persist
tray icon position and visibility preferences across app updates. This
prevents the tray icon from being hidden in the overflow menu after
Microsoft Store updates change the executable path.
Closes#5973