Commit Graph
100 Commits
Author SHA1 Message Date
sankalp 61c3b0ac84 fix: install script now create config file for matugen if not exist and fixed other minor bug 2026-07-22 08:29:30 +05:45
sankalp f5271e1b9b fix: fixed formatting 2026-07-21 16:42:40 +05:45
sankalp 361d52b285 fix(lock): replace pam with python-pam and shim six dependency
Switch from the abandoned  package to .
Patch  into sys.modules before importing pam since
python-pam uses it internally but doesn't declare it as a dependency.
Update authenticate call to use pam.pam().authenticate().
2026-07-21 15:42:06 +05:45
sankalp d35537b910 fix: remove unused package 2026-07-21 15:38:53 +05:45
sankalp c6b36ec04e feat: added requirements.txt 2026-07-21 15:38:32 +05:45
sankalp ecd7061edc fix: the notch and indicator are now in same children 2026-07-21 14:47:18 +05:45
sankalp 0e805d24ec refactor: reogranize code structure for better styling 2026-07-21 14:40:23 +05:45
sankalp e095e88715 feat(svg): add svg for charge limit 2026-07-21 14:39:25 +05:45
sankalp 755a604308 feat(services): updated __init__.py 2026-07-21 14:38:34 +05:45
sankalp cbc55885c4 style: fix style 2026-07-21 14:37:46 +05:45
sankalp 8c075b8001 fix(settings): remove named 2026-07-21 14:36:54 +05:45
sankalp 5697cd1e7e fix(indicator): fixed some subtle bugs 2026-07-21 14:36:19 +05:45
sankalp 699b8f92e9 fix(src/shared/dialogs/wifi_password_dialog.py): fixed timeout and using dbus proxy 2026-07-21 14:35:48 +05:45
sankalp 4d02fb8962 dropped playerctl and use dbus proxy of mpris 2026-07-21 14:34:47 +05:45
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 a2ac3d0f55 fix(battery): wrap charge-limit SVG in Box for CSS styling
DrawingArea ignores CSS background/color. Box wrapper lets
#charge-limit-icon.connected selector render active state.
2026-07-21 09:17:52 +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 e93e115522 fix(install): skip already-installed packages via pacman -Qi
Avoids AUR helper failures for packages that exist locally
2026-07-19 18:56:54 +05:45
sankalp d4f4850562 fix(package): update package name for fonts as apple-fonts isnot beign install 2026-07-19 18:55:44 +05:45
sankalp 41b147512e fix(install): detach Modus with nohup to survive shell exit
Background & gets SIGHUP when install script shell closes
2026-07-19 18:35:23 +05:45
sankalp 0dac85cd68 fix(install): kill python start.py on stop
killall modus misses the actual python process
2026-07-19 18:31:15 +05:45
sankalp f0997981fd fix(install): kill background jobs on Ctrl+C
- jobs -p | xargs kill in cleanup ensures sudo keepalive
  and spinner processes are terminated on SIGINT
