From d5373e625275dfb7082c138a296b99c8f3a04b20 Mon Sep 17 00:00:00 2001 From: Tom Hicks Date: Sun, 26 Jun 2005 09:56:47 -0400 Subject: [PATCH] Added: Preliminary keyhandling code for linux ~g2k --- src/linux.cpp | 324 +++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 271 insertions(+), 53 deletions(-) diff --git a/src/linux.cpp b/src/linux.cpp index 50c2fee..0a6ab70 100644 --- a/src/linux.cpp +++ b/src/linux.cpp @@ -48,7 +48,7 @@ void ResizeGLScene(GLsizei width, GLsizei height) { if(height == 0) height = 1; - + glViewport(0,0,width, height); glMatrixMode(GL_PROJECTION); glLoadIdentity(); @@ -59,7 +59,7 @@ void ResizeGLScene(GLsizei width, GLsizei height) int DrawGLScene() { level.Render(); - + //Maybe this should be integrated into the Window class if(g_Screen.doubleBuffered) { @@ -125,7 +125,7 @@ void KillGLWindow() glXDestroyContext(g_Screen.display, g_Screen.hRC); g_Screen.hRC = NULL; } - + if(g_Screen.fullscreen) { XF86VidModeSwitchToMode(g_Screen.display, g_Screen.screen, &g_Screen.vidMode); @@ -152,7 +152,7 @@ bool CreateGLWindow(string title, int width, int height, int bits, bool fullscre Atom wmDelete; Window winDummy; unsigned int borderDummy; - + g_Screen.name = title; g_Screen.width = width; g_Screen.height = height; @@ -163,10 +163,10 @@ bool CreateGLWindow(string title, int width, int height, int bits, bool fullscre g_Screen.screen = DefaultScreen(g_Screen.display); XF86VidModeQueryVersion(g_Screen.display, &vidModeMajorVersion, &vidModeMinorVersion); printf("XF86VidModeExtension-Version %d.%d\n", vidModeMajorVersion, vidModeMinorVersion); - + XF86VidModeGetAllModeLines(g_Screen.display, g_Screen.screen, &modeNum, &modes); g_Screen.vidMode = *modes[0]; - + int i; for(i=0; iscreen), vi->visual, AllocNone); g_Screen.attributes.colormap = cmap; g_Screen.attributes.border_pixel = 0; - + if(g_Screen.fullscreen) { XF86VidModeSwitchToMode(g_Screen.display, g_Screen.screen, modes[bestMode]); XF86VidModeSetViewPort(g_Screen.display, g_Screen.screen, 0, 0); XFree(modes); - + g_Screen.attributes.override_redirect = true; g_Screen.attributes.event_mask = ExposureMask | KeyPressMask | ButtonPressMask | StructureNotifyMask; g_Screen.window = XCreateWindow(g_Screen.display, RootWindow(g_Screen.display, vi->screen), 0, 0, width, height, 0, vi->depth, InputOutput, vi->visual, CWBorderPixel | CWColormap | CWEventMask | CWOverrideRedirect, &g_Screen.attributes); @@ -221,7 +221,7 @@ bool CreateGLWindow(string title, int width, int height, int bits, bool fullscre XSetStandardProperties(g_Screen.display, g_Screen.window, title.c_str(), title.c_str(), None, NULL, 0, NULL); XMapRaised(g_Screen.display, g_Screen.window); } - + glXMakeCurrent(g_Screen.display, g_Screen.window, g_Screen.hRC); unsigned int twidth, theight, depth; XGetGeometry(g_Screen.display, g_Screen.window, &winDummy, &g_Screen.x, &g_Screen.y, &twidth, &theight, &borderDummy, &depth); @@ -286,46 +286,48 @@ int main(int argc, char** argv) XNextEvent(g_Screen.display, &event); switch(event.type) { - case Expose: - if(event.xexpose.count != 0) - { - break; - } - DrawGLScene(); + case Expose: + if(event.xexpose.count != 0) + { break; - case ConfigureNotify: - if((event.xconfigure.width != g_Screen.width) || (event.xconfigure.height != g_Screen.height)) - { - g_Screen.width = event.xconfigure.width; - g_Screen.height = event.xconfigure.height; - printf("Resize event\n"); - ResizeGLScene(event.xconfigure.width, event.xconfigure.height); - } - break; - case ButtonPress: + } + DrawGLScene(); + break; + case ConfigureNotify: + if((event.xconfigure.width != g_Screen.width) || (event.xconfigure.height != g_Screen.height)) + { + g_Screen.width = event.xconfigure.width; + g_Screen.height = event.xconfigure.height; + printf("Resize event\n"); + ResizeGLScene(event.xconfigure.width, event.xconfigure.height); + } + break; + case ButtonPress: + done = true; + break; + case KeyPress: + keys[TraslateKey(XLookupKeysym(&event.xkey, 0))] = true; + //Remove this later it shouldn't be needed + if(XLookupKeysym(&event.xkey, 0) == XK_Escape) + { + done = true; + } + if(XLookupKeysym(&event.xkey, 0) == XK_F1) + { + KillGLWindow(); + g_Screen.fullscreen = !g_Screen.fullscreen; + CreateGLWindow("Blah Blah Blah", 640, 480, 24, g_Screen.fullscreen); + } + break; + case ClientMessage: + if(*XGetAtomName(g_Screen.display, event.xclient.message_type) == *"WM_PROTOCOLS") + { + printf("Exiting sanely...\n"); done = true; - break; - case KeyPress: - if(XLookupKeysym(&event.xkey, 0) == XK_Escape) - { - done = true; - } - if(XLookupKeysym(&event.xkey, 0) == XK_F1) - { - KillGLWindow(); - g_Screen.fullscreen = !g_Screen.fullscreen; - CreateGLWindow("Blah Blah Blah", 640, 480, 24, g_Screen.fullscreen); - } - break; - case ClientMessage: - if(*XGetAtomName(g_Screen.display, event.xclient.message_type) == *"WM_PROTOCOLS") - { - printf("Exiting sanely...\n"); - done = true; - } - break; - default: - break; + } + break; + default: + break; } //End Equivalent of WNDPROC if(active) @@ -350,7 +352,7 @@ int main(int argc, char** argv) SetCursorPos(g_Screen.width/2, g_Screen.height/2);//Shit this may be windows specific #endif } - + //Maybe some of these if not almost all should be moved into Level ////////// //Move Backward @@ -632,9 +634,9 @@ int main(int argc, char** argv) } } } - + DrawGLScene(); - + if(keys[KEY_F1]) { keys[KEY_F1] = false; @@ -652,4 +654,220 @@ int main(int argc, char** argv) exit(0); } +//This should probably be moved into oa_input +usigned char TranslateKey(int keyCode) +{ + switch (keyCode) + { + case XK_BackSpace: + return KEY_BACK; + case XK_Tab: + return KEY_TAB; + case XK_Return: + return KEY_RETURN; + case XK_Escape: + return KEY_ESCAPE; + case XK_Left: + return KEY_LEFT; + case XK_Right: + return KEY_RIGHT; + case XK_Up: + return KEY_UP; + case XK_Down: + return KEY_DOWN; + case XK_Home: + return KEY_HOME; + case XK_End: + return KEY_END; + case XK_Prior: + return KEY_PRIOR; + case XK_Next: + return KEY_NEXT; + case XK_Num_Lock: + return KEY_NUMLOCK; + case XK_KP_Enter: + return KEY_RETURN; + case XK_KP_Home: + return KEY_HOME; + case XK_KP_End: + return KEY_END; + case XK_KP_Prior: + return KEY_PRIOR; + case XK_KP_Next: + return KEY_NEXT; + case XK_KP_0: + return KEY_NUMPAD0; + case XK_KP_1: + return KEY_NUMPAD1; + case XK_KP_2: + return KEY_NUMPAD2; + case XK_KP_3; + return KEY_NUMPAD3; + case XK_KP_4: + return KEY_NUMPAD4; + case XK_KP_5: + return KEY_NUMPAD5; + case XK_KP_6: + return KEY_NUMPAD6; + case XK_KP_7: + return KEY_NUMPAD7; + case XK_KP_8: + return KEY_NUMPAD8; + case XK_KP_9: + return KEY_NUMPAD9; + case XK_KP_Multiply: + return KEY_MULTIPLY; + case XK_KP_Add: + return KEY_ADD; + case XK_KP_Subtract: + return KEY_SUBTRACT; + case XK_KP_Divide: + return KEY_DIVIDE; + case XK_F1: + return KEY_F1: + case XK_F2: + return KEY_F2: + case XK_F3; + return KEY_F3: + case XK_F4: + return KEY_F4: + case XK_F5: + return KEY_F5: + case XK_F6: + return KEY_F6: + case XK_F7: + return KEY_F7: + case XK_F8: + return KEY_F8: + case XK_F9: + return KEY_F9: + case XK_F10: + return KEY_F10: + case XK_F11: + return KEY_F11: + case XK_F12: + return KEY_F12: + case XK_Shift_L: + return KEY_SHIFT; + case XK_Shift_R: + return KEY_SHIFT; + case XK_Control_L: + return KEY_CONTROL; + case XK_Control_R: + return KEY_CONTROL; + case XK_Caps_Lock: + return KEY_CAPITAL; + case XK_Pause: + return KEY_PAUSE; + case XK_KP_Space: + return KEY_SPACE; + case XK_Insert: + return KEY_INSERT; + case XK_Delete: + return KEY_DELETE; + case XK_KP_Separator: + return KEY_SEPARATOR; + case XK_Scroll_Lock: + return KEY_SCROLL; + case XK_period: + return KEY_OEM_PERIOD; + case XK_plus: + return KEY_OEM_PLUS; + case XK_minus: + return KEY_OEM_MINUS; + case XK_comma: + return KEY_OEM_COMMA; + case XK_0: + return KEY_0; + case XK_1: + return KEY_1; + case XK_2: + return KEY_2; + case XK_3: + return KEY_3; + case XK_4: + return KEY_4; + case XK_5: + return KEY_5; + case XK_6: + return KEY_6; + case XK_7: + return KEY_7; + case XK_8: + return KEY_8; + case XK_9: + return KEY_9; + case XK_A: + return KEY_A; + case XK_B: + return KEY_B; + case XK_C: + return KEY_C; + case XK_D: + return KEY_D; + case XK_E: + return KEY_E; + case XK_F: + return KEY_F; + case XK_G: + return KEY_G; + case XK_H: + return KEY_H; + case XK_I: + return KEY_I; + case XK_J: + return KEY_J; + case XK_K: + return KEY_K; + case XK_L: + return KEY_L; + case XK_M: + return KEY_M; + case XK_N: + return KEY_N; + case XK_O: + return KEY_O; + case XK_P: + return KEY_P; + case XK_Q: + return KEY_Q; + case XK_R: + return KEY_R; + case XK_S: + return KEY_S; + case XK_T: + return KEY_T; + case XK_U: + return KEY_U; + case XK_V: + return KEY_V; + case XK_W: + return KEY_W; + case XK_X: + return KEY_X; + case XK_Y: + return KEY_Y; + case XK_Z: + return KEY_Z; + +/*These keys definately still need to be accounted for +#define KEY_LBUTTON 1 +#define KEY_RBUTTON 2 +#define KEY_MBUTTON 3 +#define KEY_LWIN 21 +#define KEY_RWIN 22 +#define KEY_APPS 23 +#define KEY_OEM_1 53 +#define KEY_OEM_2 54 +#define KEY_OEM_3 55 +#define KEY_OEM_4 56 +#define KEY_OEM_5 57 +#define KEY_OEM_6 58 +#define KEY_OEM_7 59 +*/ + default: + return KEY_UNKNOWN; + } +} + #endif