Compare commits
7 commits
Author | SHA1 | Date | |
---|---|---|---|
phil | 5488f154e1 | ||
phil | 5a8657d7ca | ||
phil | 45b5790e79 | ||
phil | 902e5bebe4 | ||
phil | 8b0a4c954c | ||
phil | c1914511ee | ||
d24cc31b04 |
20
README.md
20
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.
|
||||
|
|
35
install.sh
Executable file
35
install.sh
Executable 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
|
|
@ -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
8
setsysmode
Normal 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
8
sysmoded
Normal file
|
@ -0,0 +1,8 @@
|
|||
#! /usr/bin/env python3
|
||||
"""System mode daemon."""
|
||||
|
||||
from tabletmode.daemon import main
|
||||
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
|
@ -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
7
tablet-mode.json
Normal 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
|
||||
}
|
|
@ -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]
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Reference in a new issue