fix #148 - Use common shortcuts to copy and paste from the terminal

This commit is contained in:
Basile Burg 2019-01-22 10:23:14 +01:00
parent ef149cce63
commit 426cd0d2c8
4 changed files with 92 additions and 1 deletions

View File

@ -88,6 +88,10 @@ var
vte_terminal_feed_child: procedure(terminal: PVteTerminal; data: PChar; vte_terminal_feed_child: procedure(terminal: PVteTerminal; data: PChar;
length: PtrInt); cdecl; length: PtrInt); cdecl;
vte_terminal_copy_clipboard: procedure(terminal: PVteTerminal); cdecl;
vte_terminal_paste_clipboard: procedure(terminal: PVteTerminal); cdecl;
vte_get_user_shell: function(): PChar; vte_get_user_shell: function(): PChar;
function Gtk2TermLoad: Boolean; function Gtk2TermLoad: Boolean;
@ -134,9 +138,14 @@ begin
'vte_terminal_feed'); 'vte_terminal_feed');
@vte_terminal_feed_child := GetProcAddress(Lib, @vte_terminal_feed_child := GetProcAddress(Lib,
'vte_terminal_feed_child'); 'vte_terminal_feed_child');
@vte_terminal_copy_clipboard := GetProcAddress(Lib,
'vte_terminal_copy_clipboard');
@vte_terminal_paste_clipboard := GetProcAddress(Lib,
'vte_terminal_paste_clipboard');
@vte_get_user_shell := GetProcAddress(Lib, @vte_get_user_shell := GetProcAddress(Lib,
'vte_get_user_shell'); 'vte_get_user_shell');
// assume all or none // assume all or none
Loaded := @vte_terminal_new <> nil; Loaded := @vte_terminal_new <> nil;

View File

@ -51,6 +51,8 @@ type
procedure Reparent; procedure Reparent;
// Sends a command, as it would be manually typed. Line feed is automatically added. // Sends a command, as it would be manually typed. Line feed is automatically added.
procedure Command(const data: string); procedure Command(const data: string);
procedure copyToClipboard();
procedure pasteFromClipboard();
published published
{$ifdef windows} {$ifdef windows}
property terminalProgram: string read fTermProgram write fTermProgram; property terminalProgram: string read fTermProgram write fTermProgram;
@ -301,6 +303,22 @@ begin
{$endif} {$endif}
end; end;
procedure TTerminal.copyToClipboard();
begin
{$ifdef hasgtk2term}
if assigned(fTerminalHanlde) and assigned(vte_terminal_copy_clipboard) then
vte_terminal_copy_clipboard(fTerminalHanlde);
{$endif}
end;
procedure TTerminal.pasteFromClipboard();
begin
{$ifdef hasgtk2term}
if assigned(fTerminalHanlde) and assigned(vte_terminal_paste_clipboard) then
vte_terminal_paste_clipboard(fTerminalHanlde);
{$endif}
end;
function TerminalAvailable: Boolean; function TerminalAvailable: Boolean;
begin begin
{$ifdef hasgtk2term} {$ifdef hasgtk2term}

View File

@ -5,6 +5,7 @@ inherited TermWidget: TTermWidget
Caption = 'Terminal' Caption = 'Terminal'
ClientHeight = 296 ClientHeight = 296
ClientWidth = 674 ClientWidth = 674
OnShortCut = FormShortCut
inherited Back: TPanel inherited Back: TPanel
Height = 296 Height = 296
Width = 674 Width = 674

View File

