Commit Graph
100 Commits
Author SHA1 Message Date
sankalp 700b29a465 fix(/.github/workflows): correct inputs parameter for dependency audit action 2026-07-16 17:41:02 +05:45
sankalp 619db0e512 refactor(config/hypr): change keybinding for locking screen from Ctrl+L to Super+L 2026-07-16 17:39:33 +05:45
sankalp a383c484b6 chore: add commitlint.config.js 2026-07-16 17:39:14 +05:45
sankalp d1866cc699 chore(.github/workflows): add CI workflows for commit lint, dependency audit, and install script testing 2026-07-16 17:38:53 +05:45
sankalp 6e9cb8efc8 refactor(src/window/spotlight/plugins): improve emoji annotation download using curl for better error handling 2026-07-16 17:27:52 +05:45
sankalp e3b8ae0c45 refactor(services): simplify GoogleLens upload implementation using curl 2026-07-16 17:10:50 +05:45
sankalp 41cb9afa07 fix(src/window/notification): stop polling when revealer is closing/destroyed
The callback may execute after _on_notification_finished has fired, causing errors.
2026-07-16 12:13:19 +05:45
sankalp 83af1829c4 refactor(src/window/dock/canvas): reorganize client lookup and tooltip generation to prevent stale references 2026-07-16 12:13:01 +05:45
sankalp e840917621 fix(src/window/controlcenter): add guard for destroyed state and adjust return value 2026-07-16 12:12:43 +05:45
sankalp 843c33786f fix(src/services): handle race condition in artwork generation and daemon cleanup 2026-07-16 12:12:15 +05:45
sankalp 19046cd1ee feat(optional): add libmediaart to PACKAGES 2026-07-16 12:11:57 +05:45
sankalp 1c119535d5 chore(config/hypr): correct uv command to run python script 2026-07-16 12:04:22 +05:45
sankalp a47abda55a fix: resolve wifi crashes, shell injections, race conditions, and add debug mode
- Remove transient NEED_AUTH/DISCONNECTED error paths from wifi connect
- Guard double-callback in connect_wifi_bssid/connect_wifi_with_password
- Shell-quote user paths in wallpaper, screenshot, screenrecorder services
- Fix OSD hide-timer use-after-free and applet_window stale source ID
- Fix brightness poll timer leak on read failure
- Fix spotlight search stale idle source removal
- Lock dbusmenu _cache mutation under _registry_lock
- Fix entry.revision written outside _registry_lock scope
- Add fabric-cli exec wrapper for lock screen (lock_screen.lock())
- Replace hyprlock with lock screen in power menu and dropdown
- Add debug mode toggle in settings (controls log verbosity)
- Add diagnostic logging to globalmenu click chain
2026-07-16 11:47:53 +05:45
sankalp 4378959131 fix(controlcenter): refresh player state on resume
When control center hides, PlayerBox.suspend() blocks all signal
handlers. On resume(), clearing the flag wasn't enough — stale
state lingered until next fabricator poll (up to 5s). Now resume()
immediately syncs play/pause icon, metadata, and artwork.
2026-07-15 21:22:51 +05:45
sankalp 42ede60800 refactor: drop unused SettingsRow definitions from SettingsWindow
Removed three SettingsRow widgets that were no longer needed, cleaning up the UI configuration.
2026-07-15 19:37:22 +05:45
sankalp 6442161f40 refactor(src/window/globalmenu): simplify caching logic and remove dynamic menu method selection 2026-07-15 19:37:02 +05:45
sankalp 11603990ee refactor(src/utils): remove unused global_menu_method and global_menu_cache_enabled from constants.py 2026-07-15 19:36:44 +05:45
sankalp 016d18090d refactor(src/window/spotlight/plugins): increase timeout interval to 50ms for clipboard and emoji paste actions 2026-07-15 11:30:46 +05:45
sankalp e6c471a9f8 fix(src/window/spotlight): add error handling around action invocation
Prevent crashes when result.action() raises exceptions and log warnings.
2026-07-15 11:30:23 +05:45
sankalp 211a428cca feat(src/utils): replace clipboard implementation with wl-copy and enhance copy_image support 2026-07-15 11:30:01 +05:45
sankalp 2c9a050bbb fix(spotlight): run immediate search on Enter when debounced results empty
on_entry_changed uses @debounce(300). When user presses Enter before
debounce fires, _current_results is empty so nothing activates.

