8 #include "SDL_keysym.h"
9 #include "SDL_keyboard.h"
10 #include "SDL_events_c.h"
11 #include "SDL_timer.h"
14 #include "SDL_epocvideo.h"
15 #include "SDL_epocevents_c.h"
17 #include "sdlepocapi.h"
26 static SDL_keysym
*TranslateKey(_THIS
, int scancode
, SDL_keysym
*keysym
);
29 /* The translation tables from a console scancode to a SDL keysym */
30 static SDLKey keymap
[MAX_SCANCODE
];
31 static SDL_keysym
*TranslateKey(_THIS
, int scancode
, SDL_keysym
*keysym
);
32 void DisableKeyBlocking(_THIS
);
39 TBool isCursorVisible
= EFalse
;
45 /* Initialize the key translation table */
46 for ( i
=0; i
<SDL_TABLESIZE(keymap
); ++i
)
47 keymap
[i
] = SDLK_UNKNOWN
;
50 for ( i
= 0; i
<32; ++i
){
51 keymap
[' ' + i
] = (SDLKey
)(SDLK_SPACE
+i
);
53 /* e.g. Alphabet keys */
54 for ( i
= 0; i
<32; ++i
){
55 keymap
['A' + i
] = (SDLKey
)(SDLK_a
+i
);
58 keymap
[EStdKeyBackspace
] = SDLK_BACKSPACE
;
59 keymap
[EStdKeyTab
] = SDLK_TAB
;
60 keymap
[EStdKeyEnter
] = SDLK_RETURN
;
61 keymap
[EStdKeyEscape
] = SDLK_ESCAPE
;
62 keymap
[EStdKeySpace
] = SDLK_SPACE
;
63 keymap
[EStdKeyPause
] = SDLK_PAUSE
;
64 keymap
[EStdKeyHome
] = SDLK_HOME
;
65 keymap
[EStdKeyEnd
] = SDLK_END
;
66 keymap
[EStdKeyPageUp
] = SDLK_PAGEUP
;
67 keymap
[EStdKeyPageDown
] = SDLK_PAGEDOWN
;
68 keymap
[EStdKeyDelete
] = SDLK_DELETE
;
69 keymap
[EStdKeyUpArrow
] = SDLK_UP
;
70 keymap
[EStdKeyDownArrow
] = SDLK_DOWN
;
71 keymap
[EStdKeyLeftArrow
] = SDLK_LEFT
;
72 keymap
[EStdKeyRightArrow
] = SDLK_RIGHT
;
73 keymap
[EStdKeyCapsLock
] = SDLK_CAPSLOCK
;
74 keymap
[EStdKeyLeftShift
] = SDLK_LSHIFT
;
75 keymap
[EStdKeyRightShift
] = SDLK_RSHIFT
;
76 keymap
[EStdKeyLeftAlt
] = SDLK_LALT
;
77 keymap
[EStdKeyRightAlt
] = SDLK_RALT
;
78 keymap
[EStdKeyLeftCtrl
] = SDLK_LCTRL
;
79 keymap
[EStdKeyRightCtrl
] = SDLK_RCTRL
;
80 keymap
[EStdKeyLeftFunc
] = SDLK_LMETA
;
81 keymap
[EStdKeyRightFunc
] = SDLK_RMETA
;
82 keymap
[EStdKeyInsert
] = SDLK_INSERT
;
83 keymap
[EStdKeyComma
] = SDLK_COMMA
;
84 keymap
[EStdKeyFullStop
] = SDLK_PERIOD
;
85 keymap
[EStdKeyForwardSlash
] = SDLK_SLASH
;
86 keymap
[EStdKeyBackSlash
] = SDLK_BACKSLASH
;
87 keymap
[EStdKeySemiColon
] = SDLK_SEMICOLON
;
88 keymap
[EStdKeySingleQuote
] = SDLK_QUOTE
;
89 keymap
[EStdKeyHash
] = SDLK_HASH
;
90 keymap
[EStdKeySquareBracketLeft
] = SDLK_LEFTBRACKET
;
91 keymap
[EStdKeySquareBracketRight
] = SDLK_RIGHTBRACKET
;
92 keymap
[EStdKeyMinus
] = SDLK_MINUS
;
93 keymap
[EStdKeyEquals
] = SDLK_EQUALS
;
95 keymap
[EStdKeyF1
] = SDLK_F1
;
96 keymap
[EStdKeyF2
] = SDLK_F2
;
97 keymap
[EStdKeyF3
] = SDLK_F3
;
98 keymap
[EStdKeyF4
] = SDLK_F4
;
99 keymap
[EStdKeyF5
] = SDLK_F5
;
100 keymap
[EStdKeyF6
] = SDLK_F6
;
101 keymap
[EStdKeyF7
] = SDLK_F7
;
102 keymap
[EStdKeyF8
] = SDLK_F8
;
104 keymap
[EStdKeyF9
] = SDLK_F9
;
105 keymap
[EStdKeyF10
] = SDLK_F10
;
106 keymap
[EStdKeyF11
] = SDLK_F11
;
107 keymap
[EStdKeyF12
] = SDLK_F12
;
110 keymap
[EStdKeyXXX
] = SDLK_RETURN
; /* "fire" key */
112 keymap
[EStdKeyDevice3
] = SDLK_RETURN
; /* "fire" key */
113 keymap
[EStdKeyNkpAsterisk
] = SDLK_ASTERISK
;
114 keymap
[EStdKeyYes
] = SDLK_HOME
; /* "call" key */
115 keymap
[EStdKeyNo
] = SDLK_END
; /* "end call" key */
116 keymap
[EStdKeyDevice0
] = SDLK_SPACE
; /* right menu key */
117 keymap
[EStdKeyDevice1
] = SDLK_ESCAPE
; /* left menu key */
118 keymap
[EStdKeyDevice2
] = SDLK_POWER
; /* power key */
120 keymap
[EStdKeyMenu
] = SDLK_MENU
; // menu key
121 keymap
[EStdKeyDevice6
] = SDLK_LEFT
; // Rocker (joystick) left
122 keymap
[EStdKeyDevice7
] = SDLK_RIGHT
; // Rocker (joystick) right
123 keymap
[EStdKeyDevice8
] = SDLK_UP
; // Rocker (joystick) up
124 keymap
[EStdKeyDevice9
] = SDLK_DOWN
; // Rocker (joystick) down
125 keymap
[EStdKeyLeftFunc
] = SDLK_LALT
; //chr?
126 keymap
[EStdKeyRightFunc
] = SDLK_RALT
;
127 keymap
[EStdKeyDeviceA
] = SDLK_RETURN
; /* "fire" key */
129 keymap
[EStdKeyNumLock
] = SDLK_NUMLOCK
;
130 keymap
[EStdKeyScrollLock
] = SDLK_SCROLLOCK
;
132 keymap
[EStdKeyNkpForwardSlash
] = SDLK_KP_DIVIDE
;
133 keymap
[EStdKeyNkpAsterisk
] = SDLK_KP_MULTIPLY
;
134 keymap
[EStdKeyNkpMinus
] = SDLK_KP_MINUS
;
135 keymap
[EStdKeyNkpPlus
] = SDLK_KP_PLUS
;
136 keymap
[EStdKeyNkpEnter
] = SDLK_KP_ENTER
;
137 keymap
[EStdKeyNkp1
] = SDLK_KP1
;
138 keymap
[EStdKeyNkp2
] = SDLK_KP2
;
139 keymap
[EStdKeyNkp3
] = SDLK_KP3
;
140 keymap
[EStdKeyNkp4
] = SDLK_KP4
;
141 keymap
[EStdKeyNkp5
] = SDLK_KP5
;
142 keymap
[EStdKeyNkp6
] = SDLK_KP6
;
143 keymap
[EStdKeyNkp7
] = SDLK_KP7
;
144 keymap
[EStdKeyNkp8
] = SDLK_KP8
;
145 keymap
[EStdKeyNkp9
] = SDLK_KP9
;
146 keymap
[EStdKeyNkp0
] = SDLK_KP0
;
147 keymap
[EStdKeyNkpFullStop
] = SDLK_KP_PERIOD
;
151 int EPOC_HandleWsEvent(_THIS
, const TWsEvent
& aWsEvent
)
156 switch (aWsEvent
.Type())
158 case EEventSwitchOff
:
162 case EEventPointer
: /* Mouse pointer events */
164 const TPointerEvent
* pointerEvent
= aWsEvent
.Pointer();
165 const TPoint mousePos
= EpocSdlEnv::WindowCoordinates(pointerEvent
->iPosition
);
167 posted
+= SDL_PrivateMouseMotion(0, 0, mousePos
.iX
, mousePos
.iY
); /* Absolute position on screen */
169 switch (pointerEvent
->iType
)
171 case TPointerEvent::EButton1Down
:
172 posted
+= SDL_PrivateMouseButton(SDL_PRESSED
, SDL_BUTTON_LEFT
, 0, 0);
174 case TPointerEvent::EButton1Up
:
175 posted
+= SDL_PrivateMouseButton(SDL_RELEASED
, SDL_BUTTON_LEFT
, 0, 0);
177 case TPointerEvent::EButton2Down
:
178 posted
+= SDL_PrivateMouseButton(SDL_PRESSED
, SDL_BUTTON_RIGHT
, 0, 0);
180 case TPointerEvent::EButton2Up
:
181 posted
+= SDL_PrivateMouseButton(SDL_RELEASED
, SDL_BUTTON_RIGHT
, 0, 0);
183 case TPointerEvent::EButton3Down
:
184 posted
+= SDL_PrivateMouseButton(SDL_PRESSED
, SDL_BUTTON_MIDDLE
, 0, 0);
186 case TPointerEvent::EButton3Up
:
187 posted
+= SDL_PrivateMouseButton(SDL_RELEASED
, SDL_BUTTON_MIDDLE
, 0, 0);
193 case EEventKeyDown
: /* Key events */
195 (void*)TranslateKey(_this
, aWsEvent
.Key()->iScanCode
, &keysym
);
197 #ifndef DISABLE_JOYSTICK
198 /* Special handling */
199 switch((int)keysym
.sym
) {
201 if (!isCursorVisible
) {
202 /* Enable virtual cursor */
203 HAL::Set(HAL::EMouseState
, HAL::EMouseState_Visible
);
206 /* Disable virtual cursor */
207 HAL::Set(HAL::EMouseState
, HAL::EMouseState_Invisible
);
209 isCursorVisible
= !isCursorVisible
;
213 posted
+= SDL_PrivateKeyboard(SDL_PRESSED
, &keysym
);
217 case EEventKeyUp
: /* Key events */
219 posted
+= SDL_PrivateKeyboard(SDL_RELEASED
, TranslateKey(_this
, aWsEvent
.Key()->iScanCode
, &keysym
));
223 case EEventFocusGained
: /* SDL window got focus */
225 Private
->iIsWindowFocused
= ETrue
;
226 posted
+= SDL_PrivateAppActive(1, SDL_APPINPUTFOCUS
|SDL_APPMOUSEFOCUS
);
227 /* Draw window background and screen buffer */
228 DisableKeyBlocking(_this
); //Markus: guess why:-)
230 //RedrawWindowL(_this);
234 case EEventFocusLost
: /* SDL window lost focus */
237 Private
->iIsWindowFocused
= EFalse
;
239 posted
+= SDL_PrivateAppActive(0, SDL_APPINPUTFOCUS
|SDL_APPMOUSEFOCUS
);
245 case EEventModifiersChanged
:
247 TModifiersChangedEvent
* modEvent
= aWsEvent
.ModifiersChanged();
248 TUint modstate
= KMOD_NONE
;
249 if (modEvent
->iModifiers
== EModifierLeftShift
)
250 modstate
|= KMOD_LSHIFT
;
251 if (modEvent
->iModifiers
== EModifierRightShift
)
252 modstate
|= KMOD_RSHIFT
;
253 if (modEvent
->iModifiers
== EModifierLeftCtrl
)
254 modstate
|= KMOD_LCTRL
;
255 if (modEvent
->iModifiers
== EModifierRightCtrl
)
256 modstate
|= KMOD_RCTRL
;
257 if (modEvent
->iModifiers
== EModifierLeftAlt
)
258 modstate
|= KMOD_LALT
;
259 if (modEvent
->iModifiers
== EModifierRightAlt
)
260 modstate
|= KMOD_RALT
;
261 if (modEvent
->iModifiers
== EModifierLeftFunc
)
262 modstate
|= KMOD_LMETA
;
263 if (modEvent
->iModifiers
== EModifierRightFunc
)
264 modstate
|= KMOD_RMETA
;
265 if (modEvent
->iModifiers
== EModifierCapsLock
)
266 modstate
|= KMOD_CAPS
;
267 SDL_SetModState(STATIC_CAST(SDLMod
,(modstate
| KMOD_LSHIFT
)));
270 case EEventScreenDeviceChanged
:
272 EpocSdlEnv::WaitDeviceChange();
284 void EPOC_PumpEvents(_THIS
)
286 MEventQueue
& events
= EpocSdlEnv::EventQueue();
287 while(events
.HasData())
291 //there have to be a copy, so we can release
292 //lock immediately. HandleWsEvent may cause
293 //deadlock otherwise.
295 const TWsEvent event
= events
.Shift();
297 EPOC_HandleWsEvent(_this
, event
);
303 void EPOC_InitOSKeymap(_THIS
)
306 EpocSdlEnv::ObserverEvent(MSDLObserver::EEventKeyMapInit
,0);
309 static SDL_keysym
*TranslateKey(_THIS
, int scancode
, SDL_keysym
*keysym
)
311 /* Set the keysym information */
313 keysym
->scancode
= scancode
;
315 if ((scancode
>= MAX_SCANCODE
) &&
316 ((scancode
- ENonCharacterKeyBase
+ 0x0081) >= MAX_SCANCODE
)) {
317 SDL_SetError("Too big scancode");
318 keysym
->scancode
= SDLK_UNKNOWN
;
319 keysym
->mod
= KMOD_NONE
;
323 keysym
->mod
= SDL_GetModState();
325 /* Handle function keys: F1, F2, F3 ... */
326 if (keysym
->mod
& KMOD_META
) {
327 if (scancode
>= 'A' && scancode
< ('A' + 24)) { /* first 32 alphabet keys */
329 case 'Q': scancode
= EStdKeyF1
; break;
330 case 'W': scancode
= EStdKeyF2
; break;
331 case 'E': scancode
= EStdKeyF3
; break;
332 case 'R': scancode
= EStdKeyF4
; break;
333 case 'T': scancode
= EStdKeyF5
; break;
334 case 'Y': scancode
= EStdKeyF6
; break;
335 case 'U': scancode
= EStdKeyF7
; break;
336 case 'I': scancode
= EStdKeyF8
; break;
337 case 'A': scancode
= EStdKeyF9
; break;
338 case 'S': scancode
= EStdKeyF10
; break;
339 case 'D': scancode
= EStdKeyF11
; break;
340 case 'F': scancode
= EStdKeyF12
; break;
342 keysym
->sym
= keymap
[scancode
];
346 if (scancode
>= ENonCharacterKeyBase
) {
347 // Non character keys
348 keysym
->sym
= keymap
[scancode
-
349 ENonCharacterKeyBase
+ 0x0081]; // !!hard coded
351 keysym
->sym
= keymap
[scancode
];
354 /* Remap the arrow keys if the device is rotated */
356 if (Private->EPOC_ScreenOrientation == CFbsBitGc::EGraphicsOrientationRotated270) {
357 switch(keysym->sym) {
358 case SDLK_UP: keysym->sym = SDLK_LEFT; break;
359 case SDLK_DOWN: keysym->sym = SDLK_RIGHT; break;
360 case SDLK_LEFT: keysym->sym = SDLK_DOWN; break;
361 case SDLK_RIGHT:keysym->sym = SDLK_UP; break;
365 /* If UNICODE is on, get the UNICODE value for the key */