Panduan: Otomatisasi Tema Terang/Gelap di Manjaro KDE (Sesuai Waktu)
Penulis: Iwan Efendi
Diterbitkan: 13 September 2025
Bosan mengganti tema KDE secara manual? Ikuti panduan lengkap ini untuk membuat skrip sederhana yang bisa mengganti tema global Manjaro KDE dari terang ke gelap secara otomatis.
Salah satu keunggulan Manjaro KDE adalah tampilannya yang indah dan dapat disesuaikan. Namun, satu fitur yang belum ada secara bawaan adalah kemampuan untuk mengganti tema dari mode terang ke gelap secara otomatis berdasarkan waktu. Fitur ini, yang sudah menjadi standar di banyak sistem operasi modern, sangat berguna untuk menjaga kenyamanan mata sepanjang hari.
Pengguna sistem operasi lain? Kami juga punya solusinya untuk Anda.
- Untuk Pengguna Windows: Panduan Mengatur Dark Mode Otomatis di Windows 11.
Kabar baiknya, kita bisa membangun solusi otomatisasi ini sendiri dengan cukup mudah. Panduan ini akan menunjukkan cara membuat skrip yang aman dan sederhana yang dipicu oleh systemd user timer. Skrip ini akan fokus menggunakan tema bawaan Manjaro KDE (Breath Light/Dark) untuk meminimalkan risiko bug, sambil tetap memastikan ikon dan kursor Anda konsisten.
Lingkungan Pengujian
Panduan ini dibuat dan diuji pada sistem dengan spesifikasi berikut. Meskipun kemungkinan besar akan berfungsi pada versi lain, hasil mungkin bervariasi.
- KDE Plasma Version: 6.3.6
- KDE Frameworks Version: 6.17.0
- Qt Version: 6.9.1
- Kernel Version: 6.12.44-3-MANJARO (64-bit)
#1 Membuat Skrip Pengganti Tema yang Aman
Langkah pertama adalah membuat skrip yang akan menjadi "otak" dari sistem ini. Skrip ini akan memeriksa waktu, menerapkan tema global yang sesuai, dan memastikan ikon serta kursor tetap menggunakan pengaturan default sistem untuk stabilitas maksimal.
-
Buat direktori
~/.local/bin
jika belum ada, lalu buat file skrip baru di dalamnya. Buka terminal dan jalankan:mkdir -p ~/.local/bin nano ~/.local/bin/kde-theme-auto-safe.sh
-
Salin dan tempel seluruh konten skrip di bawah ini ke dalam editor, lalu simpan file tersebut.
#!/usr/bin/env bash # ~/.local/bin/kde-theme-auto-safe.sh # Safe auto-switch: only use Manjaro/KDE built-in Global Themes (Breath Light/Dark) # Keep icon & cursor to system/default values (do not switch to external themes) # Intended to run as user (systemd --user timer). Opsi A: every 1 minute. ##### Konfigurasi (ubah jika perlu) ##### DAY_START=7 NIGHT_START=19 # Global Theme IDs - default Manjaro breathe themes (ubah jika lookandfeeltool --list beda) LIGHT_ID="org.manjaro.breath-light.desktop" DARK_ID="org.manjaro.breath-dark.desktop" # tools (resolve if ada) LOOKANDFEEL_TOOL=$(command -v lookandfeeltool || true) KWRITECONFIG5=$(command -v kwriteconfig5 || true) KREADCONFIG5=$(command -v kreadconfig5 || true) KBUILD=$(command -v kbuildsycoca5 || true) QDBUS=$(command -v qdbus || true) KQUITAPP=$(command -v kquitapp5 || true) KSTART=$(command -v kstart5 || true) SYSTEMCTL=$(command -v systemctl || true) log(){ echo "$(date '+%F %T') - $*"; } # Get system/default icon theme: # Priority: # 1) current setting in kdeglobals (user) # 2) ~/.local/share/icons/default/index.theme Inherits # 3) /usr/share/icons/default/index.theme Inherits # 4) fallback "breeze" (likely present on KDE) get_default_icon_theme() { local v if [ -n "$KREADCONFIG5" ]; then v=$("$KREADCONFIG5" --file kdeglobals --group Icons --key Theme 2>/dev/null || true) v=$(echo "$v" | tr -d '\r') [ -n "$v" ] && { printf "%s" "$v"; return 0; } fi for f in "$HOME/.local/share/icons/default/index.theme" "/usr/share/icons/default/index.theme" "$HOME/.icons/default/index.theme"; do if [ -f "$f" ]; then v=$(awk -F= '/^Inherits=/{print $2; exit}' "$f" 2>/dev/null || true) v=$(echo "$v" | tr -d '\r') [ -n "$v" ] && { printf "%s" "$v"; return 0; } fi done # fallback safe option printf "breeze" } # Get system/default cursor theme: # 1) kcminputrc file key cursorTheme (user) # 2) ~/.local/share/icons/default/index.theme or /usr/share/icons/default/index.theme Inherits # 3) fallback "breeze_cursors" get_default_cursor_theme() { local v if [ -n "$KREADCONFIG5" ]; then v=$("$KREADCONFIG5" --file kcminputrc --group Mouse --key cursorTheme 2>/dev/null || true) v=$(echo "$v" | tr -d '\r') [ -n "$v" ] && { printf "%s" "$v"; return 0; } fi for f in "$HOME/.local/share/icons/default/index.theme" "/usr/share/icons/default/index.theme" "$HOME/.icons/default/index.theme"; do if [ -f "$f" ]; then v=$(awk -F= '/^Inherits=/{print $2; exit}' "$f" 2>/dev/null || true) v=$(echo "$v" | tr -d '\r') [ -n "$v" ] && { printf "%s" "$v"; return 0; } fi done printf "breeze_cursors" } apply_lookandfeel() { local id="$1" if [ -n "$LOOKANDFEEL_TOOL" ]; then log "Applying lookandfeel: $id" "$LOOKANDFEEL_TOOL" --apply "$id" >/dev/null 2>&1 && return 0 log "lookandfeeltool returned non-zero for $id" return 1 else log "lookandfeeltool not available - skipping lookandfeel apply" return 1 fi } apply_icons_if_needed() { local icon="$1" if [ -z "$icon" ] || [ -z "$KWRITECONFIG5" ]; then return 1 fi # only apply if current differs to avoid touching system unnecessarily local cur cur=$("$KREADCONFIG5" --file kdeglobals --group Icons --key Theme 2>/dev/null || true) cur=$(echo "$cur" | tr -d '\r') if [ "$cur" != "$icon" ]; then log "Setting Icon Theme -> $icon" "$KWRITECONFIG5" --file kdeglobals --group Icons --key Theme "$icon" >/dev/null 2>&1 || true [ -n "$KBUILD" ] && "$KBUILD" >/dev/null 2>&1 || true # reconfigure kwin to pick up icon changes for panel/widgets [ -n "$QDBUS" ] && "$QDBUS" org.kde.KWin /KWin reconfigure 2>/dev/null || true else log "Icon theme already '$icon' - skip change" fi } apply_cursor_if_needed() { local cur="$1" if [ -z "$cur" ] || [ -z "$KWRITECONFIG5" ]; then return 1 fi # check current local curcur curcur=$("$KREADCONFIG5" --file kcminputrc --group Mouse --key cursorTheme 2>/dev/null || true) curcur=$(echo "$curcur" | tr -d '\r') if [ "$curcur" != "$cur" ]; then log "Setting cursorTheme -> $cur" "$KWRITECONFIG5" --file kcminputrc --group Mouse --key cursorTheme "$cur" >/dev/null 2>&1 || true # write local default index.theme so X/GTK fallback use same pointer set mkdir -p "$HOME/.local/share/icons/default" printf "[Icon Theme]\nInherits=%s\n" "$cur" > "$HOME/.local/share/icons/default/index.theme" # set gtk config for future gtk apps mkdir -p "$HOME/.config/gtk-3.0" "$HOME/.config/gtk-4.0" for gtkcfg in "$HOME/.config/gtk-3.0/settings.ini" "$HOME/.config/gtk-4.0/settings.ini"; do if [ -f "$gtkcfg" ]; then if grep -q '^gtk-cursor-theme-name' "$gtkcfg" 2>/dev/null; then sed -i "s/^gtk-cursor-theme-name.*/gtk-cursor-theme-name=$cur/" "$gtkcfg" 2>/dev/null || true else echo -e "[Settings]\ngtk-cursor-theme-name=$cur" >> "$gtkcfg" fi else echo -e "[Settings]\ngtk-cursor-theme-name=$cur" > "$gtkcfg" fi done # ask kbuild/qdbus to refresh basics [ -n "$KBUILD" ] && "$KBUILD" >/dev/null 2>&1 || true [ -n "$QDBUS" ] && "$QDBUS" org.kde.KWin /KWin reconfigure 2>/dev/null || true else log "Cursor theme already '$cur' - skip change" fi } # MAIN hour=$(date +%H) hour=${hour#0} if [ "$hour" -ge "$DAY_START" ] && [ "$hour" -lt "$NIGHT_START" ]; then MODE="light" else MODE="dark" fi log "Mode selected: $MODE (hour=$hour)" # determine default icon & cursor to use (system / existing values) DEFAULT_ICON=$(get_default_icon_theme) DEFAULT_CURSOR=$(get_default_cursor_theme) log "System/default icon theme detected: $DEFAULT_ICON" log "System/default cursor theme detected: $DEFAULT_CURSOR" if [ "$MODE" = "light" ]; then if apply_lookandfeel "$LIGHT_ID"; then log "Applied lookandfeel: $LIGHT_ID" else # fallback: change ColorScheme only (safer) if [ -n "$KWRITECONFIG5" ]; then log "Falling back to ColorScheme BreezeLight" "$KWRITECONFIG5" --file kdeglobals --group General --key ColorScheme "BreezeLight" >/dev/null 2>&1 || true fi fi else if apply_lookandfeel "$DARK_ID"; then log "Applied lookandfeel: $DARK_ID" else if [ -n "$KWRITECONFIG5" ]; then log "Falling back to ColorScheme BreezeDark" "$KWRITECONFIG5" --file kdeglobals --group General --key ColorScheme "BreezeDark" >/dev/null 2>&1 || true fi fi } # Ensure icons & cursor stay at system defaults (do not switch to custom) apply_icons_if_needed "$DEFAULT_ICON" apply_cursor_if_needed "$DEFAULT_CURSOR" # try gentle refresh of plasmashell so changes apply faster [ -n "$KQUITAPP" ] && "$KQUITAPP" plasmashell 2>/dev/null || true [ -n "$KSTART" ] && "$KSTART" plasmashell >/dev/null 2>&1 & # ensure systemd user env inherits XCURSOR_THEME for future processes if [ -n "$SYSTEMCTL" ]; then systemctl --user set-environment XCURSOR_THEME="$DEFAULT_CURSOR" >/dev/null 2>&1 || true fi exit 0
-
Jadikan skrip tersebut bisa dieksekusi (executable):
chmod +x ~/.local/bin/kde-theme-auto-safe.sh
#2 Membuat Service & Timer Systemd
Selanjutnya, kita akan membuat dua file konfigurasi untuk systemd
di level pengguna (user). Ini akan membuat skrip kita berjalan secara otomatis setiap satu menit.
Buat folder ~/.config/systemd/user/
jika belum ada:
mkdir -p ~/.config/systemd/user/
Buat dua file berikut di dalam folder tersebut:
a. kde-theme-auto-safe.service
File ini mendefinisikan apa yang harus dijalankan.
[Unit]
Description=Safe auto switch KDE Breath Light/Dark (use system icons & cursor)
[Service]
Type=oneshot
ExecStart=%h/.local/bin/kde-theme-auto-safe.sh
b. kde-theme-auto-safe.timer
File ini mendefinisikan kapan service di atas harus dijalankan.
[Unit]
Description=Run KDE theme auto-switcher (safe) every 1 minute
[Timer]
OnBootSec=15s
OnUnitActiveSec=1min
Persistent=true
[Install]
WantedBy=timers.target
#3 Aktifkan, Jalankan, dan Uji
Setelah semua file dibuat, buka terminal dan jalankan perintah-perintah berikut untuk mengaktifkan dan menguji sistem otomatisasi Anda.
- Muat ulang daemon systemd dan aktifkan timer:
systemctl --user daemon-reload systemctl --user enable --now kde-theme-auto-safe.timer
- Uji skrip secara manual:
Jalankan skrip ini untuk melihat output log secara langsung dan memastikan tidak ada error.
~/.local/bin/kde-theme-auto-safe.sh
- Periksa log systemd:
Untuk melihat apa yang telah dilakukan oleh timer, jalankan perintah ini.
journalctl --user -u kde-theme-auto-safe.service --since "5 minutes ago" --no-pager
#4 Verifikasi & Troubleshooting
Bagaimana cara memeriksa ID tema, ikon, dan kursor saya saat ini?
Anda bisa menggunakan perintah berikut di terminal untuk verifikasi:
- Daftar Global Theme:
lookandfeeltool --list
- Tema Ikon Saat Ini:
kreadconfig5 --file kdeglobals --group Icons --key Theme
- Tema Kursor Saat Ini:
kreadconfig5 --file kcminputrc --group Mouse --key cursorTheme
Jika ID tema Breath di sistem Anda berbeda, sesuaikan variabel LIGHT_ID
dan DARK_ID
di dalam skrip.
Bagaimana cara menonaktifkan atau menghapus otomatisasi ini?
Jika Anda ingin kembali ke pengaturan manual, jalankan perintah berikut di terminal:
# 1. Matikan dan nonaktifkan timer
systemctl --user disable --now kde-theme-auto-safe.timer
# 2. Hapus file skrip dan unit systemd
rm ~/.local/bin/kde-theme-auto-safe.sh
rm ~/.config/systemd/user/kde-theme-auto-safe.{service,timer}
# 3. Muat ulang daemon systemd
systemctl --user daemon-reload
Dengan panduan ini, Anda bisa menikmati pengalaman desktop yang lebih dinamis dan nyaman di mata, baik siang maupun malam, dengan cara yang aman dan stabil. Selamat mencoba!
Ditulis Oleh
Iwan Efendi
Pengembang web dan pengguna Windows 11 dan Linux Manjaro, yang bersemangat dalam membangun produk digital dan berbagi pengetahuan melalui tulisan.
Dari Akuisisi Rahasia Hingga Dominasi Cloud: Kisah di Balik Google Sheets
Studi Kasus: Mengaktifkan Ulang AdSense di Situs Baru (Metode Next.js)
Komentar dan Diskusi
Memuat Komentar...
Fitur komentar hanya akan aktif di situs produksi (irweb.info).