diff --git a/src/ui/cm.js b/src/ui/cm.js index b11ae3bff..b966248d3 100644 --- a/src/ui/cm.js +++ b/src/ui/cm.js @@ -1,5 +1,5 @@ import { handler,view,is_osx,string2RGB,adjustBorder,svg_chat,translate,ChatBox,getNowStr,setWindowButontsAndIcon,is_linux } from "./common.js"; -import {$,$$} from "@sciter"; +import {$} from "@sciter"; // TODO in sciterjs window-frame // view.windowFrame = is_osx ? #extended : #solid; diff --git a/src/ui/common.js b/src/ui/common.js index 734134d74..8a1489e71 100644 --- a/src/ui/common.js +++ b/src/ui/common.js @@ -1,3 +1,4 @@ + export const view = Window.this; export const handler = document.$("#handler") || view; @@ -10,8 +11,8 @@ export const is_linux = OS == "Linux"; view.mediaVar("is_osx", is_osx); view.mediaVar("not_osx", !is_osx); -var is_file_transfer; -var is_xfce = false; +export var is_file_transfer; +export var is_xfce = false; try { is_xfce = handler.xcall("is_xfce"); } catch (e) { } @@ -266,7 +267,7 @@ function msgbox_(type, title, text, callback, height, width, retry, contentStyle } } -function connecting() { +export function connecting() { handler.msgbox("connecting", "Connecting...", "Connection in progress. Please wait."); } diff --git a/src/ui/file_transfer.js b/src/ui/file_transfer.js index 3623eaff5..e78c1e638 100644 --- a/src/ui/file_transfer.js +++ b/src/ui/file_transfer.js @@ -1,30 +1,34 @@ +import { handler,svg_send,translate,msgbox } from "./common.js"; +import {$} from "@sciter"; + var remote_home_dir; -var svg_add_folder = +const svg_add_folder = ( -; -var svg_trash = +); +const svg_trash = ( -; -var svg_arrow = +); +const svg_arrow = ( -; -var svg_home = +); +const svg_home = ( -; -var svg_refresh = +); +const svg_refresh = ( -; -var svg_cancel = ; -var svg_computer = +); +const svg_cancel = (); +const svg_computer = ( -; +); +// TODO function getSize(type, size) { if (!size) { if (type <= 3) return ""; @@ -47,15 +51,15 @@ function getSize(type, size) { } function getParentPath(is_remote, path) { - var sep = handler.get_path_sep(is_remote); - var res = path.lastIndexOf(sep); + let sep = handler.xcall("get_path_sep",is_remote); + let res = path.lastIndexOf(sep); if (res <= 0) return "/"; return path.substr(0, res); } function getFileName(is_remote, path) { - var sep = handler.get_path_sep(is_remote); - var res = path.lastIndexOf(sep); + let sep = handler.xcall("get_path_sep",is_remote); + let res = path.lastIndexOf(sep); return path.substr(res + 1); } @@ -63,76 +67,75 @@ function getExt(name) { if (name.indexOf(".") == 0) { return ""; } - var i = name.lastIndexOf("."); + let i = name.lastIndexOf("."); if (i > 0) return name.substr(i + 1); return ""; } var jobIdCounter = 1; -class JobTable: Reactor.Component { - this var jobs = []; - this var job_map = {}; +class JobTable extends Element { + jobs = []; + job_map = {}; - function render() { - var me = this; - var rows = this.jobs.map(function(job, i) { return me.renderRow(job, i); }); - return
+ render() { + let rows = this.jobs.map((job, i)=>this.renderRow(job, i)); + return (
{rows} -
; + ); } - event click $(svg.cancel) (_, me) { - var job = this.jobs[me.parent.parent.index]; - var id = job.id; - handler.cancel_job(id); + ["on click at svg.cancel"](_, me) { + let job = this.jobs[me.parentElement.parentElement.index]; + let id = job.id; + handler.xcall("cancel_job",id); delete this.job_map[id]; - var i = -1; + let i = -1; this.jobs.map(function(job, idx) { if (job.id == id) i = idx; }); this.jobs.splice(i, 1); - this.update(); - var is_remote = job.is_remote; + this.componentUpdate(); + let is_remote = job.is_remote; if (job.type != "del-dir") is_remote = !is_remote; refreshDir(is_remote); } - function send(path, is_remote) { - var to; - var show_hidden; + send(path, is_remote) { + let to; + let show_hidden; if (is_remote) { - to = file_transfer.local_folder_view.fd.path; + to = file_transfer.local_folder_view.fd.path; // NULL show_hidden = file_transfer.remote_folder_view.show_hidden; } else { to = file_transfer.remote_folder_view.fd.path; show_hidden = file_transfer.local_folder_view.show_hidden; } if (!to) return; - to += handler.get_path_sep(!is_remote) + getFileName(is_remote, path); - var id = jobIdCounter; + to += handler.xcall("get_path_sep",!is_remote) + getFileName(is_remote, path); + let id = jobIdCounter; jobIdCounter += 1; this.jobs.push({ type: "transfer", id: id, path: path, to: to, include_hidden: show_hidden, is_remote: is_remote }); this.job_map[id] = this.jobs[this.jobs.length - 1]; - handler.send_files(id, path, to, show_hidden, is_remote); - this.update(); + handler.xcall("send_files",id, path, to, show_hidden, is_remote); + this.componentUpdate(); } - function addDelDir(path, is_remote) { - var id = jobIdCounter; + addDelDir(path, is_remote) { + let id = jobIdCounter; jobIdCounter += 1; this.jobs.push({ type: "del-dir", id: id, path: path, is_remote: is_remote }); this.job_map[id] = this.jobs[this.jobs.length - 1]; - handler.remove_dir_all(id, path, is_remote); - this.update(); + handler.xcall("remove_dir_all",id, path, is_remote); + this.componentUpdate(); } - function getSvg(job) { + getSvg(job) { if (job.type == "transfer") { return svg_send; } else if (job.type == "del-dir") { @@ -140,19 +143,19 @@ class JobTable: Reactor.Component { } } - function getStatus(job) { + getStatus(job) { if (!job.entries) return translate("Waiting"); - var i = job.file_num + 1; - var n = job.num_entries || job.entries.length; + let i = job.file_num + 1; + let n = job.num_entries || job.entries.length; if (i > n) i = n; - var res = i + ' / ' + n + " " + translate("files"); + let res = i + ' / ' + n + " " + translate("files"); if (job.total_size > 0) { - var s = getSize(0, job.finished_size); + let s = getSize(0, job.finished_size); if (s) s += " / "; res += ", " + s + getSize(0, job.total_size); } // below has problem if some file skipped - var percent = job.total_size == 0 ? 100 : (100. * job.finished_size / job.total_size).toInteger(); // (100. * i / (n || 1)).toInteger(); + let percent = job.total_size == 0 ? 100 : (100. * job.finished_size / job.total_size).toInteger(); // (100. * i / (n || 1)).toInteger(); if (job.finished) percent = '100'; if (percent) res += ", " + percent + "%"; if (job.finished) res = translate("Finished") + " " + res; @@ -160,17 +163,18 @@ class JobTable: Reactor.Component { return res; } - function updateJob(job) { - var el = this.select("div[id=s" + job.id + "]"); + updateJob(job) { + let el = this.$("div#s" + job.id); // TODO TEST + console.log("updateJob el",el); if (el) el.text = this.getStatus(job); } - function updateJobStatus(id, file_num = -1, err = null, speed = null, finished_size = 0) { - var job = this.job_map[id]; + updateJobStatus(id, file_num = -1, err = null, speed = null, finished_size = 0) { + let job = this.job_map[id]; if (!job) return; if (file_num < job.file_num) return; job.file_num = file_num; - var n = job.num_entries || job.entries.length; + let n = job.num_entries || job.entries.length; job.finished = job.file_num >= n - 1 || err == "cancel"; job.finished_size = finished_size; job.speed = speed || 0; @@ -178,151 +182,158 @@ class JobTable: Reactor.Component { if (job.type == "del-dir") { if (job.finished) { if (!err) { - handler.remove_dir(job.id, job.path, job.is_remote); + handler.xcall("remove_dir",job.id, job.path, job.is_remote); refreshDir(job.is_remote); } } else if (!job.no_confirm) { - handler.confirm_delete_files(id, job.file_num + 1); + handler.xcall("confirm_delete_files",id, job.file_num + 1); } } else if (job.finished || file_num == -1) { refreshDir(!job.is_remote); } } - function renderRow(job, i) { - var svg = this.getSvg(job); - return + renderRow(job, i) { + svg = this.getSvg(job); + return ( {svg} -
-
{job.path}
+
+
{job.path}
{this.getStatus(job)}
{svg_cancel} - ; + ); } } -class FolderView : Reactor.Component { - this var fd = {}; - this var history = []; - this var show_hidden = false; +class FolderView extends Element { + fd = {}; + history = []; + show_hidden = false; + select_dir; - function sep() { - return handler.get_path_sep(this.is_remote); + sep() { + return handler.xcall("get_path_sep",this.is_remote); } - function this(params) { + this(params) { this.is_remote = params.is_remote; if (this.is_remote) { - this.show_hidden = !!handler.get_option("remote_show_hidden"); + this.show_hidden = !!handler.xcall("get_option","remote_show_hidden"); } else { - this.show_hidden = !!handler.get_option("local_show_hidden"); + this.show_hidden = !!handler.xcall("get_option","local_show_hidden"); } if (!this.is_remote) { - var dir = handler.get_option("local_dir"); + let dir = handler.xcall("get_option","local_dir"); if (dir) { - this.fd = handler.read_dir(dir, this.show_hidden); + this.fd = handler.xcall("read_dir",dir, this.show_hidden); if (this.fd) return; } - this.fd = handler.read_dir(handler.get_home_dir(), this.show_hidden); + this.fd = handler.xcall("read_dir",handler.xcall("get_home_dir"), this.show_hidden); } } // sort predicate - function foldersFirst(a, b) { + foldersFirst(a, b) { if (a.type <= 3 && b.type > 3) return -1; if (a.type > 3 && b.type <= 3) return +1; if (a.name == b.name) return 0; - return a.name.toLowerCase().lexicalCompare(b.name.toLowerCase()); + return a.name.toLowerCase().lexicalCompare(b.name.toLowerCase()); // TODO lexicalCompare } - function render() + render() { - return
+ return (
{this.renderTitle()} {this.renderNavBar()} {this.renderOpBar()} {this.renderTable()} -
; +
); } - function renderTitle() { - return
+ renderTitle() { + return (
{svg_computer} -
{platformSvg(handler.get_platform(this.is_remote), "white")}
+
{platformSvg(handler.xcall("get_platform",this.is_remote), "white")}
{translate(this.is_remote ? "Remote Computer" : "Local Computer")}
-
+
) } - function renderNavBar() { - return
-
{svg_home}
-
{svg_arrow}
-
{svg_arrow}
+ renderNavBar() { + return ; } - function renderSelect() { - return - ; + ); } - function renderOpBar() { + renderOpBar() { if (this.is_remote) { - return
-
{svg_send}{translate('Receive')}
-
-
{svg_add_folder}
-
{svg_trash}
-
; + return (
+
{svg_send}{translate('Receive')}
+
+
{svg_add_folder}
+
{svg_trash}
+
); } - return
-
{svg_add_folder}
-
{svg_trash}
-
-
{translate('Send')}{svg_send}
-
; + return (
+
{svg_add_folder}
+
{svg_trash}
+
+
{translate('Send')}{svg_send}
+
); } - function get_updated() { - this.table.sortRows(false); + get_updated() { + this.table.sortRows(false); // TODO sortRows if (this.fd && this.fd.path) this.select_dir.value = this.fd.path; } - function renderTable() { - var fd = this.fd; - var entries = fd.entries || []; - var table = this.table; + renderTable() { + let fd = this.fd; + let entries = fd.entries || []; + let table = this.table; if (!table || !table.sortBy) { - entries.sort(this.foldersFirst); + entries.sort(this.foldersFirst); // TODO sort function } - var me = this; - var path = fd.path; + let path = fd.path; if (path != "/" && path) { entries = [{ name: "..", type: 1 }].concat(entries); } - var rows = entries.map(function(e) { return me.renderRow(e); }); - var id = (this.is_remote ? "remote" : "local") + "-folder-view"; - return + let rows = entries.map(e=>this.renderRow(e)); + let id = (this.is_remote ? "remote" : "local") + "-folder-view"; + //@{} return (
+ + return (
- + {rows} - -
  • {svg_checkmark}{translate('Show Hidden Files')}
  • + +
  • {svg_checkmark}{translate('Show Hidden Files')}
  • -
    {translate('Name')}{translate('Modified')}{translate('Size')}
    {translate('Name')}{translate('Modified')}{translate('Size')}
    ; + ); } - function joinPath(name) { - var path = this.fd.path; + joinPath(name) { + let path = this.fd.path; if (path == "/") { if (this.sep() == "/") return this.sep() + name; else return name; @@ -330,91 +341,89 @@ class FolderView : Reactor.Component { return path + (path[path.length - 1] == this.sep() ? "" : this.sep()) + name; } - function attached() { - var me = this; - this.table.onRowDoubleClick = function (row) { - var type = row[0].attributes["type"]; + attached() { + this.table.onRowDoubleClick = (row)=>{ + let type = row[0].attributes["type"]; if (type > 3) return; - var name = row[1].text; - var path = name == ".." ? getParentPath(me.is_remote, me.fd.path) : me.joinPath(name); - me.goto(path, true); + let name = row[1].text; + let path = name == ".." ? getParentPath(this.is_remote, this.fd.path) : this.joinPath(name); + this.goto(path, true); } this.get_updated(); } - function goto(path, push) { + goto(path, push) { if (!path) return; if (this.sep() == "\\" && path.length == 2) { // windows drive path += "\\"; } if (push) this.pushHistory(); if (this.is_remote) { - handler.read_remote_dir(path, this.show_hidden); + handler.xcall("read_remote_dir",path, this.show_hidden); } else { - var fd = handler.read_dir(path, this.show_hidden); + var fd = handler.xcall("read_dir",path, this.show_hidden); this.refresh({ fd: fd }); } } - function refresh(data) { + refresh(data) { if (!data.fd || !data.fd.path) return; if (this.is_remote && !remote_home_dir) { remote_home_dir = data.fd.path; } - this.update(data); - var me = this; - self.timer(1ms, function() { me.get_updated(); }); + this.componentUpdate(data); + setTimeout(()=>this.get_updated(),1); } - function renderRow(entry) { - var path; + renderRow(entry) { + let path; if (this.is_remote) { - path = handler.get_icon_path(entry.type, getExt(entry.name)); + path = handler.xcall("get_icon_path",entry.type, getExt(entry.name)); } else { path = this.joinPath(entry.name); } - var tm = entry.time ? new Date(entry.time.toFloat() * 1000.).toLocaleString() : 0; - return + let tm = entry.time ? new Date(entry.time.toFloat() * 1000.).toLocaleString() : 0; // TODO toFloat() + return ( {entry.name} {tm || ""} {getSize(entry.type, entry.size)} - ; + ); } - event click $(#switch-hidden) { + ["on click at #switch-hidden"]() { this.show_hidden = !this.show_hidden; this.refreshDir(); } - event click $(.goup) () { - var path = this.fd.path; + ["on click at .goup"]() { + let path = this.fd.path; if (!path || path == "/") return; path = getParentPath(this.is_remote, path); this.goto(path, true); } - event click $(.goback) () { - var path = this.history.pop(); + ["on click at .goback"] () { + let path = this.history.pop(); if (!path) return; this.goto(path, false); } - event click $(.trash) () { - var rows = this.getCurrentRows(); + ["on click at .trash"]() { + let rows = this.getCurrentRows(); if (!rows || rows.length == 0) return; - var delete_dirs = new Array(); + let delete_dirs = new Array(); - for (var i = 0; i < rows.length; ++i) { - var row = rows[i]; + for (let i = 0; i < rows.length; ++i) { + let row = rows[i]; - var path = row[0]; - var type = row[1]; + let path = row[0]; + let type = row[1]; - var new_history = []; - for (var j = 0; j < this.history.length; ++j) { - var h = this.history[j]; + let new_history = []; + for (let j = 0; j < this.history.length; ++j) { + let h = this.history[j]; if ((h + this.sep()).indexOf(path + this.sep()) == -1) new_history.push(h); } this.history = new_history; @@ -424,97 +433,96 @@ class FolderView : Reactor.Component { confirmDelete(path, this.is_remote); } } - for (var i = 0; i < delete_dirs.length; ++i) { + for (let i = 0; i < delete_dirs.length; ++i) { file_transfer.job_table.addDelDir(delete_dirs[i], this.is_remote); } } - event click $(.add-folder) () { - var me = this; + ["on click at .add-folder"]() { + let me = this; msgbox("custom", translate("Create Folder"), "
    \
    " + translate("Please enter the folder name") + ":
    \
    \
    ", function(res=null) { if (!res) return; if (!res.name) return; - var name = res.name.trim(); + let name = res.name.trim(); if (!name) return; if (name.indexOf(me.sep()) >= 0) { handler.msgbox("custom-error", "Create Folder", "Invalid folder name"); return; } - var path = me.joinPath(name); - handler.create_dir(jobIdCounter, path, me.is_remote); + let path = me.joinPath(name); + handler.xcall("create_dir",jobIdCounter, path, me.is_remote); create_dir_jobs[jobIdCounter] = { is_remote: me.is_remote, path: path }; jobIdCounter += 1; }); } - function refreshDir() { + refreshDir() { this.goto(this.fd.path, false); } - event click $(.refresh) () { + ["on click at .refresh"]() { this.refreshDir(); } - event click $(.home) () { - var path = this.is_remote ? remote_home_dir : handler.get_home_dir(); + ["on click at .home"]() { + let path = this.is_remote ? remote_home_dir : handler.xcall("get_home_dir"); if (!path) return; if (path == this.fd.path) return; this.goto(path, true); } - function getCurrentRow() { - var row = this.table.getCurrentRow(); + getCurrentRow() { + let row = this.table.getCurrentRow(); // TEST getCurrentRow if (!row) return; - var name = row[1].text; + let name = row[1].text; if (!name || name == "..") return; - var type = row[0].attributes["type"]; + let type = row[0].attributes["type"]; return [this.joinPath(name), type]; } - function getCurrentRows() { - var rows = this.table.getCurrentRows(); + getCurrentRows() { + let rows = this.table.getCurrentRows(); if (!rows || rows.length== 0) return; - var records = new Array(); + let records = new Array(); - for (var i = 0; i < rows.length; ++i) { - var name = rows[i][1].text; + for (let i = 0; i < rows.length; ++i) { + let name = rows[i][1].text; if (!name || name == "..") continue; - var type = rows[i][0].attributes["type"]; + let type = rows[i][0].attributes["type"]; records.push([this.joinPath(name), type]); } return records; } - event click $(.send) () { - var rows = this.getCurrentRows(); + ["on click at .send"]() { + let rows = this.getCurrentRows(); if (!rows || rows.length == 0) return; - for (var i = 0; i < rows.length; ++i) { + for (let i = 0; i < rows.length; ++i) { file_transfer.job_table.send(rows[i][0], this.is_remote); } } - event change $(.select-dir) (_, el) { - var x = getTime() - last_key_time; + ["on change at .select-dir"](_, el) { + var x = getTime() - last_key_time; // TODO getTime if (x < 1000) return; if (this.fd.path != el.value) { this.goto(el.value, true); } } - event keydown $(.select-dir) (evt, me) { - if (evt.keyCode == Event.VK_ENTER || - (view.mediaVar("platform") == "OSX" && evt.keyCode == 0x4C)) { + ["on keydown at .select-dir"](evt, me) { + if (evt.code == "KeyRETURN") { // TODO TEST mac this.goto(me.value, true); } } - function pushHistory() { - var path = this.fd.path; + pushHistory() { + let path = this.fd.path; if (!path) return; if (path != this.history[this.history.length - 1]) this.history.push(path); } @@ -522,32 +530,37 @@ class FolderView : Reactor.Component { var file_transfer; -class FileTransfer: Reactor.Component { - function this() { - file_transfer = this; +class FileTransfer extends Element { + this() { + file_transfer = this; } + // TODO @{} + // + // + // - function render() { - return
    - - - -
    ; + render() { + return (
    + + + +
    ); } } -function initializeFileTransfer() +export function initializeFileTransfer() { - $(#file-transfer-wrapper).content(); - $(#video-wrapper).style.set { visibility: "hidden", position: "absolute" }; - $(#file-transfer-wrapper).style.set { display: "block" }; + $("#file-transfer-wrapper").content(); + $("#video-wrapper").style.setProperty("visibility","hidden"); + $("#video-wrapper").style.setProperty("position","absolute"); + $("#file-transfer-wrapper").style.setProperty("display","block"); } handler.updateFolderFiles = function(fd) { fd.entries = fd.entries || []; if (fd.id > 0) { - var jt = file_transfer.job_table; - var job = jt.job_map[fd.id]; + let jt = file_transfer.job_table; + let job = jt.job_map[fd.id]; if (job) { job.file_num = -1; job.total_size = fd.total_size; @@ -565,7 +578,7 @@ handler.jobProgress = function(id, file_num, speed, finished_size) { } handler.jobDone = function(id, file_num = -1) { - var job = deleting_single_file_jobs[id] || create_dir_jobs[id]; + let job = deleting_single_file_jobs[id] || create_dir_jobs[id]; if (job) { refreshDir(job.is_remote); return; @@ -604,7 +617,7 @@ function confirmDelete(path, is_remote) { " + path + "
    \
    ", function(res=null) { if (res) { - handler.remove_file(jobIdCounter, path, 0, is_remote); + handler.xcall("remove_file",jobIdCounter, path, 0, is_remote); deleting_single_file_jobs[jobIdCounter] = { is_remote: is_remote, path: path }; jobIdCounter += 1; } @@ -618,7 +631,7 @@ handler.confirmDeleteFiles = function(id, i, name) { var n = job.num_entries; if (i >= n) return; var file_path = job.path; - if (name) file_path += handler.get_path_sep(job.is_remote) + name; + if (name) file_path += handler.xcall("get_path_sep",job.is_remote) + name; msgbox("custom-skip", "Confirm Delete", "
    \
    " + translate('Deleting') + " #" + (i + 1) + " / " + n + " " + translate('files') + ".
    \
    " + translate('Are you sure you want to delete this file?') + "
    \ @@ -633,18 +646,18 @@ handler.confirmDeleteFiles = function(id, i, name) { } else { job.no_confirm = res.remember; if (job.no_confirm) handler.set_no_confirm(id); - handler.remove_file(id, file_path, i, job.is_remote); + handler.xcall("remove_file",id, file_path, i, job.is_remote); } }); } -function save_file_transfer_close_state() { +export function save_file_transfer_close_state() { var local_dir = file_transfer.local_folder_view.fd.path || ""; var local_show_hidden = file_transfer.local_folder_view.show_hidden ? "Y" : ""; var remote_dir = file_transfer.remote_folder_view.fd.path || ""; var remote_show_hidden = file_transfer.remote_folder_view.show_hidden ? "Y" : ""; - handler.save_close_state("local_dir", local_dir); - handler.save_close_state("local_show_hidden", local_show_hidden); - handler.save_close_state("remote_dir", remote_dir); - handler.save_close_state("remote_show_hidden", remote_show_hidden); + handler.xcall("save_close_state","local_dir", local_dir); + handler.xcall("save_close_state","local_show_hidden", local_show_hidden); + handler.xcall("save_close_state","remote_dir", remote_dir); + handler.xcall("save_close_state","remote_show_hidden", remote_show_hidden); } diff --git a/src/ui/header.js b/src/ui/header.js index 0c40df158..979896551 100644 --- a/src/ui/header.js +++ b/src/ui/header.js @@ -1,74 +1,76 @@ -var pi = handler.get_default_pi(); // peer information +import { handler,view,is_file_transfer,setWindowButontsAndIcon,translate,msgbox,adjustBorder,is_osx,is_xfce,svg_chat,svg_checkmark, is_linux } from "./common.js"; +import {$,$$} from "@sciter"; +import { adaptDisplay,is_port_forward } from "./remote.js"; +var pi = handler.xcall("get_default_pi"); // peer information + var chat_msgs = []; -var svg_fullscreen = +const svg_fullscreen = ( -; -var svg_action = ; -var svg_display = +); +const svg_action = (); +const svg_display = ( -; -var svg_secure = +); +const svg_secure = ( -; -var svg_insecure = ; -var svg_insecure_relay = ; -var svg_secure_relay = ; +); +const svg_insecure = (); +const svg_insecure_relay = (); +const svg_secure_relay = (); + +var cur_window_state = view.state; -var cur_window_state = view.windowState; -function check_state_change() { - if (view.windowState != cur_window_state) { - stateChanged(); - } - self.timer(30ms, check_state_change); -} if (is_linux) { - check_state_change(); + // check_state_change; + setInterval(() => { + if (view.state != cur_window_state) { + stateChanged(); + } + }, 30); } else { - view << event statechange { + view.on("statechange",()=>{ stateChanged(); - } + }) } function get_id() { - return handler.get_option('alias') || handler.get_id() + return handler.xcall("get_option","alias") || handler.xcall("get_id") } function stateChanged() { - stdout.println('state changed from ' + cur_window_state + ' -> ' + view.windowState); - cur_window_state = view.windowState; + console.log('state changed from ' + cur_window_state + ' -> ' + view.state); + cur_window_state = view.state; adjustBorder(); adaptDisplay(); - if (cur_window_state != View.WINDOW_MINIMIZED) { + if (cur_window_state != Window.WINDOW_MINIMIZED) { view.focus = handler; // to make focus away from restore/maximize button, so that enter key work } - var fs = view.windowState == View.WINDOW_FULL_SCREEN; - var el = $(#fullscreen); - if (el) el.attributes.toggleClass("active", fs); - el = $(#maximize); + let fs = view.state == Window.WINDOW_FULL_SCREEN; + let el = $("#fullscreen"); + if (el) el.classList.toggle("active", fs); + el = $("#maximize"); if (el) { - el.state.disabled = fs; + el.state.disabled = fs; // TODO TEST } if (fs) { - $(header).style.set { - display: "none", - }; + $("header").style.setProperty("display","none"); } } -var header; -var old_window_state = View.WINDOW_SHOWN; +export var header; +var old_window_state = Window.WINDOW_SHOWN; var input_blocked; -class Header: Reactor.Component { - function this() { +class Header extends Element { + this() { header = this; } - function render() { - var icon_conn; - var title_conn; + render() { + let icon_conn; + let title_conn; if (this.secure_connection && this.direct_connection) { icon_conn = svg_secure; title_conn = translate("Direct and encrypted connection"); @@ -82,95 +84,96 @@ class Header: Reactor.Component { icon_conn = svg_insecure_relay; title_conn = translate("Relayed and unencrypted connection"); } - var title = get_id(); + let title = get_id(); if (pi.hostname) title += "(" + pi.username + "@" + pi.hostname + ")"; if ((pi.displays || []).length == 0) { - return
    {title}
    ; + return (
    {title}
    ); } - var screens = pi.displays.map(function(d, i) { - return
    + let screens = pi.displays.map(function(d, i) { + return
    {i+1}
    ; }); updateWindowToolbarPosition(); - var style = "flow:horizontal;"; + let style = "flow:horizontal;"; if (is_osx) style += "margin:*"; - self.timer(1ms, toggleMenuState); - return
    - {is_osx || is_xfce ? "" : {svg_fullscreen}} -
    - {icon_conn} -
    {get_id()}
    + setTimeout(toggleMenuState,1); + + return (
    + {is_osx || is_xfce ? "" : {svg_fullscreen}} +
    + {icon_conn} +
    {get_id()}
    {screens}
    {this.renderGlobalScreens()}
    - {svg_chat} - {svg_action} - {svg_display} + {svg_chat} + {svg_action} + {svg_display} {this.renderDisplayPop()} {this.renderActionPop()} -
    ; - } +
    ); + } - function renderDisplayPop() { - return - -
  • {translate('Adjust Window')}
  • -
    -
  • {svg_checkmark}{translate('Original')}
  • -
  • {svg_checkmark}{translate('Shrink')}
  • -
  • {svg_checkmark}{translate('Stretch')}
  • -
    -
  • {svg_checkmark}{translate('Good image quality')}
  • -
  • {svg_checkmark}{translate('Balanced')}
  • -
  • {svg_checkmark}{translate('Optimize reaction time')}
  • -
  • {svg_checkmark}{translate('Custom')}
  • -
    -
  • {svg_checkmark}{translate('Show remote cursor')}
  • - {audio_enabled ?
  • {svg_checkmark}{translate('Mute')}
  • : ""} - {keyboard_enabled && clipboard_enabled ?
  • {svg_checkmark}{translate('Disable clipboard')}
  • : ""} - {keyboard_enabled ?
  • {svg_checkmark}{translate('Lock after session end')}
  • : ""} - {false && pi.platform == "Windows" ?
  • {svg_checkmark}{translate('Privacy mode')}
  • : ""} + renderDisplayPop() { + return ( + + + - ; + ); } - function renderActionPop() { - return - -
  • {translate('Transfer File')}
  • -
  • {translate('TCP Tunneling')}
  • -
    - {keyboard_enabled && (pi.platform == "Linux" || pi.sas_enabled) ?
  • {translate('Insert')} Ctrl + Alt + Del
  • : ""} -
    - {keyboard_enabled ?
  • {translate('Insert Lock')}
  • : ""} - {false && pi.platform == "Windows" ?
  • Block user input
  • : ""} - {handler.support_refresh() ?
  • {translate('Refresh')}
  • : ""} + renderActionPop() { + return ( + +
  • {translate('Transfer File')}
  • +
  • {translate('TCP Tunneling')}
  • +
    + {keyboard_enabled && (pi.platform == "Linux" || pi.sas_enabled) ?
  • {translate('Insert')} Ctrl + Alt + Del
  • : ""} +
    + {keyboard_enabled ?
  • {translate('Insert Lock')}
  • : ""} + {false && pi.platform == "Windows" ?
  • Block user input
  • : ""} + {handler.support_refresh() ?
  • {translate('Refresh')}
  • : ""}
    -
    ; + ); } - function renderGlobalScreens() { + renderGlobalScreens() { if (pi.displays.length < 3) return ""; - var x0 = 9999999; - var y0 = 9999999; - var x = -9999999; - var y = -9999999; + let x0 = 9999999; + let y0 = 9999999; + let x = -9999999; + let y = -9999999; pi.displays.map(function(d, i) { if (d.x < x0) x0 = d.x; if (d.y < y0) y0 = d.y; - var dx = d.x + d.width; + let dx = d.x + d.width; if (dx > x) x = dx; - var dy = d.y + d.height; + let dy = d.y + d.height; if (dy > y) y = dy; }); - var w = x - x0; - var h = y - y0; - var scale = 16. / h; - var screens = pi.displays.map(function(d, i) { - var min_wh = d.width > d.height ? d.height : d.width; - var fs = min_wh * 0.9 * scale; - var style = "width:" + (d.width * scale) + "px;" + + let w = x - x0; + let h = y - y0; + let scale = 16. / h; + let screens = pi.displays.map(function(d, i) { + let min_wh = d.width > d.height ? d.height : d.width; + let fs = min_wh * 0.9 * scale; + let style = "width:" + (d.width * scale) + "px;" + "height:" + (d.height * scale) + "px;" + "left:" + ((d.x - x0) * scale) + "px;" + "top:" + ((d.y - y0) * scale) + "px;" + @@ -181,91 +184,91 @@ class Header: Reactor.Component { return
    {i+1}
    ; }); - var style = "width:" + (w * scale) + "px; height:" + (h * scale) + "px;"; - return
    + let style = "width:" + (w * scale) + "px; height:" + (h * scale) + "px;"; + return
    {screens}
    ; } - event click $(#fullscreen) (_, el) { - if (view.windowState == View.WINDOW_FULL_SCREEN) { - if (old_window_state == View.WINDOW_MAXIMIZED) { - view.windowState = View.WINDOW_SHOWN; + ["on click at #fullscreen"](_, el) { + if (view.state == Window.WINDOW_FULL_SCREEN) { + if (old_window_state == Window.WINDOW_MAXIMIZED) { + view.state = Window.WINDOW_SHOWN; } - view.windowState = old_window_state; + view.state = old_window_state; } else { - old_window_state = view.windowState; - if (view.windowState == View.WINDOW_MAXIMIZED) { - view.windowState = View.WINDOW_SHOWN; + old_window_state = view.state; + if (view.state == Window.WINDOW_MAXIMIZED) { + view.state = Window.WINDOW_SHOWN; } - view.windowState = View.WINDOW_FULL_SCREEN; - if (is_linux) { self.timer(150ms, function() { view.windowState = View.WINDOW_FULL_SCREEN; }); } + view.state = Window.WINDOW_FULL_SCREEN; + if (is_linux) { setTimeout(()=>view.state = Window.WINDOW_FULL_SCREEN,150); } } } - event click $(#chat) { + ["on click at #chat"]() { startChat(); } - event click $(#action) (_, me) { - var menu = $(menu#action-options); + ["on click at #action"](_, me) { + let menu = $("menu#action-options"); me.popup(menu); } - event click $(#display) (_, me) { - var menu = $(menu#display-options); + ["on click at #display"](_, me) { + let menu = $("menu#display-options"); me.popup(menu); } - event click $(#screen) (_, me) { + ["on click at #screen"](_, me) { if (pi.current_display == me.index) return; - handler.switch_display(me.index); + handler.xcall("switch_display",me.index); } - event click $(#transfer-file) { - handler.transfer_file(); + ["on click at #transfer-file"]() { + handler.xcall("transfer_file"); } - event click $(#tunnel) { - handler.tunnel(); + ["on click at #tunnel"] () { + handler.xcall("tunnel"); } - event click $(#ctrl-alt-del) { - handler.ctrl_alt_del(); + ["on click at #ctrl-alt-del"]() { + handler.xcall("ctrl_alt_del"); } - event click $(#lock-screen) { - handler.lock_screen(); + ["on click at #lock-screen"]() { + handler.xcall("lock_screen"); } - event click $(#refresh) { - handler.refresh_video(); + ["on click at #refresh"] () { + handler.xcall("refresh_video"); } - event click $(#block-input) { + ["on click at #block-input"] (_,me) { if (!input_blocked) { - handler.toggle_option("block-input"); + handler.xcall("toggle_option","block-input"); input_blocked = true; - $(#block-input).text = "Unblock user input"; + me.text = "Unblock user input"; // TEST } else { - handler.toggle_option("unblock-input"); + handler.xcall("toggle_option","unblock-input"); input_blocked = false; - $(#block-input).text = "Block user input"; + me.text = "Block user input"; } } - event click $(menu#display-options>li) (_, me) { + ["on click at menu#display-options>li"] (_, me) { if (me.id == "custom") { handle_custom_image_quality(); } else if (me.attributes.hasClass("toggle-option")) { handler.toggle_option(me.id); toggleMenuState(); } else if (!me.attributes.hasClass("selected")) { - var type = me.attributes["type"]; + let type = me.attributes["type"]; if (type == "image-quality") { - handler.save_image_quality(me.id); + handler.xcall("save_image_quality",me.id); } else if (type == "view-style") { - handler.save_view_style(me.id); + handler.xcall("save_view_style",me.id); adaptDisplay(); } toggleMenuState(); @@ -274,96 +277,90 @@ class Header: Reactor.Component { } function handle_custom_image_quality() { - var tmp = handler.get_custom_image_quality(); - var bitrate0 = tmp[0] || 50; - var quantizer0 = tmp.length > 1 ? tmp[1] : 100; + let tmp = handler.xcall("get_custom_image_quality"); + let bitrate0 = tmp[0] || 50; + let quantizer0 = tmp.length > 1 ? tmp[1] : 100; msgbox("custom", "Custom Image Quality", "
    \
    x% bitrate
    \
    x% quantizer
    \
    ", function(res=null) { if (!res) return; if (!res.bitrate) return; - handler.save_custom_image_quality(res.bitrate, res.quantizer); + handler.xcall("save_custom_image_quality",res.bitrate, res.quantizer); toggleMenuState(); }); } function toggleMenuState() { - var values = []; - var q = handler.get_image_quality(); + let values = []; + let q = handler.xcall("get_image_quality"); if (!q) q = "balanced"; values.push(q); - var s = handler.get_view_style(); + let s = handler.xcall("get_view_style"); if (!s) s = "original"; values.push(s); - for (var el in $$(menu#display-options>li)) { - el.attributes.toggleClass("selected", values.indexOf(el.id) >= 0); + for (let el in $$("menu#display-options>li")) { + el.classList.toggle("selected", values.indexOf(el.id) >= 0); } - for (var id in ["show-remote-cursor", "disable-audio", "disable-clipboard", "lock-after-session-end", "privacy-mode"]) { - var el = self.select('#' + id); + for (let id in ["show-remote-cursor", "disable-audio", "disable-clipboard", "lock-after-session-end", "privacy-mode"]) { + let el = $('#' + id); // TEST if (el) { - el.attributes.toggleClass("selected", handler.get_toggle_option(id)); + el.classList.toggle("selected", handler.xcall("get_toggle_option",id)); } } } if (is_osx) { - $(header).content(
    ); - $(header).attributes["role"] = "window-caption"; + $("header").content(
    ); + $("header").attributes["role"] = "window-caption"; // TODO } else { if (is_file_transfer || is_port_forward) { - $(caption).content(
    ); + $("caption").content(
    ); } else { - $(div.window-toolbar).content(
    ); + $("div.window-toolbar").content(
    ); } setWindowButontsAndIcon(); } if (!(is_file_transfer || is_port_forward)) { - $(header).style.set { - height: "32px", - }; + $("header").style.setProperty("height","32px"); if (!is_osx) { - $(div.window-icon).style.set { - size: "32px", - }; + $("div.window-icon").style.setProperty("size","32px"); } } handler.updatePi = function(v) { pi = v; - header.update(); + header.componentUpdate(); if (is_port_forward) { - view.windowState = View.WINDOW_MINIMIZED; + view.state = Window.WINDOW_MINIMIZED; } } handler.switchDisplay = function(i) { pi.current_display = i; - header.update(); + header.componentUpdate(); } function updateWindowToolbarPosition() { if (is_osx) return; - self.timer(1ms, function() { - var el = $(div.window-toolbar); - var w1 = el.box(#width, #border); - var w2 = $(header).box(#width, #border); - var x = (w2 - w1) / 2; - el.style.set { - left: x + "px", - display: "block", - }; - }); + setTimeout(function() { + let el = $("div.window-toolbar"); + let w1 = el.state.box("width", "border"); // TEST + let w2 = $("header").state.box("width", "border"); + let x = (w2 - w1) / 2; + el.style.setProperty("left",x + "px"); + el.style.setProperty("display","block") + },1); } -view.on("size", function() { +view.onsizechange = function() { // ensure size is done, so add timer - self.timer(1ms, function() { + setTimeout(function() { updateWindowToolbarPosition(); adaptDisplay(); - }); -}); + },1); +}; handler.newMessage = function(text) { chat_msgs.push({text: text, name: pi.username || "", time: getNowStr()}); @@ -372,25 +369,25 @@ handler.newMessage = function(text) { function sendMsg(text) { chat_msgs.push({text: text, name: "me", time: getNowStr()}); - handler.send_chat(text); + handler.xcall("send_chat",text); if (chatbox) chatbox.refresh(); } var chatbox; function startChat() { if (chatbox) { - chatbox.windowState = View.WINDOW_SHOWN; - chatbox.refresh(); + chatbox.state = Window.WINDOW_SHOWN; // TODO TEST el.state + chatbox.refresh(); // TODO el.refresh return; } - var icon = handler.get_icon(); - var (sx, sy, sw, sh) = view.screenBox(#workarea, #rectw); - var w = 300; - var h = 400; - var x = (sx + sw - w) / 2; - var y = sy + 80; - var params = { - type: View.FRAME_WINDOW, + let icon = handler.xcall("get_icon"); + let [sx, sy, sw, sh] = view.screenBox("workarea", "rectw"); // TEST + let w = 300; + let h = 400; + let x = (sx + sw - w) / 2; + let y = sy + 80; + let params = { + type: Window.FRAME_WINDOW, x: x, y: y, width: w, @@ -399,14 +396,15 @@ function startChat() { parameters: { msgs: chat_msgs, callback: sendMsg, icon: icon }, caption: get_id(), }; - var html = handler.get_chatbox(); + let html = handler.xcall("get_chatbox"); if (html) params.html = html; - else params.url = self.url("chatbox.html"); - chatbox = view.window(params); + else params.url = document.url("chatbox.html"); + chatbox = view.window(params); // TEST } handler.setConnectionType = function(secured, direct) { - header.update({ + // TEST + header.componentUpdate({ secure_connection: secured, direct_connection: direct, }); diff --git a/src/ui/port_forward.js b/src/ui/port_forward.js index a30f698c5..d4437fca6 100644 --- a/src/ui/port_forward.js +++ b/src/ui/port_forward.js @@ -1,30 +1,32 @@ -class PortForward: Reactor.Component { - function render() { - var args = handler.get_args(); - var is_rdp = handler.is_rdp(); +import { translate } from "./common.js"; + +class PortForward extends Element { + render() { + let args = handler.xcall("get_args"); + let is_rdp = handler.xcall("is_rdp"); if (is_rdp) { this.pfs = [["", "", "RDP"]]; args = ["rdp"]; } else if (args.length) { this.pfs = [args]; } else { - this.pfs = handler.get_port_forwards(); + this.pfs = handler.xcall("get_port_forwards"); } - var pfs = this.pfs.map(function(pf, i) { - return - {is_rdp ? : pf[0]} - {args.length ? svg_arrow : ""} + let pfs = this.pfs.map(function(pf, i) { + return ( + {is_rdp ? : pf[0]} + {args.length ? svg_arrow : ""} {pf[1] || "localhost"} {pf[2]} - {args.length ? "" : {svg_cancel}} - ; + {args.length ? "" : {svg_cancel}} + ); }); - return
    + return
    {pfs.length ?
    {translate('Listening ...')}
    {translate('not_close_tcp_tip')}
    : ""} - +
    @@ -37,11 +39,11 @@ class PortForward: Reactor.Component { {args.length ? "" : - - - - - + + + + + } {pfs} @@ -49,29 +51,30 @@ class PortForward: Reactor.Component {
    {translate('Local Port')}
    {svg_arrow}{svg_arrow}
    ; } - event click $(#add) () { - var port = ($(#port).value || "").toInteger() || 0; - var remote_host = $(#remote-host).value || ""; - var remote_port = ($(#remote-port).value || "").toInteger() || 0; + ["on click at #add"] () { + let port = ($("#port").value || "").toInteger() || 0; // TODO toInteger + let remote_host = $("#remote-host").value || ""; + let remote_port = ($("#remote-port").value || "").toInteger() || 0; // TODO toInteger if (port <= 0 || remote_port <= 0) return; - handler.add_port_forward(port, remote_host, remote_port); - this.update(); + handler.xcall("add_port_forward",port, remote_host, remote_port); + this.componentUpdate(); } - event click $(#new-rdp) { - handler.new_rdp(); + ["on click at #new-rdp"] () { + handler.xcall("new_rdp"); } - event click $(.remove svg) (_, me) { - var pf = this.pfs[me.parent.parent.index - 1]; - handler.remove_port_forward(pf[0]); - this.update(); + ["on click at .remove svg"](_, me) { + let pf = this.pfs[me.parentElement.parentElement.index - 1]; + handler.xcall("remove_port_forward",pf[0]); + this.componentUpdate(); } } -function initializePortForward() +export function initializePortForward() { - $(#file-transfer-wrapper).content(); - $(#video-wrapper).style.set { visibility: "hidden", position: "absolute" }; - $(#file-transfer-wrapper).style.set { display: "block" }; + $("#file-transfer-wrapper").content(); + $("#video-wrapper").style.setProperty("visibility","hidden"); + $("#video-wrapper").style.setProperty("position","absolute") + $("#file-transfer-wrapper").style.setProperty("display","block"); } diff --git a/src/ui/remote.html b/src/ui/remote.html index 810b63515..3a740172e 100644 --- a/src/ui/remote.html +++ b/src/ui/remote.html @@ -1,19 +1,24 @@ - - +
    diff --git a/src/ui/remote.js b/src/ui/remote.js index af936e112..1429a9a63 100644 --- a/src/ui/remote.js +++ b/src/ui/remote.js @@ -1,7 +1,13 @@ -var cursor_img = $(img#cursor); +import { $ } from "@sciter"; +import { handler,view,is_file_transfer,isReasonableSize,msgbox,is_osx, is_linux, centerize, connecting } from "./common.js"; +import { initializeFileTransfer, save_file_transfer_close_state } from "./file_transfer.js"; +import { initializePortForward } from "./port_forward.js"; +import { header } from "./header.js"; + +var cursor_img = $("img#cursor"); var last_key_time = 0; -is_file_transfer = handler.is_file_transfer(); -var is_port_forward = handler.is_port_forward(); +is_file_transfer = handler.xcall("is_file_transfer"); +export var is_port_forward = handler.xcall("is_port_forward"); var display_width = 0; var display_height = 0; var display_origin_x = 0; @@ -20,40 +26,42 @@ handler.setDisplay = function(x, y, w, h) { adaptDisplay(); } -function adaptDisplay() { - var w = display_width; - var h = display_height; +export function adaptDisplay() { + let w = display_width; + let h = display_height; if (!w || !h) return; - var style = handler.get_view_style(); + let style = handler.xcall("get_view_style"); display_scale = 1.; - var (sx, sy, sw, sh) = view.screenBox(view.windowState == View.WINDOW_FULL_SCREEN ? #frame : #workarea, #rectw); + let [sx, sy, sw, sh] = view.screenBox(view.state == Window.WINDOW_FULL_SCREEN ? "frame" : "workarea", "rectw"); if (sw >= w && sh > h) { - var hh = $(header).box(#height, #border); - var el = $(div#adjust-window); + let hh = $("header").state.box("height", "border"); + let el = $("div#adjust-window"); if (sh > h + hh && el) { - el.style.set{ display: "block" }; - el = $(li#adjust-window); - el.style.set{ display: "block" }; - el.onClick = function() { - view.windowState == View.WINDOW_SHOWN; - var (x, y) = view.box(#position, #border, #screen); + el.style.setProperty("display","block"); + el = $("li#adjust-window"); + el.style.setProperty("display","block"); + el.on("click",function() { + // TODO old:view.state == Window.WINDOW_SHOWN; + view.state = Window.WINDOW_SHOWN; + let [x, y] = view.state.box("position", "border", "screen"); // extra for border - var extra = 2; + let extra = 2; view.move(x, y, w + extra, h + hh + extra); - } + }) } } if (style != "original") { - var bw = $(body).box(#width, #border); - var bh = $(body).box(#height, #border); - if (view.windowState == View.WINDOW_FULL_SCREEN) { + let bw = $("body").state.box("width", "border"); + let bh = $("body").state.box("height", "border"); + if (view.state == Window.WINDOW_FULL_SCREEN) { bw = sw; bh = sh; } if (bw > 0 && bh > 0) { - var scale_x = bw.toFloat() / w; - var scale_y = bh.toFloat() / h; - var scale = scale_x < scale_y ? scale_x : scale_y; + // TEST del toFloat() + let scale_x = bw / w; + let scale_y = bh / h; + let scale = scale_x < scale_y ? scale_x : scale_y; if ((scale > 1 && style == "stretch") || (scale < 1 && style == "shrink")) { display_scale = scale; @@ -62,10 +70,8 @@ function adaptDisplay() { } } } - handler.style.set { - width: w + "px", - height: h + "px", - }; + handler.style.setProperty("width",w + "px"); + handler.style.setProperty("height",h + "px") } // https://sciter.com/event-handling/ @@ -73,44 +79,45 @@ function adaptDisplay() { var entered = false; -var keymap = {}; -for (var (k, v) in Event) { - k = k + "" - if (k[0] == "V" && k[1] == "K") { - keymap[v] = k; - } -} +// TODO ! +// var keymap = {}; +// for (var (k, v) in Event) { +// k = k + "" +// if (k[0] == "V" && k[1] == "K") { +// keymap[v] = k; +// } +// } // VK_ENTER = VK_RETURN // somehow, handler.onKey and view.onKey not working -function self.onKey(evt) { - last_key_time = getTime(); - if (is_file_transfer || is_port_forward) return false; - if (!entered) return false; - if (!keyboard_enabled) return false; - switch (evt.type) { - case Event.KEY_DOWN: - handler.key_down_or_up(1, keymap[evt.keyCode] || "", evt.keyCode, evt.altKey, - evt.ctrlKey, evt.shiftKey, evt.commandKey, evt.extendedKey); - if (is_osx && evt.commandKey) { - handler.key_down_or_up(0, keymap[evt.keyCode] || "", evt.keyCode, evt.altKey, - evt.ctrlKey, evt.shiftKey, evt.commandKey, evt.extendedKey); - } - break; - case Event.KEY_UP: - handler.key_down_or_up(0, keymap[evt.keyCode] || "", evt.keyCode, evt.altKey, - evt.ctrlKey, evt.shiftKey, evt.commandKey, evt.extendedKey); - break; - case Event.KEY_CHAR: - // the keypress event is fired when the element receives character value. Event.keyCode is a UNICODE code point of the character - handler.key_down_or_up(2, "", evt.keyCode, evt.altKey, - evt.ctrlKey, evt.shiftKey, evt.commandKey, evt.extendedKey); - break; - default: - return false; - } - return true; -} +// function self.onKey(evt) { +// last_key_time = getTime(); +// if (is_file_transfer || is_port_forward) return false; +// if (!entered) return false; +// if (!keyboard_enabled) return false; +// switch (evt.type) { +// case Event.KEY_DOWN: +// handler.key_down_or_up(1, keymap[evt.keyCode] || "", evt.keyCode, evt.altKey, +// evt.ctrlKey, evt.shiftKey, evt.commandKey, evt.extendedKey); +// if (is_osx && evt.commandKey) { +// handler.key_down_or_up(0, keymap[evt.keyCode] || "", evt.keyCode, evt.altKey, +// evt.ctrlKey, evt.shiftKey, evt.commandKey, evt.extendedKey); +// } +// break; +// case Event.KEY_UP: +// handler.key_down_or_up(0, keymap[evt.keyCode] || "", evt.keyCode, evt.altKey, +// evt.ctrlKey, evt.shiftKey, evt.commandKey, evt.extendedKey); +// break; +// case Event.KEY_CHAR: +// // the keypress event is fired when the element receives character value. Event.keyCode is a UNICODE code point of the character +// handler.key_down_or_up(2, "", evt.keyCode, evt.altKey, +// evt.ctrlKey, evt.shiftKey, evt.commandKey, evt.extendedKey); +// break; +// default: +// return false; +// } +// return true; +// } var wait_window_toolbar = false; var last_mouse_mask; @@ -156,176 +163,177 @@ function accWheel(v, is_x) { } else { v = abs_v; } - handler.send_mouse(3, is_x ? d : 0, !is_x ? d : 0, false, false, false, false); + handler.xcall("send_mouse",3, is_x ? d : 0, !is_x ? d : 0, false, false, false, false); accWheel(v, is_x); break; } } } -function handler.onMouse(evt) -{ - if (is_file_transfer || is_port_forward) return false; - if (view.windowState == View.WINDOW_FULL_SCREEN && !dragging) { - var dy = evt.y - scroll_body.scroll(#top); - if (dy <= 1) { - if (!wait_window_toolbar) { - wait_window_toolbar = true; - self.timer(300ms, function() { - if (!wait_window_toolbar) return; - var extra = 0; - // workaround for stupid Sciter, without this, click - // event not triggered on top part of buttons on toolbar - if (is_osx) extra = 10; - if (view.windowState == View.WINDOW_FULL_SCREEN) { - $(header).style.set { - display: "block", - padding: (2 * workarea_offset + extra) + "px 0 0 0", - }; - } - wait_window_toolbar = false; - }); - } - } else { - wait_window_toolbar = false; - var h = $(header).style; - if (dy > 20 && h#display != "none") { - h.set { - display: "none", - }; - } - } - } - if (!got_mouse_control) { - if (Math.abs(evt.x - cur_local_x) > 12 || Math.abs(evt.y - cur_local_y) > 12) { - got_mouse_control = true; - } else { - return; - } - } - var mask = 0; - var wheel_delta_x; - var wheel_delta_y; - switch(evt.type) { - case Event.MOUSE_DOWN: - mask = 1; - dragging = true; - break; - case Event.MOUSE_UP: - mask = 2; - dragging = false; - break; - case Event.MOUSE_MOVE: - if (cursor_img.style#display != "none" && keyboard_enabled) { - cursor_img.style#display = "none"; - handler.style#cursor = ''; - } - break; - case Event.MOUSE_WHEEL: - // mouseWheelDistance = 8 * [currentUserDefs floatForKey:@"com.apple.scrollwheel.scaling"]; - mask = 3; - { - var (dx, dy) = evt.wheelDeltas; - if (dx > 0) dx = 1; - else if (dx < 0) dx = -1; - if (dy > 0) dy = 1; - else if (dy < 0) dy = -1; - if (Math.abs(dx) > Math.abs(dy)) { - dy = 0; - } else { - dx = 0; - } - acc_wheel_delta_x += dx; - acc_wheel_delta_y += dy; - wheel_delta_x = acc_wheel_delta_x.toInteger(); - wheel_delta_y = acc_wheel_delta_y.toInteger(); - acc_wheel_delta_x -= wheel_delta_x; - acc_wheel_delta_y -= wheel_delta_y; - var now = getTime(); - var dt = last_wheel_time > 0 ? (now - last_wheel_time) / 1000 : 0; - if (dt > 0) { - var vx = dx / dt; - var vy = dy / dt; - if (vx != 0 || vy != 0) { - inertia_velocity_x = vx; - inertia_velocity_y = vy; - } - } - acc_wheel_delta_x0 += dx; - acc_wheel_delta_y0 += dy; - total_wheel_time += dt; - if (dx == 0 && dy == 0) { - wheeling = false; - if (dt < 0.1 && total_wheel_time > 0) { - var v2 = (acc_wheel_delta_y0 / total_wheel_time) * inertia_velocity_y; - if (v2 > 0) { - v2 = Math.sqrt(v2); - inertia_velocity_y = inertia_velocity_y < 0 ? -v2 : v2; - accWheel(inertia_velocity_y, false); - } - v2 = (acc_wheel_delta_x0 / total_wheel_time) * inertia_velocity_x; - if (v2 > 0) { - v2 = Math.sqrt(v2); - inertia_velocity_x = inertia_velocity_x < 0 ? -v2 : v2; - accWheel(inertia_velocity_x, true); - } - } - resetWheel(); - } else { - wheeling = true; - } - last_wheel_time = now; - if (wheel_delta_x == 0 && wheel_delta_y == 0) return keyboard_enabled; - } - break; - case Event.MOUSE_DCLICK: // seq: down, up, dclick, up - mask = 1; - break; - case Event.MOUSE_ENTER: - entered = true; - stdout.println("enter"); - return keyboard_enabled; - case Event.MOUSE_LEAVE: - entered = false; - stdout.println("leave"); - return keyboard_enabled; - default: - return false; - } - var x = evt.x; - var y = evt.y; - if (mask != 0) { - // to gain control of the mouse, user must move mouse - if (cur_x != x || cur_y != y) { - return keyboard_enabled; - } - // save bandwidth - x = 0; - y = 0; - } else { - cur_local_x = cur_x = x; - cur_local_y = cur_y = y; - } - if (mask != 3) { - resetWheel(); - } - if (!keyboard_enabled) return false; - x = (x / display_scale).toInteger(); - y = (y / display_scale).toInteger(); - // insert down between two up, osx has this behavior for triple click - if (last_mouse_mask == 2 && mask == 2) { - handler.send_mouse((evt.buttons << 3) | 1, x + display_origin_x, y + display_origin_y, evt.altKey, - evt.ctrlKey, evt.shiftKey, evt.commandKey); - } - last_mouse_mask = mask; - // to-do: altKey, ctrlKey etc - handler.send_mouse((evt.buttons << 3) | mask, - mask == 3 ? wheel_delta_x : x + display_origin_x, - mask == 3 ? wheel_delta_y : y + display_origin_y, - evt.altKey, - evt.ctrlKey, evt.shiftKey, evt.commandKey); - return true; -}; +// // TODO +// handler.onMouse(evt) +// { +// if (is_file_transfer || is_port_forward) return false; +// if (view.windowState == View.WINDOW_FULL_SCREEN && !dragging) { +// var dy = evt.y - scroll_body.scroll(#top); +// if (dy <= 1) { +// if (!wait_window_toolbar) { +// wait_window_toolbar = true; +// self.timer(300ms, function() { +// if (!wait_window_toolbar) return; +// var extra = 0; +// // workaround for stupid Sciter, without this, click +// // event not triggered on top part of buttons on toolbar +// if (is_osx) extra = 10; +// if (view.windowState == View.WINDOW_FULL_SCREEN) { +// $(header).style.set { +// display: "block", +// padding: (2 * workarea_offset + extra) + "px 0 0 0", +// }; +// } +// wait_window_toolbar = false; +// }); +// } +// } else { +// wait_window_toolbar = false; +// var h = $(header).style; +// if (dy > 20 && h#display != "none") { +// h.set { +// display: "none", +// }; +// } +// } +// } +// if (!got_mouse_control) { +// if (Math.abs(evt.x - cur_local_x) > 12 || Math.abs(evt.y - cur_local_y) > 12) { +// got_mouse_control = true; +// } else { +// return; +// } +// } +// var mask = 0; +// var wheel_delta_x; +// var wheel_delta_y; +// switch(evt.type) { +// case Event.MOUSE_DOWN: +// mask = 1; +// dragging = true; +// break; +// case Event.MOUSE_UP: +// mask = 2; +// dragging = false; +// break; +// case Event.MOUSE_MOVE: +// if (cursor_img.style#display != "none" && keyboard_enabled) { +// cursor_img.style#display = "none"; +// handler.style#cursor = ''; +// } +// break; +// case Event.MOUSE_WHEEL: +// // mouseWheelDistance = 8 * [currentUserDefs floatForKey:@"com.apple.scrollwheel.scaling"]; +// mask = 3; +// { +// var (dx, dy) = evt.wheelDeltas; +// if (dx > 0) dx = 1; +// else if (dx < 0) dx = -1; +// if (dy > 0) dy = 1; +// else if (dy < 0) dy = -1; +// if (Math.abs(dx) > Math.abs(dy)) { +// dy = 0; +// } else { +// dx = 0; +// } +// acc_wheel_delta_x += dx; +// acc_wheel_delta_y += dy; +// wheel_delta_x = acc_wheel_delta_x.toInteger(); +// wheel_delta_y = acc_wheel_delta_y.toInteger(); +// acc_wheel_delta_x -= wheel_delta_x; +// acc_wheel_delta_y -= wheel_delta_y; +// var now = getTime(); +// var dt = last_wheel_time > 0 ? (now - last_wheel_time) / 1000 : 0; +// if (dt > 0) { +// var vx = dx / dt; +// var vy = dy / dt; +// if (vx != 0 || vy != 0) { +// inertia_velocity_x = vx; +// inertia_velocity_y = vy; +// } +// } +// acc_wheel_delta_x0 += dx; +// acc_wheel_delta_y0 += dy; +// total_wheel_time += dt; +// if (dx == 0 && dy == 0) { +// wheeling = false; +// if (dt < 0.1 && total_wheel_time > 0) { +// var v2 = (acc_wheel_delta_y0 / total_wheel_time) * inertia_velocity_y; +// if (v2 > 0) { +// v2 = Math.sqrt(v2); +// inertia_velocity_y = inertia_velocity_y < 0 ? -v2 : v2; +// accWheel(inertia_velocity_y, false); +// } +// v2 = (acc_wheel_delta_x0 / total_wheel_time) * inertia_velocity_x; +// if (v2 > 0) { +// v2 = Math.sqrt(v2); +// inertia_velocity_x = inertia_velocity_x < 0 ? -v2 : v2; +// accWheel(inertia_velocity_x, true); +// } +// } +// resetWheel(); +// } else { +// wheeling = true; +// } +// last_wheel_time = now; +// if (wheel_delta_x == 0 && wheel_delta_y == 0) return keyboard_enabled; +// } +// break; +// case Event.MOUSE_DCLICK: // seq: down, up, dclick, up +// mask = 1; +// break; +// case Event.MOUSE_ENTER: +// entered = true; +// console.log("enter"); +// return keyboard_enabled; +// case Event.MOUSE_LEAVE: +// entered = false; +// console.log("leave"); +// return keyboard_enabled; +// default: +// return false; +// } +// var x = evt.x; +// var y = evt.y; +// if (mask != 0) { +// // to gain control of the mouse, user must move mouse +// if (cur_x != x || cur_y != y) { +// return keyboard_enabled; +// } +// // save bandwidth +// x = 0; +// y = 0; +// } else { +// cur_local_x = cur_x = x; +// cur_local_y = cur_y = y; +// } +// if (mask != 3) { +// resetWheel(); +// } +// if (!keyboard_enabled) return false; +// x = (x / display_scale).toInteger(); +// y = (y / display_scale).toInteger(); +// // insert down between two up, osx has this behavior for triple click +// if (last_mouse_mask == 2 && mask == 2) { +// handler.send_mouse((evt.buttons << 3) | 1, x + display_origin_x, y + display_origin_y, evt.altKey, +// evt.ctrlKey, evt.shiftKey, evt.commandKey); +// } +// last_mouse_mask = mask; +// // to-do: altKey, ctrlKey etc +// handler.send_mouse((evt.buttons << 3) | mask, +// mask == 3 ? wheel_delta_x : x + display_origin_x, +// mask == 3 ? wheel_delta_y : y + display_origin_y, +// evt.altKey, +// evt.ctrlKey, evt.shiftKey, evt.commandKey); +// return true; +// }; var cur_hotx = 0; var cur_hoty = 0; @@ -340,36 +348,33 @@ var image_binded; handler.setCursorData = function(id, hotx, hoty, width, height, colors) { cur_hotx = hotx; cur_hoty = hoty; - cursor_img.style.set { - width: width + "px", - height: height + "px", - }; - var img = Image.fromBytes(colors); + cursor_img.style.setProperty("width",width + "px"); + cursor_img.style.setProperty("height",height + "px"); + + let img = Image.fromBytes(colors); if (img) { image_binded = true; cursors[id] = [img, hotx, hoty, width, height]; this.bindImage("in-memory:cursor", img); - if (cursor_img.style#display == 'none') { - self.timer(1ms, function() { handler.style.cursor(cur_img, cur_hotx, cur_hoty); }); + if (cursor_img.style.getProperty("display") == 'none') { // TEST getProperty + setTimeout(function() { handler.style.cursor(cur_img, cur_hotx, cur_hoty) },1); // TODO cursor } cur_img = img; } } handler.setCursorId = function(id) { - var img = cursors[id]; + let img = cursors[id]; if (img) { image_binded = true; cur_hotx = img[1]; cur_hoty = img[2]; - cursor_img.style.set { - width: img[3] + "px", - height: img[4] + "px", - }; + cursor_img.style.setProperty("width",img[3] + "px"); + cursor_img.style.setProperty("height",img[4] + "px"); img = img[0]; this.bindImage("in-memory:cursor", img); - if (cursor_img.style#display == 'none') { - self.timer(1ms, function() { handler.style.cursor(cur_img, cur_hotx, cur_hoty); }); + if (cursor_img.style.getProperty("display") == 'none') { + setTimeout(function() { handler.style.cursor(cur_img, cur_hotx, cur_hoty) },1); } cur_img = img; } @@ -385,21 +390,19 @@ handler.setCursorPosition = function(x, y) { var y = cur_y - cur_hoty; x *= display_scale; y *= display_scale; - cursor_img.style.set { - left: x + "px", - top: y + "px", - }; - if (cursor_img.style#display == 'none') { - handler.style#cursor = 'none'; - cursor_img.style#display = "block"; + cursor_img.style.setProperty("width",x + "px"); + cursor_img.style.setProperty("width",y + "px"); + if (cursor_img.style.getProperty("display") == 'none') { + handler.style.setProperty("cursor",'none'); + cursor_img.style.setProperty("display","block"); } } -function self.ready() { - var w = 960; - var h = 640; +document.on("ready",()=> { + let w = 960; + let h = 640; if (is_file_transfer || is_port_forward) { - var r = handler.get_size(); + let r = handler.xcall("get_size"); if (isReasonableSize(r) && r[2] > 0) { view.move(r[0], r[1], r[2], r[3]); } else { @@ -411,53 +414,54 @@ function self.ready() { if (!is_port_forward) connecting(); if (is_file_transfer) initializeFileTransfer(); if (is_port_forward) initializePortForward(); -} +}) var workarea_offset = 0; var size_adapted; handler.adaptSize = function() { if (size_adapted) return; size_adapted = true; - var (sx, sy, sw, sh) = view.screenBox(#workarea, #rectw); - var (fx, fy, fw, fh) = view.screenBox(#frame, #rectw); + let [sx, sy, sw, sh] = view.screenBox("workarea", "rectw"); + let [fx, fy, fw, fh] = view.screenBox("frame", "rectw"); if (is_osx) workarea_offset = sy; - var r = handler.get_size(); + let r = handler.xcall("get_size"); if (isReasonableSize(r) && r[2] > 0) { if (r[2] >= fw && r[3] >= fh && !is_linux) { - view.windowState = View.WINDOW_FULL_SCREEN; - stdout.println("Initialize to full screen"); + view.state = Window.WINDOW_FULL_SCREEN; + console.log("Initialize to full screen"); } else if (r[2] >= sw && r[3] >= sh) { - view.windowState = View.WINDOW_MAXIMIZED; - stdout.println("Initialize to full screen"); + view.state = Window.WINDOW_MAXIMIZED; + console.log("Initialize to full screen"); } else { view.move(r[0], r[1], r[2], r[3]); } } else { - var w = handler.box(#width, #border) - var h = handler.box(#height, #border) + let w = handler.state.box("width", "border") + let h = handler.state.box("height", "border") if (w >= sw || h >= sh) { - view.windowState = View.WINDOW_MAXIMIZED; + view.state = Window.WINDOW_MAXIMIZED; return; } // extra for border - var extra = 2; - centerize(w + extra, handler.box(#height, #border) + h + extra); + let extra = 2; + centerize(w + extra, handler.state.box("height", "border") + h + extra); } } -function self.closing() { - var (x, y, w, h) = view.box(#rectw, #border, #screen); +document.on("unloadequest",()=> { + let [x, y, w, h] = view.state.box("rectw", "border", "screen"); if (is_file_transfer) save_file_transfer_close_state(); - if (is_file_transfer || is_port_forward || size_adapted) handler.save_size(x, y, w, h); -} + if (is_file_transfer || is_port_forward || size_adapted) handler.xcall("save_size",x, y, w, h); +}) handler.setPermission = function(name, enabled) { if (name == "keyboard") keyboard_enabled = enabled; if (name == "audio") audio_enabled = enabled; if (name == "clipboard") clipboard_enabled = enabled; - header.update(); + header.componentUpdate(); } +// TODO handler.closeSuccess = function() { // handler.msgbox("success", "Successful", "Ready to go."); handler.msgbox("", "", ""); diff --git a/src/ui/remote.rs b/src/ui/remote.rs index d4fde3f38..22be7d038 100644 --- a/src/ui/remote.rs +++ b/src/ui/remote.rs @@ -75,7 +75,7 @@ impl Deref for Handler { impl sciter::EventHandler for Handler { fn get_subscription(&mut self) -> Option { - Some(EVENT_GROUPS::HANDLE_BEHAVIOR_EVENT) + Some(EVENT_GROUPS::HANDLE_METHOD_CALL | EVENT_GROUPS::HANDLE_SCRIPTING_METHOD_CALL | EVENT_GROUPS::HANDLE_BEHAVIOR_EVENT) } fn attached(&mut self, root: HELEMENT) {