{"id":819561,"url":"http://patchwork.ozlabs.org/api/patches/819561/?format=json","web_url":"http://patchwork.ozlabs.org/project/qemu-devel/patch/20170928120621.30288-5-berrange@redhat.com/","project":{"id":14,"url":"http://patchwork.ozlabs.org/api/projects/14/?format=json","name":"QEMU Development","link_name":"qemu-devel","list_id":"qemu-devel.nongnu.org","list_email":"qemu-devel@nongnu.org","web_url":"","scm_url":"","webscm_url":"","list_archive_url":"","list_archive_url_format":"","commit_url_format":""},"msgid":"<20170928120621.30288-5-berrange@redhat.com>","list_archive_url":null,"date":"2017-09-28T12:06:19","name":"[v7,4/6] ui: convert common input code to keycodemapdb","commit_ref":null,"pull_url":null,"state":"new","archived":false,"hash":"6fc586f7d01d67cde20fcd41e47d329591be97c4","submitter":{"id":2694,"url":"http://patchwork.ozlabs.org/api/people/2694/?format=json","name":"Daniel P. Berrangé","email":"berrange@redhat.com"},"delegate":null,"mbox":"http://patchwork.ozlabs.org/project/qemu-devel/patch/20170928120621.30288-5-berrange@redhat.com/mbox/","series":[{"id":5547,"url":"http://patchwork.ozlabs.org/api/series/5547/?format=json","web_url":"http://patchwork.ozlabs.org/project/qemu-devel/list/?series=5547","date":"2017-09-28T12:06:16","name":"Initial support for keycodemapdb GIT submodule","version":7,"mbox":"http://patchwork.ozlabs.org/series/5547/mbox/"}],"comments":"http://patchwork.ozlabs.org/api/patches/819561/comments/","check":"pending","checks":"http://patchwork.ozlabs.org/api/patches/819561/checks/","tags":{},"related":[],"headers":{"Return-Path":"<qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org>","X-Original-To":"incoming@patchwork.ozlabs.org","Delivered-To":"patchwork-incoming@bilbo.ozlabs.org","Authentication-Results":["ozlabs.org;\n\tspf=pass (mailfrom) smtp.mailfrom=nongnu.org\n\t(client-ip=2001:4830:134:3::11; helo=lists.gnu.org;\n\tenvelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org;\n\treceiver=<UNKNOWN>)","ext-mx01.extmail.prod.ext.phx2.redhat.com;\n\tdmarc=none (p=none dis=none) header.from=redhat.com","ext-mx01.extmail.prod.ext.phx2.redhat.com;\n\tspf=fail smtp.mailfrom=berrange@redhat.com"],"Received":["from lists.gnu.org (lists.gnu.org [IPv6:2001:4830:134:3::11])\n\t(using TLSv1 with cipher AES256-SHA (256/256 bits))\n\t(No client certificate requested)\n\tby ozlabs.org (Postfix) with ESMTPS id 3y2tpj0G3jz9t5l\n\tfor <incoming@patchwork.ozlabs.org>;\n\tThu, 28 Sep 2017 22:11:57 +1000 (AEST)","from localhost ([::1]:58983 helo=lists.gnu.org)\n\tby lists.gnu.org with esmtp (Exim 4.71) (envelope-from\n\t<qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org>)\n\tid 1dxXfX-0004EV-2E\n\tfor incoming@patchwork.ozlabs.org; Thu, 28 Sep 2017 08:11:55 -0400","from eggs.gnu.org ([2001:4830:134:3::10]:44557)\n\tby lists.gnu.org with esmtp (Exim 4.71)\n\t(envelope-from <berrange@redhat.com>) id 1dxXaa-0000MK-8s\n\tfor qemu-devel@nongnu.org; Thu, 28 Sep 2017 08:06:59 -0400","from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71)\n\t(envelope-from <berrange@redhat.com>) id 1dxXaT-0007nh-6l\n\tfor qemu-devel@nongnu.org; Thu, 28 Sep 2017 08:06:48 -0400","from mx1.redhat.com ([209.132.183.28]:2285)\n\tby eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32)\n\t(Exim 4.71) (envelope-from <berrange@redhat.com>) id 1dxXaS-0007nW-Uo\n\tfor qemu-devel@nongnu.org; Thu, 28 Sep 2017 08:06:41 -0400","from smtp.corp.redhat.com\n\t(int-mx04.intmail.prod.int.phx2.redhat.com [10.5.11.14])\n\t(using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits))\n\t(No client certificate requested)\n\tby mx1.redhat.com (Postfix) with ESMTPS id 112E4B6D08;\n\tThu, 28 Sep 2017 12:06:40 +0000 (UTC)","from t460.redhat.com (unknown [10.33.36.70])\n\tby smtp.corp.redhat.com (Postfix) with ESMTP id D644E90C69;\n\tThu, 28 Sep 2017 12:06:37 +0000 (UTC)"],"DMARC-Filter":"OpenDMARC Filter v1.3.2 mx1.redhat.com 112E4B6D08","From":"\"Daniel P. Berrange\" <berrange@redhat.com>","To":"qemu-devel@nongnu.org","Date":"Thu, 28 Sep 2017 13:06:19 +0100","Message-Id":"<20170928120621.30288-5-berrange@redhat.com>","In-Reply-To":"<20170928120621.30288-1-berrange@redhat.com>","References":"<20170928120621.30288-1-berrange@redhat.com>","X-Scanned-By":"MIMEDefang 2.79 on 10.5.11.14","X-Greylist":"Sender IP whitelisted, not delayed by milter-greylist-4.5.16\n\t(mx1.redhat.com [10.5.110.25]);\n\tThu, 28 Sep 2017 12:06:40 +0000 (UTC)","X-detected-operating-system":"by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic]\n\t[fuzzy]","X-Received-From":"209.132.183.28","Subject":"[Qemu-devel] [PATCH v7 4/6] ui: convert common input code to\n\tkeycodemapdb","X-BeenThere":"qemu-devel@nongnu.org","X-Mailman-Version":"2.1.21","Precedence":"list","List-Id":"<qemu-devel.nongnu.org>","List-Unsubscribe":"<https://lists.nongnu.org/mailman/options/qemu-devel>,\n\t<mailto:qemu-devel-request@nongnu.org?subject=unsubscribe>","List-Archive":"<http://lists.nongnu.org/archive/html/qemu-devel/>","List-Post":"<mailto:qemu-devel@nongnu.org>","List-Help":"<mailto:qemu-devel-request@nongnu.org?subject=help>","List-Subscribe":"<https://lists.nongnu.org/mailman/listinfo/qemu-devel>,\n\t<mailto:qemu-devel-request@nongnu.org?subject=subscribe>","Cc":"Peter Maydell <peter.maydell@linaro.org>, Fam Zheng <famz@redhat.com>,\n\tGerd Hoffmann <kraxel@redhat.com>, Paolo Bonzini <pbonzini@redhat.com>","Errors-To":"qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org","Sender":"\"Qemu-devel\"\n\t<qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org>"},"content":"Replace the number_to_qcode, qcode_to_number and linux_to_qcode\ntables with automatically generated tables.\n\nMissing entries in linux_to_qcode now fixed:\n\n  KEY_LINEFEED -> Q_KEY_CODE_LF\n  KEY_KPEQUAL -> Q_KEY_CODE_KP_EQUALS\n  KEY_COMPOSE -> Q_KEY_CODE_COMPOSE\n  KEY_AGAIN -> Q_KEY_CODE_AGAIN\n  KEY_PROPS -> Q_KEY_CODE_PROPS\n  KEY_UNDO -> Q_KEY_CODE_UNDO\n  KEY_FRONT -> Q_KEY_CODE_FRONT\n  KEY_COPY -> Q_KEY_CODE_COPY\n  KEY_OPEN -> Q_KEY_CODE_OPEN\n  KEY_PASTE -> Q_KEY_CODE_PASTE\n  KEY_CUT -> Q_KEY_CODE_CUT\n  KEY_HELP -> Q_KEY_CODE_HELP\n  KEY_MEDIA -> Q_KEY_CODE_MEDIASELECT\n\nIn additionsome fixes:\n\n - KEY_PLAYPAUSE now maps to Q_KEY_CODE_AUDIOPLAY, instead of\n   KEY_PLAYCD. KEY_PLAYPAUSE is defined across almost all scancodes\n   sets, while KEY_PLAYCD only appears in AT set1, so the former is\n   a more useful mapping.\n\nMissing entries in qcode_to_number now fixed:\n\n  Q_KEY_CODE_AGAIN -> 0x85\n  Q_KEY_CODE_PROPS -> 0x86\n  Q_KEY_CODE_UNDO -> 0x87\n  Q_KEY_CODE_FRONT -> 0x8c\n  Q_KEY_CODE_COPY -> 0xf8\n  Q_KEY_CODE_OPEN -> 0x64\n  Q_KEY_CODE_PASTE -> 0x65\n  Q_KEY_CODE_CUT -> 0xbc\n  Q_KEY_CODE_LF -> 0x5b\n  Q_KEY_CODE_HELP -> 0xf5\n  Q_KEY_CODE_COMPOSE -> 0xdd\n  Q_KEY_CODE_KP_EQUALS -> 0x59\n  Q_KEY_CODE_MEDIASELECT -> 0xed\n\nIn addition some fixes:\n\n - Q_KEY_CODE_MENU was incorrectly mapped to the compose\n   scancode (0xdd) and is now mapped to 0x9e\n - Q_KEY_CODE_FIND was mapped to 0xe065 (Search) instead\n   of to 0xe041 (Find)\n - Q_KEY_CODE_HIRAGANA was mapped to 0x70 (Katakanahiragana)\n   instead of of 0x77 (Hirigana)\n - Q_KEY_CODE_PRINT was mapped to 0xb7 which is not a defined\n   scan code in AT set 1, it is now mapped to 0x54 (sysrq)\n\nSigned-off-by: Daniel P. Berrange <berrange@redhat.com>\n---\n include/ui/input.h |  11 +-\n ui/Makefile.objs   |   3 +\n ui/input-keymap.c  | 326 +++--------------------------------------------------\n 3 files changed, 28 insertions(+), 312 deletions(-)","diff":"diff --git a/include/ui/input.h b/include/ui/input.h\nindex c488585def..479cc46cfc 100644\n--- a/include/ui/input.h\n+++ b/include/ui/input.h\n@@ -43,7 +43,7 @@ void qemu_input_event_send_key(QemuConsole *src, KeyValue *key, bool down);\n void qemu_input_event_send_key_number(QemuConsole *src, int num, bool down);\n void qemu_input_event_send_key_qcode(QemuConsole *src, QKeyCode q, bool down);\n void qemu_input_event_send_key_delay(uint32_t delay_ms);\n-int qemu_input_key_number_to_qcode(uint8_t nr);\n+int qemu_input_key_number_to_qcode(unsigned int nr);\n int qemu_input_key_value_to_number(const KeyValue *value);\n int qemu_input_key_value_to_qcode(const KeyValue *value);\n int qemu_input_key_value_to_scancode(const KeyValue *value, bool down,\n@@ -69,4 +69,13 @@ void qemu_input_check_mode_change(void);\n void qemu_add_mouse_mode_change_notifier(Notifier *notify);\n void qemu_remove_mouse_mode_change_notifier(Notifier *notify);\n \n+extern const guint qemu_input_map_linux_to_qcode_len;\n+extern const guint16 qemu_input_map_linux_to_qcode[];\n+\n+extern const guint qemu_input_map_qcode_to_qnum_len;\n+extern const guint16 qemu_input_map_qcode_to_qnum[];\n+\n+extern const guint qemu_input_map_qnum_to_qcode_len;\n+extern const guint16 qemu_input_map_qnum_to_qcode[];\n+\n #endif /* INPUT_H */\ndiff --git a/ui/Makefile.objs b/ui/Makefile.objs\nindex a930afafe5..78d676738f 100644\n--- a/ui/Makefile.objs\n+++ b/ui/Makefile.objs\n@@ -55,6 +55,9 @@ KEYCODEMAP_GEN = $(SRC_PATH)/ui/keycodemapdb/tools/keymap-gen\n KEYCODEMAP_CSV = $(SRC_PATH)/ui/keycodemapdb/data/keymaps.csv\n \n KEYCODEMAP_FILES = \\\n+\t\t ui/input-keymap-linux-to-qcode.c \\\n+\t\t ui/input-keymap-qcode-to-qnum.c \\\n+\t\t ui/input-keymap-qnum-to-qcode.c \\\n \t\t $(NULL)\n \n GENERATED_FILES += $(KEYCODEMAP_FILES)\ndiff --git a/ui/input-keymap.c b/ui/input-keymap.c\nindex cf979c2ce9..3a19a169f5 100644\n--- a/ui/input-keymap.c\n+++ b/ui/input-keymap.c\n@@ -5,333 +5,37 @@\n \n #include \"standard-headers/linux/input.h\"\n \n-static int linux_to_qcode[KEY_CNT] = {\n-    [KEY_ESC]            = Q_KEY_CODE_ESC,\n-    [KEY_1]              = Q_KEY_CODE_1,\n-    [KEY_2]              = Q_KEY_CODE_2,\n-    [KEY_3]              = Q_KEY_CODE_3,\n-    [KEY_4]              = Q_KEY_CODE_4,\n-    [KEY_5]              = Q_KEY_CODE_5,\n-    [KEY_6]              = Q_KEY_CODE_6,\n-    [KEY_7]              = Q_KEY_CODE_7,\n-    [KEY_8]              = Q_KEY_CODE_8,\n-    [KEY_9]              = Q_KEY_CODE_9,\n-    [KEY_0]              = Q_KEY_CODE_0,\n-    [KEY_MINUS]          = Q_KEY_CODE_MINUS,\n-    [KEY_EQUAL]          = Q_KEY_CODE_EQUAL,\n-    [KEY_BACKSPACE]      = Q_KEY_CODE_BACKSPACE,\n-    [KEY_TAB]            = Q_KEY_CODE_TAB,\n-    [KEY_Q]              = Q_KEY_CODE_Q,\n-    [KEY_W]              = Q_KEY_CODE_W,\n-    [KEY_E]              = Q_KEY_CODE_E,\n-    [KEY_R]              = Q_KEY_CODE_R,\n-    [KEY_T]              = Q_KEY_CODE_T,\n-    [KEY_Y]              = Q_KEY_CODE_Y,\n-    [KEY_U]              = Q_KEY_CODE_U,\n-    [KEY_I]              = Q_KEY_CODE_I,\n-    [KEY_O]              = Q_KEY_CODE_O,\n-    [KEY_P]              = Q_KEY_CODE_P,\n-    [KEY_LEFTBRACE]      = Q_KEY_CODE_BRACKET_LEFT,\n-    [KEY_RIGHTBRACE]     = Q_KEY_CODE_BRACKET_RIGHT,\n-    [KEY_ENTER]          = Q_KEY_CODE_RET,\n-    [KEY_LEFTCTRL]       = Q_KEY_CODE_CTRL,\n-    [KEY_A]              = Q_KEY_CODE_A,\n-    [KEY_S]              = Q_KEY_CODE_S,\n-    [KEY_D]              = Q_KEY_CODE_D,\n-    [KEY_F]              = Q_KEY_CODE_F,\n-    [KEY_G]              = Q_KEY_CODE_G,\n-    [KEY_H]              = Q_KEY_CODE_H,\n-    [KEY_J]              = Q_KEY_CODE_J,\n-    [KEY_K]              = Q_KEY_CODE_K,\n-    [KEY_L]              = Q_KEY_CODE_L,\n-    [KEY_SEMICOLON]      = Q_KEY_CODE_SEMICOLON,\n-    [KEY_APOSTROPHE]     = Q_KEY_CODE_APOSTROPHE,\n-    [KEY_GRAVE]          = Q_KEY_CODE_GRAVE_ACCENT,\n-    [KEY_LEFTSHIFT]      = Q_KEY_CODE_SHIFT,\n-    [KEY_BACKSLASH]      = Q_KEY_CODE_BACKSLASH,\n-    [KEY_102ND]          = Q_KEY_CODE_LESS,\n-    [KEY_Z]              = Q_KEY_CODE_Z,\n-    [KEY_X]              = Q_KEY_CODE_X,\n-    [KEY_C]              = Q_KEY_CODE_C,\n-    [KEY_V]              = Q_KEY_CODE_V,\n-    [KEY_B]              = Q_KEY_CODE_B,\n-    [KEY_N]              = Q_KEY_CODE_N,\n-    [KEY_M]              = Q_KEY_CODE_M,\n-    [KEY_COMMA]          = Q_KEY_CODE_COMMA,\n-    [KEY_DOT]            = Q_KEY_CODE_DOT,\n-    [KEY_SLASH]          = Q_KEY_CODE_SLASH,\n-    [KEY_RIGHTSHIFT]     = Q_KEY_CODE_SHIFT_R,\n-    [KEY_LEFTALT]        = Q_KEY_CODE_ALT,\n-    [KEY_SPACE]          = Q_KEY_CODE_SPC,\n-    [KEY_CAPSLOCK]       = Q_KEY_CODE_CAPS_LOCK,\n-    [KEY_F1]             = Q_KEY_CODE_F1,\n-    [KEY_F2]             = Q_KEY_CODE_F2,\n-    [KEY_F3]             = Q_KEY_CODE_F3,\n-    [KEY_F4]             = Q_KEY_CODE_F4,\n-    [KEY_F5]             = Q_KEY_CODE_F5,\n-    [KEY_F6]             = Q_KEY_CODE_F6,\n-    [KEY_F7]             = Q_KEY_CODE_F7,\n-    [KEY_F8]             = Q_KEY_CODE_F8,\n-    [KEY_F9]             = Q_KEY_CODE_F9,\n-    [KEY_F10]            = Q_KEY_CODE_F10,\n-    [KEY_NUMLOCK]        = Q_KEY_CODE_NUM_LOCK,\n-    [KEY_SCROLLLOCK]     = Q_KEY_CODE_SCROLL_LOCK,\n-    [KEY_KP0]            = Q_KEY_CODE_KP_0,\n-    [KEY_KP1]            = Q_KEY_CODE_KP_1,\n-    [KEY_KP2]            = Q_KEY_CODE_KP_2,\n-    [KEY_KP3]            = Q_KEY_CODE_KP_3,\n-    [KEY_KP4]            = Q_KEY_CODE_KP_4,\n-    [KEY_KP5]            = Q_KEY_CODE_KP_5,\n-    [KEY_KP6]            = Q_KEY_CODE_KP_6,\n-    [KEY_KP7]            = Q_KEY_CODE_KP_7,\n-    [KEY_KP8]            = Q_KEY_CODE_KP_8,\n-    [KEY_KP9]            = Q_KEY_CODE_KP_9,\n-    [KEY_KPMINUS]        = Q_KEY_CODE_KP_SUBTRACT,\n-    [KEY_KPPLUS]         = Q_KEY_CODE_KP_ADD,\n-    [KEY_KPDOT]          = Q_KEY_CODE_KP_DECIMAL,\n-    [KEY_KPENTER]        = Q_KEY_CODE_KP_ENTER,\n-    [KEY_KPSLASH]        = Q_KEY_CODE_KP_DIVIDE,\n-    [KEY_KPASTERISK]     = Q_KEY_CODE_KP_MULTIPLY,\n-    [KEY_F11]            = Q_KEY_CODE_F11,\n-    [KEY_F12]            = Q_KEY_CODE_F12,\n-    [KEY_RO]             = Q_KEY_CODE_RO,\n-    [KEY_HIRAGANA]       = Q_KEY_CODE_HIRAGANA,\n-    [KEY_HENKAN]         = Q_KEY_CODE_HENKAN,\n-    [KEY_RIGHTCTRL]      = Q_KEY_CODE_CTRL_R,\n-    [KEY_SYSRQ]          = Q_KEY_CODE_SYSRQ,\n-    [KEY_RIGHTALT]       = Q_KEY_CODE_ALT_R,\n-    [KEY_HOME]           = Q_KEY_CODE_HOME,\n-    [KEY_UP]             = Q_KEY_CODE_UP,\n-    [KEY_PAGEUP]         = Q_KEY_CODE_PGUP,\n-    [KEY_LEFT]           = Q_KEY_CODE_LEFT,\n-    [KEY_RIGHT]          = Q_KEY_CODE_RIGHT,\n-    [KEY_END]            = Q_KEY_CODE_END,\n-    [KEY_DOWN]           = Q_KEY_CODE_DOWN,\n-    [KEY_PAGEDOWN]       = Q_KEY_CODE_PGDN,\n-    [KEY_INSERT]         = Q_KEY_CODE_INSERT,\n-    [KEY_DELETE]         = Q_KEY_CODE_DELETE,\n-    [KEY_POWER]          = Q_KEY_CODE_POWER,\n-    [KEY_KPCOMMA]        = Q_KEY_CODE_KP_COMMA,\n-    [KEY_YEN]            = Q_KEY_CODE_YEN,\n-    [KEY_LEFTMETA]       = Q_KEY_CODE_META_L,\n-    [KEY_RIGHTMETA]      = Q_KEY_CODE_META_R,\n-    [KEY_MENU]           = Q_KEY_CODE_MENU,\n-    [KEY_PAUSE]          = Q_KEY_CODE_PAUSE,\n-\n-    [KEY_SLEEP]          = Q_KEY_CODE_SLEEP,\n-    [KEY_WAKEUP]         = Q_KEY_CODE_WAKE,\n-    [KEY_CALC]           = Q_KEY_CODE_CALCULATOR,\n-    [KEY_MAIL]           = Q_KEY_CODE_MAIL,\n-    [KEY_COMPUTER]       = Q_KEY_CODE_COMPUTER,\n-\n-    [KEY_STOP]           = Q_KEY_CODE_STOP,\n-    [KEY_BOOKMARKS]      = Q_KEY_CODE_AC_BOOKMARKS,\n-    [KEY_BACK]           = Q_KEY_CODE_AC_BACK,\n-    [KEY_FORWARD]        = Q_KEY_CODE_AC_FORWARD,\n-    [KEY_HOMEPAGE]       = Q_KEY_CODE_AC_HOME,\n-    [KEY_REFRESH]        = Q_KEY_CODE_AC_REFRESH,\n-    [KEY_FIND]           = Q_KEY_CODE_FIND,\n-\n-    [KEY_NEXTSONG]       = Q_KEY_CODE_AUDIONEXT,\n-    [KEY_PREVIOUSSONG]   = Q_KEY_CODE_AUDIOPREV,\n-    [KEY_STOPCD]         = Q_KEY_CODE_AUDIOSTOP,\n-    [KEY_PLAYCD]         = Q_KEY_CODE_AUDIOPLAY,\n-    [KEY_MUTE]           = Q_KEY_CODE_AUDIOMUTE,\n-    [KEY_VOLUMEDOWN]     = Q_KEY_CODE_VOLUMEDOWN,\n-    [KEY_VOLUMEUP]       = Q_KEY_CODE_VOLUMEUP,\n-};\n-\n-static const int qcode_to_number[] = {\n-    [Q_KEY_CODE_SHIFT] = 0x2a,\n-    [Q_KEY_CODE_SHIFT_R] = 0x36,\n-\n-    [Q_KEY_CODE_ALT] = 0x38,\n-    [Q_KEY_CODE_ALT_R] = 0xb8,\n-    [Q_KEY_CODE_CTRL] = 0x1d,\n-    [Q_KEY_CODE_CTRL_R] = 0x9d,\n-\n-    [Q_KEY_CODE_META_L] = 0xdb,\n-    [Q_KEY_CODE_META_R] = 0xdc,\n-    [Q_KEY_CODE_MENU] = 0xdd,\n-\n-    [Q_KEY_CODE_ESC] = 0x01,\n-\n-    [Q_KEY_CODE_1] = 0x02,\n-    [Q_KEY_CODE_2] = 0x03,\n-    [Q_KEY_CODE_3] = 0x04,\n-    [Q_KEY_CODE_4] = 0x05,\n-    [Q_KEY_CODE_5] = 0x06,\n-    [Q_KEY_CODE_6] = 0x07,\n-    [Q_KEY_CODE_7] = 0x08,\n-    [Q_KEY_CODE_8] = 0x09,\n-    [Q_KEY_CODE_9] = 0x0a,\n-    [Q_KEY_CODE_0] = 0x0b,\n-    [Q_KEY_CODE_MINUS] = 0x0c,\n-    [Q_KEY_CODE_EQUAL] = 0x0d,\n-    [Q_KEY_CODE_BACKSPACE] = 0x0e,\n-\n-    [Q_KEY_CODE_TAB] = 0x0f,\n-    [Q_KEY_CODE_Q] = 0x10,\n-    [Q_KEY_CODE_W] = 0x11,\n-    [Q_KEY_CODE_E] = 0x12,\n-    [Q_KEY_CODE_R] = 0x13,\n-    [Q_KEY_CODE_T] = 0x14,\n-    [Q_KEY_CODE_Y] = 0x15,\n-    [Q_KEY_CODE_U] = 0x16,\n-    [Q_KEY_CODE_I] = 0x17,\n-    [Q_KEY_CODE_O] = 0x18,\n-    [Q_KEY_CODE_P] = 0x19,\n-    [Q_KEY_CODE_BRACKET_LEFT] = 0x1a,\n-    [Q_KEY_CODE_BRACKET_RIGHT] = 0x1b,\n-    [Q_KEY_CODE_RET] = 0x1c,\n-\n-    [Q_KEY_CODE_A] = 0x1e,\n-    [Q_KEY_CODE_S] = 0x1f,\n-    [Q_KEY_CODE_D] = 0x20,\n-    [Q_KEY_CODE_F] = 0x21,\n-    [Q_KEY_CODE_G] = 0x22,\n-    [Q_KEY_CODE_H] = 0x23,\n-    [Q_KEY_CODE_J] = 0x24,\n-    [Q_KEY_CODE_K] = 0x25,\n-    [Q_KEY_CODE_L] = 0x26,\n-    [Q_KEY_CODE_SEMICOLON] = 0x27,\n-    [Q_KEY_CODE_APOSTROPHE] = 0x28,\n-    [Q_KEY_CODE_GRAVE_ACCENT] = 0x29,\n-\n-    [Q_KEY_CODE_BACKSLASH] = 0x2b,\n-    [Q_KEY_CODE_Z] = 0x2c,\n-    [Q_KEY_CODE_X] = 0x2d,\n-    [Q_KEY_CODE_C] = 0x2e,\n-    [Q_KEY_CODE_V] = 0x2f,\n-    [Q_KEY_CODE_B] = 0x30,\n-    [Q_KEY_CODE_N] = 0x31,\n-    [Q_KEY_CODE_M] = 0x32,\n-    [Q_KEY_CODE_COMMA] = 0x33,\n-    [Q_KEY_CODE_DOT] = 0x34,\n-    [Q_KEY_CODE_SLASH] = 0x35,\n-\n-    [Q_KEY_CODE_ASTERISK] = 0x37,\n-\n-    [Q_KEY_CODE_SPC] = 0x39,\n-    [Q_KEY_CODE_CAPS_LOCK] = 0x3a,\n-    [Q_KEY_CODE_F1] = 0x3b,\n-    [Q_KEY_CODE_F2] = 0x3c,\n-    [Q_KEY_CODE_F3] = 0x3d,\n-    [Q_KEY_CODE_F4] = 0x3e,\n-    [Q_KEY_CODE_F5] = 0x3f,\n-    [Q_KEY_CODE_F6] = 0x40,\n-    [Q_KEY_CODE_F7] = 0x41,\n-    [Q_KEY_CODE_F8] = 0x42,\n-    [Q_KEY_CODE_F9] = 0x43,\n-    [Q_KEY_CODE_F10] = 0x44,\n-    [Q_KEY_CODE_NUM_LOCK] = 0x45,\n-    [Q_KEY_CODE_SCROLL_LOCK] = 0x46,\n-\n-    [Q_KEY_CODE_KP_DIVIDE] = 0xb5,\n-    [Q_KEY_CODE_KP_MULTIPLY] = 0x37,\n-    [Q_KEY_CODE_KP_SUBTRACT] = 0x4a,\n-    [Q_KEY_CODE_KP_ADD] = 0x4e,\n-    [Q_KEY_CODE_KP_ENTER] = 0x9c,\n-    [Q_KEY_CODE_KP_DECIMAL] = 0x53,\n-    [Q_KEY_CODE_SYSRQ] = 0x54,\n-    [Q_KEY_CODE_PAUSE] = 0xc6,\n-\n-    [Q_KEY_CODE_KP_0] = 0x52,\n-    [Q_KEY_CODE_KP_1] = 0x4f,\n-    [Q_KEY_CODE_KP_2] = 0x50,\n-    [Q_KEY_CODE_KP_3] = 0x51,\n-    [Q_KEY_CODE_KP_4] = 0x4b,\n-    [Q_KEY_CODE_KP_5] = 0x4c,\n-    [Q_KEY_CODE_KP_6] = 0x4d,\n-    [Q_KEY_CODE_KP_7] = 0x47,\n-    [Q_KEY_CODE_KP_8] = 0x48,\n-    [Q_KEY_CODE_KP_9] = 0x49,\n-\n-    [Q_KEY_CODE_LESS] = 0x56,\n-\n-    [Q_KEY_CODE_F11] = 0x57,\n-    [Q_KEY_CODE_F12] = 0x58,\n-\n-    [Q_KEY_CODE_PRINT] = 0xb7,\n-\n-    [Q_KEY_CODE_HOME] = 0xc7,\n-    [Q_KEY_CODE_PGUP] = 0xc9,\n-    [Q_KEY_CODE_PGDN] = 0xd1,\n-    [Q_KEY_CODE_END] = 0xcf,\n-\n-    [Q_KEY_CODE_LEFT] = 0xcb,\n-    [Q_KEY_CODE_UP] = 0xc8,\n-    [Q_KEY_CODE_DOWN] = 0xd0,\n-    [Q_KEY_CODE_RIGHT] = 0xcd,\n-\n-    [Q_KEY_CODE_INSERT] = 0xd2,\n-    [Q_KEY_CODE_DELETE] = 0xd3,\n-\n-    [Q_KEY_CODE_RO] = 0x73,\n-    [Q_KEY_CODE_HIRAGANA] = 0x70,\n-    [Q_KEY_CODE_HENKAN] = 0x79,\n-    [Q_KEY_CODE_POWER] = 0xde,\n-    [Q_KEY_CODE_YEN] = 0x7d,\n-    [Q_KEY_CODE_KP_COMMA] = 0x7e,\n-\n-    [Q_KEY_CODE_SLEEP] = 0xdf,\n-    [Q_KEY_CODE_WAKE] = 0xe3,\n-    [Q_KEY_CODE_CALCULATOR] = 0xa1,\n-    [Q_KEY_CODE_MAIL] = 0xec,\n-    [Q_KEY_CODE_COMPUTER] = 0xeb,\n-\n-    [Q_KEY_CODE_STOP] = 0xe8,\n-    [Q_KEY_CODE_AC_BOOKMARKS] = 0xe6,\n-    [Q_KEY_CODE_AC_BACK] = 0xea,\n-    [Q_KEY_CODE_AC_FORWARD] = 0xe9,\n-    [Q_KEY_CODE_AC_HOME] = 0xb2,\n-    [Q_KEY_CODE_AC_REFRESH] = 0xe7,\n-    [Q_KEY_CODE_FIND] = 0xe5,\n-\n-    [Q_KEY_CODE_AUDIONEXT] = 0x99,\n-    [Q_KEY_CODE_AUDIOPREV] = 0x90,\n-    [Q_KEY_CODE_AUDIOSTOP] = 0xa4,\n-    [Q_KEY_CODE_AUDIOPLAY] = 0xa2,\n-    [Q_KEY_CODE_AUDIOMUTE] = 0xa0,\n-    [Q_KEY_CODE_VOLUMEDOWN] = 0xae,\n-    [Q_KEY_CODE_VOLUMEUP] = 0xb0,\n-\n-    [Q_KEY_CODE__MAX] = 0,\n-};\n-\n-static int number_to_qcode[0x100];\n+#include \"ui/input-keymap-linux-to-qcode.c\"\n+#include \"ui/input-keymap-qcode-to-qnum.c\"\n+#include \"ui/input-keymap-qnum-to-qcode.c\"\n \n int qemu_input_linux_to_qcode(unsigned int lnx)\n {\n-    assert(lnx < KEY_CNT);\n-    return linux_to_qcode[lnx];\n+    if (lnx >= qemu_input_map_linux_to_qcode_len) {\n+        return 0;\n+    }\n+    return qemu_input_map_linux_to_qcode[lnx];\n }\n \n int qemu_input_key_value_to_number(const KeyValue *value)\n {\n     if (value->type == KEY_VALUE_KIND_QCODE) {\n-        return qcode_to_number[value->u.qcode.data];\n+        if (value->u.qcode.data >= qemu_input_map_qcode_to_qnum_len) {\n+            return 0;\n+        }\n+        return qemu_input_map_qcode_to_qnum[value->u.qcode.data];\n     } else {\n         assert(value->type == KEY_VALUE_KIND_NUMBER);\n         return value->u.number.data;\n     }\n }\n \n-int qemu_input_key_number_to_qcode(uint8_t nr)\n+int qemu_input_key_number_to_qcode(unsigned int nr)\n {\n-    static int first = true;\n-\n-    if (first) {\n-        int qcode, number;\n-        first = false;\n-        for (qcode = 0; qcode < Q_KEY_CODE__MAX; qcode++) {\n-            number = qcode_to_number[qcode];\n-            assert(number < ARRAY_SIZE(number_to_qcode));\n-            number_to_qcode[number] = qcode;\n-        }\n+    if (nr >= qemu_input_map_qnum_to_qcode_len) {\n+        return 0;\n     }\n-\n-    return number_to_qcode[nr];\n+    return qemu_input_map_qnum_to_qcode[nr];\n }\n \n int qemu_input_key_value_to_qcode(const KeyValue *value)\n","prefixes":["v7","4/6"]}