Как сделать подменю в динамическом quicklist (dbusMenuItems) в Python?
Официальная документация очень недостаточна: https://wiki.ubuntu.com/Unity/LauncherAPI
Вот мой минимальный пример кодирования: dbus_snippet.py
#!/usr/bin/env python
from gi.repository import Unity, Gio, GObject, Dbusmenu
import os
import subprocess
launchers = []
qlList = []
#(not all references are links due to askubuntu's reputation-system)
#askubuntu "how-to-add-checkbox-or-radio-buttons-to-a-unity-quicklist"
#https://lazka.github.io/pgi-docs/Dbusmenu-0.4/classes/Menuitem.html#Dbusmenu.Menuitem
#(project that this research may go into)
#(github thirschbuechler/ubuntu-recentquicklists)
def check_item_activated_callback (menuitem, a, b):#for the submenu
if menuitem.property_get_int (Dbusmenu.MENUITEM_PROP_TOGGLE_STATE) == Dbusmenu.MENUITEM_TOGGLE_STATE_CHECKED:
menuitem.property_set_int (Dbusmenu.MENUITEM_PROP_TOGGLE_STATE, Dbusmenu.MENUITEM_TOGGLE_STATE_UNCHECKED)
else:
menuitem.property_set_int (Dbusmenu.MENUITEM_PROP_TOGGLE_STATE, Dbusmenu.MENUITEM_TOGGLE_STATE_CHECKED)
def check_item_activated(menuitem, a, arg):#main menu item
process = subprocess.Popen("gedit ",shell=True)
def createItem(name, arg, qlnummer):
item = Dbusmenu.Menuitem.new()
item.property_set (Dbusmenu.MENUITEM_PROP_LABEL, name)
item.property_set_bool (Dbusmenu.MENUITEM_PROP_VISIBLE, True)
item.connect("item-activated", check_item_activated,arg)
check1 = Dbusmenu.Menuitem.new ()
check1.property_set (Dbusmenu.MENUITEM_PROP_LABEL, "Checkbox")
check1.property_set (Dbusmenu.MENUITEM_PROP_TOGGLE_TYPE, Dbusmenu.MENUITEM_TOGGLE_CHECK)
check1.property_set_int (Dbusmenu.MENUITEM_PROP_TOGGLE_STATE, Dbusmenu.MENUITEM_TOGGLE_STATE_CHECKED)
check1.property_set_bool (Dbusmenu.MENUITEM_PROP_VISIBLE, True)
check1.property_set (Dbusmenu.MENUITEM_PROP_CHILD_DISPLAY, Dbusmenu.MENUITEM_CHILD_DISPLAY_SUBMENU)
#check1.property_set (Dbusmenu.MENUITEM_PROP_CHILD_DISPLAY, 'children-display')
#https://lazka.github.io/pgi-docs/Dbusmenu-0.4/constants.html#Dbusmenu.MENUITEM_CHILD_DISPLAY_SUBMENU
check1.connect (Dbusmenu.MENUITEM_SIGNAL_ITEM_ACTIVATED, check_item_activated_callback, None)
item.child_append(check1)
qlList[qlnummer].child_append(item)
def update(a=None):
#delete old ones
for i in range(len(qlList)):
for c in qlList[i].get_children():
qlList[i].child_delete(c)
def main():
launchers.append(Unity.LauncherEntry.get_for_desktop_id ("nautilus.desktop"))
launchers.append(Unity.LauncherEntry.get_for_desktop_id ("nemo.desktop"))
for i in range(len(launchers)):
qli = Dbusmenu.Menuitem.new()
qlList.append(qli)
update()
for i in range(len(launchers)):
createItem("item1","arg1",i)
launchers[i].set_property("quicklist", qlList[i])
loop = GObject.MainLoop()
loop.run()
main()
Что делает я подразумеваю под подменю (сделанный в калеке):
Почему я думаю, что это даже возможно? Опцию называют Dbusmenu.MENUITEM_PROP_CHILD_DISPLAY
, чтениям "отобразили подэлементы, поскольку подменю" звучит ужасно близко к тому, что я хочу сделать, но мне не удалось заархивировать это. Вышеупомянутый отрывок добавляет dbus-объект к другому и устанавливает свойство подменю (на средстве запуска Немо/Наутилуса)
(Премия: Я не нашел, что что-либо делает check_item_activated
различайте щелкают правой кнопкой, щелкают левой кнопкой и средняя кнопка мыши, но доказывают меня неправильно),
Я не знаю, как это сделать с помощью dbus, но ...
Вы можете просто сделать это, отредактировав файлы .desktop, изменения будут автоматически приняты. Должно быть достаточно просто написать класс для записи или редактирования файлов .desktop в ~ / .local / share / Applications /
Для запуска требуется строка действия, в которой определены имена быстрого списка для каждого из имен. вам нужен блок [Desktop Action name], который содержит строки Name и Exec. Это задокументировано в вашей ссылке.
Вы можете пройти только один уровень, насколько мне известно, и мне не удалось добавить ничего, кроме пусковых установок, в быстрый список.
Преимущество этого состоит в том, что меню доступны после выхода из вашей программы и после перезагрузки.
Вот пример, который перечисляет различные хосты в качестве элементов подменю из значка терминала gnome.
[Desktop Entry]
Name=Terminal
Comment=Use the command line
Keywords=shell;prompt;command;commandline;
TryExec=gnome-terminal
Exec=gnome-terminal
Icon=utilities-terminal
Type=Application
X-GNOME-DocPath=gnome-terminal/index.html
X-GNOME-Bugzilla-Version=3.16.2
Categories=GNOME;GTK;System;TerminalEmulator;
StartupNotify=true
X-GNOME-SingleWindow=false
OnlyShowIn=GNOME;Unity;
Actions=New;host1;host2
X-Ubuntu-Gettext-Domain=gnome-terminal
[Desktop Action New]
Name=New Terminal
Exec=gnome-terminal
OnlyShowIn=Unity
[Desktop Action host1]
Name=SSH to HOST1
Exec=gnome-terminal -e 'ssh host1' -t 'SSH to host1'
OnlyShowIn=Unity
[Desktop Action host2]
Name=SSH to HOST2
Exec=gnome-terminal -e 'ssh host2' -t 'SSH to host2'
OnlyShowIn=Unity