Commit 564c337efd415df3ab58c5bd080139e9f997d265

Authored by bellard
1 parent 2a252826

Mouse relative offset VNC extension (Anthony Liguori)


git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@2390 c046a42c-6fe2-441c-8c8c-71466251a162
Showing 1 changed file with 42 additions and 10 deletions
@@ -68,6 +68,11 @@ struct VncState @@ -68,6 +68,11 @@ struct VncState
68 int depth; /* internal VNC frame buffer byte per pixel */ 68 int depth; /* internal VNC frame buffer byte per pixel */
69 int has_resize; 69 int has_resize;
70 int has_hextile; 70 int has_hextile;
  71 + int has_pointer_type_change;
  72 + int absolute;
  73 + int last_x;
  74 + int last_y;
  75 +
71 Buffer output; 76 Buffer output;
72 Buffer input; 77 Buffer input;
73 kbd_layout_t *kbd_layout; 78 kbd_layout_t *kbd_layout;
@@ -671,6 +676,19 @@ static void client_cut_text(VncState *vs, size_t len, char *text) @@ -671,6 +676,19 @@ static void client_cut_text(VncState *vs, size_t len, char *text)
671 { 676 {
672 } 677 }
673 678
  679 +static void check_pointer_type_change(VncState *vs, int absolute)
  680 +{
  681 + if (vs->has_pointer_type_change && vs->absolute != absolute) {
  682 + vnc_write_u8(vs, 0);
  683 + vnc_write_u8(vs, 0);
  684 + vnc_write_u16(vs, 1);
  685 + vnc_framebuffer_update(vs, absolute, 0,
  686 + vs->ds->width, vs->ds->height, -257);
  687 + vnc_flush(vs);
  688 + }
  689 + vs->absolute = absolute;
  690 +}
  691 +
674 static void pointer_event(VncState *vs, int button_mask, int x, int y) 692 static void pointer_event(VncState *vs, int button_mask, int x, int y)
675 { 693 {
676 int buttons = 0; 694 int buttons = 0;
@@ -686,21 +704,26 @@ static void pointer_event(VncState *vs, int button_mask, int x, int y) @@ -686,21 +704,26 @@ static void pointer_event(VncState *vs, int button_mask, int x, int y)
686 dz = -1; 704 dz = -1;
687 if (button_mask & 0x10) 705 if (button_mask & 0x10)
688 dz = 1; 706 dz = 1;
689 -  
690 - if (kbd_mouse_is_absolute()) { 707 +
  708 + if (vs->absolute) {
691 kbd_mouse_event(x * 0x7FFF / vs->ds->width, 709 kbd_mouse_event(x * 0x7FFF / vs->ds->width,
692 y * 0x7FFF / vs->ds->height, 710 y * 0x7FFF / vs->ds->height,
693 dz, buttons); 711 dz, buttons);
694 - } else {  
695 - static int last_x = -1;  
696 - static int last_y = -1;  
697 -  
698 - if (last_x != -1)  
699 - kbd_mouse_event(x - last_x, y - last_y, dz, buttons); 712 + } else if (vs->has_pointer_type_change) {
  713 + x -= 0x7FFF;
  714 + y -= 0x7FFF;
700 715
701 - last_x = x;  
702 - last_y = y; 716 + kbd_mouse_event(x, y, dz, buttons);
  717 + } else {
  718 + if (vs->last_x != -1)
  719 + kbd_mouse_event(x - vs->last_x,
  720 + y - vs->last_y,
  721 + dz, buttons);
  722 + vs->last_x = x;
  723 + vs->last_y = y;
703 } 724 }
  725 +
  726 + check_pointer_type_change(vs, kbd_mouse_is_absolute());
704 } 727 }
705 728
706 static void reset_keys(VncState *vs) 729 static void reset_keys(VncState *vs)
@@ -829,6 +852,8 @@ static void set_encodings(VncState *vs, int32_t *encodings, size_t n_encodings) @@ -829,6 +852,8 @@ static void set_encodings(VncState *vs, int32_t *encodings, size_t n_encodings)
829 852
830 vs->has_hextile = 0; 853 vs->has_hextile = 0;
831 vs->has_resize = 0; 854 vs->has_resize = 0;
  855 + vs->has_pointer_type_change = 0;
  856 + vs->absolute = -1;
832 vs->ds->dpy_copy = NULL; 857 vs->ds->dpy_copy = NULL;
833 858
834 for (i = n_encodings - 1; i >= 0; i--) { 859 for (i = n_encodings - 1; i >= 0; i--) {
@@ -845,10 +870,15 @@ static void set_encodings(VncState *vs, int32_t *encodings, size_t n_encodings) @@ -845,10 +870,15 @@ static void set_encodings(VncState *vs, int32_t *encodings, size_t n_encodings)
845 case -223: /* DesktopResize */ 870 case -223: /* DesktopResize */
846 vs->has_resize = 1; 871 vs->has_resize = 1;
847 break; 872 break;
  873 + case -257:
  874 + vs->has_pointer_type_change = 1;
  875 + break;
848 default: 876 default:
849 break; 877 break;
850 } 878 }
851 } 879 }
  880 +
  881 + check_pointer_type_change(vs, kbd_mouse_is_absolute());
852 } 882 }
853 883
854 static int compute_nbits(unsigned int val) 884 static int compute_nbits(unsigned int val)
@@ -1124,6 +1154,8 @@ void vnc_display_init(DisplayState *ds, const char *arg) @@ -1124,6 +1154,8 @@ void vnc_display_init(DisplayState *ds, const char *arg)
1124 vs->lsock = -1; 1154 vs->lsock = -1;
1125 vs->csock = -1; 1155 vs->csock = -1;
1126 vs->depth = 4; 1156 vs->depth = 4;
  1157 + vs->last_x = -1;
  1158 + vs->last_y = -1;
1127 1159
1128 vs->ds = ds; 1160 vs->ds = ds;
1129 1161