virtio-keyboard: problems related key release event
authorsungmin ha <sungmin82.ha@samsung.com>
Tue, 14 May 2013 07:34:42 +0000 (16:34 +0900)
committersungmin ha <sungmin82.ha@samsung.com>
Tue, 14 May 2013 07:34:42 +0000 (16:34 +0900)
modified process of using virtio keyboard queue and added key release event when context menu is activated

Signed-off-by: Sungmin Ha <sungmin82.ha@samsung.com>
package/changelog
package/pkginfo.manifest
tizen/src/hw/maru_virtio_keyboard.c
tizen/src/skin/client/src/org/tizen/emulator/skin/EmulatorSkin.java

index 15fd1c4..fa9bcfd 100644 (file)
@@ -1,3 +1,6 @@
+* 1.5.38
+- modified process of using virtio keyboard queue and added key release event when context menu is activated
+== Sungmin Ha <sungmin82.ha@samsung.com> 2013-05-14
 * 1.5.37
 - call setBounds of display in arrangeSkin on only mac
 == GiWoong Kim <giwoong.kim@samsung.com> 2013-05-06
index cca3591..61751c7 100644 (file)
@@ -1,4 +1,4 @@
-Version: 1.5.37
+Version: 1.5.38
 Maintainer: Yeong-Kyoon Lee<yeongkyoon.lee@samsung.com>
 Source: emulator
 
index 6cae72f..9c36770 100644 (file)
@@ -42,7 +42,6 @@ static void virtio_keyboard_handle(VirtIODevice *vdev, VirtQueue *vq)
     VirtIOKeyboard *vkbd = (VirtIOKeyboard *)vdev;
     int index = 0;
 
-    TRACE("virtqueue handler.\n");
     if (virtio_queue_empty(vkbd->vq)) {
         INFO("virtqueue is empty.\n");
         return;
@@ -51,7 +50,7 @@ static void virtio_keyboard_handle(VirtIODevice *vdev, VirtQueue *vq)
     /* Get a queue buffer which is written by guest side. */
     do {
         index = virtqueue_pop(vq, &elem);
-        TRACE("virtqueue pop. index: %d\n", index);
+        TRACE("virtqueue pop.\n");
     } while (index < VIRTIO_KBD_QUEUE_SIZE);
 }
 
@@ -67,7 +66,7 @@ void virtio_keyboard_notify(void *opaque)
         return;
     }
 
-    TRACE("[Enter] virtqueue notifier. %d\n", written_cnt);
+    TRACE("[Enter] virtqueue notifier.\n");
 
     if (!virtio_queue_ready(vkbd->vq)) {
         INFO("virtqueue is not ready.\n");
@@ -83,19 +82,14 @@ void virtio_keyboard_notify(void *opaque)
 
     while ((written_cnt--)) {
         kbdevt = &vkbd->kbdqueue.kbdevent[vkbd->kbdqueue.rptr];
-
-        while (((EmulKbdEvent*)(elem.in_sg[index].iov_base))->code != 0) {
-            if (++index == VIRTIO_KBD_QUEUE_SIZE) {
-                index--;
-                TRACE("virtio queue is full.\n");
-                break;
-            }
-        }
+       if (((EmulKbdEvent*)(elem.in_sg[vkbd->kbdqueue.rptr].iov_base))->code != 0) {
+           TRACE("FIXME: virtio queue is full.\n");
+       }
 
         /* Copy keyboard data into guest side. */
         TRACE("copy: keycode %d, type %d, elem_index %d\n",
-            kbdevt->code, kbdevt->type, index);
-        memcpy(elem.in_sg[index++].iov_base, kbdevt, sizeof(EmulKbdEvent));
+            kbdevt->code, kbdevt->type, vkbd->kbdqueue.rptr);
+        memcpy(elem.in_sg[vkbd->kbdqueue.rptr].iov_base, kbdevt, sizeof(EmulKbdEvent));
         memset(kbdevt, 0x00, sizeof(EmulKbdEvent));
 
         if (vkbd->kbdqueue.wptr > 0) {
@@ -106,7 +100,6 @@ void virtio_keyboard_notify(void *opaque)
         vkbd->kbdqueue.rptr++;
         if (vkbd->kbdqueue.rptr == VIRTIO_KBD_QUEUE_SIZE) {
             vkbd->kbdqueue.rptr = 0;
-            TRACE("kbdqueue is full.\n");
         }
     }
     qemu_mutex_unlock(&vkbd->event_mutex);
index fe93359..b683eb4 100644 (file)
@@ -569,6 +569,7 @@ public class EmulatorSkin {
                        @Override
                        public void menuDetected(MenuDetectEvent e) {
                                Menu menu = EmulatorSkin.this.contextMenu;
+                               keyReleaseEvent();
 
                                if (menu != null && EmulatorSkin.this.isDragStartedInLCD == false) {
                                        lcdCanvas.setMenu(menu);
@@ -595,23 +596,7 @@ public class EmulatorSkin {
                        @Override
                        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, false);
-
-                                               logger.info("auto release : keycode=" + keyEventData.keycode +
-                                                               ", stateMask=" + keyEventData.stateMask +
-                                                               ", keyLocation=" + keyEventData.keyLocation);
-                                       }
-                               }
-
-                               pressedKeyEventList.clear();
+                               keyReleaseEvent();
                        }
                };
 
@@ -1743,4 +1728,22 @@ public class EmulatorSkin {
                return currentState.getCurrentRotationId();
        }
 
+       public void keyReleaseEvent() {
+               /* 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, false);
+
+                               logger.info("auto release : keycode=" + keyEventData.keycode +
+                                               ", stateMask=" + keyEventData.stateMask +
+                                               ", keyLocation=" + keyEventData.keyLocation);
+                       }
+               }
+
+               pressedKeyEventList.clear();
+       }
 }