about summary refs log tree commit diff stats
path: root/main.lua
diff options
context:
space:
mode:
Diffstat (limited to 'main.lua')
-rw-r--r--main.lua116
1 files changed, 80 insertions, 36 deletions
diff --git a/main.lua b/main.lua
index 918d414..61b5939 100644
--- a/main.lua
+++ b/main.lua
@@ -32,6 +32,11 @@ function App.load()
     Current_app = Settings.current_app
   end
 
+  -- Current_app =
+  --  | run
+  --  | source
+  --  | {name=warning message='...' next_app = run|source}
+
   if Current_app == nil then
     Current_app = 'run'
   end
@@ -64,35 +69,21 @@ function App.load()
         load_file_from_source_or_save_directory('help.lua')
       load_file_from_source_or_save_directory('drawing_tests.lua')
     load_file_from_source_or_save_directory('source_tests.lua')
-  elseif Current_app == 'error' then
+  elseif current_app_is_warning() then
   else
     assert(false, 'unknown app "'..Current_app..'"')
   end
 end
 
-function App.version_check()
-  -- available modes: run, error
-  Error_message = nil
-  Error_count = 0
-  -- we'll reuse error mode on load for an initial version check
-  local supported_versions = {'11.5', '11.4', '12.0'}  -- put the recommended version first
-  local minor_version
-  Major_version, minor_version = love.getVersion()
-  Version = Major_version..'.'..minor_version
-  if array.find(supported_versions, Version) == nil then
-    Current_app = 'error'
-    Error_message = ("This app doesn't support version %s; please use version %s. Press any key to try it with this version anyway."):format(Version, supported_versions[1])
-    print(Error_message)
-    -- continue initializing everything; hopefully we won't have errors during initialization
-  end
-end
-
 function App.initialize_globals()
+  Supported_versions = {'11.5', '11.4', '12.0'}  -- put the recommended version first
+  check_love_version_for_tests()
+
   if Current_app == 'run' then
     run.initialize_globals()
   elseif Current_app == 'source' then
     source.initialize_globals()
-  elseif Current_app == 'error' then
+  elseif current_app_is_warning() then
   else
     assert(false, 'unknown app "'..Current_app..'"')
   end
@@ -101,6 +92,25 @@ function App.initialize_globals()
   Current_time = 0
   Last_focus_time = 0  -- https://love2d.org/forums/viewtopic.php?p=249700
   Last_resize_time = 0
+
+  -- Another weird bit for a class of corner cases. E.g.:
+  -- * I press ctrl+e, switch Current_app. I don't want the new app to receive
+  --   text_input and key_release events.
+  -- If I try to avoid text_input events by switching modes on key_release, I
+  -- hit a new problem:
+  -- * I press ctrl+e, am running an untested version, Current_app goes to
+  --   'warning', and immediately rolls back out of 'warning' in the
+  --   key_release event.
+  -- Skip_rest_of_key_events is ugly, but feels cleaner than creating yet
+  -- another possible value for Current_app.
+  Skip_rest_of_key_events = nil
+end
+
+function check_love_version_for_tests()
+  if array.find(Supported_versions, Version) == nil then
+    -- warning to include in an error message if any tests failed
+    Warning_before_tests = ("This app hasn't been tested with LÖVE version %s."):format(Version)
+  end
 end
 
 function App.initialize(arg)
@@ -113,18 +123,28 @@ function App.initialize(arg)
     run.initialize(arg)
   elseif Current_app == 'source' then
     source.initialize(arg)
-  elseif Current_app == 'error' then
+  elseif current_app_is_warning() then
   else
     assert(false, 'unknown app "'..Current_app..'"')
   end
+
+  check_love_version()
+end
+
+function check_love_version()
+  if array.find(Supported_versions, Version) == nil then
+    show_warning(
+      ("This app hasn't been tested with LÖVE version %s; please switch to version %s if you run into issues. Press any key to continue."):format(Version, Supported_versions[1]))
+    -- continue initializing everything; hopefully we won't have errors during initialization
+  end
 end
 
 function App.resize(w,h)
+  if current_app_is_warning() then return end
   if Current_app == 'run' then
     if run.resize then run.resize(w,h) end
   elseif Current_app == 'source' then
     if source.resize then source.resize(w,h) end
-  elseif Current_app == 'error' then
   else
     assert(false, 'unknown app "'..Current_app..'"')
   end
@@ -132,17 +152,18 @@ function App.resize(w,h)
 end
 
 function App.filedropped(file)
+  if current_app_is_warning() then return end
   if Current_app == 'run' then
     if run.file_drop then run.file_drop(file) end
   elseif Current_app == 'source' then
     if source.file_drop then source.file_drop(file) end
-  elseif Current_app == 'error' then
   else
     assert(false, 'unknown app "'..Current_app..'"')
   end
 end
 
 function App.focus(in_focus)
+  if current_app_is_warning() then return end
   if in_focus then
     Last_focus_time = Current_time
   end
@@ -150,7 +171,6 @@ function App.focus(in_focus)
     if run.focus then run.focus(in_focus) end
   elseif Current_app == 'source' then
     if source.focus then source.focus(in_focus) end
-  elseif Current_app == 'error' then
   else
     assert(false, 'unknown app "'..Current_app..'"')
   end
