00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #include <limits.h>
00021 #include <string>
00022 #include <iostream>
00023
00024 #include <SDL/SDL.h>
00025
00026 #include <archon/util/window.H>
00027
00028 using namespace std;
00029
00030 namespace Archon
00031 {
00032 namespace Utilities
00033 {
00034 Window::MouseCursor::MouseCursor(const char *image[])
00035 {
00036 if(!image)
00037 {
00038 data = 0;
00039 return;
00040 }
00041
00042 int i, row, col;
00043 Uint8 data[4*32];
00044 Uint8 mask[4*32];
00045 int hot_x, hot_y;
00046
00047 i = -1;
00048 for ( row=0; row<32; ++row )
00049 {
00050 for ( col=0; col<32; ++col )
00051 {
00052 if ( col % 8 )
00053 {
00054 data[i] <<= 1;
00055 mask[i] <<= 1;
00056 }
00057 else
00058 {
00059 ++i;
00060 data[i] = mask[i] = 0;
00061 }
00062 switch (image[4+row][col])
00063 {
00064 case 'X':
00065 data[i] |= 0x01;
00066 mask[i] |= 0x01;
00067 break;
00068 case '.':
00069 mask[i] |= 0x01;
00070 break;
00071 case ' ':
00072 break;
00073 }
00074 }
00075 }
00076 sscanf(image[4+row], "%d,%d", &hot_x, &hot_y);
00077 this->data = SDL_CreateCursor(data, mask, 32, 32, hot_x, hot_y);
00078 }
00079
00080 Window::MouseCursor::~MouseCursor()
00081 {{
00082 if(data) SDL_FreeCursor(static_cast<SDL_Cursor *>(data));
00083 }}
00084
00085 Window::Window(unsigned width,
00086 unsigned height,
00087 unsigned bitsPerPixel,
00088 bool fullScreen,
00089 bool openGlSupport,
00090 KeyboardHandler *keyboardHandler,
00091 MouseHandler *mouseHandler,
00092 WindowHandler *windowHandler):
00093 drawMode(set),
00094 drawColor(static_cast<unsigned long>(-1)),
00095 keyboardHandler(keyboardHandler),
00096 mouseHandler(mouseHandler),
00097 windowHandler(windowHandler),
00098 mouseX(0), mouseY(0)
00099 {
00100 if(SDL_Init(SDL_INIT_VIDEO|SDL_INIT_EVENTTHREAD) < 0 )
00101 ARCHON_THROW1(ResourceException,
00102 string("Could not initialize SDL "
00103 "video subsystem: ") +
00104 SDL_GetError());
00105
00106 Uint32 videoModeOptions = SDL_SWSURFACE|SDL_ANYFORMAT;
00107 if(fullScreen) videoModeOptions |= SDL_FULLSCREEN;
00108 if(openGlSupport) videoModeOptions |= SDL_OPENGL;
00109 dataHolder = SDL_SetVideoMode(width, height,
00110 bitsPerPixel, videoModeOptions);
00111 if(dataHolder == 0)
00112 ARCHON_THROW1(ResourceException,
00113 string("Could not set video mode: ") +
00114 SDL_GetError());
00115
00116 keyXlat = new Key[SDLK_LAST];
00117 initializeKeyXlat();
00118
00119 defaultMouseCursor = SDL_GetCursor();
00120
00121
00122
00123 executeEventQueue(0);
00124 }
00125
00126
00127 Window::~Window()
00128 {{
00129 delete[] keyXlat;
00130 SDL_Quit();
00131 }}
00132
00133 void Window::setDefaultMouseCursor()
00134 {
00135 SDL_SetCursor(static_cast<SDL_Cursor *>(defaultMouseCursor));
00136 }
00137
00138 Ref<Window::MouseCursor> Window::newMouseCursor(const char *image[])
00139 {
00140 return new MouseCursor(image);
00141 }
00142
00143 void Window::setMouseCursor(Ref<MouseCursor> c)
00144 {
00145 SDL_SetCursor(static_cast<SDL_Cursor *>(c->data));
00146 }
00147
00148 void Window::showMouseCursor()
00149 {
00150 SDL_ShowCursor(SDL_ENABLE);
00151 }
00152
00153 void Window::hideMouseCursor()
00154 {
00155 SDL_ShowCursor(SDL_DISABLE);
00156 }
00157
00158 void Window::swapBuffers()
00159 {
00160 SDL_GL_SwapBuffers();
00161 }
00162
00163 unsigned long Window::combineRGBA(unsigned r, unsigned g,
00164 unsigned b, unsigned a)
00165 {
00166 return SDL_MapRGBA((static_cast<SDL_Surface *>(dataHolder))->format, r, g, b, a);
00167 }
00168
00169 unsigned Window::getWidth() const
00170 {
00171 return (static_cast<SDL_Surface *>(dataHolder))->w;
00172 }
00173
00174 unsigned Window::getHeight() const
00175 {
00176 return (static_cast<SDL_Surface *>(dataHolder))->h;
00177 }
00178
00179 Window::Update::Update(Window *f):
00180 bytesPerPixel(static_cast<SDL_Surface *>(f->dataHolder)->format->BytesPerPixel),
00181 bytesPerScanline(static_cast<SDL_Surface *>(f->dataHolder)->pitch),
00182 pixels(static_cast<SDL_Surface *>(f->dataHolder)->pixels),
00183 width(f->getWidth()),
00184 height(f->getHeight()),
00185 drawMode(f->drawMode),
00186 drawColor(f->drawColor),
00187 frame(f)
00188 {
00189 if(SDL_MUSTLOCK(static_cast<SDL_Surface *>(frame->dataHolder)) &&
00190 SDL_LockSurface(static_cast<SDL_Surface *>(frame->dataHolder)) < 0)
00191 ARCHON_THROW1(ResourceException,
00192 string("Unable to lock SDL surface: ") +
00193 SDL_GetError());
00194 }
00195
00196 Window::Update::~Update()
00197 {{
00198 if(SDL_MUSTLOCK(static_cast<SDL_Surface *>(frame->dataHolder)))
00199 SDL_UnlockSurface(static_cast<SDL_Surface *>(frame->dataHolder));
00200 SDL_UpdateRect(static_cast<SDL_Surface *>(frame->dataHolder), 0, 0, 0, 0);
00201 }}
00202
00203 void Window::Update::clear()
00204 {
00205 if(SDL_FillRect(static_cast<SDL_Surface *>(frame->dataHolder), 0, 0) < 0)
00206 ARCHON_THROW1(ResourceException,
00207 string("SDL_FillRect failed: ") +
00208 SDL_GetError());
00209 }
00210
00211 void Window::Update::drawPoint(unsigned x, unsigned y,
00212 DrawMode mode, unsigned long color)
00213 {
00214
00215 Uint8 *const p = static_cast<Uint8 *>(pixels) +
00216 (y * bytesPerScanline + x * bytesPerPixel);
00217
00218 switch(bytesPerPixel)
00219 {
00220 case 1:
00221 switch(mode)
00222 {
00223 case set: *p = color; break;
00224 case add: *p += color; break;
00225 case sub: *p -= color; break;
00226 }
00227 break;
00228
00229 case 2:
00230 switch(mode)
00231 {
00232 case set: *reinterpret_cast<Uint16 *>(p) = color; break;
00233 case add: *reinterpret_cast<Uint16 *>(p) += color; break;
00234 case sub: *reinterpret_cast<Uint16 *>(p) -= color; break;
00235 }
00236 break;
00237
00238 case 3:
00239 switch(mode)
00240 {
00241 case set:
00242 if(SDL_BYTEORDER == SDL_BIG_ENDIAN)
00243 {
00244 p[0] = (color >> 16) & 0xff;
00245 p[1] = (color >> 8) & 0xff;
00246 p[2] = color & 0xff;
00247 }
00248 else
00249 {
00250 p[0] = color & 0xff;
00251 p[1] = (color >> 8) & 0xff;
00252 p[2] = (color >> 16) & 0xff;
00253 }
00254 break;
00255
00256 case add:
00257 if(SDL_BYTEORDER == SDL_BIG_ENDIAN)
00258 {
00259 p[0] += (color >> 16) & 0xff;
00260 p[1] += (color >> 8) & 0xff;
00261 p[2] += color & 0xff;
00262 }
00263 else
00264 {
00265 p[0] += color & 0xff;
00266 p[1] += (color >> 8) & 0xff;
00267 p[2] += (color >> 16) & 0xff;
00268 }
00269 break;
00270
00271 case sub:
00272 if(SDL_BYTEORDER == SDL_BIG_ENDIAN)
00273 {
00274 p[0] -= (color >> 16) & 0xff;
00275 p[1] -= (color >> 8) & 0xff;
00276 p[2] -= color & 0xff;
00277 }
00278 else
00279 {
00280 p[0] -= color & 0xff;
00281 p[1] -= (color >> 8) & 0xff;
00282 p[2] -= (color >> 16) & 0xff;
00283 }
00284 break;
00285 }
00286 break;
00287
00288 case 4:
00289 switch(mode)
00290 {
00291 case set: *reinterpret_cast<Uint32 *>(p) = color; break;
00292 case add: *reinterpret_cast<Uint32 *>(p) += color; break;
00293 case sub: *reinterpret_cast<Uint32 *>(p) -= color; break;
00294 }
00295 break;
00296 }
00297 }
00298
00299 void Window::Update::drawLine(unsigned x1, unsigned y1,
00300 unsigned x2, unsigned y2,
00301 DrawMode mode, unsigned long color)
00302 {
00303 int dx = int(x2)-int(x1);
00304 int dy = int(y2)-int(y1);
00305 int adx = dx<0?-dx:dx;
00306 int ady = dy<0?-dy:dy;
00307
00308 if(adx==0 && ady==0) drawPoint(x1, y1, mode, color);
00309 else if(adx >= ady)
00310 {
00311
00312
00313 unsigned x;
00314 long double y, sy = static_cast<long double>(dy)/dx;
00315
00316 if(x1 < x2)
00317 for(x=x1, y=y1; x<=x2; ++x, y+=sy)
00318 drawPoint(x, static_cast<unsigned>(y), mode, color);
00319
00320 else
00321 for(x=x2, y=y2; x<=x1; ++x, y+=sy)
00322 drawPoint(x, static_cast<unsigned>(y), mode, color);
00323 }
00324 else
00325 {
00326
00327
00328 unsigned y;
00329 long double x, sx = static_cast<long double>(dx)/dy;
00330
00331 if(y1 < y2)
00332 for(y=y1, x=x1; y<=y2; ++y, x+=sx)
00333 drawPoint(static_cast<unsigned>(x), y, mode, color);
00334
00335 else
00336 for(y=y2, x=x2; y<=y1; ++y, x+=sx)
00337 drawPoint(static_cast<unsigned>(x), y, mode, color);
00338 }
00339 }
00340
00341
00342 void Window::discardEventQueue()
00343 {
00344 SDL_Event event;
00345 while(SDL_PollEvent(&event)) {}
00346 }
00347
00348 void Window::executeEventQueue(unsigned long milliSecondTime)
00349 {
00350 SDL_Event event;
00351
00352 while(SDL_PollEvent(&event))
00353 {
00354 switch(event.type)
00355 {
00356 case SDL_KEYDOWN:
00357 if(keyboardHandler)
00358 keyboardHandler->press(keyXlat[event.key.keysym.sym],
00359 milliSecondTime);
00360 break;
00361
00362 case SDL_KEYUP:
00363 if(keyboardHandler)
00364 keyboardHandler->release(keyXlat[event.key.keysym.sym]);
00365 break;
00366
00367 case SDL_MOUSEBUTTONDOWN:
00368 if(mouseHandler)
00369 mouseHandler->press(event.button.button-1,
00370 event.button.x, event.button.y,
00371 milliSecondTime);
00372 break;
00373
00374 case SDL_MOUSEBUTTONUP:
00375 if(mouseHandler)
00376 mouseHandler->release(event.button.button-1,
00377 event.button.x, event.button.y);
00378 break;
00379
00380 case SDL_MOUSEMOTION:
00381 mouseX = event.motion.x;
00382 mouseY = event.motion.y;
00383 if(mouseHandler)
00384 mouseHandler->motion(event.motion.x, event.motion.y,
00385 event.motion.xrel, event.motion.yrel);
00386 break;
00387
00388 case SDL_QUIT:
00389 if(windowHandler) windowHandler->quit();
00390 break;
00391 }
00392 }
00393 }
00394
00395 void Window::initializeKeyXlat()
00396 {
00397 for(unsigned i=0;i<SDLK_LAST;++i) keyXlat[i] = static_cast<Key>(UINT_MAX);
00398
00399 keyXlat[SDLK_FIRST] = key_first;
00400 keyXlat[SDLK_BACKSPACE] = key_backspace;
00401 keyXlat[SDLK_TAB] = key_tab;
00402 keyXlat[SDLK_CLEAR] = key_clear;
00403 keyXlat[SDLK_RETURN] = key_return;
00404 keyXlat[SDLK_PAUSE] = key_pause;
00405 keyXlat[SDLK_ESCAPE] = key_escape;
00406 keyXlat[SDLK_SPACE] = key_space;
00407 keyXlat[SDLK_EXCLAIM] = key_exclaim;
00408 keyXlat[SDLK_QUOTEDBL] = key_quotedbl;
00409 keyXlat[SDLK_HASH] = key_hash;
00410 keyXlat[SDLK_DOLLAR] = key_dollar;
00411 keyXlat[SDLK_AMPERSAND] = key_ampersand;
00412 keyXlat[SDLK_QUOTE] = key_quote;
00413 keyXlat[SDLK_LEFTPAREN] = key_leftparen;
00414 keyXlat[SDLK_RIGHTPAREN] = key_rightparen;
00415 keyXlat[SDLK_ASTERISK] = key_asterisk;
00416 keyXlat[SDLK_PLUS] = key_plus;
00417 keyXlat[SDLK_COMMA] = key_comma;
00418 keyXlat[SDLK_MINUS] = key_minus;
00419 keyXlat[SDLK_PERIOD] = key_period;
00420 keyXlat[SDLK_SLASH] = key_slash;
00421 keyXlat[SDLK_0] = key_0;
00422 keyXlat[SDLK_1] = key_1;
00423 keyXlat[SDLK_2] = key_2;
00424 keyXlat[SDLK_3] = key_3;
00425 keyXlat[SDLK_4] = key_4;
00426 keyXlat[SDLK_5] = key_5;
00427 keyXlat[SDLK_6] = key_6;
00428 keyXlat[SDLK_7] = key_7;
00429 keyXlat[SDLK_8] = key_8;
00430 keyXlat[SDLK_9] = key_9;
00431 keyXlat[SDLK_COLON] = key_colon;
00432 keyXlat[SDLK_SEMICOLON] = key_semicolon;
00433 keyXlat[SDLK_LESS] = key_less;
00434 keyXlat[SDLK_EQUALS] = key_equals;
00435 keyXlat[SDLK_GREATER] = key_greater;
00436 keyXlat[SDLK_QUESTION] = key_question;
00437 keyXlat[SDLK_AT] = key_at;
00438 keyXlat[SDLK_LEFTBRACKET] = key_leftbracket;
00439 keyXlat[SDLK_BACKSLASH] = key_backslash;
00440 keyXlat[SDLK_RIGHTBRACKET]= key_rightbracket;
00441 keyXlat[SDLK_CARET] = key_caret;
00442 keyXlat[SDLK_UNDERSCORE] = key_underscore;
00443 keyXlat[SDLK_BACKQUOTE] = key_backquote;
00444 keyXlat[SDLK_a] = key_a;
00445 keyXlat[SDLK_b] = key_b;
00446 keyXlat[SDLK_c] = key_c;
00447 keyXlat[SDLK_d] = key_d;
00448 keyXlat[SDLK_e] = key_e;
00449 keyXlat[SDLK_f] = key_f;
00450 keyXlat[SDLK_g] = key_g;
00451 keyXlat[SDLK_h] = key_h;
00452 keyXlat[SDLK_i] = key_i;
00453 keyXlat[SDLK_j] = key_j;
00454 keyXlat[SDLK_k] = key_k;
00455 keyXlat[SDLK_l] = key_l;
00456 keyXlat[SDLK_m] = key_m;
00457 keyXlat[SDLK_n] = key_n;
00458 keyXlat[SDLK_o] = key_o;
00459 keyXlat[SDLK_p] = key_p;
00460 keyXlat[SDLK_q] = key_q;
00461 keyXlat[SDLK_r] = key_r;
00462 keyXlat[SDLK_s] = key_s;
00463 keyXlat[SDLK_t] = key_t;
00464 keyXlat[SDLK_u] = key_u;
00465 keyXlat[SDLK_v] = key_v;
00466 keyXlat[SDLK_w] = key_w;
00467 keyXlat[SDLK_x] = key_x;
00468 keyXlat[SDLK_y] = key_y;
00469 keyXlat[SDLK_z] = key_z;
00470 keyXlat[SDLK_DELETE] = key_delete;
00471
00472
00473 keyXlat[SDLK_WORLD_0] = key_world_0;
00474 keyXlat[SDLK_WORLD_1] = key_world_1;
00475 keyXlat[SDLK_WORLD_2] = key_world_2;
00476 keyXlat[SDLK_WORLD_3] = key_world_3;
00477 keyXlat[SDLK_WORLD_4] = key_world_4;
00478 keyXlat[SDLK_WORLD_5] = key_world_5;
00479 keyXlat[SDLK_WORLD_6] = key_world_6;
00480 keyXlat[SDLK_WORLD_7] = key_world_7;
00481 keyXlat[SDLK_WORLD_8] = key_world_8;
00482 keyXlat[SDLK_WORLD_9] = key_world_9;
00483 keyXlat[SDLK_WORLD_10] = key_world_10;
00484 keyXlat[SDLK_WORLD_11] = key_world_11;
00485 keyXlat[SDLK_WORLD_12] = key_world_12;
00486 keyXlat[SDLK_WORLD_13] = key_world_13;
00487 keyXlat[SDLK_WORLD_14] = key_world_14;
00488 keyXlat[SDLK_WORLD_15] = key_world_15;
00489 keyXlat[SDLK_WORLD_16] = key_world_16;
00490 keyXlat[SDLK_WORLD_17] = key_world_17;
00491 keyXlat[SDLK_WORLD_18] = key_world_18;
00492 keyXlat[SDLK_WORLD_19] = key_world_19;
00493 keyXlat[SDLK_WORLD_20] = key_world_20;
00494 keyXlat[SDLK_WORLD_21] = key_world_21;
00495 keyXlat[SDLK_WORLD_22] = key_world_22;
00496 keyXlat[SDLK_WORLD_23] = key_world_23;
00497 keyXlat[SDLK_WORLD_24] = key_world_24;
00498 keyXlat[SDLK_WORLD_25] = key_world_25;
00499 keyXlat[SDLK_WORLD_26] = key_world_26;
00500 keyXlat[SDLK_WORLD_27] = key_world_27;
00501 keyXlat[SDLK_WORLD_28] = key_world_28;
00502 keyXlat[SDLK_WORLD_29] = key_world_29;
00503 keyXlat[SDLK_WORLD_30] = key_world_30;
00504 keyXlat[SDLK_WORLD_31] = key_world_31;
00505 keyXlat[SDLK_WORLD_32] = key_world_32;
00506 keyXlat[SDLK_WORLD_33] = key_world_33;
00507 keyXlat[SDLK_WORLD_34] = key_world_34;
00508 keyXlat[SDLK_WORLD_35] = key_world_35;
00509 keyXlat[SDLK_WORLD_36] = key_world_36;
00510 keyXlat[SDLK_WORLD_37] = key_world_37;
00511 keyXlat[SDLK_WORLD_38] = key_world_38;
00512 keyXlat[SDLK_WORLD_39] = key_world_39;
00513 keyXlat[SDLK_WORLD_40] = key_world_40;
00514 keyXlat[SDLK_WORLD_41] = key_world_41;
00515 keyXlat[SDLK_WORLD_42] = key_world_42;
00516 keyXlat[SDLK_WORLD_43] = key_world_43;
00517 keyXlat[SDLK_WORLD_44] = key_world_44;
00518 keyXlat[SDLK_WORLD_45] = key_world_45;
00519 keyXlat[SDLK_WORLD_46] = key_world_46;
00520 keyXlat[SDLK_WORLD_47] = key_world_47;
00521 keyXlat[SDLK_WORLD_48] = key_world_48;
00522 keyXlat[SDLK_WORLD_49] = key_world_49;
00523 keyXlat[SDLK_WORLD_50] = key_world_50;
00524 keyXlat[SDLK_WORLD_51] = key_world_51;
00525 keyXlat[SDLK_WORLD_52] = key_world_52;
00526 keyXlat[SDLK_WORLD_53] = key_world_53;
00527 keyXlat[SDLK_WORLD_54] = key_world_54;
00528 keyXlat[SDLK_WORLD_55] = key_world_55;
00529 keyXlat[SDLK_WORLD_56] = key_world_56;
00530 keyXlat[SDLK_WORLD_57] = key_world_57;
00531 keyXlat[SDLK_WORLD_58] = key_world_58;
00532 keyXlat[SDLK_WORLD_59] = key_world_59;
00533 keyXlat[SDLK_WORLD_60] = key_world_60;
00534 keyXlat[SDLK_WORLD_61] = key_world_61;
00535 keyXlat[SDLK_WORLD_62] = key_world_62;
00536 keyXlat[SDLK_WORLD_63] = key_world_63;
00537 keyXlat[SDLK_WORLD_64] = key_world_64;
00538 keyXlat[SDLK_WORLD_65] = key_world_65;
00539 keyXlat[SDLK_WORLD_66] = key_world_66;
00540 keyXlat[SDLK_WORLD_67] = key_world_67;
00541 keyXlat[SDLK_WORLD_68] = key_world_68;
00542 keyXlat[SDLK_WORLD_69] = key_world_69;
00543 keyXlat[SDLK_WORLD_70] = key_world_70;
00544 keyXlat[SDLK_WORLD_71] = key_world_71;
00545 keyXlat[SDLK_WORLD_72] = key_world_72;
00546 keyXlat[SDLK_WORLD_73] = key_world_73;
00547 keyXlat[SDLK_WORLD_74] = key_world_74;
00548 keyXlat[SDLK_WORLD_75] = key_world_75;
00549 keyXlat[SDLK_WORLD_76] = key_world_76;
00550 keyXlat[SDLK_WORLD_77] = key_world_77;
00551 keyXlat[SDLK_WORLD_78] = key_world_78;
00552 keyXlat[SDLK_WORLD_79] = key_world_79;
00553 keyXlat[SDLK_WORLD_80] = key_world_80;
00554 keyXlat[SDLK_WORLD_81] = key_world_81;
00555 keyXlat[SDLK_WORLD_82] = key_world_82;
00556 keyXlat[SDLK_WORLD_83] = key_world_83;
00557 keyXlat[SDLK_WORLD_84] = key_world_84;
00558 keyXlat[SDLK_WORLD_85] = key_world_85;
00559 keyXlat[SDLK_WORLD_86] = key_world_86;
00560 keyXlat[SDLK_WORLD_87] = key_world_87;
00561 keyXlat[SDLK_WORLD_88] = key_world_88;
00562 keyXlat[SDLK_WORLD_89] = key_world_89;
00563 keyXlat[SDLK_WORLD_90] = key_world_90;
00564 keyXlat[SDLK_WORLD_91] = key_world_91;
00565 keyXlat[SDLK_WORLD_92] = key_world_92;
00566 keyXlat[SDLK_WORLD_93] = key_world_93;
00567 keyXlat[SDLK_WORLD_94] = key_world_94;
00568 keyXlat[SDLK_WORLD_95] = key_world_95;
00569
00570
00571 keyXlat[SDLK_KP0] = key_kp0;
00572 keyXlat[SDLK_KP1] = key_kp1;
00573 keyXlat[SDLK_KP2] = key_kp2;
00574 keyXlat[SDLK_KP3] = key_kp3;
00575 keyXlat[SDLK_KP4] = key_kp4;
00576 keyXlat[SDLK_KP5] = key_kp5;
00577 keyXlat[SDLK_KP6] = key_kp6;
00578 keyXlat[SDLK_KP7] = key_kp7;
00579 keyXlat[SDLK_KP8] = key_kp8;
00580 keyXlat[SDLK_KP9] = key_kp9;
00581 keyXlat[SDLK_KP_PERIOD] = key_kp_period;
00582 keyXlat[SDLK_KP_DIVIDE] = key_kp_divide;
00583 keyXlat[SDLK_KP_MULTIPLY] = key_kp_multiply;
00584 keyXlat[SDLK_KP_MINUS] = key_kp_minus;
00585 keyXlat[SDLK_KP_PLUS] = key_kp_plus;
00586 keyXlat[SDLK_KP_ENTER] = key_kp_enter;
00587 keyXlat[SDLK_KP_EQUALS] = key_kp_equals;
00588
00589
00590 keyXlat[SDLK_UP] = key_up;
00591 keyXlat[SDLK_DOWN] = key_down;
00592 keyXlat[SDLK_RIGHT] = key_right;
00593 keyXlat[SDLK_LEFT] = key_left;
00594 keyXlat[SDLK_INSERT] = key_insert;
00595 keyXlat[SDLK_HOME] = key_home;
00596 keyXlat[SDLK_END] = key_end;
00597 keyXlat[SDLK_PAGEUP] = key_pageup;
00598 keyXlat[SDLK_PAGEDOWN] = key_pagedown;
00599
00600
00601 keyXlat[SDLK_F1] = key_f1;
00602 keyXlat[SDLK_F2] = key_f2;
00603 keyXlat[SDLK_F3] = key_f3;
00604 keyXlat[SDLK_F4] = key_f4;
00605 keyXlat[SDLK_F5] = key_f5;
00606 keyXlat[SDLK_F6] = key_f6;
00607 keyXlat[SDLK_F7] = key_f7;
00608 keyXlat[SDLK_F8] = key_f8;
00609 keyXlat[SDLK_F9] = key_f9;
00610 keyXlat[SDLK_F10] = key_f10;
00611 keyXlat[SDLK_F11] = key_f11;
00612 keyXlat[SDLK_F12] = key_f12;
00613 keyXlat[SDLK_F13] = key_f13;
00614 keyXlat[SDLK_F14] = key_f14;
00615 keyXlat[SDLK_F15] = key_f15;
00616
00617
00618 keyXlat[SDLK_NUMLOCK] = key_numlock;
00619 keyXlat[SDLK_CAPSLOCK] = key_capslock;
00620 keyXlat[SDLK_SCROLLOCK] = key_scrollock;
00621 keyXlat[SDLK_RSHIFT] = key_rshift;
00622 keyXlat[SDLK_LSHIFT] = key_lshift;
00623 keyXlat[SDLK_RCTRL] = key_rctrl;
00624 keyXlat[SDLK_LCTRL] = key_lctrl;
00625 keyXlat[SDLK_RALT] = key_ralt;
00626 keyXlat[SDLK_LALT] = key_lalt;
00627 keyXlat[SDLK_RMETA] = key_rmeta;
00628 keyXlat[SDLK_LMETA] = key_lmeta;
00629 keyXlat[SDLK_LSUPER] = key_lsuper;
00630 keyXlat[SDLK_RSUPER] = key_rsuper;
00631 keyXlat[SDLK_MODE] = key_mode;
00632 keyXlat[SDLK_COMPOSE] = key_compose;
00633
00634
00635 keyXlat[SDLK_HELP] = key_help;
00636 keyXlat[SDLK_PRINT] = key_print;
00637 keyXlat[SDLK_SYSREQ] = key_sysreq;
00638 keyXlat[SDLK_BREAK] = key_break;
00639 keyXlat[SDLK_MENU] = key_menu;
00640 keyXlat[SDLK_POWER] = key_power;
00641 keyXlat[SDLK_EURO] = key_euro;
00642 }
00643 }
00644 }