ui: drop VNC feature _MASK constants

Each VNC feature enum entry has a corresponding _MASK constant
which is the bit-shifted value. It is very easy for contributors
to accidentally use the _MASK constant, instead of the non-_MASK
constant, or the reverse. No compiler warning is possible and
it'll just silently do the wrong thing at runtime.

By introducing the vnc_set_feature helper method, we can drop
all the _MASK constants and thus prevent any future accidents.

Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>
This commit is contained in:
Daniel P. Berrangé 2023-12-07 13:45:01 +00:00
parent 03e471c41d
commit 0e74eb86ea
2 changed files with 22 additions and 34 deletions

View File

@ -2144,16 +2144,16 @@ static void set_encodings(VncState *vs, int32_t *encodings, size_t n_encodings)
vs->vnc_encoding = enc; vs->vnc_encoding = enc;
break; break;
case VNC_ENCODING_HEXTILE: case VNC_ENCODING_HEXTILE:
vs->features |= VNC_FEATURE_HEXTILE_MASK; vnc_set_feature(vs, VNC_FEATURE_HEXTILE);
vs->vnc_encoding = enc; vs->vnc_encoding = enc;
break; break;
case VNC_ENCODING_TIGHT: case VNC_ENCODING_TIGHT:
vs->features |= VNC_FEATURE_TIGHT_MASK; vnc_set_feature(vs, VNC_FEATURE_TIGHT);
vs->vnc_encoding = enc; vs->vnc_encoding = enc;
break; break;
#ifdef CONFIG_PNG #ifdef CONFIG_PNG
case VNC_ENCODING_TIGHT_PNG: case VNC_ENCODING_TIGHT_PNG:
vs->features |= VNC_FEATURE_TIGHT_PNG_MASK; vnc_set_feature(vs, VNC_FEATURE_TIGHT_PNG);
vs->vnc_encoding = enc; vs->vnc_encoding = enc;
break; break;
#endif #endif
@ -2163,57 +2163,57 @@ static void set_encodings(VncState *vs, int32_t *encodings, size_t n_encodings)
* So prioritize ZRLE, even if the client hints that it prefers * So prioritize ZRLE, even if the client hints that it prefers
* ZLIB. * ZLIB.
*/ */
if ((vs->features & VNC_FEATURE_ZRLE_MASK) == 0) { if (!vnc_has_feature(vs, VNC_FEATURE_ZRLE)) {
vs->features |= VNC_FEATURE_ZLIB_MASK; vnc_set_feature(vs, VNC_FEATURE_ZLIB);
vs->vnc_encoding = enc; vs->vnc_encoding = enc;
} }
break; break;
case VNC_ENCODING_ZRLE: case VNC_ENCODING_ZRLE:
vs->features |= VNC_FEATURE_ZRLE_MASK; vnc_set_feature(vs, VNC_FEATURE_ZRLE);
vs->vnc_encoding = enc; vs->vnc_encoding = enc;
break; break;
case VNC_ENCODING_ZYWRLE: case VNC_ENCODING_ZYWRLE:
vs->features |= VNC_FEATURE_ZYWRLE_MASK; vnc_set_feature(vs, VNC_FEATURE_ZYWRLE);
vs->vnc_encoding = enc; vs->vnc_encoding = enc;
break; break;
case VNC_ENCODING_DESKTOPRESIZE: case VNC_ENCODING_DESKTOPRESIZE:
vs->features |= VNC_FEATURE_RESIZE_MASK; vnc_set_feature(vs, VNC_FEATURE_RESIZE);
break; break;
case VNC_ENCODING_DESKTOP_RESIZE_EXT: case VNC_ENCODING_DESKTOP_RESIZE_EXT:
vs->features |= VNC_FEATURE_RESIZE_EXT_MASK; vnc_set_feature(vs, VNC_FEATURE_RESIZE_EXT);
break; break;
case VNC_ENCODING_POINTER_TYPE_CHANGE: case VNC_ENCODING_POINTER_TYPE_CHANGE:
vs->features |= VNC_FEATURE_POINTER_TYPE_CHANGE_MASK; vnc_set_feature(vs, VNC_FEATURE_POINTER_TYPE_CHANGE);
break; break;
case VNC_ENCODING_RICH_CURSOR: case VNC_ENCODING_RICH_CURSOR:
vs->features |= VNC_FEATURE_RICH_CURSOR_MASK; vnc_set_feature(vs, VNC_FEATURE_RICH_CURSOR);
break; break;
case VNC_ENCODING_ALPHA_CURSOR: case VNC_ENCODING_ALPHA_CURSOR:
vs->features |= VNC_FEATURE_ALPHA_CURSOR_MASK; vnc_set_feature(vs, VNC_FEATURE_ALPHA_CURSOR);
break; break;
case VNC_ENCODING_EXT_KEY_EVENT: case VNC_ENCODING_EXT_KEY_EVENT:
send_ext_key_event_ack(vs); send_ext_key_event_ack(vs);
break; break;
case VNC_ENCODING_AUDIO: case VNC_ENCODING_AUDIO:
if (vs->vd->audio_state) { if (vs->vd->audio_state) {
vs->features |= VNC_FEATURE_AUDIO_MASK; vnc_set_feature(vs, VNC_FEATURE_AUDIO);
send_ext_audio_ack(vs); send_ext_audio_ack(vs);
} }
break; break;
case VNC_ENCODING_WMVi: case VNC_ENCODING_WMVi:
vs->features |= VNC_FEATURE_WMVI_MASK; vnc_set_feature(vs, VNC_FEATURE_WMVI);
break; break;
case VNC_ENCODING_LED_STATE: case VNC_ENCODING_LED_STATE:
vs->features |= VNC_FEATURE_LED_STATE_MASK; vnc_set_feature(vs, VNC_FEATURE_LED_STATE);
break; break;
case VNC_ENCODING_XVP: case VNC_ENCODING_XVP:
if (vs->vd->power_control) { if (vs->vd->power_control) {
vs->features |= VNC_FEATURE_XVP_MASK; vnc_set_feature(vs, VNC_FEATURE_XVP);
send_xvp_message(vs, VNC_XVP_CODE_INIT); send_xvp_message(vs, VNC_XVP_CODE_INIT);
} }
break; break;
case VNC_ENCODING_CLIPBOARD_EXT: case VNC_ENCODING_CLIPBOARD_EXT:
vs->features |= VNC_FEATURE_CLIPBOARD_EXT_MASK; vnc_set_feature(vs, VNC_FEATURE_CLIPBOARD_EXT);
vnc_server_cut_text_caps(vs); vnc_server_cut_text_caps(vs);
break; break;
case VNC_ENCODING_COMPRESSLEVEL0 ... VNC_ENCODING_COMPRESSLEVEL0 + 9: case VNC_ENCODING_COMPRESSLEVEL0 ... VNC_ENCODING_COMPRESSLEVEL0 + 9:

