mirror of
https://github.com/UpsilonNumworks/Upsilon.git
synced 2026-03-29 11:39:58 +02:00
159 lines
4.4 KiB
C++
159 lines
4.4 KiB
C++
#include <ion/events.h>
|
|
#include "events_keyboard.h"
|
|
#include "display.h"
|
|
extern "C" {
|
|
#include <SDL/SDL.h>
|
|
}
|
|
|
|
static Ion::Events::Event sEvent = Ion::Events::None;
|
|
|
|
void IonEventsEmscriptenPushEvent(int eventNumber) {
|
|
sEvent = Ion::Events::Event((Ion::Keyboard::Key)eventNumber, Ion::Events::isShiftActive(), Ion::Events::isAlphaActive());
|
|
}
|
|
|
|
Ion::Keyboard::State Ion::Keyboard::scan() {
|
|
// FIXME
|
|
// On the Emscripten platform, scan() is used in :
|
|
// - shouldInterrupt(), from interruptHelper.h
|
|
// - apps_container.cpp
|
|
// - apps/hardware_test/keyboard_test_controller.cpp
|
|
// We would like to check if there is a Back event that would interrupt the
|
|
// Python or Poincare computation, but it is quite difficult to get because
|
|
// the runLoop is blocking in JavaScript and Events do not get pushed in
|
|
// sEvent.
|
|
// We still need to override the dummy/events_keyboard.cpp function, which
|
|
// returns that all keys are always pressed and thus interrupts Python
|
|
// computations after 20000 calls.
|
|
return 0;
|
|
}
|
|
|
|
namespace Ion {
|
|
namespace Events {
|
|
|
|
static constexpr Event sEventForASCIICharAbove32[95] = {
|
|
Space, Exclamation, DoubleQuotes, None, None, None, None, None,
|
|
LeftParenthesis, RightParenthesis, Multiplication, Plus, Comma, Minus, Dot, Division,
|
|
Zero, One, Two, Three, Four, Five, Six, Seven,
|
|
Eight, Nine, Colon, SemiColon, Lower, Equal, Greater, Question,
|
|
None, UpperA, UpperB, UpperC, UpperD, UpperE, UpperF, UpperG,
|
|
UpperH, UpperI, UpperJ, UpperK, UpperL, UpperM, UpperN, UpperO,
|
|
UpperP, UpperQ, UpperR, UpperS, UpperT, UpperU, UpperV, UpperW,
|
|
UpperX, UpperY, UpperZ, LeftBracket, None, RightBracket, Power, Underscore,
|
|
None, LowerA, LowerB, LowerC, LowerD, LowerE, LowerF, LowerG,
|
|
LowerH, LowerI, LowerJ, LowerK, LowerL, LowerM, LowerN, LowerO,
|
|
LowerP, LowerQ, LowerR, LowerS, LowerT, LowerU, LowerV, LowerW,
|
|
LowerX, LowerY, LowerZ, LeftBrace, None, RightBrace, None
|
|
};
|
|
|
|
Event getEvent(int * timeout) {
|
|
Ion::Display::Emscripten::refresh();
|
|
if (sEvent != None) {
|
|
Event event = sEvent;
|
|
updateModifiersFromEvent(event);
|
|
sEvent = None;
|
|
return event;
|
|
}
|
|
SDL_Event event;
|
|
if (SDL_PollEvent(&event)) {
|
|
if (event.type == SDL_KEYDOWN) {
|
|
if (event.key.keysym.mod & KMOD_CTRL) {
|
|
switch (event.key.keysym.sym) {
|
|
case SDLK_BACKSPACE:
|
|
return Clear;
|
|
case SDLK_x:
|
|
return Cut;
|
|
case SDLK_c:
|
|
return Copy;
|
|
case SDLK_v:
|
|
return Paste;
|
|
}
|
|
}
|
|
if (event.key.keysym.mod & KMOD_ALT) {
|
|
if (event.key.keysym.mod & KMOD_SHIFT) {
|
|
switch (event.key.keysym.sym) {
|
|
case SDLK_s:
|
|
return Arcsine;
|
|
case SDLK_c:
|
|
return Arccosine;
|
|
case SDLK_t:
|
|
return Arctangent;
|
|
}
|
|
}
|
|
switch (event.key.keysym.sym) {
|
|
case SDLK_ESCAPE:
|
|
return Home;
|
|
case SDLK_RETURN:
|
|
return OK;
|
|
case SDLK_v:
|
|
return Var;
|
|
case SDLK_BACKSPACE:
|
|
return Clear;
|
|
case SDLK_x:
|
|
return Exp;
|
|
case SDLK_n:
|
|
return Ln;
|
|
case SDLK_l:
|
|
return Log;
|
|
case SDLK_i:
|
|
return Imaginary;
|
|
case SDLK_EQUALS:
|
|
return Sto;
|
|
case SDLK_s:
|
|
return Sine;
|
|
case SDLK_c:
|
|
return Cosine;
|
|
case SDLK_t:
|
|
return Tangent;
|
|
case SDLK_p:
|
|
return Pi;
|
|
case SDLK_r:
|
|
return Sqrt;
|
|
case SDLK_2:
|
|
return Square;
|
|
case SDLK_e:
|
|
return EE;
|
|
case SDLK_a:
|
|
return Ans;
|
|
}
|
|
}
|
|
switch(event.key.keysym.sym) {
|
|
case SDLK_UP:
|
|
return Up;
|
|
case SDLK_DOWN:
|
|
return Down;
|
|
case SDLK_LEFT:
|
|
return Left;
|
|
case SDLK_RIGHT:
|
|
return Right;
|
|
case SDLK_RETURN:
|
|
return EXE;
|
|
case SDLK_ESCAPE:
|
|
return Back;
|
|
case SDLK_TAB:
|
|
return Toolbox;
|
|
case SDLK_BACKSPACE:
|
|
return Backspace;
|
|
}
|
|
if (event.key.keysym.unicode >= 32 && event.key.keysym.unicode < 127) {
|
|
return sEventForASCIICharAbove32[event.key.keysym.unicode-32];
|
|
}
|
|
}
|
|
}
|
|
return None;
|
|
}
|
|
|
|
}
|
|
}
|
|
|
|
namespace Ion {
|
|
namespace Events {
|
|
namespace Emscripten {
|
|
|
|
void init() {
|
|
SDL_EnableUNICODE(1); // We're using Unicode values from Keyboard input
|
|
}
|
|
|
|
}
|
|
}
|
|
}
|