user3740840
user3740840

Reputation: 15

LUA. io.read with time limit

it is possible set time limit to read input in terminal in Lua.

For example you habe only 1 second to write a letter else program skip this action.

thanks for any tip ;)

Upvotes: 0

Views: 1384

Answers (2)

siffiejoe
siffiejoe

Reputation: 4271

You can do this by changing the terminal settings (see man termios) using luaposix (on POSIX machines only, obviously):

local p = require( "posix" )

local function table_copy( t )
  local copy = {}
  for k,v in pairs( t ) do
    if type( v ) == "table" then
      copy[ k ] = table_copy( v )
    else
      copy[ k ] = v
    end
  end
  return copy
end

assert( p.isatty( p.STDIN_FILENO ), "stdin not a terminal" )

-- derive modified terminal settings from current settings
local saved_tcattr = assert( p.tcgetattr( p.STDIN_FILENO ) )
local raw_tcattr = table_copy( saved_tcattr )
raw_tcattr.lflag = bit32.band( raw_tcattr.lflag, bit32.bnot( p.ICANON ) )
raw_tcattr.cc[ p.VMIN ] = 0
raw_tcattr.cc[ p.VTIME ] = 10 -- in tenth of a second

-- restore terminal settings in case of unexpected error
local guard = setmetatable( {}, { __gc = function()
  p.tcsetattr( p.STDIN_FILENO, p.TCSANOW, saved_tcattr )
end } )

local function read1sec()
  assert( p.tcsetattr( p.STDIN_FILENO, p.TCSANOW, raw_tcattr ) )
  local c = io.read( 1 )
  assert( p.tcsetattr( p.STDIN_FILENO, p.TCSANOW, saved_tcattr ) )
  return c
end

local c = read1sec()
print( "key pressed:", c )

Upvotes: 3

Oliver
Oliver

Reputation: 29621

The lcurses (ncurses for Lua) Lua library might provide this. You would have to download and install it. There is an example of how to check for keypress only at Create a function to check for key press in unix using ncurses, it is in C but the ncurses API is identical in Lua.

Otherwise, you will have to create a Lua extension module using the C/C++ API: you would create C function that you call from Lua, and this C function then has access to the OS's usual function like getch, select, etc (depends if you are on Windows or Linux).

Upvotes: 0

Related Questions