elbahek 07.10.2010 01:24

Tips & tricksOpenbox, разные обои для каждого воркспейса

Что нам для этого понадобится? Немного терпения и навык "Костылестроение" = 10 (на 3d).
Тонкая провокация. Кто знает, что за 3d я имел в виду?

Ладно, вернемся к теме - зачем "костылестроение"? А затем, что возможность установить разные обои на воркспейсы в Опенбоксе не реализована. Гугление на тему выдало единственный вменяемый результат, который скорее подсказал, как реализовать.

Основная идея: к кнопкам переключения воркспейсов вяжем изменение обоев. Итак:
Хоткеи в Опенбоксе настраиваются либо в глобальном /etc/xdg/rc.xml либо в ~/.config/openbox/rc.xml. Выбирайте, какой больше по душе. Находим нужные хоткеи:
 1
2
3
4
5
6
7
8
9
10
11
12
<keybind key="C-A-Left">
<action name="DesktopLeft">
<dialog>no</dialog>
<wrap>no</wrap>
</action>
</keybind>
<keybind key="C-A-Right">
<action name="DesktopRight">
<dialog>no</dialog>
<wrap>no</wrap>
</action>
</keybind>


и добавляем к ним дополнительный экшн
 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<keybind key="C-A-Left">
<action name="DesktopLeft">
<dialog>no</dialog>
<wrap>no</wrap>
</action>
<action name="Execute">
<command>/path/to/wallpaper/script prev</command>
</action>
</keybind>
<keybind key="C-A-Right">
<action name="DesktopRight">
<dialog>no</dialog>
<wrap>no</wrap>
</action>
<action name="Execute">
<command>/path/to/wallpaper/script next</command>
</action>
</keybind>


Как видите, по нажатию соответствующей комбинации выполняется наш скрипт смены обоев с аргументами "next" или "prev". Теперь сам скрипт:
 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#!/bin/bash

# Аргумент должен быть или "next" или "prev"
< -z $1 > || (< $1 != "next" > && < $1 != "prev" >) && exit

DIRECTION=$1
ALLOW_ROTATE=0 # поставьте 1, если у вас можно переключать воркспейсы по кругу,
# т.е. после последнего переключит на первый
WS_NUM=2 # сколько всего воркспейсов
WALLPAPERS_DIR=/path/to/wallpaper/dir
SWITCH_WALLPAPER=1 # по дефолту разрешаем установку обоев
CURR_WS_FILE=$HOME/.current-workspace # файлик, в котором будем хранить номер текущего
# воркспейса

# если при загрузке ос вы начинаете не на первом воркспейсе - поменяйте номер в echo
! < -e "$CURR_WS_FILE" > && echo "1" > "$CURR_WS_FILE"
CURR_WS=$(cat "$CURR_WS_FILE")
NEXT_WS=$(( CURR_WS + 1 ))
PREV_WS=$(( CURR_WS - 1 ))

if < $CURR_WS -eq $WS_NUM >; then
# если можно переключать по кругу, то с последнего воркспейса переключимся на первый
< $ALLOW_ROTATE -eq 1 > && NEXT_WS=1
# если нет - просто запрещаем смену обоев вперед с последнего воркспейса
< $ALLOW_ROTATE -eq 0 > && < $DIRECTION = "next" > && SWITCH_WALLPAPER=0
elif < $CURR_WS -eq 1 >; then
# если можно переключать по кругу, то с первого воркспейса переключимся на последний
< $ALLOW_ROTATE -eq 1 > && PREV_WS=$WS_NUM
# если нет - просто запрещаем смену обоев назад с первого воркспейса
< $ALLOW_ROTATE -eq 0 > && < $DIRECTION = "prev" > && SWITCH_WALLPAPER=0
fi


if < $SWITCH_WALLPAPER -eq 1 >; then
if < $DIRECTION = "next" >; then
WALLPAPER=$NEXT_WS
echo $NEXT_WS > "$CURR_WS_FILE"
else
WALLPAPER=$PREV_WS
echo $PREV_WS > "$CURR_WS_FILE"
fi

# для переключения обоев использую hsetroot
# если вам привычнее другая тулза - меняйте
< -L "$WALLPAPERS_DIR"/$WALLPAPER > && /usr/bin/hsetroot -tile "$WALLPAPERS_DIR"/$WALLPAPER
fi
# В $WALLPAPER у нас лежит номер текущего воркспейса.
# В папке с обоями сделаем симлинки типа
# 1 -> ./wallpaper-for-first-workspace.png



Делаем наши симлинки:
1
2
3
4
cd /path/to/wallpaper/dir
ln -s wallpaper-for-first-workspace.png 1
ln -s wallpaper-for-second-workspace.png 2
и так далее



Завершающий штрих, при загрузке системы нужно записать номер стартового воркспейса в $HOME/.current-workspace и установить правильные обои.
1
2
3
4
$ cat $HOME/.config/openbox/autostart.sh
# в автостарте, насколько я помню не работают $HOME и ~
echo "1" > /home/user/.current-workspace
hsetroot -tile "/path/to/wallpaper/dir"`cat /home/user/.current-workspace`



Вуаля, теперь у вас каждый воркспейс обладает собственными обоями. Get a beer.

P.S. Напомню, что переключать воркспейсы по дефолту можно не только комбинацией Ctrl+Alt+Arrow, но и скроллом мышки и еще какими-то. Эти комбинации не будут менять обои (и более того, поломают порядок расстановки обоев по воркспейсам), если вы не добавите к ним соответствующие экшны. Так же скрипт не учитывает, что воркспейсы можно переключать вверх/вниз

UPDATED:
Спасибо muhas'у за совет: man wmctrl решил все дело. По итогу скрипт действительно занимает 3 строчки :)
1
2
3
CURR_WS=$(( $(wmctrl -d | gawk '$2 ~ "*" {print $1}') + 1 ))
WALLPAPERS_DIR=/path/to/wallpaper/dir
hsetroot -tile "$WALLPAPERS_DIR/$CURR_WS"



Из rc.xml можно убрать аргументы "next" и "prev". Также выяснилась любопытная штука, а именно, action'ы заданные в rc.xml, Openbox выполняет не последовательно, а параллельно. В частности, у меня первым висит action "поставить обои", а вторым "перейти на другой десктоп" и все-равно wmctrl из скрипта возвращает мне current workspace'ом тот, на который я собираюсь переходить.


Тэги: OpenBox wallpapers обои
+ 11 -
Похожие Поделиться

muhas 07.10.2010 10:13 #
а я бы проверку на текущий рабочий стол повесил на wmctrl -d |cut -f 3 -d " " (кол-во строк=кол-во столов, каждая строка десктоп отсчет от нуля, звездочкой отмечен текущей воркспейс, можно и по другому как-нить вывод wmctrl обрабатывать) работало бы не только в опенбоксе, а в любом EWMH/NetWM совместимом wm причем независимо от способа переключения воркспесов.
после обхода всех воркспейсов убивал бы проверку...

а вообще я бы лучше прочел ещё раз man wmctrl и нашел бы возможность выполнять команду на нужном рабочем столе(wmctrl -r команда -t стол)... хотя тот же devilspie в этом поможет
elbahek 07.10.2010 10:29 #
Спасибо, посмотрю. Возможно, оно по итогу превратиться в три строчки :)
vkotovv 07.10.2010 12:42 #
3d -- 3 dice rolls (3 бросания кубика) ?
Математика кубиков
elbahek 08.10.2010 00:09 #
в точку :) (я имел в виду конкретно GURPS, а оказывается существует обобщенное название для такого формата записи кубов).
День открытий, что и не говори :)