keyboard: added checking-routine about whether device was realized
authorsungmin ha <sungmin82.ha@samsung.com>
Tue, 23 Jun 2015 10:49:45 +0000 (19:49 +0900)
committerSeokYeon Hwang <syeon.hwang@samsung.com>
Wed, 1 Jul 2015 05:36:47 +0000 (14:36 +0900)
Change-Id: I9515916648c3b52b07c4ebd0a8e0a46367c95b1f
Signed-off-by: sungmin ha <sungmin82.ha@samsung.com>
tizen/src/hw/virtio/maru_virtio_keyboard.c
tizen/src/hw/virtio/maru_virtio_keyboard.h
tizen/src/skin/maruskin_operation.c

index 745934b34d5da16a3666f8d36b74830c854f4d61..3b8b72736b119a8630dc8287039af7773ccffdde 100644 (file)
@@ -4,9 +4,11 @@
  * Copyright (c) 2011 - 2013 Samsung Electronics Co., Ltd All Rights Reserved
  *
  * Contact:
+ *  SungMin Ha <sungmin82.ha@samsung.com>
  *  Kitae Kim <kt920.kim@samsung.com>
  *  GiWoong Kim <giwoong.kim@samsung.com>
  *  SeokYeon Hwang <syeon.hwang@samsung.com>
+ *  SangHo Park <sangho.p@samsung.com>
  *  YeongKyoon Lee <yeongkyoon.lee@samsung.com>
  *
  * This program is free software; you can redistribute it and/or
 
 MULTI_DEBUG_CHANNEL(qemu, keyboard);
 
-VirtIOKeyboard *vkbd;
+static VirtIOKbdList *head = NULL;
+static VirtIOKbdList *curr = NULL;
 VirtQueueElement elem;
 