Now on_entry_accept triggers an immediate search_single when active
plugin has no results, and activates the first result on callback.
2026-07-15 10:52:44 +05:45
sankalp 4503130be3 fix(spotlight): activate first result before on_submit in entry accept
_on_entry_accept checked _active_plugin_entry before _current_results.
Keyword plugins (emoji, clipboard) are always active when prefix typed,
so on_submit (no-op base) swallowed Enter before result.action() fired.

Now results are checked first. on_submit only as fallback when no results.
2026-07-15 10:49:43 +05:45
sankalp 9eb62d7ea3 feat(config): wire up wallpapers_dir, osd, window_switcher, global_menu settings
- wallpapers_dir: read from config, fallback ~/Pictures/Wallpapers
- osd: skip show_audio_osd/show_brightness_osd when disabled
- window_switcher: skip show_switcher when disabled
- global_menu_cache_enabled: bypass GTK class cache when false
- global_menu_method: control discovery strategies (auto/hyprland/dbus)

All keys added to constants.py defaults, settings UI, and config.toml
2026-07-15 10:31:28 +05:45
sankalp e63a2c04a5 refactor: extract reusable utils, remove screencapture facade
- Add ManagedTimer to replace repeated source_remove/timeout_add boilerplate
- Add EvdevLockService base class for numlock/capslock (cut 154→28 lines)
- Add BaseNotchIndicator for 5 near-identical indicator classes (cut 404→171 lines)
- Add load_pixbuf_thumbnail and resolve_monitor to utils
- Delete screencapture.py facade; callers use Screenshot/ScreenRecorder directly
2026-07-15 10:01:40 +05:45
sankalp ebe1238b3d feat(src/window/spotlight/plugins): implement is_active detection and notification handling for caffeine plugin
Add CaptureNotifier import and send notifications when caffeine is enabled or disabled. Introduce is_active() static method to check inhibition status via PID file and process cmdline. Replace previous _read_pid() usage with is_active(). Enhance _humanize to properly format "0s" and hour-only durations. Update activation logic to use the new method and trigger appropriate notifications.
2026-07-15 09:04:00 +05:45
sankalp cdccb9e726 feat(src/window/controlcenter): implement caffeine inhibitor toggling
Add support for managing systemd‑inhibit processes via a PID file; introduce _caffeine_is_active helper; modify _check_initial_states and toggle_caffeine to start/stop inhibition and update UI icons and labels.
2026-07-15 09:03:39 +05:45
sankalp cda8f55109 feat!: rename inhibit_changed to inhibit-changed and add enable_timed method 2026-07-15 09:03:08 +05:45
sankalp ddacdea3eb refactor(src/window/controlcenter): replace svg_file imports with Image and simplify battery icon handling 2026-07-14 23:26:21 +05:45
sankalp f2517ee9f3 feat(src/window/notification): add action buttons creation and improve UI alignment 2026-07-14 23:11:19 +05:45
sankalp e4e1d3a291 style(src/styles/notification): adjust mac- CSS for notification UI 2026-07-14 23:11:02 +05:45
sankalp e7c49d7dda refactor(src/window/notification): simplify hover handling and close‑button styling for notifications 2026-07-14 22:46:18 +05:45
sankalp 5dd3abb3b4 style(src/styles/notification): refine notification button styling and hover behavior 2026-07-14 22:45:55 +05:45
sankalp 4df8b93e6c fix(src/window/panel/components/globalmenu): correct active window detection to exclude Modus 2026-07-14 22:00:10 +05:45
sankalp 5668c5153e feat(src/utils): rename default app name from Finder to Modus
build(release): bump version to 2.0.0
2026-07-14 21:59:52 +05:45
sankalp 3d355482c6 refactor(src/services): replace default active app name from "Finder" to "Modus"
Modified default active app name in ModusService initialization and update logic to "Modus" to align with the project's branding and avoid confusion with macOS Finder.
2026-07-14 21:59:34 +05:45
sankalp 04ac938dd2 refactor(src/window/dock): replace manual drawing of shadows, borders, and backgrounds with Gtk.render_background and Gtk.render_frame 2026-07-14 21:58:35 +05:45
sankalp 3ace1a1bd2 style(src/styles/window): add .dock-background styling 2026-07-14 21:58:16 +05:45
sankalp 59e9c8498e style(src/styles/window): migrate to glass color variables 2026-07-14 21:43:39 +05:45
sankalp 9f192cdc56 refactor(styles/widgets): update CSS color variables to use glass theming 2026-07-14 21:43:22 +05:45
sankalp ef7b200c74 style(src/styles/notification): switch notification background colors to glass tokens 2026-07-14 21:43:04 +05:45
sankalp 21e8a3e7da chore(src/styles): migrate to glass surface color tokens
Remove legacy color definition blocks and replace with new glass-surface, glass-panel, and interactive state tokens. Update all component styles to reference new variables.
2026-07-14 21:42:46 +05:45
sankalp 50640d33aa refactor(config/hypr): remove noise setting and enable ignore_opacity 2026-07-14 21:42:28 +05:45
sankalp 6a5287d039 feat(config): enhance hypridle lock command and modus visual settings 2026-07-14 18:46:18 +05:45
sankalp 6f2d0bf444 chore: refactor imports and adopt new utils utilities 2026-07-14 18:45:52 +05:45
sankalp b2114f52b1 refactor: migrate globalmenu implementation to src/window/globalmenu and adjust documentation paths 2026-07-14 18:45:35 +05:45
sankalp a782d30f15 refactor: reorganize globalmenu into src/window 2026-07-14 18:45:14 +05:45
sankalp 22b239f33c chore: update labeler.yml to correct glob pattern for globalmenu files 2026-07-14 18:44:57 +05:45
sankalp 0496100788 feat(spotlight): add Caffeine plugin to inhibit idle/sleep
Uses systemd-inhibit with a pinned sleep process and PID file so
the inhibition survives Spotlight dismiss. Supports on/off and
duration presets (5m/15m/30m/1h) plus free-form parsing.
2026-07-14 13:47:58 +05:45
sankalp 2d22df94ca refactor: drive UI from service signals, drop redundant polling
- bluetooth.py / wifi.py: remove 5s periodic refresh timers; rely on
  service `changed`/`device-added`/`device-removed`/`notify` signals
