Qt: fixed ugly behaviour of qt when switch virtual desktops.

git-svn-id: trunk@25464 -
This commit is contained in:
zeljko 2010-05-16 15:05:14 +00:00
parent 1c60a65b18
commit 3fc0e1c26e
3 changed files with 49 additions and 4 deletions

View File

@ -135,6 +135,9 @@ type
function DragImageList_DragMove(X, Y: Integer): Boolean;
function DragImageList_SetVisible(NewVisible: Boolean): Boolean;
public
{$IFDEF HASX11}
FLastMinimizeEvent: DWord; // track mainform minimize events -> TQtMainWindow.EventFilter
{$ENDIF}
function CreateDefaultFont: HFONT; virtual;
function GetQtDefaultDC: HDC; virtual;
procedure DeleteDefaultDC; virtual;

View File

@ -38,6 +38,9 @@ begin
System.InitCriticalSection(CriticalSection);
SavedHandlesList := TMap.Create(TMapIdType(ituPtrSize), SizeOf(TObject));
FSocketEventMap := TMap.Create(TMapIdType(its4), SizeOf(Pointer));
{$IFDEF HASX11}
FLastMinimizeEvent := 0;
{$ENDIF}
end;
{------------------------------------------------------------------------------

View File

@ -4594,6 +4594,22 @@ var
AStateEvent: QWindowStateChangeEventH;
AState: QtWindowStates;
AOldState: QtWindowStates;
{$IFDEF HASX11}
CurrTickCount: DWord;
IsMinimizeEvent: Boolean;
function CanAppMinimize: Boolean;
begin
Result := (CurrTickCount - QtWidgetSet.FLastMinimizeEvent) = 0;
if not Result then
begin
// we can call it from LCL so it's allowed.
// but in any case reset FLastMinimizeEvent
Result := not QEvent_spontaneous(Event);
QtWidgetSet.FLastMinimizeEvent := 0;
end;
end;
{$ENDIF}
begin
Result := False;
QEvent_accept(Event);
@ -4616,13 +4632,26 @@ begin
end;
end;
end;
QEventWindowStateChange:
begin
{$IFDEF HASX11}
// for X11 we must ask state of each modified window.
AState := getWindowState;
IsMinimizeEvent := AState and QtWindowMinimized <> 0;
if IsMinimizeEvent then
begin
CurrTickCount := GetTickCount;
if (QtWidgetSet.FLastMinimizeEvent + 100 < CurrTickCount) or
(QtWidgetSet.FLastMinimizeEvent = 0) then
QtWidgetSet.FLastMinimizeEvent := CurrTickCount;
end;
{$ENDIF}
if IsMainForm then
begin
AStateEvent := QWindowStateChangeEventH(Event);
{$IFNDEF HASX11}
AState := getWindowState;
{$ENDIF}
AStateEvent := QWindowStateChangeEventH(Event);
AOldState := QWindowStateChangeEvent_oldState(AStateEvent);
if AState and QtWindowMinimized <> 0 then
Application.IntfAppMinimize
@ -4631,7 +4660,17 @@ begin
(AOldState and QtWindowMaximized <> 0) or
(AOldState and QtWindowFullScreen <> 0) then
Application.IntfAppRestore;
end;
{FLastMinimizeEvent fixes problem when we switch virtual
desktops under X11.
X11 pager minimizes all windows, so we shouldn't do that again,
otherwise when restoring app (again back to our virtual desktop)
we'll see ugly restoring of last active control)}
{$IFDEF HASX11}
if not IsMinimizeEvent or (IsMinimizeEvent and CanAppMinimize) then
{$ENDIF}
SlotWindowStateChange;
end else
SlotWindowStateChange;
end;
QEventDrop,