diff --git a/run.lua b/run.lua index b56a0d2..2030c93 100644 --- a/run.lua +++ b/run.lua @@ -55,21 +55,28 @@ end function run.load_settings() love.graphics.setFont(love.graphics.newFont(Settings.font_height)) - -- determine default dimensions and flags - App.screen.width, App.screen.height, App.screen.flags = App.screen.size() - -- set up desired window dimensions + -- set up desired window dimensions and make window resizable + _, _, App.screen.flags = App.screen.size() App.screen.flags.resizable = true - App.screen.flags.minwidth = math.min(App.screen.width, 200) - App.screen.flags.minheight = math.min(App.screen.height, 200) App.screen.width, App.screen.height = Settings.width, Settings.height App.screen.resize(App.screen.width, App.screen.height, App.screen.flags) - App.screen.move(Settings.x, Settings.y, Settings.displayindex) + run.set_window_position_from_settings(Settings) Editor_state = edit.initialize_state(Margin_top, Margin_left, App.screen.width-Margin_right, Settings.font_height, math.floor(Settings.font_height*1.3)) Editor_state.filename = Settings.filename Editor_state.screen_top1 = Settings.screen_top Editor_state.cursor1 = Settings.cursor end +function run.set_window_position_from_settings(settings) + local os = love.system.getOS() + if os == 'Linux' then + -- love.window.setPosition doesn't quite seem to do what is asked of it on Linux. + App.screen.move(settings.x, settings.y-37, settings.displayindex) + else + App.screen.move(settings.x, settings.y, settings.displayindex) + end +end + function run.initialize_default_settings() local font_height = 20 love.graphics.setFont(love.graphics.newFont(font_height)) @@ -81,22 +88,17 @@ function run.initialize_default_settings() end function run.initialize_window_geometry(em_width) - local os = love.system.getOS() - if os == 'Android' or os == 'iOS' then - -- maximizing on iOS breaks text rendering: https://github.com/deltadaedalus/vudu/issues/7 - -- no point second-guessing window dimensions on mobile - App.screen.width, App.screen.height, App.screen.flags = App.screen.size() - return - end - -- maximize window - App.screen.resize(0, 0) -- maximize + -- Initialize window width/height and make window resizable. + -- + -- I get tempted to have opinions about window dimensions here, but they're + -- non-portable: + -- - maximizing doesn't work on mobile and messes things up + -- - maximizing keeps the title bar on screen in Linux, but off screen on + -- Windows. And there's no way to get the height of the title bar. + -- It seems more robust to just follow LÖVE's default window size until + -- someone overrides it. App.screen.width, App.screen.height, App.screen.flags = App.screen.size() - -- shrink height slightly to account for window decoration - App.screen.height = App.screen.height-100 - App.screen.width = 40*em_width App.screen.flags.resizable = true - App.screen.flags.minwidth = math.min(App.screen.width, 200) - App.screen.flags.minheight = math.min(App.screen.height, 200) App.screen.resize(App.screen.width, App.screen.height, App.screen.flags) end @@ -148,12 +150,8 @@ function run.quit() end function run.settings() - if Settings == nil then - Settings = {} - end - if Current_app == 'run' then - Settings.x, Settings.y, Settings.displayindex = App.screen.position() - end + if Settings == nil then Settings = {} end + Settings.x, Settings.y, Settings.displayindex = App.screen.position() return { x=Settings.x, y=Settings.y, displayindex=Settings.displayindex, width=App.screen.width, height=App.screen.height, diff --git a/source.lua b/source.lua index 6f5ff0a..7e85bf8 100644 --- a/source.lua +++ b/source.lua @@ -121,8 +121,11 @@ end function source.load_settings() local settings = Settings.source love.graphics.setFont(love.graphics.newFont(settings.font_height)) - source.resize_window_from_settings(settings) ---? print('loading source position', settings.x, settings.y, settings.displayindex) + -- set up desired window dimensions and make window resizable + _, _, App.screen.flags = App.screen.size() + App.screen.flags.resizable = true + App.screen.width, App.screen.height = settings.width, settings.height + App.screen.resize(App.screen.width, App.screen.height, App.screen.flags) source.set_window_position_from_settings(settings) Show_log_browser_side = settings.show_log_browser_side local right = App.screen.width - Margin_right @@ -143,29 +146,14 @@ function source.load_settings() end end -function source.resize_window_from_settings(settings) - local os = love.system.getOS() - if os == 'Android' or os == 'iOS' then - -- maximizing on iOS breaks text rendering: https://github.com/deltadaedalus/vudu/issues/7 - -- no point second-guessing window dimensions on mobile - App.screen.width, App.screen.height, App.screen.flags = App.screen.size() - return - end - -- maximize window to determine maximum allowable dimensions - App.screen.resize(0, 0) -- maximize - Display_width, Display_height, App.screen.flags = App.screen.size() - -- set up desired window dimensions - App.screen.flags.resizable = true - App.screen.flags.minwidth = math.min(Display_width, 200) - App.screen.flags.minheight = math.min(Display_height, 200) - App.screen.width, App.screen.height = settings.width, settings.height ---? print('setting window from settings:', App.screen.width, App.screen.height) - App.screen.resize(App.screen.width, App.screen.height, App.screen.flags) -end - function source.set_window_position_from_settings(settings) - -- love.window.setPosition doesn't quite seem to do what is asked of it on Linux. - App.screen.move(settings.x, settings.y-37, settings.displayindex) + local os = love.system.getOS() + if os == 'Linux' then + -- love.window.setPosition doesn't quite seem to do what is asked of it on Linux. + App.screen.move(settings.x, settings.y-37, settings.displayindex) + else + App.screen.move(settings.x, settings.y, settings.displayindex) + end end function source.initialize_default_settings() @@ -179,27 +167,18 @@ function source.initialize_default_settings() end function source.initialize_window_geometry(em_width) - local os = love.system.getOS() - if os == 'Android' or os == 'iOS' then - -- maximizing on iOS breaks text rendering: https://github.com/deltadaedalus/vudu/issues/7 - -- no point second-guessing window dimensions on mobile - App.screen.width, App.screen.height, App.screen.flags = App.screen.size() - return - end - -- maximize window - App.screen.resize(0, 0) -- maximize - Display_width, Display_height, App.screen.flags = App.screen.size() - -- shrink height slightly to account for window decoration - App.screen.height = Display_height-100 - App.screen.width = 40*em_width + -- Initialize window width/height and make window resizable. + -- + -- I get tempted to have opinions about window dimensions here, but they're + -- non-portable: + -- - maximizing doesn't work on mobile and messes things up + -- - maximizing keeps the title bar on screen in Linux, but off screen on + -- Windows. And there's no way to get the height of the title bar. + -- It seems more robust to just follow LÖVE's default window size until + -- someone overrides it. + App.screen.width, App.screen.height, App.screen.flags = App.screen.size() App.screen.flags.resizable = true - App.screen.flags.minwidth = math.min(App.screen.width, 200) - App.screen.flags.minheight = math.min(App.screen.height, 200) App.screen.resize(App.screen.width, App.screen.height, App.screen.flags) - print('initializing source position') - if Settings == nil then Settings = {} end - if Settings.source == nil then Settings.source = {} end - Settings.source.x, Settings.source.y, Settings.source.displayindex = App.screen.position() end function source.resize(w, h) @@ -290,11 +269,9 @@ function source.quit() end function source.settings() - if Current_app == 'source' then ---? print('reading source window position') - Settings.source.x, Settings.source.y, Settings.source.displayindex = App.screen.position() - end ---? print('saving source settings', Settings.source.x, Settings.source.y, Settings.source.displayindex) + if Settings == nil then Settings = {} end + if Settings.source == nil then Settings.source = {} end + Settings.source.x, Settings.source.y, Settings.source.displayindex = App.screen.position() File_navigation.cursors[Editor_state.filename] = {cursor1=Editor_state.cursor1, screen_top1=Editor_state.screen_top1} return { x=Settings.source.x, y=Settings.source.y, displayindex=Settings.source.displayindex, @@ -377,20 +354,15 @@ function source.keychord_press(chord, key) --? print('C-l') Show_log_browser_side = not Show_log_browser_side if Show_log_browser_side then - App.screen.width = math.min(Display_width, App.screen.width*2) Editor_state.right = App.screen.width/2 - Margin_right + Editor_state.width = Editor_state.right-Editor_state.left + Text.redraw_all(Editor_state) Log_browser_state.left = App.screen.width/2 + Margin_left Log_browser_state.right = App.screen.width - Margin_right else - App.screen.width = Editor_state.right + Margin_right - end ---? print('setting window:', App.screen.width, App.screen.height) - App.screen.resize(App.screen.width, App.screen.height, App.screen.flags) ---? print('done setting window') - -- try to restore position if possible - -- if the window gets wider the window manager may not respect this - if not App.run_tests then - source.set_window_position_from_settings(Settings.source) + Editor_state.right = App.screen.width - Margin_right + Editor_state.width = Editor_state.right-Editor_state.left + Text.redraw_all(Editor_state) end return end diff --git a/source_tests.lua b/source_tests.lua index bf3ae3e..e3264bb 100644 --- a/source_tests.lua +++ b/source_tests.lua @@ -19,7 +19,6 @@ end function test_show_log_browser_side() App.screen.init{width=300, height=300} - Display_width = App.screen.width Current_app = 'source' Editor_state = edit.initialize_test_state() Editor_state.filename = 'foo' @@ -34,41 +33,9 @@ function test_show_log_browser_side() check(Show_log_browser_side, 'check') end -function test_show_log_browser_side_doubles_window_width_if_possible() - -- initialize screen dimensions to half width - App.screen.init{width=300, height=300} - Display_width = App.screen.width*2 - -- initialize source app with left side occupying entire window (half the display) - Current_app = 'source' - Editor_state = edit.initialize_test_state() - Editor_state.filename = 'foo' - Editor_state.left = Margin_left - Editor_state.right = App.screen.width - Margin_right - local old_editor_right = Editor_state.right - Text.redraw_all(Editor_state) - Log_browser_state = edit.initialize_test_state() - -- log browser has some arbitrary margins - Log_browser_state.left = 200 + Margin_left - Log_browser_state.right = 400 - Text.redraw_all(Log_browser_state) - log_browser.parse(Log_browser_state) - -- display log browser - Current_time = Current_time + 0.1 - App.run_after_keychord('C-l') - -- window width is doubled - check_eq(App.screen.width, 600, 'display:width') - -- left side margins are unchanged - check_eq(Editor_state.left, Margin_left, 'edit:left') - check_eq(Editor_state.right, old_editor_right, 'edit:right') - -- log browser margins are adjusted - check_eq(Log_browser_state.left, App.screen.width/2 + Margin_left, 'log:left') - check_eq(Log_browser_state.right, App.screen.width - Margin_right, 'log:right') -end - -function test_show_log_browser_side_resizes_both_sides_if_cannot_double_window_width() +function test_show_log_browser_side_splits_window_width() -- initialize screen dimensions and indicate that it is maximized App.screen.init{width=300, height=300} - Display_width = 300 -- initialize source app with left side occupying more than half the display Current_app = 'source' Editor_state = edit.initialize_test_state()