diff --git a/js/notif.js b/js/notif.js
index a3ea609..38cbd4e 100644
--- a/js/notif.js
+++ b/js/notif.js
@@ -1,34 +1,64 @@
window.Notify = (function () {
let nt = {}
const sel = '#notif'
+ let $balloon
- let hideTmeo1 // timeout to start hiding (transition)
- let hideTmeo2 // timeout to add the hidden class
+ let timerHideBegin // timeout to start hiding (transition)
+ let timerHideEnd // timeout to add the hidden class
+ let timerCanCancel
+ let canCancel = false
- nt.show = function (message, timeout) {
- $(sel).html(message)
- Modal.show(sel)
+ let stopTimeouts = function () {
+ clearTimeout(timerHideBegin)
+ clearTimeout(timerHideEnd)
+ }
+
+ nt.show = function (message, timeout, isError) {
+ $balloon.toggleClass('error', isError === true)
+ $balloon.html(message)
+ Modal.show($balloon)
+ stopTimeouts()
- clearTimeout(hideTmeo1)
- clearTimeout(hideTmeo2)
+ if (undef(timeout) || timeout === null || timeout <= 0) {
+ timeout = 2500
+ }
- if (undef(timeout)) timeout = 2500
+ timerHideBegin = setTimeout(nt.hide, timeout)
- hideTmeo1 = setTimeout(nt.hide, timeout)
+ canCancel = false
+ timerCanCancel = setTimeout(function () {
+ canCancel = true
+ }, 500)
}
nt.hide = function () {
let $m = $(sel)
$m.removeClass('visible')
- hideTmeo2 = setTimeout(function () {
+ timerHideEnd = setTimeout(function () {
$m.addClass('hidden')
}, 250) // transition time
}
nt.init = function () {
- $(sel).on('click', function () {
+ $balloon = $(sel)
+
+ // close by click outside
+ $(document).on('click', function () {
+ if (!canCancel) return
nt.hide(this)
})
+
+ // click caused by selecting, prevent it from bubbling
+ $balloon.on('click', function (e) {
+ e.stopImmediatePropagation()
+ return false
+ })
+
+ // stop fading if moused
+ $balloon.on('mouseenter', function () {
+ stopTimeouts()
+ $balloon.removeClass('hidden').addClass('visible')
+ })
}
return nt
diff --git a/js/soft_keyboard.js b/js/soft_keyboard.js
index 5519468..5829033 100644
--- a/js/soft_keyboard.js
+++ b/js/soft_keyboard.js
@@ -20,13 +20,18 @@ window.initSoftKeyboard = function (screen, input) {
screen.on('cursor-moved', updateInputPosition)
- window.kbOpen = function openSoftKeyboard (open) {
+ let kbOpen = function (open) {
keyboardOpen = open
updateInputPosition()
if (open) keyInput.focus()
else keyInput.blur()
}
+ qs('#term-kb-open').addEventListener('click', function () {
+ kbOpen(true)
+ return false
+ })
+
// Chrome for Android doesn't send proper keydown/keypress events with
// real key values instead of 229 “Unidentified,” so here's a workaround
// that deals with the input composition events.
diff --git a/js/term.js b/js/term.js
index 8a336aa..ed5c36e 100644
--- a/js/term.js
+++ b/js/term.js
@@ -1,15 +1,21 @@
/** Init the terminal sub-module - called from HTML */
window.termInit = function (labels, theme) {
- const screen = new window.TermScreen()
- const conn = window.Conn(screen)
- const input = window.Input(conn)
- const termUpload = window.TermUpl(conn, input)
+ const screen = new TermScreen()
+ const conn = Conn(screen)
+ const input = Input(conn)
+ const termUpload = TermUpl(conn, input)
screen.input = input
conn.init()
input.init()
termUpload.init()
+ Notify.init()
+
+ window.onerror = function (errorMsg, file, line, col) {
+ Notify.show(`JS ERROR!
${errorMsg}
at ${file}:${line}:${col}`, 10000, true)
+ return false
+ }
qs('#screen').appendChild(screen.canvas)
screen.load(labels, theme) // load labels and theme
@@ -23,7 +29,7 @@ window.termInit = function (labels, theme) {
fitScreenIfNeeded()
window.addEventListener('resize', fitScreenIfNeeded)
- window.toggleFitScreen = function () {
+ let toggleFitScreen = function () {
fitScreen = !fitScreen
const resizeButtonIcon = qs('#resize-button-icon')
if (fitScreen) {
@@ -35,6 +41,11 @@ window.termInit = function (labels, theme) {
}
fitScreenIfNeeded()
}
+
+ qs('#term-fit-screen').addEventListener('click', function () {
+ toggleFitScreen()
+ return false
+ })
}
window.initSoftKeyboard(screen, input)
diff --git a/js/term_upload.js b/js/term_upload.js
index 0c188f2..c010c55 100644
--- a/js/term_upload.js
+++ b/js/term_upload.js
@@ -12,25 +12,25 @@ window.TermUpl = function (conn, input) {
// sending a super-ling string through the socket is not a good idea
const MAX_LINE_LEN = 128
- function fuOpen () {
- fuStatus('Ready...')
- Modal.show('#fu_modal', onClose)
+ function openUploadDialog () {
+ updateStatus('Ready...')
+ Modal.show('#fu_modal', onDialogClose)
$('#fu_form').toggleClass('busy', false)
input.blockKeys(true)
}
- function onClose () {
+ function onDialogClose () {
console.log('Upload modal closed.')
clearTimeout(fuTout)
line_i = 0
input.blockKeys(false)
}
- function fuStatus (msg) {
+ function updateStatus (msg) {
qs('#fu_prog').textContent = msg
}
- function fuSend () {
+ function startUpload () {
let v = qs('#fu_text').value
if (!v.length) {
fuClose()
@@ -55,11 +55,11 @@ window.TermUpl = function (conn, input) {
}[qs('#fu_crlf').value]
$('#fu_form').toggleClass('busy', true)
- fuStatus('Starting...')
- fuSendLine()
+ updateStatus('Starting...')
+ uploadLine()
}
- function fuSendLine () {
+ function uploadLine () {
if (!$('#fu_modal').hasClass('visible')) {
// Modal is closed, cancel
return
@@ -67,7 +67,7 @@ window.TermUpl = function (conn, input) {
if (!conn.canSend()) {
// postpone
- fuTout = setTimeout(fuSendLine, 1)
+ fuTout = setTimeout(uploadLine, 1)
return
}
@@ -85,16 +85,16 @@ window.TermUpl = function (conn, input) {
}
if (!input.sendString(chunk)) {
- fuStatus('FAILED!')
+ updateStatus('FAILED!')
return
}
let all = lines.length
- fuStatus(line_i + ' / ' + all + ' (' + (Math.round((line_i / all) * 1000) / 10) + '%)')
+ updateStatus(line_i + ' / ' + all + ' (' + (Math.round((line_i / all) * 1000) / 10) + '%)')
if (lines.length > line_i || inline_pos > 0) {
- fuTout = setTimeout(fuSendLine, send_delay_ms)
+ fuTout = setTimeout(uploadLine, send_delay_ms)
} else {
closeWhenReady()
}
@@ -103,10 +103,10 @@ window.TermUpl = function (conn, input) {
function closeWhenReady () {
if (!conn.canSend()) {
// stuck in XOFF still, wait to process...
- fuStatus('Waiting for Tx buffer...')
+ updateStatus('Waiting for Tx buffer...')
setTimeout(closeWhenReady, 100)
} else {
- fuStatus('Done.')
+ updateStatus('Done.')
// delay to show it
setTimeout(function () {
fuClose()
@@ -138,9 +138,21 @@ window.TermUpl = function (conn, input) {
console.log('Loading file...')
reader.readAsText(file)
}, false)
- },
- close: fuClose,
- start: fuSend,
- open: fuOpen
+
+ qs('#term-fu-open').addEventListener('click', function () {
+ openUploadDialog()
+ return false
+ })
+
+ qs('#term-fu-start').addEventListener('click', function () {
+ startUpload()
+ return false
+ })
+
+ qs('#term-fu-close').addEventListener('click', function () {
+ fuClose()
+ return false
+ })
+ }
}
}
diff --git a/pages/term.php b/pages/term.php
index 85de910..16130c8 100644
--- a/pages/term.php
+++ b/pages/term.php
@@ -33,8 +33,8 @@