From 55b7198e926bc3edae6a9e28b46626c2489c7587 Mon Sep 17 00:00:00 2001 From: Paul Cornett Date: Tue, 2 Feb 2021 10:15:35 -0800 Subject: [PATCH] Remove some run-time dependencies on X11 backend with GTK3 As with Wayland, the X11 backend may not be available at run-time, so types defined in it can't be used --- src/gtk/display.cpp | 2 +- src/gtk/glcanvas.cpp | 13 +++++++++++-- src/gtk/taskbar.cpp | 5 ++++- src/gtk/toplevel.cpp | 22 ++++++++++++++++------ src/gtk/utilsgtk.cpp | 12 ++++++++++-- src/gtk/window.cpp | 6 +++++- 6 files changed, 47 insertions(+), 13 deletions(-) diff --git a/src/gtk/display.cpp b/src/gtk/display.cpp index 3b9cc2429a..4605f73572 100644 --- a/src/gtk/display.cpp +++ b/src/gtk/display.cpp @@ -179,7 +179,7 @@ bool wxDisplayImplGTK::ChangeMode(const wxVideoMode& WXUNUSED(mode)) static inline bool wxIsX11GDKScreen(GdkScreen* screen) { - return GDK_IS_X11_SCREEN(screen); + return strcmp("GdkX11Screen", g_type_name(G_TYPE_FROM_INSTANCE(screen))) == 0; } #else // !__WXGTK3__ diff --git a/src/gtk/glcanvas.cpp b/src/gtk/glcanvas.cpp index ffedecb005..3887e306e1 100644 --- a/src/gtk/glcanvas.cpp +++ b/src/gtk/glcanvas.cpp @@ -167,8 +167,13 @@ wxGLCanvas::wxGLCanvas(wxWindow *parent, static bool IsAvailable() { +#if defined(__WXGTK3__) && (defined(GDK_WINDOWING_WAYLAND) || defined(GDK_WINDOWING_X11)) + GdkDisplay* display = gdk_display_get_default(); + const char* displayTypeName = g_type_name(G_TYPE_FROM_INSTANCE(display)); +#endif + #ifdef GDK_WINDOWING_WAYLAND - if ( GDK_IS_WAYLAND_DISPLAY(gdk_display_get_default()) ) + if (strcmp("GdkWaylandDisplay", displayTypeName) == 0) { #if wxUSE_GLCANVAS_EGL return true; @@ -180,8 +185,12 @@ static bool IsAvailable() #endif // GDK_WINDOWING_WAYLAND #ifdef GDK_WINDOWING_X11 - if ( GDK_IS_X11_DISPLAY(gdk_display_get_default()) ) +#ifdef __WXGTK3__ + if (strcmp("GdkX11Display", displayTypeName) == 0) +#endif + { return true; + } #endif wxSafeShowMessage(_("Fatal Error"), _("wxGLCanvas is only supported on Wayland and X11 currently. You may be able to\nwork around this by setting environment variable GDK_BACKEND=x11 before\nstarting your program.")); diff --git a/src/gtk/taskbar.cpp b/src/gtk/taskbar.cpp index bf0f27a399..e5cd3fa51d 100644 --- a/src/gtk/taskbar.cpp +++ b/src/gtk/taskbar.cpp @@ -131,8 +131,11 @@ status_icon_popup_menu(GtkStatusIcon*, guint, guint, wxTaskBarIcon* taskBarIcon) bool wxTaskBarIconBase::IsAvailable() { #ifdef GDK_WINDOWING_X11 - if (!GDK_IS_X11_DISPLAY(gdk_display_get_default())) +#ifdef __WXGTK3__ + GdkDisplay* display = gdk_display_get_default(); + if (strcmp("GdkX11Display", g_type_name(G_TYPE_FROM_INSTANCE(display))) != 0) return false; +#endif char name[32]; g_snprintf(name, sizeof(name), "_NET_SYSTEM_TRAY_S%d", diff --git a/src/gtk/toplevel.cpp b/src/gtk/toplevel.cpp index 4a54bd3930..f852c6670c 100644 --- a/src/gtk/toplevel.cpp +++ b/src/gtk/toplevel.cpp @@ -505,8 +505,10 @@ bool wxGetFrameExtents(GdkWindow* window, int* left, int* right, int* top, int* #ifdef GDK_WINDOWING_X11 GdkDisplay* display = gdk_window_get_display(window); - if (!GDK_IS_X11_DISPLAY(display)) +#ifdef __WXGTK3__ + if (strcmp("GdkX11Display", g_type_name(G_TYPE_FROM_INSTANCE(display))) != 0) return false; +#endif static GdkAtom property = gdk_atom_intern("_NET_FRAME_EXTENTS", false); Atom xproperty = gdk_x11_atom_to_xatom_for_display(display, property); @@ -766,9 +768,13 @@ bool wxTopLevelWindowGTK::Create( wxWindow *parent, g_signal_connect (m_widget, "key_press_event", G_CALLBACK (wxgtk_tlw_key_press_event), NULL); +#ifdef __WXGTK3__ + const char* displayTypeName = + g_type_name(G_TYPE_FROM_INSTANCE(gtk_widget_get_display(m_widget))); +#endif #ifdef GDK_WINDOWING_X11 #ifdef __WXGTK3__ - if (GDK_IS_X11_SCREEN(gtk_window_get_screen(GTK_WINDOW(m_widget)))) + if (strcmp("GdkX11Display", displayTypeName) == 0) #endif { gtk_widget_add_events(m_widget, GDK_PROPERTY_CHANGE_MASK); @@ -806,7 +812,7 @@ bool wxTopLevelWindowGTK::Create( wxWindow *parent, m_gdkDecor |= GDK_DECOR_TITLE; #if GTK_CHECK_VERSION(3,10,0) else if ( - strcmp("GdkWaylandDisplay", g_type_name(G_TYPE_FROM_INSTANCE(gtk_widget_get_display(m_widget)))) == 0 && + strcmp("GdkWaylandDisplay", displayTypeName) == 0 && gtk_check_version(3,10,0) == NULL) { gtk_window_set_titlebar(GTK_WINDOW(m_widget), gtk_header_bar_new()); @@ -924,7 +930,9 @@ bool wxTopLevelWindowGTK::ShowFullScreen(bool show, long) Window xroot = None; wxX11FullScreenMethod method = wxX11_FS_WMSPEC; - if (GDK_IS_X11_DISPLAY(display)) +#ifdef __WXGTK3__ + if (strcmp("GdkX11Display", g_type_name(G_TYPE_FROM_INSTANCE(display))) == 0) +#endif { xdpy = GDK_DISPLAY_XDISPLAY(display); xroot = GDK_WINDOW_XID(gdk_screen_get_root_window(screen)); @@ -1048,6 +1056,7 @@ bool wxTopLevelWindowGTK::Show( bool show ) bool deferShow = show && !m_isShown && !m_isIconized && m_deferShow; if (deferShow) { + GdkScreen* screen = gtk_widget_get_screen(m_widget); deferShow = m_deferShowAllowed && // Assume size (from cache or wxPersistentTLW) is correct. // Avoids problems when WM initially provides an incorrect value @@ -1056,7 +1065,9 @@ bool wxTopLevelWindowGTK::Show( bool show ) gs_requestFrameExtentsStatus != RFE_STATUS_BROKEN && !gtk_widget_get_realized(m_widget) && - GDK_IS_X11_DISPLAY(gtk_widget_get_display(m_widget)) && +#ifdef __WXGTK3__ + strcmp("GdkX11Screen", g_type_name(G_TYPE_FROM_INSTANCE(screen))) == 0 && +#endif g_signal_handler_find(m_widget, GSignalMatchType(G_SIGNAL_MATCH_ID | G_SIGNAL_MATCH_DATA), g_signal_lookup("property_notify_event", GTK_TYPE_WIDGET), @@ -1068,7 +1079,6 @@ bool wxTopLevelWindowGTK::Show( bool show ) #endif if (deferShow) { - GdkScreen* screen = gtk_widget_get_screen(m_widget); GdkAtom atom = gdk_atom_intern("_NET_REQUEST_FRAME_EXTENTS", false); deferShow = gdk_x11_screen_supports_net_wm_hint(screen, atom) != 0; diff --git a/src/gtk/utilsgtk.cpp b/src/gtk/utilsgtk.cpp index 1437b7df59..ee80a6330c 100644 --- a/src/gtk/utilsgtk.cpp +++ b/src/gtk/utilsgtk.cpp @@ -83,15 +83,23 @@ wxDisplayInfo wxGetDisplayInfo() { wxDisplayInfo info = { NULL, wxDisplayNone }; GdkDisplay *display = gdk_window_get_display(wxGetTopLevelGDK()); +#if defined(__WXGTK3__) && (defined(GDK_WINDOWING_WAYLAND) || defined(GDK_WINDOWING_X11)) + const char* displayTypeName = g_type_name(G_TYPE_FROM_INSTANCE(display)); +#endif + #ifdef GDK_WINDOWING_X11 - if (GDK_IS_X11_DISPLAY(display)) { +#ifdef __WXGTK3__ + if (strcmp("GdkX11Display", displayTypeName) == 0) +#endif + { info.dpy = GDK_DISPLAY_XDISPLAY(display); info.type = wxDisplayX11; return info; } #endif #ifdef GDK_WINDOWING_WAYLAND - if (GDK_IS_WAYLAND_DISPLAY(display)) { + if (strcmp("GdkWaylandDisplay", displayTypeName) == 0) + { info.dpy = gdk_wayland_display_get_wl_display(display); info.type = wxDisplayWayland; return info; diff --git a/src/gtk/window.cpp b/src/gtk/window.cpp index 457439af37..2497cf9344 100644 --- a/src/gtk/window.cpp +++ b/src/gtk/window.cpp @@ -1020,7 +1020,11 @@ wxTranslateGTKKeyEventToWx(wxKeyEvent& event, } #ifdef GDK_WINDOWING_X11 - if (GDK_IS_X11_DISPLAY(gdk_window_get_display(gdk_event->window))) +#ifdef __WXGTK3__ + if (strcmp("GdkX11Window", g_type_name(G_TYPE_FROM_INSTANCE(gdk_event->window))) == 0) +#else + if (true) +#endif { // we want to always get the same key code when the same key is // pressed regardless of the state of the modifiers, i.e. on a