static void dom0_driver_xs_write(const char *key, int val, int controller)
{
- char path[128], str[10];
+ char path[256], str[20];
if (controller == DOM0_MOUSE)
sprintf(path, "mouse/%s", key);
- if (controller == DOM0_KEYBOARD)
+ else if (controller == DOM0_KEYBOARD)
sprintf(path, "keyboard/%s", key);
+ else
+ {
+ DEBUG("unknown controller type\n");
+ exit(2);
+ }
sprintf(str, "%d", val);
xenstore_write_dom0_driver(path, str);
+ DEBUG("write %s=%d\n", path, val);
}
static int dom0_windows_key_switch(int code, int keycode)
unsigned int len;
int pos = 0;
- memset(positions, 0, NB_SLOTS * 4);
+ for (int i = 0; i < NB_SLOTS; i++)
+ positions[i] = 0;
/* Get all the positions */
domids = xenstore_get_domids(&num);
if (controller == DOM0_MOUSE)
{
- if (vga_passthrough)
- {
- char str[10];
-
- sprintf(str, "%d", !grab);
- xenstore_write_dom0_driver("blank", str);
- }
- else
+ if (!vga_passthrough)
{
struct dom0_driver_xs_info info;
struct dom0_driver_xs_info mouse, keyboard;
int ret = 1;
+ if (!vga_passthrough)
+ return 0;
+
dom0_driver_read_xs_info(&mouse, DOM0_MOUSE);
dom0_driver_read_xs_info(&keyboard, DOM0_KEYBOARD);
static void dom0_driver_event_init(const char *str_arg)
{
int positions[NB_SLOTS];
- char str[10];
+ char str[20];
int pos = 0;
int i = 0;
if (vga_passthrough)
{
- char str[10];
+ char str[20];
sprintf(str, "%d", domid);
xenstore_write_dom0_driver("natif", str);
xenstore_watch_dom0_driver("mouse/state", dom0_driver_state_change, NULL);
xenstore_watch_dom0_driver("keyboard/state", dom0_driver_state_change, NULL);
xenstore_watch_dom0_driver("blank", dom0_driver_state_change, NULL);
- xenstore_watch_dom0_driver("command", dom0_driver_command, NULL);
+ if (vga_passthrough)
+ xenstore_watch_dom0_driver("command", dom0_driver_command, NULL);
/* Register the failover switch */
driver.xs_timer = qemu_new_timer(rt_clock, dom0_driver_failover_switch, NULL);
dom0_gr_devices(1, controller);
return;
}
+
}
}
}
DEBUG("switch the keyboard/mouse to slot %d\n", slot);
dom0_driver_switch_controller(slot, DOM0_KEYBOARD);
dom0_driver_switch_controller(slot, DOM0_MOUSE);
+ xenstore_write(path, "done");
}
else if (!strncmp(val, "keyboard ", 9))
{
DEBUG("switch the keyboard to slot %d\n", slot);
dom0_driver_switch_controller(slot, DOM0_KEYBOARD);
+ xenstore_write(path, "done");
}
out:
free(val);
static void dom0_driver_state_change(const char *path, void *opaque)
{
+
if (strstr(path, "/keyboard/state"))
dom0_driver_slots(DOM0_KEYBOARD);
if (strstr(path, "/mouse/state"))
dom0_driver_slots(DOM0_MOUSE);
if (strstr(path, "/blank"))
dom0_driver_blank_done();
+ else
+ {
+ struct dom0_driver_xs_info mouse, keyboard;
+
+ dom0_driver_read_xs_info(&mouse, DOM0_MOUSE);
+ dom0_driver_read_xs_info(&keyboard, DOM0_KEYBOARD);
+
+ if (vga_passthrough && mouse.state == 1 && keyboard.state == 1)
+ {
+ char str[20];
+
+ sprintf(str, "%d", !(mouse.domid == domid));
+ xenstore_write_dom0_driver("blank", str);
+ }
+ }
}
void dom0_driver_init(const char *position)
for (i = 0; xenstore_watch_callbacks && xenstore_watch_callbacks[i].path; i++)
if (!strcmp(vec[XS_WATCH_TOKEN], xenstore_watch_callbacks[i].path))
- {
- fprintf(stderr, "xenstore_callback: call %s\n", vec[XS_WATCH_TOKEN]);
xenstore_watch_callbacks[i].cb(vec[XS_WATCH_TOKEN],
xenstore_watch_callbacks[i].opaque);
- }
if (!strcmp(vec[XS_WATCH_TOKEN], "logdirty")) {
xenstore_process_logdirty_event();
return xs_read(xsh, XBT_NULL, path, &len);
}
+int xenstore_write(const char *path, const char *val)
+{
+ if (xsh == NULL)
+ return 1;
+ return xs_write(xsh, XBT_NULL, path, val, strlen(val));
+}
+