LINUX.ORG.RU

Подскажите, как запустить приложение с изменённым WM_CLASS?

 , wmclass, ,


0

3

Суть в том, что разбиение приложений по tags (~столам~) и мониторам происходит через WM_CLASS/WM_TITLE.

see: DWM config.h

Хочу использовать разные Chromium’ы на различных tags.
И не перехватить и изменить CLASS/TITLE, а именно стартовать с нужным.

P.S. arg --class они выпилили начиная по-моему с 19 ver. T_T

★★★★★

И не перехватить и изменить CLASS/TITLE, а именно стартовать с нужным.

Это в любом случае придется делать. Либо перехватывать в момент создания окна, либо позже.
Проще будет в момент запуска перемещать их на нужный тэг самостоятельно. Добавить в dwm ewmh и управлять через wmctrl, например.

arrecck ★★★
()
Ответ на: комментарий от arrecck

Или ещё проще, пропатчить dwm и читать переменную окружения DWM_TAG. Это если нет смысла заморачиваться с поддержкой EWMH.
Запускать через DWM_TAG=<num> chromium

arrecck ★★★
()
Ответ на: комментарий от anonymous

facepalm.jpg

КЭП в здание!

qbbr ★★★★★
() автор топика

Ну если Chromium не умеет уже менять class, то для dwm вариант как-то развести по углам разные Chromium - загружать их с разными стартовыми пустыми страницами, чтобы заголовки WM_TITLE были разными. Такое проканает?

Zubok ★★★★★
()
Ответ на: комментарий от Zubok

Такое проканает?

Может и не проканать вполне вероятно, так как стартовая страница открывается наверняка не сразу и в момет появления окна там еще какой-то стандартный WM_TITLE, потом грузится страница и заголовок меняется.

Zubok ★★★★★
()
Ответ на: комментарий от Zubok

а запуск с доп опцией в которой дефолтное, такое же, как если опустить эту опцию, значение? но это уже вопрос к тс может ли двм по команде запуска отличать

deep-purple ★★★★★
()

P.S. arg --class они выпилили начиная по-моему с 19 ver. T_T

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

https://bugs.chromium.org/p/chromium/issues/detail?id=118613

Описан workaround с --user-data-dir, но он какой-то костыльный. Я так понимаю, что надо копировать профиль на каждый такой экземпляр Chromium

Zubok ★★★★★
()
Ответ на: комментарий от deep-purple

Ну, это может быть вариантом. Если приложение устанавливает _NET_WM_PID или WM_COMMAND, то по нему можно найти коммандную строчку и сделать что нужно. Но вот умеет ли это dwm, не знаю. Вот там у него в config.h в rules я не вижу такого поля. Есть class, instance и title. Даже role нет.

Zubok ★★★★★
()
Последнее исправление: Zubok (всего исправлений: 1)
Ответ на: комментарий от Zubok

Проканывает

dwm tags config.h:

{ NULL, NULL, "tag_03.localhost:8089 - Chromium", 1 << 2, False, -1 },
{ NULL, NULL, "tag_07.localhost:8089 - Chromium", 1 << 6, False, -1 },

start:

chromium --new-window http://tag_03.localhost:8089/
chromium --new-window http://tag_07.localhost:8089/

/etc/hosts:

127.0.0.1       tag_03.localhost tag_07.localhost

/etc/nginx/sites-enabled/dwm-tags-handler:

server {
    listen 8089;
    server_name tag_03.localhost tag_07.localhost;
    root /var/www/dwm-tags-handler;
    index index.html;
    allow 127.0.0.1;
    deny all;

    location / {
        try_files $uri $uri/ @rewrites;
    }

    location @rewrites {
        rewrite ^(.+)$ /index.html last;
    }

    error_log off;
    access_log off;
}

/var/www/dwm-tags-handler/index.html:

<script>window.location.href = 'https://google.com/';</script>

Как вам мой stack? =))))
открывается на нужном месте))

