1/* 2 SDL - Simple DirectMedia Layer 3 Copyright (C) 1997-2006 Sam Lantinga 4 5 This library is free software; you can redistribute it and/or 6 modify it under the terms of the GNU Lesser General Public 7 License as published by the Free Software Foundation; either 8 version 2.1 of the License, or (at your option) any later version. 9 10 This library is distributed in the hope that it will be useful, 11 but WITHOUT ANY WARRANTY; without even the implied warranty of 12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 13 Lesser General Public License for more details. 14 15 You should have received a copy of the GNU Lesser General Public 16 License along with this library; if not, write to the Free Software 17 Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA 18 19 Sam Lantinga 20 slouken@libsdl.org 21*/ 22#include "SDL_config.h" 23 24/* 25 * Atari keyboard events manager, using Gemdos 26 * 27 * Patrice Mandin 28 */ 29 30/* Mint includes */ 31#include <mint/osbind.h> 32#include <mint/cookie.h> 33 34#include "../../events/SDL_sysevents.h" 35#include "../../events/SDL_events_c.h" 36 37#include "SDL_atarikeys.h" 38#include "SDL_atarievents_c.h" 39#include "SDL_xbiosevents_c.h" 40#include "SDL_ataridevmouse_c.h" 41 42/* To save state of keyboard */ 43 44static unsigned char gemdos_currentkeyboard[ATARIBIOS_MAXKEYS]; 45static unsigned char gemdos_previouskeyboard[ATARIBIOS_MAXKEYS]; 46static SDL_bool use_dev_mouse = SDL_FALSE; 47 48enum { 49 DEV_BUSY=0, 50 DEV_READY 51}; 52 53static void UpdateSpecialKeys(int special_keys_state); 54 55void AtariGemdos_InitOSKeymap(_THIS) 56{ 57 int i, vectors_mask; 58 unsigned long dummy; 59 60 SDL_memset(gemdos_currentkeyboard, 0, sizeof(gemdos_currentkeyboard)); 61 SDL_memset(gemdos_previouskeyboard, 0, sizeof(gemdos_previouskeyboard)); 62 63 use_dev_mouse = (SDL_AtariDevMouse_Open()!=0) ? SDL_TRUE : SDL_FALSE; 64 65 vectors_mask = ATARI_XBIOS_JOYSTICKEVENTS; /* XBIOS joystick events */ 66 if (!use_dev_mouse) { 67 vectors_mask |= ATARI_XBIOS_MOUSEEVENTS; /* XBIOS mouse events */ 68 } 69/* if (Getcookie(C_MiNT, &dummy)==C_FOUND) { 70 vectors_mask = 0; 71 }*/ 72 SDL_AtariXbios_InstallVectors(vectors_mask); 73} 74 75void AtariGemdos_PumpEvents(_THIS) 76{ 77 int i; 78 SDL_keysym keysym; 79 80 /* Update pressed keys */ 81 SDL_memset(gemdos_currentkeyboard, 0, ATARIBIOS_MAXKEYS); 82 83 while (Cconis()!=DEV_BUSY) { 84 unsigned long key_pressed; 85 key_pressed=Cnecin(); 86 gemdos_currentkeyboard[(key_pressed>>16)&(ATARIBIOS_MAXKEYS-1)]=0xFF; 87 } 88 89 /* Read special keys */ 90 UpdateSpecialKeys(Kbshift(-1)); 91 92 /* Now generate events */ 93 for (i=0; i<ATARIBIOS_MAXKEYS; i++) { 94 /* Key pressed ? */ 95 if (gemdos_currentkeyboard[i] && !gemdos_previouskeyboard[i]) 96 SDL_PrivateKeyboard(SDL_PRESSED, 97 SDL_Atari_TranslateKey(i, &keysym, SDL_TRUE)); 98 99 /* Key unpressed ? */ 100 if (gemdos_previouskeyboard[i] && !gemdos_currentkeyboard[i]) 101 SDL_PrivateKeyboard(SDL_RELEASED, 102 SDL_Atari_TranslateKey(i, &keysym, SDL_FALSE)); 103 } 104 105 if (use_dev_mouse) { 106 SDL_AtariDevMouse_PostMouseEvents(this, SDL_TRUE); 107 } else { 108 SDL_AtariXbios_PostMouseEvents(this, SDL_TRUE); 109 } 110 111 /* Will be previous table */ 112 SDL_memcpy(gemdos_previouskeyboard, gemdos_currentkeyboard, sizeof(gemdos_previouskeyboard)); 113} 114 115static void UpdateSpecialKeys(int special_keys_state) 116{ 117#define UPDATE_SPECIAL_KEYS(numbit,scancode) \ 118 { \ 119 if (special_keys_state & (1<<(numbit))) { \ 120 gemdos_currentkeyboard[scancode]=0xFF; \ 121 } \ 122 } 123 124 UPDATE_SPECIAL_KEYS(K_RSHIFT, SCANCODE_RIGHTSHIFT); 125 UPDATE_SPECIAL_KEYS(K_LSHIFT, SCANCODE_LEFTSHIFT); 126 UPDATE_SPECIAL_KEYS(K_CTRL, SCANCODE_LEFTCONTROL); 127 UPDATE_SPECIAL_KEYS(K_ALT, SCANCODE_LEFTALT); 128 UPDATE_SPECIAL_KEYS(K_CAPSLOCK, SCANCODE_CAPSLOCK); 129} 130 131void AtariGemdos_ShutdownEvents(void) 132{ 133 SDL_AtariXbios_RestoreVectors(); 134 if (use_dev_mouse) { 135 SDL_AtariDevMouse_Close(); 136 } 137} 138