Dunst: Baca ulang DPI sebelum menampilkan notifikasi baru

Dibuat pada 20 Sep 2017  ·  40Komentar  ·  Sumber: dunst-project/dunst

Kasus penggunaan laptop bepergian.
DPI dapat berubah dengan cepat, tetapi menjalankan dunst akan terus menggunakan nilai usang yang berlaku saat dimulai.

Feature graphics

Komentar yang paling membantu

Luar biasa! Digabungkan, itu akan dimasukkan dalam rilis 1.4 yang akan menjadi minggu depan atau lebih.

Semua 40 komentar

Saya berasumsi Anda kadang-kadang menggunakan monitor eksternal dan yang lain layar laptop dan itulah mengapa dpi berubah.

Sudahkah Anda mencoba pengaturan per_monitor_dpi bawah eksperimental? Itu dirancang dengan usecase serupa dalam pikiran.

Seperti yang saya lihat dari deskripsi, opsi ini menghitung DPI langsung dari geometri monitor xrandr, melewati fontconfig/xrdb/ xrandr --dpi . Jadi bukan itu yang saya butuhkan.
Saya baik-baik saja dengan DPI tunggal untuk seluruh framebuffer, karena ini adalah cara kerja X yang efektif. Saya hanya ingin memeriksa ulang nilai itu.

Ada diskusi yang cukup besar tentang penanganan DPI di # 240, dari komentar di utas itu:

Perlu dicatat bahwa konfigurasi xorg.conf / DisplaySize X dan xrandr's --dpi mengontrol hal yang sama; mengubah DPI memperbarui ukuran tampilan yang ditentukan, dan vv.

Jadi secara teoritis itu harus dipengaruhi oleh xrandr --dpi .

Saya baru saja mengujinya. Tidak, itu mengabaikan xrandr --dpi dan menggunakan dpi tampilan terhitung.

Saya tidak yakin tentang xrandr --dpi dan xorg.conf/DisplaySize mengatur hal yang sama, karena parameter DisplaySize berasal dari konteks SectionMonitor, dan xrandr --dpi mempengaruhi seluruh layar X.

Sepertinya Anda benar, saya akan memeriksanya besok.

Cara terbaik untuk mengimplementasikan ini mungkin dengan meminta ulang Xft.dpi saat menerima acara RRScreenChangeNotify .

terbalik:

  • Overhead yang dapat diabaikan karena acara itu diperkirakan tidak akan sering diterima (kecuali seseorang sangat suka mengubah konfigurasi layarnya)

Kelemahan:

  • Tidak akan berfungsi untuk pengguna Xinerama. - Implementasi xinerama saat ini di dunst tidak mendukung perubahan tata letak layar sehingga mudah-mudahan tidak akan memengaruhi siapa pun.

BTW, apakah jangan mengabaikan pengaturan DPI fontconfig? Mungkin ide yang baik untuk hanya mengandalkan fontconfig untuk mendapatkan DPI, karena itu akan menyederhanakan dan menyatukan banyak hal. Banyak aplikasi secara efektif mendapatkan bentuk DPI fontconfig, dan fontconfig sendiri jatuh kembali ke xrdb dan kemudian [seharusnya] ke xrandr jika DPI sendiri tidak disetel.

BTW, jangan abaikan pengaturan fontconfig DPI

Saat ini ya, belum melihat fontconfig sama sekali.
Logika dpi pada dasarnya adalah

Jika per_monitor_dpi diaktifkan, kueri xrandr dan hitung berdasarkan dimensi layar
lain jika Xft.dpi disetel gunakan itu
lain asumsikan 96.

Yah, dengan satu atau lain cara, fontconfig sudah digunakan dalam rendering teks di dunst, jadi akan logis untuk juga menggunakannya untuk penanganan DPI ketika per_monitor_dpi = false . Perbarui saja bila diperlukan.

Saya telah menerapkan ini di cabang feature/382-reload-dpi , ini berfungsi dengan baik menurut pengujian saya. Bisakah Anda mengujinya juga di pihak Anda dan memastikannya berfungsi sebagaimana mestinya?

Saya berharap panggilan undian juga diperlukan di sana tetapi jika itu berfungsi dengan baik tanpa itu bahkan lebih baik.

Yah, dengan satu atau lain cara, fontconfig sudah digunakan dalam rendering teks secara tidak langsung

Itu karena pango, secara internal tidak menggunakan fontconfig secara langsung.

Ini tidak berfungsi dalam kasus saya.

DPI=96
echo "Xft.dpi: $DPI" |  xrdb -merge ; xrandr --dpi $DPI
notify-send -a ht test1 test1
# remove notifications
DPI=128
echo "Xft.dpi: $DPI" |  xrdb -merge ; xrandr --dpi $DPI
notify-send -a ht test2 test2

Juga mencoba memutuskan dan menyambungkan kembali monitor eksternal agar skrip rerandr3 saya menerapkan nilai yang pada dasarnya sama seperti di atas secara otomatis. Dunst tidak mendapatkan DPI baru.

Saya menggunakan GPU Intel dengan driver modesetting dan Openbox+Compton sebagai WM.

Ups rupanya saya lupa memposting pembaruan tentang ini, saya pikir saya bisa menambahkan kode untuk membaca ulang dpi dan fungsi render yang ada akan mengambil alih dari sana tetapi ini tidak terjadi, pango_cairo_context_set_resolution harus dipanggil untuk memperbarui dpi juga yang sayangnya tidak dapat dilakukan tanpa menyentuh x.c yang saat ini berada di bawah refactor utama di cabang yang berbeda dan hal itu akan menyebabkan segala macam konflik.

Namun masalah lain yang tertunda menunggu refactor gambar.

@Vladimir-csp Bisakah Anda menguji PR #608. Saya ingin melihatnya diperbaiki.

Sayangnya, saya tidak melihat perbedaan. Notifikasi berikutnya setelah perubahan DPI muncul dengan ukuran yang sesuai dengan kondisi startup yang tidak baik.

Hmm. Itu tidak keren.

Mengubahnya melalui echo "Xft.dpi: $DPI" | xrdb -merge masih tidak mungkin (dan itu tidak dimaksudkan untuk diubah). Apakah Anda mengatur dpi dengan xrandr --dpi <DPI> juga?


Apakah Anda lari dari cabang yang benar?

git clone https://github.com/bebehei/dunst.git dunst-bebehei
cd dunst-bebehei
git checkout xrandr-dpi
make -j
pkill dunst && ./dunst

Apa pengaturan per_monitor_dpi di bagian experimental ?

Saya menggunakan skrip yang menetapkan DPI melalui xrandr --dpi dan juga menyinkronkannya ke xrdb dan fontconfig, jadi semua sumber tercakup.

$ git status
On branch xrandr-dpi
Your branch is up to date with 'origin/xrandr-dpi'.

Saya telah membuat paket darinya.

per_monitor_dpi = false

apa

    xdpyinfo | grep -B1 resolution

Laporkan setelah mengubah DPI?

itu melaporkan nilai yang benar

Jadi, itu melaporkan DPI yang benar, cocok dengan DPI yang ditetapkan oleh xrandr --dpi ?

Ya. Saya beralih antara 96 ​​dan 120, perubahan diterapkan dengan benar dalam ketiga cara: xrandr, xrdb, fontconfig

Oke, saya menambahkan komit debug lain. Bisakah Anda membangunnya kembali dan memulai dengan dunst -verbosity info ? Dan katakan, apa yang dikatakan "Menggambar dengan dpi layar"?

Meluncurkan dunst -verbosity info saat DPI disetel ke 96, mengalihkan DPI ke 120

$ xrdb -q | grep dpi
Xft.dpi:    120
$ xdpyinfo | grep -B1 resolution
  dimensions:    1920x1200 pixels (406x254 millimeters)
  resolution:    120x120 dots per inch
$ grep -ri dpi ~/.config/fontconfig/
~/.config/fontconfig/conf.d/90-xrandr-sync-dpi.conf:    <edit name="dpi" mode="assign"><double>120</double></edit>

notify-send test test , tidak melaporkan:

INFO: Drawing with screen DPI: 96.000000
INFO: Drawing with screen DPI: 96.000000

Ini tidak berfungsi karena implementasi di #608 lebih menyukai Xft daripada nilai xrandr --dpi dan tambahan screen_dpi_get_from_xft hanya membaca dari xft pada panggilan pertama dan setelah itu mengembalikan nilai yang di-cache. Jadi ini hanya akan berfungsi jika Xft.dpi benar ketika tidak menerima pemberitahuan pertama.

Apakah mungkin untuk menunda membaca hingga pemberitahuan baru ditampilkan?

Oh ya, @tsipinakis benar. Maaf, saya gagal mengomunikasikan kode saya sendiri :see_no_evil:

Apakah mungkin untuk menunda membaca hingga pemberitahuan baru ditampilkan?

Kapan kita harus menanyakannya? Tidak ada semantik acara untuk mendengarkan nilai yang diubah. Ini adalah overhead yang sangat besar untuk menanyakan DB per notifikasi.

Satu-satunya cara adalah dengan membatalkan nilai Xft:

echo "Xft.dpi: 0" | xrdb -merge
dunst &
echo "Xft.dpi: <olddpi>" | xrdb -merge

Kemudian dunst akan menggunakan nilai yang diberikan oleh xrandr --dpi . Dengan xrandr, kami memiliki acara untuk perubahan layar dan kami mendengarkannya.

Membatalkan nilai xrdb akan memengaruhi beberapa perangkat lunak yang karena alasan tertentu bergantung secara eksklusif padanya. Saya telah bereksperimen secara ekstensif dengan pengaturan DPI dan sampai pada kesimpulan bahwa cara terbaik untuk menjangkau semua aplikasi adalah dengan mengebom setiap sumber nilai: xrandr, xrdb, fontconfig. Saya memiliki pengait di autorandr yang melakukan hal itu.

Untuk menghindari balapan apa pun dengan pengaturan atau overhead dari kueri konstan, andalkan acara xrandr, tetapi tunda pembacaan yang sebenarnya hingga pemberitahuan berikutnya.

@Vladimir-csp #608 telah diperbarui untuk membatalkan nilai dpi yang di-cache saat pembaruan layar diterima seperti yang Anda sarankan. Bisakah Anda mencobanya dan melihat apakah itu berhasil untuk Anda?

Saya tidak melihat perubahan perilaku, masih menggunakan dpi startup dan tidak bereaksi terhadap perubahan.

Saya akhirnya tahu. Singkat cerita: itu adalah pengembaraan.

@Vladimir-csp Bisakah Anda menguji ini lagi? Ini harus bekerja seperti pesona.

Kapan kita harus menanyakannya? Tidak ada semantik acara untuk mendengarkan nilai yang diubah. Ini adalah overhead yang sangat besar untuk menanyakan DB per notifikasi.

Saya harus mundur dari ini. Sebenarnya ada acara yang bisa kamu dengarkan. Dan sangat mudah untuk mendengarkannya. Satu-satunya hal: xlib tidak melakukannya :imp:

di komit 2d37902. Tidak ada perubahan.

  • Diluncurkan tidak dengan dpi 120
  • Mengubah dpi menjadi 96 di xrandr, xrdb, fontconfig
  • Dunst masih menampilkan notifikasi berikutnya dalam 120 dpi
echo "Xft.dpi: 96" | xrdb -merge
./dunst -config dunstrc &
notify-send -u critical Test 1234
echo "Xft.dpi: 120" | xrdb -merge

@Vladimir-csp Perintah di atas berfungsi untuk saya untuk mengalihkan dunst ke 120 dpi dengan 2d37902, dapatkah Anda mencoba lagi dengan dunstrc default?

Ini berfungsi dengan konfigurasi default, tetapi tidak berfungsi dengan milik saya.
Inilah perbedaannya:

$ diff /usr/share/dunst/dunstrc .config/dunst/dunstrc
18c18
<     follow = mouse
---
>     follow = none
32c32
<     geometry = "300x5-30+20"
---
>     geometry = "512x3+37-0"
44c44
<     transparency = 0
---
>     transparency = 14
57c57
<     padding = 8
---
>     padding = 4
60c60
<     horizontal_padding = 8
---
>     horizontal_padding = 4
64c64
<     frame_width = 3
---
>     frame_width = 1
84c84
<     idle_threshold = 120
---
>     idle_threshold = 60
88c88
<     font = Monospace 8
---
>     font = Monospace 12
128c128
<     format = "<b>%s</b>\n%b"
---
>     format = "%a:\n<b>%s</b>\n%b %p"
162c162
<     icon_position = off
---
>     icon_position = left
165c165
<     max_icon_size = 32
---
>     max_icon_size = 64
168c168
<     icon_path = /usr/share/icons/gnome/16x16/status/:/usr/share/icons/gnome/16x16/devices/
---
>     #icon_path = /usr/share/icons/gnome/16x16/status/:/usr/share/icons/gnome/16x16/devices/
177c177
<     history_length = 20
---
>     history_length = 50
185c185
<     browser = /usr/bin/firefox -new-tab
---
>     browser = xdg-open
260c260
<     close = ctrl+space
---
>     close = mod4+BackSpace
263c263
<     close_all = ctrl+shift+space
---
>     close_all = mod4+shift+BackSpace
269c269
<     history = ctrl+grave
---
>     history = mod4+ctrl+BackSpace
272c272
<     context = ctrl+shift+period
---
>     context = mod4+Insert
277,278c277,279
<     background = "#222222"
<     foreground = "#888888"
---
>     background = "#161616"
>     foreground = "#aaaaaa"
>     frame_color = "#aaaaaa"
284,285c285,287
<     background = "#285577"
<     foreground = "#ffffff"
---
>     background = "#323232"
>     foreground = "#dddddd"
>     frame_color = "#dddddd"
291c293
<     background = "#900000"
---
>     background = "#ff1616"
293c295
<     frame_color = "#ff0000"
---
>     frame_color = "#ffffff"

Pesan debug dengan konfigurasi default berisi Checking for active screen changes :

DEBUG: XEvent: processing 'Expose'
DEBUG: XEvent: Ignoring '65'
DEBUG: XEvent: Checking for active screen changes
DEBUG: XEvent: Checking for active screen changes
DEBUG: XEvent: processing 'CreateNotify'
DEBUG: XEvent: Ignoring '22'
DEBUG: XEvent: Ignoring '22'
DEBUG: XEvent: processing 'CreateNotify'
DEBUG: XEvent: Ignoring '22'
DEBUG: XEvent: Ignoring '22'
DEBUG: XEvent: processing 'CreateNotify'
DEBUG: XEvent: processing 'CreateNotify'
DEBUG: XEvent: processing 'CreateNotify'
DEBUG: XEvent: processing 'CreateNotify'
DEBUG: XEvent: processing 'CreateNotify'
DEBUG: XEvent: Ignoring '22'
DEBUG: XEvent: Ignoring '22'
DEBUG: XEvent: Ignoring '18'
DEBUG: XEvent: Ignoring '21'
DEBUG: XEvent: Checking for active screen changes
DEBUG: XEvent: processing 'CreateNotify'
DEBUG: XEvent: Ignoring '22'
DEBUG: XEvent: Ignoring '22'
DEBUG: XEvent: Ignoring '22'

tetapi dengan konfigurasi saya mereka tidak ada:

DEBUG: XEvent: Ignoring '22'
DEBUG: XEvent: processing 'RRScreenChangeNotify'
DEBUG: XEvent: Ignoring '21'
DEBUG: XEvent: Ignoring '21'
DEBUG: XEvent: Ignoring '21'
DEBUG: XEvent: Ignoring '21'
DEBUG: XEvent: Ignoring '21'
DEBUG: XEvent: Ignoring '21'
DEBUG: XEvent: Ignoring '18'
DEBUG: XEvent: Ignoring '17'
DEBUG: XEvent: processing 'CreateNotify'
DEBUG: XEvent: Ignoring '18'
DEBUG: XEvent: Ignoring '17'
DEBUG: XEvent: processing 'CreateNotify'
DEBUG: XEvent: Ignoring '21'
DEBUG: XEvent: Ignoring '21'
DEBUG: XEvent: Ignoring '21'
DEBUG: XEvent: Ignoring '18'
DEBUG: XEvent: Ignoring '17'
DEBUG: XEvent: processing 'CreateNotify'
DEBUG: XEvent: Ignoring '18'
DEBUG: XEvent: Ignoring '17'
DEBUG: XEvent: processing 'CreateNotify'
DEBUG: XEvent: Ignoring '18'
DEBUG: XEvent: Ignoring '17'
DEBUG: XEvent: processing 'CreateNotify'
DEBUG: XEvent: Ignoring '22'

