Add qemu extended key events
parent
efaa2bf265
commit
dbe35bc3ad
|
@ -101,6 +101,7 @@ struct nvnc {
|
||||||
char name[256];
|
char name[256];
|
||||||
void* userdata;
|
void* userdata;
|
||||||
nvnc_key_fn key_fn;
|
nvnc_key_fn key_fn;
|
||||||
|
nvnc_key_fn key_code_fn;
|
||||||
nvnc_pointer_fn pointer_fn;
|
nvnc_pointer_fn pointer_fn;
|
||||||
nvnc_fb_req_fn fb_req_fn;
|
nvnc_fb_req_fn fb_req_fn;
|
||||||
nvnc_client_fn new_client_fn;
|
nvnc_client_fn new_client_fn;
|
||||||
|
|
|
@ -37,7 +37,7 @@ enum nvnc_fb_flags {
|
||||||
NVNC_FB_PARTIAL = 1 << 0, // The buffer contains only the damaged region
|
NVNC_FB_PARTIAL = 1 << 0, // The buffer contains only the damaged region
|
||||||
};
|
};
|
||||||
|
|
||||||
typedef void (*nvnc_key_fn)(struct nvnc_client*, uint32_t keysym,
|
typedef void (*nvnc_key_fn)(struct nvnc_client*, uint32_t key,
|
||||||
bool is_pressed);
|
bool is_pressed);
|
||||||
typedef void (*nvnc_pointer_fn)(struct nvnc_client*, uint16_t x, uint16_t y,
|
typedef void (*nvnc_pointer_fn)(struct nvnc_client*, uint16_t x, uint16_t y,
|
||||||
enum nvnc_button_mask);
|
enum nvnc_button_mask);
|
||||||
|
@ -67,6 +67,7 @@ struct nvnc* nvnc_client_get_server(const struct nvnc_client* client);
|
||||||
void nvnc_set_name(struct nvnc* self, const char* name);
|
void nvnc_set_name(struct nvnc* self, const char* name);
|
||||||
|
|
||||||
void nvnc_set_key_fn(struct nvnc* self, nvnc_key_fn);
|
void nvnc_set_key_fn(struct nvnc* self, nvnc_key_fn);
|
||||||
|
void nvnc_set_key_code_fn(struct nvnc* self, nvnc_key_fn);
|
||||||
void nvnc_set_pointer_fn(struct nvnc* self, nvnc_pointer_fn);
|
void nvnc_set_pointer_fn(struct nvnc* self, nvnc_pointer_fn);
|
||||||
void nvnc_set_fb_req_fn(struct nvnc* self, nvnc_fb_req_fn);
|
void nvnc_set_fb_req_fn(struct nvnc* self, nvnc_fb_req_fn);
|
||||||
void nvnc_set_new_client_fn(struct nvnc* self, nvnc_client_fn);
|
void nvnc_set_new_client_fn(struct nvnc* self, nvnc_client_fn);
|
||||||
|
|
50
src/server.c
50
src/server.c
|
@ -484,6 +484,7 @@ static int on_client_set_encodings(struct nvnc_client* client)
|
||||||
case RFB_ENCODING_DESKTOPSIZE:
|
case RFB_ENCODING_DESKTOPSIZE:
|
||||||
case RFB_ENCODING_JPEG_HIGHQ:
|
case RFB_ENCODING_JPEG_HIGHQ:
|
||||||
case RFB_ENCODING_JPEG_LOWQ:
|
case RFB_ENCODING_JPEG_LOWQ:
|
||||||
|
case RFB_ENCODING_QEMU_EXT_KEY_EVENT:
|
||||||
client->encodings[n++] = encoding;
|
client->encodings[n++] = encoding;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -619,6 +620,47 @@ static int on_client_key_event(struct nvnc_client* client)
|
||||||
return sizeof(*msg);
|
return sizeof(*msg);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int on_client_qemu_key_event(struct nvnc_client* client)
|
||||||
|
{
|
||||||
|
struct nvnc* server = client->server;
|
||||||
|
|
||||||
|
struct rfb_client_qemu_key_event_msg* msg =
|
||||||
|
(struct rfb_client_qemu_key_event_msg*)(client->msg_buffer +
|
||||||
|
client->buffer_index);
|
||||||
|
|
||||||
|
if (client->buffer_len - client->buffer_index < sizeof(*msg))
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
int down_flag = msg->down_flag;
|
||||||
|
uint32_t keycode = ntohl(msg->keycode);
|
||||||
|
|
||||||
|
nvnc_key_fn fn = server->key_code_fn;
|
||||||
|
if (fn)
|
||||||
|
fn(client, keycode, !!down_flag);
|
||||||
|
|
||||||
|
return sizeof(*msg);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int on_client_qemu_event(struct nvnc_client* client)
|
||||||
|
{
|
||||||
|
if (client->buffer_len - client->buffer_index < 2)
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
enum rfb_client_to_server_qemu_msg_type subtype =
|
||||||
|
client->msg_buffer[client->buffer_index + 1];
|
||||||
|
|
||||||
|
switch (subtype) {
|
||||||
|
case RFB_CLIENT_TO_SERVER_QEMU_KEY_EVENT:
|
||||||
|
return on_client_qemu_key_event(client);
|
||||||
|
}
|
||||||
|
|
||||||
|
log_debug("Got uninterpretable qemu message from client: %p (ref %d)\n",
|
||||||
|
client, client->ref);
|
||||||
|
stream_close(client->net_stream);
|
||||||
|
client_unref(client);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static int on_client_pointer_event(struct nvnc_client* client)
|
static int on_client_pointer_event(struct nvnc_client* client)
|
||||||
{
|
{
|
||||||
struct nvnc* server = client->server;
|
struct nvnc* server = client->server;
|
||||||
|
@ -771,6 +813,8 @@ static int on_client_message(struct nvnc_client* client)
|
||||||
return on_client_pointer_event(client);
|
return on_client_pointer_event(client);
|
||||||
case RFB_CLIENT_TO_SERVER_CLIENT_CUT_TEXT:
|
case RFB_CLIENT_TO_SERVER_CLIENT_CUT_TEXT:
|
||||||
return on_client_cut_text(client);
|
return on_client_cut_text(client);
|
||||||
|
case RFB_CLIENT_TO_SERVER_QEMU:
|
||||||
|
return on_client_qemu_event(client);
|
||||||
}
|
}
|
||||||
|
|
||||||
log_debug("Got uninterpretable message from client: %p (ref %d)\n",
|
log_debug("Got uninterpretable message from client: %p (ref %d)\n",
|
||||||
|
@ -1322,6 +1366,12 @@ void nvnc_set_key_fn(struct nvnc* self, nvnc_key_fn fn)
|
||||||
self->key_fn = fn;
|
self->key_fn = fn;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
EXPORT
|
||||||
|
void nvnc_set_key_code_fn(struct nvnc* self, nvnc_key_fn fn)
|
||||||
|
{
|
||||||
|
self->key_code_fn = fn;
|
||||||
|
}
|
||||||
|
|
||||||
EXPORT
|
EXPORT
|
||||||
void nvnc_set_pointer_fn(struct nvnc* self, nvnc_pointer_fn fn)
|
void nvnc_set_pointer_fn(struct nvnc* self, nvnc_pointer_fn fn)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue