SkinUtil.trimShell( shell, currentImage );
- KeyEventData keyEventData = new KeyEventData( KeyEventType.RELEASED.value(), keyCode, 0 );
+ KeyEventData keyEventData = new KeyEventData(
+ KeyEventType.RELEASED.value(), keyCode, 0, 0);
communicator.sendToQEMU( SendCommand.SEND_HARD_KEY_EVENT, keyEventData );
}
});
}
- KeyEventData keyEventData = new KeyEventData( KeyEventType.PRESSED.value(), keyCode, 0 );
+ KeyEventData keyEventData = new KeyEventData(
+ KeyEventType.PRESSED.value(), keyCode, 0, 0);
communicator.sendToQEMU( SendCommand.SEND_HARD_KEY_EVENT, keyEventData );
}
}
private KeyEvent previous;
private boolean disappearEvent = false;
private int disappearKeycode = 0;
+ private int disappearStateMask = 0;
private int disappearKeyLocation = 0;
@Override
public void keyReleased( KeyEvent e ) {
- if( logger.isLoggable( Level.INFO ) ) {
+ if ( logger.isLoggable( Level.INFO ) ) {
logger.info( "'" + e.character + "':" + e.keyCode + ":" + e.stateMask + ":" + e.keyLocation );
- }else if( logger.isLoggable( Level.FINE ) ) {
+ } else if ( logger.isLoggable( Level.FINE ) ) {
logger.fine( e.toString() );
}
- int keyCode = e.keyCode | e.stateMask;
+ int keyCode = e.keyCode;
+ int stateMask = e.stateMask;
previous = null;
-
+
if( SwtUtil.isWindowsPlatform() && disappearEvent) {
disappearEvent = false;
if (isMetaKey(e) && e.character != '\0') {
logger.info( "send previous release : keycode=" + disappearKeycode +
- ", disappearKeyLocation=" + disappearKeyLocation);
+ ", stateMask=" + disappearStateMask + ", keyLocation=" + disappearKeyLocation);
KeyEventData keyEventData = new KeyEventData(
- KeyEventType.RELEASED.value(), disappearKeycode, disappearKeyLocation );
- communicator.sendToQEMU( SendCommand.SEND_KEY_EVENT, keyEventData );
+ KeyEventType.RELEASED.value(),
+ disappearKeycode, disappearStateMask, disappearKeyLocation);
+ communicator.sendToQEMU(SendCommand.SEND_KEY_EVENT, keyEventData);
disappearKeycode = 0;
+ disappearStateMask = 0;
disappearKeyLocation = 0;
}
}
- KeyEventData keyEventData = new KeyEventData( KeyEventType.RELEASED.value(), keyCode, e.keyLocation );
- communicator.sendToQEMU( SendCommand.SEND_KEY_EVENT, keyEventData );
+
+ KeyEventData keyEventData = new KeyEventData(
+ KeyEventType.RELEASED.value(), keyCode, stateMask, e.keyLocation);
+ communicator.sendToQEMU(SendCommand.SEND_KEY_EVENT, keyEventData);
}
@Override
public void keyPressed( KeyEvent e ) {
- int keyCode = e.keyCode | e.stateMask;
-
+ int keyCode = e.keyCode;
+ int stateMask = e.stateMask;
+
if( SwtUtil.isWindowsPlatform() ) {
- if ( null != previous ) {
- if ( previous.keyCode != e.keyCode ) {
+ if (null != previous) {
+ if (previous.keyCode != e.keyCode) {
- if ( isMetaKey( previous ) ) {
+ if (isMetaKey(previous)) {
disappearEvent = true;
disappearKeycode = keyCode;
+ disappearStateMask = stateMask;
disappearKeyLocation = e.keyLocation;
} else {
- int previousKeyCode = previous.keyCode | previous.stateMask;
-
+ int previousKeyCode = previous.keyCode;
+ int previousStateMask = previous.stateMask;
+
if ( logger.isLoggable( Level.INFO ) ) {
logger.info( "send previous release : '" + previous.character + "':"
+ previous.keyCode + ":" + previous.stateMask + ":" + previous.keyLocation );
} else if ( logger.isLoggable( Level.FINE ) ) {
logger.fine( "send previous release :" + previous.toString() );
}
- KeyEventData keyEventData = new KeyEventData( KeyEventType.RELEASED.value(), previousKeyCode,
- previous.keyLocation );
+
+ KeyEventData keyEventData = new KeyEventData(KeyEventType.RELEASED.value(),
+ previousKeyCode, previousStateMask, previous.keyLocation);
communicator.sendToQEMU( SendCommand.SEND_KEY_EVENT, keyEventData );
}
} else if ( logger.isLoggable( Level.FINE ) ) {
logger.fine( e.toString() );
}
- KeyEventData keyEventData = new KeyEventData( KeyEventType.PRESSED.value(), keyCode, e.keyLocation );
+
+ KeyEventData keyEventData = new KeyEventData(
+ KeyEventType.PRESSED.value(), keyCode, stateMask, e.keyLocation);
communicator.sendToQEMU( SendCommand.SEND_KEY_EVENT, keyEventData );
}
}
- private boolean isMetaKey( KeyEvent event ) {
- if( SWT.CTRL == event.keyCode || SWT.ALT == event.keyCode || SWT.SHIFT == event.keyCode ) {
+ private boolean isMetaKey(KeyEvent event) {
+ if (SWT.CTRL == event.keyCode ||
+ SWT.ALT == event.keyCode ||
+ SWT.SHIFT == event.keyCode) {
return true;
}
return false;
}
-
+
private void removeCanvasListeners() {
// if ( null != canvasDragDetectListener ) {
int eventType;
int keycode;
+ int stateMask;
int keyLocation;
- public KeyEventData(int eventType, int keycode, int keyLocation) {
+ public KeyEventData(int eventType, int keycode, int stateMask, int keyLocation) {
this.eventType = eventType;
this.keycode = keycode;
+ this.stateMask = stateMask;
this.keyLocation = keyLocation;
}
protected void write() throws IOException {
writeInt(eventType);
writeInt(keycode);
+ writeInt(stateMask);
writeInt(keyLocation);
}
builder.append(eventType);
builder.append(", keycode=");
builder.append(keycode);
+ builder.append(", stateMask=");
+ builder.append(stateMask);
builder.append(", keyLocation=");
builder.append(keyLocation);
builder.append("]");
MULTI_DEBUG_CHANNEL(qemu, skin_keymap);
-int javakeycode_to_scancode(int java_keycode, int event_type, int key_location)
+int javakeycode_to_scancode(
+ int event_type, int java_keycode, int state_mask, int key_location)
{
- int state_mask = java_keycode & JAVA_KEYCODE_BIT;
+ int state = java_keycode & JAVA_KEYCODE_BIT;
int vk = java_keycode & JAVA_KEY_MASK;
int ctrl_mask = java_keycode & JAVA_KEYCODE_BIT_CTRL;
/* CapsLock & NumLock key processing */
- if (state_mask != 0) {
+ if (state != 0) {
if (vk == JAVA_KEY_CAPS_LOCK) {
if (event_type == KEY_PRESSED) {
set_emul_caps_lock_state(get_emul_caps_lock_state() ^ 1); //toggle
}
/* check CapsLock & NumLock key sync */
if (event_type == KEY_PRESSED) {
- if (get_emul_caps_lock_state() != get_host_lock_key_state(HOST_CAPSLOCK_KEY)) {
+ int caps_lock = -1;
+ int num_lock = -1;
+
+ caps_lock = get_host_lock_key_state(HOST_CAPSLOCK_KEY);
+ num_lock = get_host_lock_key_state(HOST_NUMLOCK_KEY);
+
+ if (caps_lock != -1 && get_emul_caps_lock_state() != caps_lock) {
kbd_put_keycode(58);
kbd_put_keycode(58 | 0x80);
set_emul_caps_lock_state(get_emul_caps_lock_state() ^ 1);
INFO("qemu CapsLock state was synchronized with host key value (%d)\n", get_emul_caps_lock_state());
}
- if (get_emul_num_lock_state() != get_host_lock_key_state(HOST_NUMLOCK_KEY)) {
+ if (num_lock != -1 && get_emul_num_lock_state() != num_lock) {
kbd_put_keycode(69);
kbd_put_keycode(69 | 0x80);
set_emul_num_lock_state(get_emul_num_lock_state() ^ 1);
}
}
- if (state_mask != 0)
+ if (state != 0)
{ //non-character keys
if (vk >= JAVA_KEY_F1 && vk <= JAVA_KEY_F20) { //function keys
vk += 255;
['?'] = 53 | SHIFT,
};
-int javakeycode_to_scancode(int java_keycode, int event_type, int key_location);
+int javakeycode_to_scancode(
+ int event_type, int java_keycode, int state_mask, int key_location);
#endif /* MARUSKIN_KEYMAP_H_ */
#endif
}
-void do_key_event( int event_type, int keycode, int key_location )
+void do_key_event(int event_type, int keycode, int state_mask, int key_location)
{
- TRACE( "key_event event_type:%d, keycode:%d, key_location:%d\n", event_type, keycode, key_location );
+ int scancode = -1;
+
+ TRACE("key_event event_type:%d, keycode:%d, state_mask:%d, key_location:%d\n",
+ event_type, keycode, state_mask, key_location);
#ifndef USE_SHM
//is multi-touch mode ?
if (keycode == JAVA_KEYCODE_BIT_CTRL) {
if (KEY_PRESSED == event_type) {
get_emul_multi_touch_state()->multitouch_enable = 1;
- INFO("multi-touch enabled = A\n");
+ INFO("1)multi-touch enabled = A\n");
} else if (KEY_RELEASED == event_type) {
get_emul_multi_touch_state()->multitouch_enable = 0;
clear_finger_slot();
- INFO("multi-touch disabled\n");
+ INFO("1)multi-touch disabled\n");
}
} else if (keycode == (JAVA_KEYCODE_NO_FOCUS | JAVA_KEYCODE_BIT_CTRL)) {
//release ctrl key when dragging
if (KEY_RELEASED == event_type) {
get_emul_multi_touch_state()->multitouch_enable = 0;
clear_finger_slot();
- INFO("multi-touch disabled\n");
+ INFO("2)multi-touch disabled\n");
}
} else if (keycode == (JAVA_KEYCODE_BIT_SHIFT | JAVA_KEYCODE_BIT_CTRL)) {
if (KEY_PRESSED == event_type) {
get_emul_multi_touch_state()->multitouch_enable = 2;
- INFO("multi-touch enabled = B\n");
+ INFO("2)multi-touch enabled = B\n");
} else if (KEY_RELEASED == event_type) {
get_emul_multi_touch_state()->multitouch_enable = 1;
- INFO("multi-touch enabled = A\n");
+ INFO("2)multi-touch enabled = A\n");
}
}
}
return;
}
- int scancode = javakeycode_to_scancode(keycode, event_type, key_location);
+ scancode = javakeycode_to_scancode(event_type, keycode, state_mask, key_location);
TRACE("javakeycode_to_scancode : %d\n", scancode);
if (scancode == -1) {
void do_mouse_event(int button_type, int event_type, int origin_x, int origin_y, int x, int y, int z);
-void do_key_event( int event_type, int keycode, int key_location );
+void do_key_event(int event_type, int keycode, int state_mask, int key_location);
-void do_hardkey_event( int event_type, int keycode );
+void do_hardkey_event(int event_type, int keycode);
-void do_scale_event( double scale_factor);
+void do_scale_event(double scale_factor);
-void do_rotation_event( int rotation_type );
+void do_rotation_event(int rotation_type);
-QemuSurfaceInfo* get_screenshot_info( void );
+QemuSurfaceInfo *get_screenshot_info(void);
-DetailInfo* get_detail_info( int qemu_argc, char** qemu_argv );
+DetailInfo *get_detail_info(int qemu_argc, char **qemu_argv);
-void free_detail_info( DetailInfo* detail_info );
+void free_detail_info(DetailInfo *detail_info);
-void free_screenshot_info( QemuSurfaceInfo* );
+void free_screenshot_info(QemuSurfaceInfo *);
void open_shell(void);
-void onoff_usb_kbd( int on );
+void onoff_usb_kbd(int on);
void ram_dump(void);
-void request_close( void );
+void request_close(void);
-void shutdown_qemu_gracefully( void );
+void shutdown_qemu_gracefully(void);
-int is_requested_shutdown_qemu_gracefully( void );
+int is_requested_shutdown_qemu_gracefully(void);
#endif /* MARUSKIN_OPERATION_H_ */
/* keep it consistent with emulator-skin definition */
int event_type = 0;
int keycode = 0;
+ int state_mask = 0;
int key_location = 0;
char* p = recvbuf;
p += sizeof( event_type );
memcpy( &keycode, p, sizeof( keycode ) );
p += sizeof( keycode );
+ memcpy( &state_mask, p, sizeof( state_mask ) );
+ p += sizeof( state_mask );
memcpy( &key_location, p, sizeof( key_location ) );
event_type = ntohl( event_type );
keycode = ntohl( keycode );
+ state_mask = ntohl( state_mask );
key_location = ntohl( key_location );
- do_key_event( event_type, keycode, key_location );
+ do_key_event(event_type, keycode, state_mask, key_location);
break;
}
case RECV_HARD_KEY_EVENT: {