window.C

00001 /*
00002  * This file is part of the "Archon" framework.
00003  * (http://files3d.sourceforge.net)
00004  *
00005  * Copyright © 2002 by Kristian Spangsege and Brian Kristiansen.
00006  *
00007  * Permission to use, copy, modify, and distribute this software and
00008  * its documentation under the terms of the GNU General Public License is
00009  * hereby granted. No representations are made about the suitability of
00010  * this software for any purpose. It is provided "as is" without express
00011  * or implied warranty. See the GNU General Public License
00012  * (http://www.gnu.org/copyleft/gpl.html) for more details.
00013  *
00014  * The characters in this file are ISO8859-1 encoded.
00015  *
00016  * The documentation in this file is in "Doxygen" style
00017  * (http://www.doxygen.org).
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     {{ // The extra scope is needed to work around gcc3.2 bug #8287
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       // Get the mouse position updated if the mouse is within the
00122       // window initially.
00123       executeEventQueue(0);
00124     }
00125 
00126 
00127     Window::~Window()
00128     {{ // The extra scope is needed to work around gcc3.2 bug #8287
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     {{ // The extra scope is needed to work around gcc3.2 bug #8287
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       /* Here p is the address to the pixel we want to set */
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         // At this point we know that dx!=0 so iterate on the x-axis
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         // At this point we know that dy!=0 so iterate on the y-axis
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       /* International keyboard syms */
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       /* Numeric keypad */
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       /* Arrows + Home/End pad */
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       /* Function keys */
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       /* Key state modifier keys */
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;           /* Left "Windows" key */
00630       keyXlat[SDLK_RSUPER]      = key_rsuper;           /* Right "Windows" key */
00631       keyXlat[SDLK_MODE]        = key_mode;             /* "Alt Gr" key */
00632       keyXlat[SDLK_COMPOSE]     = key_compose;          /* Multi-key compose key */
00633   
00634       /* Miscellaneous function keys */
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;            /* Power Macintosh power key */
00641       keyXlat[SDLK_EURO]        = key_euro;             /* Some european keyboards */
00642     }
00643   }
00644 }

Generated on Sun Jul 30 22:55:46 2006 for Archon by  doxygen 1.4.4