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