Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package neatvnc for openSUSE:Factory checked 
in at 2021-03-02 12:34:24
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/neatvnc (Old)
 and      /work/SRC/openSUSE:Factory/.neatvnc.new.2378 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "neatvnc"

Tue Mar  2 12:34:24 2021 rev:5 rq:875904 version:0.4.0

Changes:
--------
--- /work/SRC/openSUSE:Factory/neatvnc/neatvnc.changes  2020-10-05 
19:43:10.245789030 +0200
+++ /work/SRC/openSUSE:Factory/.neatvnc.new.2378/neatvnc.changes        
2021-03-02 12:45:50.244375264 +0100
@@ -1,0 +2,8 @@
+Sun Feb 28 20:42:39 UTC 2021 - Dirk M??ller <dmuel...@suse.com>
+
+- update to 0.4.0:
+  * This release adds support for the qemu extended key event. When this is
+    also supported by the client, key codes will be used instead of symbols
+    which eliminates the need for reverse key code lookup on the server-side. 
+
+-------------------------------------------------------------------

Old:
----
  v0.3.2.tar.gz

New:
----
  v0.4.0.tar.gz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ neatvnc.spec ++++++
--- /var/tmp/diff_new_pack.hoeGOE/_old  2021-03-02 12:45:50.824375766 +0100
+++ /var/tmp/diff_new_pack.hoeGOE/_new  2021-03-02 12:45:50.824375766 +0100
@@ -1,7 +1,7 @@
 #
 # spec file for package neatvnc
 #
-# Copyright (c) 2020 SUSE LLC
+# Copyright (c) 2021 SUSE LLC
 #
 # All modifications and additions to the file contributed by third parties
 # remain the property of their copyright owners, unless otherwise agreed
@@ -17,7 +17,7 @@
 
 
 Name:           neatvnc
-Version:        0.3.2
+Version:        0.4.0
 Release:        0
 Summary:        A VNC server library
 License:        ISC

++++++ v0.3.2.tar.gz -> v0.4.0.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/neatvnc-0.3.2/include/common.h 
new/neatvnc-0.4.0/include/common.h
--- old/neatvnc-0.3.2/include/common.h  2020-09-27 19:31:06.000000000 +0200
+++ new/neatvnc-0.4.0/include/common.h  2020-12-06 15:02:50.000000000 +0100
@@ -88,6 +88,7 @@
        uint32_t known_width;
        uint32_t known_height;
        struct cut_text cut_text;
+       bool is_qemu_key_ext_notified;
 };
 
 LIST_HEAD(nvnc_client_list, nvnc_client);
@@ -101,6 +102,7 @@
        char name[256];
        void* userdata;
        nvnc_key_fn key_fn;
+       nvnc_key_fn key_code_fn;
        nvnc_pointer_fn pointer_fn;
        nvnc_fb_req_fn fb_req_fn;
        nvnc_client_fn new_client_fn;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/neatvnc-0.3.2/include/neatvnc.h 
new/neatvnc-0.4.0/include/neatvnc.h
--- old/neatvnc-0.3.2/include/neatvnc.h 2020-09-27 19:31:06.000000000 +0200
+++ new/neatvnc-0.4.0/include/neatvnc.h 2020-12-06 15:02:50.000000000 +0100
@@ -37,7 +37,7 @@
        NVNC_FB_PARTIAL = 1 << 0, // The buffer contains only the damaged region
 };
 
-typedef void (*nvnc_key_fn)(struct nvnc_client*, uint32_t keysym,
+typedef void (*nvnc_key_fn)(struct nvnc_client*, uint32_t key,
                             bool is_pressed);
 typedef void (*nvnc_pointer_fn)(struct nvnc_client*, uint16_t x, uint16_t y,
                                 enum nvnc_button_mask);
@@ -67,6 +67,7 @@
 void nvnc_set_name(struct nvnc* self, const char* name);
 
 void nvnc_set_key_fn(struct nvnc* self, nvnc_key_fn);
+void nvnc_set_key_code_fn(struct nvnc* self, nvnc_key_fn);
 void nvnc_set_pointer_fn(struct nvnc* self, nvnc_pointer_fn);
 void nvnc_set_fb_req_fn(struct nvnc* self, nvnc_fb_req_fn);
 void nvnc_set_new_client_fn(struct nvnc* self, nvnc_client_fn);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/neatvnc-0.3.2/include/rfb-proto.h 
new/neatvnc-0.4.0/include/rfb-proto.h
--- old/neatvnc-0.3.2/include/rfb-proto.h       2020-09-27 19:31:06.000000000 
+0200
+++ new/neatvnc-0.4.0/include/rfb-proto.h       2020-12-06 15:02:50.000000000 
+0100
@@ -45,6 +45,11 @@
        RFB_CLIENT_TO_SERVER_KEY_EVENT = 4,
        RFB_CLIENT_TO_SERVER_POINTER_EVENT = 5,
        RFB_CLIENT_TO_SERVER_CLIENT_CUT_TEXT = 6,
+       RFB_CLIENT_TO_SERVER_QEMU = 255,
+};
+
+enum rfb_client_to_server_qemu_msg_type {
+       RFB_CLIENT_TO_SERVER_QEMU_KEY_EVENT = 0,
 };
 
 enum rfb_encodings {
@@ -59,6 +64,7 @@
        RFB_ENCODING_DESKTOPSIZE = -223,
        RFB_ENCODING_JPEG_HIGHQ = -23,
        RFB_ENCODING_JPEG_LOWQ = -32,
+       RFB_ENCODING_QEMU_EXT_KEY_EVENT = -258,
 };
 
 enum rfb_server_to_client_msg_type {
@@ -133,6 +139,14 @@
        uint32_t key;
 } RFB_PACKED;
 
