Как загрузить переменную из .Xresources?

#python #xlib

#python #xlib

Вопрос:

Я использую Regolith, который загружает кучу Xresources с переменными, как i3-wm.font: typeface_wm в каком-то файле Xresources. Насколько я понимаю, они должны быть загружены в оконную систему to X11, которую можно было бы прочитать оттуда. Как я могу получить это значение в скрипте python, не прибегая к самостоятельному анализу файлов?

Я нашел python3-xlib модуль, который, я полагаю, должен быть в состоянии это сделать, но я не мог сделать из него ни головы, ни хвосты… Я понимаю, что Xlib довольно низкоуровневый и сложный, но я действительно надеюсь, что есть Xlib.get_resource("i3-wm.font") команда like, которая может предоставить мне необходимые ресурсы.

Ответ №1:

Вы правы, это кажется сложным!

Я нашел некоторый случайный код на github здесь, в котором есть некоторые подсказки. Дистиллированная версия, позволяющая просто читать:

 import Xlib
from Xlib.Xatom import RESOURCE_MANAGER, STRING

res_prop = Xlib.display.Display().screen().root.get_full_property(RESOURCE_MANAGER, STRING)
res_kv = (line.split(':', 1) for line in res_prop.value.decode().split('n'))
res_dict = {kv[0]: kv[1].strip() for kv in res_kv if len(kv) == 2}
  

Хотя имейте в виду, что это просто захватывает всю базу данных и помещает ее в dict, чтобы вы могли искать точные ключи. В частности, он не выполняет никаких изменений, на которые обращает внимание остальная часть X. Однако этого должно быть достаточно, чтобы вы начали. В частности res_dict['i3-wm.font'] , это поможет вам.

Комментарии:

1. Спасибо, что откопали информацию! Мне пришлось from Xlib.display import Display res_prop соответствующим образом изменить строку, чтобы заставить ее работать, но это решает проблему. Мой обходной путь заключался в использовании подпроцесса для вызова xrdb -query . Судя по тому, что вам нужно было сделать с выводом, результат немного похож: github.com/regolith-linux/i3-next-workspace/blob /.

2. Спасибо, потребовалось немного покопаться, но что меня мотивировало, так это то, что было неприятно думать, что при всей мощи python и библиотек нам все равно приходилось раскошеливаться и запускать xrdb … что он делает, чего мы не можем сделать? Итак, теперь я знаю … и вам не нужно зависеть от установленной xrdb.