}
*/
+static void
+spiceterm_motion_event(spiceTerm *vt, uint32_t x, uint32_t y, uint32_t buttons)
+{
+ DPRINTF(0, "mask=%08x x=%d y=%d", buttons, x ,y);
+}
+
static void
my_kbd_push_key(SpiceKbdInstance *sin, uint8_t frag)
{
}
static SpiceKbdInterface my_keyboard_sif = {
- .base.type = SPICE_INTERFACE_KEYBOARD ,
+ .base.type = SPICE_INTERFACE_KEYBOARD,
.base.description = "spiceterm keyboard device",
.base.major_version = SPICE_INTERFACE_KEYBOARD_MAJOR,
.base.minor_version = SPICE_INTERFACE_KEYBOARD_MINOR,
.get_leds = my_kbd_get_leds,
};
-spiceTerm *
-create_spiceterm(int argc, char** argv, int maxx, int maxy)
+/* vdagent interface - to get mouse/clipboarde support */
+static int
+vmc_write(SpiceCharDeviceInstance *sin, const uint8_t *buf, int len)
+{
+ spiceTerm *vt = SPICE_CONTAINEROF(sin, spiceTerm, vdagent_sin);
+
+ VDIChunkHeader *hdr = (VDIChunkHeader *)buf;
+ VDAgentMessage *msg = (VDAgentMessage *)&hdr[1];
+
+ //g_assert(hdr->port == VDP_SERVER_PORT);
+ g_assert(msg->protocol == VD_AGENT_PROTOCOL);
+
+ DPRINTF(1, "%d %d %d %d", len, hdr->port, msg->protocol, msg->type);
+
+ if (msg->type == VD_AGENT_MOUSE_STATE) {
+ VDAgentMouseState *info = (VDAgentMouseState *)&msg[1];
+ spiceterm_motion_event(vt, info->x, info->y, info->buttons);
+ } else if (msg->type == VD_AGENT_ANNOUNCE_CAPABILITIES) {
+ /* ignore for now */
+ } else if (msg->type == VD_AGENT_MONITORS_CONFIG) {
+ /* ignore for now */
+ } else {
+ DPRINTF(0, "got uknown vdagent message type %d\n", msg->type);
+ }
+
+ return len;
+}
+
+static int
+vmc_read(SpiceCharDeviceInstance *sin, uint8_t *buf, int len)
+{
+ DPRINTF(0, "%d", len);
+
+ return 0;
+}
+
+static void
+vmc_state(SpiceCharDeviceInstance *sin, int connected)
+{
+
+}
+
+static SpiceCharDeviceInterface my_vdagent_sif = {
+ .base.type = SPICE_INTERFACE_CHAR_DEVICE,
+ .base.description = "spice virtual channel char device",
+ .base.major_version = SPICE_INTERFACE_CHAR_DEVICE_MAJOR,
+ .base.minor_version = SPICE_INTERFACE_CHAR_DEVICE_MINOR,
+ .state = vmc_state,
+ .write = vmc_write,
+ .read = vmc_read,
+};
+
+static spiceTerm *
+create_spiceterm(int argc, char** argv, int maxx, int maxy, guint timeout)
{
int i;
SpiceScreen *spice_screen;
SpiceCoreInterface *core = basic_event_loop_init();
- spice_screen = spice_screen_new(core);
+ spice_screen = spice_screen_new(core, timeout);
//spice_server_set_image_compression(server, SPICE_IMAGE_COMPRESS_OFF);
spiceTerm *vt = (spiceTerm *)calloc (sizeof(spiceTerm), 1);
vt->keyboard_sin.base.sif = &my_keyboard_sif.base;
spice_server_add_interface(spice_screen->server, &vt->keyboard_sin.base);
+ vt->vdagent_sin.base.sif = &my_vdagent_sif.base;
+ vt->vdagent_sin.subtype = "vdagent";
+ spice_server_add_interface(spice_screen->server, &vt->vdagent_sin.base);
+
// screen->setXCutText = spiceterm_set_xcut_text;
// screen->ptrAddEvent = spiceterm_pointer_event;
// screen->newClientHook = new_client;
if (0) print_usage(NULL); // fixme:
- spiceTerm *vt = create_spiceterm (argc, argv, 745, 400);
+ spiceTerm *vt = create_spiceterm (argc, argv, 745, 400, 10);
setlocale(LC_ALL, ""); // set from environment