Further resolve the Window resizing problem. Should work better now

This commit is contained in:
NI
2020-07-28 22:26:06 +08:00
parent 89aebf9181
commit 9e1e592bf3
6 changed files with 171 additions and 117 deletions

View File

@@ -50,6 +50,7 @@ const mainTemplate = `
:commands="commands" :commands="commands"
:preset-data="presetData.presets" :preset-data="presetData.presets"
:restricted-to-presets="presetData.restricted" :restricted-to-presets="presetData.restricted"
:view-port="viewPort"
@navigate-to="changeURLHash" @navigate-to="changeURLHash"
@tab-opened="tabOpened" @tab-opened="tabOpened"
@tab-closed="tabClosed" @tab-closed="tabClosed"
@@ -76,7 +77,7 @@ function startApp(rootEl) {
components: { components: {
loading: Loading, loading: Loading,
auth: Auth, auth: Auth,
home: Home home: Home,
}, },
data() { data() {
return { return {
@@ -94,17 +95,32 @@ function startApp(rootEl) {
key: "", key: "",
presetData: { presetData: {
presets: new Presets([]), presets: new Presets([]),
restricted: false restricted: false,
}, },
authErr: "", authErr: "",
loadErr: "", loadErr: "",
socket: null, socket: null,
controls: new Controls([ controls: new Controls([
new telnetctl.Telnet(uiControlColor), new telnetctl.Telnet(uiControlColor),
new sshctl.SSH(uiControlColor) new sshctl.SSH(uiControlColor),
]), ]),
commands: new Commands([new telnet.Command(), new ssh.Command()]), commands: new Commands([new telnet.Command(), new ssh.Command()]),
tabUpdateIndicator: null tabUpdateIndicator: null,
viewPort: {
dim: {
width: 0,
height: 0,
renew(width, height) {
this.width = width;
this.height = height;
},
},
},
viewPortUpdaters: {
width: 0,
height: 0,
dimResizer: null,
},
}; };
}, },
watch: { watch: {
@@ -117,10 +133,29 @@ function startApp(rootEl) {
this.isErrored() this.isErrored()
? document.body.classList.add("app-error") ? document.body.classList.add("app-error")
: document.body.classList.remove("app-error"); : document.body.classList.remove("app-error");
} },
}, },
mounted() { mounted() {
this.tryInitialAuth(); const self = this;
self.tryInitialAuth();
self.viewPortUpdaters.dimResizer = () => {
self.viewPortUpdaters.height = window.innerHeight;
self.viewPortUpdaters.width = window.innerWidth;
self.$nextTick(() => {
self.viewPort.dim.renew(
self.viewPortUpdaters.width,
self.viewPortUpdaters.height
);
});
};
window.addEventListener("resize", self.viewPortUpdaters.dimResizer);
},
beforeDestroy() {
window.removeEventListener("resize", self.viewPortUpdaters.dimResizer);
}, },
methods: { methods: {
changeTitleInfo(newTitleInfo) { changeTitleInfo(newTitleInfo) {
@@ -169,7 +204,7 @@ function startApp(rootEl) {
executeHomeApp(authResult, key) { executeHomeApp(authResult, key) {
this.presetData = { this.presetData = {
presets: new Presets(JSON.parse(authResult.data)), presets: new Presets(JSON.parse(authResult.data)),
restricted: authResult.onlyAllowPresetRemotes restricted: authResult.onlyAllowPresetRemotes,
}; };
this.socket = this.buildSocket( this.socket = this.buildSocket(
key, key,
@@ -225,7 +260,7 @@ function startApp(rootEl) {
} }
return result.key; return result.key;
} },
}); });
break; break;
@@ -262,7 +297,9 @@ function startApp(rootEl) {
: await this.getSocketAuthKey(privateKey, this.key); : await this.getSocketAuthKey(privateKey, this.key);
let h = await xhr.get(socksVerificationInterface, { let h = await xhr.get(socksVerificationInterface, {
"X-Key": authKey ? btoa(String.fromCharCode.apply(null, authKey)) : "" "X-Key": authKey
? btoa(String.fromCharCode.apply(null, authKey))
: "",
}); });
let serverDate = h.getResponseHeader("Date"); let serverDate = h.getResponseHeader("Date");
@@ -275,7 +312,7 @@ function startApp(rootEl) {
date: serverDate ? new Date(serverDate) : null, date: serverDate ? new Date(serverDate) : null,
data: h.responseText, data: h.responseText,
onlyAllowPresetRemotes: onlyAllowPresetRemotes:
h.getResponseHeader("X-OnlyAllowPresetRemotes") === "yes" h.getResponseHeader("X-OnlyAllowPresetRemotes") === "yes",
}; };
}, },
async submitAuth(passphrase) { async submitAuth(passphrase) {
@@ -290,7 +327,7 @@ function startApp(rootEl) {
data: passphrase, data: passphrase,
fetch() { fetch() {
return this.data; return this.data;
} },
}); });
break; break;
@@ -344,8 +381,8 @@ function startApp(rootEl) {
this.tabUpdateIndicator = null; this.tabUpdateIndicator = null;
this.updateTabTitleInfo(tabs, false); this.updateTabTitleInfo(tabs, false);
}, updateIndicatorMaxDisplayTime); }, updateIndicatorMaxDisplayTime);
} },
} },
}); });
} }
@@ -360,11 +397,11 @@ function initializeClient() {
console.log("Currently in Development environment"); console.log("Currently in Development environment");
} }
window.addEventListener("unhandledrejection", function(e) { window.addEventListener("unhandledrejection", function (e) {
console.error("Error:", e); console.error("Error:", e);
}); });
window.addEventListener("error", function(e) { window.addEventListener("error", function (e) {
console.error("Error:", e); console.error("Error:", e);
}); });

View File

@@ -39,7 +39,7 @@
href="javascript:;" href="javascript:;"
:class="{ :class="{
working: connector.inputting, working: connector.inputting,
intensify: connector.inputting && !windows.connect intensify: connector.inputting && !windows.connect,
}" }"
@click="showConnectWindow" @click="showConnectWindow"
></a> ></a>
@@ -61,6 +61,7 @@
id="home-content" id="home-content"
:screen="tab.current" :screen="tab.current"
:screens="tab.tabs" :screens="tab.tabs"
:view-port="viewPort"
@stopped="tabStopped" @stopped="tabStopped"
@warning="tabWarning" @warning="tabWarning"
@info="tabInfo" @info="tabInfo"
@@ -176,47 +177,41 @@ export default {
connector: Connector, connector: Connector,
tabs: Tabs, tabs: Tabs,
"tab-window": TabWindow, "tab-window": TabWindow,
screens: Screens screens: Screens,
}, },
props: { props: {
hostPath: { hostPath: {
type: String, type: String,
default: "" default: "",
}, },
query: { query: {
type: String, type: String,
default: "" default: "",
}, },
connection: { connection: {
type: Object, type: Object,
default: () => { default: () => null,
return null;
}
}, },
controls: { controls: {
type: Object, type: Object,
default: () => { default: () => null,
return null;
}
}, },
commands: { commands: {
type: Object, type: Object,
default: () => { default: () => null,
return null;
}
}, },
presetData: { presetData: {
type: Object, type: Object,
default: () => { default: () => new presets.Presets([]),
return new presets.Presets([]);
}
}, },
restrictedToPresets: { restrictedToPresets: {
type: Boolean, type: Boolean,
default: () => { default: () => false,
return false; },
} viewPort: {
} type: Object,
default: () => null,
},
}, },
data() { data() {
let history = home_history.build(this); let history = home_history.build(this);
@@ -226,7 +221,7 @@ export default {
windows: { windows: {
delay: false, delay: false,
connect: false, connect: false,
tabs: false tabs: false,
}, },
socket: home_socket.build(this), socket: home_socket.build(this),
connector: { connector: {
@@ -236,14 +231,14 @@ export default {
inputting: false, inputting: false,
acquired: false, acquired: false,
busy: false, busy: false,
knowns: history.all() knowns: history.all(),
}, },
presets: this.commands.mergePresets(this.presetData), presets: this.commands.mergePresets(this.presetData),
tab: { tab: {
current: -1, current: -1,
lastID: 0, lastID: 0,
tabs: [] tabs: [],
} },
}; };
}, },
mounted() { mounted() {
@@ -252,7 +247,7 @@ export default {
}, 1000); }, 1000);
if (this.query.length > 1 && this.query.indexOf("+") === 0) { if (this.query.length > 1 && this.query.indexOf("+") === 0) {
this.connectLaunch(this.query.slice(1, this.query.length), success => { this.connectLaunch(this.query.slice(1, this.query.length), (success) => {
if (!success) { if (!success) {
return; return;
} }
@@ -324,7 +319,7 @@ export default {
this.connector.busy = true; this.connector.busy = true;
this.getStreamThenRun( this.getStreamThenRun(
stream => { (stream) => {
this.connector.busy = false; this.connector.busy = false;
callback(stream); callback(stream);
@@ -338,7 +333,7 @@ export default {
connectNew(connector) { connectNew(connector) {
const self = this; const self = this;
self.runConnect(stream => { self.runConnect((stream) => {
self.connector.connector = { self.connector.connector = {
id: connector.id(), id: connector.id(),
name: connector.name(), name: connector.name(),
@@ -350,7 +345,7 @@ export default {
presets.emptyPreset(), presets.emptyPreset(),
null, null,
() => {} () => {}
) ),
}; };
self.connector.inputting = true; self.connector.inputting = true;
@@ -359,7 +354,7 @@ export default {
connectPreset(preset) { connectPreset(preset) {
const self = this; const self = this;
self.runConnect(stream => { self.runConnect((stream) => {
self.connector.connector = { self.connector.connector = {
id: preset.command.id(), id: preset.command.id(),
name: preset.command.name(), name: preset.command.name(),
@@ -371,7 +366,7 @@ export default {
preset.preset, preset.preset,
null, null,
() => {} () => {}
) ),
}; };
self.connector.inputting = true; self.connector.inputting = true;
@@ -393,7 +388,7 @@ export default {
connectKnown(known) { connectKnown(known) {
const self = this; const self = this;
self.runConnect(stream => { self.runConnect((stream) => {
let connector = self.getConnectorByType(known.type); let connector = self.getConnectorByType(known.type);
if (!connector) { if (!connector) {
@@ -417,7 +412,7 @@ export default {
() => { () => {
self.connector.knowns = self.connector.historyRec.all(); self.connector.knowns = self.connector.historyRec.all();
} }
) ),
}; };
self.connector.inputting = true; self.connector.inputting = true;
@@ -433,13 +428,13 @@ export default {
return { return {
type: ll.slice(0, llSeparatorIdx), type: ll.slice(0, llSeparatorIdx),
query: ll.slice(llSeparatorIdx + 1, ll.length) query: ll.slice(llSeparatorIdx + 1, ll.length),
}; };
}, },
connectLaunch(launcher, done) { connectLaunch(launcher, done) {
this.showConnectWindow(); this.showConnectWindow();
this.runConnect(stream => { this.runConnect((stream) => {
let ll = this.parseConnectLauncher(launcher), let ll = this.parseConnectLauncher(launcher),
connector = this.getConnectorByType(ll.type); connector = this.getConnectorByType(ll.type);
@@ -462,12 +457,12 @@ export default {
this.controls, this.controls,
this.connector.historyRec, this.connector.historyRec,
ll.query, ll.query,
n => { (n) => {
self.connector.knowns = self.connector.historyRec.all(); self.connector.knowns = self.connector.historyRec.all();
done(n.data().success); done(n.data().success);
} }
) ),
}; };
this.connector.inputting = true; this.connector.inputting = true;
@@ -525,11 +520,11 @@ export default {
indicator: { indicator: {
level: "", level: "",
message: "", message: "",
updated: false updated: false,
}, },
status: { status: {
closing: false closing: false,
} },
}) - 1 }) - 1
); );
}, },
@@ -612,7 +607,7 @@ export default {
this.$emit("tab-updated", this.tab.tabs); this.$emit("tab-updated", this.tab.tabs);
this.tab.tabs[index].indicator.updated = index !== this.tab.current; this.tab.tabs[index].indicator.updated = index !== this.tab.current;
} },
} },
}; };
</script> </script>

View File

@@ -37,6 +37,7 @@
#home-content > .screen > .screen-screen > .screen-console { #home-content > .screen > .screen-screen > .screen-console {
position: relative; position: relative;
min-height: 1px;
} }
#home-content > .screen > .screen-screen > .screen-console > .console-toolbar { #home-content > .screen > .screen-screen > .screen-console > .console-toolbar {
@@ -50,6 +51,7 @@
background: #222; background: #222;
color: #fff; color: #fff;
box-shadow: 0 0 5px #0006; box-shadow: 0 0 5px #0006;
z-index: 1;
} }
#home-content #home-content
@@ -190,11 +192,13 @@
} }
#home-content > .screen > .screen-screen > .screen-console > .console-console { #home-content > .screen > .screen-screen > .screen-console > .console-console {
display: flex;
flex-direction: column;
justify-content: center;
justify-items: center;
color: #fff; color: #fff;
width: 100%;
height: 100%;
padding: 0;
margin: 0;
position: relative;
z-index: 0;
} }
#home-content #home-content

View File

@@ -21,7 +21,6 @@
<div class="screen-console"> <div class="screen-console">
<div <div
class="console-console" class="console-console"
style="width: 100%; height: 100%; top: 0; right: 0; left: 0; bottom: 0; padding: 0; margin: 0; z-index: 0; position: absolute; overflow: hidden"
:style="'font-family: ' + typeface + ', inherit'" :style="'font-family: ' + typeface + ', inherit'"
> >
<h2 style="display: none;">Console</h2> <h2 style="display: none;">Console</h2>
@@ -233,7 +232,6 @@ class Term {
rows: dim.rows, rows: dim.rows,
cols: dim.cols, cols: dim.cols,
}); });
}, resizeDelayInterval); }, resizeDelayInterval);
}); });
} }
@@ -280,16 +278,6 @@ class Term {
} }
}); });
this.term.element.addEventListener("click", () => {
if (this.closed) {
return;
}
this.term.textarea.blur();
this.term.textarea.click();
this.term.textarea.focus();
});
this.refit(); this.refit();
} }
@@ -451,6 +439,10 @@ export default {
type: Boolean, type: Boolean,
default: false, default: false,
}, },
viewPort: {
type: Object,
default: () => null,
},
}, },
data() { data() {
return { return {
@@ -459,7 +451,6 @@ export default {
typeface: termTypeFace, typeface: termTypeFace,
runner: null, runner: null,
eventHandlers: { eventHandlers: {
resize: null,
keydown: null, keydown: null,
keyup: null, keyup: null,
}, },
@@ -479,6 +470,16 @@ export default {
}, },
deep: true, deep: true,
}, },
viewPort: {
handler() {
if (!this.active) {
return;
}
this.fit();
},
deep: true,
},
}, },
async mounted() { async mounted() {
await this.init(); await this.init();
@@ -559,45 +560,42 @@ export default {
let self = this; let self = this;
self.eventHandlers = { self.eventHandlers = {
resize: () => self.fit(), keyup: (e) => self.localKeypress(e),
keyup: e => self.localKeypress(e), keydown: (e) => self.localKeypress(e),
keydown: e => self.localKeypress(e),
}; };
await self.openTerm( await self.openTerm(
self.$el.getElementsByClassName("console-console")[0], self.$el.getElementsByClassName("console-console")[0],
{ {
focus(e) { focus(e) {
document.addEventListener("keyup", self.eventHandlers.keyup); document.addEventListener("keyup", self.eventHandlers.keyup);
document.addEventListener("keydown", self.eventHandlers.keydown); document.addEventListener("keydown", self.eventHandlers.keydown);
}, },
blur(e) { blur(e) {
document.removeEventListener("keyup", self.eventHandlers.keyup); document.removeEventListener("keyup", self.eventHandlers.keyup);
document.removeEventListener("keydown", self.eventHandlers.keydown); document.removeEventListener("keydown", self.eventHandlers.keydown);
}, },
warn(msg, toDismiss) { warn(msg, toDismiss) {
self.$emit("warning", { self.$emit("warning", {
text: msg, text: msg,
toDismiss: toDismiss, toDismiss: toDismiss,
}); });
}, },
info(msg, toDismiss) { info(msg, toDismiss) {
self.$emit("info", { self.$emit("info", {
text: msg, text: msg,
toDismiss: toDismiss, toDismiss: toDismiss,
}); });
}, },
} }
); );
if (self.term.destroyed()) { if (self.term.destroyed()) {
return; return;
} }
self.triggerActive(); self.triggerActive();
self.runRunner(); self.runRunner();
self.$nextTick(() => self.eventHandlers.resize());
}, },
async deinit() { async deinit() {
await this.closeRunner(); await this.closeRunner();
@@ -615,12 +613,9 @@ export default {
e.preventDefault(); e.preventDefault();
}, },
activate() { activate() {
this.eventHandlers.resize();
this.term.focus(); this.term.focus();
window.addEventListener("resize", this.eventHandlers.resize);
}, },
async deactivate() { async deactivate() {
window.removeEventListener("resize", this.eventHandlers.resize);
this.term.blur(); this.term.blur();
}, },
runRunner() { runRunner() {

View File

@@ -19,11 +19,17 @@
@charset "utf-8"; @charset "utf-8";
#home-content.active {
min-height: 0;
}
#home-content > .screen { #home-content > .screen {
display: flex; display: flex;
justify-content: top; justify-content: start;
flex-direction: column; flex-direction: column;
font-size: 1em; font-size: 1em;
overflow: hidden;
flex: auto;
} }
#home-content > .screen > .screen-error { #home-content > .screen > .screen-error {
@@ -49,4 +55,17 @@
#home-content > .screen > .screen-screen { #home-content > .screen > .screen-screen {
flex: auto; flex: auto;
padding: 0;
margin: 0;
position: relative;
min-height: 0;
}
#home-content > .screen > .screen-screen > .screen-content {
width: 100%;
height: 100%;
padding: 0;
margin: 0;
position: relative;
overflow: hidden;
} }

View File

@@ -18,7 +18,7 @@
--> -->
<template> <template>
<main style="position: relative"> <main :class="{ active: screens.length > 0 }">
<slot v-if="screens.length <= 0"></slot> <slot v-if="screens.length <= 0"></slot>
<div <div
@@ -26,9 +26,8 @@
:key="screenInfo.id" :key="screenInfo.id"
:style="'visibility: ' + (screen === idx ? 'visible' : 'hidden')" :style="'visibility: ' + (screen === idx ? 'visible' : 'hidden')"
class="screen" class="screen"
style="width: 100%; height: 100%; top: 0; right: 0; left: 0; bottom: 0; padding: 0; margin: 0; overflow: auto; position: absolute;"
> >
<h1 style="display:none;">Main Interface</h1> <h1 style="display: none;">Main Interface</h1>
<div <div
v-if="screenInfo.indicator.message.length > 0" v-if="screenInfo.indicator.message.length > 0"
@@ -38,15 +37,16 @@
{{ screenInfo.indicator.message }} {{ screenInfo.indicator.message }}
</div> </div>
<div class="screen-screen" style="position: relative"> <div class="screen-screen">
<component <component
:is="getComponent(screenInfo.ui)" :is="getComponent(screenInfo.ui)"
:active="screen === idx" :active="screen === idx"
:control="screenInfo.control" :control="screenInfo.control"
:change="screenInfo.indicator" :change="screenInfo.indicator"
:toolbar="screenInfo.toolbar" :toolbar="screenInfo.toolbar"
:view-port="viewPort"
:style="'background-color: ' + screenInfo.control.activeColor()" :style="'background-color: ' + screenInfo.control.activeColor()"
style="top: 0; right: 0; left: 0; bottom: 0; padding 0; margin: 0; position: absolute; overflow: hidden" class="screen-content"
@stopped="stopped(idx, $event)" @stopped="stopped(idx, $event)"
@warning="warning(idx, $event)" @warning="warning(idx, $event)"
@info="info(idx, $event)" @info="info(idx, $event)"
@@ -64,17 +64,21 @@ import "./screens.css";
export default { export default {
components: { components: {
ConsoleScreen ConsoleScreen,
}, },
props: { props: {
screen: { screen: {
type: Number, type: Number,
default: 0 default: 0,
}, },
screens: { screens: {
type: Array, type: Array,
default: () => [] default: () => [],
} },
viewPort: {
type: Object,
default: () => [],
},
}, },
methods: { methods: {
getComponent(ui) { getComponent(ui) {
@@ -97,7 +101,7 @@ export default {
}, },
updated(index) { updated(index) {
this.$emit("updated", index); this.$emit("updated", index);
} },
} },
}; };
</script> </script>