Harus ada pesan XEvent: processing PropertyNotify for Resource manager di log debug dunst.

Harap kompilasi ulang dengan make clean dan jalankan echo "Xft.dpi: 120" | xrdb -merge secara manual. Acara PropertyNotify harus datang ke suatu tempat.

Satu-satunya hal, yang mungkin salah, adalah pemeriksaan atom:

if (ev.xproperty.atom == XA_RESOURCE_MANAGER) {

Tapi kali ini, ini bekerja dengan sempurna di mesin saya. Aku memeriksa semuanya.

make clean ; make , meluncurkan biner baru dari direktori build dengan opsi -config . Hal yang sama. XEvent: processing PropertyNotify for Resource manager hanya muncul dengan konfigurasi default.
Ini konfigurasi saya (tanpa komentar):

[global]
    monitor = 0
    follow = none
    geometry = "512x3+37-0"
    indicate_hidden = yes
    shrink = no
    transparency = 14
    notification_height = 0
    separator_height = 2
    padding = 4
    horizontal_padding = 4
    frame_width = 1
    frame_color = "#aaaaaa"
    separator_color = frame
    sort = yes
    idle_threshold = 60
    font = Monospace 12
    line_height = 0
    markup = full
    format = "%a:\n<b>%s</b>\n%b %p"
    alignment = left
    show_age_threshold = 60
    word_wrap = yes
    ellipsize = middle
    ignore_newline = no
    stack_duplicates = true
    hide_duplicate_count = false
    show_indicators = yes
    icon_position = left
    max_icon_size = 64
    sticky_history = yes
    history_length = 50
    dmenu = /usr/bin/dmenu -p dunst:
    browser = xdg-open
    always_run_script = true
    title = Dunst
    class = Dunst
    startup_notification = false
    verbosity = debug
    corner_radius = 0
    force_xinerama = false
    mouse_left_click = close_current
    mouse_middle_click = do_action
    mouse_right_click = close_all
[experimental]
    per_monitor_dpi = false
[shortcuts]
    close = mod4+BackSpace
    close_all = mod4+shift+BackSpace
    history = mod4+ctrl+BackSpace
    context = mod4+Insert
[urgency_low]
    background = "#161616"
    foreground = "#aaaaaa"
    frame_color = "#aaaaaa"
    timeout = 10
[urgency_normal]
    background = "#323232"
    foreground = "#dddddd"
    frame_color = "#dddddd"
    timeout = 10
[urgency_critical]
    background = "#ff1616"
    foreground = "#ffffff"
    frame_color = "#ffffff"
    timeout = 0

Direproduksi dengan dunstrc yang disediakan.

@bebehei Menemukan bug ;)

Masalahnya adalah dengan

follow = none

Dengan mode ikuti lainnya, kami berlangganan PropertyChangeMask yang tampaknya menyertakan acara pengelola sumber daya tetapi dengan follow = none kami tidak menerimanya sehingga kami tidak tahu kapan harus memperbarui.

@bebehei tampaknya tidak aktif/sibuk dan belum menanggapi ping atau email saya, saya akan mengambil alih hingga rilis 1.4 yang saya tidak banggakan karena telah tertunda.

@Vladimir-csp Saya telah mendorong perbaikan untuk bug yang disebutkan di atas dapatkah Anda mengonfirmasi bahwa ini berfungsi untuk Anda sekarang?

Berhasil!

Luar biasa! Digabungkan, itu akan dimasukkan dalam rilis 1.4 yang akan menjadi minggu depan atau lebih.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat