William Stout: The Guardian

Линукс готов для декстопа!

Я сейчас имею в виду не рабочую станцию, а графическую абстракцию десктопа -- то пустое место, на котором открываются все окна. В современных линуксах таковых бывает несколько штук, и между ними можно мгновенно переключаться.

У меня есть программа, которая открывает много окон, и я захотел научить её понимать, на каком десктопе находится каждое из них, и манипулировать этим. Программа написана на Qt, поддержки десктопов в Qt нет. Она просто открывает всё подряд на произвольный текущий десктоп, и ничего про дальнейшее положение вещей не знает. Из Qt можно достать указатели на нативные низкоуровневые иксовые структуры, связанные с его окнами. Я думал, что с их помощью посмотрю в X-сервере. Про X-сервер я абсолютно ничего не знаю, как видно из качества самой этой идеи: самое поверхностное ознакомление показывает, что X-сервер тоже не знает и не может ничего знать про десктопы, а живут они только внутри оконного менеджера. Внутри каждого по-своему (например, у некоторых - никак).

Ну тогда я решил сдаться, потому что где я возьму читабельные описания библиотек некоего конкретного оконного менеджера. Кто ими вообще пользуется, кроме их авторов? Я даже не знаю, какой у меня оконный менеджер. Точно не fvwm.

Но в самый последний момент обнаружилась программа wmctrl, с помощью которой можно общаться с оконным менеджером из командной строки! Она поддерживает прекрасный набор команд типа "перечисли все окна", "перенеси окно x на десктоп y", "напечатай, где находится окно z" и подобные. Работает в том оконном менеджере, из окна в котором запущена.

Тут, разумеется, можно открыть код этой программы, вырезать из него нужные куски и перенести в свой проект. Но это решение чудовищно неэффективное. У кого есть время продираться через код?

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

Вот за прекрасную дебильность таких решений я и люблю программирование. Когда-то, в восьмидесятые годы, оно всё было такое. Теперь всё меньше и меньше.
оно в линуксе почти всё такое.

я недавно обнаружил, что в моём убунту переключение инпут локали (ru/en) делается через приделывание к хоткею консольной команды, которая читает весь конфиг х-шелла, меняет там язык, и записывает весь файл, с нехилым таким лагом (конфиг не на локальном диске оказался).

а искать стал, потому что переключение языка происходило уже на середине напечатанного слова.
не знаю куды бечь, нынче всюду фреймворки.
Даже в системном администрировании стандартов понапридумывали
Я тоже про X11 уже плохо помню, но предположил бы, что там можно у X-server-а спросить атомы/проперти окна, и где-то в атомах/пропертях (причём, вероятно, стандартно названных независимо от используемого WM) эту информацию найти.
... ну, собственно, xprop в несколько кликов позволяет предположить, что эта property называется _NET_WM_DESKTOP.
Какие у вас высокие требования к компьютеру! Я уже давно забил на всякое удобство. Если ничего за 5 минут работы не заклинивает/бесит, то уже и счастье.
Красота!

Но рекомендую добавить её в проект и таки компилировать его прежде, чем запускать :) Иначе вы рискуете, что с каким-нибудь апдейтом версия обновится до несовместимой.

Edited at 2017-11-16 01:25 pm (UTC)