Commit Graph
905 Commits
Author SHA1 Message Date
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