mirror of https://gitlab.com/basile.b/dexed.git
fix #148 - Use common shortcuts to copy and paste from the terminal
This commit is contained in:
parent
ef149cce63
commit
426cd0d2c8
|
@ -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;
|
||||||
|
|
||||||
|
|
|
@ -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}
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue