Open totaam opened 10 years ago
Related to #508 and #472.
See also #657
g_dbus_connection_export_menu_model
is 404..Looking at the API: gtk-application-set-app-menu, it looks like we need to port to GTK3 first (#90). Sigh. https://mail.gnome.org/archives/commits-list/2012-January/msg08239.html
Example code? mini-dbusmenu
Or maybe we can just write ctypes / cython code for it?
global-menu.patch
(1.1 KiB)cython file for linking with libdbusmenu
dbusmenu.patch
(5.8 KiB)only a small portion of the headers... and far too many functions already
This is what I see for an terminal under Fedora:
$ xprop | grep _GTK_ _GTK_APP_MENU_OBJECT_PATH(UTF8_STRING) = "/org/gnome/Terminal/menus/appmenu" _GTK_WINDOW_OBJECT_PATH(UTF8_STRING) = "/org/gnome/Terminal/window/1" _GTK_APPLICATION_OBJECT_PATH(UTF8_STRING) = "/org/gnome/Terminal" _GTK_UNIQUE_BUS_NAME(UTF8_STRING) = ":1.51" _GTK_APPLICATION_ID(UTF8_STRING) = "org.gnome.Terminal"
$ qdbus org.gnome.Terminal /org/gnome/Terminal method QDBusVariant org.freedesktop.DBus.Properties.Get(QString interface_name, QString property_name) method QVariantMap org.freedesktop.DBus.Properties.GetAll(QString interface_name) signal void org.freedesktop.DBus.Properties.PropertiesChanged(QString interface_name, QVariantMap changed_properties, QStringList invalidated_properties) method void org.freedesktop.DBus.Properties.Set(QString interface_name, QString property_name, QDBusVariant value) method QString org.freedesktop.DBus.Introspectable.Introspect() method QString org.freedesktop.DBus.Peer.GetMachineId() method void org.freedesktop.DBus.Peer.Ping() method QDBusRawType::a{oa{sa{sv``` org.freedesktop.DBus.ObjectManager.GetManagedObjects() signal void org.freedesktop.DBus.ObjectManager.InterfacesAdded(QDBusObjectPath object_path, QDBusRawType::a{sa{sv}} interfaces_and_properties) signal void org.freedesktop.DBus.ObjectManager.InterfacesRemoved(QDBusObjectPath object_path, QStringList interfaces) method void org.gtk.Actions.Activate(QString action_name, QVariantList parameter, QVariantMap platform_data) signal void org.gtk.Actions.Changed(QStringList removals, QDBusRawType::a{sb} enable_changes, QVariantMap state_changes, QDBusRawType::a{s(bgav additions) method QDBusRawType::(bgav) org.gtk.Actions.Describe(QString action_name) method QDBusRawType::a{s(bgav)} org.gtk.Actions.DescribeAll() method QStringList org.gtk.Actions.List() method void org.gtk.Actions.SetState(QString action_name, QDBusVariant value, QVariantMap platform_data) method void org.freedesktop.Application.Activate(QVariantMap platform-data) method void org.freedesktop.Application.ActivateAction(QString action-name, QVariantList parameter, QVariantMap platform-data) method void org.freedesktop.Application.Open(QStringList uris, QVariantMap platform-data) property read bool org.gtk.Application.Busy method void org.gtk.Application.Activate(QVariantMap platform-data) method int org.gtk.Application.CommandLine(QDBusObjectPath path, QDBusRawType::aay arguments, QVariantMap platform-data) method void org.gtk.Application.Open(QStringList uris, QString hint, QVariantMap platform-data) }}} Not sure if we want to call dbus from an X11 event callback... this could be asking for trouble.
gtk-menus.patch
(5.6 KiB)stub for adding gtk menus as a window property we can export
If we want to integrate some form of OS global menu, be it Gnome's, Ubuntu's (#472), OSX'x or even just the MS Windows taskbar (#508), we need to define an API - this one seems to be the broadest and most generic one to use as a base.
The example code added in r10666 (improved in r10672) is enough to query a gtk application's global menu.
What needs to be done:
Hopefully, we can make the code generic enough to be re-used for #904.
Links:
Mostly implemented in r10702.
Still TODO:
expose-menubar-path.patch
(1.6 KiB)not sure what this is for - but it is referenced in some of the docs
global-menu-multiwindow.patch
(26.9 KiB)trying to make multi window mode more reliable (and failing)
Found more undocumented features in parsing the source of mutter:
_GTK_MENUBAR_OBJECT_PATH
see patch above to expose it_GTK_HIDE_TITLEBAR_WHEN_MAXIMIZED
- which we may also want to sync?_GTK_FRAME_EXTENTS
- how does that differ from regular frame extents??Might be related: gtk2's setup_toplevel_window
uses a single leader window for all its windows (see ICCCM Session Management), and maybe we want a different leader for each application? (this is different from the ICCCM Group Leader stuff!)
Note: this sort of works in 0.16, but only OSX clients will actually be able to show the forwarded menu.
Maybe we can write an extension, at least for xpra's own tray. Example of a simple extension: https://github.com/JasonLG1979/gnome-shell-extensions-morphine (Javascript - shudder)
More details on the Linux desktop tray icon pain in #2161
Writing Gnome Shell Extensions
And as far as I can tell, extensions aren't enabled by default..
Similar request here: Detecting if TopIcons-Plus is active: dconf /org/gnome/shell/ .... 'TopIcons@phocean.net' ....
On those desktop environments, we have no way of interacting with the xpra client controls...
r4969 allows us to show the "session-info" window using "Meta+Shift+F11", which helps a little, but we have no way of toggling any of the settings usually found in the system tray.
We could: