about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorKartik K. Agaram <vc@akkartik.com>2022-05-02 08:20:30 -0700
committerKartik K. Agaram <vc@akkartik.com>2022-05-02 08:24:24 -0700
commit4aa2003c94e8cdadde3d353a8cbc631c3a92833d (patch)
tree6c9ef0d3ba7e60eabee85633bcd87620d0303265
parent57d87f2353874d4503dde09c85d29e20ff291c18 (diff)
downloadtext.love-4aa2003c94e8cdadde3d353a8cbc631c3a92833d.tar.gz
handle chords
For shift we'll mostly rely on love.textinput. For the rest I've created
a simple driver.
-rw-r--r--keychord.lua25
-rw-r--r--main.lua47
2 files changed, 46 insertions, 26 deletions
diff --git a/keychord.lua b/keychord.lua
new file mode 100644
index 0000000..d9b89f5
--- /dev/null
+++ b/keychord.lua
@@ -0,0 +1,25 @@
+-- Keyboard driver
+
+function love.keypressed(key, scancode, isrepeat)
+  if key == 'lctrl' or key == 'rctrl' or key == 'lalt' or key == 'ralt' or key == 'lshift' or key == 'rshift' or key == 'lgui' or key == 'rgui' then
+    -- do nothing when the modifier is pressed
+  end
+  -- include the modifier(s) when the non-modifer is pressed
+  keychord_pressed(combine_modifiers(key))
+end
+
+function combine_modifiers(key)
+  local result = ''
+  local down = love.keyboard.isDown
+  if down('lctrl') or down('rctrl') then
+    result = result..'C-'
+  end
+  if down('lalt') or down('ralt') then
+    result = result..'M-'
+  end
+  if down('lgui') or down('rgui') then
+    result = result..'S-'
+  end
+  result = result..key
+  return result
+end
diff --git a/main.lua b/main.lua
index eafcdd3..e9bccf5 100644
--- a/main.lua
+++ b/main.lua
@@ -1,3 +1,5 @@
+require 'keychord'
+
 lines = {}
 width, height, flags = 0, 0, nil
 
@@ -25,27 +27,29 @@ end
 function love.update(dt)
 end
 
-function love.keypressed(key, scancode, isrepeat)
-  if key == 'return' then
+function love.textinput(t)
+  lines[#lines] = lines[#lines]..t
+end
+
+function keychord_pressed(chord)
+  -- Don't handle any keys here that would trigger love.textinput above.
+  if chord == 'return' then
     table.insert(lines, '')
-  elseif key == 'space' then
-    lines[#lines] = lines[#lines]..' '
-  elseif key == 'lctrl' or key == 'rctrl' then
-    -- do nothing
-  elseif key == 'lalt' or key == 'ralt' then
-    -- do nothing
-  elseif key == 'lshift' or key == 'rshift' then
-    -- do nothing
-  elseif love.keyboard.isDown('lctrl') or love.keyboard.isDown('rctrl') then
-    if key == 'r' then
-      lines[#lines+1] = eval(lines[#lines])[1]
-      lines[#lines+1] = ''
-    end
-  else
-    lines[#lines] = lines[#lines]..key
+  elseif chord == 'C-r' then
+    lines[#lines+1] = eval(lines[#lines])[1]
+    lines[#lines+1] = ''
   end
 end
 
+function love.keyreleased(key, scancode)
+end
+
+function love.mousepressed(x, y, button)
+end
+
+function love.mousereleased(x, y, button)
+end
+
 function eval(buf)
   local f = load('return '..buf, 'REPL')
   if f then
@@ -69,12 +73,3 @@ function gather_results(success, ...)
   local n = select('#', ...)
   return success, { n = n, ... }
 end
-
-function love.keyreleased(key, scancode)
-end
-
-function love.mousepressed(x, y, button)
-end
-
-function love.mousereleased(x, y, button)
-end