diff options
author | Caolán McNamara <caolanm@redhat.com> | 2020-09-29 12:30:18 +0100 |
---|---|---|
committer | Michael Stahl <michael.stahl@cib.de> | 2020-09-30 10:23:20 +0200 |
commit | 831a9b465ac82ec8d27186329d6596ef5e9e4601 (patch) | |
tree | f7c994073ff2e2249707046368be5278e9d40a0c /vcl | |
parent | a956b501d21989b8c6eeb9f0c71d997a164a7a9c (diff) |
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>
Diffstat (limited to 'vcl')
-rw-r--r-- | vcl/inc/unx/gtk/gtkframe.hxx | 3 | ||||
-rw-r--r-- | vcl/unx/gtk3/gtk3gtkframe.cxx | 41 |
2 files changed, 30 insertions, 14 deletions
diff --git a/vcl/inc/unx/gtk/gtkframe.hxx b/vcl/inc/unx/gtk/gtkframe.hxx index fa08c1e64617..aad22afa85e2 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 22ea69f31d7b..803ae198de2e 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(); |