Create TOC

2020년 11월 29일

KDE/일출, 일몰에 따라 자동으로 테마 변경하기

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