From df2313f040d814eab52eedae09cb027912779704 Mon Sep 17 00:00:00 2001 From: Son Hyunjun Date: Sun, 8 Apr 2012 06:17:10 +0900 Subject: [PATCH] [Title] abnormal key event operation in Windows [Type] Bugfix [Module] Skin [Priority] Minor [CQ#] [Redmine#] [Problem] [Cause] SWT(Windows OS) works differently between Windows and Ubuntu [Solution] adjust key event operation Change-Id: Ie1a001a6188a8081e47c981103eed2f4795a772b --- .../src/org/tizen/emulator/skin/EmulatorSkin.java | 76 +++++++++++++++++++++- 1 file changed, 73 insertions(+), 3 deletions(-) diff --git a/tizen/src/skin/client/src/org/tizen/emulator/skin/EmulatorSkin.java b/tizen/src/skin/client/src/org/tizen/emulator/skin/EmulatorSkin.java index 141bcba..6ab0c9a 100644 --- a/tizen/src/skin/client/src/org/tizen/emulator/skin/EmulatorSkin.java +++ b/tizen/src/skin/client/src/org/tizen/emulator/skin/EmulatorSkin.java @@ -767,19 +767,82 @@ public class EmulatorSkin { canvas.addMouseListener( canvasMouseListener ); canvasKeyListener = new KeyListener() { - + + private KeyEvent previous; + private KeyEvent previousMeta; + @Override public void keyReleased( KeyEvent e ) { - logger.info( "key released. key event:" + e ); + if( logger.isLoggable( Level.INFO ) ) { + logger.info( "'" + e.character + "':" + e.keyCode + ":" + e.stateMask + ":" + e.keyLocation ); + }else if( logger.isLoggable( Level.FINE ) ) { + logger.fine( e.toString() ); + } int keyCode = e.keyCode | e.stateMask; + previous = null; + KeyEventData keyEventData = new KeyEventData( KeyEventType.RELEASED.value(), keyCode, e.keyLocation ); communicator.sendToQEMU( SendCommand.SEND_KEY_EVENT, keyEventData ); } @Override public void keyPressed( KeyEvent e ) { - logger.info( "key pressed. key event:" + e ); + + if( SkinUtil.isWindowsPlatform() ) { + + if( null != previousMeta ) { + + if ( 0 == ( e.stateMask & SWT.SHIFT ) && 0 == ( e.stateMask & SWT.CTRL ) + && 0 == ( e.stateMask & SWT.ALT ) ) { + + if ( logger.isLoggable( Level.INFO ) ) { + logger.info( "send previous release : '" + previousMeta.character + "':" + + previousMeta.keyCode + ":" + previousMeta.stateMask + ":" + + previousMeta.keyLocation ); + } else if ( logger.isLoggable( Level.FINE ) ) { + logger.fine( "send previous release :" + previousMeta.toString() ); + } + int keyCode = previousMeta.keyCode | previousMeta.stateMask; + KeyEventData keyEventData = new KeyEventData( KeyEventType.RELEASED.value(), keyCode, + previous.keyLocation ); + communicator.sendToQEMU( SendCommand.SEND_KEY_EVENT, keyEventData ); + previousMeta = null; + } + + } + + if ( null != previous ) { + if ( ( previous.keyCode != e.keyCode ) && !isMetaKey( previous ) ) { + + if ( isMetaKey( previous ) ) { + previousMeta = previous; + } else { + + 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() ); + } + int keyCode = previous.keyCode | previous.stateMask; + KeyEventData keyEventData = new KeyEventData( KeyEventType.RELEASED.value(), keyCode, + previous.keyLocation ); + communicator.sendToQEMU( SendCommand.SEND_KEY_EVENT, keyEventData ); + + } + + } + } + } + + previous = e; + + if( logger.isLoggable( Level.INFO ) ) { + logger.info( "'" + e.character + "':" + e.keyCode + ":" + e.stateMask + ":" + e.keyLocation ); + }else if( logger.isLoggable( Level.FINE ) ) { + logger.fine( e.toString() ); + } int keyCode = e.keyCode | e.stateMask; KeyEventData keyEventData = new KeyEventData( KeyEventType.PRESSED.value(), keyCode, e.keyLocation ); communicator.sendToQEMU( SendCommand.SEND_KEY_EVENT, keyEventData ); @@ -791,6 +854,13 @@ public class EmulatorSkin { } + 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 ) { -- 2.7.4