From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1LU1Bx-0000dI-6D for qemu-devel@nongnu.org; Mon, 02 Feb 2009 10:58:33 -0500 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1LU1Bw-0000cU-E8 for qemu-devel@nongnu.org; Mon, 02 Feb 2009 10:58:32 -0500 Received: from [199.232.76.173] (port=51770 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1LU1Bv-0000cK-Hz for qemu-devel@nongnu.org; Mon, 02 Feb 2009 10:58:31 -0500 Received: from savannah.gnu.org ([199.232.41.3]:41946 helo=sv.gnu.org) by monty-python.gnu.org with esmtps (TLS-1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.60) (envelope-from ) id 1LU1Bv-0008U4-3e for qemu-devel@nongnu.org; Mon, 02 Feb 2009 10:58:31 -0500 Received: from cvs.savannah.gnu.org ([199.232.41.69]) by sv.gnu.org with esmtp (Exim 4.63) (envelope-from ) id 1LU1Bu-00077b-Jk for qemu-devel@nongnu.org; Mon, 02 Feb 2009 15:58:30 +0000 Received: from aliguori by cvs.savannah.gnu.org with local (Exim 4.63) (envelope-from ) id 1LU1Bu-00077S-AL for qemu-devel@nongnu.org; Mon, 02 Feb 2009 15:58:30 +0000 MIME-Version: 1.0 Errors-To: aliguori Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit From: Anthony Liguori Message-Id: Date: Mon, 02 Feb 2009 15:58:30 +0000 Subject: [Qemu-devel] [6494] Use VNC protocol defines (Alexander Graf) Reply-To: qemu-devel@nongnu.org List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org Revision: 6494 http://svn.sv.gnu.org/viewvc/?view=rev&root=qemu&revision=6494 Author: aliguori Date: 2009-02-02 15:58:29 +0000 (Mon, 02 Feb 2009) Log Message: ----------- Use VNC protocol defines (Alexander Graf) Now that we have nice defines for all sorts of constants, let's use them! This patch also takes the "feature variables", currently called has_* into a single feature int. This way adding new features is a lot easier and doesn't clutter the VncState struct. Signed-off-by: Alexander Graf Signed-off-by: Anthony Liguori Modified Paths: -------------- trunk/vnc.c Modified: trunk/vnc.c =================================================================== --- trunk/vnc.c 2009-02-02 15:58:25 UTC (rev 6493) +++ trunk/vnc.c 2009-02-02 15:58:29 UTC (rev 6494) @@ -98,10 +98,7 @@ int need_update; uint32_t dirty_row[VNC_MAX_HEIGHT][VNC_DIRTY_WORDS]; char *old_data; - int has_resize; - int has_hextile; - int has_pointer_type_change; - int has_WMVi; + uint32_t features; int absolute; int last_x; int last_y; @@ -164,6 +161,10 @@ } } +static inline uint32_t vnc_has_feature(VncState *vs, int feature) { + return (vs->features & (1 << feature)); +} + /* TODO 1) Get the queue working for IO. 2) there is some weirdness when using the -S option (the screen is grey @@ -277,11 +278,12 @@ ds_get_height(ds) != vs->serverds.height; vs->serverds = *(ds->surface); if (size_changed) { - if (vs->csock != -1 && vs->has_resize) { + if (vs->csock != -1 && vnc_has_feature(vs, VNC_FEATURE_RESIZE)) { vnc_write_u8(vs, 0); /* msg id */ vnc_write_u8(vs, 0); vnc_write_u16(vs, 1); /* number of rects */ - vnc_framebuffer_update(vs, 0, 0, ds_get_width(ds), ds_get_height(ds), -223); + vnc_framebuffer_update(vs, 0, 0, ds_get_width(ds), ds_get_height(ds), + VNC_ENCODING_DESKTOPRESIZE); vnc_flush(vs); } } @@ -378,7 +380,7 @@ int i; uint8_t *row; - vnc_framebuffer_update(vs, x, y, w, h, 0); + vnc_framebuffer_update(vs, x, y, w, h, VNC_ENCODING_RAW); row = ds_get_data(vs->ds) + y * ds_get_linesize(vs->ds) + x * ds_get_bytes_per_pixel(vs->ds); for (i = 0; i < h; i++) { @@ -429,7 +431,7 @@ int has_fg, has_bg; uint8_t *last_fg, *last_bg; - vnc_framebuffer_update(vs, x, y, w, h, 5); + vnc_framebuffer_update(vs, x, y, w, h, VNC_ENCODING_HEXTILE); last_fg = (uint8_t *) malloc(vs->serverds.pf.bytes_per_pixel); last_bg = (uint8_t *) malloc(vs->serverds.pf.bytes_per_pixel); @@ -448,7 +450,7 @@ static void send_framebuffer_update(VncState *vs, int x, int y, int w, int h) { - if (vs->has_hextile) + if (vnc_has_feature(vs, VNC_FEATURE_HEXTILE)) send_framebuffer_update_hextile(vs, x, y, w, h); else send_framebuffer_update_raw(vs, x, y, w, h); @@ -463,7 +465,7 @@ vnc_write_u8(vs, 0); /* msg id */ vnc_write_u8(vs, 0); vnc_write_u16(vs, 1); /* number of rects */ - vnc_framebuffer_update(vs, dst_x, dst_y, w, h, 1); + vnc_framebuffer_update(vs, dst_x, dst_y, w, h, VNC_ENCODING_COPYRECT); vnc_write_u16(vs, src_x); vnc_write_u16(vs, src_y); vnc_flush(vs); @@ -919,12 +921,13 @@ static void check_pointer_type_change(VncState *vs, int absolute) { - if (vs->has_pointer_type_change && vs->absolute != absolute) { + if (vnc_has_feature(vs, VNC_FEATURE_POINTER_TYPE_CHANGE) && vs->absolute != absolute) { vnc_write_u8(vs, 0); vnc_write_u8(vs, 0); vnc_write_u16(vs, 1); vnc_framebuffer_update(vs, absolute, 0, - ds_get_width(vs->ds), ds_get_height(vs->ds), -257); + ds_get_width(vs->ds), ds_get_height(vs->ds), + VNC_ENCODING_POINTER_TYPE_CHANGE); vnc_flush(vs); } vs->absolute = absolute; @@ -950,7 +953,7 @@ kbd_mouse_event(x * 0x7FFF / (ds_get_width(vs->ds) - 1), y * 0x7FFF / (ds_get_height(vs->ds) - 1), dz, buttons); - } else if (vs->has_pointer_type_change) { + } else if (vnc_has_feature(vs, VNC_FEATURE_POINTER_TYPE_CHANGE)) { x -= 0x7FFF; y -= 0x7FFF; @@ -1140,7 +1143,8 @@ vnc_write_u8(vs, 0); vnc_write_u8(vs, 0); vnc_write_u16(vs, 1); - vnc_framebuffer_update(vs, 0, 0, ds_get_width(vs->ds), ds_get_height(vs->ds), -258); + vnc_framebuffer_update(vs, 0, 0, ds_get_width(vs->ds), ds_get_height(vs->ds), + VNC_ENCODING_EXT_KEY_EVENT); vnc_flush(vs); } @@ -1149,50 +1153,50 @@ vnc_write_u8(vs, 0); vnc_write_u8(vs, 0); vnc_write_u16(vs, 1); - vnc_framebuffer_update(vs, 0, 0, ds_get_width(vs->ds), ds_get_height(vs->ds), -259); + vnc_framebuffer_update(vs, 0, 0, ds_get_width(vs->ds), ds_get_height(vs->ds), + VNC_ENCODING_AUDIO); vnc_flush(vs); } static void set_encodings(VncState *vs, int32_t *encodings, size_t n_encodings) { int i; + unsigned int enc = 0; - vs->has_hextile = 0; - vs->has_resize = 0; - vs->has_pointer_type_change = 0; - vs->has_WMVi = 0; + vs->features = 0; vs->absolute = -1; dcl->dpy_copy = NULL; for (i = n_encodings - 1; i >= 0; i--) { - switch (encodings[i]) { - case 0: /* Raw */ - vs->has_hextile = 0; - break; - case 1: /* CopyRect */ - dcl->dpy_copy = vnc_copy; - break; - case 5: /* Hextile */ - vs->has_hextile = 1; - break; - case -223: /* DesktopResize */ - vs->has_resize = 1; - break; - case -257: - vs->has_pointer_type_change = 1; - break; - case -258: + enc = encodings[i]; + switch (enc) { + case VNC_ENCODING_RAW: + break; + case VNC_ENCODING_COPYRECT: + dcl->dpy_copy = vnc_copy; + break; + case VNC_ENCODING_HEXTILE: + vs->features |= VNC_FEATURE_HEXTILE_MASK; + break; + case VNC_ENCODING_DESKTOPRESIZE: + vs->features |= VNC_FEATURE_RESIZE_MASK; + break; + case VNC_ENCODING_POINTER_TYPE_CHANGE: + vs->features |= VNC_FEATURE_POINTER_TYPE_CHANGE_MASK; + break; + case VNC_ENCODING_EXT_KEY_EVENT: send_ext_key_event_ack(vs); break; - case -259: + case VNC_ENCODING_AUDIO: send_ext_audio_ack(vs); break; - case 0x574D5669: - vs->has_WMVi = 1; + case VNC_ENCODING_WMVi: + vs->features |= VNC_FEATURE_WMVI_MASK; break; - default: - break; - } + default: + VNC_DEBUG("Unknown encoding: %d (0x%.8x): %d\n", i, enc, enc); + break; + } } check_pointer_type_change(vs, kbd_mouse_is_absolute()); @@ -1306,12 +1310,13 @@ { struct VncState *vs = ds->opaque; - if (vs->csock != -1 && vs->has_WMVi) { + if (vs->csock != -1 && vnc_has_feature(vs, VNC_FEATURE_WMVI)) { /* Sending a WMVi message to notify the client*/ vnc_write_u8(vs, 0); /* msg id */ vnc_write_u8(vs, 0); vnc_write_u16(vs, 1); /* number of rects */ - vnc_framebuffer_update(vs, 0, 0, ds_get_width(ds), ds_get_height(ds), 0x574D5669); + vnc_framebuffer_update(vs, 0, 0, ds_get_width(ds), ds_get_height(ds), + VNC_ENCODING_WMVi); pixel_format_message(vs); vnc_flush(vs); } else { @@ -2079,9 +2084,7 @@ vnc_read_when(vs, protocol_version, 12); memset(vs->old_data, 0, ds_get_linesize(vs->ds) * ds_get_height(vs->ds)); memset(vs->dirty_row, 0xFF, sizeof(vs->dirty_row)); - vs->has_resize = 0; - vs->has_hextile = 0; - vs->has_WMVi = 0; + vs->features = 0; dcl->dpy_copy = NULL; vnc_update_client(vs); reset_keys(vs);