xpra icon
Bug tracker and wiki

Opened 4 years ago

Last modified 10 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: 3.0
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)

global-menu.patch (1.1 KB) - added by Antoine Martin 3 years ago.
cython file for linking with libdbusmenu
dbusmenu.patch (5.8 KB) - added by Antoine Martin 3 years ago.
only a small portion of the headers... and far too many functions already
gtk-menus.patch (5.6 KB) - added by Antoine Martin 2 years ago.
stub for adding gtk menus as a window property we can export
expose-menubar-path.patch (1.6 KB) - added by Antoine Martin 2 years ago.
not sure what this is for - but it is referenced in some of the docs
global-menu-multiwindow.patch (26.9 KB) - added by Antoine Martin 2 years ago.
trying to make multi window mode more reliable (and failing)

Download all attachments as: .zip

Change History (16)

comment:1 Changed 3 years ago by Antoine Martin

Milestone: future0.15
Owner: changed from Antoine Martin to Antoine Martin
Status: newassigned

Scheduling for this release, together with #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?

Last edited 2 years ago by Antoine Martin (previous) (diff)

Changed 3 years ago by Antoine Martin

Attachment: global-menu.patch added

cython file for linking with libdbusmenu

Changed 3 years ago by Antoine Martin

Attachment: dbusmenu.patch added

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

comment:2 Changed 3 years ago by Antoine Martin

Milestone: 0.15future

no time for this mess

comment:3 Changed 2 years ago by Antoine Martin

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 2 years ago by Antoine Martin

Attachment: gtk-menus.patch added

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

comment:4 Changed 2 years ago by Antoine Martin

Priority: minorcritical

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:

Last edited 2 years ago by Antoine Martin (previous) (diff)

comment:5 Changed 2 years ago by Antoine Martin

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 2 years ago by Antoine Martin

Attachment: expose-menubar-path.patch added

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

Changed 2 years ago by Antoine Martin

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

comment:6 Changed 2 years ago by Antoine Martin

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 2 years ago by Antoine Martin

Milestone: future0.17

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

comment:8 Changed 21 months ago by Antoine Martin

Milestone: 0.171.0

comment:9 Changed 17 months ago by Antoine Martin

Milestone: 1.01.1

Milestone renamed

comment:10 Changed 16 months ago by Antoine Martin

Milestone: 1.12.0

Milestone renamed

comment:11 Changed 10 months ago by Antoine Martin

Milestone: 2.03.0

re-scheduling

Note: See TracTickets for help on using tickets.