Revision 9ca313aa vnc.c
b/vnc.c | ||
---|---|---|
939 | 939 |
kbd_put_keycode(keysym2scancode(vs->kbd_layout, keysym) | 0x80); |
940 | 940 |
} |
941 | 941 |
|
942 |
static void do_key_event(VncState *vs, int down, uint32_t sym)
|
|
942 |
static void do_key_event(VncState *vs, int down, int keycode, int sym)
|
|
943 | 943 |
{ |
944 |
int keycode; |
|
945 |
|
|
946 |
keycode = keysym2scancode(vs->kbd_layout, sym & 0xFFFF); |
|
947 |
|
|
948 | 944 |
/* QEMU console switch */ |
949 | 945 |
switch(keycode) { |
950 | 946 |
case 0x2a: /* Left Shift */ |
... | ... | |
1046 | 1042 |
|
1047 | 1043 |
static void key_event(VncState *vs, int down, uint32_t sym) |
1048 | 1044 |
{ |
1045 |
int keycode; |
|
1046 |
|
|
1049 | 1047 |
if (sym >= 'A' && sym <= 'Z' && is_graphic_console()) |
1050 | 1048 |
sym = sym - 'A' + 'a'; |
1051 |
do_key_event(vs, down, sym); |
|
1049 |
|
|
1050 |
keycode = keysym2scancode(vs->kbd_layout, sym & 0xFFFF); |
|
1051 |
do_key_event(vs, down, keycode, sym); |
|
1052 |
} |
|
1053 |
|
|
1054 |
static void ext_key_event(VncState *vs, int down, |
|
1055 |
uint32_t sym, uint16_t keycode) |
|
1056 |
{ |
|
1057 |
/* if the user specifies a keyboard layout, always use it */ |
|
1058 |
if (keyboard_layout) |
|
1059 |
key_event(vs, down, sym); |
|
1060 |
else |
|
1061 |
do_key_event(vs, down, keycode, sym); |
|
1052 | 1062 |
} |
1053 | 1063 |
|
1054 | 1064 |
static void framebuffer_update_request(VncState *vs, int incremental, |
... | ... | |
1078 | 1088 |
} |
1079 | 1089 |
} |
1080 | 1090 |
|
1091 |
static void send_ext_key_event_ack(VncState *vs) |
|
1092 |
{ |
|
1093 |
vnc_write_u8(vs, 0); |
|
1094 |
vnc_write_u8(vs, 0); |
|
1095 |
vnc_write_u16(vs, 1); |
|
1096 |
vnc_framebuffer_update(vs, 0, 0, vs->ds->width, vs->ds->height, -258); |
|
1097 |
vnc_flush(vs); |
|
1098 |
} |
|
1099 |
|
|
1081 | 1100 |
static void set_encodings(VncState *vs, int32_t *encodings, size_t n_encodings) |
1082 | 1101 |
{ |
1083 | 1102 |
int i; |
... | ... | |
1105 | 1124 |
case -257: |
1106 | 1125 |
vs->has_pointer_type_change = 1; |
1107 | 1126 |
break; |
1127 |
case -258: |
|
1128 |
send_ext_key_event_ack(vs); |
|
1129 |
break; |
|
1108 | 1130 |
default: |
1109 | 1131 |
break; |
1110 | 1132 |
} |
... | ... | |
1256 | 1278 |
|
1257 | 1279 |
client_cut_text(vs, read_u32(data, 4), data + 8); |
1258 | 1280 |
break; |
1281 |
case 255: |
|
1282 |
if (len == 1) |
|
1283 |
return 2; |
|
1284 |
|
|
1285 |
switch (read_u8(data, 1)) { |
|
1286 |
case 0: |
|
1287 |
if (len == 2) |
|
1288 |
return 12; |
|
1289 |
|
|
1290 |
ext_key_event(vs, read_u16(data, 2), |
|
1291 |
read_u32(data, 4), read_u32(data, 8)); |
|
1292 |
break; |
|
1293 |
default: |
|
1294 |
printf("Msg: %d\n", read_u16(data, 0)); |
|
1295 |
vnc_client_error(vs); |
|
1296 |
break; |
|
1297 |
} |
|
1298 |
break; |
|
1259 | 1299 |
default: |
1260 | 1300 |
printf("Msg: %d\n", data[0]); |
1261 | 1301 |
vnc_client_error(vs); |
... | ... | |
1974 | 2014 |
|
1975 | 2015 |
vs->ds = ds; |
1976 | 2016 |
|
1977 |
if (!keyboard_layout) |
|
1978 |
keyboard_layout = "en-us"; |
|
2017 |
if (keyboard_layout) |
|
2018 |
vs->kbd_layout = init_keyboard_layout(keyboard_layout); |
|
2019 |
else |
|
2020 |
vs->kbd_layout = init_keyboard_layout("en-us"); |
|
1979 | 2021 |
|
1980 |
vs->kbd_layout = init_keyboard_layout(keyboard_layout); |
|
1981 | 2022 |
if (!vs->kbd_layout) |
1982 | 2023 |
exit(1); |
1983 | 2024 |
|
Also available in: Unified diff