@@ -161,11 +181,11 @@ function App.draw()
     run.draw()
   elseif Current_app == 'source' then
     source.draw()
-  elseif Current_app == 'error' then
+  elseif current_app_is_warning() then
     love.graphics.setColor(0,0,1)
     love.graphics.rectangle('fill', 0,0, App.screen.width, App.screen.height)
     love.graphics.setColor(1,1,1)
-    love.graphics.printf(Error_message, 40,40, 600)
+    love.graphics.printf(Current_app.message, 40,40, 600)
   else
     assert(false, 'unknown app "'..Current_app..'"')
   end
@@ -173,6 +193,7 @@ end
 
 function App.update(dt)
   Current_time = Current_time + dt
+  if current_app_is_warning() then return end
   -- some hysteresis while resizing
   if Current_time < Last_resize_time + 0.1 then
     return
@@ -182,7 +203,6 @@ function App.update(dt)
     run.update(dt)
   elseif Current_app == 'source' then
     source.update(dt)
-  elseif Current_app == 'error' then
   else
     assert(false, 'unknown app "'..Current_app..'"')
   end
@@ -194,9 +214,13 @@ function App.keychord_press(chord, key)
     return
   end
   --
-  if Current_app == 'error' then
+  Skip_rest_of_key_events = nil
+  if current_app_is_warning() then
     if chord == 'C-c' then
       love.system.setClipboardText(Error_message)
+    else
+      clear_warning()
+      Skip_rest_of_key_events = true
     end
     return
   end
@@ -214,7 +238,7 @@ function App.keychord_press(chord, key)
       if source.quit then source.quit() end
       Current_app = 'run'
       Error_message = nil
-    elseif Current_app == 'error' then
+    elseif current_app_is_warning() then
     else
       assert(false, 'unknown app "'..Current_app..'"')
     end
@@ -224,6 +248,7 @@ function App.keychord_press(chord, key)
     load_file_from_source_or_save_directory('main.lua')
     App.undo_initialize()
     App.run_tests_and_initialize()
+    Skip_rest_of_key_events = true
     return
   end
   if Current_app == 'run' then
@@ -236,12 +261,13 @@ function App.keychord_press(chord, key)
 end
 
 function App.textinput(t)
-  if Current_app == 'error' then return end
+  if current_app_is_warning() then return end
   -- ignore events for some time after window in focus (mostly alt-tab)
   if Current_time < Last_focus_time + 0.01 then
     return
   end
   --
+  if Skip_rest_of_key_events then return end
   if Current_app == 'run' then
     if run.text_input then run.text_input(t) end
   elseif Current_app == 'source' then
@@ -252,14 +278,14 @@ function App.textinput(t)
 end
 
 function App.keyreleased(key, scancode)
+  if current_app_is_warning() then return end
   -- ignore events for some time after window in focus (mostly alt-tab)
   if Current_time < Last_focus_time + 0.01 then
     return
   end
   --
-  if Current_app == 'error' then
-    Current_app = 'run'
-  elseif Current_app == 'run' then
+  if Skip_rest_of_key_events then return end
+  if Current_app == 'run' then
     if run.key_release then run.key_release(key, scancode) end
   elseif Current_app == 'source' then
     if source.key_release then source.key_release(key, scancode) end
@@ -269,7 +295,7 @@ function App.keyreleased(key, scancode)
 end
 
 function App.mousepressed(x,y, mouse_button)
-  if Current_app == 'error' then return end
+  if current_app_is_warning() then return end
 --?   print('mouse press', x,y)
   if Current_app == 'run' then
     if run.mouse_press then run.mouse_press(x,y, mouse_button) end
@@ -281,7 +307,7 @@ function App.mousepressed(x,y, mouse_button)
 end
 
 function App.mousereleased(x,y, mouse_button)
-  if Current_app == 'error' then return end
+  if current_app_is_warning() then return end
   if Current_app == 'run' then
     if run.mouse_release then run.mouse_release(x,y, mouse_button) end
   elseif Current_app == 'source' then
@@ -292,7 +318,7 @@ function App.mousereleased(x,y, mouse_button)
 end
 
 function App.wheelmoved(dx,dy)
-  if Current_app == 'error' then return end
+  if current_app_is_warning() then return end
   if Current_app == 'run' then
     if run.mouse_wheel_move then run.mouse_wheel_move(dx,dy) end
   elseif Current_app == 'source' then
@@ -303,7 +329,7 @@ function App.wheelmoved(dx,dy)
 end
 
 function love.quit()
-  if Current_app == 'error' then return end
+  if current_app_is_warning() then return end
   if Current_app == 'run' then
     local source_settings = Settings.source
     Settings = run.settings()
@@ -321,3 +347,21 @@ function love.quit()
     assert(false, 'unknown app "'..Current_app..'"')
   end
 end
+
+function current_app_is_warning()
+  return type(Current_app) == 'table' and Current_app.name == 'warning'
+end
+
+function show_warning(message)
+  assert(type(Current_app) == 'string')
+  Current_app = {
+    name = 'warning',
+    message = message,
+    next_app = Current_app,
+  }
+end
+
+function clear_warning()
+  assert(type(Current_app) == 'table')
+  Current_app = Current_app.next_app
+end