diff --git a/0001-gtk3-get-app-menu-working-again-under-gtk3.patch b/0001-gtk3-get-app-menu-working-again-under-gtk3.patch new file mode 100644 index 0000000..d6c9132 --- /dev/null +++ b/0001-gtk3-get-app-menu-working-again-under-gtk3.patch @@ -0,0 +1,240 @@ +From d002f74d3e83d9a074c4a141a204d0e779dfdb4a Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Caol=C3=A1n=20McNamara?= +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 +Tested-by: Caolán McNamara +Reviewed-by: Caolán McNamara +(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 + #include + ++#include ++ + 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 ++ + #include +-#ifdef ENABLE_GIO ++#if ENABLE_GIO + #include + #endif + + #include + #include + +-#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 +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 + #include + ++#include ++ + #include +-#if defined(ENABLE_DBUS) && defined(ENABLE_GIO) ++#if defined(ENABLE_DBUS) && ENABLE_GIO + # include + #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(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 + #include + +-#if defined(ENABLE_DBUS) && defined(ENABLE_GIO) ++#include ++ ++#if defined(ENABLE_DBUS) && ENABLE_GIO + # include + #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(GetMenu()); +@@ -628,7 +623,7 @@ gboolean ensure_dbus_setup( gpointer data ) + GActionGroup* pActionGroup = reinterpret_cast(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 + diff --git a/libreoffice.spec b/libreoffice.spec index 596822d..d874635 100644 --- a/libreoffice.spec +++ b/libreoffice.spec @@ -254,6 +254,7 @@ Patch19: 0002-split-the-gtk2-and-gtk3-gtkobjects.patch Patch20: 0003-rename-X11WindowProvider-to-a-NativeWindowHandle-pro.patch Patch21: 0004-implement-wayland-handle-passing-for-gstreamer.patch Patch22: 0005-gtk3-wayland-play-video-via-gtksink-gstreamer-elemen.patch +Patch23: 0001-gtk3-get-app-menu-working-again-under-gtk3.patch %if 0%{?rhel} # not upstreamed