Compare commits

...

7 commits
2.1.4 ... main

Author SHA1 Message Date
phil 5488f154e1 Only add group and user if they don't exist 2023-07-16 13:03:10 +02:00
phil 5a8657d7ca Add link to upstream repo 2023-07-16 12:31:00 +02:00
phil 45b5790e79 Add hint about reboot 2023-07-16 12:29:02 +02:00
phil 902e5bebe4 Hint about OS 2023-07-16 12:23:18 +02:00
phil 8b0a4c954c Update README 2023-07-16 12:21:58 +02:00
phil c1914511ee Add install script
Add Minibook configuration
Re-Add scripts
2023-07-16 12:17:59 +02:00
Richard Neumann d24cc31b04 Allow drop-in for sudo, such as doas 2021-05-14 21:08:01 +02:00
9 changed files with 88 additions and 35 deletions

View file

@ -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.

35
install.sh Executable file
View file

@ -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

View file

@ -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]

8
setsysmode Normal file
View file

@ -0,0 +1,8 @@
#! /usr/bin/env python3
"""Sets the system mode."""
from tabletmode.cli import main
if __name__ == '__main__':
main()

8
sysmoded Normal file
View file

@ -0,0 +1,8 @@
#! /usr/bin/env python3
"""System mode daemon."""
from tabletmode.daemon import main
if __name__ == '__main__':
main()

View file

@ -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

7
tablet-mode.json Normal file
View file

@ -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
}

View file

@ -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]

View file

@ -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)