Commit Graph
70 Commits
Author SHA1 Message Date
sankalp d97477b2b9 refactor(network): replace nmcli with native D-Bus for Wi-Fi management
This commit fully migrates the Python network service away from external wlan0: connected to Amar 2GNet
	"MEDIATEK MT7921 802.11ax"
	wifi (mt7921e), 2C:98:11:76:9B:2B, hw, mtu 1500
	ip4 default, ip6 default
	inet4 192.168.18.70/24
	route4 192.168.18.0/24 metric 600
	route4 default via 192.168.18.1 metric 600
	inet6 2405:acc0:1306:351c:ac94:2135:f9a8:5c89/64
	inet6 fe80::4057:8edd:a684:5e33/64
	route6 fe80::/64 metric 1024
	route6 2405:acc0:1306:351c::/64 metric 600
	route6 default via fe80::1 metric 600

lo: connected (externally) to lo
	"lo"
	loopback (unknown), 00:00:00:00:00:00, sw, mtu 65536
	inet4 127.0.0.1/8
	inet6 ::1/128

docker0: connected (externally) to docker0
	"docker0"
	bridge, 0A:89:72:7F:4D:75, sw, mtu 1500
	inet4 172.17.0.1/16
	route4 172.17.0.0/16 metric 0

p2p-dev-wlan0: disconnected
	"p2p-dev-wlan0"
	wifi-p2p, hw

enp2s0: unavailable
	"Realtek RTL8111/8168/8211/8411"
	ethernet (r8169), 40:C2:BA:53:D5:E4, hw, mtu 1500

DNS configuration:
	servers: 192.168.18.1
	interface: wlan0

	servers: fe80::1
	interface: wlan0

Use "nmcli device show" to get complete information about known devices and
"nmcli connection show" to get an overview on active connection profiles.

Consult nmcli(1) and nmcli-examples(7) manual pages for complete usage details.
subprocess calls, implementing native D-Bus communication for a more robust and
integrated architecture.

Key changes:
- :
  - Implemented native D-Bus methods for , , and .
  - Updated  to track , , and  state.
  - Fixed a bug where D-Bus  returned a tuple, preventing known networks from being parsed correctly.
- :
  - Wired UI events to the new D-Bus connection methods.
  - Fixed a race condition in  initialization where it missed the synchronous  signal, leaving the UI permanently disabled.
  - Removed the  early-return optimization in  that was preventing the active CSS state from applying to already-known networks.
  - Cleaned up unused variables to satisfy  linting and removed redundant  blocks.
- :
  - Removed the 5-second timeout hack, as the new D-Bus service properly fires callbacks upon connection success/failure.
  - Removed hardcoded WPA2 text to make the dialog security-type agnostic.
- :
  - Cleaned up active state styling so only the SVG icon box highlights (using ) when a network is connected.
2026-07-21 14:33:35 +05:45
sankalp 8ac26d6c26 fix(mpris): guard GLib.Variant type check before get_type_string
feat(bluetooth): add rfkill soft-block check and BluetoothState enum
2026-07-21 10:24:39 +05:45
sankalp 301ed9a717 refactor(mpris): replace playerctl with Gio.DBusProxy
Use raw D-Bus via Gio.DBusProxy instead of libplayerctl. All MPRIS
interactions now go through standard D-Bus property reads and method calls.

- Filter out playerctld proxy (duplicates active player)
- Validate art URLs (http/https/file only)
- Track failed cover downloads to avoid retry loops
- Remove excessive try/except around safe property reads
- Add public metadata property for consumers
- Fix consumer references to removed _player.props.metadata
2026-07-21 10:02:33 +05:45
sankalp faaa99bd24 refactor(battery): consolidate button styles, refactor service, remove ddcutil
- Merge game-mode/charge-limit CSS into shared selectors
- Rewrite Battery service with IntEnum states and charge-limit support
- Add ChargeLimitButton with active-state styling
- Drop ddcutil from dependencies (unused)
2026-07-21 09:21:29 +05:45
sankalp 5cb49522da refactor(brightness): replace ddcutil with logind DBus proxy
- Use org.freedesktop.login1.Session.SetBrightness for kernel backlight
- Remove ddcutil dependency entirely
- Fix OSD: use signal percentage value directly (like audio OSD)
- Fix controlcenter: stop dividing percentage by max_screen again
2026-07-21 07:31:52 +05:45
sankalp f9c7a027cd refactor(config): improve toml conversion and add robust error handling 2026-07-18 22:54:48 +05:45
sankalp fe3ccd913b refactor(brightness): replace 500ms poll with GLib.FileMonitor
- Use Gio.FileMonitor on sysfs brightness file
- Event-driven via inotify instead of periodic polling
- _on_brightness_file_changed callback for file modifications
2026-07-18 21:48:11 +05:45
sankalp 2a9964a8e5 refactor(mpris): replace Fabricator with direct GLib.timeout_add
- Remove Fabricator dependency from position/status polling
- Position polling: _pos_source_id + _on_pos_poll() (2s interval)
- Status polling: _status_source_id + _on_status_poll() (5s interval)
- Simplified cleanup with direct source_remove calls
2026-07-18 21:43:22 +05:45
sankalp 6286343272 feat(gamemode): add opacity and rounding overrides for fullscreen
- active_opacity=1.0, inactive_opacity=1.0
- active_rounding=0
2026-07-18 21:43:16 +05:45
sankalp 2482078a3f style: simplify section comments to plain # style in notch.py and keyboard_layout.py 2026-07-18 19:06:32 +05:45
sankalp 80c7af79db fix(network): add missing get_connectivity() call and widen NM import guard
- get_connectivity was compared as method object (always True), wired
  icon always showed no-route when activated
