[Title] abnormal key event operation in Windows
authorSon Hyunjun <hj79.son@samsung.com>
Sat, 7 Apr 2012 21:17:10 +0000 (06:17 +0900)
committerSon Hyunjun <hj79.son@samsung.com>
Sat, 7 Apr 2012 21:17:10 +0000 (06:17 +0900)
[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

tizen/src/skin/client/src/org/tizen/emulator/skin/EmulatorSkin.java

index 141bcbacc1bdc2456ed00100aa84f66128e63d43..6ab0c9af37d3ee8b1e4d5898a4da24077cd5c0a6 100644 (file)
@@ -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 ) {