import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.Iterator;
+import java.util.LinkedList;
import java.util.List;
import java.util.Map.Entry;
import java.util.logging.Level;
private KeyListener canvasKeyListener;
private MenuDetectListener canvasMenuDetectListener;
+ private LinkedList<KeyEventData> pressedKeyEventList;
+
private EmulatorSkin reopenSkin;
/**
this.isDefaultHoverColor = true;
this.isOnTop = isOnTop;
this.paletteData = new PaletteData(RED_MASK, GREEN_MASK, BLUE_MASK);
+ this.pressedKeyEventList = new LinkedList<KeyEventData>();
int style = SWT.NO_TRIM;
this.shell = new Shell( Display.getDefault(), style );
public void focusLost(FocusEvent event) {
logger.info("lost focus");
+
+ /* key event compensation */
+ if (pressedKeyEventList.isEmpty() == false) {
+ for (KeyEventData data : pressedKeyEventList) {
+ KeyEventData keyEventData = new KeyEventData(
+ KeyEventType.RELEASED.value(), data.keycode,
+ data.stateMask, data.keyLocation);
+ communicator.sendToQEMU(SendCommand.SEND_KEY_EVENT, keyEventData);
+
+ logger.info("auto release : keycode=" + keyEventData.keycode +
+ ", stateMask=" + keyEventData.stateMask +
+ ", keyLocation=" + keyEventData.keyLocation);
+ }
+ }
+
+ pressedKeyEventList.clear();
}
};
// remove 'input method' menu item ( avoid bug )
canvas.addMenuDetectListener( canvasMenuDetectListener );
+ /* mouse event */
/*canvasDragDetectListener = new DragDetectListener() {
@Override
@Override
public void mouseDoubleClick( MouseEvent e ) {
+ /* do nothing */
}
};
canvas.addMouseListener( canvasMouseListener );
- canvasMouseWheelListener = new MouseWheelListener() {
-
+
+ canvasMouseWheelListener = new MouseWheelListener() {
+
@Override
public void mouseScrolled(MouseEvent e) {
- int[] geometry = SkinUtil.convertMouseGeometry( e.x, e.y, currentLcdWidth, currentLcdHeight,
- currentScale, currentAngle );
- logger.info( "mousewheel in LCD" + " x:" + geometry[0] + " y:" + geometry[1] + " value:" + e.count);
+ int[] geometry = SkinUtil.convertMouseGeometry(e.x, e.y, currentLcdWidth, currentLcdHeight,
+ currentScale, currentAngle);
+ logger.info("mousewheel in LCD" + " x:" + geometry[0] + " y:" + geometry[1] + " value:" + e.count);
+
int eventType;
-
- if(e.count < 0)
+ if (e.count < 0) {
eventType = MouseEventType.WHEELDOWN.value();
- else
+ } else {
eventType = MouseEventType.WHEELUP.value();
-
- MouseEventData mouseEventData = new MouseEventData( MouseButtonType.WHEEL.value(), eventType,
- e.x, e.y, geometry[0], geometry[1], e.count );
- communicator.sendToQEMU( SendCommand.SEND_MOUSE_EVENT, mouseEventData );
- }
- };
-
- canvas.addMouseWheelListener( canvasMouseWheelListener );
+ }
+ MouseEventData mouseEventData = new MouseEventData(
+ MouseButtonType.WHEEL.value(), eventType,
+ e.x, e.y, geometry[0], geometry[1], e.count);
+ communicator.sendToQEMU(SendCommand.SEND_MOUSE_EVENT, mouseEventData);
+ }
+ };
+ canvas.addMouseWheelListener( canvasMouseWheelListener );
+ /* keyboard event */
canvasKeyListener = new KeyListener() {
-
+
private KeyEvent previous;
private boolean disappearEvent = false;
private int disappearKeycode = 0;
previous = null;
- if( SwtUtil.isWindowsPlatform() && disappearEvent) {
+ /* generate a disappeared key event in Windows */
+ if (SwtUtil.isWindowsPlatform() && disappearEvent) {
disappearEvent = false;
if (isMetaKey(e) && e.character != '\0') {
- logger.info( "send previous release : keycode=" + disappearKeycode +
- ", stateMask=" + disappearStateMask + ", keyLocation=" + disappearKeyLocation);
+ logger.info("send previous release : keycode=" + disappearKeycode +
+ ", stateMask=" + disappearStateMask +
+ ", keyLocation=" + disappearKeyLocation);
KeyEventData keyEventData = new KeyEventData(
KeyEventType.RELEASED.value(),
disappearKeycode, disappearStateMask, disappearKeyLocation);
communicator.sendToQEMU(SendCommand.SEND_KEY_EVENT, keyEventData);
+ removePressedKey(keyEventData);
+
disappearKeycode = 0;
disappearStateMask = 0;
disappearKeyLocation = 0;
KeyEventData keyEventData = new KeyEventData(
KeyEventType.RELEASED.value(), keyCode, stateMask, e.keyLocation);
communicator.sendToQEMU(SendCommand.SEND_KEY_EVENT, keyEventData);
+
+ removePressedKey(keyEventData);
}
@Override
int keyCode = e.keyCode;
int stateMask = e.stateMask;
- if( SwtUtil.isWindowsPlatform() ) {
+ /* When the pressed key event is overwritten by next key event,
+ * the release event of previous key does not occur in Windows.
+ * So, we generate a release key event by ourselves
+ * that had been disappeared. */
+ if (SwtUtil.isWindowsPlatform()) {
if (null != previous) {
if (previous.keyCode != e.keyCode) {
KeyEventData keyEventData = new KeyEventData(KeyEventType.RELEASED.value(),
previousKeyCode, previousStateMask, previous.keyLocation);
- communicator.sendToQEMU( SendCommand.SEND_KEY_EVENT, keyEventData );
+ communicator.sendToQEMU(SendCommand.SEND_KEY_EVENT, keyEventData);
+
+ removePressedKey(keyEventData);
}
}
KeyEventData keyEventData = new KeyEventData(
KeyEventType.PRESSED.value(), keyCode, stateMask, e.keyLocation);
- communicator.sendToQEMU( SendCommand.SEND_KEY_EVENT, keyEventData );
+ communicator.sendToQEMU(SendCommand.SEND_KEY_EVENT, keyEventData);
+
+ addPressedKey(keyEventData);
}
};
return false;
}
+ private synchronized boolean addPressedKey(KeyEventData pressData) {
+ for (KeyEventData data : pressedKeyEventList) {
+ if (data.keycode == pressData.keycode &&
+ data.stateMask == pressData.stateMask &&
+ data.keyLocation == pressData.keyLocation) {
+ return false;
+ }
+ }
+
+ pressedKeyEventList.add(pressData);
+ return true;
+ }
+
+ private synchronized boolean removePressedKey(KeyEventData releaseData) {
+
+ for (KeyEventData data : pressedKeyEventList) {
+ if (data.keycode == releaseData.keycode &&
+ data.stateMask == releaseData.stateMask &&
+ data.keyLocation == releaseData.keyLocation) {
+ pressedKeyEventList.remove(data);
+
+ return true;
+ }
+ }
+
+ return false;
+ }
+
private void removeCanvasListeners() {
// if ( null != canvasDragDetectListener ) {