diff --git a/.wallpaper.nfp b/.wallpaper.nfp index 1e65863..41ef0f7 100644 --- a/.wallpaper.nfp +++ b/.wallpaper.nfp @@ -6,13 +6,13 @@ 30000000300055555555d555555d3d333333303333333333330 3303333333353555555d5d555555d3333033333333330330000 033330303035355555555555555d3d333033033033333300000 -003030333333555ffff555ffff55d3303333333333303300077 -0033333033035555555555555555d3333303330330333000878 -78830333333535555555f555555d3d303333333333037787778 -87844bb0b0bb55b5555555555dbddbbbbbb0bbbb44407878888 -0780044bbbb0bb5b55555555dbdbb0b0bbbbbb4440778888888 -7870040b0b0bbbbb55555555dbbbbbbb0bb0b44407888808888 +003030333333555ffff555ffff55d3303333333333303300007 +0033333033035555555555555555d3333303330330333000877 +78830333333535555555f555555d3d303333333333037787787 +87844bb0b0bb55b5555555555dbddbbbbbb0bbbb44407878887 +0780044bbbb0bb5b55555555dbdbb0b0bbbbbb4440778888877 +7870040b0b0bbbbb55555555dbbbbbbb0bb0b44407888808788 78080044bbbbb0bb55555555db0bb0bb0bbbb40077870878087 -78788004bbb0bbb555555555dbbbbbbbbbbb440078788887787 +78788004bbb0bbb5555555555dbbbbbbbbbb440078788887787 778788004b0bbbb5555555555dbbbb0bbb04408878888088777 -777888004bbbbb555555555555dbbbbbbbb4008878088878888 +777888004bbbbb555555555555dbbbbbbbb4008878088878877 diff --git a/apps/launcher.lua b/apps/launcher.lua index 3fdd7a5..25ff8ac 100644 --- a/apps/launcher.lua +++ b/apps/launcher.lua @@ -3,6 +3,7 @@ local threading = require("libs.threading") local x, y = term.getSize() local win = window.create("Launcher", x / 3, y / 1.4, x / 2 - ((x / 3) / 2), y / 2 - ((y / 1.5) / 2)) win.decorations = false +win.draggable = false win.alwaysOnTop = true local apps = {} -- tiny alphabetical boost based on the first A–Z letter in the name diff --git a/apps/worm.lua b/apps/worm.lua index 0dcb704..2c65682 100644 --- a/apps/worm.lua +++ b/apps/worm.lua @@ -2,6 +2,7 @@ local compat = require("libs.compat") local window = require("libs.window") local x, y = term.getSize() local win = window.create("Worm", x / 1.4, y / 1.4, x / 2 - ((x / 1.4) / 2), y / 2 - ((y / 1.5) / 2)) +win.resizable = false sleep() compat.runFile("/rom/programs/fun/worm.lua", win) win.close() diff --git a/libs/compat.lua b/libs/compat.lua index 54b45fd..2c10796 100644 --- a/libs/compat.lua +++ b/libs/compat.lua @@ -520,6 +520,7 @@ function lib.setupENV(win) if http then load_apis("rom/apis/http") end if turtle then load_apis("rom/apis/turtle") end if pocket then load_apis("rom/apis/pocket") end + env.shell = shell env._ENV = env env._G = env @@ -534,7 +535,7 @@ local function generate_id(length) return id end -local function runInRuntime(func, win) +local function runInRuntime(func, win, close_handled) expect(1, func, "function") expect(2, win, "table") local co = coroutine.create(func) @@ -570,8 +571,14 @@ local function runInRuntime(func, win) os.queueEvent("key_up_" .. winid, key, winid) end - function win.closeRequested() - run = false + function win.resized() + os.queueEvent("term_resize_"..winid, winid) + end + + if close_handled then + function win.closeRequested() + run = false + end end local function escape_lua_pattern(s) @@ -628,6 +635,11 @@ local function runInRuntime(func, win) data.n = data.n - 1 event_data = data end + elseif data[1] == "term_resize" then + if data[#data] == winid then + data.n = data.n - 1 + event_data = data + end else event_data = data end @@ -637,13 +649,13 @@ local function runInRuntime(func, win) end end -function lib.runFunc(func, win) - runInRuntime(setfenv(func, lib.setupENV(win)), win) +function lib.runFunc(func, win, close_handled) + runInRuntime(setfenv(func, lib.setupENV(win)), win, close_handled) end -function lib.runFile(file, win) +function lib.runFile(file, win, close_handled) local func = loadfile(file) - runInRuntime(setfenv(func, lib.setupENV(win)), win) + runInRuntime(setfenv(func, lib.setupENV(win)), win, close_handled) end return lib diff --git a/libs/window.lua b/libs/window.lua index 7d0cd28..7132912 100644 --- a/libs/window.lua +++ b/libs/window.lua @@ -65,6 +65,8 @@ function lib.create(name, w, h, x, y) name = name, w = w, h = h, + min_w = 3, + min_h = 3, x = x or 1, y = y or 2, @@ -75,6 +77,8 @@ function lib.create(name, w, h, x, y) textColor = colors.white, bgColor = colors.black, cursorBlink = false, + resizable = true, + draggable = true, decorations = true, alwaysOnTop = false, alwaysBelow = false, @@ -96,6 +100,7 @@ function lib.create(name, w, h, x, y) init_col(xi) for yy = 1, t.h do local cell = t.buffer[xi][yy] + if not cell then cell = { char = " ", tc = t.textColor, bc = t.bgColor } end cell.char, cell.tc, cell.bc = " ", t.textColor, t.bgColor end end @@ -286,6 +291,8 @@ function lib.create(name, w, h, x, y) function t.key_up(key) end + function t.resized(w,h) end + function t.closeRequested() t.closing = true end function t.close() diff --git a/modules/entrypointclient.lua b/modules/entrypointclient.lua index f973be9..53f9572 100644 --- a/modules/entrypointclient.lua +++ b/modules/entrypointclient.lua @@ -1,10 +1,10 @@ local max_distance = 220 -local pullEvent = os.pullEventRaw +_G.network = {} + local modem = peripheral.find("modem",function (s) return peripheral.wrap(s).isWireless() end) term.clear() term.setCursorPos(1,1) -_G.network = {} if not modem then return end @@ -14,7 +14,7 @@ local canidate = {id = -1, distance = max_distance} parallel.waitForAny(function () repeat sleep(0.1) until canidate.id ~= -1 end, function () while true do - local _, _, channel, _, msg, distance = pullEvent("modem_message") + local _, _, channel, _, msg, distance = os.pullEvent("modem_message") if channel == 15125 then if msg.protocol == "entrypoint_advertise" then if distance < canidate.distance then @@ -30,18 +30,19 @@ modem.transmit(15125,15125,{protocol="entrypoint_connect",sender=os.getComputerI local function receive() while true do - local _, _, channel, _, msg, distance = pullEvent("modem_message") + local _, _, channel, _, msg, distance = os.pullEvent("modem_message") if channel == 15125 then if msg.protocol == "heartbeat" and msg.target == os.getComputerID() and msg.sender == canidate.id then last_heartbeat = os.epoch("utc") modem.transmit(15125,15125,{protocol="heartbeat_response",sender=os.getComputerID(),target=canidate.id}) + canidate.distance = distance if distance > max_distance then modem.transmit(15125,15125,{protocol="entrypoint_disconnect",sender=os.getComputerID(),target=canidate.id}) canidate = {id = -1, distance = max_distance} parallel.waitForAny(function () repeat sleep(0.1) until canidate.id ~= -1 end, function () while true do - local _, _, channel, _, msg, distance = pullEvent("modem_message") + local _, _, channel, _, msg, distance = os.pullEvent("modem_message") if channel == 15125 then if msg.protocol == "entrypoint_advertise" then if distance < canidate.distance then @@ -73,6 +74,12 @@ function _G.network.send(msg,destination) if not destination then error("No destination provided",2) end message_queue[#message_queue+1] = {protocol="packet",content=msg,destination=destination,sender=os.getComputerID(),hops=0} end +function _G.network.getID() + return canidate.id +end +function _G.network.getDistance() + return canidate.distance +end local function connect() while true do @@ -81,7 +88,7 @@ local function connect() parallel.waitForAny(function () repeat sleep(0.1) until canidate.id ~= -1 end, function () while true do - local _, _, channel, _, msg, distance = pullEvent("modem_message") + local _, _, channel, _, msg, distance = os.pullEvent("modem_message") if channel == 15125 then if msg.protocol == "entrypoint_advertise" then if distance < canidate.distance then diff --git a/modules/interactions.lua b/modules/interactions.lua index 5c61a18..ca2a023 100644 --- a/modules/interactions.lua +++ b/modules/interactions.lua @@ -1,6 +1,8 @@ local threading = require("libs.threading") local dragging = nil +local resizing = false local offsetX, offsetY = 0, 0 +local key = {} local function bringtofront(indx) local win = _G.windows[indx] if win.alwaysOnTop or win.alwaysBelow then return end @@ -31,7 +33,13 @@ while true do if data[1] == "mouse_click" then for indx = #_G.windows, 1, -1 do local win = _G.windows[indx] - if win.y - 1 == data[4] and win.x + 1 <= data[3] and win.x + win.w >= data[3] and data[2] == 1 and win.decorations then + if data[4] == 1 then + break + elseif win.x+win.w-1 == data[3] and win.y+win.h-1 == data[4] and win.decorations and win.resizable then + dragging = win + resizing = true + bringtofront(indx) + elseif ((win.y - 1 == data[4] and win.x + 1 <= data[3] and win.x + win.w >= data[3] and data[2] == 1 and win.decorations) or (win.y <= data[4] and win.x <= data[3] and win.y + win.h > data[4] and win.x + win.w > data[3] and key[keys["leftAlt"] and win.draggable])) then dragging = win offsetX = win.x - data[3] offsetY = win.y - data[4] @@ -49,8 +57,14 @@ while true do end elseif data[1] == "mouse_drag" then if data[2] == 1 and dragging then - dragging.x = data[3] + offsetX - dragging.y = data[4] + offsetY + if resizing then + dragging.w = math.max(data[3] - dragging.x + 1,dragging.min_w) + dragging.h = math.max(data[4] - dragging.y + 1,dragging.min_h) + threading.addThread(function()dragging.resized(dragging.w,dragging.h)end) + else + dragging.x = data[3] + offsetX + dragging.y = data[4] + offsetY + end else for indx = #_G.windows, 1, -1 do local win = _G.windows[indx] @@ -64,6 +78,7 @@ while true do elseif data[1] == "mouse_up" then if data[2] == 1 and dragging then dragging = nil + resizing = false else for indx = #_G.windows, 1, -1 do local win = _G.windows[indx] @@ -83,6 +98,7 @@ while true do end end elseif data[1] == "key" then + key[data[2]] = true if _G.windows[#_G.windows] then threading.addThread(function() _G.windows[#_G.windows].key(data[2], data[3]) end) end @@ -91,6 +107,7 @@ while true do threading.addThread(function() _G.windows[#_G.windows].char(data[2]) end) end elseif data[1] == "key_up" then + key[data[2]] = false if _G.windows[#_G.windows] then threading.addThread(function() _G.windows[#_G.windows].key_up(data[2]) end) end diff --git a/startup.lua b/startup.lua index 0d76f66..b89c225 100644 --- a/startup.lua +++ b/startup.lua @@ -1,4 +1,5 @@ --os.pullEvent = os.pullEventRaw + local window = require("libs.window") local nft = require "cc.image.nft" local wrap = require("cc.strings").wrap @@ -42,18 +43,34 @@ local function windows() term.setCursorPos(win.x, win.y + cy - 1) local line, fg, bg = "", "", "" for cx = 1, win.w do - local cell = win.buffer[cx][cy] - line = line .. cell.char - fg = fg .. ("0123456789abcdef"):sub(math.log(cell.tc, 2) + 1, math.log(cell.tc, 2) + 1) - bg = bg .. ("0123456789abcdef"):sub(math.log(cell.bc, 2) + 1, math.log(cell.bc, 2) + 1) + if win.buffer[cx] then + local cell = win.buffer[cx][cy] + if cell then + line = line .. cell.char + fg = fg .. ("0123456789abcdef"):sub(math.log(cell.tc, 2) + 1, math.log(cell.tc, 2) + 1) + bg = bg .. ("0123456789abcdef"):sub(math.log(cell.bc, 2) + 1, math.log(cell.bc, 2) + 1) + else + line = line .. " " + fg = fg .. "0" + bg = bg .. "f" + end + else + line = line .. " " + fg = fg .. "0" + bg = bg .. "f" + end end term.blit(line, fg, bg) end if win.decorations then term.setCursorPos(win.x, win.y - 1) term.setTextColor(colors.white) - term.setBackgroundColor(colors.gray) - term.write("X " .. win.name .. string.rep(" ", win.w - #win.name - 2)) + term.setBackgroundColor(colors.blue) + term.write(string.sub("X " .. win.name .. string.rep(" ", win.w - #win.name - 2),1,win.w)) + if win.resizable then + term.setCursorPos(win.x+win.w-1,win.y+win.h-1) + term.write("\127") + end end term.setCursorPos(win.x + win.cursorX - 1, win.y + win.cursorY - 1) term.setCursorBlink(win.cursorBlink) @@ -70,17 +87,29 @@ local function desktop() local w, h = term.getSize() term.setBackgroundColor(colors.white) term.clear() - term.setCursorPos(1, 1) - term.setTextColor(colors.white) - term.setBackgroundColor(colors.gray) - term.clearLine() - term.write(" "..((_G.windows[#_G.windows] or {name=""}).name or "").." ") if image then nft.draw(image,1,1) elseif paint_image then paintutils.drawImage(paint_image,1,2) end end + +local function bars() + local cx,cy = term.getCursorPos() + local w, h = term.getSize() + term.setCursorPos(1, 1) + term.setTextColor(colors.white) + term.setBackgroundColor(colors.gray) + term.clearLine() + term.write(" "..((_G.windows[#_G.windows] or {name=""}).name or "").." ") + local rightbar = "" + if network and network.getID and network.getDistance and network.getID() ~= -1 then + rightbar = "id: "..tostring(network.getID()).." dist: "..tostring(math.floor(network.getDistance()+0.5)) + end + term.setCursorPos(w-(#rightbar),1) + term.write(rightbar) + term.setCursorPos(cx,cy) +end local threading = require("libs.threading") local compat = require("libs.compat") for _, i in ipairs(fs.list("/modules")) do @@ -93,6 +122,7 @@ local function render() while true do desktop() windows() + bars() sleep(1 / 20) end end