Linux 折腾相关记录

零风PLFJY Lv3

折腾了这么久linux,好多小问题,每解决一个我都扔进来一个,虽然可能只有我自己看的懂,就当随笔记录吧,我时不时可能会拿一些出来单独写点文章啥的

很有可能这里面能翻到你可能也会遇到的问题,我的环境是这样的:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
                  -`                 plfjy@plfjy-arch
.o+` ────────────────
`ooo/ ┌ OS → Arch Linux x86_64
`+oooo: │ Host → ASUS S501ME_S502ME (1.0)
`+oooooo: │ Kernel → Linux 7.1.5-arch1-2
-+oooooo+: │ Packages → 1 (linglong), 1607 (pacman)
`/:-:++oooo+: │ Shell → zsh 5.9.2
`/++++/+++++++: │ Dsiplay → 1920x1080 in 24", 180 Hz [External]
`/++++++++++++++: │ WM / DE → Hyprland 0.56.1 (Wayland) / Plasma 6
`/+++ooooooooooooo/` │ Theme → Breeze-Dark [GTK2/3/4]
./ooosssso++osssssso+` │ Icons → breeze [GTK2/3/4]
.oossssso-````/ossssss+` │ Font → NotoSans Nerd Font (10pt) [GTK2/3/4]
-osssssso. :ssssssso. │ Terminal → ghostty 0.0.0-20260731.r16748.g4d605bf.aur-ghostty-nightly-bin
:osssssss/ osssso+++. │ CPU → 13th Gen Intel(R) Core(TM) i5-13400F (16) @ 4.60 GHz
/ossssssss/ +ssssooo/- │ GPU → NVIDIA GeForce RTX 3060 Lite Hash Rate [Discrete]
`/ossssso+/:- -:/+osssso+- │ Memory → 6.66 GiB / 15.28 GiB (44%)
`+sso+:-` `.-/+oso: │ Swap → 647.70 MiB / 16.00 GiB (4%)
`++:. `-/+/│ Disk → 151.22 GiB / 252.75 GiB (60%) - ext4
.` `/└ Locale → en_US.UTF-8

修复 Linux 中的一个噪音问题(Intel 必备):

https://cyril3.github.io/2020/05/17/fix-linux-popup-noise

1
2
sudo vim /etc/modprobe.d/disable_snd_hda_intel_power_save.conf
options snd_hda_intel power_save=0

KDE导入 splash Screen 的路径:

/home/<user name>/.local/share/plasma/look-and-feel/

KDE Wallpaper插件:

https://github.com/slynobody/SteamOS-wallpaper-engine-kde-plugin

Disable KDE wallet (有风险,别用,可能会让VS Code启动的时候卡住):

1
vim ~/.config/kwalletrc
1
2
[Wallet]
Enabled=false

建议直接:

1
paru -S kwallet-pam

让它自启动

Numberlock:

早启动

1
2
paru -S mkinitcpio-numlock
sudo vim /etc/mkinitcpio.conf

HOOKS 里面 kms 后面加 numlock

1
sudo mkinitcpio -P

SDDM

1
sudo vim /etc/sddm.conf
1
2
[General]
Numlock=on

Plasma Login Manager

1
sudo vim /var/lib/plasmalogin/.config/kdedefaults/kcminputrc
1
2
[Keyboard]
NumLock=0

Hyprland (顺便附带一个关闭鼠标加速)

1
2
3
4
5
6
hl.config({
input = {
force_no_accel = true,
numlock_by_default = true
},
})

腾讯会议 Nvidia 看别人黑屏:

原理是设置环境变量

1
__EGL_VENDOR_LIBRARY_FILENAMES=/usr/share/glvnd/egl_vendor.d/50_mesa.json

在Exec=后面添加

1
env __EGL_VENDOR_LIBRARY_FILENAMES=/usr/share/glvnd/egl_vendor.d/50_mesa.json

音量控制问题

1
paru -S plasma-pa pavucontrol

声音相关

1
paru -S plasma-pa pipewire

VLC编码问题

装个插件

1
paru -S vlc-plugin-ffmpeg

用 KDE 配置这么久感觉其他要装的软件(组件、插件)

1
paru -S gwenview okular elisa spectacle breeze-gtk remmina kwin-effect-rounded-corners-git

