From fe0ca72b8bc560bd293e2171222c1cddb8b1c823 Mon Sep 17 00:00:00 2001 From: "kepler155c@gmail.com" Date: Mon, 16 Oct 2017 00:02:42 -0400 Subject: [PATCH] redo input translation -round 2 --- sys/apis/input.lua | 105 ++++++++++++++++++++++++-------------------- sys/apps/multishell | 24 ---------- 2 files changed, 58 insertions(+), 71 deletions(-) diff --git a/sys/apis/input.lua b/sys/apis/input.lua index 32c5f1f..e8ddce3 100644 --- a/sys/apis/input.lua +++ b/sys/apis/input.lua @@ -13,9 +13,9 @@ local input = { pressed = { }, } -function input:toCode(code) +function input:toCode(code, ch) - local ch = self.ch or keys.getName(code) + ch = ch or keys.getName(code) local result = { } if self.pressed[keys.leftCtrl] or self.pressed[keys.rightCtrl] then @@ -45,14 +45,17 @@ function input:reset() self.pressed = { } self.ch = nil self.fired = nil + self.timer = nil + self.mch = nil + self.mfired = nil end function input:translate(event, code, p1, p2) if event == 'key' then if p1 then -- key is held down if not modifiers[code] then - self.fired = input:toCode(code) + self.fired = input:toCode(code, self.ch) return self.fired end else @@ -63,66 +66,74 @@ function input:translate(event, code, p1, p2) elseif event == 'char' then self.ch = code + -- reset just in case + self.pressed[keys.leftCtrl] = nil + self.pressed[keys.rightCtrl] = nil elseif event == 'key_up' then if not self.fired then if self.pressed[code] then - self.fired = input:toCode(code) + self.fired = input:toCode(code, self.ch) self.pressed[code] = nil return self.fired end end - self.pressed[code] = nil - elseif event == 'mouse_click' then - - local buttons = { 'mouse_click', 'mouse_rightclick' } - self.ch = buttons[code] - self.fired = nil - --self.fired = input:toCode(0) - --return self.fired - - elseif event == 'mouse_drag' then - self.ch = 'mouse_drag' - self.fired = input:toCode(0) - return self.fired - - elseif event == 'mouse_up' then - if not self.fired then - local clock = os.clock() - if self.timer and - p1 == self.x and p2 == self.y and - (clock - self.timer < .5) then - - self.ch = 'mouse_doubleclick' - self.timer = nil - else - self.timer = os.clock() - self.x = p1 - self.y = p2 - end - self.fired = input:toCode(0) - else - self.ch = 'mouse_up' - self.fired = input:toCode(0) - end - return self.fired - - elseif event == "mouse_scroll" then - local directions = { - [ -1 ] = 'scrollUp', - [ 1 ] = 'scrollDown' - } - self.ch = directions[code] - return input:toCode(0) - elseif event == 'paste' then self.ch = 'paste' self.pressed[keys.leftCtrl] = nil self.pressed[keys.rightCtrl] = nil self.fired = input:toCode(0) return self.fired + + elseif event == 'mouse_click' then + local buttons = { 'mouse_click', 'mouse_rightclick' } + self.mch = buttons[code] + self.mfired = nil + + elseif event == 'mouse_drag' then + self.mch = 'mouse_drag' + self.mfired = input:toCode(0, self.mch) + return self.mfired + + elseif event == 'mouse_up' then + if not self.mfired then + local clock = os.clock() + if self.timer and + p1 == self.x and p2 == self.y and + (clock - self.timer < .5) then + + self.mch = 'mouse_doubleclick' + self.timer = nil + else + self.timer = os.clock() + self.x = p1 + self.y = p2 + end + self.mfired = input:toCode(0, self.mch) + else + self.mch = 'mouse_up' + self.mfired = input:toCode(0, self.mch) + end + return self.mfired + + elseif event == "mouse_scroll" then + local directions = { + [ -1 ] = 'scrollUp', + [ 1 ] = 'scrollDown' + } + self.mch = directions[code] + return input:toCode(0, self.mch) + end +end + +function input:test() + while true do + local ch = self:translate(os.pullEvent()) + if ch then + print('GOT: ' .. ch) + end end end diff --git a/sys/apps/multishell b/sys/apps/multishell index 00cfe1b..8b0039c 100644 --- a/sys/apps/multishell +++ b/sys/apps/multishell @@ -329,30 +329,6 @@ function multishell.getCount() return Util.size(tabs) end -function multishell.showMessage(text) - parentTerm.setCursorPos(3, 1) - parentTerm.setTextColor(_colors.textColor) - parentTerm.setBackgroundColor(_colors.backgroundColor) - if #text + 3 < w then - text = text .. string.rep(' ', w - #text - 3) - end - parentTerm.write(text) - if currentTab then - currentTab.window.restoreCursor() - end - local redrawTimer = os.startTimer(2) - - local redraw - function redraw(event, eventData) - if eventData[1] == redrawTimer then - redrawMenu() - multishell.unhook(event, redraw) - return true - end - end - multishell.hook('timer', redraw) -end - function multishell.hook(event, fn) if type(event) == 'table' then for _,v in pairs(event) do