QXH7FQHFQBYFN7EPTFCQHZL6CL2K7F7BX4LA7H42Y2OR66N5LCAQC RNH2W5MPZBXJ6QCAXLYPU72ILMPMIDBKTMSENFWUK3ESZXSTUP7QC TAOVHUDMSPGIUIYWRQAY7WOBPEKWXFI5BQW5DAIFXL3I3GP2QYYQC QJAYOFWY7V4BWVLJMEDCCBC2HX4BDAZI6PQVLWCLYRHWGMOBFTVAC FWCILHZLHSMW2RQF4ZTJVABMHTD6IR4KPCHUEJFTQT2MXHV75XDQC DYZVG4MOJIQJVZMYHHZ7KEQJ35L22OTLN6I6JJI7ABEC5C3KHY3AC 54Y4QQG3ETC4YMUDDJBQO4SLFMX3NOLI5PRGVHUY2DVGZAUJBZVAC 7IJQIPGG4G2DJAS2W4MUHB2TTJ75ZST6VNAMUYZXEYOVRIV4FZ5QC CA32MRE2G2SLFQIGKU2PW66JI45AFKDSZR277C3XDJUPNMHKMOUQC ZHEJFKSLMORNRVOM7ZY7P4WAXIKGTQ5JVRJRWICXNXKF6HJWEFCQC OEJIDMZ2F2WEV7N7PSLMJL3RG55ZHI552AQJUTCG27XRT4VZTRUAC 7TQAF4BYIK75EEYCCK7VEUSZHNCWMWIA3HZGQKIILYESUZ5ZZRVQC OELP2MAL5RGZ3AZ42V6H7RLGX52JLNHGUD7GV6YIVZ3ACOK5SFSQC R5HNWYMH47LWVHS5VVXNR6TCBDXDURVXZ6RCUNFTTTMIXF275ULQC JIBCE66ZTWM5WEHEHNKKTRWBJQSQWBDDWPMOJIJR5Q676OSHYCNAC SUPHTPXYKS4JBDPASHAYA5OBVJ45QT7ZV2HYNTF7OJYOKKS6DW5QC 6C3UZDESM2HPFIHAW5YIPUV6VXO4YV5DIEY574HUGP2DGOQNUVOAC BF7TW3EKRIDYC6J2Q2J4YOBAVQF55Y3H6KGZIHNXMH4N72MR6GXQC UNPWB53SP3OIN2FEUK6L3YCKYXWEKPRGU3MPGGVLHH2WDTIR4TFQC 7P3EK7K2AWA3YDMQBFWJY4TVIKGJ5LI7E4P4F7Z2CVAGVETA3JHAC 5TTD5NPQPH2XMC552EMPP4WY7GVHR3RM5LCVZWXBQXOOACZMTUNAC CWDOQLMNGY6BP3QCSQCQ7NG5XZN3QIKPZ5YMQHS3AC53J6QZ5RUQC TBPJ5WSRM5IKQH7FTAVYTWWUBWW7G2CLT5M6FN7CMPLD6Y77YIWQC ZSXRELZMBQAH2SURKXJW7XR42WGT6L6DQBBMBMHAHJCVKAANK5HQC --? print('edit', old_top.line, '=>', Cursor_node.editor.screen_top1.line)if not eq(Cursor_node.editor.screen_top1, old_top) then--? print('modifying Viewport', Viewport.y, 'based on', Cursor_node.y, Cursor_node.editor.screen_top1.line, Cursor_node.editor.line_height)Viewport.y = Cursor_node.y + y_of_schema1(Cursor_node.editor, Cursor_node.editor.screen_top1)/Viewport.zoom--? print('modified Viewport', Viewport.y)-- Most of the time, we update the screen_top of nodes from Viewport.y.-- But here we went the other way.-- It's very important to avoid creating a recurrence, to avoid running-- both sides of this feedback loop in a single frame. These apps are-- not very numerically precise (e.g. we force text lines to start at-- integer pixels regardless of zoom, because that keeps text crisp),-- and the computations of Viewport.y and node.top will almost certainly-- not converge. The resulting bugs are extremely difficult to chase-- down.-- The optional skip_updating_screen_top_for arg ensures we don't run-- the other side of the feedback loop.A(--[[skip updating screen_top for]] Cursor_node)returnend
pan_viewport_to_contain_cursor(Cursor_node)