From: Jean Guyader Date: Wed, 3 Dec 2008 17:10:18 +0000 (+0000) Subject: Fix for screenshot and switching. X-Git-Url: http://xenbits.xensource.com/gitweb?a=commitdiff_plain;h=36f62c422bf008b1f305861838ed79d2bc26b590;p=xenclient%2Fioemu.git Fix for screenshot and switching. --- diff --git a/dom0_driver.c b/dom0_driver.c index 90fd78a4..3ce5a475 100644 --- a/dom0_driver.c +++ b/dom0_driver.c @@ -139,15 +139,21 @@ static void dom0_driver_read_xs_info(struct dom0_driver_xs_info *info, 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) @@ -265,7 +271,8 @@ static void dom0_get_positions(int *positions) 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); @@ -392,14 +399,7 @@ static void dom0_gr_devices(int grab, int controller) 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; @@ -436,6 +436,9 @@ static int dom0_driver_failover_switch(void *opaque) 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); @@ -515,7 +518,7 @@ static void dom0_driver_dev_init(void) 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; @@ -536,7 +539,7 @@ static void dom0_driver_event_init(const char *str_arg) if (vga_passthrough) { - char str[10]; + char str[20]; sprintf(str, "%d", domid); xenstore_write_dom0_driver("natif", str); @@ -545,7 +548,8 @@ static void dom0_driver_event_init(const char *str_arg) 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); @@ -581,6 +585,7 @@ static void dom0_driver_slots(int controller) dom0_gr_devices(1, controller); return; } + } } } @@ -610,6 +615,7 @@ void dom0_driver_command(const char *path, void *opaque) 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)) { @@ -620,6 +626,7 @@ void dom0_driver_command(const char *path, void *opaque) DEBUG("switch the keyboard to slot %d\n", slot); dom0_driver_switch_controller(slot, DOM0_KEYBOARD); + xenstore_write(path, "done"); } out: free(val); @@ -643,12 +650,28 @@ static void dom0_driver_blank_done(void) 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) diff --git a/hw/piix4acpi.c b/hw/piix4acpi.c index 08518842..7ae65323 100644 --- a/hw/piix4acpi.c +++ b/hw/piix4acpi.c @@ -287,7 +287,6 @@ static void gpe_en_write(void *opaque, uint32_t addr, uint32_t val) GPEState *s = opaque; int reg_count; - fprintf(logfile, "gpe_en_write: addr=0x%x, val=0x%x.\n", addr, val); reg_count = addr - (ACPI_GPE0_BLK_ADDRESS + ACPI_GPE0_BLK_LEN / 2); s->gpe0_en[reg_count] = val; /* If disable GPE bit right after generating SCI on it, diff --git a/intel.c b/intel.c index 25ae423f..a8ecfe9e 100644 --- a/intel.c +++ b/intel.c @@ -204,7 +204,12 @@ static void intel_init_mapping(void) void intel_focus(int focus) { if (focus) + { + INTEL_DEBUG("Get the focus\n"); intel_update_tiled(lds, 0, 0, lds->width, lds->height); + } + else + INTEL_DEBUG("Lost the focus\n"); intel_have_focus = focus; } diff --git a/qemu-xen.h b/qemu-xen.h index 047f6985..c73fafe3 100644 --- a/qemu-xen.h +++ b/qemu-xen.h @@ -85,8 +85,9 @@ int xenstore_dom_write(int domid, char *key, char *value); int *xenstore_get_domids(int *len); char *xenstore_read(const char *path); +int xenstore_write(const char *path, const char *val); - /* `danger' means that this parameter, variable or function refers to +/* `danger' means that this parameter, variable or function refers to * an area of xenstore which is writeable by the guest and thus must * not be trusted by qemu code. For variables containing xenstore * paths, `danger' can mean that both the path refers to a diff --git a/xenstore.c b/xenstore.c index 260fbcb8..a5ac7abe 100644 --- a/xenstore.c +++ b/xenstore.c @@ -838,11 +838,8 @@ void xenstore_process_event(void *opaque) 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(); @@ -1598,4 +1595,11 @@ char *xenstore_read(const char *path) 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)); +} +