Ugly af, but better than crashing.
F7JBFZFRALHRUTYYHJ2J7OBBB5WYPJBDTLDLZAMTVC3FUVJ7MAIAC GINJ6NSV3SNPK7F3XYHL5QR7MYXADMATUE5Z7VAKZBWTWXPHGYFAC IK76TR3IFTEH5VUEHUF5KDMIGT3EI5WUXAF2I2SI3OEP3VSLJOXAC GFJXAW5RB6TP5YBRDXSEGGJSBZA7YQBBNZERG6L7CRURM66KYHHAC BWZXPP7BDZ5BRYHADWZCK3UELYUL67JO7SDP2QM3YCFSZBWMKYAQC BVL72CM4WMKHMENSC4JEWEQ5XTB5CXQ5U6BQHTOIL7VJSVZ6DWFAC SPTL7VK47SAGTCGQDCQWMEFC43KWJNWCL76NSYHEVBENHIWKRWNAC CMGIWHDA5EQY22VK7GJMDMCONMVYKJ7HCB6QISHTMVZGUBIPAYFQC OTIBCAUJ3KDQJLVDN3A536DLZGNRYMGJLORZVR3WLCGXGO6UGO6AC 3JDTNKUEWV3V2ABWCOAR4I5LHY3R4MARCFAAQ3KEYGKYHQOXCC2QC YKRUNSPXQMYUZM2HC2BWRL3OLVF5X3Y3XASG7JCT4TW4VUHZD6ZAC EGS44RTAG7JVLLEA4KH63MBZAD4O5HNRSJQIOC6SRKHUG3G56R6QC Y4M5FINMIU5YBMIUAFPNN6FRTONITB4FH4CF4SAN7EZEILT6YRPQC X22MOJHFLXMZQJN4IP2HAXIIVD2ALPR4EO5V5YDYF6QPXS7ZNB6QC DUQDA3U7VNWZSKRVACS6G3FTEB5VXRR7FJQU5NYZ4EFSGL3XUU5QC XUU6TARAAE67BNVKF5QLT3J2TKUW3P7ZVY5LESSDJLIRGLFP2U2AC LW6UME22NIRDLYNQDP47SLYT2ZEBD4HMHQOJNXJRRXQYVMNF4IGAC VHWC2IGQD72ZZUIONIAEP45KPMPX2N6DXN6NU2QGBIWDUHP7INAAC NR4MDLT4RL46HGPFOH24XD5TWF4WJIWJZQGQEQAGZ2EUM5C7FUZQC MEBSNDGI2LWI56TYXWDQCAVNZOKJRQVVIFPNWHSIHK2A2B2QWKSAC QL7T6VAFKSK2AOIIRT3HGDY4UXYFKY747FM4BICGPSKFDUZM62DQC DGMHQDVOII6WF2OJNHP42AYYMCMAIM266I3KHED74OBYMIWWAQXQC RQ37HOBMOPOATWRTCEYIRSSGO6P63SQTGFUQM32QFJXKQI5NYDMQC DIVBY22FIFTEVZ3TMPJZFTC55G3GU6SBXQ6ILPGNSFPBWKXWGLPQC VAMA5WWY2UDCK4UPFY4YV2BM6ETRCQTY6IP3AVKS4L3VHLBYFS2AC 5E6DJTFMGUDYGZ3WT5BGSR7KO5WWZ3LV47HNMTHWVIJLBACTRWVQC NAYXSB4JJOE2TQJY4KJ76FICNYUCILJYMOHWXHGFX4MKHGEMP4UAC B22JHH4W75CLJTHZWAHJZWYL3L7IN4MSIJSR5CCCCXYWYA27TRNQC PFD77S6HSVIHU7E76SMCAIODTXL4IOM3K44P2X7SLT3BBIRILXOQC APB53SRWHTVVFVFHCPAGYG2F64NL2WGZSAN5CJ3HFP2MFO33GX5AC GQBUV2XOMEPMTXMPCBQWGGIUXGQDX77VTGPFIG6YT7G64ASOYHXQC CVK6T5OZZPWGWZ4E2QQZKCOWZPC25EDWXZWLLTPBDDRGEQGADKNAC MR6AZIQOKRRF4FQX2KDDU7GLZHFRF7UPBDGNTCQYNCYGGKWJJ42AC 6QGMBSN6LJUCTRYMS5H27WGZGPN26CSJGY6XI2KZXFEGF5UVJISAC SKGUJVTZNEQACCEFQDLSDHJGSVLR5YOENPYFSVIETY7KHJKESGAAC IUBUKOBFGTLXNHRNYGVN35F5OQISTGQDB27WMS2LXBVVBXCXGUDQC F7MP5BERVKCYMWFWQ7EBOJFYY3FYWFVLYENXTWKPREGDLFRESPBAC QMWB3N3NKEACQBGY7JRFW5J74Z74CBLKJC2EDJJEDV7NKM2NQCGQC 32UWO2J35LPPYVWLGE6QUKPU7CY7PNM4NMNQOMWUXF7I34XIUSGAC 6SEECG7ACIN6ZK72ED3DKYZKBNM5M5OMTD4M6HLNMAH376NYNAEAC UJ27PGBNBE7ARCKWT7O7BX6RVU5DDEYLKYRQYFBUWHLDMYKZ2CZQC PJNQY5CDYYWKFUFK3OFXU7UZCFTTMBSYDMEKIY7LUZIB5XFRTQQQC 7JAODGVLU6GEMEJTJL34QMYOCKWPFX22A4UH5SLSDGSIVIRETO7QC 4PPQU5WW2BHKO32CY24KGQXM6GHZQCIWQYQ2JATKJWYIE3HMMX5QC ZU3HJ6NH26LFY2NWRCCRMXECNEPVR25OJNOFEK5XJ3KYFJUCKQXAC XV52L22IDM4Y22GLHJOPWWCEXRGJVUJWXDHSFS2UQNX66CE55VJQC DFO5SFDTU6GR5XQ4X5U6I2BENQNQP3M4EUUQ2E2DQEB3YQYS2WIAC local pane = Surface[Cursor_pane.col][Cursor_pane.row]pane.top = Header_height + Margin_abovepane.left = App.screen.width/2 - 20*App.width(Em)pane.right = App.screen.width/2 + 20*App.width(Em)edit.draw(pane)
if Cursor_pane.col >= 1 thenlocal pane = Surface[Cursor_pane.col][Cursor_pane.row]if pane thenpane.top = Header_height + Margin_abovepane.left = App.screen.width/2 - 20*App.width(Em)pane.right = App.screen.width/2 + 20*App.width(Em)edit.draw(pane)endend
local pane = Surface[Cursor_pane.col][Cursor_pane.row]if pane and pane.editable thenedit.quit(pane)
if Cursor_pane.col >= 1 thenlocal pane = Surface[Cursor_pane.col][Cursor_pane.row]if pane and pane.editable thenedit.quit(pane)end
local pane = Surface[Cursor_pane.col][Cursor_pane.row]edit.mouse_pressed(pane, x,y, mouse_button)pane._height = nil
if Cursor_pane.col >= 1 thenlocal pane = Surface[Cursor_pane.col][Cursor_pane.row]if pane thenedit.mouse_pressed(pane, x,y, mouse_button)pane._height = nilendend
local pane = Surface[Cursor_pane.col][Cursor_pane.row]if not pane.editable then-- global hotkeys for normal modeif t == 'X' thencommand.wider_columns()returnelseif t == 'x' thencommand.narrower_columns()returnend-- send keys to the current paneelseif pane.cursor_x >= 0 and pane.cursor_x < App.screen.width thenif pane.cursor_y >= Header_height and pane.cursor_y < App.screen.height thenedit.textinput(pane, t)
if Cursor_pane.col >= 1 thenlocal pane = Surface[Cursor_pane.col][Cursor_pane.row]if pane thenif not pane.editable then-- global hotkeys for normal modeif t == 'X' thencommand.wider_columns()returnelseif t == 'x' thencommand.narrower_columns()returnend-- send keys to the current paneelseif pane.cursor_x >= 0 and pane.cursor_x < App.screen.width thenif pane.cursor_y >= Header_height and pane.cursor_y < App.screen.height thenedit.textinput(pane, t)endend
local pane = Surface[Cursor_pane.col][Cursor_pane.row]if pane.editable thenedit.textinput(pane, t)
if Cursor_pane.col >= 1 thenlocal pane = Surface[Cursor_pane.col][Cursor_pane.row]if pane thenif pane.editable thenedit.textinput(pane, t)endend
local pane = Surface[Cursor_pane.col][Cursor_pane.row]if pane and pane.editable thenkeychord_pressed_on_editable_pane(pane, chord, key)elsekeychord_pressed_in_normal_mode_with_immutable_pane(pane, chord, key)
if Cursor_pane.col >= 1 thenlocal pane = Surface[Cursor_pane.col][Cursor_pane.row]if pane and pane.editable thenkeychord_pressed_on_editable_pane(pane, chord, key)elsekeychord_pressed_in_normal_mode_with_immutable_pane(pane, chord, key)end-- editable cursor pane will have already updated its screen_top, so don't clobber it hereplan_draw{ignore_editable_cursor_pane=true}
local pane = Surface[Cursor_pane.col][Cursor_pane.row]refresh_pane_height(pane)plan_draw()
if Cursor_pane.col >= 1 thenlocal pane = Surface[Cursor_pane.col][Cursor_pane.row]if pane thenrefresh_pane_height(pane)plan_draw()endend