bugfix: Windows pushing title bar off screen

I'm learning the hard way that resizing the window is a big deal. Only
do this when someone explicitly requests it, otherwise follow LÖVE's
defaults.

Therefore we're also going to stop trying to be smart when showing the
log browser. Leave window resizing to manual operations.

Now initialization looks a lot more similar for the run and source apps.
This commit is contained in:
Kartik K. Agaram 2023-07-10 16:24:20 -07:00
parent 3f52063d02
commit a8747478ff
3 changed files with 32 additions and 92 deletions

26
run.lua
View File

@ -55,9 +55,8 @@ end
function run.load_settings() function run.load_settings()
love.graphics.setFont(love.graphics.newFont(Settings.font_height)) love.graphics.setFont(love.graphics.newFont(Settings.font_height))
-- determine default dimensions and flags -- set up desired window dimensions and make window resizable
App.screen.width, App.screen.height, App.screen.flags = App.screen.size() _, _, App.screen.flags = App.screen.size()
-- set up desired window dimensions
App.screen.flags.resizable = true App.screen.flags.resizable = true
App.screen.width, App.screen.height = Settings.width, Settings.height App.screen.width, App.screen.height = Settings.width, Settings.height
App.screen.resize(App.screen.width, App.screen.height, App.screen.flags) App.screen.resize(App.screen.width, App.screen.height, App.screen.flags)
@ -89,19 +88,16 @@ function run.initialize_default_settings()
end end
function run.initialize_window_geometry(em_width) function run.initialize_window_geometry(em_width)
local os = love.system.getOS() -- Initialize window width/height and make window resizable.
if os == 'Android' or os == 'iOS' then --
-- maximizing on iOS breaks text rendering: https://github.com/deltadaedalus/vudu/issues/7 -- I get tempted to have opinions about window dimensions here, but they're
-- no point second-guessing window dimensions on mobile -- non-portable:
App.screen.width, App.screen.height, App.screen.flags = App.screen.size() -- - maximizing doesn't work on mobile and messes things up
return -- - maximizing keeps the title bar on screen in Linux, but off screen on
end -- Windows. And there's no way to get the height of the title bar.
-- maximize window -- It seems more robust to just follow LÖVE's default window size until
App.screen.resize(0, 0) -- maximize -- someone overrides it.
App.screen.width, App.screen.height, App.screen.flags = App.screen.size() 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.resizable = true
App.screen.resize(App.screen.width, App.screen.height, App.screen.flags) App.screen.resize(App.screen.width, App.screen.height, App.screen.flags)
end end

View File

@ -121,8 +121,11 @@ end
function source.load_settings() function source.load_settings()
local settings = Settings.source local settings = Settings.source
love.graphics.setFont(love.graphics.newFont(settings.font_height)) love.graphics.setFont(love.graphics.newFont(settings.font_height))
source.resize_window_from_settings(settings) -- set up desired window dimensions and make window resizable
--? print('loading source position', settings.x, settings.y, settings.displayindex) _, _, 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) source.set_window_position_from_settings(settings)
Show_log_browser_side = settings.show_log_browser_side Show_log_browser_side = settings.show_log_browser_side
local right = App.screen.width - Margin_right local right = App.screen.width - Margin_right
@ -143,24 +146,6 @@ function source.load_settings()
end end
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.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) function source.set_window_position_from_settings(settings)
local os = love.system.getOS() local os = love.system.getOS()
if os == 'Linux' then if os == 'Linux' then
@ -182,19 +167,16 @@ function source.initialize_default_settings()
end end
function source.initialize_window_geometry(em_width) function source.initialize_window_geometry(em_width)
local os = love.system.getOS() -- Initialize window width/height and make window resizable.
if os == 'Android' or os == 'iOS' then --
-- maximizing on iOS breaks text rendering: https://github.com/deltadaedalus/vudu/issues/7 -- I get tempted to have opinions about window dimensions here, but they're
-- no point second-guessing window dimensions on mobile -- non-portable:
App.screen.width, App.screen.height, App.screen.flags = App.screen.size() -- - maximizing doesn't work on mobile and messes things up
return -- - maximizing keeps the title bar on screen in Linux, but off screen on
end -- Windows. And there's no way to get the height of the title bar.
-- maximize window -- It seems more robust to just follow LÖVE's default window size until
App.screen.resize(0, 0) -- maximize -- someone overrides it.
Display_width, Display_height, App.screen.flags = App.screen.size() App.screen.width, App.screen.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
App.screen.flags.resizable = true App.screen.flags.resizable = true
App.screen.resize(App.screen.width, App.screen.height, App.screen.flags) App.screen.resize(App.screen.width, App.screen.height, App.screen.flags)
print('initializing source position') print('initializing source position')
@ -378,20 +360,15 @@ function source.keychord_press(chord, key)
--? print('C-l') --? print('C-l')
Show_log_browser_side = not Show_log_browser_side Show_log_browser_side = not Show_log_browser_side
if Show_log_browser_side then 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.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.left = App.screen.width/2 + Margin_left
Log_browser_state.right = App.screen.width - Margin_right Log_browser_state.right = App.screen.width - Margin_right
else else
App.screen.width = Editor_state.right + Margin_right Editor_state.right = App.screen.width - Margin_right
end Editor_state.width = Editor_state.right-Editor_state.left
--? print('setting window:', App.screen.width, App.screen.height) Text.redraw_all(Editor_state)
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)
end end
return return
end end

View File

@ -19,7 +19,6 @@ end
function test_show_log_browser_side() function test_show_log_browser_side()
App.screen.init{width=300, height=300} App.screen.init{width=300, height=300}
Display_width = App.screen.width
Current_app = 'source' Current_app = 'source'
Editor_state = edit.initialize_test_state() Editor_state = edit.initialize_test_state()
Editor_state.filename = 'foo' Editor_state.filename = 'foo'
@ -34,41 +33,9 @@ function test_show_log_browser_side()
check(Show_log_browser_side, 'check') check(Show_log_browser_side, 'check')
end end
function test_show_log_browser_side_doubles_window_width_if_possible() function test_show_log_browser_side_splits_window_width()
-- 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()
-- initialize screen dimensions and indicate that it is maximized -- initialize screen dimensions and indicate that it is maximized
App.screen.init{width=300, height=300} App.screen.init{width=300, height=300}
Display_width = 300
-- initialize source app with left side occupying more than half the display -- initialize source app with left side occupying more than half the display
Current_app = 'source' Current_app = 'source'
Editor_state = edit.initialize_test_state() Editor_state = edit.initialize_test_state()