Форум русскоязычного сообщества Ubuntu


Считаете, что Ubuntu недостаточно дружелюбна к новичкам?
Помогите создать новое Руководство для новичков!

Автор Тема: [РЕШЕНО]Прикладное применение бритвы Оккама (история с предысторией)  (Прочитано 4489 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн piyavking

  • Автор темы
  • Активист
  • *
  • Сообщений: 743
  • никогда так не было, чтобы никак не было
    • Просмотр профиля
    • Пиявкин
Присказка:

Когда я, пребывая на мейнстримовой Убунте, познакомился с расово правильным CrunchBang, то мне очень понравилась его концепция, тем более, что к тому моменту ужасные дефолтные убунтовские Unity, Nautilus, и Compiz уже были мной выпилены в пользу лёгких шустрых openbox и xcompmgr. Однако, более детальное ознакомление навеяло некоторую тоску древностью доступного софта (основанная на Debian ветка Statler появилась относительно недавно, и, к тому же, её настройка выглядела довольно трудозатратно), поэтому я продолжил по мере возможностей обрабатывать Ubuntu, с целью, не растеряв бонусов, всё-таки довести её тактико-технические характеристики до CrunchBang.

После сноса вышеупомянутой адовой троицы некоторое время продолжалась эксплуатация gnome-panel, но инерция была преодолена, и её место заняла кумир миллионов tint2. Для своей любимой плюшки - слайд-шоу рабочего стола, я изобретать велосипед не стал, и прикрутил feh-строку выбора случайной обоины, выполняемую при загрузке и в дальнейшем по cron, нужную мне информацию вывел на дисплей через conky, а вот вопрос ярлыков рабочего стола остался открытым. В качестве файлового менеджера мне гораздо удобнее использовать mc/gnome-commander, они в качестве менеджера рабочего стола не годятся, а ставить для этой скромной цели аж целый PcmanFM я посчитал плохой идеей.

Мне нужен был док, то есть некоторая область на экране с находящимися на ней ярлыками. Требования к ярлыкам я предъявил расширенные - захотел не только запускать команды по клику, но и иметь настраиваемые выпадающие менюшки. Конечно, можно было поставить idesk+myGTKmenu, или какой-нибудь, не к ночи будь помянут, Cairo-Dock, но, решив обойтись тем, что имею, я таки получил полностью удовлетворившее меня экономное и концептуальное решение.

Док с ярлыками был обеспечен запуском дополнительной копии tint2 с отдельной конфигурацией "только лаунчеры", доставивший мне на рабочий стол ряд ярлыков (если, паче чаяния, захочу несколько рядов – впишу в автозагрузку ещё конфигураций tint2, при её невесомости для тачки это будет совершенно неощутимо). Чтобы полученная конструкция представляла из себя полноценный док, осталось пристегнуть к лаунчерам менюшки.

Сказка:

Для реализации настраиваемых всплывающих менюшек мне, в первую очередь, нужно было получить возможность вызова меню openbox из командной строки. Недостаточно упорные в гуглении сабжа массы нагугливают себе на голову xdotool, убеждаются, что он не работает в русской раскладке, и бросают это дело, истинные же джедаи обретают xmacro, и, после назначения в ~/.config/openbox/rc.xml горячей клавиши (я назначил классическую - Ctrl+Esc):

    <!-- Keybinding for opening OpenBox menu -->
    <keybind key="C-Escape">
      <action name="ShowMenu">
        <menu>root-menu</menu>
      </action>
    </keybind>

вызов меню openbox становится прочно доступным при любой раскладке по команде

echo "KeyStrPress Control_L KeyStrPress Escape KeyStrRelease Escape KeyStrRelease Control_L"  | xmacroplay $DISPLAY
Теперь, вписав в desktop-файл лаунчера эту строку, я получил для него всплывающее меню по клику.

Но ведь мне же нужны разные меню для разных лаунчеров!
В решении этого вопроса на помощь пришла козырная фишка openbox под названием динамическое меню.

В каталоге ~/.config/openbox/ я налепил пачку файлов menu1.xml, menu2.xml, menu3.xml, и так далее, представляющих собой куски конфига главного меню openbox, только без "шапки" и "подвала", например:

<item icon="/usr/share/icons/hicolor/48x48/apps/deadbeef.png" label="DeadBeef">
<action name="Execute">
<command>deadbeef</command>
</action>
</item>
<item icon="/usr/share/icons/hicolor/48x48/apps/vlc.png" label="VLC">
<action name="Execute">
<command>vlc</command>
</action>
</item>
<item icon="/usr/share/icons/hicolor/48x48/apps/gthumb.png" label="gThumb">
<action name="Execute">
<command>gthumb</command>
</action>
</item>

Предположим, что у меня в однострочном файле /tmp/mem/$USER/obcount хранится некоторый номер (натуральное число), и я хочу вызвать менюшку, которую определяет ~/.config/openbox/menu"номер".xml. Я написал маленький скриптик ~/.config/openbox/menu.sh, который, в зависимости от номера, записанного в /tmp/mem/$USER/obcount, выводит соответствующее этому номеру динамическое меню (если /tmp/mem/$USER/obcount не существует, то скрипт выводит некое глобальное меню), после чего удаляет файл /tmp/mem/$USER/obcount (если он был):

#!/bin/bash

echo '<?xml version="1.0" encoding="utf-8"?>'
echo '<openbox_pipe_menu>'

if [ -a /tmp/mem/$USER/obcount ]
then

cat ~/.config/openbox/menu$(head -n1 /tmp/mem/$USER/obcount).xml
rm /tmp/mem/$USER/obcount

else

# План "Б". Эта часть скрипта, выполняемая в случае отсутствия файла /tmp/mem/$USER/obcount, предназначена для вывода глобального меню,
# всплывающего по right-клику на рабочем столе.
# Лично  я через цикл скомпоновал в главном меню все используемые менюшки+добавил несколько пунктов в корень,
# но, чтобы не усложнять, привожу здесь незамысловатый вариант вывода меню "в лоб" через файл  ~/.config/openbox/menu0.xml:

cat ~/.config/openbox/menu0.xml

fi

echo '</openbox_pipe_menu>'

Приведя ~/.config/openbox/menu.xml к виду

<?xml version="1.0" encoding="utf-8"?>
<openbox_menu>
    <menu id="root-menu" label="menu" execute="~/.config/openbox/menu.sh" />
</openbox_menu>

я получил возможность полностью определить содержание меню openbox выхлопом скрипта ~/.config/openbox/menu.sh, и, вписав в desktop-файл лаунчера строку

Exec=echo -n "номер_меню" >>/tmp/mem/$USER/obcount; echo "KeyStrPress Control_L KeyStrPress Escape KeyStrRelease Escape KeyStrRelease Control_L"  | xmacroplay $DISPLAY
я получил возможность назначить каждому лаунчеру своё всплывающее меню. При правом клике по рабочему столу /tmp/mem/$USER/obcount не создаётся, следовательно, выполняется "план Б", и всплывает глобальное меню.



Теперь поясню, почему номер меню здесь передаётся в ~/.config/openbox/menu.sh через файл /tmp/mem/$USER/obcount, хотя, на первый взгляд, логичнее было бы передать его через переменную. Это вызвано тем, что в процессе заковыристого вызова ~/.config/openbox/menu.sh через эмулятор xmacro и меню опенбокса наследование рвётся, и переменная до адресата не доходит.

Но теребить диск для этих целей - дурной тон, и, к тому же, способ ненадёжный. Выражаю горячую благодарность inkblack'у, предложившему использовать для этих целей tmpfs:

В /etc/fstab вписываем
tmpfs /tmp/mem tmpfs rw,size=1m 0 0(это обеспечит нам хранящийся в памяти виртуальный диск объёма 1М)

В автозагрузку - mkdir /tmp/mem/$USER & (создание для пользователя своего домашнего виртуального временного каталога)

Цель достигнута.

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

Прекрасно отдаю себе отчёт, что изврат с tint2 в качестве дока рабочего стола - моё личное предпочтение, но, как может заметить читатель, ничто не мешает, используя вышеописанную методу, привязывать настраиваемые openbox-менюшки к ярлыкам рабочего стола, используемым популярными связками openbox+PCmanFM и openbox+Thunar. Используя tint2 традиционным способом, можно реализовать несколько различных start-like кнопок на панельке. И так далее, и тому подобное.

Спасибо за внимание.
« Последнее редактирование: 22 Января 2014, 00:20:54 от yorik1984 »
крайний LTS Netboot, awesomeWM, urxvtd, firefox, vim/gvim, mpv/smplayer, linux-lowlatency, jack, guitarix, lmms, ardour, mednafen, dsda-doom

Оффлайн easy2002

  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 2786
  • Мурманск
    • Просмотр профиля
Вот так пилишь, пилишь, а потом придет семанки и сожрет тебе весь cpu. И память. ;)
Tempora mutantur et nos mutantur in illis

