Add delta values to Mouse events

This commit is contained in:
Elias Naur 2004-09-22 11:08:21 +00:00
parent 0d013c7f54
commit fa1713c4e8
6 changed files with 102 additions and 61 deletions

View File

@ -34,6 +34,7 @@ package org.lwjgl.input;
import java.lang.reflect.Field; import java.lang.reflect.Field;
import java.lang.reflect.Modifier; import java.lang.reflect.Modifier;
import java.nio.ByteBuffer; import java.nio.ByteBuffer;
import java.nio.IntBuffer;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
@ -198,6 +199,8 @@ public class Keyboard {
/** Buffer size in events */ /** Buffer size in events */
private final static int BUFFER_SIZE = 50; private final static int BUFFER_SIZE = 50;
/** Event size in elements */
private final static int EVENT_SIZE = 3;
/** Key names */ /** Key names */
private static final String[] keyName = new String[255]; 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 * followed by state. If translation is enabled, the state is followed by
* a 2 byte java char representing the translated character. * a 2 byte java char representing the translated character.
*/ */
private static ByteBuffer readBuffer; private static IntBuffer readBuffer;
/** True if translation is enabled */ /** True if translation is enabled */
private static boolean translationEnabled; private static boolean translationEnabled;
@ -351,10 +354,7 @@ public class Keyboard {
private static void read() { private static void read() {
readBuffer.compact(); readBuffer.compact();
int numEvents = nRead(readBuffer, readBuffer.position()); int numEvents = nRead(readBuffer, readBuffer.position());
if (translationEnabled) readBuffer.position(readBuffer.position() + numEvents*EVENT_SIZE);
readBuffer.position(readBuffer.position() + numEvents*4);
else
readBuffer.position(readBuffer.position() + numEvents*2);
readBuffer.flip(); readBuffer.flip();
} }
@ -370,7 +370,7 @@ public class Keyboard {
* Native method to read the keyboard buffer * Native method to read the keyboard buffer
* @return the total number of events read. * @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, * Enable keyboard translation. Must be called after the keyboard is created,
@ -396,7 +396,7 @@ public class Keyboard {
public static void enableBuffer() throws LWJGLException { public static void enableBuffer() throws LWJGLException {
if (!created) if (!created)
throw new IllegalStateException("Keyboard must be created before you can enable buffering"); 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); readBuffer.limit(0);
nEnableBuffer(); nEnableBuffer();
} }
@ -474,10 +474,7 @@ public class Keyboard {
public static int getNumKeyboardEvents() { public static int getNumKeyboardEvents() {
if (!created) if (!created)
throw new IllegalStateException("Keyboard must be created before you can read events"); throw new IllegalStateException("Keyboard must be created before you can read events");
if (translationEnabled) return readBuffer.remaining()/EVENT_SIZE;
return readBuffer.remaining()/4;
else
return readBuffer.remaining()/2;
} }
/** /**
@ -500,9 +497,8 @@ public class Keyboard {
if (readBuffer.hasRemaining()) { if (readBuffer.hasRemaining()) {
eventKey = readBuffer.get() & 0xFF; eventKey = readBuffer.get() & 0xFF;
eventState = readBuffer.get() != 0; eventState = readBuffer.get() != 0;
if (translationEnabled) { int eventCharacterInt = readBuffer.get() & 0xFFFF;
eventCharacter = readBuffer.getChar(); eventCharacter = (char)eventCharacterInt;
}
return true; return true;
} else { } else {
return false; return false;

View File

@ -127,7 +127,7 @@ public class Mouse {
private static boolean initialized; private static boolean initialized;
/** The mouse button events from the last read */ /** 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 */ /** The current mouse event button being examined */
private static int eventButton; private static int eventButton;
@ -135,8 +135,15 @@ public class Mouse {
/** The current state of the button being examined in the event queue */ /** The current state of the button being examined in the event queue */
private static boolean eventState; 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 */ /** Buffer size in events */
private final static int BUFFER_SIZE = 50; private final static int BUFFER_SIZE = 50;
/** Event size in elements */
private final static int EVENT_SIZE = 5;
private static boolean isGrabbed; private static boolean isGrabbed;
@ -404,7 +411,7 @@ public class Mouse {
private static void read() { private static void read() {
readBuffer.compact(); readBuffer.compact();
int numEvents = nRead(readBuffer, readBuffer.position()); int numEvents = nRead(readBuffer, readBuffer.position());
readBuffer.position(readBuffer.position() + numEvents * 2); readBuffer.position(readBuffer.position() + numEvents * EVENT_SIZE);
readBuffer.flip(); readBuffer.flip();
} }
@ -456,7 +463,7 @@ public class Mouse {
*/ */
public static void enableBuffer() throws LWJGLException { public static void enableBuffer() throws LWJGLException {
if (!created) throw new IllegalStateException("Mouse must be created before you can enable buffering"); 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); readBuffer.limit(0);
nEnableBuffer(); nEnableBuffer();
} }
@ -472,12 +479,13 @@ public class Mouse {
* Native method to read the keyboard buffer * Native method to read the keyboard buffer
* @return the total number of events read. * @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 * Gets the next mouse event. You can query which button caused the event by using
* <code>getEventButton()</code>. To get the state of that key, for that event, use * <code>getEventButton()</code> (if any). To get the state of that key, for that event, use
* <code>getEventButtonState</code>. * <code>getEventButtonState</code>. To get the current mouse delta values use <code>getEventDX()</code>,
* <code>getEventDY()</code> and <code>getEventDZ()</code>.
* @see org.lwjgl.input.Mouse#getEventButton() * @see org.lwjgl.input.Mouse#getEventButton()
* @see org.lwjgl.input.Mouse#getEventButtonState() * @see org.lwjgl.input.Mouse#getEventButtonState()
* @return true if a mouse event was read, false otherwise * @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"); throw new IllegalStateException("Event buffering must be enabled before you can read events");
if (readBuffer.hasRemaining()) { if (readBuffer.hasRemaining()) {
eventButton = readBuffer.get() & 0xFF; eventButton = readBuffer.get();
eventState = readBuffer.get() != 0; eventState = readBuffer.get() != 0;
event_dx = readBuffer.get();
event_dy = readBuffer.get();
event_dwheel = readBuffer.get();
return true; return true;
} else } else
return false; return false;
} }
/** /**
* @return Current events button * @return Current events button. Returns -1 if no button state was changed
*/ */
public static int getEventButton() { public static int getEventButton() {
return eventButton; return eventButton;
} }
/** /**
* @return Current events button state * Get the current events button state. If <code>getEventButton()</code> is -1,
* and IllegalStateException is thrown.
* @return Current events button state.
*/ */
public static boolean getEventButtonState() { public static boolean getEventButtonState() {
if (eventButton == -1)
throw new IllegalStateException("Current event has no button state change");
return eventState; 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 * Retrieves the absolute position. If the Display has been created
* x will be clamped to 0...width-1. * x will be clamped to 0...width-1.

View File

@ -37,6 +37,7 @@
* @version $Revision$ * @version $Revision$
*/ */
#include <jni.h>
#include <stdlib.h> #include <stdlib.h>
#include "common_tools.h" #include "common_tools.h"
@ -86,13 +87,13 @@ void initEventQueue(event_queue_t *event_queue) {
event_queue->list_end = 0; 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; int next_index = (queue->list_end + 1)%EVENT_BUFFER_SIZE;
if (next_index == queue->list_start) { if (next_index == queue->list_start) {
printfDebug("Event buffer overflow!\n"); printfDebug("Event buffer overflow!\n");
return; return;
} }
queue->input_event_buffer[queue->list_end] = byte; queue->input_event_buffer[queue->list_end] = s;
queue->list_end = next_index; queue->list_end = next_index;
} }
@ -100,7 +101,7 @@ static bool hasMoreEvents(event_queue_t *queue) {
return queue->list_start != queue->list_end; 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; int i;
for (i = 0; i < event_size; i++) { for (i = 0; i < event_size; i++) {
output_event_buffer[output_index] = queue->input_event_buffer[queue->list_start]; output_event_buffer[output_index] = queue->input_event_buffer[queue->list_start];
@ -109,7 +110,7 @@ static void copyEvent(event_queue_t *queue, unsigned char *output_event_buffer,
} }
} }
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 num_events = 0;
int index = 0; int index = 0;
while (index + event_size <= buffer_size && hasMoreEvents(event_queue)) { while (index + event_size <= buffer_size && hasMoreEvents(event_queue)) {

View File

@ -51,7 +51,7 @@ extern JavaVM *jvm;
#define ATTRIB_LIST_SIZE (256) #define ATTRIB_LIST_SIZE (256)
typedef struct { typedef struct {
unsigned char input_event_buffer[EVENT_BUFFER_SIZE]; jint input_event_buffer[EVENT_BUFFER_SIZE];
int list_start; int list_start;
int list_end; int list_end;
@ -125,9 +125,8 @@ extern void putAttrib(attrib_list_t *list, int attrib);
extern bool isDebugEnabled(void); extern bool isDebugEnabled(void);
extern jstring getVersionString(JNIEnv *env); extern jstring getVersionString(JNIEnv *env);
extern void initEventQueue(event_queue_t *event_queue); 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 int copyEvents(event_queue_t *event_queue, jint *output_event_buffer, int buffer_size, int event_size);
extern void putEventElement(event_queue_t *queue, unsigned char byte); extern void putEventElement(event_queue_t *queue, jint byte);
extern unsigned char *getOutputList(event_queue_t *queue);
extern void throwException(JNIEnv *env, const char *msg); extern void throwException(JNIEnv *env, const char *msg);
extern void throwOpenALException(JNIEnv * env, const char * err); extern void throwOpenALException(JNIEnv * env, const char * err);
extern void throwFMODException(JNIEnv * env, const char * err); extern void throwFMODException(JNIEnv * env, const char * err);

View File

@ -142,9 +142,9 @@ static int translateEvent(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;
jint ch;
if (event->type == KeyRelease) { if (!translation_enabled || event->type == KeyRelease) {
putEventElement(&event_queue, 0);
putEventElement(&event_queue, 0); putEventElement(&event_queue, 0);
return 0; return 0;
} }
@ -152,17 +152,16 @@ static int translateEvent(XKeyEvent *event) {
if (num_chars > 0) { if (num_chars > 0) {
num_chars--; num_chars--;
/* Assume little endian byte order */ /* Assume little endian byte order */
putEventElement(&event_queue, temp_translation_buffer[0]); ch = (jint)temp_translation_buffer[0] & 0xFF;
putEventElement(&event_queue, 0); putEventElement(&event_queue, ch);
for (i = 0; i < num_chars; i++) { for (i = 0; i < num_chars; i++) {
putEventElement(&event_queue, 0); putEventElement(&event_queue, 0);
putEventElement(&event_queue, 0); putEventElement(&event_queue, 0);
putEventElement(&event_queue, temp_translation_buffer[i + 1]); ch = ((jint)temp_translation_buffer[i + 1]) & 0xFF;
putEventElement(&event_queue, 0); putEventElement(&event_queue, ch);
} }
} else { } else {
putEventElement(&event_queue, 0); putEventElement(&event_queue, 0);
putEventElement(&event_queue, 0);
} }
return num_chars; return num_chars;
} }
@ -182,7 +181,6 @@ static void bufferEvent(XKeyEvent *key_event) {
//printf("Reading a key %d %d count %d\n", (int)keycode, (int)state, num_events); //printf("Reading a key %d %d count %d\n", (int)keycode, (int)state, num_events);
putEventElement(&event_queue, keycode); putEventElement(&event_queue, keycode);
putEventElement(&event_queue, state); putEventElement(&event_queue, state);
if (translation_enabled)
translateEvent(key_event); translateEvent(key_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) { 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(); handleMessages();
if (translation_enabled) jint* buffer_ptr = (jint *)(*env)->GetDirectBufferAddress(env, buffer);
event_size = 4; int buffer_size = ((*env)->GetDirectBufferCapacity(env, buffer))/sizeof(jint) - buffer_position;
else
event_size = 2;
unsigned char* buffer_ptr = (unsigned char *)(*env)->GetDirectBufferAddress(env, buffer);
int buffer_size = (*env)->GetDirectBufferCapacity(env, buffer) - buffer_position;
return copyEvents(&event_queue, buffer_ptr + buffer_position, buffer_size, event_size); return copyEvents(&event_queue, buffer_ptr + buffer_position, buffer_size, event_size);
} }

View File

@ -73,13 +73,26 @@ static bool buffer_enabled;
static Cursor blank_cursor; static Cursor blank_cursor;
static Cursor current_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) { static void setCursorPos(int x, int y) {
int current_x = x; int current_x = x;
int current_y = y; int current_y = y;
dx += current_x - last_x; jint event_dx = current_x - last_x;
dy += current_y - last_y; jint event_dy = current_y - last_y;
dx += event_dx;
dy += event_dy;
last_x = current_x; last_x = current_x;
last_y = current_y; last_y = current_y;
putEvent(-1, 0, event_dx, -event_dy, 0);
} }
static int transformY(int y) { static int transformY(int y) {
@ -275,22 +288,24 @@ static void handleButton(XButtonEvent *event, unsigned char state) {
if (button_num == NUM_BUTTONS) if (button_num == NUM_BUTTONS)
return; return;
buttons[button_num] = state; buttons[button_num] = state;
if (buffer_enabled) { putEvent(button_num, state, 0, 0, 0);
putEventElement(&event_queue, button_num);
putEventElement(&event_queue, state);
}
} }
void handleButtonPress(XButtonEvent *event) { void handleButtonPress(XButtonEvent *event) {
jint delta = 0;
switch (event->button) { switch (event->button) {
case Button4: case Button4:
dz += WHEEL_SCALE; delta = WHEEL_SCALE;
putEvent(-1, 0, 0, 0, delta);
break; break;
case Button5: case Button5:
dz -= WHEEL_SCALE; delta = -WHEEL_SCALE;
putEvent(-1, 0, 0, 0, delta);
break;
default:
break; break;
default: break;
} }
dz += delta;
handleButton(event, 1); 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) { 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); jint* buffer_ptr = (jint *)(*env)->GetDirectBufferAddress(env, buffer);
int buffer_size = (*env)->GetDirectBufferCapacity(env, buffer) - buffer_position; int buffer_size = ((*env)->GetDirectBufferCapacity(env, buffer))/sizeof(jint) - buffer_position;
handleMessages(); 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) { JNIEXPORT void JNICALL Java_org_lwjgl_input_Mouse_nGrabMouse(JNIEnv * env, jclass clazz, jboolean new_grab) {