You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
241 lines
9.9 KiB
241 lines
9.9 KiB
9 years ago
|
From d002f74d3e83d9a074c4a141a204d0e779dfdb4a Mon Sep 17 00:00:00 2001
|
||
|
From: =?UTF-8?q?Caol=C3=A1n=20McNamara?= <caolanm@redhat.com>
|
||
|
Date: Thu, 18 Feb 2016 21:00:57 +0000
|
||
|
Subject: [PATCH] gtk3: get app menu working again under gtk3
|
||
|
MIME-Version: 1.0
|
||
|
Content-Type: text/plain; charset=UTF-8
|
||
|
Content-Transfer-Encoding: 8bit
|
||
|
|
||
|
and get it working under wayland too
|
||
|
|
||
|
Reviewed-on: https://gerrit.libreoffice.org/22491
|
||
|
Tested-by: Jenkins <ci@libreoffice.org>
|
||
|
Tested-by: Caolán McNamara <caolanm@redhat.com>
|
||
|
Reviewed-by: Caolán McNamara <caolanm@redhat.com>
|
||
|
(cherry picked from commit 59d978389721c780b1df5e54b833fe75576dd034)
|
||
|
|
||
|
Change-Id: I57592acc4b7ea4a55296541ab4b3bf0c8fd98c5b
|
||
|
|
||
|
loplugin: checkconfigmacros
|
||
|
|
||
|
I suppose
|
||
|
|
||
|
Change-Id: I2821665548077162c4a434876aee407127b312a4
|
||
|
(cherry picked from commit 2f3d85182ff9f2f1174a47b6139f358d232ee5e3)
|
||
|
---
|
||
|
vcl/inc/unx/gtk/gtkframe.hxx | 4 ++-
|
||
|
vcl/inc/unx/gtk/gtksalmenu.hxx | 6 +++--
|
||
|
vcl/unx/gtk/gtksalframe.cxx | 10 +++++---
|
||
|
vcl/unx/gtk3/gtk3gtkframe.cxx | 57 ++++++++++++++++++++++++------------------
|
||
|
4 files changed, 46 insertions(+), 31 deletions(-)
|
||
|
|
||
|
diff --git a/vcl/inc/unx/gtk/gtkframe.hxx b/vcl/inc/unx/gtk/gtkframe.hxx
|
||
|
index 20a1e84..1d8334c 100644
|
||
|
--- a/vcl/inc/unx/gtk/gtkframe.hxx
|
||
|
+++ b/vcl/inc/unx/gtk/gtkframe.hxx
|
||
|
@@ -49,6 +49,8 @@
|
||
|
#include <list>
|
||
|
#include <vector>
|
||
|
|
||
|
+#include <config_vclplug.h>
|
||
|
+
|
||
|
class GtkSalGraphics;
|
||
|
class GtkSalDisplay;
|
||
|
|
||
|
@@ -222,7 +224,7 @@ class GtkSalFrame : public SalFrame
|
||
|
|
||
|
SalMenu* m_pSalMenu;
|
||
|
|
||
|
-#if defined(ENABLE_DBUS) && defined(ENABLE_GIO)
|
||
|
+#if defined(ENABLE_DBUS) && ENABLE_GIO
|
||
|
public:
|
||
|
void EnsureDbusMenuSynced();
|
||
|
private:
|
||
|
diff --git a/vcl/inc/unx/gtk/gtksalmenu.hxx b/vcl/inc/unx/gtk/gtksalmenu.hxx
|
||
|
index 998a925..5d9c262 100644
|
||
|
--- a/vcl/inc/unx/gtk/gtksalmenu.hxx
|
||
|
+++ b/vcl/inc/unx/gtk/gtksalmenu.hxx
|
||
|
@@ -10,15 +10,17 @@
|
||
|
#ifndef INCLUDED_VCL_INC_UNX_GTK_GTKSALMENU_HXX
|
||
|
#define INCLUDED_VCL_INC_UNX_GTK_GTKSALMENU_HXX
|
||
|
|
||
|
+#include <config_vclplug.h>
|
||
|
+
|
||
|
#include <vector>
|
||
|
-#ifdef ENABLE_GIO
|
||
|
+#if ENABLE_GIO
|
||
|
#include <gio/gio.h>
|
||
|
#endif
|
||
|
|
||
|
#include <unx/salmenu.h>
|
||
|
#include <unx/gtk/gtkframe.hxx>
|
||
|
|
||
|
-#if defined(ENABLE_DBUS) && defined(ENABLE_GIO) && \
|
||
|
+#if defined(ENABLE_DBUS) && ENABLE_GIO && \
|
||
|
(GLIB_MAJOR_VERSION > 2 || GLIB_MINOR_VERSION >= 36)
|
||
|
# define ENABLE_GMENU_INTEGRATION
|
||
|
# include <unx/gtk/glomenu.h>
|
||
|
diff --git a/vcl/unx/gtk/gtksalframe.cxx b/vcl/unx/gtk/gtksalframe.cxx
|
||
|
index 7a7c293..95fd581 100644
|
||
|
--- a/vcl/unx/gtk/gtksalframe.cxx
|
||
|
+++ b/vcl/unx/gtk/gtksalframe.cxx
|
||
|
@@ -38,8 +38,10 @@
|
||
|
#include <vcl/window.hxx>
|
||
|
#include <vcl/settings.hxx>
|
||
|
|
||
|
+#include <config_vclplug.h>
|
||
|
+
|
||
|
#include <unx/x11/xlimits.hxx>
|
||
|
-#if defined(ENABLE_DBUS) && defined(ENABLE_GIO)
|
||
|
+#if defined(ENABLE_DBUS) && ENABLE_GIO
|
||
|
# include <unx/gtk/gtksalmenu.hxx>
|
||
|
#endif
|
||
|
#if defined ENABLE_GMENU_INTEGRATION // defined in gtksalmenu.hxx above
|
||
|
@@ -432,7 +434,7 @@ GtkSalFrame::GtkSalFrame( SalFrame* pParent, SalFrameStyleFlags nStyle )
|
||
|
m_bDefaultPos = true;
|
||
|
m_bDefaultSize = ( (nStyle & SalFrameStyleFlags::SIZEABLE) && ! pParent );
|
||
|
m_bWindowIsGtkPlug = false;
|
||
|
-#if defined(ENABLE_DBUS) && defined(ENABLE_GIO)
|
||
|
+#if defined(ENABLE_DBUS) && ENABLE_GIO
|
||
|
m_pLastSyncedDbusMenu = nullptr;
|
||
|
#endif
|
||
|
Init( pParent, nStyle );
|
||
|
@@ -446,7 +448,7 @@ GtkSalFrame::GtkSalFrame( SystemParentData* pSysData )
|
||
|
GetGenericData()->ErrorTrapPush();
|
||
|
m_bDefaultPos = true;
|
||
|
m_bDefaultSize = true;
|
||
|
-#if defined(ENABLE_DBUS) && defined(ENABLE_GIO)
|
||
|
+#if defined(ENABLE_DBUS) && ENABLE_GIO
|
||
|
m_pLastSyncedDbusMenu = nullptr;
|
||
|
#endif
|
||
|
Init( pSysData );
|
||
|
@@ -486,7 +488,7 @@ static void ObjectDestroyedNotify( gpointer data )
|
||
|
}
|
||
|
}
|
||
|
|
||
|
-#if defined(ENABLE_DBUS) && defined(ENABLE_GIO)
|
||
|
+#if defined(ENABLE_DBUS) && ENABLE_GIO
|
||
|
void GtkSalFrame::EnsureDbusMenuSynced()
|
||
|
{
|
||
|
GtkSalMenu* pSalMenu = static_cast<GtkSalMenu*>(GetMenu());
|
||
|
diff --git a/vcl/unx/gtk3/gtk3gtkframe.cxx b/vcl/unx/gtk3/gtk3gtkframe.cxx
|
||
|
index f3bdfb2..f018576 100644
|
||
|
--- a/vcl/unx/gtk3/gtk3gtkframe.cxx
|
||
|
+++ b/vcl/unx/gtk3/gtk3gtkframe.cxx
|
||
|
@@ -38,7 +38,9 @@
|
||
|
#include <vcl/window.hxx>
|
||
|
#include <vcl/settings.hxx>
|
||
|
|
||
|
-#if defined(ENABLE_DBUS) && defined(ENABLE_GIO)
|
||
|
+#include <config_vclplug.h>
|
||
|
+
|
||
|
+#if defined(ENABLE_DBUS) && ENABLE_GIO
|
||
|
# include <unx/gtk/gtksalmenu.hxx>
|
||
|
#endif
|
||
|
#if defined ENABLE_GMENU_INTEGRATION // defined in gtksalmenu.hxx above
|
||
|
@@ -479,7 +481,7 @@ GtkSalFrame::GtkSalFrame( SalFrame* pParent, SalFrameStyleFlags nStyle )
|
||
|
m_bDefaultPos = true;
|
||
|
m_bDefaultSize = ( (nStyle & SalFrameStyleFlags::SIZEABLE) && ! pParent );
|
||
|
m_bWindowIsGtkPlug = false;
|
||
|
-#if defined(ENABLE_DBUS) && defined(ENABLE_GIO)
|
||
|
+#if defined(ENABLE_DBUS) && ENABLE_GIO
|
||
|
m_pLastSyncedDbusMenu = nullptr;
|
||
|
#endif
|
||
|
Init( pParent, nStyle );
|
||
|
@@ -495,7 +497,7 @@ GtkSalFrame::GtkSalFrame( SystemParentData* pSysData )
|
||
|
GetGenericData()->ErrorTrapPush();
|
||
|
m_bDefaultPos = true;
|
||
|
m_bDefaultSize = true;
|
||
|
-#if defined(ENABLE_DBUS) && defined(ENABLE_GIO)
|
||
|
+#if defined(ENABLE_DBUS) && ENABLE_GIO
|
||
|
m_pLastSyncedDbusMenu = nullptr;
|
||
|
#endif
|
||
|
Init( pSysData );
|
||
|
@@ -503,13 +505,6 @@ GtkSalFrame::GtkSalFrame( SystemParentData* pSysData )
|
||
|
|
||
|
#ifdef ENABLE_GMENU_INTEGRATION
|
||
|
|
||
|
-static void
|
||
|
-gdk_x11_window_set_utf8_property (GdkWindow * /*window*/,
|
||
|
- const gchar * /*name*/,
|
||
|
- const gchar * /*value*/)
|
||
|
-{
|
||
|
-}
|
||
|
-
|
||
|
// AppMenu watch functions.
|
||
|
|
||
|
static void ObjectDestroyedNotify( gpointer data )
|
||
|
@@ -519,7 +514,7 @@ static void ObjectDestroyedNotify( gpointer data )
|
||
|
}
|
||
|
}
|
||
|
|
||
|
-#if defined(ENABLE_DBUS) && defined(ENABLE_GIO)
|
||
|
+#if defined(ENABLE_DBUS) && ENABLE_GIO
|
||
|
void GtkSalFrame::EnsureDbusMenuSynced()
|
||
|
{
|
||
|
GtkSalMenu* pSalMenu = static_cast<GtkSalMenu*>(GetMenu());
|
||
|
@@ -628,7 +623,7 @@ gboolean ensure_dbus_setup( gpointer data )
|
||
|
GActionGroup* pActionGroup = reinterpret_cast<GActionGroup*>(g_lo_action_group_new( static_cast< gpointer >( pSalFrame ) ));
|
||
|
|
||
|
// Generate menu paths.
|
||
|
- ::Window windowId = GDK_WINDOW_XID( gdkWindow );
|
||
|
+ sal_uIntPtr windowId = pSalFrame->GetNativeWindowHandle(pSalFrame->getWindow());
|
||
|
gchar* aDBusWindowPath = g_strdup_printf( "/org/libreoffice/window/%lu", windowId );
|
||
|
gchar* aDBusMenubarPath = g_strdup_printf( "/org/libreoffice/window/%lu/menus/menubar", windowId );
|
||
|
|
||
|
@@ -636,12 +631,32 @@ gboolean ensure_dbus_setup( gpointer data )
|
||
|
g_object_set_data_full( G_OBJECT( gdkWindow ), "g-lo-menubar", pMenuModel, ObjectDestroyedNotify );
|
||
|
g_object_set_data_full( G_OBJECT( gdkWindow ), "g-lo-action-group", pActionGroup, ObjectDestroyedNotify );
|
||
|
|
||
|
- gdk_x11_window_set_utf8_property( gdkWindow, "_GTK_APPLICATION_ID", "org.libreoffice" );
|
||
|
- gdk_x11_window_set_utf8_property( gdkWindow, "_GTK_UNIQUE_BUS_NAME", g_dbus_connection_get_unique_name( pSessionBus ) );
|
||
|
- gdk_x11_window_set_utf8_property( gdkWindow, "_GTK_APPLICATION_OBJECT_PATH", "/org/libreoffice" );
|
||
|
- gdk_x11_window_set_utf8_property( gdkWindow, "_GTK_WINDOW_OBJECT_PATH", aDBusWindowPath );
|
||
|
- gdk_x11_window_set_utf8_property( gdkWindow, "_GTK_MENUBAR_OBJECT_PATH", aDBusMenubarPath );
|
||
|
-
|
||
|
+ GdkDisplay *pDisplay = pSalFrame->getGdkDisplay();
|
||
|
+ // fdo#70885 we don't want app menu under Unity
|
||
|
+ const bool bDesktopIsUnity = (SalGetDesktopEnvironment() == "UNITY");
|
||
|
+#if defined(GDK_WINDOWING_X11)
|
||
|
+ if (GDK_IS_X11_DISPLAY(pDisplay))
|
||
|
+ {
|
||
|
+ gdk_x11_window_set_utf8_property( gdkWindow, "_GTK_APPLICATION_ID", "org.libreoffice" );
|
||
|
+ if (!bDesktopIsUnity)
|
||
|
+ gdk_x11_window_set_utf8_property( gdkWindow, "_GTK_APP_MENU_OBJECT_PATH", "/org/libreoffice/menus/appmenu" );
|
||
|
+ gdk_x11_window_set_utf8_property( gdkWindow, "_GTK_MENUBAR_OBJECT_PATH", aDBusMenubarPath );
|
||
|
+ gdk_x11_window_set_utf8_property( gdkWindow, "_GTK_WINDOW_OBJECT_PATH", aDBusWindowPath );
|
||
|
+ gdk_x11_window_set_utf8_property( gdkWindow, "_GTK_APPLICATION_OBJECT_PATH", "/org/libreoffice" );
|
||
|
+ gdk_x11_window_set_utf8_property( gdkWindow, "_GTK_UNIQUE_BUS_NAME", g_dbus_connection_get_unique_name( pSessionBus ) );
|
||
|
+ }
|
||
|
+#endif
|
||
|
+#if defined(GDK_WINDOWING_WAYLAND)
|
||
|
+ if (GDK_IS_WAYLAND_DISPLAY(pDisplay))
|
||
|
+ {
|
||
|
+ gdk_wayland_window_set_dbus_properties_libgtk_only(gdkWindow, "org.libreoffice",
|
||
|
+ "/org/libreoffice/menus/appmenu",
|
||
|
+ !bDesktopIsUnity ? aDBusMenubarPath : nullptr,
|
||
|
+ aDBusWindowPath,
|
||
|
+ "/org/libreoffice",
|
||
|
+ g_dbus_connection_get_unique_name( pSessionBus ));
|
||
|
+ }
|
||
|
+#endif
|
||
|
// Publish the menu model and the action group.
|
||
|
SAL_INFO("vcl.unity", "exporting menu model at " << pMenuModel << " for window " << windowId);
|
||
|
pSalFrame->m_nMenuExportId = g_dbus_connection_export_menu_model (pSessionBus, aDBusMenubarPath, pMenuModel, nullptr);
|
||
|
@@ -649,12 +664,6 @@ gboolean ensure_dbus_setup( gpointer data )
|
||
|
pSalFrame->m_nActionGroupExportId = g_dbus_connection_export_action_group( pSessionBus, aDBusWindowPath, pActionGroup, nullptr);
|
||
|
pSalFrame->m_nHudAwarenessId = hud_awareness_register( pSessionBus, aDBusMenubarPath, hud_activated, pSalFrame, nullptr, nullptr );
|
||
|
|
||
|
- // fdo#70885 we don't want app menu under Unity
|
||
|
- bool bDesktopIsUnity = (SalGetDesktopEnvironment() == "UNITY");
|
||
|
-
|
||
|
- if (!bDesktopIsUnity)
|
||
|
- gdk_x11_window_set_utf8_property( gdkWindow, "_GTK_APP_MENU_OBJECT_PATH", "/org/libreoffice/menus/appmenu" );
|
||
|
-
|
||
|
//app menu, to-do translations, block normal menus when active, honor use appmenu settings
|
||
|
ResMgr* pMgr = ImplGetResMgr();
|
||
|
if( pMgr && !bDesktopIsUnity )
|
||
|
--
|
||
|
2.7.1
|
||
|
|