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:
Scheduling for this release, together with #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?
cython file for linking with libdbusmenu
only a small portion of the headers... and far too many functions already
no time for this mess
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.
stub for adding gtk menus as a window property we can export
Raising: 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:
not sure what this is for - but it is referenced in some of the docs
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 Group Leader stuff!)
Note: this sort of works in 0.16, but only OSX clients will actually be able to show the forwarded menu.
re-scheduling
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)
Out of time, more details on the Linux desktop tray icon pain in ticket:2161#comment:3.
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@…' ....
this ticket has been moved to: https://github.com/Xpra-org/xpra/issues/476