Оффлайн piyavking

  • Автор темы
  • Активист
  • *
  • Сообщений: 743
  • никогда так не было, чтобы никак не было
    • Просмотр профиля
    • Пиявкин
easy2002,
это да, мозилла любит ресурс жрать, но всё равно его не брошу потому, шо он хороший. Две тыщщи RSS потоков мониторить - это не чихнуть)
« Последнее редактирование: 07 Апреля 2013, 13:39:46 от regenerat »
крайний LTS Netboot, awesomeWM, urxvtd, firefox, vim/gvim, mpv/smplayer, linux-lowlatency, jack, guitarix, lmms, ardour, mednafen, dsda-doom

Оффлайн san-alex

  • Забанен
  • Старожил
  • *
  • Сообщений: 7726
  • Ex-CNC programmer
    • Просмотр профиля
regenerat, а, может, ты полноценную статью в Вики запилишь? А то тут, в недрах форума тема затеряется, а на Вики останется для истории, и еще кому-то пригодится.

Оффлайн piyavking

  • Автор темы
  • Активист
  • *
  • Сообщений: 743
  • никогда так не было, чтобы никак не было
    • Просмотр профиля
    • Пиявкин
san-alex,
Можно и запилить, почему бы и нет. Правда, я плохо представляю себе, как пилятся статьи в Вики))). Может, просто прикрепить эту тему наверху?

