1
0
mirror of https://github.com/kepler155c/opus synced 2025-02-28 23:00:02 +00:00

multishell/kernel support for windows on different devices

This commit is contained in:
kepler155c@gmail.com 2020-05-04 16:41:35 -06:00
parent 447f4daa92
commit d7f41f2bce
3 changed files with 56 additions and 45 deletions

View File

@ -296,40 +296,46 @@ kernel.hook('term_resize', function(_, eventData)
end) end)
kernel.hook('mouse_click', function(_, eventData) kernel.hook('mouse_click', function(_, eventData)
local x, y = eventData[2], eventData[3] if not eventData[4] then
local x, y = eventData[2], eventData[3]
if y == 1 then if y == 1 then
if x == 1 then if x == 1 then
multishell.setFocus(overviewId) multishell.setFocus(overviewId)
elseif x == w then elseif x == w then
local currentTab = kernel.getFocused() local currentTab = kernel.getFocused()
if currentTab then if currentTab then
multishell.terminate(currentTab.uid) multishell.terminate(currentTab.uid)
end end
else else
for _,tab in pairs(kernel.routines) do for _,tab in pairs(kernel.routines) do
if not tab.hidden and tab.sx then if not tab.hidden and tab.sx then
if x >= tab.sx and x <= tab.ex then if x >= tab.sx and x <= tab.ex then
multishell.setFocus(tab.uid) multishell.setFocus(tab.uid)
break break
end
end end
end end
end end
return true
end end
return true eventData[3] = eventData[3] - 1
end end
eventData[3] = eventData[3] - 1
end) end)
kernel.hook({ 'mouse_up', 'mouse_drag' }, function(_, eventData) kernel.hook({ 'mouse_up', 'mouse_drag' }, function(_, eventData)
eventData[3] = eventData[3] - 1 if not eventData[4] then
eventData[3] = eventData[3] - 1
end
end) end)
kernel.hook('mouse_scroll', function(_, eventData) kernel.hook('mouse_scroll', function(_, eventData)
if eventData[3] == 1 then if not eventData[4] then
return true if eventData[3] == 1 then
return true
end
eventData[3] = eventData[3] - 1
end end
eventData[3] = eventData[3] - 1
end) end)
kernel.hook('kernel_ready', function() kernel.hook('kernel_ready', function()

View File

@ -50,13 +50,19 @@ function kernel.hook(event, fn)
end end
end end
-- you can only unhook from within the function that hooked -- you *should* only unhook from within the function that hooked
function kernel.unhook(event, fn) function kernel.unhook(event, fn)
local eventHooks = kernel.hooks[event] if type(event) == 'table' then
if eventHooks then for _,v in pairs(event) do
Array.removeByValue(eventHooks, fn) kernel.unhook(v, fn)
if #eventHooks == 0 then end
kernel.hooks[event] = nil else
local eventHooks = kernel.hooks[event]
if eventHooks then
Array.removeByValue(eventHooks, fn)
if #eventHooks == 0 then
kernel.hooks[event] = nil
end
end end
end end
end end
@ -107,6 +113,9 @@ function Routine:resume(event, ...)
end end
if coroutine.status(self.co) == 'dead' then if coroutine.status(self.co) == 'dead' then
Array.removeByValue(kernel.routines, self) Array.removeByValue(kernel.routines, self)
if self.onDestroy then
self.onDestroy(self)
end
if #kernel.routines > 0 then if #kernel.routines > 0 then
switch(kernel.routines[1]) switch(kernel.routines[1])
end end

View File

@ -75,11 +75,11 @@ function UI:init()
term_resize = resize, term_resize = resize,
monitor_resize = resize, monitor_resize = resize,
mouse_scroll = function(_, direction, x, y) mouse_scroll = function(_, direction, x, y, side)
local ie = Input:translate('mouse_scroll', direction, x, y) local ie = Input:translate('mouse_scroll', direction, x, y)
local currentPage = self:getActivePage() local currentPage = self:getActivePage()
if currentPage then if currentPage and currentPage.parent.device.side == side then
local event = currentPage:pointToChild(x, y) local event = currentPage:pointToChild(x, y)
event.type = ie.code event.type = ie.code
event.ie = { code = ie.code, x = event.x, y = event.y } event.ie = { code = ie.code, x = event.x, y = event.y }
@ -97,23 +97,21 @@ function UI:init()
end end
end, end,
mouse_click = function(_, button, x, y) mouse_click = function(_, button, x, y, side)
local ie = Input:translate('mouse_click', button, x, y) local ie = Input:translate('mouse_click', button, x, y)
local currentPage = self:getActivePage() local currentPage = self:getActivePage()
if currentPage then if currentPage and currentPage.parent.device.side == side then
if not currentPage.parent.device.side then local event = currentPage:pointToChild(x, y)
local event = currentPage:pointToChild(x, y) if event.element.focus and not event.element.inactive then
if event.element.focus and not event.element.inactive then currentPage:setFocus(event.element)
currentPage:setFocus(event.element) currentPage:sync()
currentPage:sync()
end
self:click(currentPage, ie)
end end
self:click(currentPage, ie)
end end
end, end,
mouse_up = function(_, button, x, y) mouse_up = function(_, button, x, y, side)
local ie = Input:translate('mouse_up', button, x, y) local ie = Input:translate('mouse_up', button, x, y)
local currentPage = self:getActivePage() local currentPage = self:getActivePage()
@ -124,18 +122,16 @@ function UI:init()
args = { event.element }, args = { event.element },
focused = true }) focused = true })
elseif ie and currentPage then elseif ie and currentPage and currentPage.parent.device.side == side then
if not currentPage.parent.device.side then self:click(currentPage, ie)
self:click(currentPage, ie)
end
end end
end, end,
mouse_drag = function(_, button, x, y) mouse_drag = function(_, button, x, y, side)
local ie = Input:translate('mouse_drag', button, x, y) local ie = Input:translate('mouse_drag', button, x, y)
local currentPage = self:getActivePage() local currentPage = self:getActivePage()
if ie and currentPage then if ie and currentPage and currentPage.parent.device.side == side then
self:click(currentPage, ie) self:click(currentPage, ie)
end end
end, end,