LINUX.ORG.RU

Динамическое меню в awesome

 , ,


3

4

Осваиваю awesome, по сравнению с openbox очень нравится. Но хотелось бы прояснить один момент: В openbox есть возможность реализации динамического меню, содержание которого является выхлопом скрипта, который формирует структуру меню в зависимости от каких-либо условий, в частности - от лаунчера, по которому кликнули.

Не подскажут ли знающие люди, есть ли принципиальная возможность чего-либо подобного в awesome, или всё-таки жёсткость его меню непобедима?

Спасибо за внимание.

★★★★★

Меню в awesome — это же всего лишь таблица в Lua. Их может быть несколько (по одному меню на каждый лаунчер, например). Либо же можно в функции, вызываемой по клику на лаунчер (или по любому другому требуемому действию), переинициализировать эту таблицу и показывать уже новое меню.

beresk_let ★★★★★
()

Посмотри в сторону freedesktop 1 2

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

То есть при формировании переменной mymainmenu в ~/.config/awesome/rc.lua я совершенно спокойно могу использовать проверку условий, используя синтавсис языка lua? Отлично, спасибо!

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

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

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

Ну, инициализировать-то mymainmenu сперва всё-таки надо (иначе сложновато его будет вешать на лаунчеры); но перерисовывать меню (читай, переписывать таблицу) при срабатывании условий никто не мешает, это верно.
Правда, там выше советуют xdg menu — возможно, оно подойдёт лучше?

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

Это уже детали)

Просто хочу портировать одну давно используемую опенбоксовую фишку, которую не хочу терять - http://forum.ubuntu.ru/index.php?topic=218198.0 .

А xdg меню, насколько я понимаю, это не есть полностью настраиваемое awesome-меню в зависимости от нажатой кнопки.

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

Тю! Так ведь если всего-то нужно каждому лаунчеру выдать своё меню — лучше просто сделать по отдельному меню (launchermenu1, launchermenu2, <…>, launchermenuN) и развесить их по одному на каждый лаунчер. Для пущего удобства можно написать отдельный модуль, генерирующий меню по заданным параметрам, и дёргать уже его.

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

Да я уж понял)

Я просто первый раз вижу awesome, да и lua постольку-поскольку, «скрипт для коньков скопипастить».

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

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

И всё не так просто, у меня там в паре-тройке пункты меню формируются не совсем просто, скажем, если есть процесс «conky», то пункт будет «Выключить Conky», а если нет такого процесса, то «Включить Conky», и по похожему принципу слеплена менюшка монтирования/отмонтирования сменных носителей.

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

А вот и нет(

myflashstatus = awful.util.pread("mount | grep \/dev\/sdc1")
if myflashstatus == "" then 
        myflashname = 'Mount Flash'
        myflashcommand = 'sudo mount -o noatime,nodiratime,rw /dev/sdc1 /flash'
else 
        myflashname = 'Umount Flash'
        myflashcommand = 'sudo umount /dev/sdc1'
end

mymount = awful.widget.launcher({ image = '/home/piyavking/.local/share/icons/mount.png',
                                     menu = awful.menu({ items = { myflashname, myflashcommand, '/home/piyavking/.local/share/icons/mount.png' },
}
})
})

Awesome читает состояние системы (в частности - состояние флешки) один раз - при запуске. Все изменения, происходящие в дальнейшем, его не трогают. Чтобы изменения подхватывались «на лету», как в опенбоксе, надо писать некий виджет, я так понимаю.

piyavking ★★★★★
() автор топика
Последнее исправление: piyavking (всего исправлений: 2)
Ответ на: комментарий от piyavking
function mymountfunction()
    if awful.util.pread("mount | grep \/dev\/sdc1") then 
        myflashname = 'Umount Flash'
        myflashcommand = 'sudo umount /dev/sdc1'
    else
        myflashname = 'Mount Flash'
        myflashcommand = 'sudo mount -o noatime,nodiratime,rw /dev/sdc1 /flash'
    end
end

mymountfunction()