+struct rfb_client_qemu_key_event_msg {
+       uint8_t type;
+       uint8_t subtype;
+       uint16_t down_flag;
+       uint32_t keysym;
+       uint32_t keycode;
+} RFB_PACKED;
+
 struct rfb_client_pointer_event_msg {
        uint8_t type;
        uint8_t button_mask;
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/neatvnc-0.3.2/meson.build 
new/neatvnc-0.4.0/meson.build
--- old/neatvnc-0.3.2/meson.build       2020-09-27 19:31:06.000000000 +0200
+++ new/neatvnc-0.4.0/meson.build       2020-12-06 15:02:50.000000000 +0100
@@ -1,7 +1,7 @@
 project(
        'neatvnc',
        'c',
-       version: '0.3.2',
+       version: '0.4.0',
        license: 'ISC',
        default_options: [
                'c_std=gnu11',
@@ -67,6 +67,7 @@
        'src/display.c',
        'src/tight.c',
        'src/enc-util.c',
+       'src/qnum-to-evdev.c',
 ]
 
 dependencies = [
@@ -88,7 +89,7 @@
        config.set('ENABLE_TLS', true)
 endif
 
-if host_system == 'linux' and cc.has_header('sys/sdt.h')
+if host_system == 'linux' and get_option('systemtap') and 
cc.has_header('sys/sdt.h')
        config.set('HAVE_USDT', true)
 endif
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/neatvnc-0.3.2/meson_options.txt 
new/neatvnc-0.4.0/meson_options.txt
--- old/neatvnc-0.3.2/meson_options.txt 2020-09-27 19:31:06.000000000 +0200
+++ new/neatvnc-0.4.0/meson_options.txt 2020-12-06 15:02:50.000000000 +0100
@@ -2,3 +2,4 @@
 option('examples', type: 'boolean', value: false, description: 'Build 
examples')
 option('jpeg', type: 'feature', value: 'auto', description: 'Enable JPEG 
compression')
 option('tls', type: 'feature', value: 'auto', description: 'Enable encryption 
& authentication')
+option('systemtap', type: 'boolean', value: false, description: 'Enable 
tracing using sdt')
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/neatvnc-0.3.2/src/qnum-to-evdev.c 
new/neatvnc-0.4.0/src/qnum-to-evdev.c
--- old/neatvnc-0.3.2/src/qnum-to-evdev.c       1970-01-01 01:00:00.000000000 
+0100
+++ new/neatvnc-0.4.0/src/qnum-to-evdev.c       2020-12-06 15:02:50.000000000 
+0100
@@ -0,0 +1,245 @@
+/*
+ * This file is auto-generated from keymaps.csv
+ * Database checksum 
sha256(76d68c10e97d37fe2ea459e210125ae41796253fb217e900bf2983ade13a7920)
+ * To re-generate, run:
+ *   keymap-gen code-map --lang=stdc keymaps.csv qnum linux
+*/
+const unsigned short code_map_qnum_to_linux[254] = {
+  [0x1] = 0x1, /* qnum:1 -> linux:1 (KEY_ESC) -> linux:1 (KEY_ESC) */
+  [0x2] = 0x2, /* qnum:2 -> linux:2 (KEY_1) -> linux:2 (KEY_1) */
+  [0x3] = 0x3, /* qnum:3 -> linux:3 (KEY_2) -> linux:3 (KEY_2) */
+  [0x4] = 0x4, /* qnum:4 -> linux:4 (KEY_3) -> linux:4 (KEY_3) */
+  [0x5] = 0x5, /* qnum:5 -> linux:5 (KEY_4) -> linux:5 (KEY_4) */
+  [0x6] = 0x6, /* qnum:6 -> linux:6 (KEY_5) -> linux:6 (KEY_5) */
+  [0x7] = 0x7, /* qnum:7 -> linux:7 (KEY_6) -> linux:7 (KEY_6) */
+  [0x8] = 0x8, /* qnum:8 -> linux:8 (KEY_7) -> linux:8 (KEY_7) */
+  [0x9] = 0x9, /* qnum:9 -> linux:9 (KEY_8) -> linux:9 (KEY_8) */
+  [0xa] = 0xa, /* qnum:10 -> linux:10 (KEY_9) -> linux:10 (KEY_9) */
+  [0xb] = 0xb, /* qnum:11 -> linux:11 (KEY_0) -> linux:11 (KEY_0) */
+  [0xc] = 0xc, /* qnum:12 -> linux:12 (KEY_MINUS) -> linux:12 (KEY_MINUS) */
+  [0xd] = 0xd, /* qnum:13 -> linux:13 (KEY_EQUAL) -> linux:13 (KEY_EQUAL) */
+  [0xe] = 0xe, /* qnum:14 -> linux:14 (KEY_BACKSPACE) -> linux:14 
(KEY_BACKSPACE) */
+  [0xf] = 0xf, /* qnum:15 -> linux:15 (KEY_TAB) -> linux:15 (KEY_TAB) */
+  [0x10] = 0x10, /* qnum:16 -> linux:16 (KEY_Q) -> linux:16 (KEY_Q) */
+  [0x11] = 0x11, /* qnum:17 -> linux:17 (KEY_W) -> linux:17 (KEY_W) */
+  [0x12] = 0x12, /* qnum:18 -> linux:18 (KEY_E) -> linux:18 (KEY_E) */
+  [0x13] = 0x13, /* qnum:19 -> linux:19 (KEY_R) -> linux:19 (KEY_R) */
+  [0x14] = 0x14, /* qnum:20 -> linux:20 (KEY_T) -> linux:20 (KEY_T) */
+  [0x15] = 0x15, /* qnum:21 -> linux:21 (KEY_Y) -> linux:21 (KEY_Y) */
+  [0x16] = 0x16, /* qnum:22 -> linux:22 (KEY_U) -> linux:22 (KEY_U) */
+  [0x17] = 0x17, /* qnum:23 -> linux:23 (KEY_I) -> linux:23 (KEY_I) */
+  [0x18] = 0x18, /* qnum:24 -> linux:24 (KEY_O) -> linux:24 (KEY_O) */
+  [0x19] = 0x19, /* qnum:25 -> linux:25 (KEY_P) -> linux:25 (KEY_P) */
+  [0x1a] = 0x1a, /* qnum:26 -> linux:26 (KEY_LEFTBRACE) -> linux:26 
(KEY_LEFTBRACE) */
+  [0x1b] = 0x1b, /* qnum:27 -> linux:27 (KEY_RIGHTBRACE) -> linux:27 
(KEY_RIGHTBRACE) */
+  [0x1c] = 0x1c, /* qnum:28 -> linux:28 (KEY_ENTER) -> linux:28 (KEY_ENTER) */
+  [0x1d] = 0x1d, /* qnum:29 -> linux:29 (KEY_LEFTCTRL) -> linux:29 
(KEY_LEFTCTRL) */
+  [0x1e] = 0x1e, /* qnum:30 -> linux:30 (KEY_A) -> linux:30 (KEY_A) */
+  [0x1f] = 0x1f, /* qnum:31 -> linux:31 (KEY_S) -> linux:31 (KEY_S) */
+  [0x20] = 0x20, /* qnum:32 -> linux:32 (KEY_D) -> linux:32 (KEY_D) */
+  [0x21] = 0x21, /* qnum:33 -> linux:33 (KEY_F) -> linux:33 (KEY_F) */
+  [0x22] = 0x22, /* qnum:34 -> linux:34 (KEY_G) -> linux:34 (KEY_G) */
+  [0x23] = 0x23, /* qnum:35 -> linux:35 (KEY_H) -> linux:35 (KEY_H) */
+  [0x24] = 0x24, /* qnum:36 -> linux:36 (KEY_J) -> linux:36 (KEY_J) */
+  [0x25] = 0x25, /* qnum:37 -> linux:37 (KEY_K) -> linux:37 (KEY_K) */
+  [0x26] = 0x26, /* qnum:38 -> linux:38 (KEY_L) -> linux:38 (KEY_L) */
+  [0x27] = 0x27, /* qnum:39 -> linux:39 (KEY_SEMICOLON) -> linux:39 
(KEY_SEMICOLON) */
+  [0x28] = 0x28, /* qnum:40 -> linux:40 (KEY_APOSTROPHE) -> linux:40 
(KEY_APOSTROPHE) */
+  [0x29] = 0x29, /* qnum:41 -> linux:41 (KEY_GRAVE) -> linux:41 (KEY_GRAVE) */
+  [0x2a] = 0x2a, /* qnum:42 -> linux:42 (KEY_LEFTSHIFT) -> linux:42 
(KEY_LEFTSHIFT) */
+  [0x2b] = 0x2b, /* qnum:43 -> linux:43 (KEY_BACKSLASH) -> linux:43 
(KEY_BACKSLASH) */
+  [0x2c] = 0x2c, /* qnum:44 -> linux:44 (KEY_Z) -> linux:44 (KEY_Z) */
+  [0x2d] = 0x2d, /* qnum:45 -> linux:45 (KEY_X) -> linux:45 (KEY_X) */
+  [0x2e] = 0x2e, /* qnum:46 -> linux:46 (KEY_C) -> linux:46 (KEY_C) */
+  [0x2f] = 0x2f, /* qnum:47 -> linux:47 (KEY_V) -> linux:47 (KEY_V) */
+  [0x30] = 0x30, /* qnum:48 -> linux:48 (KEY_B) -> linux:48 (KEY_B) */
+  [0x31] = 0x31, /* qnum:49 -> linux:49 (KEY_N) -> linux:49 (KEY_N) */
+  [0x32] = 0x32, /* qnum:50 -> linux:50 (KEY_M) -> linux:50 (KEY_M) */
+  [0x33] = 0x33, /* qnum:51 -> linux:51 (KEY_COMMA) -> linux:51 (KEY_COMMA) */
+  [0x34] = 0x34, /* qnum:52 -> linux:52 (KEY_DOT) -> linux:52 (KEY_DOT) */
+  [0x35] = 0x35, /* qnum:53 -> linux:53 (KEY_SLASH) -> linux:53 (KEY_SLASH) */
+  [0x36] = 0x36, /* qnum:54 -> linux:54 (KEY_RIGHTSHIFT) -> linux:54 
(KEY_RIGHTSHIFT) */
+  [0x37] = 0x37, /* qnum:55 -> linux:55 (KEY_KPASTERISK) -> linux:55 
(KEY_KPASTERISK) */
+  [0x38] = 0x38, /* qnum:56 -> linux:56 (KEY_LEFTALT) -> linux:56 
(KEY_LEFTALT) */
+  [0x39] = 0x39, /* qnum:57 -> linux:57 (KEY_SPACE) -> linux:57 (KEY_SPACE) */
+  [0x3a] = 0x3a, /* qnum:58 -> linux:58 (KEY_CAPSLOCK) -> linux:58 
(KEY_CAPSLOCK) */
+  [0x3b] = 0x3b, /* qnum:59 -> linux:59 (KEY_F1) -> linux:59 (KEY_F1) */
+  [0x3c] = 0x3c, /* qnum:60 -> linux:60 (KEY_F2) -> linux:60 (KEY_F2) */
+  [0x3d] = 0x3d, /* qnum:61 -> linux:61 (KEY_F3) -> linux:61 (KEY_F3) */
+  [0x3e] = 0x3e, /* qnum:62 -> linux:62 (KEY_F4) -> linux:62 (KEY_F4) */
+  [0x3f] = 0x3f, /* qnum:63 -> linux:63 (KEY_F5) -> linux:63 (KEY_F5) */
+  [0x40] = 0x40, /* qnum:64 -> linux:64 (KEY_F6) -> linux:64 (KEY_F6) */
+  [0x41] = 0x41, /* qnum:65 -> linux:65 (KEY_F7) -> linux:65 (KEY_F7) */
+  [0x42] = 0x42, /* qnum:66 -> linux:66 (KEY_F8) -> linux:66 (KEY_F8) */
+  [0x43] = 0x43, /* qnum:67 -> linux:67 (KEY_F9) -> linux:67 (KEY_F9) */
+  [0x44] = 0x44, /* qnum:68 -> linux:68 (KEY_F10) -> linux:68 (KEY_F10) */
+  [0x45] = 0x45, /* qnum:69 -> linux:69 (KEY_NUMLOCK) -> linux:69 
(KEY_NUMLOCK) */
+  [0x46] = 0x46, /* qnum:70 -> linux:70 (KEY_SCROLLLOCK) -> linux:70 
(KEY_SCROLLLOCK) */
+  [0x47] = 0x47, /* qnum:71 -> linux:71 (KEY_KP7) -> linux:71 (KEY_KP7) */
+  [0x48] = 0x48, /* qnum:72 -> linux:72 (KEY_KP8) -> linux:72 (KEY_KP8) */
+  [0x49] = 0x49, /* qnum:73 -> linux:73 (KEY_KP9) -> linux:73 (KEY_KP9) */
+  [0x4a] = 0x4a, /* qnum:74 -> linux:74 (KEY_KPMINUS) -> linux:74 
(KEY_KPMINUS) */
+  [0x4b] = 0x4b, /* qnum:75 -> linux:75 (KEY_KP4) -> linux:75 (KEY_KP4) */
+  [0x4c] = 0x4c, /* qnum:76 -> linux:76 (KEY_KP5) -> linux:76 (KEY_KP5) */
+  [0x4d] = 0x4d, /* qnum:77 -> linux:77 (KEY_KP6) -> linux:77 (KEY_KP6) */
+  [0x4e] = 0x4e, /* qnum:78 -> linux:78 (KEY_KPPLUS) -> linux:78 (KEY_KPPLUS) 
*/
+  [0x4f] = 0x4f, /* qnum:79 -> linux:79 (KEY_KP1) -> linux:79 (KEY_KP1) */
+  [0x50] = 0x50, /* qnum:80 -> linux:80 (KEY_KP2) -> linux:80 (KEY_KP2) */
+  [0x51] = 0x51, /* qnum:81 -> linux:81 (KEY_KP3) -> linux:81 (KEY_KP3) */
+  [0x52] = 0x52, /* qnum:82 -> linux:82 (KEY_KP0) -> linux:82 (KEY_KP0) */
+  [0x53] = 0x53, /* qnum:83 -> linux:83 (KEY_KPDOT) -> linux:83 (KEY_KPDOT) */
+  [0x54] = 0x63, /* qnum:84 -> linux:99 (KEY_SYSRQ) -> linux:99 (KEY_SYSRQ) */
+  [0x55] = 0xba, /* qnum:85 -> linux:186 (KEY_F16) -> linux:186 (KEY_F16) */
+  [0x56] = 0x56, /* qnum:86 -> linux:86 (KEY_102ND) -> linux:86 (KEY_102ND) */
+  [0x57] = 0x57, /* qnum:87 -> linux:87 (KEY_F11) -> linux:87 (KEY_F11) */
+  [0x58] = 0x58, /* qnum:88 -> linux:88 (KEY_F12) -> linux:88 (KEY_F12) */
+  [0x59] = 0x75, /* qnum:89 -> linux:117 (KEY_KPEQUAL) -> linux:117 
(KEY_KPEQUAL) */
+  [0x5a] = 0xbe, /* qnum:90 -> linux:190 (KEY_F20) -> linux:190 (KEY_F20) */
+  [0x5b] = 0x65, /* qnum:91 -> linux:101 (KEY_LINEFEED) -> linux:101 
(KEY_LINEFEED) */
+  [0x5c] = 0x5f, /* qnum:92 -> linux:95 (KEY_KPJPCOMMA) -> linux:95 
(KEY_KPJPCOMMA) */
+  [0x5d] = 0xb7, /* qnum:93 -> linux:183 (KEY_F13) -> linux:183 (KEY_F13) */
+  [0x5e] = 0xb8, /* qnum:94 -> linux:184 (KEY_F14) -> linux:184 (KEY_F14) */
+  [0x5f] = 0xb9, /* qnum:95 -> linux:185 (KEY_F15) -> linux:185 (KEY_F15) */
+  [0x63] = 0xa9, /* qnum:99 -> linux:169 (KEY_PHONE) -> linux:169 (KEY_PHONE) 
*/
+  [0x64] = 0x86, /* qnum:100 -> linux:134 (KEY_OPEN) -> linux:134 (KEY_OPEN) */
+  [0x65] = 0x87, /* qnum:101 -> linux:135 (KEY_PASTE) -> linux:135 (KEY_PASTE) 
*/
+  [0x66] = 0x8d, /* qnum:102 -> linux:141 (KEY_SETUP) -> linux:141 (KEY_SETUP) 
*/
+  [0x67] = 0x90, /* qnum:103 -> linux:144 (KEY_FILE) -> linux:144 (KEY_FILE) */
+  [0x68] = 0x91, /* qnum:104 -> linux:145 (KEY_SENDFILE) -> linux:145 
(KEY_SENDFILE) */
+  [0x69] = 0x92, /* qnum:105 -> linux:146 (KEY_DELETEFILE) -> linux:146 
(KEY_DELETEFILE) */
+  [0x6a] = 0x97, /* qnum:106 -> linux:151 (KEY_MSDOS) -> linux:151 (KEY_MSDOS) 
*/
+  [0x6b] = 0x99, /* qnum:107 -> linux:153 (KEY_DIRECTION) -> linux:153 
(KEY_DIRECTION) */
+  [0x6c] = 0xa1, /* qnum:108 -> linux:161 (KEY_EJECTCD) -> linux:161 
(KEY_EJECTCD) */
+  [0x6d] = 0xc1, /* qnum:109 -> linux:193 (KEY_F23) -> linux:193 (KEY_F23) */
+  [0x6f] = 0xc2, /* qnum:111 -> linux:194 (KEY_F24) -> linux:194 (KEY_F24) */
+  [0x70] = 0x5d, /* qnum:112 -> linux:93 (KEY_KATAKANAHIRAGANA) -> linux:93 
(KEY_KATAKANAHIRAGANA) */
+  [0x71] = 0x7b, /* qnum:113 -> linux:123 (KEY_HANJA) -> linux:123 (KEY_HANJA) 
*/
+  [0x72] = 0x7a, /* qnum:114 -> linux:122 (KEY_HANGEUL) -> linux:122 
(KEY_HANGEUL) */
+  [0x73] = 0x59, /* qnum:115 -> linux:89 (KEY_RO) -> linux:89 (KEY_RO) */
+  [0x74] = 0xbf, /* qnum:116 -> linux:191 (KEY_F21) -> linux:191 (KEY_F21) */
+  [0x75] = 0xb1, /* qnum:117 -> linux:177 (KEY_SCROLLUP) -> linux:177 
(KEY_SCROLLUP) */
+  [0x76] = 0x55, /* qnum:118 -> linux:85 (KEY_ZENKAKUHANKAKU) -> linux:85 
(KEY_ZENKAKUHANKAKU) */
+  [0x77] = 0x5b, /* qnum:119 -> linux:91 (KEY_HIRAGANA) -> linux:91 
(KEY_HIRAGANA) */
+  [0x78] = 0x5a, /* qnum:120 -> linux:90 (KEY_KATAKANA) -> linux:90 
(KEY_KATAKANA) */
+  [0x79] = 0x5c, /* qnum:121 -> linux:92 (KEY_HENKAN) -> linux:92 (KEY_HENKAN) 
*/
+  [0x7b] = 0x5e, /* qnum:123 -> linux:94 (KEY_MUHENKAN) -> linux:94 
(KEY_MUHENKAN) */
+  [0x7d] = 0x7c, /* qnum:125 -> linux:124 (KEY_YEN) -> linux:124 (KEY_YEN) */
+  [0x7e] = 0x79, /* qnum:126 -> linux:121 (KEY_KPCOMMA) -> linux:121 
(KEY_KPCOMMA) */
+  [0x81] = 0xab, /* qnum:129 -> linux:171 (KEY_CONFIG) -> linux:171 
(KEY_CONFIG) */
+  [0x82] = 0x96, /* qnum:130 -> linux:150 (KEY_WWW) -> linux:150 (KEY_WWW) */
+  [0x83] = 0xbb, /* qnum:131 -> linux:187 (KEY_F17) -> linux:187 (KEY_F17) */
+  [0x84] = 0xbd, /* qnum:132 -> linux:189 (KEY_F19) -> linux:189 (KEY_F19) */
+  [0x85] = 0x81, /* qnum:133 -> linux:129 (KEY_AGAIN) -> linux:129 (KEY_AGAIN) 
*/
+  [0x86] = 0x82, /* qnum:134 -> linux:130 (KEY_PROPS) -> linux:130 (KEY_PROPS) 
*/
+  [0x87] = 0x83, /* qnum:135 -> linux:131 (KEY_UNDO) -> linux:131 (KEY_UNDO) */
+  [0x88] = 0xb0, /* qnum:136 -> linux:176 (KEY_EDIT) -> linux:176 (KEY_EDIT) */
+  [0x89] = 0xb5, /* qnum:137 -> linux:181 (KEY_NEW) -> linux:181 (KEY_NEW) */
+  [0x8a] = 0xb6, /* qnum:138 -> linux:182 (KEY_REDO) -> linux:182 (KEY_REDO) */
+  [0x8b] = 0x78, /* qnum:139 -> linux:120 (KEY_SCALE) -> linux:120 (KEY_SCALE) 
*/
+  [0x8c] = 0x84, /* qnum:140 -> linux:132 (KEY_FRONT) -> linux:132 (KEY_FRONT) 
*/
+  [0x8e] = 0xe9, /* qnum:142 -> linux:233 (KEY_FORWARDMAIL) -> linux:233 
(KEY_FORWARDMAIL) */
+  [0x8f] = 0xb2, /* qnum:143 -> linux:178 (KEY_SCROLLDOWN) -> linux:178 
(KEY_SCROLLDOWN) */
+  [0x90] = 0xa5, /* qnum:144 -> linux:165 (KEY_PREVIOUSSONG) -> linux:165 
(KEY_PREVIOUSSONG) */
+  [0x92] = 0x98, /* qnum:146 -> linux:152 (KEY_SCREENLOCK) -> linux:152 
(KEY_SCREENLOCK) */
+  [0x93] = 0x93, /* qnum:147 -> linux:147 (KEY_XFER) -> linux:147 (KEY_XFER) */
+  [0x94] = 0xde, /* qnum:148 -> linux:222 (KEY_ALTERASE) -> linux:222 
(KEY_ALTERASE) */
+  [0x95] = 0xc3, /* qnum:149 -> linux:195 (unnamed) -> linux:195 (unnamed) */
+  [0x96] = 0xc4, /* qnum:150 -> linux:196 (unnamed) -> linux:196 (unnamed) */
+  [0x97] = 0x95, /* qnum:151 -> linux:149 (KEY_PROG2) -> linux:149 (KEY_PROG2) 
*/
+  [0x98] = 0xa8, /* qnum:152 -> linux:168 (KEY_REWIND) -> linux:168 
(KEY_REWIND) */
+  [0x99] = 0xa3, /* qnum:153 -> linux:163 (KEY_NEXTSONG) -> linux:163 
(KEY_NEXTSONG) */
+  [0x9a] = 0xc5, /* qnum:154 -> linux:197 (unnamed) -> linux:197 (unnamed) */
+  [0x9b] = 0xc6, /* qnum:155 -> linux:198 (unnamed) -> linux:198 (unnamed) */
+  [0x9c] = 0x60, /* qnum:156 -> linux:96 (KEY_KPENTER) -> linux:96 
(KEY_KPENTER) */
+  [0x9d] = 0x61, /* qnum:157 -> linux:97 (KEY_RIGHTCTRL) -> linux:97 
(KEY_RIGHTCTRL) */
+  [0x9e] = 0x8b, /* qnum:158 -> linux:139 (KEY_MENU) -> linux:139 (KEY_MENU) */
+  [0x9f] = 0x94, /* qnum:159 -> linux:148 (KEY_PROG1) -> linux:148 (KEY_PROG1) 
*/
+  [0xa0] = 0x71, /* qnum:160 -> linux:113 (KEY_MUTE) -> linux:113 (KEY_MUTE) */
+  [0xa1] = 0x8c, /* qnum:161 -> linux:140 (KEY_CALC) -> linux:140 (KEY_CALC) */
+  [0xa2] = 0xa4, /* qnum:162 -> linux:164 (KEY_PLAYPAUSE) -> linux:164 
(KEY_PLAYPAUSE) */
+  [0xa3] = 0xa0, /* qnum:163 -> linux:160 (KEY_CLOSECD) -> linux:160 
(KEY_CLOSECD) */
+  [0xa4] = 0xa6, /* qnum:164 -> linux:166 (KEY_STOPCD) -> linux:166 
(KEY_STOPCD) */
+  [0xa5] = 0xcd, /* qnum:165 -> linux:205 (KEY_SUSPEND) -> linux:205 
(KEY_SUSPEND) */
+  [0xa6] = 0x9a, /* qnum:166 -> linux:154 (KEY_CYCLEWINDOWS) -> linux:154 
(KEY_CYCLEWINDOWS) */
+  [0xa7] = 0xc7, /* qnum:167 -> linux:199 (unnamed) -> linux:199 (unnamed) */
+  [0xa8] = 0xc8, /* qnum:168 -> linux:200 (KEY_PLAYCD) -> linux:200 
(KEY_PLAYCD) */
+  [0xa9] = 0xc9, /* qnum:169 -> linux:201 (KEY_PAUSECD) -> linux:201 
(KEY_PAUSECD) */
+  [0xab] = 0xca, /* qnum:171 -> linux:202 (KEY_PROG3) -> linux:202 (KEY_PROG3) 
*/
+  [0xac] = 0xcb, /* qnum:172 -> linux:203 (KEY_PROG4) -> linux:203 (KEY_PROG4) 
*/
+  [0xad] = 0xcc, /* qnum:173 -> linux:204 (KEY_DASHBOARD) -> linux:204 
(KEY_DASHBOARD) */
+  [0xae] = 0x72, /* qnum:174 -> linux:114 (KEY_VOLUMEDOWN) -> linux:114 
(KEY_VOLUMEDOWN) */
+  [0xaf] = 0xce, /* qnum:175 -> linux:206 (KEY_CLOSE) -> linux:206 (KEY_CLOSE) 
*/
+  [0xb0] = 0x73, /* qnum:176 -> linux:115 (KEY_VOLUMEUP) -> linux:115 
(KEY_VOLUMEUP) */
+  [0xb1] = 0xa7, /* qnum:177 -> linux:167 (KEY_RECORD) -> linux:167 
(KEY_RECORD) */
+  [0xb2] = 0xac, /* qnum:178 -> linux:172 (KEY_HOMEPAGE) -> linux:172 
(KEY_HOMEPAGE) */
+  [0xb3] = 0xcf, /* qnum:179 -> linux:207 (KEY_PLAY) -> linux:207 (KEY_PLAY) */
+  [0xb4] = 0xd0, /* qnum:180 -> linux:208 (KEY_FASTFORWARD) -> linux:208 
(KEY_FASTFORWARD) */
+  [0xb5] = 0x62, /* qnum:181 -> linux:98 (KEY_KPSLASH) -> linux:98 
(KEY_KPSLASH) */
+  [0xb6] = 0xd1, /* qnum:182 -> linux:209 (KEY_BASSBOOST) -> linux:209 
(KEY_BASSBOOST) */
+  [0xb7] = 0x63, /* qnum:183 -> linux:99 (KEY_SYSRQ) -> linux:99 (KEY_SYSRQ) */
+  [0xb8] = 0x64, /* qnum:184 -> linux:100 (KEY_RIGHTALT) -> linux:100 
(KEY_RIGHTALT) */
+  [0xb9] = 0xd2, /* qnum:185 -> linux:210 (KEY_PRINT) -> linux:210 (KEY_PRINT) 
*/
+  [0xba] = 0xd3, /* qnum:186 -> linux:211 (KEY_HP) -> linux:211 (KEY_HP) */
+  [0xbb] = 0xd4, /* qnum:187 -> linux:212 (KEY_CAMERA) -> linux:212 
(KEY_CAMERA) */
+  [0xbc] = 0x89, /* qnum:188 -> linux:137 (KEY_CUT) -> linux:137 (KEY_CUT) */
+  [0xbd] = 0xd5, /* qnum:189 -> linux:213 (KEY_SOUND) -> linux:213 (KEY_SOUND) 
*/
+  [0xbe] = 0xd6, /* qnum:190 -> linux:214 (KEY_QUESTION) -> linux:214 
(KEY_QUESTION) */
+  [0xbf] = 0xd7, /* qnum:191 -> linux:215 (KEY_EMAIL) -> linux:215 (KEY_EMAIL) 
*/
+  [0xc0] = 0xd8, /* qnum:192 -> linux:216 (KEY_CHAT) -> linux:216 (KEY_CHAT) */
+  [0xc1] = 0x88, /* qnum:193 -> linux:136 (KEY_FIND) -> linux:136 (KEY_FIND) */
+  [0xc2] = 0xda, /* qnum:194 -> linux:218 (KEY_CONNECT) -> linux:218 
(KEY_CONNECT) */
+  [0xc3] = 0xdb, /* qnum:195 -> linux:219 (KEY_FINANCE) -> linux:219 
(KEY_FINANCE) */
+  [0xc4] = 0xdc, /* qnum:196 -> linux:220 (KEY_SPORT) -> linux:220 (KEY_SPORT) 
*/
+  [0xc5] = 0xdd, /* qnum:197 -> linux:221 (KEY_SHOP) -> linux:221 (KEY_SHOP) */
+  [0xc6] = 0x77, /* qnum:198 -> linux:119 (KEY_PAUSE) -> linux:119 (KEY_PAUSE) 
*/
+  [0xc7] = 0x66, /* qnum:199 -> linux:102 (KEY_HOME) -> linux:102 (KEY_HOME) */
+  [0xc8] = 0x67, /* qnum:200 -> linux:103 (KEY_UP) -> linux:103 (KEY_UP) */
+  [0xc9] = 0x68, /* qnum:201 -> linux:104 (KEY_PAGEUP) -> linux:104 
(KEY_PAGEUP) */
+  [0xca] = 0xdf, /* qnum:202 -> linux:223 (KEY_CANCEL) -> linux:223 
(KEY_CANCEL) */
+  [0xcb] = 0x69, /* qnum:203 -> linux:105 (KEY_LEFT) -> linux:105 (KEY_LEFT) */
+  [0xcc] = 0xe0, /* qnum:204 -> linux:224 (KEY_BRIGHTNESSDOWN) -> linux:224 
(KEY_BRIGHTNESSDOWN) */
+  [0xcd] = 0x6a, /* qnum:205 -> linux:106 (KEY_RIGHT) -> linux:106 (KEY_RIGHT) 
*/
+  [0xce] = 0x76, /* qnum:206 -> linux:118 (KEY_KPPLUSMINUS) -> linux:118 
(KEY_KPPLUSMINUS) */
+  [0xcf] = 0x6b, /* qnum:207 -> linux:107 (KEY_END) -> linux:107 (KEY_END) */
+  [0xd0] = 0x6c, /* qnum:208 -> linux:108 (KEY_DOWN) -> linux:108 (KEY_DOWN) */
+  [0xd1] = 0x6d, /* qnum:209 -> linux:109 (KEY_PAGEDOWN) -> linux:109 
(KEY_PAGEDOWN) */
+  [0xd2] = 0x6e, /* qnum:210 -> linux:110 (KEY_INSERT) -> linux:110 
(KEY_INSERT) */
+  [0xd3] = 0x6f, /* qnum:211 -> linux:111 (KEY_DELETE) -> linux:111 
(KEY_DELETE) */
+  [0xd4] = 0xe1, /* qnum:212 -> linux:225 (KEY_BRIGHTNESSUP) -> linux:225 
(KEY_BRIGHTNESSUP) */
+  [0xd5] = 0xea, /* qnum:213 -> linux:234 (KEY_SAVE) -> linux:234 (KEY_SAVE) */
+  [0xd6] = 0xe3, /* qnum:214 -> linux:227 (KEY_SWITCHVIDEOMODE) -> linux:227 
(KEY_SWITCHVIDEOMODE) */
+  [0xd7] = 0xe4, /* qnum:215 -> linux:228 (KEY_KBDILLUMTOGGLE) -> linux:228 
(KEY_KBDILLUMTOGGLE) */
+  [0xd8] = 0xe5, /* qnum:216 -> linux:229 (KEY_KBDILLUMDOWN) -> linux:229 
(KEY_KBDILLUMDOWN) */
+  [0xd9] = 0xe6, /* qnum:217 -> linux:230 (KEY_KBDILLUMUP) -> linux:230 
(KEY_KBDILLUMUP) */
+  [0xda] = 0xe7, /* qnum:218 -> linux:231 (KEY_SEND) -> linux:231 (KEY_SEND) */
+  [0xdb] = 0x7d, /* qnum:219 -> linux:125 (KEY_LEFTMETA) -> linux:125 
(KEY_LEFTMETA) */
+  [0xdc] = 0x7e, /* qnum:220 -> linux:126 (KEY_RIGHTMETA) -> linux:126 
(KEY_RIGHTMETA) */
+  [0xdd] = 0x7f, /* qnum:221 -> linux:127 (KEY_COMPOSE) -> linux:127 
(KEY_COMPOSE) */
+  [0xde] = 0x74, /* qnum:222 -> linux:116 (KEY_POWER) -> linux:116 (KEY_POWER) 
*/
+  [0xdf] = 0x8e, /* qnum:223 -> linux:142 (KEY_SLEEP) -> linux:142 (KEY_SLEEP) 
*/
+  [0xe3] = 0x8f, /* qnum:227 -> linux:143 (KEY_WAKEUP) -> linux:143 
(KEY_WAKEUP) */
+  [0xe4] = 0xe8, /* qnum:228 -> linux:232 (KEY_REPLY) -> linux:232 (KEY_REPLY) 
*/
+  [0xe5] = 0xd9, /* qnum:229 -> linux:217 (KEY_SEARCH) -> linux:217 
(KEY_SEARCH) */
+  [0xe6] = 0x9c, /* qnum:230 -> linux:156 (KEY_BOOKMARKS) -> linux:156 
(KEY_BOOKMARKS) */
+  [0xe7] = 0xad, /* qnum:231 -> linux:173 (KEY_REFRESH) -> linux:173 
(KEY_REFRESH) */
+  [0xe8] = 0x80, /* qnum:232 -> linux:128 (KEY_STOP) -> linux:128 (KEY_STOP) */
+  [0xe9] = 0x9f, /* qnum:233 -> linux:159 (KEY_FORWARD) -> linux:159 
(KEY_FORWARD) */
+  [0xea] = 0x9e, /* qnum:234 -> linux:158 (KEY_BACK) -> linux:158 (KEY_BACK) */
+  [0xeb] = 0x9d, /* qnum:235 -> linux:157 (KEY_COMPUTER) -> linux:157 
(KEY_COMPUTER) */
+  [0xec] = 0x9b, /* qnum:236 -> linux:155 (KEY_MAIL) -> linux:155 (KEY_MAIL) */
+  [0xed] = 0xe2, /* qnum:237 -> linux:226 (KEY_MEDIA) -> linux:226 (KEY_MEDIA) 
*/
+  [0xef] = 0x70, /* qnum:239 -> linux:112 (KEY_MACRO) -> linux:112 (KEY_MACRO) 
*/
+  [0xf0] = 0xeb, /* qnum:240 -> linux:235 (KEY_DOCUMENTS) -> linux:235 
(KEY_DOCUMENTS) */
+  [0xf1] = 0xec, /* qnum:241 -> linux:236 (KEY_BATTERY) -> linux:236 
(KEY_BATTERY) */
+  [0xf2] = 0xed, /* qnum:242 -> linux:237 (KEY_BLUETOOTH) -> linux:237 
(KEY_BLUETOOTH) */
+  [0xf3] = 0xee, /* qnum:243 -> linux:238 (KEY_WLAN) -> linux:238 (KEY_WLAN) */
+  [0xf4] = 0xef, /* qnum:244 -> linux:239 (KEY_UWB) -> linux:239 (KEY_UWB) */
+  [0xf5] = 0x8a, /* qnum:245 -> linux:138 (KEY_HELP) -> linux:138 (KEY_HELP) */
+  [0xf6] = 0xb3, /* qnum:246 -> linux:179 (KEY_KPLEFTPAREN) -> linux:179 
(KEY_KPLEFTPAREN) */
+  [0xf7] = 0xbc, /* qnum:247 -> linux:188 (KEY_F18) -> linux:188 (KEY_F18) */
+  [0xf8] = 0x85, /* qnum:248 -> linux:133 (KEY_COPY) -> linux:133 (KEY_COPY) */
+  [0xf9] = 0xc0, /* qnum:249 -> linux:192 (KEY_F22) -> linux:192 (KEY_F22) */
+  [0xfb] = 0xb4, /* qnum:251 -> linux:180 (KEY_KPRIGHTPAREN) -> linux:180 
(KEY_KPRIGHTPAREN) */
+  [0xfd] = 0xa2, /* qnum:253 -> linux:162 (KEY_EJECTCLOSECD) -> linux:162 
(KEY_EJECTCLOSECD) */
+};
+const unsigned int code_map_qnum_to_linux_len = 
sizeof(code_map_qnum_to_linux)/sizeof(code_map_qnum_to_linux[0]);
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/neatvnc-0.3.2/src/server.c 
new/neatvnc-0.4.0/src/server.c
--- old/neatvnc-0.3.2/src/server.c      2020-09-27 19:31:06.000000000 +0200
+++ new/neatvnc-0.4.0/src/server.c      2020-12-06 15:02:50.000000000 +0100
@@ -72,9 +72,12 @@
 int schedule_client_update_fb(struct nvnc_client* client,
                struct pixman_region16* damage);
 static int send_desktop_resize(struct nvnc_client* client, struct nvnc_fb* fb);
+static int send_qemu_key_ext_frame(struct nvnc_client* client);
 static enum rfb_encodings choose_frame_encoding(struct nvnc_client* client);
 static enum tight_quality client_get_tight_quality(struct nvnc_client* client);
 static void on_tight_encode_frame_done(struct vec* frame, void* userdata);
+static bool client_has_encoding(const struct nvnc_client* client,
+               enum rfb_encodings encoding);
 
 #if defined(GIT_VERSION)
 EXPORT const char nvnc_version[] = GIT_VERSION;
@@ -84,6 +87,8 @@
 EXPORT const char nvnc_version[] = "UNKNOWN";
 #endif
 
+extern const unsigned short code_map_qnum_to_linux[];
+
 static void client_close(struct nvnc_client* client)
 {
        log_debug("client_close(%p): ref %d\n", client, client->ref);
@@ -484,6 +489,7 @@
                case RFB_ENCODING_DESKTOPSIZE:
                case RFB_ENCODING_JPEG_HIGHQ:
                case RFB_ENCODING_JPEG_LOWQ:
+               case RFB_ENCODING_QEMU_EXT_KEY_EVENT:
                        client->encodings[n++] = encoding;
                }
        }
@@ -518,9 +524,22 @@
        }
 
        if (fb->width != client->known_width
-           || fb->height != client->known_height)
+           || fb->height != client->known_height) {
                send_desktop_resize(client, fb);
 
+               if (--client->n_pending_requests <= 0)
+                       return;
+       }
+
+       if (server->key_code_fn && !client->is_qemu_key_ext_notified
+           && client_has_encoding(client, RFB_ENCODING_QEMU_EXT_KEY_EVENT)) {
+               send_qemu_key_ext_frame(client);
+               client->is_qemu_key_ext_notified = true;
+
+               if (--client->n_pending_requests <= 0)
+                       return;
+       }
+
        DTRACE_PROBE1(neatvnc, update_fb_start, client);
 
        /* The client's damage is exchanged for an empty one */
@@ -619,6 +638,51 @@
        return sizeof(*msg);
 }
 
+static int on_client_qemu_key_event(struct nvnc_client* client)
+{
+       struct nvnc* server = client->server;
+
+       struct rfb_client_qemu_key_event_msg* msg =
+               (struct rfb_client_qemu_key_event_msg*)(client->msg_buffer +
+                                                       client->buffer_index);
+
+       if (client->buffer_len - client->buffer_index < sizeof(*msg))
+               return 0;
+
+       int down_flag = msg->down_flag;
+       uint32_t xt_keycode = ntohl(msg->keycode);
+
+       uint32_t evdev_keycode = code_map_qnum_to_linux[xt_keycode];
+       if (!evdev_keycode)
+               evdev_keycode = xt_keycode;
+
+       nvnc_key_fn fn = server->key_code_fn;
+       if (fn)
+               fn(client, evdev_keycode, !!down_flag);
+
+       return sizeof(*msg);
+}
+
+static int on_client_qemu_event(struct nvnc_client* client)
+{
+       if (client->buffer_len - client->buffer_index < 2)
+               return 0;
+
+       enum rfb_client_to_server_qemu_msg_type subtype =
+               client->msg_buffer[client->buffer_index + 1];
+
+       switch (subtype) {
+       case RFB_CLIENT_TO_SERVER_QEMU_KEY_EVENT:
+               return on_client_qemu_key_event(client);
+       }
+
+       log_debug("Got uninterpretable qemu message from client: %p (ref %d)\n",
+                 client, client->ref);
+       stream_close(client->net_stream);
+       client_unref(client);
+       return 0;
+}
+
 static int on_client_pointer_event(struct nvnc_client* client)
 {
        struct nvnc* server = client->server;
@@ -771,6 +835,8 @@
                return on_client_pointer_event(client);
        case RFB_CLIENT_TO_SERVER_CLIENT_CUT_TEXT:
                return on_client_cut_text(client);
+       case RFB_CLIENT_TO_SERVER_QEMU:
+               return on_client_qemu_event(client);
        }
 
        log_debug("Got uninterpretable message from client: %p (ref %d)\n",
@@ -1240,6 +1306,22 @@
        return 0;
 }
 
+static int send_qemu_key_ext_frame(struct nvnc_client* client)
+{
+       struct rfb_server_fb_update_msg head = {
+               .type = RFB_SERVER_TO_CLIENT_FRAMEBUFFER_UPDATE,
+               .n_rects = htons(1),
+       };
+
+       struct rfb_server_fb_rect rect = {
+               .encoding = htonl(RFB_ENCODING_QEMU_EXT_KEY_EVENT),
+       };
+
+       stream_write(client->net_stream, &head, sizeof(head), NULL, NULL);
+       stream_write(client->net_stream, &rect, sizeof(rect), NULL, NULL);
+       return 0;
+}
+
 int schedule_client_update_fb(struct nvnc_client* client,
                struct pixman_region16* damage)
 {
@@ -1323,6 +1405,12 @@
 }
 
 EXPORT
+void nvnc_set_key_code_fn(struct nvnc* self, nvnc_key_fn fn)
+{
+       self->key_code_fn = fn;
+}
+
+EXPORT
 void nvnc_set_pointer_fn(struct nvnc* self, nvnc_pointer_fn fn)
 {
        self->pointer_fn = fn;

Reply via email to