mirror of
https://gitlab.com/freepascal.org/lazarus/lazarus.git
synced 2025-08-17 17:39:20 +02:00
Qt: added one way selection clipboard (native qt control or another app -> lcl, doesn't work yet from eg. synedit -> qt, datasize is 0 for some reason).
git-svn-id: trunk@25666 -
This commit is contained in:
parent
564049643d
commit
444245d7dc
@ -516,7 +516,7 @@ type
|
|||||||
{$ENDIF}
|
{$ENDIF}
|
||||||
FClipChanged: Boolean;
|
FClipChanged: Boolean;
|
||||||
FClipBoardFormats: TStringList;
|
FClipBoardFormats: TStringList;
|
||||||
FOnClipBoardRequest: TClipboardRequestEvent;
|
FOnClipBoardRequest: Array[TClipBoardType] of TClipboardRequestEvent;
|
||||||
function IsClipboardChanged: Boolean;
|
function IsClipboardChanged: Boolean;
|
||||||
public
|
public
|
||||||
constructor Create; override;
|
constructor Create; override;
|
||||||
@ -3262,10 +3262,13 @@ end;
|
|||||||
{ TQtClipboard }
|
{ TQtClipboard }
|
||||||
|
|
||||||
constructor TQtClipboard.Create;
|
constructor TQtClipboard.Create;
|
||||||
|
var
|
||||||
|
ClipboardType: TClipboardType;
|
||||||
begin
|
begin
|
||||||
inherited Create;
|
inherited Create;
|
||||||
FLockClip := False;
|
FLockClip := False;
|
||||||
FOnClipBoardRequest := nil;
|
for ClipboardType := Low(TClipBoardType) to High(TClipBoardType) do
|
||||||
|
FOnClipBoardRequest[ClipBoardType] := nil;
|
||||||
FClipBoardFormats := TStringList.Create;
|
FClipBoardFormats := TStringList.Create;
|
||||||
FClipBoardFormats.Add('foo'); // 0 is reserved
|
FClipBoardFormats.Add('foo'); // 0 is reserved
|
||||||
TheObject := QApplication_clipBoard;
|
TheObject := QApplication_clipBoard;
|
||||||
@ -3301,10 +3304,30 @@ end;
|
|||||||
|
|
||||||
{$IFDEF HASX11}
|
{$IFDEF HASX11}
|
||||||
procedure TQtClipboard.signalSelectionChanged; cdecl;
|
procedure TQtClipboard.signalSelectionChanged; cdecl;
|
||||||
|
var
|
||||||
|
TempMimeData: QMimeDataH;
|
||||||
|
WStr: WideString;
|
||||||
|
MimeType: WideString;
|
||||||
|
Clip: TClipBoard;
|
||||||
begin
|
begin
|
||||||
{$IFDEF VERBOSE_QT_CLIPBOARD}
|
{$IFDEF VERBOSE_QT_CLIPBOARD}
|
||||||
writeln('signalSelectionChanged()');
|
writeln('signalSelectionChanged() OWNER?=', QClipboard_ownsSelection(Self.clipboard),
|
||||||
|
' FOnClipBoardRequest ? ',FOnClipBoardRequest[ctPrimarySelection] <> nil);
|
||||||
{$ENDIF}
|
{$ENDIF}
|
||||||
|
TempMimeData := getMimeData(QClipboardSelection);
|
||||||
|
if (TempMimeData <> nil) and
|
||||||
|
(QMimeData_hasText(TempMimeData) or QMimeData_hasHtml(TempMimeData) or
|
||||||
|
QMimeData_hasURLS(TempMimeData)) then
|
||||||
|
begin
|
||||||
|
QMimeData_text(TempMimeData, @WStr);
|
||||||
|
WStr := UTF16ToUTF8(WStr);
|
||||||
|
// TODO: We don't get any data when copying to clip
|
||||||
|
// so must set it like this , so at least copying from
|
||||||
|
// another app here works correct.Later signalSelectionChanged
|
||||||
|
// can be removed
|
||||||
|
// if QClipboard_ownsSelection(Self.Clipboard) then
|
||||||
|
ClipBrd.PrimarySelection.AsText := WStr;
|
||||||
|
end;
|
||||||
end;
|
end;
|
||||||
{$ENDIF}
|
{$ENDIF}
|
||||||
|
|
||||||
@ -3466,20 +3489,18 @@ function TQtClipboard.GetOwnerShip(ClipboardType: TClipboardType;
|
|||||||
begin
|
begin
|
||||||
MimeData := QMimeData_create();
|
MimeData := QMimeData_create();
|
||||||
DataStream := TMemoryStream.Create;
|
DataStream := TMemoryStream.Create;
|
||||||
|
|
||||||
for I := 0 to FormatCount - 1 do
|
for I := 0 to FormatCount - 1 do
|
||||||
begin
|
begin
|
||||||
DataStream.Size := 0;
|
DataStream.Size := 0;
|
||||||
DataStream.Position := 0;
|
DataStream.Position := 0;
|
||||||
MimeType := FormatToMimeType(Formats[I]);
|
MimeType := FormatToMimeType(Formats[I]);
|
||||||
FOnClipBoardRequest(Formats[I], DataStream);
|
FOnClipBoardRequest[ClipboardType](Formats[I], DataStream);
|
||||||
Data := QByteArray_create(PAnsiChar(DataStream.Memory), DataStream.Size);
|
Data := QByteArray_create(PAnsiChar(DataStream.Memory), DataStream.Size);
|
||||||
if (QByteArray_length(Data) > 1) and QByteArray_endsWith(Data, #0) then
|
if (QByteArray_length(Data) > 1) and QByteArray_endsWith(Data, #0) then
|
||||||
QByteArray_chop(Data, 1);
|
QByteArray_chop(Data, 1);
|
||||||
QMimeData_setData(MimeData, @MimeType, Data);
|
QMimeData_setData(MimeData, @MimeType, Data);
|
||||||
QByteArray_destroy(Data);
|
QByteArray_destroy(Data);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
DataStream.Free;
|
DataStream.Free;
|
||||||
setMimeData(MimeData, ClipbBoardTypeToQtClipboard[ClipBoardType]);
|
setMimeData(MimeData, ClipbBoardTypeToQtClipboard[ClipBoardType]);
|
||||||
// do not destroy MimeData!!!
|
// do not destroy MimeData!!!
|
||||||
@ -3490,7 +3511,7 @@ begin
|
|||||||
begin
|
begin
|
||||||
{ The LCL indicates it doesn't have the clipboard data anymore
|
{ The LCL indicates it doesn't have the clipboard data anymore
|
||||||
and the interface can't use the OnRequestProc anymore.}
|
and the interface can't use the OnRequestProc anymore.}
|
||||||
FOnClipBoardRequest := nil;
|
FOnClipBoardRequest[ClipboardType] := nil;
|
||||||
Result := True;
|
Result := True;
|
||||||
end else
|
end else
|
||||||
begin
|
begin
|
||||||
@ -3501,8 +3522,8 @@ begin
|
|||||||
try
|
try
|
||||||
{ clear OnClipBoardRequest to prevent destroying the LCL clipboard,
|
{ clear OnClipBoardRequest to prevent destroying the LCL clipboard,
|
||||||
when emptying the clipboard}
|
when emptying the clipboard}
|
||||||
FOnClipBoardRequest := nil;
|
FOnClipBoardRequest[ClipBoardType] := nil;
|
||||||
FOnClipBoardRequest := OnRequestProc;
|
FOnClipBoardRequest[ClipBoardType] := OnRequestProc;
|
||||||
PutOnClipBoard;
|
PutOnClipBoard;
|
||||||
Result := True;
|
Result := True;
|
||||||
finally
|
finally
|
||||||
|
Loading…
Reference in New Issue
Block a user