А ещё беспокоит меня костылик с использованием ~/obcount. Как бы ещё передать этот параметр, не выходя за пределы прав обычного юзера, с одной стороны, а с другой - не трогая винт? Может, помимо /dev/shm есть какая-то "user shared memory", навроде директории ~/, где пользователь может вертеть, чего хочет?
« Последнее редактирование: 08 Апреля 2013, 00:09:11 от regenerat »
крайний LTS Netboot, awesomeWM, urxvtd, firefox, vim/gvim, mpv/smplayer, linux-lowlatency, jack, guitarix, lmms, ardour, mednafen, dsda-doom

Оффлайн Пользователь

  • Модератор форума
  • Старожил
  • *
  • Сообщений: 2698
  • Runtu XFCE 18.04 (64-bit)
    • Просмотр профиля
Про создание статей в вики написал здесь
https://forum.ubuntu.ru/index.php?topic=207233.0

Оффлайн piyavking

  • Автор темы
  • Активист
  • *
  • Сообщений: 743
  • никогда так не было, чтобы никак не было
    • Просмотр профиля
    • Пиявкин
Пользователь,
спасибо!
крайний LTS Netboot, awesomeWM, urxvtd, firefox, vim/gvim, mpv/smplayer, linux-lowlatency, jack, guitarix, lmms, ardour, mednafen, dsda-doom

Оффлайн inkblack

  • Старожил
  • *
  • Сообщений: 1216
    • Просмотр профиля
... Может, помимо /dev/shm есть какая-то "user shared memory", навроде директории ~/, где пользователь может вертеть, чего хочет?
Вообще-то есть еще tmpfs. ИМХО, для ваших целей выглядит неуклюже,
зато диск не трогает.
Делюсь знаниями, но их у меня мало!

Оффлайн piyavking

  • Автор темы
  • Активист
  • *
  • Сообщений: 743
  • никогда так не было, чтобы никак не было
    • Просмотр профиля
    • Пиявкин
inkblack,
А "обычному пользователю" хватит прав, чтобы с ней оперировать?
крайний LTS Netboot, awesomeWM, urxvtd, firefox, vim/gvim, mpv/smplayer, linux-lowlatency, jack, guitarix, lmms, ardour, mednafen, dsda-doom

Оффлайн inkblack

  • Старожил
  • *
  • Сообщений: 1216
    • Просмотр профиля
А вот давайте попробуем.

У меня два пользователя:  me  — обычный пользователь и  sol  — админ.
Делаем так: открываем сеанс администратора и кое-что добавляем.

Код: (bash) [Выделить]
me@eee:~$ su sol
Пароль:
sol@eee:/home/me$ sudo mkdir -p /home/tmp
sol@eee:/home/me$ sudo chmod 777 /home/tmp/
sol@eee:/home/me$ echo "tmpfs /home/tmp/ tmpfs rw,size=1m 0 0" | sudo tee -a /etc/fstab
tmpfs /home/tmp/ tmpfs rw,size=1m 0 0
sol@eee:/home/me$ sudo reboot

