X-Git-Url: http://de.git.xonotic.org/?a=blobdiff_plain;f=vid_glx.c;h=01d2486be4d5a0e09d1aa764b2aab474179f31f5;hb=4671df4300aefb686ca7e97c282bfcc19b5760b1;hp=9bbf5bcb027f10074066732c15ab4ab8985d38de;hpb=e957a0c9e7fde0668d33ce5e43e123a18aad07f7;p=xonotic%2Fdarkplaces.git diff --git a/vid_glx.c b/vid_glx.c index 9bbf5bcb..01d2486b 100644 --- a/vid_glx.c +++ b/vid_glx.c @@ -39,6 +39,9 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. #endif #include +// get the Uchar type +#include "utf8lib.h" + #include "nexuiz.xpm" #include "darkplaces.xpm" @@ -122,16 +125,57 @@ static Visual *vidx11_visual; static Colormap vidx11_colormap; /*-----------------------------------------------------------------------*/ +// + +long keysym2ucs(KeySym keysym); +void DP_Xutf8LookupString(XKeyEvent * ev, + Uchar *uch, + KeySym * keysym_return, + Status * status_return) +{ + int rc; + KeySym keysym; + int codepoint; + char buffer[64]; + int nbytes = sizeof(buffer); + + rc = XLookupString(ev, buffer, nbytes, &keysym, NULL); + + if (rc > 0) { + codepoint = buffer[0] & 0xFF; + } else { + codepoint = keysym2ucs(keysym); + } + + if (codepoint < 0) { + if (keysym == None) { + *status_return = XLookupNone; + } else { + *status_return = XLookupKeySym; + *keysym_return = keysym; + } + *uch = 0; + return; + } + + *uch = codepoint; -static int XLateKey(XKeyEvent *ev, char *ascii) + if (keysym != None) { + *keysym_return = keysym; + *status_return = XLookupBoth; + } else { + *status_return = XLookupChars; + } +} +static int XLateKey(XKeyEvent *ev, Uchar *ascii) { int key = 0; - char buf[64]; + //char buf[64]; KeySym keysym, shifted; + Status status; keysym = XLookupKeysym (ev, 0); - XLookupString(ev, buf, sizeof buf, &shifted, 0); - *ascii = buf[0]; + DP_Xutf8LookupString(ev, ascii, &shifted, &status); switch(keysym) { @@ -398,7 +442,7 @@ static void HandleEvents(void) { XEvent event; int key; - char ascii; + Uchar unicode; qboolean dowarp = false; if (!vidx11_display) @@ -412,14 +456,14 @@ static void HandleEvents(void) { case KeyPress: // key pressed - key = XLateKey (&event.xkey, &ascii); - Key_Event(key, ascii, true); + key = XLateKey (&event.xkey, &unicode); + Key_Event(key, unicode, true); break; case KeyRelease: // key released - key = XLateKey (&event.xkey, &ascii); - Key_Event(key, ascii, false); + key = XLateKey (&event.xkey, &unicode); + Key_Event(key, unicode, false); break; case MotionNotify: @@ -689,8 +733,8 @@ void InitSig(void) void VID_Finish (void) { - vid_usevsync = vid_vsync.integer && !cls.timedemo && gl_videosyncavailable; - if (vid_usingvsync != vid_usevsync && gl_videosyncavailable) + vid_usevsync = vid_vsync.integer && !cls.timedemo && qglXSwapIntervalSGI; + if (vid_usingvsync != vid_usevsync) { vid_usingvsync = vid_usevsync; if (qglXSwapIntervalSGI (vid_usevsync)) @@ -759,7 +803,7 @@ void VID_BuildGLXAttrib(int *attrib, qboolean stencil, qboolean stereobuffer, in *attrib++ = None; } -int VID_InitMode(int fullscreen, int *width, int *height, int bpp, int refreshrate, int stereobuffer, int samples) +qboolean VID_InitMode(viddef_mode_t *mode) { int i; int attrib[32]; @@ -834,7 +878,7 @@ int VID_InitMode(int fullscreen, int *width, int *height, int bpp, int refreshra return false; } - VID_BuildGLXAttrib(attrib, bpp == 32, stereobuffer, samples); + VID_BuildGLXAttrib(attrib, mode->bitsperpixel == 32, mode->stereobuffer, mode->samples); visinfo = qglXChooseVisual(vidx11_display, vidx11_screen, attrib); if (!visinfo) { @@ -842,7 +886,7 @@ int VID_InitMode(int fullscreen, int *width, int *height, int bpp, int refreshra return false; } - if (fullscreen) + if (mode->fullscreen) { if(vid_netwmfullscreen.integer) { @@ -872,11 +916,11 @@ int VID_InitMode(int fullscreen, int *width, int *height, int bpp, int refreshra for (i = 0; i < num_vidmodes; i++) { - if (*width > vidmodes[i]->hdisplay || *height > vidmodes[i]->vdisplay) + if (mode->width > vidmodes[i]->hdisplay || mode->height > vidmodes[i]->vdisplay) continue; - x = *width - vidmodes[i]->hdisplay; - y = *height - vidmodes[i]->vdisplay; + x = mode->width - vidmodes[i]->hdisplay; + y = mode->height - vidmodes[i]->vdisplay; dist = (x * x) + (y * y); if (best_fit == -1 || dist < best_dist) { @@ -890,8 +934,8 @@ int VID_InitMode(int fullscreen, int *width, int *height, int bpp, int refreshra // LordHavoc: changed from ActualWidth/ActualHeight =, // to width/height =, so the window will take the full area of // the mode chosen - *width = vidmodes[best_fit]->hdisplay; - *height = vidmodes[best_fit]->vdisplay; + mode->width = vidmodes[best_fit]->hdisplay; + mode->height = vidmodes[best_fit]->vdisplay; // change to the mode XF86VidModeSwitchToMode(vidx11_display, vidx11_screen, vidmodes[best_fit]); @@ -901,7 +945,7 @@ int VID_InitMode(int fullscreen, int *width, int *height, int bpp, int refreshra // Move the viewport to top left XF86VidModeSetViewPort(vidx11_display, vidx11_screen, 0, 0); - Con_DPrintf("Using XVidMode fullscreen mode at %dx%d\n", *width, *height); + Con_DPrintf("Using XVidMode fullscreen mode at %dx%d\n", mode->width, mode->height); } free(vidmodes); @@ -913,9 +957,9 @@ int VID_InitMode(int fullscreen, int *width, int *height, int bpp, int refreshra // use the full desktop resolution vid_isfullscreen = true; // width and height will be filled in later - *width = DisplayWidth(vidx11_display, vidx11_screen); - *height = DisplayHeight(vidx11_display, vidx11_screen); - Con_DPrintf("Using X11 fullscreen mode at %dx%d\n", *width, *height); + mode->width = DisplayWidth(vidx11_display, vidx11_screen); + mode->height = DisplayHeight(vidx11_display, vidx11_screen); + Con_DPrintf("Using X11 fullscreen mode at %dx%d\n", mode->width, mode->height); } } @@ -929,7 +973,7 @@ int VID_InitMode(int fullscreen, int *width, int *height, int bpp, int refreshra vidx11_colormap = attr.colormap = XCreateColormap(vidx11_display, root, visinfo->visual, AllocNone); attr.event_mask = X_MASK; - if (fullscreen) + if (mode->fullscreen) { if(vid_isnetwmfullscreen) { @@ -951,7 +995,7 @@ int VID_InitMode(int fullscreen, int *width, int *height, int bpp, int refreshra mask = CWBackPixel | CWBorderPixel | CWColormap | CWEventMask; } - win = XCreateWindow(vidx11_display, root, 0, 0, *width, *height, 0, visinfo->depth, InputOutput, visinfo->visual, mask, &attr); + win = XCreateWindow(vidx11_display, root, 0, 0, mode->width, mode->height, 0, visinfo->depth, InputOutput, visinfo->visual, mask, &attr); wmhints = XAllocWMHints(); if(XpmCreatePixmapFromData(vidx11_display, win, @@ -966,12 +1010,15 @@ int VID_InitMode(int fullscreen, int *width, int *height, int bpp, int refreshra szhints = XAllocSizeHints(); if(vid_resizable.integer == 0 && !vid_isnetwmfullscreen) { - szhints->min_width = szhints->max_width = *width; - szhints->min_height = szhints->max_height = *height; + szhints->min_width = szhints->max_width = mode->width; + szhints->min_height = szhints->max_height = mode->height; szhints->flags |= PMinSize | PMaxSize; } XmbSetWMProperties(vidx11_display, win, gamename, gamename, (char **) com_argv, com_argc, szhints, wmhints, clshints); + // strdup() allocates using malloc(), should be freed with free() + free(clshints->res_name); + free(clshints->res_class); XFree(clshints); XFree(wmhints); XFree(szhints); @@ -998,6 +1045,7 @@ int VID_InitMode(int fullscreen, int *width, int *height, int bpp, int refreshra //XSync(vidx11_display, False); ctx = qglXCreateContext(vidx11_display, visinfo, NULL, True); + XFree(visinfo); // glXChooseVisual man page says to use XFree to free visinfo if (!ctx) { Con_Printf ("glXCreateContext failed\n"); @@ -1022,8 +1070,6 @@ int VID_InitMode(int fullscreen, int *width, int *height, int bpp, int refreshra gl_platform = "GLX"; gl_platformextensions = qglXQueryExtensionsString(vidx11_display, vidx11_screen); - gl_videosyncavailable = false; - // COMMANDLINEOPTION: Linux GLX: -nogetprocaddress disables GLX_ARB_get_proc_address (not required, more formal method of getting extension functions) // COMMANDLINEOPTION: BSD GLX: -nogetprocaddress disables GLX_ARB_get_proc_address (not required, more formal method of getting extension functions) // COMMANDLINEOPTION: MacOSX GLX: -nogetprocaddress disables GLX_ARB_get_proc_address (not required, more formal method of getting extension functions) @@ -1031,7 +1077,7 @@ int VID_InitMode(int fullscreen, int *width, int *height, int bpp, int refreshra // COMMANDLINEOPTION: Linux GLX: -novideosync disables GLX_SGI_swap_control // COMMANDLINEOPTION: BSD GLX: -novideosync disables GLX_SGI_swap_control // COMMANDLINEOPTION: MacOSX GLX: -novideosync disables GLX_SGI_swap_control - gl_videosyncavailable = GL_CheckExtension("GLX_SGI_swap_control", swapcontrolfuncs, "-novideosync", false); + GL_CheckExtension("GLX_SGI_swap_control", swapcontrolfuncs, "-novideosync", false); vid_usingmousegrab = false; vid_usingmouse = false; @@ -1111,6 +1157,8 @@ size_t VID_ListModes(vid_mode_t *modes, size_t maxcount) ++k; } } + // manpage of XF86VidModeGetAllModeLines says it should be freed by the caller + XFree(vidmodes); return k; } return 0; // FIXME implement this