This part will explain how each event is linked to the core.
First of all, we have to understand how this works. Basicly the script is launched before the executive engine (master). This lets us initialize our variables. Sadly, this also means that we can neither evaluate expressions nor use some of the TI-Nspire API (like platform, var) until the engine is launched. Here is a call summary :
- Launch string library
- Launch math library
- Launch TI-Nspire FrameWork (toolpalette, image, …)
- Open and launch Lua user’s script
- Launch var API (store, recall, …)
- Launch platform API (window, gc, …)
- Link events (pseudo code)
while(Exit) ------- Some OS routines here ---- Begin of Event link buffer:captureDataFromKeyPad() -- (N) some underground routines to catch events if buffer.charInput ~= "" then -- (N) on.charIn(buffer.charInput) buffer.charInput= "" -- (N) end if buffer.arrowKey ~= "" then -- (N) on.arrowKey(buffer.arrowKey) buffer.arrowKey = "" -- (N) end ----- etc ... if platform.window.isInvalidate then local gc = platform.gc() -- Create a new graphical context gc:begin() -- initialize the graphical context on.paint(gc) -- save all the things we have to draw gc:finish() -- (N) draw all those things platform.window.isInvalidate = false -- say that the window has been drawn end ----- End of Event link end
Note : the (N) commented line only indicates the meaning of the routine. Those functions don’t really exist.
Now we can understand how everything is linked, just by a main loop. This helps you to understand that you don’t have to code a loop yourself, because the screen wouldn’t be refreshed. This also helps to see when the screen gets refreshed. In other words, we cannot use niether gc nor platform.gc() in order to draw somthing on the screen if we are outside of on.paint() (except if your outside function is called within on.paint() ).
Here is an example of a simple Lua program that displays a message only when a key is pressed (and let the screen blank otherwise).
function on.paint(gc) if message then gc:setFont("sansserif", "r", 10) -- initialize font drawing gc:drawString(message, 0, 0, "top") -- display the message at (0, 0) coordinates message = nil -- erase the message timer.start(1) -- start a timer to exit on.paint() but keep in mind that we have to redraw the screen end end function on.timer() timer.stop() platform.window:invalidate() end function on.charIn(ch) message = "Hello World !" -- store a message platform.window:invalidate() -- force display end
When you open the document, the script is read once. It initializes and overwrites all the functions and globals with the ones you defined. Thus, message is nil. Once the on.paint() event is called, message is nil, thus, nothing is done. When you press a key that calls on.charIn(), message is now “Hello World” and we tell the platform that the screen has to be refreshed. Then, on.paint() is called again, message is not nil then we display it, erase message and launch a timer. Why is that ? Because if we call platform.window:invalidate() right there, we won’t refresh the screen. Why again ? Just look at the pseudo-code above. We set the window as drawn after each call of on.paint(). Thus a timer is necessary to manually recallon.paint() and exit the on.paint() function to draw the screen. When the timer is ended, on.timer() is called and we refresh the screen. The screen is then redrawn but there is nothing to draw because message is nil. Thus, the graphic context lets the screen blank.