2026-07-19 18:27:25 +05:45
sankalp c46e023752 fix(install): resolve fabric import and hyprland sourcing
- Run uv sync before launch to install Python deps
- cd into install dir for uv run (fixes ModuleNotFoundError)
- Handle commented modus.lua lines in hyprland config
2026-07-19 18:24:55 +05:45
sankalp 7ac5696ef5 feat: bump version to 2.0.0 2026-07-19 18:15:44 +05:45
sankalp a7adbfe60e fix(settings): prevent window destroy on close to keep __main__ reference valid 2026-07-19 16:19:50 +05:45
sankalp 5e0337c0d6 fix(spotlight): monitor .desktop dirs for newly installed apps
Replace 1s TTL timer rescan with Gio.FileMonitor on XDG application
directories so spotlight picks up apps installed while running.
2026-07-19 12:03:27 +05:45
sankalp 96412dda47 feat: add settings window to fabric-cli and update docs 2026-07-19 10:37:12 +05:45
sankalp a7d4358cef feat(release): bump version to 2.0.0 2026-07-18 22:55:11 +05:45
sankalp f9c7a027cd refactor(config): improve toml conversion and add robust error handling 2026-07-18 22:54:48 +05:45
sankalp 995b222d32 build(release): bump version to 2.0.0
Update install script to reload hyprctl and launch Python service; adjust pyproject.toml version and metadata
2026-07-18 22:39:08 +05:45
sankalp b69b11a184 docs(readme): update the quickstart 2026-07-18 22:35:34 +05:45
sankalp e8f8f8c078 fix(config): remove hardcoded dev folder and fix some lines 2026-07-18 22:34:11 +05:45
sankalp d7cec81fe0 fix(install): fix installtion errors 2026-07-18 22:33:39 +05:45
sankalp 609036f204 Merge pull request #30 from S4NKALP/dev
Huge work and update lol
2026-07-18 21:56:08 +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 8f6a040bb7 refactor(dock): replace 300ms occlusion poll with Hyprland events
- Subscribe to openwindow, closewindow, movewindow, workspace, fullscreen
- 50ms debounce to batch rapid successive events
- Event-driven check instead of continuous polling
- Proper cleanup with _disconnect_occlusion_signals()
2026-07-18 21:43:36 +05:45
sankalp 44f1103259 refactor(per_app_volume): remove redundant 2s polling
- stream-added/stream-removed signals already handle app list updates
- Removed _auto_refresh(), _on_map/_on_unmap timer management
- Removed _last_app_names tracking (unused without polling)
2026-07-18 21:43:29 +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 8ee6003241 style: replace solid accent hover/active with glass effect
- glass-hover: alpha(@foreground,0.08) → alpha(white,0.10)
- glass-active: alpha(@foreground,0.14) → alpha(white,0.50)
- panel, settings, dropdown, tray, notification hover → glass-hover
- battery, wifi, bluetooth connected icons → glass-active
- wifi-icon-box base dimmed to glass-hover for contrast
2026-07-18 21:23:28 +05:45
sankalp 2ba5cc9ccc style(src/styles/window): replace @glass-overlay-dark with #000000 in lock.css and panel.css 2026-07-18 19:39:45 +05:45
sankalp f0643a5b03 docs(faqs): add screencapture keybinds and fix plugin paths 2026-07-18 19:29:48 +05:45
sankalp a403b5a649 docs(plugins): add icon_data field and fix duplicate heading
- Add icon_data field to SearchResult documentation
- Remove duplicate 'How It Works' heading
- Fix plugin directory path references
2026-07-18 19:29:45 +05:45
sankalp 5afada35a4 docs(arch): add missing components and services
- Add notification, osd, wallpaper components
- Add 12 missing services to the services table
- Fix plugin directory path
2026-07-18 19:29:40 +05:45
sankalp c0870dacef docs(config): add missing config.toml keys and mods.toml options 2026-07-18 19:29:34 +05:45
sankalp d06768cb85 docs(install): update package list and fix config reference 2026-07-18 19:29:28 +05:45
sankalp 5544367c2c docs(readme): update package list and fix config reference
- Sync package list with install.sh PACKAGES
- Fix modus.conf reference to modus.lua
2026-07-18 19:29:23 +05:45
sankalp 0b2f5be80e docs(styling): fix CSS paths to match actual directory structure 2026-07-18 19:29:17 +05:45
sankalp f4bfb52ba6 fix(install): fix matugen output path and remove unused variable
- Fix matugen output_path from src/shared/styles/ to src/styles/
- Remove unused BULLET variable (shellcheck SC2034)
2026-07-18 19:29:10 +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 0fd5d3ea28 style(install): simplify section comments to plain # style 2026-07-18 19:03:23 +05:45
sankalp 591017f6e5 fix(install): fix spinner exit check, remove dead code, fix launch logic
- spinner now checks exit code and shows cross on failure
- Removed unused print_packages function
- Fixed launch: backgrounded uwsm always returned 0, else branch was
  dead code. Now runs in background and checks with pgrep.