Если кто-то будет это повторять, обратите внимание!
Я просто скопипастил команды и вывод из терминала. Смотрите как следует,
прежде чем повторять это. Изучите свой  fstab,  может быть именно в вашем
случае надо сделать по-другому. И  reboot  можно делать не сразу :)

После перезагрузки проверим:

Код: (bash) [Выделить]
me@eee:~$ mkdir -p /home/tmp/$USER
me@eee:~$ chmod 700 /home/tmp/$USER
me@eee:~$ su sol
Пароль:
sol@eee:/home/me$ mkdir -p /home/tmp/$USER
sol@eee:/home/me$ chmod 700 /home/tmp/$USER
sol@eee:/home/me$ ls -la /home/tmp/
итого 4
drwxrwxrwt 4 root root   80 июня  11 08:33 .
drwxr-xr-x 6 root root 4096 июня  11 08:12 ..
drwx------ 2 me   me     40 июня  11 08:31 me
drwx------ 2 sol  sol    40 июня  11 08:33 sol

Вместо  $USER  можно написать  `whoami`,  может быть, это будет правильнее.
У каждого пользователя теперь есть свой временный каталог. Маленький,
но для целей автора темы — в самый раз.

Код: (bash) [Выделить]
sol@eee:/home/me$ echo aga>/home/tmp/$USER/file.sol
sol@eee:/home/me$ cat /home/tmp/sol/file.sol
aga
sol@eee:/home/me$ exit
me@eee:~$ echo OGO>/home/tmp/$USER/file.me
me@eee:~$ cat /home/tmp/me/file.me
OGO
me@eee:~$ cat /home/tmp/sol/file.sol
cat: /home/tmp/sol/file.sol: Отказано в доступе

Да, в чужой каталог никто не залезет.
А у себя всё OK:

Код: (bash) [Выделить]
me@eee:~$ su sol
Пароль:
sol@eee:/home/me$ cat /home/tmp/sol/file.sol
aga

И мы видим, что вся эта радость действительно находится в  tmpfs:

Код: (bash) [Выделить]
me@eee:~$ df
Файл.система   1K-блоков Использовано Доступно Использовано% Cмонтировано в
/dev/sda1        5160576      3931340   967092           81% /
udev             1020420            4  1020416            1% /dev
tmpfs             411344          780   410564            1% /run
none                5120            0     5120            0% /run/lock
none             1028360          116  1028244            1% /run/shm
/dev/sda2       10231352       412068  9299556            5% /home
tmpfs               1024            8     1016            1% /home/tmp

Поэтому после следующего ребута в  /home/tmp/  будет пусто. И надо будет
заново создавать каталоги  /home/tmp/$USER.  Ну, это можно прописать
куда-нибудь в автозагрузку. Только придется следить, чтобы при логауте
и последующем логине (без перезагрузки) всё работало правильно. Потому
что при логауте этот каталог пользователя не удаляется (вроде бы, не должен).

Весь огород можно городить в общем-то не в  /home,  а просто в  /tmp.  Может быть,
это даже правильнее.
Делюсь знаниями, но их у меня мало!

Оффлайн piyavking

  • Автор темы
  • Активист
  • *
  • Сообщений: 743
  • никогда так не было, чтобы никак не было
    • Просмотр профиля
    • Пиявкин
inkblack,
М. Попробую. Спасибо!
крайний LTS Netboot, awesomeWM, urxvtd, firefox, vim/gvim, mpv/smplayer, linux-lowlatency, jack, guitarix, lmms, ardour, mednafen, dsda-doom

Оффлайн piyavking

  • Автор темы
  • Активист
  • *
  • Сообщений: 743
  • никогда так не было, чтобы никак не было
    • Просмотр профиля
    • Пиявкин
inkblack,
Вы были совершенно правы. Так красивше и надёжней (при записи переменной на диск отмечались периодические лаги конструкции, при использовании tmpfs всё проходит на ура). Большое спасибо (см. апдейт к посту)!
« Последнее редактирование: 12 Июля 2013, 12:23:17 от regenerat »
крайний LTS Netboot, awesomeWM, urxvtd, firefox, vim/gvim, mpv/smplayer, linux-lowlatency, jack, guitarix, lmms, ardour, mednafen, dsda-doom

 

Страница сгенерирована за 0.044 секунд. Запросов: 23.