KDE에는 일출, 일몰에 따라 자동으로 테마를 변경하는 설정이 없어서 따로 스크립트를 만들어서 변경한다.
일몰, 일출 시간을 얻기 위해서 python3-astral 패키지를 설치한다.
$ sudo apt install python3-astral
아래 python 스크립트를 ~/.local/bin/lookandfeel_change.py 으로 저장한다.
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# vim:set expandtab fenc=utf-8 ff=unix:
import os
import logging
import datetime
import subprocess
import argparse
from astral import Astral # type:ignore
logging.basicConfig(format='[%(asctime)s]{%(name)s}(%(levelname)s) %(message)s', level=logging.INFO)
logger = logging.getLogger(os.path.basename(__file__))
KST = datetime.timezone(datetime.timedelta(hours=9))
DARK_THEME = 'org.kde.breezedark.desktop'
LIGHT_THEME = 'org.kde.breeze.desktop'
def kreadconfig(group: str, key: str) -> str:
p = subprocess.run(['/usr/bin/kreadconfig5', '--group', group, '--key', key],
capture_output=True)
return p.stdout.decode('utf-8').strip()
def kwriteconfig(group: str, key: str, value: str):
p = subprocess.run(['/usr/bin/kwriteconfig5', '--group', group, '--key', key, value],
capture_output=True)
logger.debug(p.stdout.decode('utf-8').strip())
logger.debug(p.stderr.decode('utf-8').strip())
def apply_theme(theme: str):
p = subprocess.run(['/usr/bin/lookandfeeltool', '-a', theme], capture_output=True)
logger.debug(p.stdout.decode('utf-8').strip())
logger.debug(p.stderr.decode('utf-8').strip())
kwriteconfig('KDE', 'LookAndFeelPackage', theme)
def main():
ast = Astral()
city = ast['Seoul']
now = datetime.datetime.now(tz=KST)
today = city.sun(date=now, local=True)
logger.debug(f'{today["sunrise"]} <= {now} < {today["sunset"]}')
new_theme = DARK_THEME
if (today['sunrise'] <= now < today['sunset']):
new_theme = LIGHT_THEME
cur_theme = kreadconfig('KDE', 'LookAndFeelPackage')
if cur_theme != new_theme:
apply_theme(new_theme)
logger.debug(f'apply {new_theme}')
else:
logger.debug(f'already applied {cur_theme}')
if __name__ == '__main__':
parser = argparse.ArgumentParser(description='일출/일몰시간을 기준으로 Plasma 테마를 변경')
parser.add_argument('--debug', '-d', action='store_true')
options = parser.parse_args()
if options.debug:
logger.setLevel(logging.DEBUG)
main()
저장 후 실행 속성을 준다.
$ chmod +x ~/.local/bin/lookandfeel_change.py
이대로 cron에 등록하면 제대로 동작하지 않는다. cron으로 실행하는 경우 login 했을 때와 환경 변수 구성이 다르기 때문이다. 아래 script를 ~/.local/bin/lookandfeel_change.sh으로 저장한다.
#!/bin/bash
export DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/계정id/bus
export DESKTOP_SESSION=plasma
export DISPLAY=:0
export PATH=/home/계정명/.local/bin:/usr/local/bin/:/usr/local/bin:/usr/bin:/bin:/usr/games
export SHELL=/bin/bash
export XDG_CURRENT_DESKTOP=KDE
export XDG_RUNTIME_DIR=/run/user/계정id
export XDG_DATA_DIRS=/var/lib/flatpak/exports/share:/usr/local/share:/usr/share
/home/계정명/.local/bin/lookandfeel_change.py
계정id는 id 명령으로 확인할 수 있다. Debian 계열인 경우 첫번째로 추가한 사용자 id는 보통 1000 이다.
$ id
저장 후 실행 속성을 준다.
$ chmod +x ~/.local/bin/lookandfeel_change.sh
이제 10분마다 실행할 수 있게 crontab에 등록한다.
*/10 * * * * /home/계정명/.local/bin/lookandfeel_change.sh