Don't fail create if grab doesn't succeed on the first try

This commit is contained in:
Elias Naur 2003-02-14 11:23:01 +00:00
parent eeef8c62ed
commit 55ac8dd74c
4 changed files with 57 additions and 41 deletions

View File

@ -84,7 +84,7 @@ struct pixelformat {
int stencil; int stencil;
}; };
int fillFormat(struct pixelformat *formats, int index, int bpp, int depth, int alpha, int stencil) { static int fillFormat(struct pixelformat *formats, int index, int bpp, int depth, int alpha, int stencil) {
for (int i = 0; i < index; i++) for (int i = 0; i < index; i++)
if (formats[i].bpp == bpp && if (formats[i].bpp == bpp &&
formats[i].depth == depth && formats[i].depth == depth &&
@ -98,7 +98,7 @@ int fillFormat(struct pixelformat *formats, int index, int bpp, int depth, int a
return 1; return 1;
} }
struct pixelformat *getGLXAvailablePixelFormats(Display *disp, int screen, int *length) { static struct pixelformat *getGLXAvailablePixelFormats(Display *disp, int screen, int *length) {
if (extgl_Extensions.glx.GLX13 == 1) { if (extgl_Extensions.glx.GLX13 == 1) {
int num_formats; int num_formats;
int attriblist[] = {GLX_DOUBLEBUFFER, True, int attriblist[] = {GLX_DOUBLEBUFFER, True,
@ -148,7 +148,7 @@ struct pixelformat *getGLXAvailablePixelFormats(Display *disp, int screen, int *
return NULL; return NULL;
} }
XVisualInfo *chooseVisual(Display *disp, int screen, int bpp, int depth, int alpha, int stencil) { static XVisualInfo *chooseVisual(Display *disp, int screen, int bpp, int depth, int alpha, int stencil) {
int bpe; int bpe;
switch (bpp) { switch (bpp) {
case 32: case 32:
@ -174,7 +174,7 @@ XVisualInfo *chooseVisual(Display *disp, int screen, int bpp, int depth, int alp
return glXChooseVisual(disp, screen, attriblist); return glXChooseVisual(disp, screen, attriblist);
} }
struct pixelformat *getAvailablePixelFormats(Display *disp, int screen, int *length) { static struct pixelformat *getAvailablePixelFormats(Display *disp, int screen, int *length) {
struct pixelformat *formats = getGLXAvailablePixelFormats(disp, screen, length); struct pixelformat *formats = getGLXAvailablePixelFormats(disp, screen, length);
if (formats != NULL) if (formats != NULL)
return formats; return formats;
@ -195,7 +195,7 @@ struct pixelformat *getAvailablePixelFormats(Display *disp, int screen, int *len
return formats; return formats;
} }
void waitMapped(Display *disp, Window win) { static void waitMapped(Display *disp, Window win) {
XEvent event; XEvent event;
do { do {
@ -250,7 +250,7 @@ void handleMessages(void) {
} }
} }
bool loadGL(Display *disp, int screen) { static bool loadGL(Display *disp, int screen) {
if (gl_loaded == true) if (gl_loaded == true)
return true; return true;
if (extgl_Open(disp, screen) != 0) { if (extgl_Open(disp, screen) != 0) {
@ -263,12 +263,12 @@ bool loadGL(Display *disp, int screen) {
return true; return true;
} }
void closeGL(void) { static void closeGL(void) {
gl_loaded = false; gl_loaded = false;
extgl_Close(); extgl_Close();
} }
int getDisplayModes(Display *disp, int screen, int *num_modes, XF86VidModeModeInfo ***avail_modes) { static int getDisplayModes(Display *disp, int screen, int *num_modes, XF86VidModeModeInfo ***avail_modes) {
int event_base, error_base, xvid_ver, xvid_rev; int event_base, error_base, xvid_ver, xvid_rev;
if (!XF86VidModeQueryExtension(disp, &event_base, &error_base)) { if (!XF86VidModeQueryExtension(disp, &event_base, &error_base)) {
@ -285,7 +285,7 @@ int getDisplayModes(Display *disp, int screen, int *num_modes, XF86VidModeModeIn
return 1; return 1;
} }
bool isMinimized() { static bool isMinimized() {
handleMessages(); handleMessages();
return current_minimized; return current_minimized;
} }

View File

@ -63,6 +63,7 @@ static bool keyboard_grabbed;
static bool buffer_enabled; static bool buffer_enabled;
static bool translation_enabled; static bool translation_enabled;
static bool created = false; static bool created = false;
static bool should_grab = false;
extern Display *disp; extern Display *disp;
extern Window win; extern Window win;
@ -88,14 +89,14 @@ JNIEXPORT void JNICALL Java_org_lwjgl_input_Keyboard_initIDs
fid_readBuffer = env->GetStaticFieldID(clazz, "readBuffer", "Ljava/nio/ByteBuffer;"); fid_readBuffer = env->GetStaticFieldID(clazz, "readBuffer", "Ljava/nio/ByteBuffer;");
} }
int grabKeyboard(void) { static int grabKeyboard(void) {
int result = XGrabKeyboard(disp, win, False, GrabModeAsync, GrabModeAsync, CurrentTime); int result = XGrabKeyboard(disp, win, False, GrabModeAsync, GrabModeAsync, CurrentTime);
if (result == GrabSuccess) if (result == GrabSuccess)
keyboard_grabbed = true; keyboard_grabbed = true;
return result; return result;
} }
void ungrabKeyboard(void) { static void ungrabKeyboard(void) {
keyboard_grabbed = false; keyboard_grabbed = false;
XUngrabKeyboard(disp, CurrentTime); XUngrabKeyboard(disp, CurrentTime);
} }
@ -103,13 +104,23 @@ void ungrabKeyboard(void) {
void acquireKeyboard(void) { void acquireKeyboard(void) {
if (!created) if (!created)
return; return;
grabKeyboard(); should_grab = true;
} }
void releaseKeyboard(void) { void releaseKeyboard(void) {
if (!created) if (!created)
return; return;
ungrabKeyboard(); should_grab = false;
}
static void updateGrab(void) {
if (should_grab) {
if (!keyboard_grabbed)
grabKeyboard();
} else {
if (keyboard_grabbed)
ungrabKeyboard();
}
} }
/* /*
@ -123,13 +134,8 @@ JNIEXPORT jboolean JNICALL Java_org_lwjgl_input_Keyboard_nCreate
keyboard_grabbed = false; keyboard_grabbed = false;
translation_enabled = false; translation_enabled = false;
buffer_enabled = false; buffer_enabled = false;
should_grab = true;
if (grabKeyboard() != GrabSuccess) { updateGrab();
#ifdef _DEBUG
printf("Could not grab keyboard\n");
#endif
return JNI_FALSE;
}
for (int i = 0; i < KEYBOARD_SIZE; i++) for (int i = 0; i < KEYBOARD_SIZE; i++)
key_map[i] = i; key_map[i] = i;
key_map[0x6b] = 0xdb; // Left doze key key_map[0x6b] = 0xdb; // Left doze key
@ -169,7 +175,7 @@ JNIEXPORT void JNICALL Java_org_lwjgl_input_Keyboard_nDestroy
created = false; created = false;
} }
XKeyEvent *nextEventElement(void) { static XKeyEvent *nextEventElement(void) {
if (list_start == list_end) if (list_start == list_end)
return NULL; return NULL;
XKeyEvent *result = &(saved_key_events[list_start]); XKeyEvent *result = &(saved_key_events[list_start]);
@ -177,7 +183,7 @@ XKeyEvent *nextEventElement(void) {
return result; return result;
} }
void putEventElement(XKeyEvent *event) { static void putEventElement(XKeyEvent *event) {
int next_index = (list_end + 1)%KEY_EVENT_BACKLOG; int next_index = (list_end + 1)%KEY_EVENT_BACKLOG;
if (next_index == list_start) if (next_index == list_start)
return; return;
@ -185,13 +191,13 @@ void putEventElement(XKeyEvent *event) {
list_end = next_index; list_end = next_index;
} }
unsigned char getKeycode(XKeyEvent *event) { static unsigned char getKeycode(XKeyEvent *event) {
unsigned char keycode = (unsigned char)((event->keycode - 8) & 0xff); unsigned char keycode = (unsigned char)((event->keycode - 8) & 0xff);
keycode = key_map[keycode]; keycode = key_map[keycode];
return keycode; return keycode;
} }
int translateEvent(int *position, XKeyEvent *event) { static int translateEvent(int *position, XKeyEvent *event) {
static char temp_translation_buffer[KEYBOARD_BUFFER_SIZE]; static char temp_translation_buffer[KEYBOARD_BUFFER_SIZE];
static XComposeStatus status; static XComposeStatus status;
int num_chars, i; int num_chars, i;
@ -222,7 +228,7 @@ int translateEvent(int *position, XKeyEvent *event) {
return num_chars; return num_chars;
} }
unsigned char eventState(XKeyEvent *event) { static unsigned char eventState(XKeyEvent *event) {
if (event->type == KeyPress) { if (event->type == KeyPress) {
return 1; return 1;
} else if (event->type == KeyRelease) { } else if (event->type == KeyRelease) {
@ -262,7 +268,7 @@ JNIEXPORT void JNICALL Java_org_lwjgl_input_Keyboard_nPoll
unsigned char state; unsigned char state;
handleMessages(); handleMessages();
updateGrab();
memcpy((unsigned char*)buf, key_buf, KEYBOARD_SIZE*sizeof(unsigned char)); memcpy((unsigned char*)buf, key_buf, KEYBOARD_SIZE*sizeof(unsigned char));
} }
@ -281,7 +287,7 @@ JNIEXPORT int JNICALL Java_org_lwjgl_input_Keyboard_nRead
int num_events = 0; int num_events = 0;
handleMessages(); handleMessages();
updateGrab();
while (buf_count < KEYBOARD_BUFFER_SIZE * 2 && (key_event = nextEventElement()) != NULL) { while (buf_count < KEYBOARD_BUFFER_SIZE * 2 && (key_event = nextEventElement()) != NULL) {
num_events++; num_events++;
unsigned char keycode = getKeycode(key_event); unsigned char keycode = getKeycode(key_event);

View File

@ -61,6 +61,7 @@ extern void handleMessages(void);
static bool pointer_grabbed; static bool pointer_grabbed;
static bool created = false; static bool created = false;
static bool should_grab = false;
static jfieldID fid_has_wheel = NULL; static jfieldID fid_has_wheel = NULL;
static jfieldID fid_button_count = NULL; static jfieldID fid_button_count = NULL;
@ -101,7 +102,7 @@ JNIEXPORT void JNICALL Java_org_lwjgl_input_Mouse_initIDs
fid_dwheel = env->GetStaticFieldID(clazz, "dwheel", "I"); fid_dwheel = env->GetStaticFieldID(clazz, "dwheel", "I");
} }
int blankCursor(void) { static int blankCursor(void) {
unsigned int best_width, best_height; unsigned int best_width, best_height;
if (XQueryBestCursor(disp, win, 1, 1, &best_width, &best_height) == 0) { if (XQueryBestCursor(disp, win, 1, 1, &best_width, &best_height) == 0) {
#ifdef _DEBUG #ifdef _DEBUG
@ -121,7 +122,7 @@ int blankCursor(void) {
return 1; return 1;
} }
int grabPointer(void) { static int grabPointer(void) {
int result; int result;
int mask = FocusChangeMask | PointerMotionMask | ButtonPressMask | ButtonReleaseMask; int mask = FocusChangeMask | PointerMotionMask | ButtonPressMask | ButtonReleaseMask;
result = XGrabPointer(disp, win, False, mask, GrabModeAsync, GrabModeAsync, win, blank_cursor, CurrentTime); result = XGrabPointer(disp, win, False, mask, GrabModeAsync, GrabModeAsync, win, blank_cursor, CurrentTime);
@ -132,7 +133,7 @@ int grabPointer(void) {
return result; return result;
} }
void ungrabPointer(void) { static void ungrabPointer(void) {
pointer_grabbed = false; pointer_grabbed = false;
XUngrabPointer(disp, CurrentTime); XUngrabPointer(disp, CurrentTime);
} }
@ -140,13 +141,24 @@ void ungrabPointer(void) {
void acquirePointer(void) { void acquirePointer(void) {
if (!created) if (!created)
return; return;
grabPointer(); should_grab = true;
} }
void releasePointer(void) { void releasePointer(void) {
if (!created) if (!created)
return; return;
ungrabPointer(); should_grab = false;
}
static void updateGrab(void) {
if (should_grab) {
if (!pointer_grabbed)
grabPointer();
} else {
if (pointer_grabbed)
ungrabPointer();
}
} }
/* /*
@ -169,16 +181,12 @@ JNIEXPORT jboolean JNICALL Java_org_lwjgl_input_Mouse_nCreate
if (!blankCursor()) { if (!blankCursor()) {
#ifdef _DEBUG #ifdef _DEBUG
printf("Could create blank cursor\n"); printf("Could create blank cursor\n");
#endif
return JNI_FALSE;
}
if (grabPointer() != GrabSuccess) {
#ifdef _DEBUG
printf("Could not grab pointer\n");
#endif #endif
return JNI_FALSE; return JNI_FALSE;
} }
created = true; created = true;
should_grab = true;
updateGrab();
return JNI_TRUE; return JNI_TRUE;
} }
@ -194,6 +202,7 @@ JNIEXPORT void JNICALL Java_org_lwjgl_input_Mouse_nDestroy
ungrabPointer(); ungrabPointer();
XFreeCursor(disp, blank_cursor); XFreeCursor(disp, blank_cursor);
created = false; created = false;
should_grab = false;
} }
void handleButtonPress(XButtonEvent *event) { void handleButtonPress(XButtonEvent *event) {
@ -240,7 +249,7 @@ void handlePointerMotion(XMotionEvent *event) {
current_y = event->y; current_y = event->y;
} }
void warpPointer(void) { static void warpPointer(void) {
int i; int i;
if (!pointer_grabbed) if (!pointer_grabbed)
return; return;
@ -279,6 +288,7 @@ JNIEXPORT void JNICALL Java_org_lwjgl_input_Mouse_nPoll
(JNIEnv * env, jclass clazz) (JNIEnv * env, jclass clazz)
{ {
handleMessages(); handleMessages();
updateGrab();
int moved_x = current_x - last_x; int moved_x = current_x - last_x;
int moved_y = current_y - last_y; int moved_y = current_y - last_y;
int moved_z = current_z - last_z; int moved_z = current_z - last_z;

View File

@ -49,11 +49,11 @@ extern Display * disp;
extern void handleMessages(); extern void handleMessages();
void makeCurrent(void) { static void makeCurrent(void) {
glXMakeCurrent(disp, win, context); glXMakeCurrent(disp, win, context);
} }
void releaseContext(void) { static void releaseContext(void) {
glXMakeCurrent(disp, None, NULL); glXMakeCurrent(disp, None, NULL);
} }