Blame SOURCES/0001-use-gdk_wayland_window_set_application_id-when-it-be.patch

eac0b7
From f1cace2cd06b20fc1431f15892a4293fa3601b39 Mon Sep 17 00:00:00 2001
eac0b7
From: =?UTF-8?q?Caol=C3=A1n=20McNamara?= <caolanm@redhat.com>
eac0b7
Date: Wed, 8 Jul 2020 10:13:26 +0100
eac0b7
Subject: [PATCH] use gdk_wayland_window_set_application_id when it becomes
eac0b7
 available
eac0b7
MIME-Version: 1.0
eac0b7
Content-Type: text/plain; charset=UTF-8
eac0b7
Content-Transfer-Encoding: 8bit
eac0b7
eac0b7
Change-Id: I60775dcbfbc396f195a71f219668944d0bfecf31
eac0b7
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/98325
eac0b7
Tested-by: Caolán McNamara <caolanm@redhat.com>
eac0b7
Reviewed-by: Caolán McNamara <caolanm@redhat.com>
eac0b7
(cherry picked from commit 2d8e2813ddc87f7ce03b97e4d603df11613461f0)
eac0b7
eac0b7
gdk_wayland_window_set_application_id doesn't work when called early
eac0b7
eac0b7
after mapped it definitely works
eac0b7
eac0b7
Change-Id: Ide0fa636ee26acea0d938aef08532b9396fe901a
eac0b7
---
eac0b7
 vcl/inc/unx/gtk/gtkframe.hxx  |  3 +++
eac0b7
 vcl/unx/gtk3/gtk3gtkframe.cxx | 49 +++++++++++++++++++++++++++++------
eac0b7
 2 files changed, 44 insertions(+), 8 deletions(-)
eac0b7
eac0b7
diff --git a/vcl/inc/unx/gtk/gtkframe.hxx b/vcl/inc/unx/gtk/gtkframe.hxx
eac0b7
index ccf9064..49b6937 100644
eac0b7
--- a/vcl/inc/unx/gtk/gtkframe.hxx
eac0b7
+++ b/vcl/inc/unx/gtk/gtkframe.hxx
eac0b7
@@ -206,6 +206,7 @@ class GtkSalFrame : public SalFrame
eac0b7
     GtkDropTarget*                  m_pDropTarget;
eac0b7
     GtkDragSource*                  m_pDragSource;
eac0b7
     bool                            m_bGeometryIsProvisional;
eac0b7
+    bool                            m_bIconSetWhileUnmapped;
eac0b7
 
eac0b7
     GtkSalMenu*                     m_pSalMenu;
eac0b7
 
eac0b7
@@ -315,6 +316,8 @@ class GtkSalFrame : public SalFrame
eac0b7
 
eac0b7
     void SetScreen( unsigned int nNewScreen, SetType eType, tools::Rectangle const *pSize = nullptr );
eac0b7
 
eac0b7
+    void SetIcon(const char* pIcon);
eac0b7
+
eac0b7
 public:
eac0b7
     cairo_surface_t*                m_pSurface;
eac0b7
     basegfx::B2IVector              m_aFrameSize;
eac0b7
diff --git a/vcl/unx/gtk3/gtk3gtkframe.cxx b/vcl/unx/gtk3/gtk3gtkframe.cxx
eac0b7
index 786aa40..624c75a 100644
eac0b7
--- a/vcl/unx/gtk3/gtk3gtkframe.cxx
eac0b7
+++ b/vcl/unx/gtk3/gtk3gtkframe.cxx
eac0b7
@@ -55,6 +55,7 @@
eac0b7
 
eac0b7
 #include <cstdlib>
eac0b7
 #include <cmath>
eac0b7
+#include <dlfcn.h>
eac0b7
 
eac0b7
 #include <com/sun/star/accessibility/XAccessibleEditableText.hpp>
eac0b7
 #include <com/sun/star/awt/MouseButton.hpp>
eac0b7
@@ -922,6 +923,7 @@ void GtkSalFrame::InitCommon()
eac0b7
     m_pDropTarget       = nullptr;
eac0b7
     m_pDragSource       = nullptr;
eac0b7
     m_bGeometryIsProvisional = false;
eac0b7
+    m_bIconSetWhileUnmapped = false;
eac0b7
     m_ePointerStyle     = static_cast<PointerStyle>(0xffff);
eac0b7
     m_pSalMenu          = nullptr;
eac0b7
     m_nWatcherId        = 0;
eac0b7
@@ -1217,6 +1219,28 @@ void GtkSalFrame::SetTitle( const OUString& rTitle )
eac0b7
     }
eac0b7
 }
eac0b7
 
