mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-08-18 14:59:08 +02:00
Qt: fixed visibility of THintWindow class when virtual desktop is switched or application minimized.issue #24363
git-svn-id: trunk@40995 -
This commit is contained in:
parent
7aabf4415d
commit
efb76fb76b
@ -87,6 +87,7 @@ type
|
|||||||
FSysColorBrushes: array[0..MAX_SYS_COLORS] of HBrush;
|
FSysColorBrushes: array[0..MAX_SYS_COLORS] of HBrush;
|
||||||
|
|
||||||
{$IFDEF HASX11}
|
{$IFDEF HASX11}
|
||||||
|
SavedHintHandlesList: TFPList;
|
||||||
FWindowManagerName: String; // Track various incompatibilities between WM. Initialized at WS start.
|
FWindowManagerName: String; // Track various incompatibilities between WM. Initialized at WS start.
|
||||||
{$ENDIF}
|
{$ENDIF}
|
||||||
|
|
||||||
@ -159,6 +160,15 @@ type
|
|||||||
procedure RemoveHandle(AHandle: TObject);
|
procedure RemoveHandle(AHandle: TObject);
|
||||||
function IsValidHandle(AHandle: HWND): Boolean;
|
function IsValidHandle(AHandle: HWND): Boolean;
|
||||||
|
|
||||||
|
{$IFDEF HASX11}
|
||||||
|
// qt hints handles map (needed on X11 only)
|
||||||
|
procedure AddHintHandle(AHandle: TObject);
|
||||||
|
procedure RemoveHintHandle(AHandle: TObject);
|
||||||
|
function IsValidHintHandle(AHandle: TObject): Boolean;
|
||||||
|
procedure HideAllHints;
|
||||||
|
procedure RestoreAllHints;
|
||||||
|
{$ENDIF}
|
||||||
|
|
||||||
// application global actions (mainform mainmenu mnemonics Alt+XX)
|
// application global actions (mainform mainmenu mnemonics Alt+XX)
|
||||||
procedure ClearGlobalActions;
|
procedure ClearGlobalActions;
|
||||||
procedure AddGlobalAction(AnAction: QActionH);
|
procedure AddGlobalAction(AnAction: QActionH);
|
||||||
|
@ -100,6 +100,7 @@ begin
|
|||||||
StayOnTopList := nil;
|
StayOnTopList := nil;
|
||||||
FAppActive := False;
|
FAppActive := False;
|
||||||
{$IFDEF HASX11}
|
{$IFDEF HASX11}
|
||||||
|
SavedHintHandlesList := TFPList.Create;
|
||||||
FMinimizedByPager := False;
|
FMinimizedByPager := False;
|
||||||
FLastMinimizeEvent := 0;
|
FLastMinimizeEvent := 0;
|
||||||
if not FIsLibraryInstance and
|
if not FIsLibraryInstance and
|
||||||
@ -152,6 +153,13 @@ begin
|
|||||||
SavedHandlesList.Free;
|
SavedHandlesList.Free;
|
||||||
SavedHandlesList := nil;
|
SavedHandlesList := nil;
|
||||||
end;
|
end;
|
||||||
|
{$IFDEF HASX11}
|
||||||
|
if SavedHintHandlesList <> nil then
|
||||||
|
begin
|
||||||
|
SavedHintHandlesList.Free;
|
||||||
|
SavedHintHandlesList := nil;
|
||||||
|
end;
|
||||||
|
{$ENDIF}
|
||||||
FSocketEventMap.Free;
|
FSocketEventMap.Free;
|
||||||
FGlobalActions.Free;
|
FGlobalActions.Free;
|
||||||
|
|
||||||
@ -309,6 +317,7 @@ begin
|
|||||||
if (Application.MainForm <> nil) and (Application.MainForm.HandleAllocated) then
|
if (Application.MainForm <> nil) and (Application.MainForm.HandleAllocated) then
|
||||||
begin
|
begin
|
||||||
{$IFDEF HASX11}
|
{$IFDEF HASX11}
|
||||||
|
HideAllHints;
|
||||||
for i := 0 to Screen.CustomFormZOrderCount-1 do
|
for i := 0 to Screen.CustomFormZOrderCount-1 do
|
||||||
begin
|
begin
|
||||||
AForm := Screen.CustomFormsZOrdered[i];
|
AForm := Screen.CustomFormsZOrdered[i];
|
||||||
@ -353,6 +362,7 @@ begin
|
|||||||
TQtMainWindow(AForm.Handle).setWindowState(States and not QtWindowMinimized);
|
TQtMainWindow(AForm.Handle).setWindowState(States and not QtWindowMinimized);
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
RestoreAllHints;
|
||||||
{$ELSE}
|
{$ELSE}
|
||||||
TQtMainWindow(Application.MainForm.Handle).ShowNormal;
|
TQtMainWindow(Application.MainForm.Handle).ShowNormal;
|
||||||
{$ENDIF}
|
{$ENDIF}
|
||||||
@ -1065,6 +1075,86 @@ begin
|
|||||||
System.LeaveCriticalsection(CriticalSection);
|
System.LeaveCriticalsection(CriticalSection);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
{$IFDEF HASX11}
|
||||||
|
procedure TQtWidgetSet.AddHintHandle(AHandle: TObject);
|
||||||
|
begin
|
||||||
|
System.EnterCriticalsection(CriticalSection);
|
||||||
|
if SavedHintHandlesList.IndexOf(AHandle) < 0 then
|
||||||
|
SavedHintHandlesList.Add(AHandle);
|
||||||
|
System.LeaveCriticalsection(CriticalSection);
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TQtWidgetSet.RemoveHintHandle(AHandle: TObject);
|
||||||
|
var
|
||||||
|
AIndex: Integer;
|
||||||
|
begin
|
||||||
|
System.EnterCriticalsection(CriticalSection);
|
||||||
|
AIndex := SavedHintHandlesList.IndexOf(AHandle);
|
||||||
|
if AIndex >= 0 then
|
||||||
|
SavedHintHandlesList.Delete(AIndex);
|
||||||
|
System.LeaveCriticalsection(CriticalSection);
|
||||||
|
end;
|
||||||
|
|
||||||
|
function TQtWidgetSet.IsValidHintHandle(AHandle: TObject): Boolean;
|
||||||
|
begin
|
||||||
|
if (AHandle = nil) then
|
||||||
|
Exit(False);
|
||||||
|
System.EnterCriticalsection(CriticalSection);
|
||||||
|
Result := SavedHintHandlesList.IndexOf(AHandle) >= 0;
|
||||||
|
System.LeaveCriticalsection(CriticalSection);
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TQtWidgetSet.HideAllHints;
|
||||||
|
var
|
||||||
|
i: Integer;
|
||||||
|
AWidget: TQtHintWindow;
|
||||||
|
begin
|
||||||
|
System.EnterCriticalsection(CriticalSection);
|
||||||
|
try
|
||||||
|
if not Assigned(SavedHintHandlesList) then
|
||||||
|
exit;
|
||||||
|
for i := SavedHintHandlesList.Count - 1 downto 0 do
|
||||||
|
begin
|
||||||
|
if IsValidHintHandle(TObject(SavedHintHandlesList.Items[i])) then
|
||||||
|
begin
|
||||||
|
AWidget := TQtHintWindow(SavedHintHandlesList.Items[i]);
|
||||||
|
AWidget.NeedRestoreVisible := AWidget.getVisible;
|
||||||
|
AWidget.Hide;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
finally
|
||||||
|
System.LeaveCriticalsection(CriticalSection);
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TQtWidgetSet.RestoreAllHints;
|
||||||
|
var
|
||||||
|
i: Integer;
|
||||||
|
AWidget: TQtHintWindow;
|
||||||
|
begin
|
||||||
|
System.EnterCriticalsection(CriticalSection);
|
||||||
|
try
|
||||||
|
if not Assigned(SavedHintHandlesList) then
|
||||||
|
exit;
|
||||||
|
for i := SavedHintHandlesList.Count - 1 downto 0 do
|
||||||
|
begin
|
||||||
|
if IsValidHintHandle(TObject(SavedHintHandlesList.Items[i])) then
|
||||||
|
begin
|
||||||
|
AWidget := TQtHintWindow(SavedHintHandlesList.Items[i]);
|
||||||
|
if AWidget.NeedRestoreVisible then
|
||||||
|
begin
|
||||||
|
AWidget.NeedRestoreVisible := False;
|
||||||
|
AWidget.Show;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
finally
|
||||||
|
System.LeaveCriticalsection(CriticalSection);
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
{$ENDIF}
|
||||||
|
|
||||||
procedure TQtWidgetSet.ClearGlobalActions;
|
procedure TQtWidgetSet.ClearGlobalActions;
|
||||||
begin
|
begin
|
||||||
{$IFDEF QT_DEBUG_GLOBALACTIONS}
|
{$IFDEF QT_DEBUG_GLOBALACTIONS}
|
||||||
|
@ -175,7 +175,7 @@ type
|
|||||||
constructor Create(const AWinControl: TWinControl; const AParams: TCreateParams); virtual; overload;
|
constructor Create(const AWinControl: TWinControl; const AParams: TCreateParams); virtual; overload;
|
||||||
constructor CreateFrom(const AWinControl: TWinControl; AWidget: QWidgetH); virtual;
|
constructor CreateFrom(const AWinControl: TWinControl; AWidget: QWidgetH); virtual;
|
||||||
procedure InitializeWidget; virtual;
|
procedure InitializeWidget; virtual;
|
||||||
procedure DeInitializeWidget;
|
procedure DeInitializeWidget; virtual;
|
||||||
procedure RecreateWidget;
|
procedure RecreateWidget;
|
||||||
procedure DestroyNotify(AWidget: TQtWidget); virtual;
|
procedure DestroyNotify(AWidget: TQtWidget); virtual;
|
||||||
|
|
||||||
@ -642,11 +642,16 @@ type
|
|||||||
{ TQtHintWindow }
|
{ TQtHintWindow }
|
||||||
|
|
||||||
TQtHintWindow = class(TQtMainWindow)
|
TQtHintWindow = class(TQtMainWindow)
|
||||||
|
private
|
||||||
|
FNeedRestoreVisible: Boolean;
|
||||||
protected
|
protected
|
||||||
function CreateWidget(const AParams: TCreateParams): QWidgetH; override;
|
function CreateWidget(const AParams: TCreateParams): QWidgetH; override;
|
||||||
public
|
public
|
||||||
|
procedure InitializeWidget; override;
|
||||||
|
procedure DeInitializeWidget; override;
|
||||||
procedure SetDefaultColorRoles; override;
|
procedure SetDefaultColorRoles; override;
|
||||||
procedure setVisible(AVisible: Boolean); override;
|
procedure setVisible(AVisible: Boolean); override;
|
||||||
|
property NeedRestoreVisible: Boolean read FNeedRestoreVisible write FNeedRestoreVisible;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
{ TQtStaticText }
|
{ TQtStaticText }
|
||||||
@ -6220,11 +6225,14 @@ begin
|
|||||||
{$IFDEF HASX11}
|
{$IFDEF HASX11}
|
||||||
// for X11 we must ask state of each modified window.
|
// for X11 we must ask state of each modified window.
|
||||||
AState := getWindowState;
|
AState := getWindowState;
|
||||||
|
|
||||||
IsMinimizeEvent := AState and QtWindowMinimized <> 0;
|
IsMinimizeEvent := AState and QtWindowMinimized <> 0;
|
||||||
if IsMinimizeEvent then
|
if IsMinimizeEvent then
|
||||||
begin
|
begin
|
||||||
CanSendEvent := IsCurrentDesktop(Widget);
|
CanSendEvent := IsCurrentDesktop(Widget);
|
||||||
QtWidgetSet.FMinimizedByPager := not CanSendEvent;
|
QtWidgetSet.FMinimizedByPager := not CanSendEvent;
|
||||||
|
if IsMainForm and QtWidgetSet.FMinimizedByPager then
|
||||||
|
QtWidgetSet.HideAllHints;
|
||||||
end;
|
end;
|
||||||
{$ENDIF}
|
{$ENDIF}
|
||||||
if IsMainForm and CanSendEvent then
|
if IsMainForm and CanSendEvent then
|
||||||
@ -6292,8 +6300,10 @@ begin
|
|||||||
// pager switch !
|
// pager switch !
|
||||||
if (AOldState and QtWindowMinimized <> 0) and
|
if (AOldState and QtWindowMinimized <> 0) and
|
||||||
QtWidgetSet.FMinimizedByPager then
|
QtWidgetSet.FMinimizedByPager then
|
||||||
QtWidgetSet.FMinimizedByPager := False
|
begin
|
||||||
else
|
QtWidgetSet.FMinimizedByPager := False;
|
||||||
|
QtWidgetSet.RestoreAllHints;
|
||||||
|
end else
|
||||||
{$ENDIF}
|
{$ENDIF}
|
||||||
Application.IntfAppRestore;
|
Application.IntfAppRestore;
|
||||||
{$ENDIF}
|
{$ENDIF}
|
||||||
@ -15486,6 +15496,7 @@ var
|
|||||||
Parent: QWidgetH;
|
Parent: QWidgetH;
|
||||||
begin
|
begin
|
||||||
FHasPaint := True;
|
FHasPaint := True;
|
||||||
|
FNeedRestoreVisible := False;
|
||||||
if AParams.WndParent <> 0 then
|
if AParams.WndParent <> 0 then
|
||||||
Parent := TQtWidget(AParams.WndParent).GetContainerWidget
|
Parent := TQtWidget(AParams.WndParent).GetContainerWidget
|
||||||
else
|
else
|
||||||
@ -15495,6 +15506,22 @@ begin
|
|||||||
MenuBar := nil;
|
MenuBar := nil;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
procedure TQtHintWindow.InitializeWidget;
|
||||||
|
begin
|
||||||
|
inherited InitializeWidget;
|
||||||
|
{$IFDEF HASX11}
|
||||||
|
QtWidgetSet.AddHintHandle(Self);
|
||||||
|
{$ENDIF}
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TQtHintWindow.DeInitializeWidget;
|
||||||
|
begin
|
||||||
|
{$IFDEF HASX11}
|
||||||
|
QtWidgetSet.RemoveHintHandle(Self);
|
||||||
|
{$ENDIF}
|
||||||
|
inherited DeInitializeWidget;
|
||||||
|
end;
|
||||||
|
|
||||||
procedure TQtHintWindow.SetDefaultColorRoles;
|
procedure TQtHintWindow.SetDefaultColorRoles;
|
||||||
begin
|
begin
|
||||||
WidgetColorRole := QPaletteToolTipBase;
|
WidgetColorRole := QPaletteToolTipBase;
|
||||||
|
Loading…
Reference in New Issue
Block a user