From c7b22c0a7c48a048703802eb6534930f18b9e44c Mon Sep 17 00:00:00 2001 From: Gerd Hoffmann Date: Tue, 8 Dec 2020 12:57:29 +0100 Subject: [PATCH 1/8] console: drop qemu_console_get_ui_info MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Unused and duplicate (there is dpy_get_ui_info). Signed-off-by: Gerd Hoffmann Reviewed-by: Marc-André Lureau Reviewed-by: Daniel P. Berrangé Message-id: 20201208115737.18581-2-kraxel@redhat.com --- include/ui/console.h | 1 - ui/console.c | 6 ------ 2 files changed, 7 deletions(-) diff --git a/include/ui/console.h b/include/ui/console.h index e7303d8b98..5dd21976a3 100644 --- a/include/ui/console.h +++ b/include/ui/console.h @@ -390,7 +390,6 @@ bool qemu_console_is_gl_blocked(QemuConsole *con); char *qemu_console_get_label(QemuConsole *con); int qemu_console_get_index(QemuConsole *con); uint32_t qemu_console_get_head(QemuConsole *con); -QemuUIInfo *qemu_console_get_ui_info(QemuConsole *con); int qemu_console_get_width(QemuConsole *con, int fallback); int qemu_console_get_height(QemuConsole *con, int fallback); /* Return the low-level window id for the console */ diff --git a/ui/console.c b/ui/console.c index 53dee8e26b..f995639e45 100644 --- a/ui/console.c +++ b/ui/console.c @@ -2122,12 +2122,6 @@ uint32_t qemu_console_get_head(QemuConsole *con) return con ? con->head : -1; } -QemuUIInfo *qemu_console_get_ui_info(QemuConsole *con) -{ - assert(con != NULL); - return &con->ui_info; -} - int qemu_console_get_width(QemuConsole *con, int fallback) { if (con == NULL) { From 5c4b107f88ad2679817b73445fa706c62db4d8e0 Mon Sep 17 00:00:00 2001 From: Gerd Hoffmann Date: Tue, 8 Dec 2020 12:57:30 +0100 Subject: [PATCH 2/8] console: allow con==NULL in dpy_{get, set}_ui_info and dpy_ui_info_supported MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Use active_console in that case like we do in many other places. Signed-off-by: Gerd Hoffmann Reviewed-by: Daniel P. Berrangé Message-id: 20201208115737.18581-3-kraxel@redhat.com --- ui/console.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/ui/console.c b/ui/console.c index f995639e45..30e70be555 100644 --- a/ui/console.c +++ b/ui/console.c @@ -1544,19 +1544,27 @@ static void dpy_set_ui_info_timer(void *opaque) bool dpy_ui_info_supported(QemuConsole *con) { + if (con == NULL) { + con = active_console; + } + return con->hw_ops->ui_info != NULL; } const QemuUIInfo *dpy_get_ui_info(const QemuConsole *con) { - assert(con != NULL); + if (con == NULL) { + con = active_console; + } return &con->ui_info; } int dpy_set_ui_info(QemuConsole *con, QemuUIInfo *info) { - assert(con != NULL); + if (con == NULL) { + con = active_console; + } if (!dpy_ui_info_supported(con)) { return -1; From b0c693faa9afab66e6fcbec95437f870aba99a00 Mon Sep 17 00:00:00 2001 From: Gerd Hoffmann Date: Tue, 8 Dec 2020 12:57:31 +0100 Subject: [PATCH 3/8] vnc: use enum for features MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Use an enum for the vnc feature bits. That way they are enumerated automatically and we don't have to do that manually when adding or removing features. Signed-off-by: Gerd Hoffmann Reviewed-by: Marc-André Lureau Message-id: 20201208115737.18581-4-kraxel@redhat.com --- ui/vnc.h | 26 ++++++++++++++------------ 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/ui/vnc.h b/ui/vnc.h index 4e2637ce6c..262fcf179b 100644 --- a/ui/vnc.h +++ b/ui/vnc.h @@ -438,18 +438,20 @@ enum { * *****************************************************************************/ -#define VNC_FEATURE_RESIZE 0 -#define VNC_FEATURE_HEXTILE 1 -#define VNC_FEATURE_POINTER_TYPE_CHANGE 2 -#define VNC_FEATURE_WMVI 3 -#define VNC_FEATURE_TIGHT 4 -#define VNC_FEATURE_ZLIB 5 -#define VNC_FEATURE_COPYRECT 6 -#define VNC_FEATURE_RICH_CURSOR 7 -#define VNC_FEATURE_TIGHT_PNG 8 -#define VNC_FEATURE_ZRLE 9 -#define VNC_FEATURE_ZYWRLE 10 -#define VNC_FEATURE_LED_STATE 11 +enum VncFeatures { + VNC_FEATURE_RESIZE, + VNC_FEATURE_HEXTILE, + VNC_FEATURE_POINTER_TYPE_CHANGE, + VNC_FEATURE_WMVI, + VNC_FEATURE_TIGHT, + VNC_FEATURE_ZLIB, + VNC_FEATURE_COPYRECT, + VNC_FEATURE_RICH_CURSOR, + VNC_FEATURE_TIGHT_PNG, + VNC_FEATURE_ZRLE, + VNC_FEATURE_ZYWRLE, + VNC_FEATURE_LED_STATE, +}; #define VNC_FEATURE_RESIZE_MASK (1 << VNC_FEATURE_RESIZE) #define VNC_FEATURE_HEXTILE_MASK (1 << VNC_FEATURE_HEXTILE) From b151357aaff3b54e20e6966c1a9d8c85fde8fe21 Mon Sep 17 00:00:00 2001 From: Gerd Hoffmann Date: Tue, 8 Dec 2020 12:57:32 +0100 Subject: [PATCH 4/8] vnc: drop unused copyrect feature MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit vnc stopped using the copyrect pseudo encoding in 2017, in commit 50628d3479e4 ("cirrus/vnc: zap bitblit support from console code.") So we can drop the now unused copyrect feature bit. Signed-off-by: Gerd Hoffmann Reviewed-by: Marc-André Lureau Reviewed-by: Daniel P. Berrangé Message-id: 20201208115737.18581-5-kraxel@redhat.com --- ui/vnc.c | 3 --- ui/vnc.h | 2 -- 2 files changed, 5 deletions(-) diff --git a/ui/vnc.c b/ui/vnc.c index 49235056f7..8c2771c1ce 100644 --- a/ui/vnc.c +++ b/ui/vnc.c @@ -2061,9 +2061,6 @@ static void set_encodings(VncState *vs, int32_t *encodings, size_t n_encodings) case VNC_ENCODING_RAW: vs->vnc_encoding = enc; break; - case VNC_ENCODING_COPYRECT: - vs->features |= VNC_FEATURE_COPYRECT_MASK; - break; case VNC_ENCODING_HEXTILE: vs->features |= VNC_FEATURE_HEXTILE_MASK; vs->vnc_encoding = enc; diff --git a/ui/vnc.h b/ui/vnc.h index 262fcf179b..a7fd38a820 100644 --- a/ui/vnc.h +++ b/ui/vnc.h @@ -445,7 +445,6 @@ enum VncFeatures { VNC_FEATURE_WMVI, VNC_FEATURE_TIGHT, VNC_FEATURE_ZLIB, - VNC_FEATURE_COPYRECT, VNC_FEATURE_RICH_CURSOR, VNC_FEATURE_TIGHT_PNG, VNC_FEATURE_ZRLE, @@ -459,7 +458,6 @@ enum VncFeatures { #define VNC_FEATURE_WMVI_MASK (1 << VNC_FEATURE_WMVI) #define VNC_FEATURE_TIGHT_MASK (1 << VNC_FEATURE_TIGHT) #define VNC_FEATURE_ZLIB_MASK (1 << VNC_FEATURE_ZLIB) -#define VNC_FEATURE_COPYRECT_MASK (1 << VNC_FEATURE_COPYRECT) #define VNC_FEATURE_RICH_CURSOR_MASK (1 << VNC_FEATURE_RICH_CURSOR) #define VNC_FEATURE_TIGHT_PNG_MASK (1 << VNC_FEATURE_TIGHT_PNG) #define VNC_FEATURE_ZRLE_MASK (1 << VNC_FEATURE_ZRLE) From a7d83e43597964047e1d2f326c249082e7d9b99f Mon Sep 17 00:00:00 2001 From: Gerd Hoffmann Date: Tue, 8 Dec 2020 12:57:33 +0100 Subject: [PATCH 5/8] vnc: add pseudo encodings MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Add #defines for two new pseudo encodings: * cursor with alpha channel. * extended desktop resize. https://github.com/rfbproto/rfbproto/blob/master/rfbproto.rst#pseudo-encodings Signed-off-by: Gerd Hoffmann Reviewed-by: Marc-André Lureau Reviewed-by: Daniel P. Berrangé Message-id: 20201208115737.18581-6-kraxel@redhat.com --- ui/vnc.h | 2 ++ 1 file changed, 2 insertions(+) diff --git a/ui/vnc.h b/ui/vnc.h index a7fd38a820..6f5006da35 100644 --- a/ui/vnc.h +++ b/ui/vnc.h @@ -411,6 +411,8 @@ enum { #define VNC_ENCODING_AUDIO 0XFFFFFEFD /* -259 */ #define VNC_ENCODING_TIGHT_PNG 0xFFFFFEFC /* -260 */ #define VNC_ENCODING_LED_STATE 0XFFFFFEFB /* -261 */ +#define VNC_ENCODING_DESKTOP_RESIZE_EXT 0XFFFFFECC /* -308 */ +#define VNC_ENCODING_ALPHA_CURSOR 0XFFFFFEC6 /* -314 */ #define VNC_ENCODING_WMVi 0x574D5669 /***************************************************************************** From 074a86d0b3e8a9352dcca32b46917e1b3ab23ea4 Mon Sep 17 00:00:00 2001 From: Gerd Hoffmann Date: Tue, 8 Dec 2020 12:57:34 +0100 Subject: [PATCH 6/8] vnc: add alpha cursor support MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit There is a new vnc extension for cursors with an alpha channel. Use it if supported by the vnc client, prefer it over the "rich cursor" extension which supports only a bitmask for transparency. This is a visible improvement especially on modern desktops which actually use the alpha channel when defining cursors. https://github.com/rfbproto/rfbproto/blob/master/rfbproto.rst#cursor-with-alpha-pseudo-encoding Signed-off-by: Gerd Hoffmann Reviewed-by: Marc-André Lureau Reviewed-by: Daniel P. Berrangé Tested-by: Daniel P. Berrangé Message-id: 20201208115737.18581-7-kraxel@redhat.com --- ui/vnc.c | 21 ++++++++++++++++++--- ui/vnc.h | 2 ++ 2 files changed, 20 insertions(+), 3 deletions(-) diff --git a/ui/vnc.c b/ui/vnc.c index 8c2771c1ce..247e80d8f5 100644 --- a/ui/vnc.c +++ b/ui/vnc.c @@ -937,6 +937,18 @@ static int vnc_cursor_define(VncState *vs) QEMUCursor *c = vs->vd->cursor; int isize; + if (vnc_has_feature(vs, VNC_FEATURE_ALPHA_CURSOR)) { + vnc_lock_output(vs); + vnc_write_u8(vs, VNC_MSG_SERVER_FRAMEBUFFER_UPDATE); + vnc_write_u8(vs, 0); /* padding */ + vnc_write_u16(vs, 1); /* # of rects */ + vnc_framebuffer_update(vs, c->hot_x, c->hot_y, c->width, c->height, + VNC_ENCODING_ALPHA_CURSOR); + vnc_write_s32(vs, VNC_ENCODING_RAW); + vnc_write(vs, c->data, c->width * c->height * 4); + vnc_unlock_output(vs); + return 0; + } if (vnc_has_feature(vs, VNC_FEATURE_RICH_CURSOR)) { vnc_lock_output(vs); vnc_write_u8(vs, VNC_MSG_SERVER_FRAMEBUFFER_UPDATE); @@ -2102,9 +2114,9 @@ static void set_encodings(VncState *vs, int32_t *encodings, size_t n_encodings) break; case VNC_ENCODING_RICH_CURSOR: vs->features |= VNC_FEATURE_RICH_CURSOR_MASK; - if (vs->vd->cursor) { - vnc_cursor_define(vs); - } + break; + case VNC_ENCODING_ALPHA_CURSOR: + vs->features |= VNC_FEATURE_ALPHA_CURSOR_MASK; break; case VNC_ENCODING_EXT_KEY_EVENT: send_ext_key_event_ack(vs); @@ -2134,6 +2146,9 @@ static void set_encodings(VncState *vs, int32_t *encodings, size_t n_encodings) vnc_desktop_resize(vs); check_pointer_type_change(&vs->mouse_mode_notifier, NULL); vnc_led_state_change(vs); + if (vs->vd->cursor) { + vnc_cursor_define(vs); + } } static void set_pixel_conversion(VncState *vs) diff --git a/ui/vnc.h b/ui/vnc.h index 6f5006da35..c8d3ad9ec4 100644 --- a/ui/vnc.h +++ b/ui/vnc.h @@ -448,6 +448,7 @@ enum VncFeatures { VNC_FEATURE_TIGHT, VNC_FEATURE_ZLIB, VNC_FEATURE_RICH_CURSOR, + VNC_FEATURE_ALPHA_CURSOR, VNC_FEATURE_TIGHT_PNG, VNC_FEATURE_ZRLE, VNC_FEATURE_ZYWRLE, @@ -461,6 +462,7 @@ enum VncFeatures { #define VNC_FEATURE_TIGHT_MASK (1 << VNC_FEATURE_TIGHT) #define VNC_FEATURE_ZLIB_MASK (1 << VNC_FEATURE_ZLIB) #define VNC_FEATURE_RICH_CURSOR_MASK (1 << VNC_FEATURE_RICH_CURSOR) +#define VNC_FEATURE_ALPHA_CURSOR_MASK (1 << VNC_FEATURE_ALPHA_CURSOR) #define VNC_FEATURE_TIGHT_PNG_MASK (1 << VNC_FEATURE_TIGHT_PNG) #define VNC_FEATURE_ZRLE_MASK (1 << VNC_FEATURE_ZRLE) #define VNC_FEATURE_ZYWRLE_MASK (1 << VNC_FEATURE_ZYWRLE) From 947191b4312a547621566d77d7b922d9e13bb63d Mon Sep 17 00:00:00 2001 From: Peng Liang Date: Mon, 16 Nov 2020 22:13:38 +0800 Subject: [PATCH 7/8] ui/vnc: Add missing lock for send_color_map vnc_write() should be locked after the RFB protocol is initialized. Fixes: 0c426e4534b4 ("vnc: Add support for color map") Cc: qemu-stable@nongnu.org Reported-by: Euler Robot Signed-off-by: Peng Liang Message-id: 20201116141338.148911-1-liangpeng10@huawei.com Signed-off-by: Gerd Hoffmann --- ui/vnc.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/ui/vnc.c b/ui/vnc.c index 247e80d8f5..34e6dc437c 100644 --- a/ui/vnc.c +++ b/ui/vnc.c @@ -2168,6 +2168,7 @@ static void send_color_map(VncState *vs) { int i; + vnc_lock_output(vs); vnc_write_u8(vs, VNC_MSG_SERVER_SET_COLOUR_MAP_ENTRIES); vnc_write_u8(vs, 0); /* padding */ vnc_write_u16(vs, 0); /* first color */ @@ -2180,6 +2181,7 @@ static void send_color_map(VncState *vs) vnc_write_u16(vs, (((i >> pf->gshift) & pf->gmax) << (16 - pf->gbits))); vnc_write_u16(vs, (((i >> pf->bshift) & pf->bmax) << (16 - pf->bbits))); } + vnc_unlock_output(vs); } static void set_pixel_format(VncState *vs, int bits_per_pixel, From 2951106143f6cf20b3a0e4f2078721503fe6418a Mon Sep 17 00:00:00 2001 From: Darrell Walisser Date: Thu, 10 Dec 2020 14:33:06 +0000 Subject: [PATCH 8/8] sdl2: Add extra mouse buttons Allows guest to receive mouse buttons 4 and 5, aka "SIDE" button and "EXTRA" button Signed-off-by: Darrell Walisser Message-id: GNUALCfDBqhCUvLwBNJaKqxcPewMtlqCnixk8xTrgI@ubuntu Signed-off-by: Gerd Hoffmann --- ui/sdl2.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/ui/sdl2.c b/ui/sdl2.c index 189d26e2a9..a578017268 100644 --- a/ui/sdl2.c +++ b/ui/sdl2.c @@ -275,6 +275,8 @@ static void sdl_send_mouse_event(struct sdl2_console *scon, int dx, int dy, [INPUT_BUTTON_LEFT] = SDL_BUTTON(SDL_BUTTON_LEFT), [INPUT_BUTTON_MIDDLE] = SDL_BUTTON(SDL_BUTTON_MIDDLE), [INPUT_BUTTON_RIGHT] = SDL_BUTTON(SDL_BUTTON_RIGHT), + [INPUT_BUTTON_SIDE] = SDL_BUTTON(SDL_BUTTON_X1), + [INPUT_BUTTON_EXTRA] = SDL_BUTTON(SDL_BUTTON_X2) }; static uint32_t prev_state;