+static VirtIOKbdList* create_list(VirtIOKeyboard *vkbd)
+{
+    VirtIOKbdList *ptr = (VirtIOKbdList*)malloc(sizeof(VirtIOKbdList));
+    if (ptr == NULL) {
+        ERR("Node creation failed\n");
+        return NULL;
+    }
+
+    ptr->vkbd = vkbd;
+    ptr->next = NULL;
+
+    head = curr = ptr;
+    return ptr;
+}
+
+static VirtIOKbdList* add_to_list(VirtIOKeyboard *vkbd, bool add_to_end)
+{
+    if (head == NULL) {
+        return (create_list(vkbd));
+    }
+
+    VirtIOKbdList *ptr = (VirtIOKbdList*)malloc(sizeof(VirtIOKbdList));
+    if (ptr == NULL) {
+        ERR("Node creation failed\n");
+        return NULL;
+    }
+
+    ptr->vkbd = vkbd;
+    ptr->next = NULL;
+
+    if (add_to_end) {
+        curr->next = ptr;
+        curr = ptr;
+    } else {
+        ptr->next = head;
+        head = ptr;
+    }
+
+    return ptr;
+}
+
+static VirtIOKbdList* search_in_list(VirtIOKeyboard *vkbd, VirtIOKbdList **prev)
+{
+    VirtIOKbdList *ptr = head;
+    VirtIOKbdList *tmp = NULL;
+    bool found = false;
+
+    while (ptr != NULL) {
+        if (ptr->vkbd == vkbd) {
+            found = true;
+            break;
+        } else {
+            tmp = ptr;
+            ptr = ptr->next;
+        }
+    }
+
+    if (true == found) {
+        if (prev) {
+            *prev = tmp;
+        }
+        return ptr;
+    } else {
+        return NULL;
+    }
+}
+
+static int delete_from_list(VirtIOKeyboard *vkbd)
+{
+    VirtIOKbdList *prev = NULL;
+    VirtIOKbdList *del = NULL;
+
+    del = search_in_list(vkbd, &prev);
+    if (del == NULL) {
+        return -1;
+    } else {
+        if (prev != NULL) {
+            prev->next = del->next;
+        }
+
+        if (del == curr) {
+            curr = prev;
+        } else if (del == head) {
+            head = del->next;
+        }
+    }
+
+    free(del);
+    del = NULL;
+
+    return 0;
+}
+
 static void virtio_keyboard_handle(VirtIODevice *vdev, VirtQueue *vq)
 {
     VirtIOKeyboard *vkbd = (VirtIOKeyboard *)vdev;
@@ -117,6 +213,12 @@ void virtio_keyboard_event(int keycode)
     EmulKbdEvent kbdevt = {0};
     int *index = NULL;
 
+    if (!curr) {
+        TRACE("The keyboard device is not realized.\n");
+        return;
+    }
+
+    VirtIOKeyboard *vkbd = curr->vkbd;
     if (!vkbd) {
         ERR("VirtIOKeyboard is NULL.\n");
         return;
@@ -228,7 +330,7 @@ static void virtio_keyboard_bh(void *opaque)
 static void virtio_keyboard_device_realize(DeviceState *dev, Error **errp)
 {
     VirtIODevice *vdev = VIRTIO_DEVICE(dev);
-    vkbd = VIRTIO_KEYBOARD(vdev);
+    VirtIOKeyboard *vkbd = VIRTIO_KEYBOARD(vdev);
 
     INFO("initialize virtio-keyboard device\n");
 
@@ -248,6 +350,12 @@ static void virtio_keyboard_device_realize(DeviceState *dev, Error **errp)
 
     /* bottom half */
     vkbd->bh = qemu_bh_new(virtio_keyboard_bh, vkbd);
+
+    if (curr == NULL) {
+        create_list(vkbd);
+    } else {
+        add_to_list(vkbd, true);
+    }
 }
 
 static void virtio_keyboard_device_unrealize(DeviceState *dev, Error **errp)
@@ -255,6 +363,10 @@ static void virtio_keyboard_device_unrealize(DeviceState *dev, Error **errp)
     VirtIODevice *vdev = VIRTIO_DEVICE(dev);
     VirtIOKeyboard *vkbd = (VirtIOKeyboard *)vdev;
 
+    if (delete_from_list(vkbd) != 0) {
+        ERR("not exist vkbd ptr!\n");
+    }
+
     INFO("destroy device\n");
 
     if (vkbd->bh) {
@@ -268,6 +380,7 @@ static void virtio_keyboard_device_unrealize(DeviceState *dev, Error **errp)
 
 static void virtio_keyboard_device_reset(VirtIODevice *vdev)
 {
+    VirtIOKeyboard *vkbd = curr->vkbd;
     vkbd = VIRTIO_KEYBOARD(vdev);
 
     INFO("reset keyboard device\n");
index f3296bc89a952ddc3a4dfbd2f4427a73ab575ba2..c78075e2fff520610c9ff5664b19dfb3124d18a0 100644 (file)
@@ -65,6 +65,11 @@ typedef struct VirtIOKeyboard {
     QEMUBH          *bh;
 } VirtIOKeyboard;
 
+typedef struct VirtIOKbdList {
+    VirtIOKeyboard *vkbd;
+    struct VirtIOKbdList *next;
+} VirtIOKbdList;
+
 VirtIODevice *virtio_keyboard_init(DeviceState *dev);
 void virtio_keyboard_exit(VirtIODevice *vdev);
 
index 76128a4f4615d097b7d6d55c80a4cbee1db44996..e38fd2547e542965ea2239c4d427658494ad1cd9 100644 (file)
@@ -185,11 +185,6 @@ void do_mouse_event(int button_type, int event_type,
 }
 
 void do_qt_keyboard_key_event(int event_type, int keycode) {
-    if (is_host_keyboard_attached() == false) {
-        TRACE("ignore key event because keyboard device was dettached\n");
-        return;
-    }
-
     if (KEY_PRESSED == event_type) {
         TRACE("key pressed: %d\n", keycode);
         virtio_keyboard_event(keycode);