mymountmenu = awful.menu({
    items = {
        { myflashname, myflashcommand, '/home/piyavking/.local/share/icons/mount.png' }
    }
})

mymount = awful.widget.launcher({
    image = '/home/piyavking/.local/share/icons/mount.png',
    command = function()
                  mymountfunction()
                  mymountmenu:update()
                  mymountmenu:show()
              end
})
beresk_let ★★★★★
()
Последнее исправление: beresk_let (всего исправлений: 3)
Ответ на: комментарий от beresk_let

При нажатии на меню:

Ops, an error happened!
/usr/share/awesome/lib/awful/util.lua:80: Invalid argument to spawn(),expect string or table

awesome 3.5, если что. Может, проблема в пресловутом обновлении синтаксиса?

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

Ну, тогда попробуй указать функцию без command, например.

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

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

а) и б) - это я уже понял, спасибо за наводку!

я в синтаксисе увяз, я это lua второй раз в жизни вижу (первый раз - часики в conky ковырял), да и awesome только позавчера начал.

command убирать пробовал - вывалилась гора ошибок, но разберусь с гуглём пополам. Наверно)

Ежели ты мне, как специалист, подгонишь годный код этого фрагмента, то дело пойдёт быстрее (будет от чего плясать), но и за общее направление, конечно, спасибо!

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

У меня сейчас просто под рукой awesome нет, поэтому прямо сию минуту, увы, помочь не могу. Как буду рядом со своей гентой, постараюсь подсобить =)

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

Ок, как будешь - подсоби, во как надо)

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

глянь, пожалста, а? так и не победил покамест(

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

Фуф. Еле-еле упорство и невежество всё-таки одержало локальную победу.

mymount = awful.widget.button({ image = '/home/piyavking/.local/share/icons/mount.png' })
mymount:buttons(awful.util.table.join(
			awful.button({ }, 1, function()

	myflashstatus = awful.util.pread("mount | grep \/dev\/sdc1")
	if myflashstatus == "" then 
	        myflashname = 'Mount Flash'
	        myflashcommand = 'sudo mount -o noatime,nodiratime,rw /dev/sdc1 /flash'
	else 
	        myflashname = 'Umount Flash'
	        myflashcommand = 'sudo umount /dev/sdc1'
	end

	mycdstatus = awful.util.pread("mount | grep \/dev\/sr0")
	if myflashstatus == "" then 
	        mycdname = 'Mount CD/DVD'
	        mycdcommand = 'sudo mount -o noatime,nodiratime,ro /dev/sr0 /cdrom'
	else 
	        mycdname = 'Umount CD/DVD'
	        mycdcommand = 'sudo umount /dev/sr0'
	end

	myntfsstatus = awful.util.pread("mount | grep \/dev\/sdb3")
	if myntfsstatus == "" then 
	        myntfsname = 'Mount NTFS'
	        myntfscommand = 'sudo mount -o noatime,nodiratime,rw /dev/sdb3 /ntfs'
	else 
	        myntfsname = 'Umount NTFS'
	        myntfscommand = 'sudo umount /dev/sdb3'
	end

	mygdiskstatus = awful.util.pread("mount | grep google-drive")
	if mygdiskstatus == "" then 
	        mygdiskname = 'Mount Google Drive'
	        mygdiskcommand = 'google-drive-ocamlfuse /home/piyavking/google-drive'
	else 
	        mygdiskname = 'Umount Google Drive'
	        mygdiskcommand = 'fusermount -u /home/piyavking/google-drive'
	end

	mymountmenu = awful.menu({ items = { 
	{ myflashname, myflashcommand, '/home/piyavking/.local/share/icons/mount.png' },
	{ mycdname, mycdcommand, '/home/piyavking/.local/share/icons/mount.png' },
	{ myntfsname, myntfscommand, '/home/piyavking/.local/share/icons/mount.png' },
	{ mygdiskname, mygdiskcommand, '/home/piyavking/.local/share/icons/mount.png' }
	}
	})

	mymountmenu:show()
	end )
))

Ну хорошо. С видом-командами вопрос худо-бедно решён. Теперь будем долбить динамическое изменение количества пунктов.

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