- NM import now catches GLib.Error and ImportError, not just ValueError
- Sets NM = None on failure instead of leaving undefined
2026-07-18 14:12:56 +05:45
sankalp c47009addd fix(config): add unregister_reload_callback and harden singleton init
- Move _initialized flag to end of __init__ so partial construction
  leaves the singleton retryable
- Add unregister_reload_callback() method and off_config_change() helper
- Enables proper cleanup of reload listeners on widget destroy
2026-07-18 14:12:26 +05:45
sankalp aeccbe3089 fix(osd): show OSD at 100% via fabric-cli exec from keybinds
- Add osd_show_audio/osd_show_brightness methods on OSDWindow
- Register as standalone functions in __main__ for fabric-cli exec
- Keybinds now chain fabric-cli exec after wpctl/brightnessctl
- Emit brightness signal on threshold bypass for small changes
2026-07-17 12:24:34 +05:45
sankalp e3b8ae0c45 refactor(services): simplify GoogleLens upload implementation using curl 2026-07-16 17:10:50 +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 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 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 cda8f55109 feat!: rename inhibit_changed to inhibit-changed and add enable_timed method 2026-07-15 09:03:08 +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 6f2d0bf444 chore: refactor imports and adopt new utils utilities 2026-07-14 18:45:52 +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 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 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 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 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 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 40b8962232 feat(notifications): increase app icon size to 64x64 and refactor service retrieval 2026-07-12 02:44:15 +05:45
sankalp 6a5f85a10d refactor(services): migrate run_command to Gio.Subprocess in KeyboardLayout and Modus 2026-07-10 10:31:09 +05:45
sankalp 9024cbc9ba feat: replace blocking subprocess calls with Gio.Subprocess async handling 2026-07-09 23:16:58 +05:45
sankalp 84976320f0 feat: add about_to_show and refresh_menu_sync methods to GlobalMenuService and refactor close_window implementation 2026-07-09 22:32:54 +05:45
sankalp 1403c5adc0 refactor(src/services): remove unused properties and methods across service classes 2026-07-09 18:55:36 +05:45
sankalp bb3a92416f refactor(src/services): switch state storage from JSON to TOML for gamemode 2026-07-09 15:45:20 +05:45
sankalp 01dc64498f feat(src/services): refactor KeyboardLayout to use TOML state persistence and improve layout switching
Switch layouts are now stored in TOML, added proper error handling and a static method to trigger switching, replaced JSON handling, updated imports and fixed related services.
2026-07-09 15:32:29 +05:45
sankalp 4dcfaed69e feat(services): add fullscreenChanged signal and property handling
Add @Signal fullscreen_changed(), expose a read‑write fullscreen Property that triggers the signal on change, set its default to False, connect Hyprland’s fullscreen event to update the property, and store it on the service instance.
2026-07-08 13:21:42 +05:45
sankalp 06be28535a refactor: clean up service implementations and remove dead code 2026-07-08 12:24:39 +05:45
sankalp 22528b312a feat(config): add project metadata and dependencies to pyproject.toml and requirements.txt 2026-07-07 14:01:46 +05:45
sankalp 65fdcc6189 refactor(src/services): streamline recording stop and screenshot handling, remove dead code
Simplify stop_recording by removing redundant process kills and file handling
Add guard to prevent reinitialization
Replace exec_shell_command_async with Gio.Subprocess and track pending screenshot
Refactor screenshot method to eliminate multi‑display special case
Clean up conversion logic and remove unused imports
2026-07-06 20:11:17 +05:45
sankalp 9ad25163f0 refactor(src/services): replace get_relative_path with toml_file for loading config 2026-07-06 17:38:09 +05:45
sankalp 754cde0278 feat(src/services): add NumLock service and refactor Battery documentation
Add new NumLock service to monitor NumLock LED state changes.
Refactor Battery service documentation and property cache handling.
Update imports to include NumLock.
2026-07-05 23:04:34 +05:45
sankalp 7057c750fb feat(src/services): add trust management for Bluetooth devices 2026-07-05 22:07:19 +05:45
sankalp a402cf436b refactor(src/services): centralize position polling guard methods
Add guard flag `_pos_polling` and wrapper methods `_start_pos_fabricator` and `_stop_pos_fabricator` to prevent multiple fabricator starts.
Update all calls to use the new wrappers for consistent lifecycle management.
2026-07-05 20:56:13 +05:45
sankalp 089cc2c6cd feat: increase polling intervals for MPRIS status and position fabricators
- Change status fabricator interval from 250ms to 5000ms
- Change position fabricator interval from 1000ms to 2000ms
- Update poll_from and on_changed callbacks to match the new intervals
2026-07-05 00:05:09 +05:45
sankalp 01c193bd8e refactor(src/services): simplify TodoService and remove unused ConfigService stop function
Remove redundant import duplication, replace uuid with os.urandom, rename completion_rate to active, update property decorator, and clean up callback handling. Also removed unused stop_config_service function.
2026-07-04 07:26:44 +05:45
sankalp 89eb8db97b feat(config): switch configuration parsing to TOML and add google_lens support 2026-07-04 06:29:38 +05:45
sankalp ce0746eeb2 refactor: simplify DBus menu service discovery and introspection handling 2026-07-03 22:59:26 +05:45
sankalp 8d40ac1a7f refactor(src/services): simplify menu cache implementation and remove unused imports
- Remove time import and unused typing items
- Streamline cache eviction and hit logic
- Replace sentinel handling with simpler checks
- Fix activation environment command arguments
- Improve logging messages and cache hit reporting
2026-07-03 21:31:41 +05:45