#include "emul_state.h"
#include "debug_ch.h"
+#ifdef __linux__
+#include <X11/XKBlib.h>
+#elif _WIN32
+#include <windows.h>
+#endif
+
MULTI_DEBUG_CHANNEL(qemu, emul_state);
{
return &(_emul_state.qemu_mts);
}
+
+/* manage CapsLock key state for usb keyboard input */
+int get_host_caps_lock_state(void)
+{
+#ifdef __linux__
+ unsigned state = 0;
+ Display *display = XOpenDisplay((char*)0);
+ if (display) {
+ XkbGetIndicatorState(display, XkbUseCoreKbd, &state);
+ }
+ XCloseDisplay(display);
+
+ return (state & 1);
+#elif _WIN32
+ //TODO:
+#endif
+
+ return 0;
+}
+
+void set_emul_caps_lock_state(int state)
+{
+ _emul_state.qemu_caps_lock = state;
+}
+
+int get_emul_caps_lock_state(void)
+{
+ return _emul_state.qemu_caps_lock;
+}
double scale_factor;
short rotation_type;
MultiTouchState qemu_mts;
+ int qemu_caps_lock;
//TODO:
} EmulatorConfigState;
/* setter */
-void set_emulator_condition(int state);
void set_emul_lcd_size(int width, int height);
void set_emul_win_scale(double scale);
-void set_emul_rotation(short rotation_type);
void set_emul_sdl_bpp(int bpp);
+void set_emulator_condition(int state);
+void set_emul_rotation(short rotation_type);
+void set_emul_caps_lock_state(int state);
/* getter */
-int get_emulator_condition(void);
int get_emul_lcd_width(void);
int get_emul_lcd_height(void);
double get_emul_win_scale(void);
-short get_emul_rotation(void);
int get_emul_sdl_bpp(void);
+int get_emulator_condition(void);
+short get_emul_rotation(void);
MultiTouchState *get_emul_multi_touch_state(void);
+int get_host_caps_lock_state(void);
+int get_emul_caps_lock_state(void);
#endif /* __EMUL_STATE_H__ */
{
INFO("construct main window\n");
- //TODO: init
- //set_emul_win_scale(0.5);
- //set_emul_rotation(0);
-
start_skin_server( skin_argc, skin_argv );
#if 1
if ( 0 > start_skin_client(skin_argc, skin_argv) ) {
}
#endif
+ set_emul_caps_lock_state(get_host_caps_lock_state());
}
static void parse_options(int argc, char* argv[], int* skin_argc, char*** skin_argv, int* qemu_argc, char*** qemu_argv)
#include "maruskin_keymap.h"
+#include "emul_state.h"
+#include "console.h"
+#include "debug_ch.h"
+MULTI_DEBUG_CHANNEL(qemu, skin_keymap);
-int javakeycode_to_scancode(int java_keycode)
+
+int javakeycode_to_scancode(int java_keycode, int event_type)
{
int state_mask = java_keycode & JAVA_KEYCODE_BIT;
int vk = java_keycode & JAVA_KEY_MASK;
case JAVA_KEY_KEYPAD_ADD :
return 78;
case JAVA_KEY_KEYPAD_SUBTRACT :
- return 74;
+ return 114; //
case JAVA_KEY_KEYPAD_DECIMAL :
return 123;
case JAVA_KEY_KEYPAD_DIVIDE :
- return -1;
+ return 138; //
case JAVA_KEY_KEYPAD_0 :
return 81;
case JAVA_KEY_KEYPAD_1 :
return 71;
case JAVA_KEY_KEYPAD_9 :
return 73;
+ case JAVA_KEY_KEYPAD_CR :
+ return 136; //
case JAVA_KEY_CAPS_LOCK :
+ if (event_type == KEY_PRESSED) {
+ set_emul_caps_lock_state(get_emul_caps_lock_state() ^ 1); //toggle
+ }
return 58;
case JAVA_KEY_NUM_LOCK :
return 69;
}
}
+ if (get_emul_caps_lock_state() != get_host_caps_lock_state()) {
+ kbd_put_keycode(58);
+ kbd_put_keycode(58 | 0x80);
+ set_emul_caps_lock_state(get_emul_caps_lock_state() ^ 1); //toggle
+ INFO("qemu CapsLock state was synchronized with host key value (%d)\n", get_emul_caps_lock_state());
+ }
+
}
return vkkey2scancode[vk];
JAVA_KEY_KEYPAD_7,
JAVA_KEY_KEYPAD_8,
JAVA_KEY_KEYPAD_9,
+ JAVA_KEY_KEYPAD_CR = 80,
JAVA_KEY_CAPS_LOCK = 82,
JAVA_KEY_NUM_LOCK,
JAVA_KEY_SCROLL_LOCK,
['?'] = 53 | SHIFT,
};
-int javakeycode_to_scancode(int java_keycode);
+int javakeycode_to_scancode(int java_keycode, int event_type);
#endif /* MARUSKIN_KEYMAP_H_ */
{
TRACE( "key_event event_type:%d, keycode:%d\n", event_type, keycode );
- //check for multi-touch
+ //is multi-touch mode ?
if (keycode == JAVA_KEYCODE_BIT_CTRL) {
if (KEY_PRESSED == event_type) {
get_emul_multi_touch_state()->multitouch_enable = 1;
return;
}
- int scancode = javakeycode_to_scancode(keycode);
+ int scancode = javakeycode_to_scancode(keycode, event_type);
if (scancode == -1) {
INFO("cannot find scancode\n");
return;