From d3af90a31d41bd1785aefd37c11bb4fd76130e3e Mon Sep 17 00:00:00 2001 From: zeljko Date: Tue, 6 Jul 2010 09:27:17 +0000 Subject: [PATCH] Qt: added X11 selection lock,so we don't ask QMimeData when selection changes in case of native dialogs.fixes #16625 git-svn-id: trunk@26478 - --- lcl/interfaces/qt/qtobjects.pas | 22 ++++++++++++++++++++++ lcl/interfaces/qt/qtwsdialogs.pp | 16 ++++++++++++---- 2 files changed, 34 insertions(+), 4 deletions(-) diff --git a/lcl/interfaces/qt/qtobjects.pas b/lcl/interfaces/qt/qtobjects.pas index d79646ea17..890a8498d1 100644 --- a/lcl/interfaces/qt/qtobjects.pas +++ b/lcl/interfaces/qt/qtobjects.pas @@ -516,6 +516,7 @@ type FClipSelectionChangedHook: QClipboard_hookH; FSelTimer: TQtTimer; // timer for keyboard X11 selection FSelFmtCount: Integer; + FLockX11Selection: Integer; {$ENDIF} FClipChanged: Boolean; FClipBoardFormats: TStringList; @@ -544,6 +545,9 @@ type procedure signalDataChanged; cdecl; {$IFDEF HASX11} + procedure BeginX11SelectionLock; + procedure EndX11SelectionLock; + function InX11SelectionLock: Boolean; procedure signalSelectionChanged; cdecl; procedure selectionTimer; {$ENDIF} @@ -3286,6 +3290,7 @@ begin FClipBoardFormats.Add('foo'); // 0 is reserved TheObject := QApplication_clipBoard; {$IFDEF HASX11} + FLockX11Selection := 0; FSelTimer := TQtTimer.CreateTimer(10, @selectionTimer, TheObject); {$ENDIF} AttachEvents; @@ -3323,6 +3328,21 @@ begin end; {$IFDEF HASX11} +procedure TQtClipboard.BeginX11SelectionLock; +begin + inc(FLockX11Selection); +end; + +procedure TQtClipboard.EndX11SelectionLock; +begin + dec(FLockX11Selection); +end; + +function TQtClipboard.InX11SelectionLock: Boolean; +begin + Result := FLockX11Selection > 0; +end; + procedure TQtClipboard.signalSelectionChanged; cdecl; var TempMimeData: QMimeDataH; @@ -3333,6 +3353,8 @@ begin writeln('signalSelectionChanged() OWNER?=', QClipboard_ownsSelection(Self.clipboard), ' FOnClipBoardRequest ? ',FOnClipBoardRequest[ctPrimarySelection] <> nil); {$ENDIF} + if InX11SelectionLock then + exit; TempMimeData := getMimeData(QClipboardSelection); if (TempMimeData <> nil) and (QMimeData_hasText(TempMimeData) or QMimeData_hasHtml(TempMimeData) or diff --git a/lcl/interfaces/qt/qtwsdialogs.pp b/lcl/interfaces/qt/qtwsdialogs.pp index 223ebe9246..7e7c36838f 100644 --- a/lcl/interfaces/qt/qtwsdialogs.pp +++ b/lcl/interfaces/qt/qtwsdialogs.pp @@ -388,10 +388,18 @@ begin Flags := 0; if not (ofOverwritePrompt in TSaveDialog(FileDialog).Options) then Flags := Flags or QFileDialogDontConfirmOverwrite; - - QFileDialog_getSaveFileName(@ReturnText, - QWidget_parentWidget(QtFileDialog.Widget), @SaveTitle, @saveFileName, - @saveFilter, @selectedFilter, Flags); + {$IFDEF HASX11} + Clipboard.BeginX11SelectionLock; + try + {$ENDIF} + QFileDialog_getSaveFileName(@ReturnText, + QWidget_parentWidget(QtFileDialog.Widget), @SaveTitle, @saveFileName, + @saveFilter, @selectedFilter, Flags); + {$IFDEF HASX11} + finally + Clipboard.EndX11SelectionLock; + end; + {$ENDIF} if ReturnText <> '' then begin