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
This commit is contained in:
Paul Cornett
2021-02-02 10:15:35 -08:00
parent 3514dda407
commit 55b7198e92
6 changed files with 47 additions and 13 deletions

View File

@@ -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__

View File

@@ -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."));

View File

@@ -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",

View File

@@ -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;

View File

@@ -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;

View File

@@ -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