Xpra-org / xpra

Persistent remote applications for X11; screen sharing for X11, MacOS and MSWindows.
https://xpra.org/
GNU General Public License v2.0
1.89k stars 163 forks source link

workarounds for crippled desktop environments without a system tray (ie: gnome3) #476

Open totaam opened 10 years ago

totaam commented 10 years ago

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:

totaam commented 10 years ago

Related to #508 and #472.

See also #657

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?

totaam commented 10 years ago

2014-09-06 16:49:02: antoine uploaded file global-menu.patch (1.1 KiB)

cython file for linking with libdbusmenu

totaam commented 9 years ago

2014-09-10 15:56:29: totaam uploaded file dbusmenu.patch (5.8 KiB)

only a small portion of the headers... and far too many functions already

totaam commented 8 years ago

2015-09-17 17:09:32: antoine commented


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.
totaam commented 8 years ago

2015-09-19 15:26:06: antoine uploaded file gtk-menus.patch (5.6 KiB)

stub for adding gtk menus as a window property we can export

totaam commented 8 years ago

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:

totaam commented 8 years ago

Mostly implemented in r10702.

Still TODO:

totaam commented 8 years ago

2015-10-03 10:04:49: antoine uploaded file expose-menubar-path.patch (1.6 KiB)

not sure what this is for - but it is referenced in some of the docs

totaam commented 8 years ago

2015-10-03 10:06:41: antoine uploaded file global-menu-multiwindow.patch (26.9 KiB)

trying to make multi window mode more reliable (and failing)

totaam commented 8 years ago

Found more undocumented features in parsing the source of mutter:

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!)

totaam commented 8 years ago

Note: this sort of works in 0.16, but only OSX clients will actually be able to show the forwarded menu.

totaam commented 5 years ago

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)

totaam commented 5 years ago

More details on the Linux desktop tray icon pain in #2161

totaam commented 4 years ago

Writing Gnome Shell Extensions

And as far as I can tell, extensions aren't enabled by default..

totaam commented 4 years ago

Similar request here: Detecting if TopIcons-Plus is active: dconf /org/gnome/shell/ .... 'TopIcons@phocean.net' ....