@ -5,12 +5,25 @@ unit u_term;
interface interface
uses uses
Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, LCLType,
ActnList, LMessages,
u_widget, TerminalCtrls, u_interfaces, u_writableComponent, u_observer, u_widget, TerminalCtrls, u_interfaces, u_writableComponent, u_observer,
u_common, u_synmemo; u_common, u_synmemo;
type type
TTerminalShortcuts = class(TPersistent)
private
fCopy: TShortCut;
fPaste: TShortCut;
published
property copy: TShortCut read fCopy write fCopy;
property paste: TShortCut read fPaste write fPaste;
public
constructor create;
procedure assign(source: TPersistent); override;
end;
// Terminal options // Terminal options
TTerminalOptionsBase = class(TWritableLfmTextComponent) TTerminalOptionsBase = class(TWritableLfmTextComponent)
private private
@ -22,7 +35,9 @@ type
fFollowExplorer: boolean; fFollowExplorer: boolean;
fScrollbackLines: longword; fScrollbackLines: longword;
fFont: TFont; fFont: TFont;
fShortcuts: TTerminalShortcuts;
procedure setFont(value: TFont); procedure setFont(value: TFont);
procedure setShortcuts(value: TTerminalShortcuts);
public public
constructor create(AOwner: TComponent); override; constructor create(AOwner: TComponent); override;
destructor destroy; override; destructor destroy; override;
@ -36,6 +51,7 @@ type
property followProjects: boolean read fFollowProjects write fFollowProjects; property followProjects: boolean read fFollowProjects write fFollowProjects;
property followExplorer: boolean read fFollowExplorer write fFollowExplorer; property followExplorer: boolean read fFollowExplorer write fFollowExplorer;
property scrollbackLines: longword read fScrollbackLines write fScrollbackLines default 512; property scrollbackLines: longword read fScrollbackLines write fScrollbackLines default 512;
property shortcuts: TTerminalShortcuts read fShortcuts write fShortcuts;
end; end;
// Editable and reversible Terminal options // Editable and reversible Terminal options
@ -56,6 +72,7 @@ type
TTermWidget = class(TDexedWidget, IDocumentObserver, IProjectObserver, IMiniExplorerObserver) TTermWidget = class(TDexedWidget, IDocumentObserver, IProjectObserver, IMiniExplorerObserver)
procedure ContentPaint(Sender: TObject); procedure ContentPaint(Sender: TObject);
procedure FormShortCut(var Msg: TLMKey; var Handled: Boolean);
private private
fTerm: TTerminal; fTerm: TTerminal;
fOpts: TTerminalOptions; fOpts: TTerminalOptions;
@ -92,6 +109,25 @@ implementation
const const
optFname = 'terminal.txt'; optFname = 'terminal.txt';
constructor TTerminalShortcuts.create;
begin
fCopy := KeyToShortCut(word(char('C')), [ssCtrl]);
fPaste:= KeyToShortCut(word(char('V')), [ssCtrl]);
end;
procedure TTerminalShortcuts.assign(source: TPersistent);
var
s: TTerminalShortcuts;
begin
if source is TTerminalShortcuts then
begin
s := TTerminalShortcuts(source);
fCopy := s.fCopy;
fPaste:= s.fPaste;
end
else inherited;
end;
constructor TTerminalOptionsBase.create(AOwner: TComponent); constructor TTerminalOptionsBase.create(AOwner: TComponent);
begin begin
inherited; inherited;
@ -102,11 +138,13 @@ begin
fFont.Name:= 'Monospace'; fFont.Name:= 'Monospace';
fFont.Size:= 12; fFont.Size:= 12;
fScrollbackLines:=512; fScrollbackLines:=512;
fShortcuts := TTerminalShortcuts.create;
end; end;
destructor TTerminalOptionsBase.destroy; destructor TTerminalOptionsBase.destroy;
begin begin
fFont.Free; fFont.Free;
fShortcuts.Free;
inherited; inherited;
end; end;
@ -115,6 +153,11 @@ begin
fFont.Assign(value); fFont.Assign(value);
end; end;
procedure TTerminalOptionsBase.setShortcuts(value: TTerminalShortcuts);
begin
fShortcuts.assign(value);
end;
procedure TTerminalOptionsBase.assign(value: TPersistent); procedure TTerminalOptionsBase.assign(value: TPersistent);
var var
s: TTerminalOptionsBase; s: TTerminalOptionsBase;
@ -131,6 +174,7 @@ begin
fFont.Height:=fFont.Height-1; fFont.Height:=fFont.Height-1;
fFont.Assign(s.font); fFont.Assign(s.font);
fFont.EndUpdate; fFont.EndUpdate;
fShortcuts.assign(s.fShortcuts);
fScrollbackLines := s.fScrollbackLines; fScrollbackLines := s.fScrollbackLines;
end end
else inherited; else inherited;
@ -204,6 +248,7 @@ var
f: string; f: string;
begin begin
inherited; inherited;
toolbarVisible:=false; toolbarVisible:=false;
fTerm := TTerminal.Create(self); fTerm := TTerminal.Create(self);
fTerm.Align:= alClient; fTerm.Align:= alClient;
@ -247,6 +292,24 @@ begin
fOpts.applyChanges; fOpts.applyChanges;
end; end;
procedure TTermWidget.FormShortCut(var Msg: TLMKey; var Handled: Boolean);
var
s: TShortCut;
begin
Handled := false;
s := KeyToShortCut(Msg.CharCode, KeyDataToShiftState(Msg.KeyData));
if s = fOpts.shortcuts.copy then
begin
fTerm.copyToClipboard();
handled := true;
end
else if s = fOpts.shortcuts.paste then
begin
fTerm.pasteFromClipboard();
handled := true;
end;
end;
procedure TTermWidget.mnexDirectoryChanged(const directory: string); procedure TTermWidget.mnexDirectoryChanged(const directory: string);
begin begin
if fOpts.followExplorer and directory.dirExists and if fOpts.followExplorer and directory.dirExists and