LINUX.ORG.RU

Реализация «run or raise» («run or focus») для i3wm

 ,


2

2
#!/bin/sh
case "$1" in
    "class" )
        count=`xdotool search --limit 1 --class "$2" | wc -l`
        i3wm_criteria="class";;
    "instance" )
        count=`xdotool search --limit 1 --classname "$2" | wc -l`
        i3wm_criteria="instance";;
    "name" )
        count=`xdotool search --limit 1 --name "$2" | wc -l`
        i3wm_criteria="title";;
esac
if [ "$count" -eq 0 ]; then
    $3
else
    i3-msg "[$i3wm_criteria=(?i)$2] focus"
fi

Суть «run or raise» («run or focus») — если программа запущена, то переключиться на неё, если нет - запустить.

Этот скрипт принимает три аргумента. Первый - критерий, по которому будем искать нужное окно (class, instance (classname) или name (title)), второй - значение поля, заданного первым аргументом, третий - команда, которую выполняем, если не найдено соответствующее окно.

Пример:

./runorraise.sh class Iceweasel iceweasel

Если есть окно с классом Iceweasel, то переключиться на него, иначе - выполнить команду iceweasel.

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

Пост на форуме i3wm, там могут появляться интересные комментарии:

https://www.reddit.com/r/i3wm/comments/3zrh29/run_or_raise_run_or_focus_imple...

★★

Последнее исправление: cetjs2 (всего исправлений: 3)

Ответ на: комментарий от bvn13

Ну да.

exec sh скрипт аргументы

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

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

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

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

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

В принципе, завести файл с такими соответствиями и выделить отдельный алиас под такие 'десктопные' программы:

bindsym $mod+g exec echo | dmenu_run.ror -p RoR: | xargs ror.sh

И в dmenu_run.ror грузить только имена из этого конфига.

aidan ★★★★
()

Таким образом придётся на каждую программу описывать свой вариант, неинтересно.

Гораздо удобнее было бы (как уже сказал анон выше, через dmenu), получать требуемую команду для запуска, и искать её по всем окнам сначала по WM_COMMAND, потом по _NET_WM_PID, а потом уже по классу. Если не нашлось - запускаем что есть.

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

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

Ну у меня в Awesome настроены для Iceweasel, Icedove, Ncmpcpp бинды как раз на run or raise, один раз настроил и пользуюсь. Это нужно не для всех программ.

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

так на каждую программу алиас придётся делать

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

Это нужно не для всех программ.

да, но это менее универсальное решение, особенно если его выкладывать на форуме

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

Дменю почти никогда не пользовался и пока не планирую, если честно. У меня самоделка есть, которая выполняет схожие функции (запуск) и полностью устраивает.

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

Просто запускаю все нужные пронраммы на старте. Всё на своих столах (workspace). Пожалуй, только floating консолька с tmux появляется так по шоту.

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

Раз ты такой ограниченный, то зачем сюда это принес?

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

сам ведь попросил и ведь получил (неожиданно для лора дельные), а теперь в кусты?

anonymous
()

reddit жжот

airbladeri3 i3-gaps unclutter-xfixes 1 очко час назад

1 очко час назад

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

Есть некоторая разница между «усовершенствовать» и «переработать, запилив интеграцию с программой, которую я не использую и вряд ли буду использовать». Мало ли, мб кто предложил бы более оптимальный способ грепать по окнам, например.

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

Я этим и вдохновился. То, как там сделано - мне показалось неправильным. ps aux показывает и командные строки процессов, т.е. достаточно где-то быть процессу, запущенному с командой, лишь содержащей firefox - и будем вести себя так, будто бы он запущен. Не-не-не. Первый вариант моей попытки замутить это использовал pgrep и искал чётко по именам процессов текущего пользователя. Однако, мне показалось, что правильнее работать всё-таки не с процессами, а с окнами.

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

Если честно, я его не видел, но мне нравится. В принципе, во многом реализация у него такая же, только пара мест отличается (я говорю о самом механизме run-or-raise). Мне как-то совсем не ясно, что делает

eval ${@:3} &

Т.е. я понимаю, что это будет запуск программы, но что конкретно значит написанное?

Ну и регулярка sed'а не совсем очевидна:

s/\\x20/\\\\x20/g

Я правильно понимаю, что она добавит \ перед пробелами?

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

чего там «усовершенствовать» в 17-ти строках на баше? но я видел, что ты взял себя в руки и уже пытаешься получить классы окон - это похвально

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