- expanded_player.py: remove 500ms metadata poll; rely on
  `meta-change`/`artwork-change` signals
- player.py (notch): connect previously dangling `artwork-change` handler
- popup_win.py: silence harmless "nothing connected" warning on destroy()

No behaviour change; eliminates dead timers and log spam.
2026-07-14 13:46:21 +05:45
sankalp 9ff5ebc95c refactor(spotlight): replace raw socket IPC with Fabric Service over DBus
SpotlightWindow now exposed via SpotlightService (fabric Service) on the
session bus (dev.modus.Spotlight /Toggle). On-demand process forwards to
the running instance over DBus instead of a unix socket; still quits on
dismiss. Behaviour unchanged.
2026-07-14 13:02:26 +05:45
sankalp f72542a231 refactor: log swallowed exceptions across src/
Replace silent swallow-excepts (pass/return/continue) with
logger.warning recording the caught error, preserving behaviour.
2026-07-14 13:02:21 +05:45
sankalp c0a4b1b792 refactor(src/window/dock): improve desktop file search matching logic
Check exact desktop file name first and enhance matching algorithm to prioritize exact matches, compute relevance scores, and return the best match.
2026-07-14 02:36:20 +05:45
sankalp 1b2f06a251 feat(src/utils): add EvdevLEDMonitor helper to monitor EV_LED state changes without polling 2026-07-14 02:36:02 +05:45
sankalp 1dcce186a7 refactor(src/shared): simplify active_ids set comprehension 2026-07-14 02:35:44 +05:45
sankalp e734c4bbf4 refactor: improve brightness polling and caching via pathlib 2026-07-14 02:35:25 +05:45
sankalp 112f4b1039 refactor(services): convert weather + gamemode to Fabric services
Weather: move networking, caching and scheduling out of the Weather widget
into a WeatherService singleton. Reuse one httpx.Client for the app lifetime,
drop the 4-worker pool and the multi-entry dict caches (single-value fields),
query Nominatim only on location change, remove debounce and the /tmp-style
polling. Widget now observes the `updated` signal and never hits the network.

