it-swarm-vi.com

GTK - Bật / đặt chủ đề tối trên cơ sở mỗi ứng dụng

Có cách nào để đặt chủ đề gtk-application-prefer-dark cho ứng dụng không?

Điều này thường được đặt trong mã bởi ứng dụng. Các ứng dụng như Eye of Gnome và Totem bật nó lên. Tôi muốn, khi người dùng bật nó, trên cơ sở mỗi ứng dụng.

Đối với thiết bị đầu cuối gnome, tôi thường sử dụng một văn bản màu trắng trên bảng màu nền đen và có viền cửa sổ tối sẽ cải thiện giao diện tổng thể.

Tôi cũng muốn bật nó cho vlc.

62
Gary van der Merwe

Với gtk+ ≥ 3.12 bạn có thể tải một chủ đề cụ thể và biến thể của nó (tối, sáng) trên mỗi ứng dụng1 cơ sở thông qua biến môi trường GTK_THEME=theme:variant. Theo gtk+ hướng dẫn tham khảo :

GTK_THEME.  If set, makes GTK+ use the named theme instead of the theme that is
specified by the gtk-theme-name setting [...] It is also possible to specify a
theme variant to load, by appending the variant name with a colon, like this:
GTK_THEME=Adwaita:dark.

Vì vậy, để tải2 biến thể tối bạn sẽ chạy:

GTK_THEME=Adwaita:dark gedit

Tương tự, để đạt được điều ngược lại (khi chủ đề mặc định tối), bạn tải biến thể ánh sáng :

GTK_THEME=Adwaita:light gedit

Lưu ý rằng nếu bạn muốn sử dụng nó thông qua trình khởi chạy tùy chỉnh (.desktop file) bạn sẽ phải thêm env vào lệnh trong dòng Exec:

Exec=env GTK_THEME=Adwaita:dark eog %U

1: Đáng lưu ý rằng - theo quyết định của nhà phát triển - mới hơn gnome-terminal có cấu hình riêng thông qua menu> tùy chọn và nó bỏ qua chủ đề. Ngoài ra, vì đây là công cụ khá mới, một số ứng dụng gtk + 3 có thể chưa (chưa) tôn vinh GTK_THEME biến môi trường.
[.__.] 2: Điều này dường như không hoạt động nếu bạn đã có một phiên bản đang chạy của ứng dụng đó, ví dụ: if nautilus đã chạy ở chế độ tối rồi chạy GTK_THEME=Adwaita:light nautilus sẽ mở một cửa sổ nautilus mới nhưng vẫn ở chế độ tối. Tôi không biết đây là một tính năng hay lỗi ...

72
don_crissti

Đối với các ứng dụng GTK + -3, bạn có thể thực thi biến thể chủ đề tối bằng cách sử dụng settings.ini của GtkSinstall:

$ mkdir -p $HOME/.config/gnome-terminal/gtk-3.0 # the path before gtk-3.0 is arbitrary
$ cat >> $HOME/.config/gnome-terminal/gtk-3.0/settings.ini << EOF
[Settings]
gtk-application-prefer-dark-theme=true
EOF
$ echo 'alias gnome-terminal="XDG_CONFIG_HOME=$HOME/.config/gnome-terminal gnome-terminal" >> $HOME/.bashrc

Đối với các ứng dụng không phải GTK + như vnc, bạn vẫn có thể thực thi trang trí cửa sổ tối bằng cách đặt _GTK_THEME_VARIANT Thuộc tính X loại UTF8_STRING đến dark. Để thực hiện việc này với xprop, hãy nhập lệnh sau và nhấp vào cửa sổ sau đó:

$ xprop -f _GTK_THEME_VARIANT 8u -set _GTK_THEME_VARIANT "dark"

xprop cũng có thể chọn các cửa sổ theo WM_NAME property (nhãn thanh tiêu đề) hoặc theo id cửa sổ:

$ xprop -f _GTK_THEME_VARIANT 8u -set _GTK_THEME_VARIANT "dark" -name "Spotify Premium - Linux Preview"
$ xprop -f _GTK_THEME_VARIANT 8u -set _GTK_THEME_VARIANT "dark" -id 0x380002b

Để nhận id và tên cửa sổ, hãy sử dụng xlsclients -l.

22
Florian Müllner

Đây là một tập lệnh bash tôi đã sử dụng để khởi chạy một ứng dụng có chủ đề khác. Mặc dù đã không sử dụng nó trong nhiều năm, vì vậy tôi không biết liệu nó có hoạt động với GTK hiện tại không.

#!/bin/bash
# lauch a gtk application with a different theme
# set GTKRCFILE variable to your favourite theme
GTKRCFILE=Clearlooks
GTK2_RC_FILES=/usr/share/themes/"$GTKRCFILE"/gtk-2.0/gtkrc "[email protected]"

Đây là một chút thông tin tôi đã nhận được từ kho lưu trữ bốn giờ của Ubuntu. Không chắc chắn nếu nó sẽ là một vấn đề. ( ở đây ) Ngoài ra còn có một bài đăng blog chi tiết phương pháp này hơn một chút. ( ở đây ) và ( ở đây ). Cũng có một câu hỏi tương tự trên trang web này đã được trả lời. ( ở đây )

Trong gnome, các ứng dụng lấy chủ đề của chúng từ gnome-settings-daemon. Điều này ngay lập tức áp dụng bất kỳ thay đổi chủ đề nào cho tất cả các ứng dụng đang hoạt động, khiến cho chủ đề trên mỗi ứng dụng không thể thay đổi.

7
giodamelio

Cụ thể cho gnome-terminal, bạn có thể sử dụng cách sau để làm tối ứng dụng cụ thể:

gsettings set org.gnome.Terminal.Legacy.Settings theme-variant 'dark'
1
Nick Bull

Tôi đã viết một kịch bản bao bọc nhỏ cho điều đó:

#!/bin/bash


if [ $# -eq 0 ]; then
    xprop -f _GTK_THEME_VARIANT 8u -set _GTK_THEME_VARIANT "dark"
    exit $?
fi


GTK_THEME="$(gsettings get org.gnome.desktop.interface gtk-theme)"
export  GTK_THEME="${a%%:*}:dark"
export GTK_THEME_VARIANT="dark"
"[email protected]" & PID="$!"
echo "started darkening for PID=$PID"
cnt=0
while :; do
    if [ $cnt -lt 1000 ]; then
        sleep .1
        let 'x=x-1'
    else
        sleep 5
    fi
    if ! kill -0 $PID 2>/dev/null; then
        echo "darkening for PID=$PID done"
        exit 0
    fi
    REGEX="$(echo $PID | cat - <(command ps -o pid:1 --no-headers --ppid $PID) | paste -sd "|" -)"
    wmctrl -lp \
        | rg -i "^(0x[a-f0-9]+)\s+\d+\s+($REGEX)\s" -o --replace '$1' \
        | xargs -I @ xprop -f _GTK_THEME_VARIANT 8u -set _GTK_THEME_VARIANT "dark" -id @
done

Nó đang sử dụng https://github.com/BurntSushi/ripgrep cho REGEX

0
user2452171