diff --git a/.config/quickshell/ii/modules/common/Persistent.qml b/.config/quickshell/ii/modules/common/Persistent.qml index 29d41e18..e7dc68d7 100644 --- a/.config/quickshell/ii/modules/common/Persistent.qml +++ b/.config/quickshell/ii/modules/common/Persistent.qml @@ -62,6 +62,10 @@ Singleton { property string provider: "yandere" } + property JsonObject idle: JsonObject { + property bool inhibit: false + } + property JsonObject timer: JsonObject { property JsonObject pomodoro: JsonObject { property bool running: false diff --git a/.config/quickshell/ii/modules/sidebarRight/quickToggles/IdleInhibitor.qml b/.config/quickshell/ii/modules/sidebarRight/quickToggles/IdleInhibitor.qml index 949842d4..2b8f8b17 100644 --- a/.config/quickshell/ii/modules/sidebarRight/quickToggles/IdleInhibitor.qml +++ b/.config/quickshell/ii/modules/sidebarRight/quickToggles/IdleInhibitor.qml @@ -1,31 +1,16 @@ -import qs.modules.common import qs.modules.common.widgets import qs -import Quickshell.Io -import Quickshell +import qs.services QuickToggleButton { id: root - toggled: false + toggled: Idle.inhibit buttonIcon: "coffee" onClicked: { - if (toggled) { - root.toggled = false - Quickshell.execDetached(["pkill", "wayland-idle"]) // pkill doesn't accept too long names - } else { - root.toggled = true - Quickshell.execDetached([`${Directories.scriptPath}/wayland-idle-inhibitor.py`]) - } - } - Process { - id: fetchActiveState - running: true - command: ["pidof", "wayland-idle-inhibitor.py"] - onExited: (exitCode, exitStatus) => { - root.toggled = exitCode === 0 - } + Idle.toggleInhibit() } StyledToolTip { content: Translation.tr("Keep system awake") } + } diff --git a/.config/quickshell/ii/scripts/wayland-idle-inhibitor.py b/.config/quickshell/ii/scripts/wayland-idle-inhibitor.py deleted file mode 100755 index 9bdaabb0..00000000 --- a/.config/quickshell/ii/scripts/wayland-idle-inhibitor.py +++ /dev/null @@ -1,86 +0,0 @@ -#!/usr/bin/env -S\_/bin/sh\_-xc\_"source\_\$(eval\_echo\_\$ILLOGICAL_IMPULSE_VIRTUAL_ENV)/bin/activate&&exec\_python\_-E\_"\$0"\_"\$@"" - -# From https://github.com/stwa/wayland-idle-inhibitor -# License: WTFPL Version 2 - -import sys -from dataclasses import dataclass -from signal import SIGINT, SIGTERM, signal -from threading import Event -import setproctitle - -from pywayland.client.display import Display -from pywayland.protocol.idle_inhibit_unstable_v1.zwp_idle_inhibit_manager_v1 import ( - ZwpIdleInhibitManagerV1, -) -from pywayland.protocol.wayland.wl_compositor import WlCompositor -from pywayland.protocol.wayland.wl_registry import WlRegistryProxy -from pywayland.protocol.wayland.wl_surface import WlSurface - - -@dataclass -class GlobalRegistry: - surface: WlSurface | None = None - inhibit_manager: ZwpIdleInhibitManagerV1 | None = None - - -def handle_registry_global( - wl_registry: WlRegistryProxy, id_num: int, iface_name: str, version: int -) -> None: - global_registry: GlobalRegistry = wl_registry.user_data or GlobalRegistry() - - if iface_name == "wl_compositor": - compositor = wl_registry.bind(id_num, WlCompositor, version) - global_registry.surface = compositor.create_surface() # type: ignore - elif iface_name == "zwp_idle_inhibit_manager_v1": - global_registry.inhibit_manager = wl_registry.bind( - id_num, ZwpIdleInhibitManagerV1, version - ) - - -def main() -> None: - done = Event() - signal(SIGINT, lambda _, __: done.set()) - signal(SIGTERM, lambda _, __: done.set()) - - global_registry = GlobalRegistry() - - display = Display() - display.connect() - - registry = display.get_registry() # type: ignore - registry.user_data = global_registry - registry.dispatcher["global"] = handle_registry_global - - def shutdown() -> None: - display.dispatch() - display.roundtrip() - display.disconnect() - - display.dispatch() - display.roundtrip() - - if global_registry.surface is None or global_registry.inhibit_manager is None: - print("Wayland seems not to support idle_inhibit_unstable_v1 protocol.") - shutdown() - sys.exit(1) - - inhibitor = global_registry.inhibit_manager.create_inhibitor( # type: ignore - global_registry.surface - ) - - display.dispatch() - display.roundtrip() - - print("Inhibiting idle...") - done.wait() - print("Shutting down...") - - inhibitor.destroy() - - shutdown() - - -if __name__ == "__main__": - setproctitle.setproctitle("wayland-idle-inhibitor.py") - main() diff --git a/.config/quickshell/ii/services/Idle.qml b/.config/quickshell/ii/services/Idle.qml new file mode 100644 index 00000000..d45e4ed0 --- /dev/null +++ b/.config/quickshell/ii/services/Idle.qml @@ -0,0 +1,40 @@ +import qs +import qs.modules.common +import QtQuick +import Quickshell +import Quickshell.Wayland +pragma Singleton + +/** + * A nice wrapper for date and time strings. + */ +Singleton { + id: root + + property alias inhibit: idleInhibitor.enabled + inhibit: Persistent.states.idle.inhibit + + function toggleInhibit() { + Persistent.states.idle.inhibit = !Persistent.states.idle.inhibit + } + + IdleInhibitor { + id: idleInhibitor + window: PanelWindow { // Inhibitor requires a "visible" surface + // Actually not lol + implicitWidth: 0 + implicitHeight: 0 + color: "transparent" + // Just in case... + anchors { + right: true + bottom: true + } + // Make it not interactable + mask: Region { + item: null + } + } + } + +}