GameMode: turn the standalone CLI script into a GameModeService (Service
singleton) exposing an `enabled` Property and `changed` signal. Drive Hyprland
via `hyprctl eval hl.config(...)` instead of the deprecated `hyprctl keyword`
batch (rejected under the Lua config in Hyprland 0.55+), read state via
`hl.get_config`, and keep `hyprctl reload` for disable. Fix game-mode state
parsing so unrecognized `hl.get_config` output no longer falsely reports
active. BatteryWidget's GameModeButton now subscribes to the service.

Remove now-unused LOCATION_CACHE_TIMEOUT.
2026-07-14 00:37:52 +05:45
sankalp f3f17bb5fc refactor(services): split screen capture into screenshot + recorder services
Split the monolithic ScreenCapture service into focused Screenshot and
ScreenRecorder services behind a pluggable capture backend.

- Add shared/capture.py: CaptureBackend abstraction + HyprlandCaptureBackend
  (hyprshot/grim/slurp/wf-recorder) and reusable CaptureNotifier
- Add services/screenshot.py and services/screenrecorder.py with Fabric
  properties/signals; recording state kept in memory (no /tmp files)
- Keep services/screencapture.py as a backwards-compatible facade so
  existing widgets and signals keep working
- Resolve monitors via Hyprland IPC helpers in services/modus.py instead of
  spawning `hyprctl monitors -j` per capture
- Implement real window recording (slurp window boxes) and split the
  record-window / record-region UI mappings
- Register screenshot_service / screen_recorder_service singletons
- Remove dead src/utils/inhibit.py duplicate; minor modus.lua quoting fix
2026-07-13 23:52:32 +05:45
sankalp 54ff85ffc9 fix(services/spotlight): improve MPRIS artwork handling and scope keyword searches to single plugin
- mpris: native MediaArt cache lookup, dedupe play/pause emission, safe
  cleanup, artwork polling for already-playing browser players, drop
  os.system seek fallback
- spotlight: scope plugin keyword and detect() matches to a single plugin
  via search_single instead of global search; register clipboard keywords
  (clip/clipboard)
