Add smartpause support for swaywm (#464)
If the current desktop environment is sway, the smartpause plugin will spawn a swayidle process that outputs the current time on idle and resume. Using that info, we can determine: 1. Whether the system is currently idle (idle timestamp > active timestamp) 2. How many seconds the system has been idle (current timestamp - idle timestamp) Since swayidle uses the KDE idle protocol, it might be possible to extend this to Wayland KDE as well.
This commit is contained in:
parent
c784000e69
commit
ad041c7855
|
@ -23,6 +23,8 @@ def validate(plugin_config, plugin_settings):
|
||||||
command = None
|
command = None
|
||||||
if utility.DESKTOP_ENVIRONMENT == "gnome" and utility.IS_WAYLAND:
|
if utility.DESKTOP_ENVIRONMENT == "gnome" and utility.IS_WAYLAND:
|
||||||
command = "dbus-send"
|
command = "dbus-send"
|
||||||
|
elif utility.DESKTOP_ENVIRONMENT == "sway":
|
||||||
|
command = "swayidle"
|
||||||
else:
|
else:
|
||||||
command = "xprintidle"
|
command = "xprintidle"
|
||||||
if not utility.command_exist(command):
|
if not utility.command_exist(command):
|
||||||
|
|
|
@ -46,6 +46,51 @@ waiting_time = 2
|
||||||
interpret_idle_as_break = False
|
interpret_idle_as_break = False
|
||||||
is_wayland_and_gnome = False
|
is_wayland_and_gnome = False
|
||||||
|
|
||||||
|
use_swayidle = False
|
||||||
|
swayidle_running = False
|
||||||
|
swayidle_process = None
|
||||||
|
swayidle_lock = threading.Lock()
|
||||||
|
swayidle_idle = 0
|
||||||
|
swayidle_active = 0
|
||||||
|
|
||||||
|
def __start_swayidle_monitor():
|
||||||
|
global swayidle_process
|
||||||
|
global swayidle_start
|
||||||
|
global swayidle_idle
|
||||||
|
global swayidle_active
|
||||||
|
logging.debug('Starting swayidle subprocess')
|
||||||
|
swayidle_process = subprocess.Popen([
|
||||||
|
"swayidle", "timeout", "1", "date +S%s", "resume", "date +R%s"
|
||||||
|
], stdout=subprocess.PIPE, bufsize=1, universal_newlines=True, encoding='utf-8')
|
||||||
|
for line in swayidle_process.stdout:
|
||||||
|
with swayidle_lock:
|
||||||
|
typ = line[0]
|
||||||
|
timestamp = int(line[1:])
|
||||||
|
if typ == 'S':
|
||||||
|
swayidle_idle = timestamp
|
||||||
|
elif typ == 'R':
|
||||||
|
swayidle_active = timestamp
|
||||||
|
|
||||||
|
def __stop_swayidle_monitor():
|
||||||
|
global swayidle_running
|
||||||
|
swayidle_lock.acquire()
|
||||||
|
if swayidle_running:
|
||||||
|
logging.debug('Stopping swayidle subprocess')
|
||||||
|
swayidle_process.terminate()
|
||||||
|
swayidle_running = False
|
||||||
|
swayidle_lock.release()
|
||||||
|
|
||||||
|
def __swayidle_idle_time():
|
||||||
|
global swayidle_running
|
||||||
|
with swayidle_lock:
|
||||||
|
if not swayidle_running:
|
||||||
|
utility.start_thread(__start_swayidle_monitor)
|
||||||
|
swayidle_running = True
|
||||||
|
# Idle more recently than active, meaning idle time isn't stale.
|
||||||
|
if swayidle_idle > swayidle_active:
|
||||||
|
idle_time = int(datetime.datetime.now().timestamp()) - swayidle_idle
|
||||||
|
return idle_time
|
||||||
|
return 0
|
||||||
|
|
||||||
def __gnome_wayland_idle_time():
|
def __gnome_wayland_idle_time():
|
||||||
"""
|
"""
|
||||||
|
@ -76,6 +121,8 @@ def __system_idle_time():
|
||||||
try:
|
try:
|
||||||
if is_wayland_and_gnome:
|
if is_wayland_and_gnome:
|
||||||
return __gnome_wayland_idle_time()
|
return __gnome_wayland_idle_time()
|
||||||
|
elif use_swayidle:
|
||||||
|
return __swayidle_idle_time()
|
||||||
# Convert to seconds
|
# Convert to seconds
|
||||||
return int(subprocess.check_output(['xprintidle']).decode('utf-8')) / 1000
|
return int(subprocess.check_output(['xprintidle']).decode('utf-8')) / 1000
|
||||||
except BaseException:
|
except BaseException:
|
||||||
|
@ -116,6 +163,7 @@ def init(ctx, safeeyes_config, plugin_config):
|
||||||
global interpret_idle_as_break
|
global interpret_idle_as_break
|
||||||
global postpone_if_active
|
global postpone_if_active
|
||||||
global is_wayland_and_gnome
|
global is_wayland_and_gnome
|
||||||
|
global use_swayidle
|
||||||
logging.debug('Initialize Smart Pause plugin')
|
logging.debug('Initialize Smart Pause plugin')
|
||||||
context = ctx
|
context = ctx
|
||||||
enable_safe_eyes = context['api']['enable_safeeyes']
|
enable_safe_eyes = context['api']['enable_safeeyes']
|
||||||
|
@ -129,6 +177,7 @@ def init(ctx, safeeyes_config, plugin_config):
|
||||||
long_break_duration = safeeyes_config.get('long_break_duration')
|
long_break_duration = safeeyes_config.get('long_break_duration')
|
||||||
waiting_time = min(2, idle_time) # If idle time is 1 sec, wait only 1 sec
|
waiting_time = min(2, idle_time) # If idle time is 1 sec, wait only 1 sec
|
||||||
is_wayland_and_gnome = context['desktop'] == 'gnome' and context['is_wayland']
|
is_wayland_and_gnome = context['desktop'] == 'gnome' and context['is_wayland']
|
||||||
|
use_swayidle = context['desktop'] == 'sway'
|
||||||
|
|
||||||
|
|
||||||
def __start_idle_monitor():
|
def __start_idle_monitor():
|
||||||
|
@ -199,6 +248,8 @@ def on_stop():
|
||||||
smart_pause_activated = False
|
smart_pause_activated = False
|
||||||
return
|
return
|
||||||
logging.debug('Stop Smart Pause plugin')
|
logging.debug('Stop Smart Pause plugin')
|
||||||
|
if use_swayidle:
|
||||||
|
__stop_swayidle_monitor()
|
||||||
__set_active(False)
|
__set_active(False)
|
||||||
idle_condition.acquire()
|
idle_condition.acquire()
|
||||||
idle_condition.notify_all()
|
idle_condition.notify_all()
|
||||||
|
|
|
@ -290,6 +290,9 @@ def desktop_environment():
|
||||||
env = 'gnome'
|
env = 'gnome'
|
||||||
elif desktop_session.startswith('ubuntu'):
|
elif desktop_session.startswith('ubuntu'):
|
||||||
env = 'unity'
|
env = 'unity'
|
||||||
|
elif current_desktop is not None:
|
||||||
|
if current_desktop.startswith('sway'):
|
||||||
|
env = 'sway'
|
||||||
DESKTOP_ENVIRONMENT = env
|
DESKTOP_ENVIRONMENT = env
|
||||||
return env
|
return env
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue