diff --git a/include/wx/gtk/private/backend.h b/include/wx/gtk/private/backend.h new file mode 100644 index 0000000000..9e86c88ff1 --- /dev/null +++ b/include/wx/gtk/private/backend.h @@ -0,0 +1,14 @@ +/////////////////////////////////////////////////////////////////////////////// +// Name: wx/gtk/private/backend.h +// Author: Paul Cornett +// Copyright: (c) 2022 Paul Cornett +// Licence: wxWindows licence +/////////////////////////////////////////////////////////////////////////////// + +#ifdef __WXGTK3__ +namespace wxGTKImpl +{ + bool IsWayland(void* instance); + bool IsX11(void* instance); +} +#endif diff --git a/include/wx/gtk/private/mediactrl.h b/include/wx/gtk/private/mediactrl.h index 0847bc5f72..1338c9a0b1 100644 --- a/include/wx/gtk/private/mediactrl.h +++ b/include/wx/gtk/private/mediactrl.h @@ -16,6 +16,7 @@ #ifdef GDK_WINDOWING_WAYLAND #include #endif +#include "wx/gtk/private/backend.h" //----------------------------------------------------------------------------- // "wxGtkGetIdFromWidget" from widget @@ -32,19 +33,16 @@ inline gpointer wxGtkGetIdFromWidget(GtkWidget* widget) GdkWindow* window = gtk_widget_get_window(widget); wxASSERT(window); -#ifdef __WXGTK3__ - const char* name = g_type_name(G_TYPE_FROM_INSTANCE(window)); -#endif #ifdef GDK_WINDOWING_X11 #ifdef __WXGTK3__ - if (strcmp("GdkX11Window", name) == 0) + if (wxGTKImpl::IsX11(window)) #endif { return (gpointer)GDK_WINDOW_XID(window); } #endif #ifdef GDK_WINDOWING_WAYLAND - if (strcmp("GdkWaylandWindow", name) == 0) + if (wxGTKImpl::IsWayland(window)) { return (gpointer)gdk_wayland_window_get_wl_surface(window); } diff --git a/src/gtk/display.cpp b/src/gtk/display.cpp index 4605f73572..9b230b2ee0 100644 --- a/src/gtk/display.cpp +++ b/src/gtk/display.cpp @@ -14,6 +14,7 @@ #endif #include "wx/gtk/private/wrapgtk.h" +#include "wx/gtk/private/backend.h" #ifdef GDK_WINDOWING_X11 #ifndef __WXGTK4__ #include "wx/unix/private/displayx11.h" @@ -179,7 +180,7 @@ bool wxDisplayImplGTK::ChangeMode(const wxVideoMode& WXUNUSED(mode)) static inline bool wxIsX11GDKScreen(GdkScreen* screen) { - return strcmp("GdkX11Screen", g_type_name(G_TYPE_FROM_INSTANCE(screen))) == 0; + return wxGTKImpl::IsX11(screen); } #else // !__WXGTK3__ diff --git a/src/gtk/glcanvas.cpp b/src/gtk/glcanvas.cpp index 3887e306e1..07de770699 100644 --- a/src/gtk/glcanvas.cpp +++ b/src/gtk/glcanvas.cpp @@ -16,6 +16,7 @@ #include "wx/glcanvas.h" #include "wx/gtk/private/wrapgtk.h" +#include "wx/gtk/private/backend.h" #ifdef GDK_WINDOWING_WAYLAND #include #endif @@ -169,11 +170,10 @@ 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 (strcmp("GdkWaylandDisplay", displayTypeName) == 0) + if (wxGTKImpl::IsWayland(display)) { #if wxUSE_GLCANVAS_EGL return true; @@ -186,7 +186,7 @@ static bool IsAvailable() #ifdef GDK_WINDOWING_X11 #ifdef __WXGTK3__ - if (strcmp("GdkX11Display", displayTypeName) == 0) + if (wxGTKImpl::IsX11(display)) #endif { return true; diff --git a/src/gtk/minifram.cpp b/src/gtk/minifram.cpp index 9ec9628b29..7e27767048 100644 --- a/src/gtk/minifram.cpp +++ b/src/gtk/minifram.cpp @@ -26,6 +26,7 @@ #include "wx/gtk/private/wrapgtk.h" #include "wx/gtk/private/gtk3-compat.h" +#include "wx/gtk/private/backend.h" //----------------------------------------------------------------------------- // data @@ -161,8 +162,7 @@ gtk_window_button_press_callback(GtkWidget* widget, GdkEventButton* gdk_event, w #ifdef __WXGTK3__ #ifndef __WXGTK4__ - GdkDisplay* display = gdk_window_get_display(gdk_event->window); - if (strcmp("GdkWaylandDisplay", g_type_name(G_TYPE_FROM_INSTANCE(display))) == 0) + if (wxGTKImpl::IsWayland(gdk_event->window)) #endif { gtk_window_begin_move_drag(GTK_WINDOW(win->m_widget), diff --git a/src/gtk/taskbar.cpp b/src/gtk/taskbar.cpp index e5cd3fa51d..38f03372d3 100644 --- a/src/gtk/taskbar.cpp +++ b/src/gtk/taskbar.cpp @@ -24,6 +24,7 @@ #endif #include "wx/gtk/private/wrapgtk.h" +#include "wx/gtk/private/backend.h" #ifdef GDK_WINDOWING_X11 #include #endif @@ -132,8 +133,7 @@ bool wxTaskBarIconBase::IsAvailable() { #ifdef GDK_WINDOWING_X11 #ifdef __WXGTK3__ - GdkDisplay* display = gdk_display_get_default(); - if (strcmp("GdkX11Display", g_type_name(G_TYPE_FROM_INSTANCE(display))) != 0) + if (!wxGTKImpl::IsX11(NULL)) return false; #endif diff --git a/src/gtk/toplevel.cpp b/src/gtk/toplevel.cpp index 6b01391e3e..78899e93a7 100644 --- a/src/gtk/toplevel.cpp +++ b/src/gtk/toplevel.cpp @@ -37,6 +37,7 @@ #include "wx/gtk/private/gtk3-compat.h" #include "wx/gtk/private/stylecontext.h" #include "wx/gtk/private/win_gtk.h" +#include "wx/gtk/private/backend.h" #ifdef GDK_WINDOWING_X11 #include @@ -79,7 +80,7 @@ static bool HasClientDecor(GtkWidget* widget) GdkDisplay* display = gtk_widget_get_display(widget); const char* name = g_type_name(G_TYPE_FROM_INSTANCE(display)); has = - strcmp(name, "GdkWaylandDisplay") == 0 || + wxGTKImpl::IsWayland(display) || strcmp(name, "GdkMirDisplay") == 0 || strcmp(name, "GdkBroadwayDisplay") == 0; } @@ -504,7 +505,7 @@ bool wxGetFrameExtents(GdkWindow* window, int* left, int* right, int* top, int* GdkDisplay* display = gdk_window_get_display(window); #ifdef __WXGTK3__ - if (strcmp("GdkX11Display", g_type_name(G_TYPE_FROM_INSTANCE(display))) != 0) + if (!wxGTKImpl::IsX11(display)) return false; #endif @@ -771,12 +772,11 @@ bool wxTopLevelWindowGTK::Create( wxWindow *parent, 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))); + GdkDisplay* display = gtk_widget_get_display(m_widget); #endif #ifdef GDK_WINDOWING_X11 #ifdef __WXGTK3__ - if (strcmp("GdkX11Display", displayTypeName) == 0) + if (wxGTKImpl::IsX11(display)) #endif { gtk_widget_add_events(m_widget, GDK_PROPERTY_CHANGE_MASK); @@ -814,7 +814,7 @@ bool wxTopLevelWindowGTK::Create( wxWindow *parent, m_gdkDecor |= GDK_DECOR_TITLE; #if GTK_CHECK_VERSION(3,10,0) else if ( - strcmp("GdkWaylandDisplay", displayTypeName) == 0 && + wxGTKImpl::IsWayland(display) && gtk_check_version(3,10,0) == NULL) { gtk_window_set_titlebar(GTK_WINDOW(m_widget), gtk_header_bar_new()); @@ -933,7 +933,7 @@ bool wxTopLevelWindowGTK::ShowFullScreen(bool show, long) wxX11FullScreenMethod method = wxX11_FS_WMSPEC; #ifdef __WXGTK3__ - if (strcmp("GdkX11Display", g_type_name(G_TYPE_FROM_INSTANCE(display))) == 0) + if (wxGTKImpl::IsX11(display)) #endif { xdpy = GDK_DISPLAY_XDISPLAY(display); @@ -1068,7 +1068,7 @@ bool wxTopLevelWindowGTK::Show( bool show ) gs_requestFrameExtentsStatus != RFE_STATUS_BROKEN && !gtk_widget_get_realized(m_widget) && #ifdef __WXGTK3__ - strcmp("GdkX11Screen", g_type_name(G_TYPE_FROM_INSTANCE(screen))) == 0 && + wxGTKImpl::IsX11(screen) && #endif g_signal_handler_find(m_widget, GSignalMatchType(G_SIGNAL_MATCH_ID | G_SIGNAL_MATCH_DATA), diff --git a/src/gtk/utilsgtk.cpp b/src/gtk/utilsgtk.cpp index ee80a6330c..c516ef0258 100644 --- a/src/gtk/utilsgtk.cpp +++ b/src/gtk/utilsgtk.cpp @@ -26,6 +26,7 @@ #include "wx/evtloop.h" #include "wx/gtk/private/wrapgtk.h" +#include "wx/gtk/private/backend.h" #ifdef GDK_WINDOWING_WAYLAND #include #endif @@ -82,14 +83,13 @@ void *wxGetDisplay() wxDisplayInfo wxGetDisplayInfo() { wxDisplayInfo info = { NULL, wxDisplayNone }; +#if defined(GDK_WINDOWING_WAYLAND) || defined(GDK_WINDOWING_X11) 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 #ifdef __WXGTK3__ - if (strcmp("GdkX11Display", displayTypeName) == 0) + if (wxGTKImpl::IsX11(display)) #endif { info.dpy = GDK_DISPLAY_XDISPLAY(display); @@ -98,7 +98,7 @@ wxDisplayInfo wxGetDisplayInfo() } #endif #ifdef GDK_WINDOWING_WAYLAND - if (strcmp("GdkWaylandDisplay", displayTypeName) == 0) + if (wxGTKImpl::IsWayland(display)) { info.dpy = gdk_wayland_display_get_wl_display(display); info.type = wxDisplayWayland; diff --git a/src/gtk/window.cpp b/src/gtk/window.cpp index 7d46a67906..a6a19a8a1c 100644 --- a/src/gtk/window.cpp +++ b/src/gtk/window.cpp @@ -42,6 +42,7 @@ #include "wx/gtk/private/gtk3-compat.h" #include "wx/gtk/private/event.h" #include "wx/gtk/private/win_gtk.h" +#include "wx/gtk/private/backend.h" #include "wx/private/textmeasure.h" using namespace wxGTKImpl; @@ -395,6 +396,32 @@ PangoContext* wxGetPangoContext() return context; } +#ifdef __WXGTK3__ +static bool IsBackend(void* instance, const char* string) +{ + if (instance == NULL) + instance = wxGetTopLevelGDK(); + const char* name = g_type_name(G_TYPE_FROM_INSTANCE(instance)); + return strncmp(string, name, strlen(string)) == 0; +} + +bool wxGTKImpl::IsWayland(void* instance) +{ + static wxByte is = 2; + if (is > 1) + is = IsBackend(instance, "GdkWayland"); + return bool(is); +} + +bool wxGTKImpl::IsX11(void* instance) +{ + static wxByte is = 2; + if (is > 1) + is = IsBackend(instance, "GdkX11"); + return bool(is); +} +#endif // __WXGTK3__ + //----------------------------------------------------------------------------- // "expose_event"/"draw" from m_wxwindow //----------------------------------------------------------------------------- @@ -1014,7 +1041,7 @@ wxTranslateGTKKeyEventToWx(wxKeyEvent& event, #ifdef GDK_WINDOWING_X11 #ifdef __WXGTK3__ - if (strcmp("GdkX11Window", g_type_name(G_TYPE_FROM_INSTANCE(gdk_event->window))) == 0) + if (wxGTKImpl::IsX11(gdk_event->window)) #else if (true) #endif diff --git a/src/unix/glegl.cpp b/src/unix/glegl.cpp index 5e831713b5..da7a63240e 100644 --- a/src/unix/glegl.cpp +++ b/src/unix/glegl.cpp @@ -29,6 +29,7 @@ #include "wx/scopedptr.h" #include "wx/gtk/private/wrapgtk.h" +#include "wx/gtk/private/backend.h" #ifdef GDK_WINDOWING_WAYLAND #include #include @@ -459,9 +460,8 @@ bool wxGLCanvasEGL::CreateSurface() } GdkWindow *window = GTKGetDrawingWindow(); - const char* name = g_type_name(G_TYPE_FROM_INSTANCE(window)); #ifdef GDK_WINDOWING_X11 - if (strcmp("GdkX11Window", name) == 0) + if (wxGTKImpl::IsX11(window)) { m_xwindow = GDK_WINDOW_XID(window); m_surface = eglCreatePlatformWindowSurface(m_display, *m_config, @@ -470,7 +470,7 @@ bool wxGLCanvasEGL::CreateSurface() } #endif #ifdef GDK_WINDOWING_WAYLAND - if (strcmp("GdkWaylandWindow", name) == 0) + if (wxGTKImpl::IsWayland(window)) { int x, y; gdk_window_get_origin(window, &x, &y); diff --git a/src/unix/mediactrl_gstplayer.cpp b/src/unix/mediactrl_gstplayer.cpp index f8f84374e7..bfeb7a1b59 100644 --- a/src/unix/mediactrl_gstplayer.cpp +++ b/src/unix/mediactrl_gstplayer.cpp @@ -147,7 +147,7 @@ expose_event_callback(GtkWidget* widget, GdkEventExpose* event, wxGStreamerMedia ); #ifdef __WXGTK3__ GdkWindow* window = gtk_widget_get_window(widget); - if (strcmp("GdkWaylandWindow", g_type_name(G_TYPE_FROM_INSTANCE(window))) == 0) + if (wxGTKImpl::IsWayland(window)) { // on wayland we need to place the video int x, y; @@ -198,7 +198,7 @@ static void realize_callback(GtkWidget* widget, wxGStreamerMediaBackend* be) ); #ifdef __WXGTK3__ GdkWindow* window = gtk_widget_get_window(widget); - if (strcmp("GdkWaylandWindow", g_type_name(G_TYPE_FROM_INSTANCE(window))) == 0) + if (wxGTKImpl::IsWayland(window)) { // on wayland we need to place the video int x, y; diff --git a/src/unix/utilsx11.cpp b/src/unix/utilsx11.cpp index 2b5fa89732..5aec2f3689 100644 --- a/src/unix/utilsx11.cpp +++ b/src/unix/utilsx11.cpp @@ -27,6 +27,7 @@ #ifdef __WXGTK__ #ifdef __WXGTK20__ #include "wx/gtk/private/wrapgtk.h" +#include "wx/gtk/private/backend.h" #else // GTK+ 1.x #include #define GDK_WINDOWING_X11 @@ -2640,9 +2641,7 @@ static bool wxGetKeyStateGTK(wxKeyCode key) bool wxGetKeyState(wxKeyCode key) { #ifdef wxHAS_GETKEYSTATE_GTK - GdkDisplay* display = gdk_window_get_display(wxGetTopLevelGDK()); - const char* name = g_type_name(G_TYPE_FROM_INSTANCE(display)); - if (strcmp(name, "GdkX11Display") != 0) + if (!wxGTKImpl::IsX11(NULL)) { return wxGetKeyStateGTK(key); }