KDE小组件

plasmusic-toolbar

GRUB UEFI的图标

menuentry 开头的这一行在后面的大括号前面加上 --class efi

v4l2loopback

需要装header,不然没得dkms用

paru -S linux-headers

启动

sudo modprobe v4l2loopback

列出设备

sudo v4l2-ctl --list-devices

重启

sudo modprobe -r v4l2loopback & sudo modprobe v4l2loopback

剩下查wiki

https://wiki.archlinux.org/title/V4l2loopback

Rime

用雾凇拼音 https://github.com/iDvel/rime-ice

fastfetch

显示图片可以用kitty的 –kitty-direct 传图片

zsh

直接用 ohmyzsh

一些装了的插件:

1
git zsh-syntax-highlighting zsh-autosuggestions copypath copybuffer sudo colorize

好用的性能监视器

1
paru -S htop

Arch pacman 自动选出最快的镜像源

https://qiedd.com/1203.html

1
2
paru -S reflector
sudo reflector --verbose --country 'China' -l 200 -p https --sort rate --save /etc/pacman.d/mirrorlist

音量调节 / 小数字键盘切换 / 大小写切换 UHD

1
2
paru -S swayosd
systemctl enable --now swayosd-libinput-backend.service

后续在绑定按键上

1
2
3
4
5
6
hl.bind("XF86AudioRaiseVolume",  hl.dsp.exec_cmd("swayosd-client --output-volume +5 --max-volume 100"), { locked = true, repeating = true })
hl.bind("XF86AudioLowerVolume", hl.dsp.exec_cmd("swayosd-client --output-volume -5 --max-volume 100"), { locked = true, repeating = true })
hl.bind("XF86AudioMute", hl.dsp.exec_cmd("swayosd-client --output-volume mute-toggle"), { locked = true })
hl.bind("XF86AudioMicMute", hl.dsp.exec_cmd("swayosd-client --input-volume mute-toggle"), { locked = true })
hl.bind("XF86MonBrightnessUp", hl.dsp.exec_cmd("swayosd-client --brightness +5"), { locked = true, repeating = true })
hl.bind("XF86MonBrightnessDown", hl.dsp.exec_cmd("swayosd-client --brightness -5"), { locked = true, repeating = true })

这样写入就好了

Waybar

Media player

https://github.com/BEST8OY/ScrollMPRIS

日历

https://github.com/forrestknight/waycal

Fcitx 5 Rime 图标颜色异常

1
vim ~/.config/fcitx5/conf/classicui.conf
1
2
# Prefer Text Icon
PreferTextIcon=True

然后修改 EN 的图标,en 真的好丑

1
2
3
4
5
6
7
8
9
10
mkdir -p ~/.local/share/fcitx5/inputmethod
cat > ~/.local/share/fcitx5/inputmethod/keyboard-us.conf <<'EOF'
[InputMethod]
Name=Keyboard - English (US)
Icon=input-keyboard
Label=En
LangCode=en
Addon=keyboard
Configurable=True
EOF

NetworkManager、蓝牙用的侧边栏

1
paru -S nm-connection-editor nm-sidebar bm-sidebar

Hyprland 剪贴板

1
paru -S clipvault
1
2
hl.exec_cmd("wl-paste --watch clipvault store --ignore-pattern '^<meta http-equiv='")
hl.exec_cmd("wl-paste --type image --watch clipvault store")

正确处理剪贴板的图片

1
paru -S imagemagick
1
mkdir -p ~/.local/bin && code ~/.local/bin/clipvault-wofi-preview
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#!/usr/bin/env bash

entry="${1-}"

[[ -n "$entry" ]] || exit 0

id="${entry%%$'\t'*}"
preview="${entry#*$'\t'}"

# 普通文本:保持原来的行为,只显示第二列
if [[ "$preview" != *"binary data"* || "$preview" != *"image/"* ]]; then
printf '%s\n' "$preview"
exit 0
fi

cache_dir="${XDG_CACHE_HOME:-$HOME/.cache}/clipvault/wofi-thumbnails"
thumb="$cache_dir/$id.png"
lock="$cache_dir/$id.lock"

mkdir -p "$cache_dir"