P.S. Месье знает толк в извращениях :_:
P.P.S. пойду попробую с wmctrl и xdotool пошаманить.
P.P.P.S. хм, надо бы js вынести из index.html и webpack прикрутить для сборки))))))))))
P.P.P.P.S и за место скучного nginx с его скучными обоями поднять nodejs, ну чтоб хипсота малолетняя зауважала сразу так вжух! P.P.P.P.P.S тесты надо бы на selenium сделать ещё

прорвало ^_^

qbbr ★★★★★
() автор топика
Ответ на: Проканывает от qbbr

P.P.S. пойду попробую с wmctrl и xdotool пошаманить.

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

Zubok ★★★★★
()
Ответ на: комментарий от qbbr

Это не поможет. Нужно, чтобы было смотрелось/устанавливалось свойство окна _NET_WM_DESKTOP [1]. И нужно также соответствие между tags и desktops. Насколько я понимаю, тэги и рабочие столы - это не одно и то же? На каждом рабочем столе может быть несколько тэгов и про тэги знает только dwm? То есть, еще раз: ты хочешь раскидать окна по разным тэгам. wmctrl ... -t <DESK> не должен срабатывать, так как он для этого посылает клиентское сообщение окну root [1], которое WM не обрабатывает.

[1] https://specifications.freedesktop.org/wm-spec/wm-spec-1.4.html#idm1399158452...

Zubok ★★★★★
()

«weechat», «mcabber», «newsbeuter», «ncmpcpp», «rtorrent»,

Это приложения консольные. Ты, насколько я вижу, по заголовкам различаешь. Так вот, class можно менять у терминала (у некоторых точно), в котором запускаются эти программы. У xterm точно можно. Скорее всего, и у rxvt. Вот тут такая схема обсуждалась с xterm:

Изменить значок xterm (комментарий)

UPD: То есть ты сможешь окна терминалов с одинаковыми заголовками различать таким образом, дав им при запуске разный класс.

Zubok ★★★★★
()
Последнее исправление: Zubok (всего исправлений: 1)

С одной стороны, в одной недавней теме есть рациональное зерно. С другой, dwm dwm'ом, но не пробовал ли ты openbox? Выдержка из его дефолтного rc.xml:

  # this is an example with comments through out. use these to make your
  # own rules, but without the comments of course.
  # you may use one or more of the name/class/role/title/type rules to specify
  # windows to match

  <application name="the window's _OB_APP_NAME property (see obxprop)"
              class="the window's _OB_APP_CLASS property (see obxprop)"
          groupname="the window's _OB_APP_GROUP_NAME property (see obxprop)"
         groupclass="the window's _OB_APP_GROUP_CLASS property (see obxprop)"
               role="the window's _OB_APP_ROLE property (see obxprop)"
              title="the window's _OB_APP_TITLE property (see obxprop)"
               type="the window's _OB_APP_TYPE property (see obxprob)..
                      (if unspecified, then it is 'dialog' for child windows)">
  # you may set only one of name/class/role/title/type, or you may use more
  # than one together to restrict your matches.

  # the name, class, role, and title use simple wildcard matching such as those
  # used by a shell. you can use * to match any characters and ? to match
  # any single character.

  # the type is one of: normal, dialog, splash, utility, menu, toolbar, dock,
  #    or desktop

  # when multiple rules match a window, they will all be applied, in the
  # order that they appear in this list
Не знаю, каков вывод obxprop для chromium'а (не пользуюсь), но подозреваю, что твоя задача разрешима легким движением.

dexpl ★★★★★
()
Ответ на: комментарий от Zubok

прав

Насколько я понимаю, тэги и рабочие столы - это не одно и то же?

tags это и есть «типо» рабочие столы в dwm

и про тэги знает только dwm?

ага, но как я понял, если поставить `dwm-ewmhtags-6.1.diff`, то он как раз устанавливает _NET_DESKTOP_VIEWPORT/_NET_NUMBER_OF_DESKTOPS/_NET_CURRENT_DESKTOP/_NET_DESKTOP_NAMES для инфы для всяческих кастомных поделок аля bar/panel.

qbbr ★★★★★
() автор топика
Ответ на: комментарий от dexpl

