summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCaolán McNamara <caolanm@redhat.com>2019-02-11 14:14:48 +0000
committerMichael Stahl <Michael.Stahl@cib.de>2019-02-12 10:47:52 +0100
commit8249b1df075184798418ba778a9b2d71a7115eae (patch)
tree09db10d5677b5af109ea810273f57d9b3912e6ca
parent7ed962571df02d1d7b286e7af534fadd717a8003 (diff)
Resolves: tdf#123080 don't require wayland at runtime
if it existed at buildtime Change-Id: I8a3285b7ee3b0556605b0c3d4b1fef222eb62d1a Reviewed-on: https://gerrit.libreoffice.org/67692 Tested-by: Jenkins Reviewed-by: Michael Stahl <Michael.Stahl@cib.de>
-rw-r--r--vcl/inc/unx/gtk/gtkbackend.hxx25
-rw-r--r--vcl/inc/unx/gtk/gtkgdi.hxx7
-rw-r--r--vcl/unx/gtk/gtkinst.cxx2
-rw-r--r--vcl/unx/gtk3/gtk3gtkdata.cxx7
-rw-r--r--vcl/unx/gtk3/gtk3gtkframe.cxx28
-rw-r--r--vcl/unx/gtk3/gtk3gtkinst.cxx23
-rw-r--r--vcl/unx/gtk3/gtk3gtkobject.cxx2
-rw-r--r--vcl/unx/gtk3/gtk3salnativewidgets-gtk.cxx6
8 files changed, 63 insertions, 37 deletions
diff --git a/vcl/inc/unx/gtk/gtkbackend.hxx b/vcl/inc/unx/gtk/gtkbackend.hxx
new file mode 100644
index 000000000000..288311b41fca
--- /dev/null
+++ b/vcl/inc/unx/gtk/gtkbackend.hxx
@@ -0,0 +1,25 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+
+#ifndef INCLUDED_VCL_INC_UNX_GTK_GTKBACKEND_HXX
+#define INCLUDED_VCL_INC_UNX_GTK_GTKBACKEND_HXX
+
+#include <gtk/gtk.h>
+#if defined(GDK_WINDOWING_X11)
+#include <gdk/gdkx.h>
+bool DLSYM_GDK_IS_X11_DISPLAY(GdkDisplay* pDisplay);
+#endif
+#if defined(GDK_WINDOWING_WAYLAND)
+#include <gdk/gdkwayland.h>
+bool DLSYM_GDK_IS_WAYLAND_DISPLAY(GdkDisplay* pDisplay);
+#endif
+
+#endif // INCLUDED_VCL_INC_UNX_GTK_GTKBACKEND_HXX
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/vcl/inc/unx/gtk/gtkgdi.hxx b/vcl/inc/unx/gtk/gtkgdi.hxx
index 074ce583dfb6..ee42a2baf433 100644
--- a/vcl/inc/unx/gtk/gtkgdi.hxx
+++ b/vcl/inc/unx/gtk/gtkgdi.hxx
@@ -23,12 +23,7 @@
#include <config_cairo_canvas.h>
#include <gtk/gtk.h>
-#if defined(GDK_WINDOWING_X11)
-# include <gdk/gdkx.h>
-#endif
-#if defined(GDK_WINDOWING_WAYLAND)
-# include <gdk/gdkwayland.h>
-#endif
+#include "gtkbackend.hxx"
#include <gdk/gdkkeysyms.h>
#include <unx/gtk/gtkframe.hxx>
diff --git a/vcl/unx/gtk/gtkinst.cxx b/vcl/unx/gtk/gtkinst.cxx
index 77a6b9dc15ab..6c505a27313c 100644
--- a/vcl/unx/gtk/gtkinst.cxx
+++ b/vcl/unx/gtk/gtkinst.cxx
@@ -86,7 +86,7 @@ extern "C"
// for gtk3 it is normally built with X and Wayland support, if
// X is supported GDK_WINDOWING_X11 is defined and this is always
// called, regardless of if we're running under X or Wayland.
- // We can't use (GDK_IS_X11_DISPLAY(pDisplay)) to only do it under
+ // We can't use (DLSYM_GDK_IS_X11_DISPLAY(pDisplay)) to only do it under
// X, because we need to do it earlier than we have a display
#if !GTK_CHECK_VERSION(3,0,0) || defined(GDK_WINDOWING_X11)
/* #i92121# workaround deadlocks in the X11 implementation
diff --git a/vcl/unx/gtk3/gtk3gtkdata.cxx b/vcl/unx/gtk3/gtk3gtkdata.cxx
index db810d745cd4..e5e568d1bfc2 100644
--- a/vcl/unx/gtk3/gtk3gtkdata.cxx
+++ b/vcl/unx/gtk3/gtk3gtkdata.cxx
@@ -30,6 +30,7 @@
#include <sys/types.h>
#include <sys/time.h>
#endif
+#include <unx/gtk/gtkbackend.hxx>
#include <unx/gtk/gtkdata.hxx>
#include <unx/gtk/gtkinst.hxx>
#include <unx/gtk/gtkframe.hxx>
@@ -84,7 +85,7 @@ GtkSalDisplay::GtkSalDisplay( GdkDisplay* pDisplay ) :
if ( getenv( "SAL_IGNOREXERRORS" ) )
GetGenericUnixSalData()->ErrorTrapPush(); // and leak the trap
- m_bX11Display = GDK_IS_X11_DISPLAY( m_pGdkDisplay );
+ m_bX11Display = DLSYM_GDK_IS_X11_DISPLAY( m_pGdkDisplay );
gtk_widget_set_default_direction(AllSettings::GetLayoutRTL() ? GTK_TEXT_DIR_RTL : GTK_TEXT_DIR_LTR);
}
@@ -424,7 +425,7 @@ GtkSalData::~GtkSalData()
m_pUserEvent = nullptr;
}
#if defined(GDK_WINDOWING_X11)
- if (GDK_IS_X11_DISPLAY(gdk_display_get_default()))
+ if (DLSYM_GDK_IS_X11_DISPLAY(gdk_display_get_default()))
XSetIOErrorHandler(aOrigXIOErrorHandler);
#endif
}
@@ -572,7 +573,7 @@ void GtkSalData::Init()
}
#if defined(GDK_WINDOWING_X11)
- if (GDK_IS_X11_DISPLAY(pGdkDisp))
+ if (DLSYM_GDK_IS_X11_DISPLAY(pGdkDisp))
aOrigXIOErrorHandler = XSetIOErrorHandler(XIOErrorHdl);
#endif
diff --git a/vcl/unx/gtk3/gtk3gtkframe.cxx b/vcl/unx/gtk3/gtk3gtkframe.cxx
index e4cbc88472e3..f8e629037820 100644
--- a/vcl/unx/gtk3/gtk3gtkframe.cxx
+++ b/vcl/unx/gtk3/gtk3gtkframe.cxx
@@ -51,12 +51,7 @@
#include <X11/Xlib.h>
#include <X11/Xutil.h>
#include <X11/Xatom.h>
-#if defined(GDK_WINDOWING_X11)
-# include <gdk/gdkx.h>
-#endif
-#if defined(GDK_WINDOWING_WAYLAND)
-# include <gdk/gdkwayland.h>
-#endif
+#include <unx/gtk/gtkbackend.hxx>
#include <dlfcn.h>
#include <vcl/salbtype.hxx>
@@ -99,11 +94,6 @@
#define IS_WIDGET_REALIZED gtk_widget_get_realized
#define IS_WIDGET_MAPPED gtk_widget_get_mapped
-#ifndef GDK_IS_X11_DISPLAY
-#define GDK_IS_X11_DISPLAY(foo) (true)
-#endif
-
-
using namespace com::sun::star;
int GtkSalFrame::m_nFloats = 0;
@@ -631,7 +621,7 @@ static gboolean ensure_dbus_setup( gpointer data )
// 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))
+ if (DLSYM_GDK_IS_X11_DISPLAY(pDisplay))
{
gdk_x11_window_set_utf8_property( gdkWindow, "_GTK_APPLICATION_ID", "org.libreoffice" );
if (!bDesktopIsUnity)
@@ -643,7 +633,7 @@ static gboolean ensure_dbus_setup( gpointer data )
}
#endif
#if defined(GDK_WINDOWING_WAYLAND)
- if (GDK_IS_WAYLAND_DISPLAY(pDisplay))
+ if (DLSYM_GDK_IS_WAYLAND_DISPLAY(pDisplay))
{
gdk_wayland_window_set_dbus_properties_libgtk_only(gdkWindow, "org.libreoffice",
"/org/libreoffice/menus/appmenu",
@@ -1017,7 +1007,7 @@ void GtkSalFrame::InitCommon()
gtk_widget_set_app_paintable(GTK_WIDGET(m_pFixedContainer), true);
/*non-X11 displays won't show anything at all without double-buffering
enabled*/
- if (GDK_IS_X11_DISPLAY(getGdkDisplay()))
+ if (DLSYM_GDK_IS_X11_DISPLAY(getGdkDisplay()))
gtk_widget_set_double_buffered(GTK_WIDGET(m_pFixedContainer), false);
gtk_widget_set_redraw_on_allocate(GTK_WIDGET(m_pFixedContainer), false);
@@ -1121,7 +1111,7 @@ void GtkSalFrame::InitCommon()
#if defined(GDK_WINDOWING_X11)
GdkDisplay *pDisplay = getGdkDisplay();
- if (GDK_IS_X11_DISPLAY(pDisplay))
+ if (DLSYM_GDK_IS_X11_DISPLAY(pDisplay))
{
m_aSystemData.pDisplay = gdk_x11_display_get_xdisplay(pDisplay);
m_aSystemData.pVisual = gdk_x11_visual_get_xvisual(pVisual);
@@ -1260,7 +1250,7 @@ void GtkSalFrame::Init( SalFrame* pParent, SalFrameStyleFlags nStyle )
//built-in close button of the titlebar follows the overridden direction rather than continue in the same
//direction as every other titlebar on the user's desktop. So if they don't match set an explicit
//header bar with the desired 'outside' direction
- if ((eType == GDK_WINDOW_TYPE_HINT_NORMAL || eType == GDK_WINDOW_TYPE_HINT_DIALOG) && GDK_IS_WAYLAND_DISPLAY(GtkSalFrame::getGdkDisplay()))
+ if ((eType == GDK_WINDOW_TYPE_HINT_NORMAL || eType == GDK_WINDOW_TYPE_HINT_DIALOG) && DLSYM_GDK_IS_WAYLAND_DISPLAY(GtkSalFrame::getGdkDisplay()))
{
const bool bDesktopIsRTL = MsLangId::isRightToLeft(MsLangId::getSystemUILanguage());
const bool bAppIsRTL = gtk_widget_get_default_direction() == GTK_TEXT_DIR_RTL;
@@ -1469,7 +1459,7 @@ void GtkSalFrame::Show( bool bVisible, bool /*bNoActivate*/ )
//startcenter when initially shown to at least get
//the default LibreOffice icon and not the broken
//app icon
- if (GDK_IS_WAYLAND_DISPLAY(getGdkDisplay()))
+ if (DLSYM_GDK_IS_WAYLAND_DISPLAY(getGdkDisplay()))
{
OString sOrigName(g_get_prgname());
g_set_prgname("libreoffice-startcenter");
@@ -4329,13 +4319,13 @@ sal_uIntPtr GtkSalFrame::GetNativeWindowHandle(GtkWidget *pWidget)
GdkWindow *pWindow = gtk_widget_get_window(pWidget);
#if defined(GDK_WINDOWING_X11)
- if (GDK_IS_X11_DISPLAY(pDisplay))
+ if (DLSYM_GDK_IS_X11_DISPLAY(pDisplay))
{
return GDK_WINDOW_XID(pWindow);
}
#endif
#if defined(GDK_WINDOWING_WAYLAND)
- if (GDK_IS_WAYLAND_DISPLAY(pDisplay))
+ if (DLSYM_GDK_IS_WAYLAND_DISPLAY(pDisplay))
{
return reinterpret_cast<sal_uIntPtr>(gdk_wayland_window_get_wl_surface(pWindow));
}
diff --git a/vcl/unx/gtk3/gtk3gtkinst.cxx b/vcl/unx/gtk3/gtk3gtkinst.cxx
index 08becd0c2ede..16b32937dfa3 100644
--- a/vcl/unx/gtk3/gtk3gtkinst.cxx
+++ b/vcl/unx/gtk3/gtk3gtkinst.cxx
@@ -1169,6 +1169,23 @@ OpenGLContext* GtkInstance::CreateOpenGLContext()
return new GtkOpenGLContext;
}
+// tdf#123800 avoid requiring wayland at runtime just because it existed at buildtime
+bool DLSYM_GDK_IS_WAYLAND_DISPLAY(GdkDisplay* pDisplay)
+{
+ auto get_type = reinterpret_cast<GType (*) (void)>(dlsym(nullptr, "gdk_wayland_display_get_type"));
+ if (!get_type)
+ return false;
+ return G_TYPE_CHECK_INSTANCE_TYPE(pDisplay, get_type());
+}
+
+bool DLSYM_GDK_IS_X11_DISPLAY(GdkDisplay* pDisplay)
+{
+ auto get_type = reinterpret_cast<GType (*) (void)>(dlsym(nullptr, "gdk_x11_display_get_type"));
+ if (!get_type)
+ return false;
+ return G_TYPE_CHECK_INSTANCE_TYPE(pDisplay, get_type());
+}
+
class GtkInstanceBuilder;
namespace
@@ -2143,7 +2160,7 @@ public:
#if defined(GDK_WINDOWING_WAYLAND)
// drop x/y when under wayland
GdkDisplay *pDisplay = gtk_widget_get_display(m_pWidget);
- bPositioningAllowed = !GDK_IS_WAYLAND_DISPLAY(pDisplay);
+ bPositioningAllowed = !DLSYM_GDK_IS_WAYLAND_DISPLAY(pDisplay);
#endif
WindowStateData aData;
@@ -4109,7 +4126,7 @@ public:
//under wayland a Popover will work to "escape" the parent dialog, not
//so under X, so come up with this hack to use a raw GtkWindow
GdkDisplay *pDisplay = gtk_widget_get_display(m_pWidget);
- if (GDK_IS_X11_DISPLAY(pDisplay))
+ if (DLSYM_GDK_IS_X11_DISPLAY(pDisplay))
{
m_pMenuHack = GTK_WINDOW(gtk_window_new(GTK_WINDOW_POPUP));
gtk_window_set_type_hint(m_pMenuHack, GDK_WINDOW_TYPE_HINT_COMBO);
@@ -7033,7 +7050,7 @@ public:
return;
#if defined(GDK_WINDOWING_WAYLAND)
GdkDisplay *pDisplay = gtk_widget_get_display(m_pWidget);
- if (GDK_IS_WAYLAND_DISPLAY(pDisplay))
+ if (DLSYM_GDK_IS_WAYLAND_DISPLAY(pDisplay))
{
gtk_combo_box_set_wrap_width(m_pComboBox, get_count() > 30 ? 1 : 0);
}
diff --git a/vcl/unx/gtk3/gtk3gtkobject.cxx b/vcl/unx/gtk3/gtk3gtkobject.cxx
index 48e2436e67bf..33fd6d037981 100644
--- a/vcl/unx/gtk3/gtk3gtkobject.cxx
+++ b/vcl/unx/gtk3/gtk3gtkobject.cxx
@@ -60,7 +60,7 @@ GtkSalObject::GtkSalObject( GtkSalFrame* pParent, bool bShow )
#if defined(GDK_WINDOWING_X11)
GdkDisplay *pDisplay = GtkSalFrame::getGdkDisplay();
- if (GDK_IS_X11_DISPLAY(pDisplay))
+ if (DLSYM_GDK_IS_X11_DISPLAY(pDisplay))
{
m_aSystemData.pDisplay = gdk_x11_display_get_xdisplay(pDisplay);
m_aSystemData.pVisual = gdk_x11_visual_get_xvisual(pVisual);
diff --git a/vcl/unx/gtk3/gtk3salnativewidgets-gtk.cxx b/vcl/unx/gtk3/gtk3salnativewidgets-gtk.cxx
index f6096f36b72b..c768fe808126 100644
--- a/vcl/unx/gtk3/gtk3salnativewidgets-gtk.cxx
+++ b/vcl/unx/gtk3/gtk3salnativewidgets-gtk.cxx
@@ -17,15 +17,13 @@
#include <unx/gtk/gtkdata.hxx>
#include <unx/gtk/gtkinst.hxx>
#include <unx/gtk/gtkgdi.hxx>
+#include <unx/gtk/gtkbackend.hxx>
#include <vcl/decoview.hxx>
#include <vcl/settings.hxx>
#include <unx/fontmanager.hxx>
#include <headless/CustomWidgetDraw.hxx>
#include "cairo_gtk3_cairo.hxx"
-#if defined(GDK_WINDOWING_WAYLAND)
-# include <gdk/gdkwayland.h>
-#endif
#include <boost/optional.hpp>
GtkStyleContext* GtkSalGraphics::mpWindowStyle = nullptr;
@@ -3461,7 +3459,7 @@ void GtkSalData::initNWF()
//gnome#768128 for the car crash that is wayland
//and floating dockable toolbars
GdkDisplay *pDisplay = gdk_display_get_default();
- if (GDK_IS_WAYLAND_DISPLAY(pDisplay))
+ if (DLSYM_GDK_IS_WAYLAND_DISPLAY(pDisplay))
pSVData->maNWFData.mbCanDetermineWindowPosition = false;
#endif
}