2026-07-18 18:51:24 +05:45
sankalp 713f73f45c fix(install): remove install mode selection, keep simple
Removed Full/Minimal/Custom mode picker. Script now always installs
all packages. Kept -n dry-run and -y auto-yes flags.
2026-07-18 15:16:31 +05:45
sankalp ab9b9df4e1 feat(install): rewrite install.sh with interactive mode selection
- 3 install modes: Full, Minimal, Custom (pick categories)
- Dry-run flag (-n) to preview packages without installing
- Progress bar with percentage during package install
- Better visual hierarchy with section headers and dividers
- Package categories: Core, Shell, Hyprland, UI, Hardware, Network, Audio, Build
- Failed package summary at end
- Cleaner banner and completion output
2026-07-18 15:12:21 +05:45
sankalp 6d9057cd06 fix(install): remove wayland from required packages 2026-07-18 14:52:41 +05:45
sankalp c15d023f7d fix(install): use libqalculate instead of qalculate-gtk 2026-07-18 14:51:52 +05:45
sankalp c3179a8065 fix(install): remove flatpak from required packages 2026-07-18 14:50:35 +05:45
sankalp 716054fd58 fix(install): add missing runtime and build dependencies
Added 13 packages required by the codebase:
- networkmanager, network-manager-applet: network management + GI bindings
- blueman: bluetooth manager GUI
- qalculate-gtk: spotlight calculator engine
- wtype: Wayland keyboard paste simulation
- pipewire, libpulse: audio playback and volume control
- pciutils: GPU detection in About dialog
- gtk-layer-shell: Wayland layer-shell for popup windows
- librsvg: SVG rendering for dock icons
- flatpak: flatpak app registration for global menu
- wayland: wayland-client/wayland-scanner for app-capture build
- gobject-introspection: GIR compilation for app-capture typelib
2026-07-18 14:42:14 +05:45
sankalp 82a5ff91af fix(app-capture): make gobject-introspection optional in meson build
CI Arch container doesn't have g-i installed. The GIR/typelib is only
needed for Python bindings — shared library builds fine without it.
Both gir dependency and g-ir-compiler are now required: false.
2026-07-18 14:28:04 +05:45
sankalp 2a04a17ad7 fix(install): resolve shellcheck warnings in install.sh
- Quote  in kill -0 (SC2086)
- Use %b/%s printf format instead of variable interpolation (SC2059)
- Quote pkg-config command substitution (SC2046)
2026-07-18 14:22:42 +05:45
sankalp 732dd9c0ee fix: formating 2026-07-18 14:21:24 +05:45
sankalp 71c9d30c2c fix(osd): log exception when removing hide timer source
except Exception: pass was hiding stale ID errors.
2026-07-18 14:14:16 +05:45
sankalp 4d90a1ab52 fix(spotlight): log exception when removing stale GLib source IDs
except Exception: pass was hiding errors during pipeline cancellation.
2026-07-18 14:14:09 +05:45
sankalp 1d3cecc255 fix(dialogs): log exception in wifi password connection timeout handler
except Exception: pass was hiding UI state errors during timeout
handling.
2026-07-18 14:13:56 +05:45
sankalp 50e15db2de fix(controlcenter): move inline GLib/os imports to top-level
GLib was imported inline 4 times in seek-bar handlers that fire on
every user seek. os was imported inline in a fallback path. All moved
to top-level.
2026-07-18 14:13:48 +05:45
sankalp 2d982cf286 fix(shared): add tick_widget=self to AnimatedScrollable height_animator
Without tick_widget the Animator falls back to GLib.timeout_add which
fires even when the widget is hidden, wasting CPU on invisible scroll
windows (WiFi/BT connection lists).
2026-07-18 14:13:44 +05:45
sankalp c00236fc69 fix(dock): remove pointless del svg_w, add warning on trash SVG failure
The del was a no-op (GC handles scope exit). The bare except Exception
hid real rendering errors — now logs at warning level.
2026-07-18 14:13:36 +05:45
sankalp 6a75ea84d9 fix(controlcenter): remove duplicate device-ready signal connection
Handler was connected twice — once in __init__ and again in
_initialize_resources. Every device-ready event fired on_network_ready
twice. Removed the __init__ connection (the lazy one is correct).
2026-07-18 14:13:27 +05:45
sankalp ee904cce04 fix(notification): null _spring_timer_id after first remove in on_resolved
on_resolved removed the GLib source but didn't null the ID, causing
double-remove crash when destroy() later tried to clean up the same
stale source.
2026-07-18 14:13:17 +05:45
sankalp 6cd1a2c71a fix(utils): quote kill_process args, replace subprocess which with shutil
- shlex.quote() in kill_process prevents shell injection
- find_binary now uses shutil.which() instead of spawning 'which'
- Add shell_split() helper for environment.py
- Remove inline import re from escape_markup_text
2026-07-18 14:13:11 +05:45
sankalp ef685ab34a fix(globalmenu): remove shell=True from gcc compilation command
Use list form with shlex.split() for pkg-config flags instead of
shell=True string interpolation. Eliminates command injection vector.
2026-07-18 14:13:03 +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 476ed7e4fb fix(workspace): replace broken _config_handlers import with off_config_change
Same silent ImportError leak as panel/main.py — callbacks were never
unregistered on widget destroy.
2026-07-18 14:12:44 +05:45
sankalp 6ef48af963 fix(panel): replace broken _config_handlers import with off_config_change
Panel destroy was importing nonexistent _config_handlers from config,
causing silent ImportError and leaked reload callbacks.
2026-07-18 14:12:37 +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 5e542eed4f style: replace raw colors.css refs with glass tokens from constant.css
Replace @foreground, @primary, @error, @outline, @shadow, @secondary
and their var() equivalents with semantic glass-* tokens across 22 files.
Colors without glass equivalents (@on-primary, @cyan, etc.) left as-is.
2026-07-17 22:28:10 +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 4f36ada1c5 fix(controlcenter): flush stale-cache races in toggle UI
- Drop rfkill from bluetooth toggle (redundant with D-Bus Powered,
  was causing stale cache on next read)
- Force toggle switch and icon to target state immediately after
  setting, don't wait for D-Bus callback
- Fix nightlight icon race: flip local is_active instead of
  re-querying async kill state
- Guard wifi on_network_ready against ethernet-first device loop
  (emits device-ready per device; wifi_device None on first)
- Share single NetworkClient between main panel and wifi popup
  (eliminates async-init race of two independent instances)
- Strip connected: prefix from wlan label initial display
- Add _pending_toggle pattern to wifi notify handler to
  suppress stale-cache revert; same for bluetooth switch lock
2026-07-17 11:23:42 +05:45
sankalp 14c00c4504 refactor(window/switcher): make item box height adapt automatically 2026-07-16 17:54:34 +05:45
sankalp 5708a475dd chore: remove commitlint configuration 2026-07-16 17:47:37 +05:45
sankalp de0f5f1d07 chore: remove dependency audit workflow 2026-07-16 17:45:19 +05:45
sankalp 0ef2a036dd chore(.github/workflows): add system dependencies for pycairo
Add libcairo2-dev and pkg-config to the dependency-audit.yml workflow so that pycairo can be installed correctly on CI runners. This prevents the build error when installing Python packages that require the Cairo library.
2026-07-16 17:43:12 +05:45
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