From a6bd8e7fa44b28a66a4c268aa066436ab4c7b507 Mon Sep 17 00:00:00 2001 From: Elias Naur Date: Sat, 11 Jan 2003 21:03:22 +0000 Subject: [PATCH] Fixed linux compile --- src/native/linux/Makefile.am | 3 +- ...ick.cpp => org_lwjgl_input_Controller.cpp} | 24 +-- src/native/linux/org_lwjgl_input_GamePad.cpp | 117 -------------- src/native/linux/org_lwjgl_input_Keyboard.cpp | 146 +++++++++++------- 4 files changed, 107 insertions(+), 183 deletions(-) rename src/native/linux/{org_lwjgl_input_Joystick.cpp => org_lwjgl_input_Controller.cpp} (74%) delete mode 100644 src/native/linux/org_lwjgl_input_GamePad.cpp diff --git a/src/native/linux/Makefile.am b/src/native/linux/Makefile.am index 2396f733..30a0bd5a 100644 --- a/src/native/linux/Makefile.am +++ b/src/native/linux/Makefile.am @@ -6,8 +6,7 @@ INCLUDES = -I../common NATIVE = \ org_lwjgl_Display.cpp \ org_lwjgl_Sys.cpp \ - org_lwjgl_input_GamePad.cpp \ - org_lwjgl_input_Joystick.cpp \ + org_lwjgl_input_Controller.cpp \ org_lwjgl_input_Keyboard.cpp \ org_lwjgl_input_Mouse.cpp \ org_lwjgl_opengl_BaseGL.cpp diff --git a/src/native/linux/org_lwjgl_input_Joystick.cpp b/src/native/linux/org_lwjgl_input_Controller.cpp similarity index 74% rename from src/native/linux/org_lwjgl_input_Joystick.cpp rename to src/native/linux/org_lwjgl_input_Controller.cpp index 1d3cb792..a51be2db 100644 --- a/src/native/linux/org_lwjgl_input_Joystick.cpp +++ b/src/native/linux/org_lwjgl_input_Controller.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2002 Light Weight Java Game Library Project + * Copyright (c) 2002 Lightweight Java Game Library Project * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -32,39 +32,39 @@ /** * $Id$ * - * Win32 analogue joystick handling. + * Win32 controller handling. * * @author Brian Matzon * @version $Revision$ */ - -#include "org_lwjgl_input_Joystick.h" +#include /** * Initializes any field ids */ -JNIEXPORT void JNICALL Java_org_lwjgl_input_Joystick_initIDs(JNIEnv * env, jclass clazz) { +JNIEXPORT void JNICALL Java_org_lwjgl_input_Controller_initIDs(JNIEnv * env, jclass clazz) { } /** - * Called when the Joystick instance is to be created + * Called when the Controller instance is to be created */ -JNIEXPORT jboolean JNICALL Java_org_lwjgl_input_Joystick_nCreate(JNIEnv *env, jclass clazz) { - return JNI_FALSE; +JNIEXPORT jboolean JNICALL Java_org_lwjgl_input_Controller_nCreate(JNIEnv *env, jclass clazz) { + return JNI_FALSE; } /* - * Class: org_lwjgl_input_Joystick + * Class: org_lwjgl_input_Controller * Method: nDestroy * Signature: ()V */ -JNIEXPORT void JNICALL Java_org_lwjgl_input_Joystick_nDestroy(JNIEnv *env, jclass clazz) { +JNIEXPORT void JNICALL Java_org_lwjgl_input_Controller_nDestroy(JNIEnv *env, jclass clazz) { } /* - * Class: org_lwjgl_input_Joystick + * Class: org_lwjgl_input_Controller * Method: nPoll * Signature: ()V */ -JNIEXPORT void JNICALL Java_org_lwjgl_input_Joystick_nPoll(JNIEnv * env, jclass clazz) { +JNIEXPORT void JNICALL Java_org_lwjgl_input_Controller_nPoll(JNIEnv * env, jclass clazz) { } + diff --git a/src/native/linux/org_lwjgl_input_GamePad.cpp b/src/native/linux/org_lwjgl_input_GamePad.cpp deleted file mode 100644 index 44bbd69b..00000000 --- a/src/native/linux/org_lwjgl_input_GamePad.cpp +++ /dev/null @@ -1,117 +0,0 @@ -/* - * Copyright (c) 2002 Light Weight Java Game Library Project - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are - * met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * * Neither the name of 'Light Weight Java Game Library' nor the names of - * its contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED - * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR - * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR - * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, - * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, - * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR - * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF - * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING - * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS - * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -/** - * $Id$ - * - * Win32 digital (Atari) joystick handling. These days it's a gamepad. - * - * @author cix_foo - * @version $Revision$ - */ - - -#include "org_lwjgl_input_GamePad.h" - -/* - * Class: org_lwjgl_input_GamePad - * Method: initIDs - * Signature: ()V - */ -JNIEXPORT void JNICALL Java_org_lwjgl_input_GamePad_initIDs - (JNIEnv * env, jclass clazz) {} - -/* - * Class: org_lwjgl_input_GamePad - * Method: nCreate - * Signature: ()Z - */ -JNIEXPORT jboolean JNICALL Java_org_lwjgl_input_GamePad_nCreate - (JNIEnv * env, jclass clazz) -{ - printf("GamePad not implemented yet!\n"); - return JNI_FALSE; -} - -/* - * Class: org_lwjgl_input_GamePad - * Method: nDestroy - * Signature: ()V - */ -JNIEXPORT void JNICALL Java_org_lwjgl_input_GamePad_nDestroy - (JNIEnv * env, jclass clazz) -{ -} - -/* - * Class: org_lwjgl_input_GamePad - * Method: nPoll - * Signature: (I)V - */ -JNIEXPORT void JNICALL Java_org_lwjgl_input_GamePad_nPoll - (JNIEnv * env, jclass clazz, jint buf) -{ -} - -/* - * Class: org_lwjgl_input_GamePad - * Method: nRead - * Signature: (I)I - */ -JNIEXPORT jint JNICALL Java_org_lwjgl_input_GamePad_nRead - (JNIEnv * env, jclass clazz, jint buf) -{ - return 0; -} - -/* - * Class: org_lwjgl_input_GamePad - * Method: nEnableBuffer - * Signature: ()I - */ -JNIEXPORT jint JNICALL Java_org_lwjgl_input_GamePad_nEnableBuffer - (JNIEnv * env, jclass clazz) -{ - return 0; -} - -/* - * Class: org_lwjgl_input_GamePad - * Method: nGetNumButtons - * Signature: ()I - */ -JNIEXPORT jint JNICALL Java_org_lwjgl_input_GamePad_nGetNumButtons - (JNIEnv * env, jclass clazz) -{ - return 0; -} - diff --git a/src/native/linux/org_lwjgl_input_Keyboard.cpp b/src/native/linux/org_lwjgl_input_Keyboard.cpp index 3ef5b2c1..93a8e53a 100644 --- a/src/native/linux/org_lwjgl_input_Keyboard.cpp +++ b/src/native/linux/org_lwjgl_input_Keyboard.cpp @@ -41,6 +41,7 @@ #include #include +#include #include #include #include "org_lwjgl_input_Keyboard.h" @@ -51,20 +52,16 @@ unsigned char readBuffer[KEYBOARD_BUFFER_SIZE * 2]; jfieldID fid_readBuffer; -jfieldID fid_readBufferAddress; unsigned char key_buf[KEYBOARD_SIZE]; unsigned char key_map[KEYBOARD_SIZE]; -typedef struct { - unsigned char keycode; - unsigned char state; -} input_event; - -input_event saved_key_events[KEY_EVENT_BACKLOG]; +XKeyEvent saved_key_events[KEY_EVENT_BACKLOG]; int list_start = 0; int list_end = 0; bool keyboard_grabbed; +bool buffer_enabled; +bool translation_enabled; extern Display *disp; extern Window win; @@ -88,7 +85,6 @@ JNIEXPORT void JNICALL Java_org_lwjgl_input_Keyboard_initIDs } fid_readBuffer = env->GetStaticFieldID(clazz, "readBuffer", "Ljava/nio/ByteBuffer;"); - fid_readBufferAddress = env->GetStaticFieldID(clazz, "readBufferAddress", "I"); } int grabKeyboard(void) { @@ -127,7 +123,10 @@ int updateKeyboardGrab(void) { JNIEXPORT jboolean JNICALL Java_org_lwjgl_input_Keyboard_nCreate (JNIEnv * env, jclass clazz) { - keyboard_grabbed = 0; + keyboard_grabbed = false; + translation_enabled = false; + buffer_enabled = false; + if (updateKeyboardGrab() != GrabSuccess) { #ifdef _DEBUG printf("Could not grab keyboard\n"); @@ -170,29 +169,68 @@ JNIEXPORT void JNICALL Java_org_lwjgl_input_Keyboard_nDestroy ungrabKeyboard(); } -input_event *nextEventElement(void) { +XKeyEvent *nextEventElement(void) { if (list_start == list_end) return NULL; - input_event *result = &(saved_key_events[list_start]); + XKeyEvent *result = &(saved_key_events[list_start]); list_start = (list_start + 1)%KEY_EVENT_BACKLOG; return result; } -void putEventElement(unsigned char keycode, unsigned char state) { +void putEventElement(XKeyEvent *event) { int next_index = (list_end + 1)%KEY_EVENT_BACKLOG; if (next_index == list_start) return; - saved_key_events[list_end].keycode = keycode; - saved_key_events[list_end].state = state; + saved_key_events[list_end] = *event; list_end = next_index; } -unsigned char getKeycode(XEvent *event) { - unsigned char keycode = (unsigned char)((event->xkey.keycode - 8) & 0xff); +unsigned char getKeycode(XKeyEvent *event) { + unsigned char keycode = (unsigned char)((event->keycode - 8) & 0xff); keycode = key_map[keycode]; return keycode; } +int translateEvent(int *position, XKeyEvent *event) { + static char temp_translation_buffer[KEYBOARD_BUFFER_SIZE]; + static XComposeStatus status; + int num_chars, i; + + if (*position >= KEYBOARD_BUFFER_SIZE * 2) + return 0; + if (event->type == KeyRelease) { + readBuffer[(*position)++] = 0; + readBuffer[(*position)++] = 0; + return 0; + } + num_chars = XLookupString(event, temp_translation_buffer, KEYBOARD_BUFFER_SIZE, NULL, &status); + if (num_chars > 0) { + num_chars--; + /* Assume little endian byte order */ + readBuffer[(*position)++] = temp_translation_buffer[0]; + readBuffer[(*position)++] = 0; + for (i = 0; i < num_chars; i++) { + readBuffer[(*position)++] = 0; + readBuffer[(*position)++] = 0; + readBuffer[(*position)++] = temp_translation_buffer[i + 1]; + readBuffer[(*position)++] = 0; + } + } else { + readBuffer[(*position)++] = 0; + readBuffer[(*position)++] = 0; + } + return num_chars; +} + +unsigned char eventState(XKeyEvent *event) { + if (event->type == KeyPress) { + return 1; + } else if (event->type == KeyRelease) { + return 0; + } else + assert(0); +} + /* * Class: org_lwjgl_input_Keyboard * Method: nPoll @@ -202,20 +240,16 @@ JNIEXPORT void JNICALL Java_org_lwjgl_input_Keyboard_nPoll (JNIEnv * env, jclass clazz, jint buf) { XEvent event; - int state; + unsigned char state; updateKeyboardGrab(); while (XCheckMaskEvent(disp, KeyPressMask | KeyReleaseMask, &event)) { - unsigned char keycode = getKeycode(&event); - if (event.type == KeyPress) { - state = 1; - } else if (event.type == KeyRelease) { - state = 0; - } else - assert(0); + unsigned char keycode = getKeycode(&(event.xkey)); + state = eventState(&(event.xkey)); key_buf[keycode] = state; - putEventElement(keycode, state); + if (buffer_enabled) + putEventElement(&(event.xkey)); } memcpy((unsigned char*)buf, key_buf, KEYBOARD_SIZE*sizeof(unsigned char)); } @@ -225,43 +259,51 @@ JNIEXPORT void JNICALL Java_org_lwjgl_input_Keyboard_nPoll * Method: nRead * Signature: (I)V */ -JNIEXPORT jint JNICALL Java_org_lwjgl_input_Keyboard_nRead - (JNIEnv * env, jclass clazz, jint keys) +JNIEXPORT int JNICALL Java_org_lwjgl_input_Keyboard_nRead + (JNIEnv * env, jclass clazz) { XEvent event; - int count = 0; + XKeyEvent *key_event; int buf_count = 0; int state; - input_event *input_ev; - unsigned char *result_buf = (unsigned char *)keys; + int num_events = 0; updateKeyboardGrab(); - while ((input_ev = nextEventElement()) != NULL) { - count++; -// printf("Reading a key %d %d count %d\n", (int)input_ev->keycode, (int)input_ev->state, count); - result_buf[buf_count++] = input_ev->keycode; - result_buf[buf_count++] = input_ev->state; - if (buf_count >= KEYBOARD_BUFFER_SIZE * 2) - return count; + while (buf_count < KEYBOARD_BUFFER_SIZE * 2 && (key_event = nextEventElement()) != NULL) { + num_events++; + unsigned char keycode = getKeycode(key_event); + unsigned char state = eventState(key_event); +// printf("Reading a key %d %d count %d\n", (int)keycode, (int)state, num_events); + readBuffer[buf_count++] = keycode; + readBuffer[buf_count++] = state; + if (translation_enabled) + num_events += translateEvent(&buf_count, key_event); } - while (XCheckMaskEvent(disp, KeyPressMask | KeyReleaseMask, &event)) { - count++; - unsigned char keycode = getKeycode(&event); - if (event.type == KeyPress) { - state = 1; - } else if (event.type == KeyRelease) { - state = 0; - } else - assert(0); + while (buf_count < KEYBOARD_BUFFER_SIZE * 2 && XCheckMaskEvent(disp, KeyPressMask | KeyReleaseMask, &event)) { + num_events++; + unsigned char keycode = getKeycode(&(event.xkey)); + unsigned char state = eventState(&(event.xkey)); +// printf("Reading a key %d %d count %d\n", (int)keycode, (int)state, num_events); key_buf[keycode] = state; - result_buf[buf_count++] = keycode; - result_buf[buf_count++] = state; - if (buf_count >= KEYBOARD_BUFFER_SIZE * 2) - return count; + readBuffer[buf_count++] = keycode; + readBuffer[buf_count++] = state; + if (translation_enabled) + num_events += translateEvent(&buf_count, &(event.xkey)); } - return count; + return num_events; +} + +/* + * Class: org_lwjgl_input_Keyboard + * Method: nEnableTranslation + * Signature: ()I + */ +JNIEXPORT void JNICALL Java_org_lwjgl_input_Keyboard_nEnableTranslation + (JNIEnv *env, jclass clazz) +{ + translation_enabled = true; } /* @@ -274,6 +316,6 @@ JNIEXPORT jint JNICALL Java_org_lwjgl_input_Keyboard_nEnableBuffer { jobject newBuffer = env->NewDirectByteBuffer(&readBuffer, KEYBOARD_BUFFER_SIZE * 2); env->SetStaticObjectField(clazz, fid_readBuffer, newBuffer); - env->SetStaticIntField(clazz, fid_readBufferAddress, (jint) (&readBuffer)); + buffer_enabled = true; return KEYBOARD_BUFFER_SIZE; }