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) 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__ #else // !__WXGTK3__

View File

@@ -167,8 +167,13 @@ wxGLCanvas::wxGLCanvas(wxWindow *parent,
static bool IsAvailable() 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 #ifdef GDK_WINDOWING_WAYLAND
if ( GDK_IS_WAYLAND_DISPLAY(gdk_display_get_default()) ) if (strcmp("GdkWaylandDisplay", displayTypeName) == 0)
{ {
#if wxUSE_GLCANVAS_EGL #if wxUSE_GLCANVAS_EGL
return true; return true;
@@ -180,8 +185,12 @@ static bool IsAvailable()
#endif // GDK_WINDOWING_WAYLAND #endif // GDK_WINDOWING_WAYLAND
#ifdef GDK_WINDOWING_X11 #ifdef GDK_WINDOWING_X11
if ( GDK_IS_X11_DISPLAY(gdk_display_get_default()) ) #ifdef __WXGTK3__
if (strcmp("GdkX11Display", displayTypeName) == 0)
#endif
{
return true; return true;
}
#endif #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.")); 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() bool wxTaskBarIconBase::IsAvailable()
{ {
#ifdef GDK_WINDOWING_X11 #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; return false;
#endif
char name[32]; char name[32];
g_snprintf(name, sizeof(name), "_NET_SYSTEM_TRAY_S%d", 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 #ifdef GDK_WINDOWING_X11
GdkDisplay* display = gdk_window_get_display(window); 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; return false;
#endif
static GdkAtom property = gdk_atom_intern("_NET_FRAME_EXTENTS", false); static GdkAtom property = gdk_atom_intern("_NET_FRAME_EXTENTS", false);
Atom xproperty = gdk_x11_atom_to_xatom_for_display(display, property); 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_signal_connect (m_widget, "key_press_event",
G_CALLBACK (wxgtk_tlw_key_press_event), NULL); 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 GDK_WINDOWING_X11
#ifdef __WXGTK3__ #ifdef __WXGTK3__
if (GDK_IS_X11_SCREEN(gtk_window_get_screen(GTK_WINDOW(m_widget)))) if (strcmp("GdkX11Display", displayTypeName) == 0)
#endif #endif
{ {
gtk_widget_add_events(m_widget, GDK_PROPERTY_CHANGE_MASK); gtk_widget_add_events(m_widget, GDK_PROPERTY_CHANGE_MASK);
@@ -806,7 +812,7 @@ bool wxTopLevelWindowGTK::Create( wxWindow *parent,
m_gdkDecor |= GDK_DECOR_TITLE; m_gdkDecor |= GDK_DECOR_TITLE;
#if GTK_CHECK_VERSION(3,10,0) #if GTK_CHECK_VERSION(3,10,0)
else if ( 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_check_version(3,10,0) == NULL)
{ {
gtk_window_set_titlebar(GTK_WINDOW(m_widget), gtk_header_bar_new()); 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; Window xroot = None;
wxX11FullScreenMethod method = wxX11_FS_WMSPEC; 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); xdpy = GDK_DISPLAY_XDISPLAY(display);
xroot = GDK_WINDOW_XID(gdk_screen_get_root_window(screen)); 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; bool deferShow = show && !m_isShown && !m_isIconized && m_deferShow;
if (deferShow) if (deferShow)
{ {
GdkScreen* screen = gtk_widget_get_screen(m_widget);
deferShow = m_deferShowAllowed && deferShow = m_deferShowAllowed &&
// Assume size (from cache or wxPersistentTLW) is correct. // Assume size (from cache or wxPersistentTLW) is correct.
// Avoids problems when WM initially provides an incorrect value // Avoids problems when WM initially provides an incorrect value
@@ -1056,7 +1065,9 @@ bool wxTopLevelWindowGTK::Show( bool show )
gs_requestFrameExtentsStatus != RFE_STATUS_BROKEN && gs_requestFrameExtentsStatus != RFE_STATUS_BROKEN &&
!gtk_widget_get_realized(m_widget) && !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, g_signal_handler_find(m_widget,
GSignalMatchType(G_SIGNAL_MATCH_ID | G_SIGNAL_MATCH_DATA), GSignalMatchType(G_SIGNAL_MATCH_ID | G_SIGNAL_MATCH_DATA),
g_signal_lookup("property_notify_event", GTK_TYPE_WIDGET), g_signal_lookup("property_notify_event", GTK_TYPE_WIDGET),
@@ -1068,7 +1079,6 @@ bool wxTopLevelWindowGTK::Show( bool show )
#endif #endif
if (deferShow) if (deferShow)
{ {
GdkScreen* screen = gtk_widget_get_screen(m_widget);
GdkAtom atom = gdk_atom_intern("_NET_REQUEST_FRAME_EXTENTS", false); GdkAtom atom = gdk_atom_intern("_NET_REQUEST_FRAME_EXTENTS", false);
deferShow = gdk_x11_screen_supports_net_wm_hint(screen, atom) != 0; deferShow = gdk_x11_screen_supports_net_wm_hint(screen, atom) != 0;

View File

@@ -83,15 +83,23 @@ wxDisplayInfo wxGetDisplayInfo()
{ {
wxDisplayInfo info = { NULL, wxDisplayNone }; wxDisplayInfo info = { NULL, wxDisplayNone };
GdkDisplay *display = gdk_window_get_display(wxGetTopLevelGDK()); 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 GDK_WINDOWING_X11
if (GDK_IS_X11_DISPLAY(display)) { #ifdef __WXGTK3__
if (strcmp("GdkX11Display", displayTypeName) == 0)
#endif
{
info.dpy = GDK_DISPLAY_XDISPLAY(display); info.dpy = GDK_DISPLAY_XDISPLAY(display);
info.type = wxDisplayX11; info.type = wxDisplayX11;
return info; return info;
} }
#endif #endif
#ifdef GDK_WINDOWING_WAYLAND #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.dpy = gdk_wayland_display_get_wl_display(display);
info.type = wxDisplayWayland; info.type = wxDisplayWayland;
return info; return info;

View File

@@ -1020,7 +1020,11 @@ wxTranslateGTKKeyEventToWx(wxKeyEvent& event,
} }
#ifdef GDK_WINDOWING_X11 #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 // 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 // pressed regardless of the state of the modifiers, i.e. on a