From a2e183eb2cd0136ed5c59e51a45c2e1b5c93be36 Mon Sep 17 00:00:00 2001 From: Markus Katharina Brechtel Date: Fri, 14 Jan 2022 22:41:08 +0100 Subject: [PATCH 1/3] screensaver and touchpad settings --- defaults/main.yaml | 6 + files/mate-screensaver-helper-inhibition.py | 142 ++++++++++++++++++++ tasks/dconf-lock.yaml | 5 +- tasks/main.yaml | 7 + tasks/screensaver.yaml | 44 ++++++ templates/gdmflexiserver-fake.sh | 2 + templates/touchpad.conf.j2 | 7 + vars/main.yaml | 11 ++ 8 files changed, 221 insertions(+), 3 deletions(-) create mode 100644 defaults/main.yaml create mode 100644 files/mate-screensaver-helper-inhibition.py create mode 100644 tasks/screensaver.yaml create mode 100644 templates/gdmflexiserver-fake.sh create mode 100644 templates/touchpad.conf.j2 diff --git a/defaults/main.yaml b/defaults/main.yaml new file mode 100644 index 0000000..64cf0a8 --- /dev/null +++ b/defaults/main.yaml @@ -0,0 +1,6 @@ +--- + +screensaver_enforce_settings: false +screensaver_locktime: 10 +screensaver_theme: screensavers-popsquares +screensaver_sleeptime: "{{screensaver_locktime}}" diff --git a/files/mate-screensaver-helper-inhibition.py b/files/mate-screensaver-helper-inhibition.py new file mode 100644 index 0000000..8b541b6 --- /dev/null +++ b/files/mate-screensaver-helper-inhibition.py @@ -0,0 +1,142 @@ +#!/usr/bin/python3 +import os +import sys +import time + +import dbus +import dbus.service +import dbus.mainloop.glib +dbus.mainloop.glib.DBusGMainLoop(set_as_default=True) +from gi.repository import GObject as gobject + +# DBus connection information for MATE screensaver +DBUS_MSCR_WAIT = 60 +DBUS_MSCR_DBUS = dbus.SessionBus() +DBUS_MSCR_NAME = "org.mate.ScreenSaver" +DBUS_MSCR_PATH = "/" +DBUS_MSCR_IFACE_MAIN = "org.mate.ScreenSaver" + +# DBus listening information for the Idle Inhibition Spec +DBUS_IIS_DBUS = dbus.SessionBus() +DBUS_IIS_NAME = "org.freedesktop.ScreenSaver" +DBUS_IIS_PATH = "/org/freedesktop/ScreenSaver" +DBUS_IIS_PATH2= "/ScreenSaver" +DBUS_IIS_IFACE_MAIN = "org.freedesktop.ScreenSaver" + +# Connect to the system and session bus +bus_system = dbus.SystemBus() +bus_session = dbus.SessionBus() + +# Connect to MATE screensaver +print("Waiting for screensaver...") +for i in range(DBUS_MSCR_WAIT): + try: + mate_screensaver = dbus.Interface( + bus_session.get_object(DBUS_MSCR_NAME, DBUS_MSCR_PATH), + DBUS_MSCR_IFACE_MAIN + ) + except dbus.exceptions.DBusException: + # Screensaver not running yet + if i < (DBUS_MSCR_WAIT - 1): + time.sleep(1) + else: + print("MATE screensaver not running, aborting!", file=sys.stderr) + sys.exit(2) + else: + print("MATE screensaver connected!") + break + + +class IdleInhibitor(object): + """ + Represents a single client that inhibits the screensaver + """ + def __init__(self, screensaver, name, reason, cookie, unique_name): + self.screensaver = screensaver + + self.name = name + self.reason = reason + self.cookie = cookie + self.unique_name = unique_name + + # Tell MATE screensaver about the application we are proxying + self._cookie = self.screensaver.Inhibit(name, reason) + + def destroy(self): + # Stop bothering MATE screensaver + self.screensaver.UnInhibit(self._cookie) + + +# Create DBus interface +class IdleInhibitionService(dbus.service.Object): + def __init__(self, mate_screensaver): + # Store connection to screensaver + self.screensaver = mate_screensaver + + # Counter for inhibition requests (used for cookies) + self.counter = 1 + + # Storage for clients + self.inhibitors = [] + + # Store constants + self.bus = DBUS_IIS_DBUS + self.path = DBUS_IIS_PATH + self.path2 = DBUS_IIS_PATH2 + + # Claim bus name with both paths used by GNOME + dbus.service.Object.__init__(self, + self.bus, self.path, dbus.service.BusName(DBUS_IIS_NAME, self.bus) + ) + dbus.service.Object.__init__(self, + self.bus, self.path2, dbus.service.BusName(DBUS_IIS_NAME, self.bus) + ) + + def on_name_change(self, sender, unique_name): + print("mate-screensaver-helper-inhibition: on_name_change: '%s', '%s'" % (sender, unique_name)) + + if sender != unique_name: + for inhibitor in self.inhibitors: + if inhibitor.unique_name == sender: + self.UnInhibit(inhibitor.cookie, sender) + + @dbus.service.method(DBUS_IIS_IFACE_MAIN, "ss", "u", sender_keyword="sender") + def Inhibit(self, application_name, reason_for_inhibit, sender): + print("mate-screensaver-helper-inhibition: Inhibit: '%s', '%s' -> %d (from '%s')" + % (application_name, reason_for_inhibit, self.counter + 1, sender)) + + # Create new cookie + self.counter += 1 + + # Add inhibitor + self.inhibitors.append(IdleInhibitor( + self.screensaver, + application_name, + reason_for_inhibit, + self.counter, + sender + )) + + # Watch if bus name owner disappears + self.bus.watch_name_owner(sender, lambda name: self.on_name_change(sender, name)) + + return self.counter + + @dbus.service.method(DBUS_IIS_IFACE_MAIN, "u", "", sender_keyword="sender") + def UnInhibit(self, cookie, sender): + print("mate-screensaver-helper-inhibition: UnInhibit: %d (from '%s')" % (cookie, sender)) + + for inhibitor in self.inhibitors: + if inhibitor.cookie == cookie and inhibitor.unique_name == sender: + # Stop inhibiting + inhibitor.destroy() + + # Remove inhibitor from list + self.inhibitors.remove(inhibitor) + + +# Create service +service = IdleInhibitionService(mate_screensaver) + +# Wait for stuff to happen +gobject.MainLoop().run() diff --git a/tasks/dconf-lock.yaml b/tasks/dconf-lock.yaml index 091328e..e72e007 100644 --- a/tasks/dconf-lock.yaml +++ b/tasks/dconf-lock.yaml @@ -16,7 +16,6 @@ dest: /etc/dconf/profile/user notify: dconf update - - name: dconf local db directory file: path: /etc/dconf/db/local.d/ @@ -24,7 +23,7 @@ - name: dconf settings template: - src: settings.j2 + src: dconf-lock/settings.j2 dest: /etc/dconf/db/local.d/{{dconf_lock_id}} notify: dconf update @@ -35,6 +34,6 @@ - name: dconf locks template: - src: locks.j2 + src: dconf-lock/locks.j2 dest: /etc/dconf/db/local.d/locks/{{dconf_lock_id}} notify: dconf update diff --git a/tasks/main.yaml b/tasks/main.yaml index 44db38b..308047f 100644 --- a/tasks/main.yaml +++ b/tasks/main.yaml @@ -11,3 +11,10 @@ apt: pkg: dunst state: absent + +- name: xorg touchpad config + template: + src: touchpad.conf.j2 + dest: /etc/X11/xorg.conf.d/30-touchpad.conf + +- import_tasks: screensaver.yaml diff --git a/tasks/screensaver.yaml b/tasks/screensaver.yaml new file mode 100644 index 0000000..8d4c7ce --- /dev/null +++ b/tasks/screensaver.yaml @@ -0,0 +1,44 @@ +--- + +- name: ensure old screensavers are absent + apt: + pkg: + - light-locker + - xscreensaver + state: absent + +- name: gdmflexiserver dummy script + copy: + src: gdmflexiserver-fake.sh + dest: /usr/local/bin/gdmflexiserver + mode: 0755 + +# Bug: https://github.com/mate-desktop/mate-screensaver/issues/57 +# https://gist.github.com/alexander255/9b991816418e4e60ee7c +- name: mate-screensaver-helper-inhibition script + copy: + src: mate-screensaver-helper-inhibition.py + dest: /usr/local/bin/mate-screensaver-helper-inhibition + mode: 0755 + +- import_tasks: dconf-lock.yaml + vars: + dconf_lock_id: screensaver + dconf_lock_settings: + /org/mate/screensaver: + idle-activation-enabled: 'true' + lock-enabled: 'true' + mode: "'single'" + themes: "['{{screensaver_theme}}']" + /org/mate/desktop/session: + idle-delay: "{{ screensaver_locktime | int }}" + /org/mate/power-manager: + sleep-display-ac: "{{ screensaver_sleeptime | int * 60 }}" + dconf_lock_paths: + - /org/mate/desktop/session/idle-delay + - /org/mate/screensaver/idle-activation-enabled + - /org/mate/screensaver/lock-enabled + - /org/mate/screensaver/mode + - /org/mate/screensaver/themes + - /org/mate/power-manager/sleep-display-ac + when: "{{screensaver_enforce_settings}}" diff --git a/templates/gdmflexiserver-fake.sh b/templates/gdmflexiserver-fake.sh new file mode 100644 index 0000000..f638861 --- /dev/null +++ b/templates/gdmflexiserver-fake.sh @@ -0,0 +1,2 @@ +#!/bin/sh +/usr/bin/dm-tool switch-to-greeter diff --git a/templates/touchpad.conf.j2 b/templates/touchpad.conf.j2 new file mode 100644 index 0000000..fc5f6e1 --- /dev/null +++ b/templates/touchpad.conf.j2 @@ -0,0 +1,7 @@ +Section "InputClass" + Identifier "touchpad" + Driver "libinput" + MatchIsTouchpad "on" + Option "Tapping" "on" + Option "TappingButtonMap" "lrm" +EndSection diff --git a/vars/main.yaml b/vars/main.yaml index 641c7a4..1d10cb4 100644 --- a/vars/main.yaml +++ b/vars/main.yaml @@ -122,6 +122,17 @@ desktop_packages: - chromium-l10n - webext-ublock-origin + # lockscreen + - mate-screensaver + - xscreensaver-gl + - python3 + - mate-power-manager + - xautolock + - xss-lock + - xbacklight + - i3lock + - xssproxy + # xfce - xfce4 From 4c7aedf8600518828c0061e11cdbee4c802e4831 Mon Sep 17 00:00:00 2001 From: Markus Katharina Brechtel Date: Fri, 14 Jan 2022 22:46:35 +0100 Subject: [PATCH 2/3] move file --- {templates => files}/gdmflexiserver-fake.sh | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename {templates => files}/gdmflexiserver-fake.sh (100%) diff --git a/templates/gdmflexiserver-fake.sh b/files/gdmflexiserver-fake.sh similarity index 100% rename from templates/gdmflexiserver-fake.sh rename to files/gdmflexiserver-fake.sh From b2e34bd1d9c8b01c4ad5bc4c0469171e577c54e6 Mon Sep 17 00:00:00 2001 From: Markus Katharina Brechtel Date: Fri, 14 Jan 2022 22:48:36 +0100 Subject: [PATCH 3/3] remove atom_editor from default role --- tasks/main.yaml | 3 --- 1 file changed, 3 deletions(-) diff --git a/tasks/main.yaml b/tasks/main.yaml index 308047f..d541f7c 100644 --- a/tasks/main.yaml +++ b/tasks/main.yaml @@ -4,9 +4,6 @@ apt: pkg: "{{ desktop_packages }}" -- import_role: - name: atom_editor - - name: ensure dunst package is absent for nicer notifications apt: pkg: dunst