diff --git a/src/emain.ts b/src/emain.ts
index c98613c7..7f023097 100644
--- a/src/emain.ts
+++ b/src/emain.ts
@@ -354,6 +354,17 @@ function getContextMenu() : any {
return menu;
}
+function getCutCopyPasteMenu() : any {
+ let menu = new electron.Menu();
+ let menuItem = new electron.MenuItem({label: "Cut", role: "cut"});
+ menu.append(menuItem);
+ menuItem = new electron.MenuItem({label: "Copy", role: "copy"});
+ menu.append(menuItem);
+ menuItem = new electron.MenuItem({label: "Paste", role: "paste"});
+ menu.append(menuItem);
+ return menu;
+}
+
function getFetchHeaders() {
return {
"x-authkey": GlobalAuthKey,
@@ -437,6 +448,12 @@ electron.ipcMain.on("context-screen", (event, {screenId}, {x, y}) => {
menu.popup({x, y});
});
+electron.ipcMain.on("context-editmenu", (event, {x, y}) => {
+ console.log("context-editmenu");
+ let menu = getCutCopyPasteMenu();
+ menu.popup({x, y});
+});
+
async function createMainWindowWrap() {
let clientData = null;
try {
diff --git a/src/main.tsx b/src/main.tsx
index 62b130a9..19a9c491 100644
--- a/src/main.tsx
+++ b/src/main.tsx
@@ -402,6 +402,13 @@ class LineCmd extends React.Component<{sw : ScreenWindow, line : LineType, width
@boundMethod
handleClick() {
let {line} = this.props;
+ let sel = window.getSelection();
+ if (this.lineRef.current != null) {
+ let selText = sel.toString();
+ if (sel.anchorNode != null && this.lineRef.current.contains(sel.anchorNode) && !isBlank(selText)) {
+ return;
+ }
+ }
GlobalCommandRunner.swSelectLine(String(line.linenum), "cmd");
}
@@ -456,15 +463,15 @@ class LineCmd extends React.Component<{sw : ScreenWindow, line : LineType, width
-
-
+
+
-
-
+
+
{line.userid}
{formattedTime}
-
+
{line.cmdid}
({termOpts.rows}x{termOpts.cols})
@@ -472,8 +479,8 @@ class LineCmd extends React.Component<{sw : ScreenWindow, line : LineType, width
{this.renderCmdText(cmd, remote)}
-
-
0})} onClick={this.clickStar}>
+
+
0})} onClick={this.clickStar}>
@@ -482,15 +489,15 @@ class LineCmd extends React.Component<{sw : ScreenWindow, line : LineType, width
-
+
-
+
-
-
(loading)
+
+
(loading)
-
+
state unchanged
diff --git a/src/model.ts b/src/model.ts
index c8bd17af..327858f9 100644
--- a/src/model.ts
+++ b/src/model.ts
@@ -107,6 +107,7 @@ type ElectronApi = {
onBracketCmd : (callback : (event : any, arg : {relative : number}, mods : KeyModsType) => void) => void,
onDigitCmd : (callback : (event : any, arg : {digit : number}, mods : KeyModsType) => void) => void,
contextScreen : (screenOpts : {screenId : string}, position : {x : number, y : number}) => void,
+ contextEditMenu : (position : {x : number, y : number}) => void,
onLocalServerStatusChange : (callback : (status : boolean, pid : number) => void) => void,
};
@@ -1576,6 +1577,7 @@ class Model {
getApi().onDigitCmd(this.onDigitCmd.bind(this));
getApi().onLocalServerStatusChange(this.onLocalServerStatusChange.bind(this));
document.addEventListener("keydown", this.docKeyDownHandler.bind(this));
+ document.addEventListener("selectionchange", this.docSelectionChangeHandler.bind(this));
}
getBaseHostPort() : string {
@@ -1598,6 +1600,10 @@ class Model {
};
}
+ docSelectionChangeHandler(e : any) {
+ // nothing for now
+ }
+
docKeyDownHandler(e : any) {
if (isModKeyPress(e)) {
return;
@@ -1649,10 +1655,13 @@ class Model {
}
contextScreen(e : any, screenId : string) {
- console.log("model", screenId);
getApi().contextScreen({screenId: screenId}, {x: e.x, y: e.y});
}
+ contextEditMenu(e : any) {
+ getApi().contextEditMenu({x: e.x, y: e.y});
+ }
+
getUIContext() : UIContextType {
let rtn : UIContextType = {
sessionid : null,
diff --git a/src/preload.js b/src/preload.js
index 51eed608..e398d4f2 100644
--- a/src/preload.js
+++ b/src/preload.js
@@ -18,5 +18,6 @@ contextBridge.exposeInMainWorld("api", {
onBracketCmd: (callback) => ipcRenderer.on("bracket-cmd", callback),
onDigitCmd: (callback) => ipcRenderer.on("digit-cmd", callback),
contextScreen: (screenOpts, position) => ipcRenderer.send("context-screen", screenOpts, position),
+ contextEditMenu: (position) => ipcRenderer.send("context-editmenu", position),
onLocalServerStatusChange: (callback) => ipcRenderer.on("local-server-status-change", callback),
});
diff --git a/src/term.ts b/src/term.ts
index 232fe72f..e3e8af92 100644
--- a/src/term.ts
+++ b/src/term.ts
@@ -108,6 +108,10 @@ class TermWrap {
this.terminal.attachCustomKeyEventHandler((e) => opts.customKeyHandler(e, this));
}
this.reloadTerminal(0);
+ elem.addEventListener("contextmenu", (e) => {
+ console.log("elem-contextmenu", elem, e);
+ GlobalModel.contextEditMenu(e);
+ });
}
@boundMethod