# 同一张图片只生成一次缩略图
(
flock -x 9

if [[ ! -s "$thumb" ]]; then
tmp="$cache_dir/.$id.$$.png"

if printf '%s\n' "$entry" |
clipvault get |
magick - -thumbnail '256x256>' "$tmp"
then
mv -f "$tmp" "$thumb"
else
rm -f "$tmp"
fi
fi
) 9>"$lock"

if [[ -s "$thumb" ]]; then
printf 'img:%s:text:%s\n' "$thumb" "$preview"
else
printf '%s\n' "$preview"
fi
1
chmod +x ~/.local/bin/clipvault-wofi-preview
1
hl.bind(mainMod .. " + V", hl.dsp.exec_cmd([[entry="$(clipvault list | wofi -d -k /dev/null -S dmenu -I -q -D image_size=96 -D pre_display_exec=true --pre-display-cmd "$HOME/.local/bin/clipvault-wofi-preview %s")"; [ -n "$entry" ] || exit 0; printf '%s\n' "$entry" | clipvault get | wl-copy; sleep 0.15; wtype -M ctrl -k v -m ctrl]]))

最终效果就是:

clipboard-20260804-133711.webp

可以显示图片

选中自动粘贴

Wlogout Logout Hyprland

1
hyprctl dispatch 'hl.dsp.exit()'

网络

plasma

1
paru -S plasma-nm

Hyprland

1
paru -S nm-sidebar nm-connection-editor

Nightshift

https://github.com/psi4j/sunsetr

Dolphin Open with 空白

在 Arch Linux + Hyprland 下,Dolphin 的“Open with”列表依赖 KDE 的
KService/ksycoca6 应用缓存。即使 mimeapps.list 正常,如果缓存使用了错误的
菜单前缀,Dolphin 仍然会显示空列表。

先确认 Arch 的应用菜单和缓存工具已安装:

1
paru -S archlinux-xdg-menu

Arch 使用的菜单前缀必须是 arch-

1
XDG_MENU_PREFIX=arch- kbuildsycoca6 --noincremental

上面是一条带环境变量的命令;也可以拆成:

1
2
export XDG_MENU_PREFIX=arch-
kbuildsycoca6 --noincremental

(Arch Wiki)

Lua 配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
hl.env("XDG_MENU_PREFIX", "arch-")

hl.on("hyprland.start", function()
-- 让 D-Bus/systemd 启动的 KDE 服务也继承正确的菜单前缀
hl.exec_cmd(
"dbus-update-activation-environment --systemd " ..
"DISPLAY WAYLAND_DISPLAY XDG_CURRENT_DESKTOP XDG_SESSION_DESKTOP " ..
"XDG_SESSION_TYPE XDG_MENU_PREFIX QT_QPA_PLATFORM QT_QPA_PLATFORMTHEME")
hl.exec_cmd(
"systemctl --user import-environment " ..
"DISPLAY WAYLAND_DISPLAY XDG_CURRENT_DESKTOP XDG_SESSION_DESKTOP " ..
"XDG_SESSION_TYPE XDG_MENU_PREFIX QT_QPA_PLATFORM QT_QPA_PLATFORMTHEME")
hl.exec_cmd("XDG_MENU_PREFIX=arch- kbuildsycoca6 --noincremental")
end)

hl.env() 只负责环境变量;当前 Hyprland Lua 配置的官方示例也是通过 hl.on("hyprland.start", ...) 配合 hl.exec_cmd() 做自启动。(GitHub)

hl.env() 设置会话环境;启动时还要把同一组环境变量同步给 D-Bus 和 systemd user
manager,然后使用 arch- 前缀全量重建 KDE KService cache。这样重启后由 D-Bus/systemd
启动的 KDE 服务也会继承正确的菜单前缀。

确认 prefix

1
ls -1 /etc/xdg/menus/*-applications.menu

如果看到:

1
/etc/xdg/menus/arch-applications.menu

就用:

1
hl.env("XDG_MENU_PREFIX", "arch-")

如果只有:

1
/etc/xdg/menus/plasma-applications.menu

则应该用:

1
hl.env("XDG_MENU_PREFIX", "plasma-")

Hyprland & Plasma 共存的深色模式切换相关

架构

1
2
3
4
5
6
7
8
9
10
Darkman 全局 user service

├─ 10-breeze-state:记录统一 light/dark 状态并触发适配器

└─ darkman-apply-theme.service
└─ darkman-apply-breeze-theme:按当前会话选择 Qt 后端

Hyprland hyprland.start
├─ 同步当前会话环境给 D-Bus / systemd user
└─ 启动一次 darkman-apply-theme.service

Darkman 主服务本身不需要 DISPLAY 或 WAYLAND_DISPLAY。适配器按会话选择 KDE Qt 后端:

1
2
3
4
5
6
7
# Plasma Wayland
QT_QPA_PLATFORM=wayland QT_QPA_PLATFORMTHEME=kde \
plasma-apply-colorscheme BreezeDark

# Hyprland 或没有图形会话时
QT_QPA_PLATFORM=offscreen QT_QPA_PLATFORMTHEME=kde \
plasma-apply-colorscheme BreezeDark

前置条件

需要安装:

1
paru -S darkman breeze breeze-gtk dconf gsettings-desktop-schemas xdg-desktop-portal xdg-desktop-portal-hyprland xdg-desktop-portal-gtk xdg-desktop-portal-kde plasma-integration kde-gtk-config breeze5 plasma5-integration

配置

Darkman

~/.local/share/darkman/10-breeze-state
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#!/usr/bin/env bash
set -euo pipefail

readonly state_dir="${XDG_STATE_HOME:-$HOME/.local/state}/darkman"
readonly state_file="$state_dir/theme-mode"

mode="${1:-}"
case "$mode" in
dark|light) ;;
*)
printf '[darkman-state] usage: %s dark|light\n' "$0" >&2
exit 2
;;
esac

mkdir -p -- "$state_dir"
tmp="$(mktemp "$state_file.tmp.XXXXXX")"
trap 'rm -f -- "$tmp"' EXIT
printf '%s\n' "$mode" > "$tmp"
chmod 0644 "$tmp"
mv -- "$tmp" "$state_file"
trap - EXIT

printf '[darkman-state] canonical mode=%s file=%s\n' "$mode" "$state_file"

# Darkman is deliberately headless. The adapter selects a live Plasma
# display when available, and falls back to offscreen in Hyprland.
if systemctl --user restart --no-block darkman-apply-theme.service; then
printf '[darkman-state] queued darkman-apply-theme.service\n'
else
printf '[darkman-state] warning: could not queue theme adapter\n' >&2
fi
  • Darkman 唯一活动 hook。
  • 接受 dark 或 light。
  • 原子写入 ~/.local/state/darkman/theme-mode。
  • 触发 darkman-apply-theme.service。
  • 不调用图形 Qt 程序。
~/.local/bin/darkman-apply-breeze-theme
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
#!/usr/bin/env bash
set -euo pipefail

# darkman 主题适配器
#
# 职责:
# 1. 读取 darkman 当前主题状态(dark/light)
# 2. 根据状态同步 KDE Plasma、KWin、GTK2/3/4 的主题配置
# 3. 保证在 Plasma、Hyprland 等不同桌面环境中都能正确持久化配置
#
# 设计原则:
# - darkman 是唯一主题状态来源
# - 本脚本负责把状态转换为不同桌面组件能够理解的配置


readonly config_home="${XDG_CONFIG_HOME:-$HOME/.config}"

# darkman 状态文件。
# systemd user service 环境中优先读取这个文件,
# 避免依赖当前图形会话环境变量。
readonly state_file="${XDG_STATE_HOME:-$HOME/.local/state}/darkman/theme-mode"

# GTK 配置文件路径
readonly gtk2_rc="$config_home/gtkrc"
readonly gtk2_user_rc="$HOME/.gtkrc-2.0"
readonly gtk3_settings="$config_home/gtk-3.0/settings.ini"
readonly gtk4_settings="$config_home/gtk-4.0/settings.ini"


log() {
printf '[darkman-adapter] %s\n' "$*"
}


# 获取当前主题模式。
#
# 优先读取 darkman 写入的 state 文件;
# 如果 state 文件不存在,则回退到 darkman CLI 查询。
#
# 输出:
# dark
# light
read_mode() {
local value

if [[ -r "$state_file" ]]; then
value="$(<"$state_file")"
else
value="$(/usr/bin/darkman get 2>/dev/null || true)"
fi

case "$value" in
dark|light)
printf '%s\n' "$value"
;;
*)
log "invalid or missing mode: ${value:-<empty>}" >&2
return 2
;;
esac
}


# 更新 GTK3/GTK4 的 settings.ini。
#
# GTK 使用 ini 格式保存主题设置:
#
# [Settings]
# gtk-theme-name=Breeze-Dark
# gtk-application-prefer-dark-theme=true
#
# 这里通过 awk 修改已有字段,同时保留其他用户配置。
update_settings_ini() {
local file="$1"
local gtk_theme="$2"
local prefer_dark="$3"
local tmp mode_bits

if [[ ! -f "$file" ]]; then
log "skip missing $file"
return 0
fi

tmp="$(mktemp "${file}.tmp.XXXXXX")"
mode_bits="$(stat -c '%a' "$file")"

if ! awk -v theme="$gtk_theme" -v dark="$prefer_dark" '
BEGIN {
in_settings=0
settings_seen=0
theme_seen=0
dark_seen=0
}

/^\[Settings\][[:space:]]*$/ {
in_settings=1
settings_seen=1
print
next
}

/^\[/ {
if (in_settings && !theme_seen) {
print "gtk-theme-name=" theme
theme_seen=1
}

if (in_settings && !dark_seen) {
print "gtk-application-prefer-dark-theme=" dark
dark_seen=1
}

in_settings=0
print
next
}

{
if (in_settings && $0 ~ /^gtk-theme-name[[:space:]]*=/) {
print "gtk-theme-name=" theme
theme_seen=1
next
}

if (in_settings && $0 ~ /^gtk-application-prefer-dark-theme[[:space:]]*=/) {
print "gtk-application-prefer-dark-theme=" dark
dark_seen=1
next
}

print
}

END {
if (in_settings && !theme_seen)
print "gtk-theme-name=" theme

if (in_settings && !dark_seen)
print "gtk-application-prefer-dark-theme=" dark

if (!settings_seen) {
print ""
print "[Settings]"
print "gtk-theme-name=" theme
print "gtk-application-prefer-dark-theme=" dark
}
}
' "$file" > "$tmp"; then
rm -f -- "$tmp"
return 1
fi

chmod "$mode_bits" "$tmp"
mv -- "$tmp" "$file"

log "updated $file"
}


# 修改 KWin Window Decoration。
#
# KDE 的窗口装饰由 KWin 读取 kwinrc 中:
#
# [org.kde.kdecoration2]
# library=
# theme=
#
# 在 Plasma 环境:
# 写入配置后立即调用 KWin.reconfigure 生效。
#
# 在 Hyprland 环境:
# 当前没有运行 KWin,只保存配置。
# 下次进入 Plasma 时 KWin 会读取该配置。
apply_kwin_decoration() {
local library="$1"
local theme="$2"

/usr/bin/kwriteconfig6 \
--file kwinrc \
--group org.kde.kdecoration2 \
--key library "$library"

/usr/bin/kwriteconfig6 \
--file kwinrc \
--group org.kde.kdecoration2 \
--key theme "$theme"

log "KWin decoration persisted: library=$library theme=$theme"


# 尝试通知正在运行的 KWin 重新读取配置。
# gdbus 失败时说明当前没有 KWin 会话,
# 这种情况不会影响配置保存。
if /usr/bin/gdbus call \
--session \
--dest org.kde.KWin \
--object-path /KWin \
--method org.kde.KWin.reconfigure \
>/dev/null 2>&1; then

log "KWin decoration reloaded"

else

log "KWin is not running; decoration will apply on next KWin session"

fi
}


# 更新 GTK2 主题。
#
# GTK2 不使用 settings.ini,
# 而是通过 gtkrc include 指向主题文件。
update_gtkrc() {
local file="$1"
local gtk_theme="$2"
local theme_dir="$3"
local tmp mode_bits

if [[ ! -f "$file" ]]; then
log "skip missing $file"
return 0
fi

tmp="$(mktemp "${file}.tmp.XXXXXX")"
mode_bits="$(stat -c '%a' "$file")"

if ! awk -v theme="$gtk_theme" -v theme_dir="$theme_dir" '
BEGIN {
theme_seen=0
include_seen=0
}

/^[[:space:]]*include[[:space:]]+"\/usr\/share\/themes\/[^/"]+\/gtk-2\.0\/gtkrc"[[:space:]]*$/ {
print "include \"/usr/share/themes/" theme_dir "/gtk-2.0/gtkrc\""
include_seen=1
next
}

/^[[:space:]]*gtk-theme-name[[:space:]]*=/ {
print "gtk-theme-name=\"" theme "\""
theme_seen=1
next
}

{
print
}

END {
if (!include_seen)
print "include \"/usr/share/themes/" theme_dir "/gtk-2.0/gtkrc\""

if (!theme_seen)
print "gtk-theme-name=\"" theme "\""
}
' "$file" > "$tmp"; then
rm -f -- "$tmp"
return 1
fi

chmod "$mode_bits" "$tmp"
mv -- "$tmp" "$file"

log "updated $file"
}


# 根据 darkman 状态选择各组件主题。
#
# 这里是整个 adapter 的核心映射:
#
# dark:
# KDE Color Scheme → BreezeDark
# GTK Theme → Breeze-Dark
# KWin Decoration → 可通过 kreadconfig6 --file kwinrc --group org.kde.kdecoration2 --key theme 获取
#
# light:
# KDE Color Scheme → BreezeLight
# GTK Theme → Breeze
# KWin Decoration → 可通过 kreadconfig6 --file kwinrc --group org.kde.kdecoration2 --key theme 获取
mode="$(read_mode)"

case "$mode" in
dark)
gtk_theme='Breeze-Dark'
gtk2_theme_dir='Breeze-Dark'
plasma_scheme='BreezeDark'
prefer_dark='true'
color_scheme='prefer-dark'

# kwin_decoration_library='org.kde.kwin.aurorae'
# kwin_decoration_theme='__aurorae__svg__WillowDarkBlur'
;;

light)
gtk_theme='Breeze'
gtk2_theme_dir='Breeze'
plasma_scheme='BreezeLight'
prefer_dark='false'
color_scheme='default'

# kwin_decoration_library='org.kde.kwin.aurorae'
# kwin_decoration_theme='__aurorae__svg__WillowLightBlur'
;;
esac


log "applying mode=$mode KDE=$plasma_scheme GTK=$gtk_theme"


# plasma-apply-colorscheme 需要 Qt 图形平台。
#
# Plasma session:
# 使用真实 Wayland/X11 环境,让 KDE 组件立即更新。
#
# Hyprland 或后台 service:
# 使用 offscreen,只修改 KDE 配置文件。
qt_platform='offscreen'

case "${XDG_CURRENT_DESKTOP:-}:${XDG_SESSION_DESKTOP:-}" in
KDE:*|*:KDE|Plasma:*|*:Plasma)

if [[ -n "${WAYLAND_DISPLAY:-}" ]]; then
qt_platform='wayland'

elif [[ -n "${DISPLAY:-}" ]]; then
qt_platform='xcb'
fi

;;
esac


log "KDE adapter Qt platform=$qt_platform desktop=${XDG_CURRENT_DESKTOP:-<unset>}"


kde_status=0


# 修改 KDE Color Scheme。
if QT_QPA_PLATFORM="$qt_platform" QT_QPA_PLATFORMTHEME=kde \
/usr/bin/plasma-apply-colorscheme "$plasma_scheme"; then

log "KDE color scheme applied: $plasma_scheme"

else

kde_status=$?
log "warning: KDE color scheme adapter failed with status $kde_status" >&2

fi


# 修改 KWin Window Decoration。
apply_kwin_decoration \
"$kwin_decoration_library" \
"$kwin_decoration_theme"


# 修改 GTK 全局主题。
/usr/bin/gsettings set org.gnome.desktop.interface gtk-theme "$gtk_theme"
/usr/bin/gsettings set org.gnome.desktop.interface color-scheme "$color_scheme"


# 修改 GTK2/3/4 配置文件。
update_gtkrc "$gtk2_rc" "$gtk_theme" "$gtk2_theme_dir"
update_gtkrc "$gtk2_user_rc" "$gtk_theme" "$gtk2_theme_dir"

update_settings_ini "$gtk3_settings" "$gtk_theme" "$prefer_dark"
update_settings_ini "$gtk4_settings" "$gtk_theme" "$prefer_dark"


# 通知 KDE 应用刷新主题。
#
# 这里发送的是刷新信号,不负责写入 KDE 配置。
/usr/bin/dbus-send --session --type=signal \
/KGlobalSettings org.kde.KGlobalSettings.notifyChange int32:0 int32:0 \
2>/dev/null || true


log "completed mode=$mode"

exit "$kde_status"
  • 新的统一主题适配器。
  • 使用 set -euo pipefail。
  • KDE 失败时仍继续处理 GTK,并返回失败状态供 systemd 记录。
  • 只修改 GTK 配置中的相关键,不重写整个文件。
  • 不设置 GTK_THEME、QT_STYLE_OVERRIDE 或 QT_PLUGIN_PATH。
用户 systemd

~/.config/systemd/user/darkman-apply-theme.service

1
2
3
4
5
6
7
8
[Unit]
Description=Apply the current Darkman Breeze theme state

[Service]
Type=oneshot
TimeoutStartSec=45
Environment=QT_QPA_PLATFORMTHEME=kde
ExecStart=%h/.local/bin/darkman-apply-breeze-theme
  • Type=oneshot,不 enable,不常驻。
  • 由 Darkman hook 或 Hyprland hyprland.start 启动。
  • 只对该服务固定设置:
1
Environment=QT_QPA_PLATFORMTHEME=kde

适配器根据 XDG_CURRENT_DESKTOPWAYLAND_DISPLAYDISPLAY 动态选择 waylandxcboffscreen

Hyprland

修改:~/.config/hypr/autostart.lua

1
2
3
4
5
6
7
8
9
10
hl.exec_cmd(
"dbus-update-activation-environment --systemd " ..
"DISPLAY WAYLAND_DISPLAY XDG_CURRENT_DESKTOP XDG_SESSION_DESKTOP " ..
"XDG_SESSION_TYPE XDG_MENU_PREFIX QT_QPA_PLATFORM QT_QPA_PLATFORMTHEME")
hl.exec_cmd(
"systemctl --user import-environment " ..
"DISPLAY WAYLAND_DISPLAY XDG_CURRENT_DESKTOP XDG_SESSION_DESKTOP " ..
"XDG_SESSION_TYPE XDG_MENU_PREFIX QT_QPA_PLATFORM QT_QPA_PLATFORMTHEME")
hl.exec_cmd("XDG_MENU_PREFIX=arch- kbuildsycoca6 --noincremental")
hl.exec_cmd("systemctl --user start --no-block darkman-apply-theme.service")

保留原有唯一的 hl.on(“hyprland.start”, function () handler,只追加:

  • DISPLAY 到 D-Bus activation environment 同步范围。
  • systemctl –user import-environment。
  • 在 Hyprland 会话启动时重建 KDE KService cache。
  • 启动当前模式的 darkman-apply-theme.service。

没有改动显示器、快捷键、输入法、动画、窗口规则或其他启动项。

Darkman 服务

执行了 systemctl --user enable --now darkman.service。当前状态为 enabledactive,并创建了 ~/.config/systemd/user/default.target.wants/darkman.service

位置配置为纬度 22.8、经度 108.3usegeoclue: false,由 Darkman 根据系统 Asia/Shanghai 时区计算日出日落。

在 Plasma Wayland 会话中已验证:

  • dark:BreezeDark、GTK Breeze-Dark、Plasma 当前方案 BreezeDark
  • light:BreezeLight、GTK Breeze、Plasma 当前方案 BreezeLight

两次 darkman-apply-theme.service 均返回成功。

常用命令

  • 切换:darkman set lightdarkman set darkdarkman toggle
  • 状态:systemctl --user status darkman.servicedarkman get
  • 日志:journalctl --user -u darkman.service -f
  • Portal:busctl --user call org.freedesktop.portal.Desktop /org/freedesktop/portal/desktop org.freedesktop.portal.Settings ReadOne ss org.freedesktop.appearance color-scheme

回滚

~/.local/bin/hypr-theme-rollback-rearchitecture

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#!/usr/bin/env bash
set -euo pipefail

readonly backup_dir="/home/plfjy/.local/state/hypr-theme-backup-20260804-223016-rearchitecture"
readonly home_dir="/home/plfjy"
readonly rescue_dir="$home_dir/.local/state/hypr-theme-rearchitecture-current-$(date +%Y%m%d-%H%M%S)"

mkdir -p -- "$rescue_dir"

if systemctl --user is-active --quiet darkman-apply-theme.service 2>/dev/null; then
systemctl --user stop darkman-apply-theme.service
fi

for item in .config/hypr/autostart.lua .local/share/darkman/10-breeze-state \
.local/share/darkman/10-breeze-theme.legacy-disabled \
.local/bin/darkman-apply-breeze-theme .config/systemd/user/darkman-apply-theme.service; do
if [[ -e "$home_dir/$item" ]]; then
mkdir -p -- "$rescue_dir/$(dirname "$item")"
mv -- "$home_dir/$item" "$rescue_dir/$item"
fi
done

if [[ -f "$rescue_dir/.local/share/darkman/10-breeze-theme.legacy-disabled" ]]; then
mv -- "$rescue_dir/.local/share/darkman/10-breeze-theme.legacy-disabled" \
"$home_dir/.local/share/darkman/10-breeze-theme"
fi

for item in .config/hypr/autostart.lua .config/darkman .local/share/darkman \
.config/xdg-desktop-portal .config/gtkrc .gtkrc-2.0 .config/gtk-2.0 \
.config/gtk-3.0 .config/gtk-4.0 .config/kded6rc .config/kdeglobals \
.config/plasmarc .config/kcminputrc .config/dconf/user; do
if [[ -e "$backup_dir/$item" ]]; then
mkdir -p -- "$home_dir/$(dirname "$item")"
cp -a "$backup_dir/$item" "$home_dir/$item"
fi
done

systemctl --user daemon-reload
printf 'Restored previous implementation from %s\n' "$backup_dir"
printf 'New files were preserved under %s\n' "$rescue_dir"
  • 停止主题适配器。
  • 将新文件保存到新的 rescue 目录。
  • 从本次备份恢复旧实现,包括 KDE、dconf、GTK、Portal 和 Hyprland 配置。
  • 恢复旧的 10-breeze-theme 文件名。
  • 重新加载用户 systemd 单元。

已知限制

  1. Plasma Portal 的运行时选择仍由 Plasma 自己管理;Darkman 只负责 Settings Portal 的颜色模式。
  2. 已禁用 kde-gtk-config 自动加载,因此 Plasma 不会继续自动生成 GTK 颜色 CSS 覆盖文件。
  3. 已运行的 Dolphin 和其他 Qt 应用通常需要重启后才读取新的调色板。
  4. QT_QPA_PLATFORMTHEME=kde 在 Hyprland 会话中使用;主题适配器服务自身也固定使用 KDE Platform Theme,但 Qt 平台后端按会话动态选择。

HyprShell – Hyprland 下好用的 alt-tab 工具

https://github.com/h3rmt/hyprshell

Hyprland 中的第三方截图

https://github.com/Satty-org/Satty

1
paru -S satty
1
[[mkdir -p "$HOME/Pictures/Screenshots"; grim -g "$(slurp)" -t ppm - | satty -f - --copy-command wl-copy --output-filename "$HOME/Pictures/Screenshots/%Y-%m-%d_%H-%M-%S.png"]]

Flock 进程单例锁 Waybar & Hyprland Key bindings 必备

https://geek-blogs.com/blog/linux-flock/

https://www.junmajinlong.com/shell/flock/index.html

简单命令:

1
flock -n "$XDG_RUNTIME_DIR/唯一名称.lock" 命令 参数

复杂命令:

1
exec 9>"$XDG_RUNTIME_DIR/唯一名称.lock"; flock -n 9 || exit 0; 后面的完整命令流程
  • Title: Linux 折腾相关记录
  • Author: 零风PLFJY
  • Created at : 2025-11-22 02:36:07
  • Updated at : 2026-09-15 07:44:54
  • Link: https://blog.plfjy.top/linux-related/
  • License: This work is licensed under CC BY-NC-SA 4.0.
Comments