Opened 8 years ago
Last modified 16 months ago
#476 assigned enhancement
workarounds for crippled desktop environments without a system tray (ie: gnome3)
Reported by: | Antoine Martin | Owned by: | Antoine Martin |
---|---|---|---|
Priority: | critical | Milestone: | future |
Component: | client | Version: | |
Keywords: | Cc: |
Description
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:
- add controls to the session info window to toggle those settings
- add a control window which would be shown when running in a crippled desktop environment (ie: gnome3) - problem is that I am not aware of a way of detecting when the system tray is available or when it isn't... another gnome3 fail, reminiscent of the ubuntu failures in the same area.
Attachments (5)
Change History (18)
comment:1 Changed 8 years ago by
Milestone: | future → 0.15 |
---|---|
Owner: | changed from Antoine Martin to Antoine Martin |
Status: | new → assigned |
Changed 8 years ago by
Attachment: | global-menu.patch added |
---|
cython file for linking with libdbusmenu
Changed 8 years ago by
Attachment: | dbusmenu.patch added |
---|
only a small portion of the headers... and far too many functions already
comment:3 Changed 7 years ago by
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.
Changed 7 years ago by
Attachment: | gtk-menus.patch added |
---|
stub for adding gtk menus as a window property we can export
comment:4 Changed 7 years ago by
Priority: | minor → critical |
---|
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:
- pure python dbus / x11 code to publish this menu client side (as GTK3 is still a long way off - see #640)
- code to forward the dbus actions to the server - we already have a dbus proxy feature... but this may warrant using a more abstracted protocol on top of that: we don't want to be dealing with bus names and object paths when we already have the window id (which we can use to retrieve all those things) - we should only pass the actions to the client side (not all the dbus cruft)
Hopefully, we can make the code generic enough to be re-used for #904.
Links:
- example code using introspection: How to list all object paths under a dbus service?
- dbus overview
- making asynchronous calls
- asynchronous service method example
- exposing dbus properties / How to handle properties of a dbus interface with python?
- dbus server properties decorator
- Python Examples for dbus.Bus / Python Examples for dbus.Struct
- receive all signals with add_signal_receiver
comment:5 Changed 7 years ago by
Mostly implemented in r10702.
Still TODO:
- when the application already has a menu, we need to merge our one into it somehow... tricky, and when the data isn't correct gnome-shell either crashes or doesn't do anything!
- when we use our own default menu (as with an xterm), we probably want a few more entries, or maybe a link to a dialog to change the settings normally accessible from the system tray
Changed 7 years ago by
Attachment: | expose-menubar-path.patch added |
---|
not sure what this is for - but it is referenced in some of the docs
Changed 7 years ago by
Attachment: | global-menu-multiwindow.patch added |
---|
trying to make multi window mode more reliable (and failing)
comment:6 Changed 7 years ago by
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!)
comment:7 Changed 7 years ago by
Milestone: | future → 0.17 |
---|
Note: this sort of works in 0.16, but only OSX clients will actually be able to show the forwarded menu.
comment:12 Changed 3 years ago by
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)
comment:13 Changed 3 years ago by
Milestone: | 3.0 → 4.0 |
---|
Out of time, more details on the Linux desktop tray icon pain in ticket:2161#comment:3.
comment:14 Changed 3 years ago by
Milestone: | 4.0 → future |
---|
Writing Gnome Shell Extensions
And as far as I can tell, extensions aren't enabled by default..
comment:15 Changed 3 years ago by
Similar request here: Detecting if TopIcons-Plus is active: dconf /org/gnome/shell/ .... 'TopIcons@…' ....
comment:16 Changed 16 months ago by
this ticket has been moved to: https://github.com/Xpra-org/xpra/issues/476
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?