diff --git a/README.md b/README.md index 4f7d1dc..db11fd8 100644 --- a/README.md +++ b/README.md @@ -1,21 +1,13 @@ -# tablet-mode +# Chuwi Minibook tablet mode switch -Allow users to toggle a convertible laptop between laptop and tablet mode. +Allow users to toggle a Chuwi Minibook laptop between laptop and tablet mode. +This is based on https://github.com/conqp/tablet-mode. -## Configuration +## Installation -The devices to be deactivated in either *tablet* or *laptop* mode must be specified in `/etc/tablet-mode.json`. -Optionally you can specify whether desktop notifications shall be send when changing the mode using the *notify* flag. - - { - "tablet": [ - "/dev/input/by-path/platform-i8042-serio-0-event-kbd", - "/dev/input/by-path/platform-i8042-serio-1-event-mouse" - ], - "notify": false - } +Just run `install.sh` on your Debian system and enter the name of you local user account. +Reboot after successful installation. ## Usage -You must be a member of the group `tablet` to toggle between tablet and laptop mode. You can toggle between tablet and laptop mode by running `setsysmode toggle` or use the desktop icon provided with this package. diff --git a/install.sh b/install.sh new file mode 100755 index 0000000..990b345 --- /dev/null +++ b/install.sh @@ -0,0 +1,35 @@ +#!/usr/bin/env bash + +set -eu + +GROUP=tablet + +if ! [ $(getent group "$GROUP") ]; then + echo "Add tablet group..." + /usr/sbin/groupadd tablet +fi + +read -p "Enter your local username: " user + +if ! [ $(groupmems -g "$GROUP" -l | grep "$user" ) ]; then + echo "Add user to group..." + usermod -a -G tablet "$user" +fi + +echo "Copy files..." +cp -r tabletmode/ /usr/local/lib/python3.11/dist-packages +cp tablet-mode.service /etc/systemd/system +cp laptop-mode.service /etc/systemd/system +cp tablet-mode.json /etc/ +cp tablet-mode.desktop /home/"$user"/.local/applications +cp tablet-mode.sudoers /etc/sudoers.d/tablet-mode +cp setsysmode /usr/local/bin +chmod +x /usr/local/bin/setsysmode +cp sysmoded /usr/local/bin +chmod +x /usr/local/bin/sysmoded + +echo "Reload systemd..." +systemctl daemon-reload + +echo "Install packages..." +apt install evtest -y diff --git a/laptop-mode.service b/laptop-mode.service index 7f9bd26..93e4f27 100644 --- a/laptop-mode.service +++ b/laptop-mode.service @@ -3,7 +3,7 @@ Description=Configure system for laptop mode Conflicts=tablet-mode.service [Service] -ExecStart=/usr/bin/sysmoded laptop +ExecStart=/usr/local/bin/sysmoded laptop StandardOutput=null [Install] diff --git a/setsysmode b/setsysmode new file mode 100644 index 0000000..fb31d1f --- /dev/null +++ b/setsysmode @@ -0,0 +1,8 @@ +#! /usr/bin/env python3 +"""Sets the system mode.""" + +from tabletmode.cli import main + + +if __name__ == '__main__': + main() diff --git a/sysmoded b/sysmoded new file mode 100644 index 0000000..347aca9 --- /dev/null +++ b/sysmoded @@ -0,0 +1,8 @@ +#! /usr/bin/env python3 +"""System mode daemon.""" + +from tabletmode.daemon import main + + +if __name__ == '__main__': + main() diff --git a/tablet-mode.desktop b/tablet-mode.desktop index b077626..2c3a375 100644 --- a/tablet-mode.desktop +++ b/tablet-mode.desktop @@ -2,6 +2,6 @@ Comment=Toggle tablet mode Terminal=false Name=Tablet Mode -Exec=/usr/bin/setsysmode toggle +Exec=/usr/local/bin/setsysmode toggle Type=Application Icon=pda-symbolic diff --git a/tablet-mode.json b/tablet-mode.json new file mode 100644 index 0000000..14f657e --- /dev/null +++ b/tablet-mode.json @@ -0,0 +1,7 @@ +{ + "tablet": [ + "/dev/input/by-path/platform-i8042-serio-0-event-kbd", + "/dev/input/by-path/pci-0000:00:14.0-usb-0:9:1.0-event-mouse" + ], + "notify": false +} diff --git a/tablet-mode.service b/tablet-mode.service index 5ca2d1d..fc893e7 100644 --- a/tablet-mode.service +++ b/tablet-mode.service @@ -3,7 +3,7 @@ Description=Configure system for tablet mode Conflicts=laptop-mode.service [Service] -ExecStart=/usr/bin/sysmoded tablet +ExecStart=/usr/local/bin/sysmoded tablet StandardOutput=null [Install] diff --git a/tabletmode/cli.py b/tabletmode/cli.py index 82eed77..c20e898 100644 --- a/tabletmode/cli.py +++ b/tabletmode/cli.py @@ -15,6 +15,7 @@ from tabletmode.config import load_config DESCRIPTION = 'Sets or toggles the system mode.' LAPTOP_MODE_SERVICE = 'laptop-mode.service' TABLET_MODE_SERVICE = 'tablet-mode.service' +SUDO = '/usr/bin/sudo' def get_args() -> Namespace: @@ -32,10 +33,11 @@ def get_args() -> Namespace: return parser.parse_args() -def systemctl(action: str, unit: str, *, root: bool = False) -> bool: +def systemctl(action: str, unit: str, *, root: bool = False, + sudo: str = SUDO) -> bool: """Runs systemctl.""" - command = ['/usr/bin/sudo'] if root else [] + command = [sudo] if root else [] command += ['systemctl', action, unit] try: @@ -69,43 +71,43 @@ def notify_tablet_mode() -> CompletedProcess: return notify_send('Tablet mode.', 'The system is now in tablet mode.') -def default_mode(notify: bool = False) -> None: +def default_mode(notify: bool = False, *, sudo: str = SUDO) -> None: """Restores all blocked input devices.""" - systemctl('stop', LAPTOP_MODE_SERVICE, root=True) - systemctl('stop', TABLET_MODE_SERVICE, root=True) + systemctl('stop', LAPTOP_MODE_SERVICE, root=True, sudo=sudo) + systemctl('stop', TABLET_MODE_SERVICE, root=True, sudo=sudo) if notify: notify_send('Default mode.', 'The system is now in default mode.') -def laptop_mode(notify: bool = False) -> None: +def laptop_mode(notify: bool = False, *, sudo: str = SUDO) -> None: """Starts the laptop mode.""" - systemctl('stop', TABLET_MODE_SERVICE, root=True) - systemctl('start', LAPTOP_MODE_SERVICE, root=True) + systemctl('stop', TABLET_MODE_SERVICE, root=True, sudo=sudo) + systemctl('start', LAPTOP_MODE_SERVICE, root=True, sudo=sudo) if notify: notify_laptop_mode() -def tablet_mode(notify: bool = False) -> None: +def tablet_mode(notify: bool = False, *, sudo: str = SUDO) -> None: """Starts the tablet mode.""" - systemctl('stop', LAPTOP_MODE_SERVICE, root=True) - systemctl('start', TABLET_MODE_SERVICE, root=True) + systemctl('stop', LAPTOP_MODE_SERVICE, root=True, sudo=sudo) + systemctl('start', TABLET_MODE_SERVICE, root=True, sudo=sudo) if notify: notify_tablet_mode() -def toggle_mode(notify: bool = False) -> None: +def toggle_mode(notify: bool = False, *, sudo: str = SUDO) -> None: """Toggles between laptop and tablet mode.""" if systemctl('status', TABLET_MODE_SERVICE): - laptop_mode(notify=notify) + laptop_mode(notify=notify, sudo=sudo) else: - tablet_mode(notify=notify) + tablet_mode(notify=notify, sudo=sudo) def main() -> None: @@ -114,14 +116,15 @@ def main() -> None: args = get_args() config = load_config() notify = config.get('notify', False) or args.notify + sudo = config.get('sudo', SUDO) if args.mode == 'toggle': - toggle_mode(notify=notify) + toggle_mode(notify=notify, sudo=sudo) elif args.mode == 'default': - default_mode(notify=notify) + default_mode(notify=notify, sudo=sudo) elif args.mode == 'laptop': - laptop_mode(notify=notify) + laptop_mode(notify=notify, sudo=sudo) elif args.mode == 'tablet': - tablet_mode(notify=notify) + tablet_mode(notify=notify, sudo=sudo) else: print('Must specify a mode.', file=stderr, flush=True)