blackbox/openbox юзал лет 10 назад, да как-то к dwm привык. смену WM не рассматриваю.

qbbr ★★★★★
() автор топика
Ответ на: комментарий от qbbr

- это подходит только для консольных программ же, или я не прав?

Это, в общем-то, для терминала, в котором уже можно запускать нужную консольную программу. Просто я смотрю, что ты по заголовкам различаешь. Просто не всегда консольная программа может что-то с заголовком нужное делать. Например, терминальный emacs (не X11) при обычном запуске не меняет заголовок эмулятора терминала. Или иногда может быть, надо два экземпляра запустить, заголовок одинаковый, а надо раскидать по разным тэгам. Это я так, просто для информации, что можно так.

Zubok ★★★★★
()
Ответ на: комментарий от qbbr

Я так понимаю, что сейчас ты запускаешь rxvt (?) с параметром -name, который меняет WM_NAME. Как бы тоже вариант.

Zubok ★★★★★
()
Последнее исправление: Zubok (всего исправлений: 1)
Ответ на: комментарий от Bass

А xdotool не умеет менять класс окна?

Да это даже xprop умеет. Но это не поможет, это уже поздно слишком. Правила срабатывают, когда обрабатывается событие MapRequest, то есть уже к этому моменту класс должен быть присвоен. А потом уже смена класса ни на что не повлияет.

Zubok ★★★★★
()
Ответ на: комментарий от Bass

Есть совершенно дикий вариант, если менять класс у открытого окна. dwm прикладывает правила еще когда запускается, так как если есть открытые окна предыдущим WM или им же, то он их пытается у себя приютить и расположить в соответсвии с их свойствами. Поэтому есть метод (пока умозрительно): запускаем Chromium, меняем ему класс (если поменяется вообще), затем перезапускаем только dwm, и тогда окно окажется там где надо.

Zubok ★★★★★
()
Последнее исправление: Zubok (всего исправлений: 1)
Ответ на: комментарий от Zubok

Чорт. Я невнимательно читал исходный вопрос.

Тогда я дам абсолютно точный и абсолютно бесполезный ответ:

$ chromium --app=https://linux.org.ru &
$ xprop WM_CLASS WM_WINDOW_ROLE
WM_CLASS(STRING) = "linux.org.ru", "Chromium"
WM_WINDOW_ROLE(STRING) = "pop-up"

Но пользоваться браузером в таком режиме не очень-то удобно.

Update: ещё могу сказать, что ключ --class=XXX работает в Vivaldi. С учётом того, что это почти тот же хром, только в профиль – почему бы не попробовать?

Bass ★★★★★
()
Последнее исправление: Bass (всего исправлений: 1)
Ответ на: Проканывает от qbbr

{ NULL, NULL, «tag_03.localhost:8089 - Chromium», 1 << 2, False, -1 },

Можно только подстроку, если все точно описано в документации.

A client is matched if its properties contain the given strings as substrings (case-sensitively) or NULL is given (which means anything is matched there).

Zubok ★★★★★
()
Ответ на: комментарий от Bass

Таки поменяется. Только что проверил.

Тогда в некотором роде тоже вариант. Но только после chromium перезапускать dwm. Я так понимаю, что и для этого патч нужен, хе-хе-хе.

https://dwm.suckless.org/patches/restartsig/

https://dwm.suckless.org/patches/selfrestart/

или вот там можно без патча:

https://wiki.archlinux.org/index.php/Dwm#Restart_dwm

Zubok ★★★★★
()
Последнее исправление: Zubok (всего исправлений: 2)
Ответ на: комментарий от Zubok

плюсую, не знал об этом.

qbbr ★★★★★
() автор топика
Ответ на: комментарий от Bass

--app пробовал, работает, но, как ты уже сказал: «Но пользоваться браузером в таком режиме не очень-то удобно».

qbbr ★★★★★
() автор топика
Ответ на: комментарий от Zubok

хорошие идеи генеришь! перезапуск dwm для расстановки по tags)

qbbr ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.