秋·风

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
  278 随笔 :: 0 文章 :: 308 评论 :: 20万 阅读
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
lazarus编译的程序在树莓派运行前先出一个空白窗口,要关闭这个窗口后才能显示正常的窗体(使用wayland窗口类型的linux也可能存在同样情况)
Gtk2: better recognition of wayland session, do not create dummy frame. (54ba042f) · 提交 · FPC / Lazarus / Lazarus · GitLab
以下是官方的修改方法(lazarus 4.0RC1),其他版本可以参考修改:
1、lcl/interfaces/gtk2/gtk2int.pas
在79行添加红色代码:
复制代码
    {$IFNDEF USE_GTK_MAIN_OLD_ITERATION}
    FMainPoll: PGPollFD;
    {$ENDIF}
    {$IFDEF HASX}
    FIsWayland: boolean;
    {$ENDIF}
    FIsLibraryInstance: Boolean;
    FGtkTerminated: Boolean;
    FMultiThreadingEnabled: boolean;
复制代码

在321行添加红色代码:

复制代码
  public
    {$IFDEF HASX}
    function CreateDummyWidgetFrame(const ALeft, ATop, AWidth,
      AHeight: integer): boolean;
    function GetDummyWidgetFrame: TRect;

    function compositeManagerRunning: Boolean;
    function GetDesktopWidget: PGtkWidget;
    //function X11Raise(AHandle: HWND): boolean; currently not used
    function GetWindowManager: String;
    function IsWayland: boolean;
    function IsCurrentDesktop(AWindow: PGdkWindow): Boolean;
    function X11GetActiveWindow: HWND;
    function GetAlwaysOnTopX11(AWindow: PGdkWindow): boolean;
    procedure HideAllHints;
    procedure RestoreAllHints;
    {$ENDIF}
    procedure StartFocusTimer;
复制代码

2、lcl/interfaces/gtk2/gtk2widgetset.inc
在1537行添加红色代码:

复制代码
  FIsLibraryInstance := False;
  FGtkTerminated := False;
  {$IFDEF HASX}
  FIsWayland := UTF8LowerCase(GetEnvironmentVariableUTF8('XDG_SESSION_TYPE')) = 'wayland';
  {$ELSE}
  FIsWayland := False;
  {$ENDIF}

  {$IFDEF EnabledGtkThreading}
    {$IFNDEF Win32}
复制代码

修改红色代码(1942行):

复制代码
function TGtk2WidgetSet.CreateDummyWidgetFrame(const ALeft, ATop, AWidth,
  AHeight: integer): boolean;
var
  ADummy: TDummyWidget;
  WM: String;
begin
  Result := False;
  WM := GetWindowManager;
  if (WM = '') or (WM = 'wayland') or IsWayland then
    exit;
  ADummy := TDummyWidget.Create;
  ADummy.ShowDummyWidget(ALeft, ATop, AWidth, AHeight);
  FWSFrameRect := ADummy.GetWidgetFrame;
  ADummy.Free;
  Result := not IsRectEmpty(FWSFrameRect);
end;
复制代码

添加红色代码(4641行)

function TGtk2WidgetSet.IsWayland: boolean;
begin
  Result := FIsWayland;
end;

function TGtk2WidgetSet.X11GetActiveWindow: HWND;
var
  Display: PDisplay;

3、 lcl/interfaces/gtk2/gtk2wsforms.pp
修改红色代码(428行)

  end;

{$IFDEF HASX}
  if (AWinControl = Application.MainForm) and not Gtk2WidgetSet.IsWayland and
    not Application.HasOption('disableaccurateframe') then
      Gtk2WidgetSet.CreateDummyWidgetFrame(-1, -1, -1, -1);
{$ENDIF}

按上述修改后重新编译应用就可以。

posted on   秋·风  阅读(123)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 从HTTP原因短语缺失研究HTTP/2和HTTP/3的设计差异
· 三行代码完成国际化适配,妙~啊~
历史上的今天:
2022-11-19 fpjson使用例子【转】
点击右上角即可分享
微信分享提示