LINUX.ORG.RU

bspwm перевести окна созданных в qtcreator приложений в состояние floating

 , ,


0

0

Сабж. Создаю в qtcreator приложение типа Hello world, нажимаю Ctrl+R (Run). Все хорошо, но хотелось бы, чтобы после сборки приложение автоматически переключалось в floating mode.

Для этого в конфиг bspwm нужно добавить строку такого типа:

bspc rule -a feh state=floating

Проблема заключается в том, что мне неизвестно имя всплывающих окон такого типа. Знатоки bspwm, если таковые здесь есть, не подскажете, как его узнать?

Перемещено xaizek из development


Подозреваю, что никак без добавления в заголовок какой-нибудь идентифицирующей их строки. Либо включить floating по умолчанию.

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

До этого понадобился только feh, а он одноименный.

x86-
() автор топика
Ответ на: комментарий от sudopacman

Эх, так и есть - класс приложения («001_QTTest»), оказывается, соответствует имени проекта.

x86-
() автор топика
Ответ на: комментарий от sudopacman

Сейчас попробую это, спасибо.

x86-
() автор топика
Ответ на: комментарий от sudopacman

Заголовок всплывающего окна называется «MainWindow», но bspc конфиг, видимо, требует именно класса приложения - bspc rule -a MainWindow state=floating не дает эффекта, а сработал лишь bspc rule -a 001_QTTest state=floating.

А если ты о родительском окне (сам Qt Creator) - то его класс - «QtCreator», а заголовок - «001_QTTest - Qt Creator».

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

https://wiki.archlinux.org/title/Bspwm#Rules

https://github.com/baskerville/bspwm/tree/master/examples/external_rules

Можно прикрутить сторонний скрипт в качестве функции-индикатора для определения окон, подпадающих под правило (гуглится довольно быстро, поэтому подумал, что ты уже).

Раз у Qt Creator заголовок «Имя_проекта - Qt Creator». То функция должна возвращать true, когда среди открытых окон есть окно с заголовком «Window_class - Qt Creator» (т.к. имя проекта совпадает с классом окна). Такой вот костыль.

sudopacman ★★★★★
()

Таак, сейчас копаюсь в man bspwm, где нашлось такое любопытное свойство как modifier:

       Modifiers
           [!]focused
               Only consider the focused node.

           [!]active
               Only consider nodes that are the focused node of their desktop.

           [!]automatic
               Only consider nodes in automatic insertion mode. See also --presel-dir under Node in the DOMAINS section below.

           [!]local
               Only consider nodes in the reference desktop.

           [!]leaf
               Only consider leaf nodes.

           [!]window
               Only consider nodes that hold a window.

           [!](tiled|pseudo_tiled|floating|fullscreen)
               Only consider windows in the given state.

           [!]same_class
               Only consider windows that have the same class as the reference window.

           [!]descendant_of
               Only consider nodes that are descendants of the reference node.

           [!]ancestor_of
               Only consider nodes that are ancestors of the reference node.

           [!](hidden|sticky|private|locked|marked|urgent)
               Only consider windows that have the given flag set.

           [!](below|normal|above)
               Only consider windows in the given layer.

           [!](horizontal|vertical)
               Only consider nodes with the given split type.

x86-
() автор топика
Ответ на: комментарий от sudopacman

О, то, что нужно! Сейчас это и попробую.

x86-
() автор топика
Ответ на: комментарий от sudopacman

При передаче управления внешней функции, bspc передает четыре параметра:

wid=$1  # window id
class=$2
instance=$3
consequences=$4

Не знаешь, как можно, руководствуясь этими данными, получить данные о родительском окне?

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

Хм, пробую, но не работает - окно по-прежнему открывается в тайловом режиме.

bspwmrc:

#! /bin/sh

...

bspc rule -a feh state=floating
bspc config external_rules_command "$(${HOME}/.config/bspwm/external_rules.sh)"

...

external_rules.sh:

#! /bin/sh

wid=$1  # window id
class=$2
instance=$3
consequences=$4

xwininfo -tree -root | grep "$class - Qt Creator"
if [$? -eq 0]; then
    echo "state=floating"
fi

Если что, сама команда в консоли работает:

gensek➜  ~  ᐅ  export class=001_QTTest   
gensek➜  ~  ᐅ  xwininfo -tree -root | grep "$class - Qt Creator"
if [ $? -eq 0 ]; then
    echo "state=floating";
fi
     0x1a00012 "001_QTTest - Qt Creator": ("qtcreator" "QtCreator")  3658x2323+0+55  +0+55
state=floating
x86-
() автор топика
Последнее исправление: x86- (всего исправлений: 1)
Ответ на: комментарий от sudopacman

;) Оно составлено из sek****o (мой альтернативный ник) + gentoo, в итоге оказалось созвучно с генсеком.

x86-
() автор топика

Ладно, что-то подсказывает мне, что проще будет забить на это дело и переключать всплывающие окна в floating с помощью стандартного $mod+s. Если уже дело дойдет до сколь-нибудь крупного проекта, засовывать его название как класс в конфиг.

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

взятие в $()

Это для извлечения вывода команды. В примере используется, потому что там which.

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

Насчет логов: судя по всему, в bspwm не предусмотрена система логирования - на реддите всем советуют запустить его из tty и смотреть на выхлоп. Хм, надо попробовать. Минутку.

x86-
() автор топика
Ответ на: комментарий от sudopacman

Ну и команду bspc config external_rules_command "/home/gensek/.config/bspwm/external_rules.sh" из терминала нужно запустить, чтобы хотя бы на её выхлоп посмотреть (если он есть).

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

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

x86-
() автор топика
Ответ на: комментарий от sudopacman

Можно добавить в скрипт notify-send "Test", чтобы понять, запускает ли вообще его bspwm при открытии окна. (Эдакий дебаггинг с помощью printf().)

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

Не-а, уведомление не выводится при добавлении в скрипт. (Если что, в консоли и других скриптах notify-send работает). Сейчас попробую позаключать его в кавычки, может поможет (сомнительно)

Edit: нет, не сработало.

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

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

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