diff --git a/src/native/linux/org_lwjgl_Display.c b/src/native/linux/org_lwjgl_Display.c index f354180c..10a304f6 100644 --- a/src/native/linux/org_lwjgl_Display.c +++ b/src/native/linux/org_lwjgl_Display.c @@ -102,10 +102,18 @@ JNIEXPORT jboolean JNICALL Java_org_lwjgl_Display_nCreate(JNIEnv * env, jclass c return JNI_FALSE; } screen = DefaultScreen(disp); + if (!getDisplayModes(disp, screen, &num_modes, &avail_modes)) { + XCloseDisplay(disp); +#ifdef _DEBUG + printf("Could not get display modes\n"); +#endif + return JNI_FALSE; + } root_win = RootWindow(disp, screen); vis_info = glXChooseVisual(disp, screen, attriblist); if (vis_info == NULL) { + XCloseDisplay(disp); #ifdef _DEBUG printf("Could not choose glx visual\n"); #endif @@ -129,18 +137,16 @@ JNIEXPORT jboolean JNICALL Java_org_lwjgl_Display_nCreate(JNIEnv * env, jclass c if (fullscreen) { XMapRaised(disp, win); waitMapped(disp, win); - if (!getDisplayModes(disp, screen, &num_modes, &avail_modes)) { -#ifdef _DEBUG - printf("Could not get display modes\n"); -#endif - return JNI_FALSE; - } for ( i = 0; i < num_modes; ++i ) { #ifdef _DEBUG printf("Mode %d: %dx%d\n", i, avail_modes[i]->hdisplay, avail_modes[i]->vdisplay); #endif if (avail_modes[i]->hdisplay == width && avail_modes[i]->vdisplay == height) { if (!XF86VidModeSwitchToMode(disp, screen, avail_modes[i])) { + XFree(vis_info); + XFree(avail_modes); + XDestroyWindow(disp, win); + XCloseDisplay(disp); #ifdef _DEBUG printf("Could not switch mode\n"); #endif @@ -167,8 +173,8 @@ JNIEXPORT void JNICALL Java_org_lwjgl_Display_nDestroy(JNIEnv * env, jclass claz printf("Could not switch mode\n"); #endif } - XFree(avail_modes); } + XFree(avail_modes); XFree(vis_info); XCloseDisplay(disp); #ifdef _DEBUG diff --git a/src/native/linux/org_lwjgl_input_Mouse.c b/src/native/linux/org_lwjgl_input_Mouse.c index 0e90dcbd..6fa079a3 100644 --- a/src/native/linux/org_lwjgl_input_Mouse.c +++ b/src/native/linux/org_lwjgl_input_Mouse.c @@ -62,6 +62,8 @@ int current_x; int current_y; unsigned char buttons[NUM_BUTTONS]; +Cursor blank_cursor; + /* * Class: org_lwjgl_input_Mouse * Method: initIDs @@ -92,6 +94,27 @@ JNIEXPORT void JNICALL Java_org_lwjgl_input_Mouse_initIDs } } +int blankCursor(void) { + int best_width, best_height; + if (XQueryBestCursor(disp, win, 1, 1, &best_width, &best_height) == 0) { +#ifdef _DEBUG + printf("Could not query best cursor size\n"); +#endif + return 0; + } + Pixmap mask = XCreatePixmap(disp, win, best_width, best_height, 1); + XGCValues gc_values; + gc_values.foreground = 0; + GC gc = XCreateGC(disp, mask, GCForeground, &gc_values); + XFillRectangle(disp, mask, gc, 0, 0, best_width, best_height); + XColor dummy_color; + blank_cursor = XCreatePixmapCursor(disp, mask, mask, &dummy_color, &dummy_color, 0, 0); + XFreePixmap(disp, mask); + XFreeGC(disp, gc); + XDefineCursor(disp, win, blank_cursor); + return 1; +} + /* * Class: org_lwjgl_input_Mouse * Method: nCreate @@ -104,6 +127,12 @@ JNIEXPORT jboolean JNICALL Java_org_lwjgl_input_Mouse_nCreate current_x = current_y = last_x = last_y = 0; for (i = 0; i < NUM_BUTTONS; i++) buttons[i] = 0; + if (!blankCursor()) { +#ifdef _DEBUG + printf("Could not blank cursor\n"); +#endif + return JNI_FALSE; + } int result = XGrabPointer(disp, win, False, PointerMotionMask | ButtonPressMask | ButtonReleaseMask, GrabModeAsync, GrabModeAsync, win, None, CurrentTime); if (result != GrabSuccess) { #ifdef _DEBUG @@ -122,6 +151,8 @@ JNIEXPORT jboolean JNICALL Java_org_lwjgl_input_Mouse_nCreate JNIEXPORT void JNICALL Java_org_lwjgl_input_Mouse_nDestroy (JNIEnv * env, jclass clazz) { + XUndefineCursor(disp, win); + XFreeCursor(disp, blank_cursor); XUngrabPointer(disp, CurrentTime); }