gdk_wayland_window_set_application_id doesn't work when called early

after mapped it definitely works

Change-Id: Ide0fa636ee26acea0d938aef08532b9396fe901a
Reviewed-on: https://gerrit.libreoffice.org/c/core/+/103579
Tested-by: Jenkins
Reviewed-by: Michael Stahl <michael.stahl@cib.de>
diff --git a/vcl/inc/unx/gtk/gtkframe.hxx b/vcl/inc/unx/gtk/gtkframe.hxx
index fa08c1e..aad22afa 100644
--- a/vcl/inc/unx/gtk/gtkframe.hxx
+++ b/vcl/inc/unx/gtk/gtkframe.hxx
@@ -209,6 +209,7 @@ class GtkSalFrame final : public SalFrame
    GtkDropTarget*                  m_pDropTarget;
    GtkDragSource*                  m_pDragSource;
    bool                            m_bGeometryIsProvisional;
    bool                            m_bIconSetWhileUnmapped;

    GtkSalMenu*                     m_pSalMenu;

@@ -319,6 +320,8 @@ class GtkSalFrame final : public SalFrame

    void SetScreen( unsigned int nNewScreen, SetType eType, tools::Rectangle const *pSize = nullptr );

    void SetIcon(const char* pIcon);

public:
    cairo_surface_t*                m_pSurface;
    basegfx::B2IVector              m_aFrameSize;
diff --git a/vcl/unx/gtk3/gtk3gtkframe.cxx b/vcl/unx/gtk3/gtk3gtkframe.cxx
index 22ea69f..803ae19 100644
--- a/vcl/unx/gtk3/gtk3gtkframe.cxx
+++ b/vcl/unx/gtk3/gtk3gtkframe.cxx
@@ -929,6 +929,7 @@ void GtkSalFrame::InitCommon()
    m_pDropTarget       = nullptr;
    m_pDragSource       = nullptr;
    m_bGeometryIsProvisional = false;
    m_bIconSetWhileUnmapped = false;
    m_bTooltipBlocked   = false;
    m_ePointerStyle     = static_cast<PointerStyle>(0xffff);
    m_pSalMenu          = nullptr;
@@ -1227,6 +1228,28 @@ void GtkSalFrame::SetTitle( const OUString& rTitle )
    }
}

void GtkSalFrame::SetIcon(const char* appicon)
{
    gtk_window_set_icon_name(GTK_WINDOW(m_pWindow), appicon);

#if defined(GDK_WINDOWING_WAYLAND)
    if (DLSYM_GDK_IS_WAYLAND_DISPLAY(getGdkDisplay()))
    {
        static auto set_application_id = reinterpret_cast<void (*) (GdkWindow*, const char*)>(
                                             dlsym(nullptr, "gdk_wayland_window_set_application_id"));
        if (set_application_id)
        {
            GdkWindow* gdkWindow = gtk_widget_get_window(m_pWindow);
            set_application_id(gdkWindow, appicon);

            // gdk_wayland_window_set_application_id doesn't seem to work before
            // the window is mapped, so set this for real when/if we are mapped
            m_bIconSetWhileUnmapped = !gtk_widget_get_mapped(m_pWindow);
        }
    }
#endif
}

void GtkSalFrame::SetIcon( sal_uInt16 nIcon )
{
    if( (m_nStyle & (SalFrameStyleFlags::PLUG|SalFrameStyleFlags::SYSTEMCHILD|SalFrameStyleFlags::FLOAT|SalFrameStyleFlags::INTRO|SalFrameStyleFlags::OWNERDRAWDECORATION))
@@ -1250,20 +1273,7 @@ void GtkSalFrame::SetIcon( sal_uInt16 nIcon )
    else
        appicon = g_strdup ("libreoffice-startcenter");

    gtk_window_set_icon_name (GTK_WINDOW (m_pWindow), appicon);

#if defined(GDK_WINDOWING_WAYLAND)
    if (DLSYM_GDK_IS_WAYLAND_DISPLAY(getGdkDisplay()))
    {
        static auto set_application_id = reinterpret_cast<void (*) (GdkWindow*, const char*)>(
                                             dlsym(nullptr, "gdk_wayland_window_set_application_id"));
        if (set_application_id)
        {
            GdkWindow* gdkWindow = gtk_widget_get_window(m_pWindow);
            set_application_id(gdkWindow, appicon);
        }
    }
#endif
    SetIcon(appicon);

    g_free (appicon);
}
@@ -3147,6 +3157,9 @@ gboolean GtkSalFrame::signalMap(GtkWidget *, GdkEvent*, gpointer frame)
{
    GtkSalFrame* pThis = static_cast<GtkSalFrame*>(frame);

    if (pThis->m_bIconSetWhileUnmapped)
        pThis->SetIcon(gtk_window_get_icon_name(GTK_WINDOW(pThis->m_pWindow)));

    pThis->CallCallbackExc( SalEvent::Resize, nullptr );
    pThis->TriggerPaintEvent();