eac0b7
+void GtkSalFrame::SetIcon(const char* appicon)
eac0b7
+{
eac0b7
+    gtk_window_set_icon_name(GTK_WINDOW(m_pWindow), appicon);
eac0b7
+
eac0b7
+#if defined(GDK_WINDOWING_WAYLAND)
eac0b7
+    if (DLSYM_GDK_IS_WAYLAND_DISPLAY(getGdkDisplay()))
eac0b7
+    {
eac0b7
+        static auto set_application_id = reinterpret_cast<void (*) (GdkWindow*, const char*)>(
eac0b7
+                                             dlsym(nullptr, "gdk_wayland_window_set_application_id"));
eac0b7
+        if (set_application_id)
eac0b7
+        {
eac0b7
+            GdkWindow* gdkWindow = gtk_widget_get_window(m_pWindow);
eac0b7
+            set_application_id(gdkWindow, appicon);
eac0b7
+
eac0b7
+            // gdk_wayland_window_set_application_id doesn't seem to work before
eac0b7
+            // the window is mapped, so set this for real when/if we are mapped
eac0b7
+            m_bIconSetWhileUnmapped = !gtk_widget_get_mapped(m_pWindow);
eac0b7
+        }
eac0b7
+    }
eac0b7
+#endif
eac0b7
+}
eac0b7
+
eac0b7
 void GtkSalFrame::SetIcon( sal_uInt16 nIcon )
eac0b7
 {
eac0b7
     if( (m_nStyle & (SalFrameStyleFlags::PLUG|SalFrameStyleFlags::SYSTEMCHILD|SalFrameStyleFlags::FLOAT|SalFrameStyleFlags::INTRO|SalFrameStyleFlags::OWNERDRAWDECORATION))
eac0b7
@@ -1240,7 +1264,8 @@ void GtkSalFrame::SetIcon( sal_uInt16 nIcon )
eac0b7
     else
eac0b7
         appicon = g_strdup ("libreoffice-startcenter");
eac0b7
 
eac0b7
-    gtk_window_set_icon_name (GTK_WINDOW (m_pWindow), appicon);
eac0b7
+    SetIcon(appicon);
eac0b7
+
eac0b7
     g_free (appicon);
eac0b7
 }
eac0b7
 
eac0b7
@@ -1309,13 +1334,18 @@ void GtkSalFrame::Show( bool bVisible, bool /*bNoActivate*/ )
eac0b7
             }
eac0b7
 
eac0b7
 #if defined(GDK_WINDOWING_WAYLAND)
eac0b7
-            //rhbz#1334915, gnome#779143, tdf#100158
eac0b7
-            //gtk under wayland lacks a way to change the app_id
eac0b7
-            //of a window, so brute force everything as a
eac0b7
-            //startcenter when initially shown to at least get
eac0b7
-            //the default LibreOffice icon and not the broken
eac0b7
-            //app icon
eac0b7
-            if (DLSYM_GDK_IS_WAYLAND_DISPLAY(getGdkDisplay()))
eac0b7
+            /*
eac0b7
+             rhbz#1334915, gnome#779143, tdf#100158
eac0b7
+             https://gitlab.gnome.org/GNOME/gtk/-/issues/767
eac0b7
+
eac0b7
+             before gdk_wayland_window_set_application_id was available gtk
eac0b7
+             under wayland lacked a way to change the app_id of a window, so
eac0b7
+             brute force everything as a startcenter when initially shown to at
eac0b7
+             least get the default LibreOffice icon and not the broken app icon
eac0b7
+            */
eac0b7
+            static bool bAppIdImmutable = DLSYM_GDK_IS_WAYLAND_DISPLAY(getGdkDisplay()) &&
eac0b7
+                                          !dlsym(nullptr, "gdk_wayland_window_set_application_id");
eac0b7
+            if (bAppIdImmutable)
eac0b7
             {
eac0b7
                 OString sOrigName(g_get_prgname());
eac0b7
                 g_set_prgname("libreoffice-startcenter");
eac0b7
@@ -3039,6 +3069,9 @@ gboolean GtkSalFrame::signalMap(GtkWidget *, GdkEvent*, gpointer frame)
eac0b7
 {
eac0b7
     GtkSalFrame* pThis = static_cast<GtkSalFrame*>(frame);
eac0b7
 
eac0b7
+    if (pThis->m_bIconSetWhileUnmapped)
eac0b7
+        pThis->SetIcon(gtk_window_get_icon_name(GTK_WINDOW(pThis->m_pWindow)));
eac0b7
+
eac0b7
     pThis->CallCallbackExc( SalEvent::Resize, nullptr );
eac0b7
     pThis->TriggerPaintEvent();
eac0b7
 
eac0b7
-- 
eac0b7
2.26.2
eac0b7