about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorKartik K. Agaram <vc@akkartik.com>2023-07-10 16:24:20 -0700
committerKartik K. Agaram <vc@akkartik.com>2023-07-10 17:09:09 -0700
commita8747478ff6452c8bce106ffc9d889886ab202a8 (patch)
tree6db8fe89a6274985436b97840f89c1a48342cb84
parent3f52063d026dcdaa299020573761266ab9a8618f (diff)
downloadlines.love-a8747478ff6452c8bce106ffc9d889886ab202a8.tar.gz
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.
-rw-r--r--run.lua26
-rw-r--r--source.lua63
-rw-r--r--source_tests.lua35
3 files changed, 32 insertions, 92 deletions
diff --git a/run.lua b/run.lua
index 227c34f..59522a5 100644
--- a/run.lua
+++ b/run.lua
@@ -55,9 +55,8 @@ 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.width, App.screen.height = Settings.width, Settings.height
   App.screen.resize(App.screen.width, App.screen.height, App.screen.flags)
@@ -89,19 +88,16 @@ 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.resize(App.screen.width, App.screen.height, App.screen.flags)
 end
diff --git a/source.lua b/source.lua
index b2d147d..2d48481 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,24 +146,6 @@ 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.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)
   local os = love.system.getOS()
   if os == 'Linux' then
@@ -182,19 +167,16 @@ 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.resize(App.screen.width, App.screen.height, App.screen.flags)
   print('initializing source position')
@@ -378,20 +360,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()