to post messages and comments.

← All posts tagged xmonad

С управлением настройками планшетов wacom в kde всё немного грустно. В KDE4 есть более-менее нормальный модуль для этого, но 4е кеды вроде как уходят в прошлое. В Plasma 5 модуль есть, но недопортирован и хромает на обе ноги.
При этом ни тот, ни другой (и, насколько я знаю, гномовский тоже?) не умеют автоматом переключать профили настроек при переключении окон. И ещё они не умеют управлять режимами кольца на планшете (intuos pro).
А если у вас не кеды и не гном, а какой-нибудь lxde, то всё совсем грустно — остаётся только баш-скриптами xsetwacom запускать.
В итоге глюки кде-шного демона довели меня до того, что я сел и написал свой.
github.com
Тут есть несколько вещей:
* Пакет wacom-daemon содержит библиотеку, в которой реализована основная часть логики, и запускалки для этой библиотеки. hswcmcli — тестовая утилита, можно например с командной строки профили планшета переключать. hswcmd — демон, работающий на основе своего конфига (в yaml-формате), умеет автоматом переключать профили.
* Пакет xmonad-wacom содержит модули для автоматического переключения профилей настроек планшета при переключении текущего окна для XMonad. Там есть примеры конфигов xmonad. Поддерживается как интеграция с KDE-шным демоном через dbus, так и самостоятельная работа при помощи библиотеки wacom-daemon. Ещё показывает сообщения о перелкючении профилей через libnotify.
Всё это работает так: запускается демон (в случае xmonad — отдельный поток в рамках самого xmonad, в случае hswcmd — в нём), который помнит текущий профиль настроек, через udev отлавливает подключение планшета и при этом запускает xsetwacom с правильными параметрами. Этому демону через хаскельное API можно сказать "поменяй профиль", он запустит xsetwacom и запомнит новый профиль. Пользоваться этим API можно из XMonad (оконный менеджер сам знает, когда окна переключаются) или из hswcmd (он слушает иксовые события переключения окон). Ну или какие-нибудь ещё программы могут ту же библиотеку использовать, теоретически.
Т.е. если используется xmonad, то можно эту штуку интегрировать в xmonad, и больше ничего запускать не надо. Если используется какой-нибудь там опенбокс, то можно при старте иксов запускать hswcmd.
Всё это в процессе разработки и хреново документировано, но если сильно хочется можно пробовать.

Продолжение #2789871.
Доделал ещё автоматическое переключение профилей планшета (привязок кнопок планшета к кнопкам клавиатуры или мыши, которые можно настроить в KDE-шном systemsettings) в зависимости от активного окна. Т.е. можно настроить отдельные профили для gimp, krita, mypaint, и они будут автоматически переключаться при переключении окошек. Сделал в двух вариантах — для XMonad и для KWin (на егоном js). Мне тут уже указали на некоторый бред в js-варианте, но оно как-то работает, а переделать пока руки не дошли.
И ещё сделал возможность привязывать режимы express ring к профилям планшета. Т.е. для каждого профиля можно иметь четыре набора настроек для кольца.
Код всё там же — github.com

что я более-менее часто использую в своём xmonad:
* переключение на нужное окно или запуск соответствующей программы по одной и той же кнопке. Кнопки вида Alt-X,<буква> показывают через gridselect список окон, сооветствующих букве (i — IM, w — web, y — почта, f — filemanagers etc). Если подходящее окно одно — сразу перебрасывает на него. И в gridselect сразу активен режим поиска, так что например Alt-X,i,xm,<Enter> меня сразу перебросит на окошко с чятом про xmonad. Для наиболее часто используемых групп окон также назначены мультимедийные кнопки на клавиатуре.
* переключение десктопов через win-tab (показывается опять же gridselect).
* для окошек, которым не назначено определённого воркспейса, автоматом создаётся новый воркспейс с именем по классу окна. Т.е. если я вдруг запускаю софтину, которую раньше не запускал (так что в конфиге она не отражена), то её окошко не будет мне путаться среди ныне видимых, а покажется на отдельном воркспейсе.
* окна pidgin автоматом раскидываются по воркспейсам в соответствии с группами в ростере. Один воркспейс для чятов по работе, один для болтовни, итд. Если чят/собеседника перетащить в ростере в другую группу, то в следующий раз его окошко откроется уже сразу на правильном воркспейсе.
* переключение десктопов на первом/втором мониторе по win-F1/F2.
* часть воркспейсов привязана к первому или второму монитору. Например, воркспейс с браузерами привязан к первому, поэтому Alt-X,w мне сейчас покажет браузер на первом мониторе. Но можно нажать win-F2, и сказать показывать браузер на втором, если мне вдруг захочется.
* по win-backspace переключение на предыдущее активное окно.
* Alt-j/k генерируют через xtest события скролла мышиного колеса вниз/вверх. Удобно что-нибудь скроллить в программах, которые не умеют скроллиться по j/k.
* Alt-e переключает на специальный воркспейс под названием "dashboard", на который по умолчанию никаких окон не назначено, т.е. он обычно пустой. Если вдруг зачем-то захочется увидеть обои. В домашней конфигурации у меня там ещё красивые часики (двое).

