diff --git a/src/java/org/lwjgl/input/Keyboard.java b/src/java/org/lwjgl/input/Keyboard.java index 0ff8f43f..ed85da0c 100644 --- a/src/java/org/lwjgl/input/Keyboard.java +++ b/src/java/org/lwjgl/input/Keyboard.java @@ -34,6 +34,7 @@ package org.lwjgl.input; import java.lang.reflect.Field; import java.lang.reflect.Modifier; import java.nio.ByteBuffer; +import java.nio.IntBuffer; import java.util.HashMap; import java.util.Map; @@ -198,6 +199,8 @@ public class Keyboard { /** Buffer size in events */ private final static int BUFFER_SIZE = 50; + /** Event size in elements */ + private final static int EVENT_SIZE = 3; /** Key names */ private static final String[] keyName = new String[255]; @@ -241,7 +244,7 @@ public class Keyboard { * followed by state. If translation is enabled, the state is followed by * a 2 byte java char representing the translated character. */ - private static ByteBuffer readBuffer; + private static IntBuffer readBuffer; /** True if translation is enabled */ private static boolean translationEnabled; @@ -351,10 +354,7 @@ public class Keyboard { private static void read() { readBuffer.compact(); int numEvents = nRead(readBuffer, readBuffer.position()); - if (translationEnabled) - readBuffer.position(readBuffer.position() + numEvents*4); - else - readBuffer.position(readBuffer.position() + numEvents*2); + readBuffer.position(readBuffer.position() + numEvents*EVENT_SIZE); readBuffer.flip(); } @@ -370,7 +370,7 @@ public class Keyboard { * Native method to read the keyboard buffer * @return the total number of events read. */ - private static native int nRead(ByteBuffer buffer, int buffer_position); + private static native int nRead(IntBuffer buffer, int buffer_position); /** * Enable keyboard translation. Must be called after the keyboard is created, @@ -396,7 +396,7 @@ public class Keyboard { public static void enableBuffer() throws LWJGLException { if (!created) throw new IllegalStateException("Keyboard must be created before you can enable buffering"); - readBuffer = BufferUtils.createByteBuffer(4*BUFFER_SIZE); + readBuffer = BufferUtils.createIntBuffer(EVENT_SIZE*BUFFER_SIZE); readBuffer.limit(0); nEnableBuffer(); } @@ -474,10 +474,7 @@ public class Keyboard { public static int getNumKeyboardEvents() { if (!created) throw new IllegalStateException("Keyboard must be created before you can read events"); - if (translationEnabled) - return readBuffer.remaining()/4; - else - return readBuffer.remaining()/2; + return readBuffer.remaining()/EVENT_SIZE; } /** @@ -500,9 +497,8 @@ public class Keyboard { if (readBuffer.hasRemaining()) { eventKey = readBuffer.get() & 0xFF; eventState = readBuffer.get() != 0; - if (translationEnabled) { - eventCharacter = readBuffer.getChar(); - } + int eventCharacterInt = readBuffer.get() & 0xFFFF; + eventCharacter = (char)eventCharacterInt; return true; } else { return false; diff --git a/src/java/org/lwjgl/input/Mouse.java b/src/java/org/lwjgl/input/Mouse.java index c875e571..33f4136d 100644 --- a/src/java/org/lwjgl/input/Mouse.java +++ b/src/java/org/lwjgl/input/Mouse.java @@ -127,16 +127,23 @@ public class Mouse { private static boolean initialized; /** The mouse button events from the last read */ - private static ByteBuffer readBuffer = null; + private static IntBuffer readBuffer = null; /** The current mouse event button being examined */ private static int eventButton; /** The current state of the button being examined in the event queue */ private static boolean eventState; + + /** The current delta of the mouse in the event queue */ + private static int event_dx; + private static int event_dy; + private static int event_dwheel; /** Buffer size in events */ private final static int BUFFER_SIZE = 50; + /** Event size in elements */ + private final static int EVENT_SIZE = 5; private static boolean isGrabbed; @@ -404,7 +411,7 @@ public class Mouse { private static void read() { readBuffer.compact(); int numEvents = nRead(readBuffer, readBuffer.position()); - readBuffer.position(readBuffer.position() + numEvents * 2); + readBuffer.position(readBuffer.position() + numEvents * EVENT_SIZE); readBuffer.flip(); } @@ -456,7 +463,7 @@ public class Mouse { */ public static void enableBuffer() throws LWJGLException { if (!created) throw new IllegalStateException("Mouse must be created before you can enable buffering"); - readBuffer = BufferUtils.createByteBuffer(2 * BUFFER_SIZE); + readBuffer = BufferUtils.createIntBuffer(EVENT_SIZE * BUFFER_SIZE); readBuffer.limit(0); nEnableBuffer(); } @@ -472,12 +479,13 @@ public class Mouse { * Native method to read the keyboard buffer * @return the total number of events read. */ - private static native int nRead(ByteBuffer buffer, int buffer_position); + private static native int nRead(IntBuffer buffer, int buffer_position); /** * Gets the next mouse event. You can query which button caused the event by using - * getEventButton(). To get the state of that key, for that event, use - * getEventButtonState. + * getEventButton() (if any). To get the state of that key, for that event, use + * getEventButtonState. To get the current mouse delta values use getEventDX(), + * getEventDY() and getEventDZ(). * @see org.lwjgl.input.Mouse#getEventButton() * @see org.lwjgl.input.Mouse#getEventButtonState() * @return true if a mouse event was read, false otherwise @@ -488,27 +496,55 @@ public class Mouse { throw new IllegalStateException("Event buffering must be enabled before you can read events"); if (readBuffer.hasRemaining()) { - eventButton = readBuffer.get() & 0xFF; + eventButton = readBuffer.get(); eventState = readBuffer.get() != 0; + event_dx = readBuffer.get(); + event_dy = readBuffer.get(); + event_dwheel = readBuffer.get(); return true; } else return false; } /** - * @return Current events button + * @return Current events button. Returns -1 if no button state was changed */ public static int getEventButton() { return eventButton; } /** - * @return Current events button state + * Get the current events button state. If getEventButton() is -1, + * and IllegalStateException is thrown. + * @return Current events button state. */ public static boolean getEventButtonState() { + if (eventButton == -1) + throw new IllegalStateException("Current event has no button state change"); return eventState; } + /** + * @return Current events delta x + */ + public static int getEventDX() { + return event_dx; + } + + /** + * @return Current events delta y + */ + public static int getEventDY() { + return event_dy; + } + + /** + * @return Current events delta z + */ + public static int getEventDWheel() { + return event_dwheel; + } + /** * Retrieves the absolute position. If the Display has been created * x will be clamped to 0...width-1. diff --git a/src/native/common/common_tools.c b/src/native/common/common_tools.c index 89b78c72..c460688e 100644 --- a/src/native/common/common_tools.c +++ b/src/native/common/common_tools.c @@ -37,6 +37,7 @@ * @version $Revision$ */ +#include #include #include "common_tools.h" @@ -86,13 +87,13 @@ void initEventQueue(event_queue_t *event_queue) { event_queue->list_end = 0; } -void putEventElement(event_queue_t *queue, unsigned char byte) { +void putEventElement(event_queue_t *queue, jint s) { int next_index = (queue->list_end + 1)%EVENT_BUFFER_SIZE; if (next_index == queue->list_start) { printfDebug("Event buffer overflow!\n"); return; } - queue->input_event_buffer[queue->list_end] = byte; + queue->input_event_buffer[queue->list_end] = s; queue->list_end = next_index; } @@ -100,16 +101,16 @@ static bool hasMoreEvents(event_queue_t *queue) { return queue->list_start != queue->list_end; } -static void copyEvent(event_queue_t *queue, unsigned char *output_event_buffer, int output_index, int event_size) { +static void copyEvent(event_queue_t *queue, jint *output_event_buffer, int output_index, int event_size) { int i; for (i = 0; i < event_size; i++) { output_event_buffer[output_index] = queue->input_event_buffer[queue->list_start]; - incListStart(queue); + incListStart(queue); output_index++; } } -int copyEvents(event_queue_t *event_queue, unsigned char *output_event_buffer, int buffer_size, int event_size) { +int copyEvents(event_queue_t *event_queue, jint *output_event_buffer, int buffer_size, int event_size) { int num_events = 0; int index = 0; while (index + event_size <= buffer_size && hasMoreEvents(event_queue)) { diff --git a/src/native/common/common_tools.h b/src/native/common/common_tools.h index ff4f1142..6c9e0f79 100644 --- a/src/native/common/common_tools.h +++ b/src/native/common/common_tools.h @@ -51,7 +51,7 @@ extern JavaVM *jvm; #define ATTRIB_LIST_SIZE (256) typedef struct { - unsigned char input_event_buffer[EVENT_BUFFER_SIZE]; + jint input_event_buffer[EVENT_BUFFER_SIZE]; int list_start; int list_end; @@ -125,9 +125,8 @@ extern void putAttrib(attrib_list_t *list, int attrib); extern bool isDebugEnabled(void); extern jstring getVersionString(JNIEnv *env); extern void initEventQueue(event_queue_t *event_queue); -extern int copyEvents(event_queue_t *event_queue, unsigned char *output_event_buffer, int buffer_size, int event_size); -extern void putEventElement(event_queue_t *queue, unsigned char byte); -extern unsigned char *getOutputList(event_queue_t *queue); +extern int copyEvents(event_queue_t *event_queue, jint *output_event_buffer, int buffer_size, int event_size); +extern void putEventElement(event_queue_t *queue, jint byte); extern void throwException(JNIEnv *env, const char *msg); extern void throwOpenALException(JNIEnv * env, const char * err); extern void throwFMODException(JNIEnv * env, const char * err); diff --git a/src/native/linux/org_lwjgl_input_Keyboard.c b/src/native/linux/org_lwjgl_input_Keyboard.c index dfc204ad..cb6219e7 100644 --- a/src/native/linux/org_lwjgl_input_Keyboard.c +++ b/src/native/linux/org_lwjgl_input_Keyboard.c @@ -141,10 +141,10 @@ static unsigned char getKeycode(XKeyEvent *event) { static int translateEvent(XKeyEvent *event) { static char temp_translation_buffer[KEYBOARD_BUFFER_SIZE]; static XComposeStatus status; - int num_chars, i; + int num_chars, i; + jint ch; - if (event->type == KeyRelease) { - putEventElement(&event_queue, 0); + if (!translation_enabled || event->type == KeyRelease) { putEventElement(&event_queue, 0); return 0; } @@ -152,17 +152,16 @@ static int translateEvent(XKeyEvent *event) { if (num_chars > 0) { num_chars--; /* Assume little endian byte order */ - putEventElement(&event_queue, temp_translation_buffer[0]); - putEventElement(&event_queue, 0); + ch = (jint)temp_translation_buffer[0] & 0xFF; + putEventElement(&event_queue, ch); for (i = 0; i < num_chars; i++) { putEventElement(&event_queue, 0); putEventElement(&event_queue, 0); - putEventElement(&event_queue, temp_translation_buffer[i + 1]); - putEventElement(&event_queue, 0); + ch = ((jint)temp_translation_buffer[i + 1]) & 0xFF; + putEventElement(&event_queue, ch); } } else { putEventElement(&event_queue, 0); - putEventElement(&event_queue, 0); } return num_chars; } @@ -182,8 +181,7 @@ static void bufferEvent(XKeyEvent *key_event) { //printf("Reading a key %d %d count %d\n", (int)keycode, (int)state, num_events); putEventElement(&event_queue, keycode); putEventElement(&event_queue, state); - if (translation_enabled) - translateEvent(key_event); + translateEvent(key_event); } void handleKeyEvent(XKeyEvent *event) { @@ -201,14 +199,10 @@ JNIEXPORT void JNICALL Java_org_lwjgl_input_Keyboard_nPoll(JNIEnv * env, jclass } JNIEXPORT int JNICALL Java_org_lwjgl_input_Keyboard_nRead(JNIEnv * env, jclass clazz, jobject buffer, jint buffer_position) { - int event_size; + int event_size = 3; handleMessages(); - if (translation_enabled) - event_size = 4; - else - event_size = 2; - unsigned char* buffer_ptr = (unsigned char *)(*env)->GetDirectBufferAddress(env, buffer); - int buffer_size = (*env)->GetDirectBufferCapacity(env, buffer) - buffer_position; + jint* buffer_ptr = (jint *)(*env)->GetDirectBufferAddress(env, buffer); + int buffer_size = ((*env)->GetDirectBufferCapacity(env, buffer))/sizeof(jint) - buffer_position; return copyEvents(&event_queue, buffer_ptr + buffer_position, buffer_size, event_size); } diff --git a/src/native/linux/org_lwjgl_input_Mouse.c b/src/native/linux/org_lwjgl_input_Mouse.c index 81182ca1..f9b83f80 100644 --- a/src/native/linux/org_lwjgl_input_Mouse.c +++ b/src/native/linux/org_lwjgl_input_Mouse.c @@ -73,13 +73,26 @@ static bool buffer_enabled; static Cursor blank_cursor; static Cursor current_cursor; +static void putEvent(jint button, jint state, jint dx, jint dy, jint dz) { + if (buffer_enabled) { + putEventElement(&event_queue, button); + putEventElement(&event_queue, state); + putEventElement(&event_queue, dx); + putEventElement(&event_queue, dy); + putEventElement(&event_queue, dz); + } +} + static void setCursorPos(int x, int y) { int current_x = x; int current_y = y; - dx += current_x - last_x; - dy += current_y - last_y; + jint event_dx = current_x - last_x; + jint event_dy = current_y - last_y; + dx += event_dx; + dy += event_dy; last_x = current_x; last_y = current_y; + putEvent(-1, 0, event_dx, -event_dy, 0); } static int transformY(int y) { @@ -275,22 +288,24 @@ static void handleButton(XButtonEvent *event, unsigned char state) { if (button_num == NUM_BUTTONS) return; buttons[button_num] = state; - if (buffer_enabled) { - putEventElement(&event_queue, button_num); - putEventElement(&event_queue, state); - } + putEvent(button_num, state, 0, 0, 0); } void handleButtonPress(XButtonEvent *event) { + jint delta = 0; switch (event->button) { case Button4: - dz += WHEEL_SCALE; + delta = WHEEL_SCALE; + putEvent(-1, 0, 0, 0, delta); break; case Button5: - dz -= WHEEL_SCALE; + delta = -WHEEL_SCALE; + putEvent(-1, 0, 0, 0, delta); + break; + default: break; - default: break; } + dz += delta; handleButton(event, 1); } @@ -364,10 +379,10 @@ JNIEXPORT void JNICALL Java_org_lwjgl_input_Mouse_nEnableBuffer(JNIEnv *env, jcl } JNIEXPORT jint JNICALL Java_org_lwjgl_input_Mouse_nRead(JNIEnv *env, jclass clazz, jobject buffer, jint buffer_position) { - unsigned char* buffer_ptr = (unsigned char *)(*env)->GetDirectBufferAddress(env, buffer); - int buffer_size = (*env)->GetDirectBufferCapacity(env, buffer) - buffer_position; + jint* buffer_ptr = (jint *)(*env)->GetDirectBufferAddress(env, buffer); + int buffer_size = ((*env)->GetDirectBufferCapacity(env, buffer))/sizeof(jint) - buffer_position; handleMessages(); - return copyEvents(&event_queue, buffer_ptr + buffer_position, buffer_size, 2); + return copyEvents(&event_queue, buffer_ptr + buffer_position, buffer_size, 5); } JNIEXPORT void JNICALL Java_org_lwjgl_input_Mouse_nGrabMouse(JNIEnv * env, jclass clazz, jboolean new_grab) {