From 762fad420e6dbc139c4d8949bd7b2263ef3891aa Mon Sep 17 00:00:00 2001 From: Uladzimir Karpenka Date: Tue, 26 May 2026 11:06:55 +0300 Subject: [PATCH] Guard OpenGL mode on native Wayland --- MainForm.pas | 17 +++++++++++++++++ PlatformUtils.pas | 42 ++++++++++++++++++++++++++++++++++++++++++ ewsdr.lpi | 4 ++++ 3 files changed, 63 insertions(+) create mode 100644 PlatformUtils.pas diff --git a/MainForm.pas b/MainForm.pas index dbe7be8..866779c 100644 --- a/MainForm.pas +++ b/MainForm.pas @@ -35,6 +35,7 @@ uses CATEngine, CATSerial, CATTcp, SpectrumView, SpectrumViewOpengl, StatusBar, + PlatformUtils, WinFirewall; const @@ -1469,6 +1470,22 @@ begin FSplitterDrag := False; FUseOpenGLSpectrum := HasOpenGLSpectrumSwitch; + if FUseOpenGLSpectrum and (not QtPlatformAllowsOpenGLControls) then + begin + MessageDlg('OpenGL rendering disabled', + 'OpenGL rendering is not available in the current Qt Wayland mode.' + LineEnding + + LineEnding + + 'The Lazarus/LCL Qt6 OpenGL control used by EWSDR requires an X11 display handle, ' + + 'but the native Wayland backend does not provide one. Using it here can cause an access violation during startup.' + + LineEnding + + LineEnding + + 'To run EWSDR with OpenGL rendering, start it through XWayland:' + LineEnding + + 'QT_QPA_PLATFORM=xcb ./ewsdr --opengl' + LineEnding + + LineEnding + + 'OpenGL rendering will be disabled for this session.', + mtWarning, [mbOK], 0); + FUseOpenGLSpectrum := False; + end; if FUseOpenGLSpectrum then FWaterfallFrameInterval := 1; if FUseOpenGLSpectrum then diff --git a/PlatformUtils.pas b/PlatformUtils.pas new file mode 100644 index 0000000..0ab1404 --- /dev/null +++ b/PlatformUtils.pas @@ -0,0 +1,42 @@ +unit PlatformUtils; + +{ + PlatformUtils.pas - small helpers for desktop/runtime platform checks. +} + +{$IFDEF FPC} + {$MODE Delphi} +{$ENDIF} + +interface + +function QtPlatformAllowsOpenGLControls: Boolean; + +implementation + +uses + SysUtils; + +function QtPlatformAllowsOpenGLControls: Boolean; +var + Qpa, FirstQpa, SessionType: string; + Sep: Integer; +begin + Result := True; + Qpa := LowerCase(Trim(GetEnvironmentVariable('QT_QPA_PLATFORM'))); + SessionType := LowerCase(Trim(GetEnvironmentVariable('XDG_SESSION_TYPE'))); + + if Qpa <> '' then + begin + FirstQpa := Qpa; + Sep := Pos(';', FirstQpa); + if Sep > 0 then + FirstQpa := Copy(FirstQpa, 1, Sep - 1); + Result := FirstQpa <> 'wayland'; + Exit; + end; + + Result := SessionType <> 'wayland'; +end; + +end. diff --git a/ewsdr.lpi b/ewsdr.lpi index f094009..55ed8f9 100644 --- a/ewsdr.lpi +++ b/ewsdr.lpi @@ -210,6 +210,10 @@ + + + +