2026-07-13 22:20:19 +05:45
sankalp 1fc7edd483 feat(install): symlink hypridle.conf to ~/.config/hypr
Create symlink during installation so hypridle uses Modus config
2026-07-12 20:27:15 +05:45
sankalp 4a84710634 ci: change Dependabot schedule from weekly to monthly 2026-07-12 20:25:54 +05:45
sankalp 74e9ab183f chore: update dependencies and gitignore
- Update ruff to 0.15.2 in requirements.txt
- Add pre-commit to requirements.txt
- Update uv.lock with new dependencies
- Add config/plugins/ to gitignore, remove src/window/launcher
2026-07-12 20:19:09 +05:45
sankalp d6efc12ef1 style(switcher): fix trailing whitespace in app-capture C code
Clean up whitespace in app-capture.c and hyprland-toplevel-mapping XML
2026-07-12 20:19:05 +05:45
sankalp b421e39052 refactor(window): cleanup controlcenter and notification imports
Remove unused imports in controlcenter and notification modules
2026-07-12 20:18:10 +05:45
sankalp 66632f0989 refactor(core): rename APP_NAME to 'modus', cleanup shared widgets
- Change APP_NAME from 'modus1' to 'modus' in shared/data.py
- Remove unused flat_scale widget
- Add missing imports in animator and customrevealer
- Delete src/utils/uinput.py (unused)
- Remove unused import in utils/functions.py
2026-07-12 20:18:05 +05:45
sankalp 94ed52f4b5 docs: update architecture, configuration, and FAQs
- Expand architecture overview with plugin system details
- Update configuration guide with new spotlight settings
- Improve FAQs with troubleshooting tips
- Remove docs/README.md (content merged into main README)
2026-07-12 20:17:56 +05:45
sankalp a2171b7013 config: update keybinds and remove launcher.toml
- Rename fabric-cli exec to use 'modus' instead of 'modus1'
- Add spotlight keybinds (Super+D, Super+E, Super+V, Super+W)
- Change reload bind to Alt+Shift+R
- Delete config/launcher.toml (replaced by spotlight plugins)
2026-07-12 20:17:52 +05:45
sankalp f065ce5d7c style: remove launcher CSS and cleanup style imports
- Delete launcher styles (general, index, network, results, search)
- Remove unused imports from controlpanel and notification CSS
- Minor tweaks to window and settings styles
2026-07-12 20:17:44 +05:45
sankalp aefbaa4996 style(icons): fix trailing newline in SVG files
Ensure all icon SVGs end with newline for consistency
2026-07-12 20:17:37 +05:45
sankalp 3a81ab1212 feat(spotlight): add plugin system with core engine and examples
- Plugin API (plugin.py, context.py, result.py)
- Core engine (search.py, manager.py, registry.py, loader.py)
- Built-in plugins: app, calculator, clipboard, emoji, power_menu, query, wallpapers
- Spotlight docs and example plugins
- Spotlight CSS styling
2026-07-12 20:17:34 +05:45
sankalp 795e259e16 fix(panel): wire search button to toggle spotlight
- Add on_clicked handler to search button in panel
- Add set_spotlight_toggle() method on Panel
- Connect spotlight.toggle in main.py after both are created
2026-07-12 20:16:23 +05:45
sankalp b5c92a9a77 docs: rearrange README sections and remove roadmap
New flow: hero -> quick start -> manual install -> docs -> config -> mods -> plugins -> team
Rename 'Links' to 'Documentation' for clarity
2026-07-12 20:16:14 +05:45
sankalp e72b35ffa7 chore: update project metadata in pyproject.toml
- Description, license (GPL-3.0-or-later), authors, keywords
- Add classifiers, project URLs (homepage, docs, issues, Discord)
- Restructure dependencies before project.urls to fix TOML parsing
2026-07-12 20:16:00 +05:45
sankalp 00b505ca66 ci: add Dependabot config for pip and GitHub Actions
Weekly dependency updates for Python packages and Actions versions
2026-07-12 20:15:45 +05:45
sankalp e64ef88f3e docs: add issue templates, PR template, and labeler config
- Bug report: version, component, repro steps, logs, environment
- Feature request: component, description, alternatives
- Question: with links to docs/Discord
- PR template: summary, type, testing checklist, screenshots
- Labeler: auto-label PRs (python, config, c-backend, styling, ci, docs, assets, install)
2026-07-12 20:15:33 +05:45
sankalp d4eab2cb34 chore: add pre-commit config with ruff and standard hooks
- ruff lint + format (v0.15.2)
- trailing whitespace, EOF fixer, YAML/TOML validation
2026-07-12 20:15:19 +05:45
sankalp c445b2e2a4 ci: add CodeQL, pre-commit, and labeler workflows
- CodeQL: Python security analysis on push/PR + weekly schedule
- Pre-commit: ruff lint/format checks on push/PR
- Labeler: auto-label PRs based on changed files
2026-07-12 20:15:10 +05:45
sankalp d0e1f7090a chore(install): add --yes flag, use subshell, clean up git output
- Add -y/--yes flag to skip interactive prompts
- Replace cd/cd- with subshell in app-capture build
- Replace fragile grep -v pipe with stderr redirect for git output
- Total steps still matches progress calls
2026-07-12 19:28:55 +05:45
sankalp ae90b85f75 fix(install): hardcoded path, step count, launch flow
- Replace /home/sankalp/ with $INSTALL_DIR in MODUS_MODULE_LINE
- Fix TOTAL_STEPS 11→12 to match actual progress calls
- Move 'Launching Modus' to end (stop + start in one block)
- Remove orphaned 'Starting Modus' step from under Matugen
2026-07-12 19:26:29 +05:45
sankalp 3142d70279 refactor(dock): extract DockItem into items.py, remove TYPE_CHECKING
DockItem, DockModel, DockHitTest moved to items.py.
layout.py and animator.py now import directly — no circular deps.
2026-07-12 19:25:06 +05:45
sankalp 980734f465 fix(dock): quote TYPE_CHECKING annotations for runtime safety
DockItem and DockCanvas are only imported under TYPE_CHECKING.
String-annotate their usage so they aren't evaluated at runtime.
2026-07-12 19:21:58 +05:45
sankalp 07d35d8fdf fix(dock): restore TYPE_CHECKING guards to break circular imports
animator.py and layout.py both circular-import from canvas.py.
Restore the TYPE_CHECKING blocks and suppress TC004 globally.
2026-07-12 19:20:24 +05:45
sankalp f4281e6aca fix(install): compile global menu shim from src/globalmenu/ instead of non-existent native/ 2026-07-12 19:12:33 +05:45
sankalp 01aac24f7e refactor(bluetooth): resolve device icons from GTK icon theme
_check_icon_to_type now queries Gtk.IconTheme for the icon name
(with -symbolic suffix) before falling back to a hardcoded mapping.
_get_icon_for_device simplified since type property now returns
GTK icon names directly.
2026-07-12 19:07:41 +05:45
sankalp 15e64df428 refactor: consolidate debounce into utils/debounce.py
Move method-specific debounce from functions.py to debounce.py,
keeping both debounce (method) and sync_debounce (general) together.
2026-07-12 19:04:33 +05:45
sankalp 30c02f207d chore: remove unused conversion.py (CurrencyCache, Units) 2026-07-12 19:02:07 +05:45
sankalp c5961c7832 chore: add project copyright header to LICENSE 2026-07-12 19:00:27 +05:45
sankalp c9f3f27e18 refactor: remove occlusion.py wrapper, import check_occlusion from services.modus directly 2026-07-12 18:59:18 +05:45
sankalp 7934267924 docs: link contribution guide in README 2026-07-12 18:40:03 +05:45
sankalp d0ca929b76 docs: add contribution guide 2026-07-12 18:39:52 +05:45
sankalp 096231bc44 style: enforce consistent codestyle via ruff config and auto-fixes
- Configure ruff: isort, pyupgrade, bugbear, flake8 rules
- Auto-fix import sorting, redundant parens, exception chaining
- Remove from __future__ import annotations (Python 3.13+)
- Convert debug print() to logger calls
- Fix typo applicaiton → application in icon_resolver
- Remove bare returns in animator setters
- Move TYPE_CHECKING imports to runtime where used at runtime
2026-07-12 18:38:13 +05:45
sankalp afd826d0c0 refactor(services): enhance TodoService with callbacks, UUID IDs, and UTF‑8 file handling 2026-07-12 09:33:41 +05:45
sankalp 51283125ef chore: add ALT+TAB keybinding
Change config/hypr/modus.lua to bind ALT+TAB to switcher.show_switcher() and remove the stale comment.
2026-07-12 09:33:25 +05:45
sankalp c0ac114610 feat(src/assets): add pomodoro sound assets
Add new alert and tick sounds for pomodoro timer, update project metadata in pyproject.toml and requirements.txt to include new dependencies.
2026-07-12 09:33:05 +05:45
sankalp 4637799e11 feat(src/window/pomodoro): implement Pomodoro timer widget and integrate it into the panel
Add Pomodoro component with UI controls and state management,
modify Panel to instantiate and cache Pomodoro and TodoList widgets,
hook datetime button to toggle Pomodoro and handle right‑click on todo list,
extend destroy logic to cleanly close Pomodoro and Todo instances.
2026-07-12 09:32:47 +05:45
sankalp b78710002a docs(readme): mark Pomodoro Timer Widget as completed 2026-07-12 09:32:26 +05:45
sankalp 8a4508159e feat(src/window): add lockscreen implementation 2026-07-12 05:27:32 +05:45
sankalp cec3ca56b0 refactor(src): remove lockscreen implementation
The lockscreen module in src/lock.py has been removed to clean up unused code and simplify the project structure. This change does not affect current functionality but prepares the codebase for future enhancements.
2026-07-12 05:27:15 +05:45
sankalp 0cd7a7c3f4 docs: add comprehensive documentation for installation, architecture, and styling 2026-07-12 05:26:57 +05:45
sankalp 11ad484fb6 feat(root): update lock dependency to window.lock and document README properly 2026-07-12 05:26:40 +05:45
sankalp 5af4a80d1d refactor: hide window instead of showing when recording starts 2026-07-12 05:02:26 +05:45