diff --git a/lcl/interfaces/qt/qtint.pp b/lcl/interfaces/qt/qtint.pp index 9056d76571..5217f6abed 100644 --- a/lcl/interfaces/qt/qtint.pp +++ b/lcl/interfaces/qt/qtint.pp @@ -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; diff --git a/lcl/interfaces/qt/qtobject.inc b/lcl/interfaces/qt/qtobject.inc index 11ed92c7a7..43623bfe23 100644 --- a/lcl/interfaces/qt/qtobject.inc +++ b/lcl/interfaces/qt/qtobject.inc @@ -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; {------------------------------------------------------------------------------ diff --git a/lcl/interfaces/qt/qtwidgets.pas b/lcl/interfaces/qt/qtwidgets.pas index 877697eb2f..2f675842d9 100644 --- a/lcl/interfaces/qt/qtwidgets.pas +++ b/lcl/interfaces/qt/qtwidgets.pas @@ -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,8 +4660,18 @@ begin (AOldState and QtWindowMaximized <> 0) or (AOldState and QtWindowFullScreen <> 0) then Application.IntfAppRestore; - end; - SlotWindowStateChange; + + {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, QEventDragMove,