View File

@ -467,23 +467,6 @@ enum VncFeatures {
VNC_FEATURE_AUDIO, VNC_FEATURE_AUDIO,
}; };
#define VNC_FEATURE_RESIZE_MASK (1 << VNC_FEATURE_RESIZE)
#define VNC_FEATURE_RESIZE_EXT_MASK (1 << VNC_FEATURE_RESIZE_EXT)
#define VNC_FEATURE_HEXTILE_MASK (1 << VNC_FEATURE_HEXTILE)
#define VNC_FEATURE_POINTER_TYPE_CHANGE_MASK (1 << VNC_FEATURE_POINTER_TYPE_CHANGE)
#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_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)
#define VNC_FEATURE_LED_STATE_MASK (1 << VNC_FEATURE_LED_STATE)
#define VNC_FEATURE_XVP_MASK (1 << VNC_FEATURE_XVP)
#define VNC_FEATURE_CLIPBOARD_EXT_MASK (1 << VNC_FEATURE_CLIPBOARD_EXT)
#define VNC_FEATURE_AUDIO_MASK (1 << VNC_FEATURE_AUDIO)
/* Client -> Server message IDs */ /* Client -> Server message IDs */
#define VNC_MSG_CLIENT_SET_PIXEL_FORMAT 0 #define VNC_MSG_CLIENT_SET_PIXEL_FORMAT 0
@ -599,6 +582,11 @@ static inline uint32_t vnc_has_feature(VncState *vs, int feature) {
return (vs->features & (1 << feature)); return (vs->features & (1 << feature));
} }
static inline void vnc_set_feature(VncState *vs, enum VncFeatures feature)
{
vs->features |= (1 << feature);
}
/* Framebuffer */ /* Framebuffer */
void vnc_framebuffer_update(VncState *vs, int x, int y, int w, int h, void vnc_framebuffer_update(VncState *vs, int x, int y, int w, int h,
int32_t encoding); int32_t encoding);