Launch on xwayland under Wayland if no EGL

On initialization, if wxWidgets was compiled without EGL support, check
in environment variables if running under Wayland and if so tell GDK to
prefer using an X11 backend, causing the program to launch under
xwayland.

Fix #1028

Signed-off-by: Rafael Kitover <rkitover@gmail.com>
This commit is contained in:
Rafael Kitover 2023-09-11 00:18:13 +00:00 committed by Fabrice de Gans
parent 93a24bee3c
commit aca206a721
1 changed files with 13 additions and 0 deletions

View File

@ -47,6 +47,10 @@
#include "widgets/user-input-ctrl.h" #include "widgets/user-input-ctrl.h"
#include "wxhead.h" #include "wxhead.h"
#ifdef __WXGTK__
#include <gdk/gdk.h>
#endif
namespace { namespace {
// Resets the accelerator text for `menu_item` to the first keyboard input. // Resets the accelerator text for `menu_item` to the first keyboard input.
@ -136,6 +140,15 @@ int main(int argc, char** argv) {
wxLog::SetLogLevel(wxLOG_Info); wxLog::SetLogLevel(wxLOG_Info);
#endif // DEBUG #endif // DEBUG
// Launch under xwayland on Wayland if EGL is not available.
#if defined(__WXGTK__) && !defined(HAVE_WAYLAND_EGL)
wxString xdg_session_type = wxGetenv("XDG_SESSION_TYPE");
wxString wayland_display = wxGetenv("WAYLAND_DISPLAY");
if (xdg_session_type == "wayland" || wayland_display.Contains("wayland"))
gdk_set_allowed_backends("x11,*");
#endif
// This will be freed on wxEntry exit. // This will be freed on wxEntry exit.
wxApp::SetInstance(new wxvbamApp()); wxApp::SetInstance(new wxvbamApp());
return wxEntry(argc, argv); return wxEntry(argc, argv);