Как я могу получить обновленную информацию о DPI системы от X11 в программе на C? - PullRequest
0 голосов
/ 26 января 2019

Я пытаюсь создать приложение с поддержкой DPI, которое реагирует на запрошенные пользователем события изменения DPI путем изменения размера окна.

Данная программа создана на C и использует SDL2, однако для получения информации о DPI системыЯ использую xlib напрямую, так как отсутствует поддержка SDL DPI в X11.

Я нашел два способа получения правильной информации DPI при запуске программы, оба из которых связаны с получением информации Xft.dpi из Xresource: один - использовать XGetDefault(display, "Xft", "dpi"), в то время как другой должен использовать XResourceManagerString, XrmGetStringDatabase и XrmGetResource.Оба они возвращают правильное значение DPI при создании программы.

Проблема в том, что если пользователь изменяет системный масштаб во время работы программы, оба XGetDefault abd XrmGetResource по-прежнему возвращают старое значение DPI, даже когдаЯ запускаю «xrdb -query | grep Xft.dpi», значение действительно изменилось.

Кто-нибудь знает способ получить обновленное значение Xft.dpi?

Ответы [ 2 ]

0 голосов
/ 04 февраля 2019

Я нашел способ сделать именно то, что хотел, хотя он довольно хакерский.

Решение (с использованием XLib) заключается в создании нового временного соединения с X-сервером с использованием XOpenDisplay и XCloseDisplay и опросе информации о ресурсах из этого нового соединения.

Причина, по которой это необходимо, заключается в том, что X извлекает информацию о ресурсе только один раз для каждого нового соединения и никогда не обновляет ее. Поэтому, открыв новое соединение, X получит обновленные данные xresource, которые затем можно будет использовать для старого основного соединения.

Помните, что постоянно открывающиеся и закрывающиеся новые X-соединения не могут быть хорошими для производительности, поэтому делайте это только тогда, когда это абсолютно необходимо. В моем случае, поскольку у окна есть границы, я проверяю изменения DPI только при изменении высоты заголовка, поскольку изменение DPI изменяет размер границы заголовка из-за различий в размере шрифта.

0 голосов
/ 26 января 2019

Вы можете попробовать использовать xdpyinfo (1); на моей системе выводит, помимо прочего:

  dimensions:    1280x1024 pixels (332x250 millimeters)
  resolution:    98x104 dots per inch
  depths (7):    24, 1, 4, 8, 15, 16, 32

Я не знаю, может ли это помочь вам, потому что я не знаю, как вы меняете DPI вашего экрана, но скорее всего, это работает. Удачи!

--- ОБНОВЛЕНИЕ после комментария --- В комментарии ниже от ОП говорится, что «есть настройка для изменения DPI» ... но я не знаю, какой именно. Во всяком случае, я попытался Ctrl + Alt + Plus и Ctrl + Alt + Minus, чтобы изменить разрешение X-сервера на лету. Изменив разрешение и увидев все больше, чем раньше, я снова запустил xdpyinfo. ЭТО НЕ РАБОТАЕТ: все тот же результат. Но может быть метод, который вы используете (который?) Вместо этого работает ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...