Improved pointer and keyboard handling under windowed mode

This commit is contained in:
Elias Naur 2002-11-20 10:33:37 +00:00
parent cd04bdf33b
commit f188a1400b
3 changed files with 102 additions and 21 deletions

View file

@ -50,6 +50,9 @@
extern Display *disp;
extern Window win;
extern int current_fullscreen;
int pointer_grabbed;
jfieldID fid_button;
jfieldID fid_dx;
@ -66,6 +69,8 @@ unsigned char buttons[NUM_BUTTONS];
Cursor blank_cursor;
extern int isFocused(void);
/*
* Class: org_lwjgl_input_Mouse
* Method: initIDs
@ -113,10 +118,42 @@ int blankCursor(void) {
XColor dummy_color;
blank_cursor = XCreatePixmapCursor(disp, mask, mask, &dummy_color, &dummy_color, 0, 0);
XFreePixmap(disp, mask);
XDefineCursor(disp, win, blank_cursor);
return 1;
}
int grabPointer(void) {
int result;
int mask = EnterWindowMask | LeaveWindowMask | PointerMotionMask | ButtonPressMask | ButtonReleaseMask;
if (current_fullscreen)
result = XGrabPointer(disp, win, False, mask, GrabModeAsync, GrabModeAsync, win, blank_cursor, CurrentTime);
else
result = XGrabPointer(disp, win, False, mask, GrabModeAsync, GrabModeAsync, None, blank_cursor, CurrentTime);
if (result == GrabSuccess)
pointer_grabbed = 1;
return result;
}
void ungrabPointer(void) {
pointer_grabbed = 0;
XUngrabPointer(disp, CurrentTime);
}
int updatePointerGrab(void) {
if (current_fullscreen) {
if (!pointer_grabbed)
return grabPointer();
} else {
if (isFocused()) {
if (!pointer_grabbed)
return grabPointer();
} else {
if (pointer_grabbed)
ungrabPointer();
}
}
return GrabSuccess;
}
/*
* Class: org_lwjgl_input_Mouse
* Method: nCreate
@ -126,19 +163,19 @@ JNIEXPORT jboolean JNICALL Java_org_lwjgl_input_Mouse_nCreate
(JNIEnv * env, jclass clazz)
{
int i;
current_x = current_y = current_z = last_x = last_y = last_z = 0;
current_x = current_y = current_z = last_x = last_y = last_z = pointer_grabbed = 0;
for (i = 0; i < NUM_BUTTONS; i++)
buttons[i] = 0;
if (!blankCursor()) {
#ifdef _DEBUG
printf("Could not blank cursor\n");
printf("Could create blank cursor\n");
#endif
return JNI_FALSE;
}
int result = XGrabPointer(disp, win, False, PointerMotionMask | ButtonPressMask | ButtonReleaseMask, GrabModeAsync, GrabModeAsync, win, None, CurrentTime);
if (result != GrabSuccess) {
if (updatePointerGrab() != GrabSuccess) {
#ifdef _DEBUG
printf("Could not grab mouse\n");
printf("Could not grab pointer\n");
#endif
return JNI_FALSE;
}
@ -172,14 +209,15 @@ JNIEXPORT jboolean JNICALL Java_org_lwjgl_input_Mouse_nHasZValue(JNIEnv *env, jc
JNIEXPORT void JNICALL Java_org_lwjgl_input_Mouse_nDestroy
(JNIEnv * env, jclass clazz)
{
XUndefineCursor(disp, win);
if (pointer_grabbed)
ungrabPointer();
XFreeCursor(disp, blank_cursor);
XUngrabPointer(disp, CurrentTime);
}
int checkPointer() {
XEvent event;
int count = 0;
updatePointerGrab();
while (XCheckMaskEvent(disp, ButtonPressMask | ButtonReleaseMask | PointerMotionMask, &event)) {
count++;
switch (event.type) {