использую реже:
* по alt-w показывается через gridselect список всех открытых окон, и выбранное окно притаскивается на текущий воркспейс.
* по alt-/ показывается через gridselect список всех открытых окон, на выбранное окно переключаемся (и на тот воркспейс где оно находится).
* по win-m показывается список воркспейсов, на выбранный уносится текущее окно.
* по win-c через prompt спрашивается название воркспейса. Создаётся новый воркспейс и текущее окно уносится туда.

сделал, но использовал полтора раза, думал удобно будет, но пока ненужно:
* Alt-q показывает список групп окон, которые определены в специальном конфиге на yaml. Там что-нибудь типа {name: 'XMonad'; title: '[Xx][Mm]onad'}. При выборе группы из открытых окон выбираются те, которые подходят под условие, и все показываются на новом воркспейсе.
Сохранение/восстановление распределения окон по воркспейсам при перезапусках. Win-S сохраняет список окон на текущем воркспейсе в отдельный файлик ${workspacename}.workspace. Там для каждого окна сохраняется класс и ad-hoc выдуманный regexp для заголовка (первое-слово-заголовка.). Содержимое таких файликов интерпретируется как managehook, т.е. окна потом будут раскидываться с учётом сохранённого расположения.
* Alt-h генерирует событие мышиного клика.

Нарисовал пару плюшек для xmonad-contrib:
paste.in.ua
paste.in.ua
(Если патчи примут, то скоро будет в апстриме).
Одно позволяет запускать лэйаут в ограниченном прямоугольнике — например, чтобы оставить поля вокруг браузера, если у вас слишком широкий монитор, а больше ничего на этот десктоп совать не хочется.
Второе позволяет использовать один из двух лэйаутов в зависимости от количества окон: если окон <= N, то используем один лэйаут, иначе второй.

Наконец-то дошли руки сделать сохранение списка групп чатов из pidgin. А то если pidgin запускался и сразу открывал чаты, то xmonad не успевал к нему подключиться по dbus, чтобы узнать, куда какое окно кидать, и всё кидалось на один воркспейс — некузяво. Теперь если соединения с pidgin нет, то пользуемся данными из файлика, и сохраняем данные в этот файлик, как только получится подключиться.
Текущее состояние: paste.in.ua

Довёл до частично рабочего состояния поддержку XInput в XMonad. В идеале, это должно позволить, например, различать устройства ввода. Например, у меня пульт посылает сочетания клавиш типа «ctrl-p», «ctrl-shift-b» итп — хочется на эти клавиши повесить управление например mpd, но только для случаев когда они нажаты на пульте, а когда на клавиатуре — чтобы выполняли свои обычные функции.
Сейчас заморочка в том, что в X11 есть отдельные grab-ы устройств ввода для «core protocol» и для XInput. Обычно XMonad захватывает сочетания клавиш, которые собирается обрабатывать (используя core protocol), так что эти сочетания не передаются активному окну. В моей версии, XMonad захватывает эти сочетания, используя XInput. Тогда окнам не попадают события XInput, но попадают обычные события из core protocol. Так что, если забиндить клавишу паузы на пульте (посылает ctrl-p) на mpc pause, то при активном окне lowriter при нажатии этой кнопки mpd встанет на паузу И writer пошлёт документ на печать. Для того, чтобы сочетания клавиш не попадали активному окну, можно эти сочетания за-grab-ить через core protocol. Но core protocol не различает устройств ввода, так что, если, например, захватить ctrl-p через core protocol, то при нажатии паузы на пульте сделается mpd pause, writer ничего не сделает (это правильно); но при нажатии ctrl-p на клавиатуре writer тоже ничего не сделает. Т.е. можно или захватывать сочетание клавиш, чтобы оно никогда не попадало окнам, либо не захватывать, чтобы оно всегда попадало окнам. Решить, передавать ли сочетание в окно, в момент нажатия, в зависимости от чего-то — невозможно.
Так вот, вопрос. To grab or not to grab? Захватывать или не захватывать?

К.о. внезапно обнаружил, что в xmonad.hs можно через dbus интегрировать что угодно. Например, сейчас вот интегрировал себе таким образом pidgin: окошки с чятиками раскидываются по workspace-ам в соответствии с группами, заведёнными в pidgin. Потенциально можно ещё чего-нибудь придумывать из этого.

Тут меня на днях стало анноить, что в xmonad новому окну всегда передаётся фокус. В результате родился вот такой патч на xmonad core: paste.in.ua
В конфиг добавляется новое поле focusNewWindow — условие, по которому решаем, давать ли новому окну фокус. По дефолту там «return True», т.е. давать всегда — эмулируем обычное поведение. Можно, например, focusNewWindow = className =? "SomeApp" — давать фокус новым окнам только для приложения SomeApp.
Дискасс.