]> xenbits.xensource.com Git - xenclient/ioemu.git/commitdiff
Fix for screenshot and switching.
authorJean Guyader <jean.guyader@eu.citrix.com>
Wed, 3 Dec 2008 17:10:18 +0000 (17:10 +0000)
committerJean Guyader <jean.guyader@eu.citrix.com>
Wed, 3 Dec 2008 17:10:18 +0000 (17:10 +0000)
dom0_driver.c
hw/piix4acpi.c
intel.c
qemu-xen.h
xenstore.c

index 90fd78a40d830d90a37eca2835ca6066b1a17dd9..3ce5a4750acde3c74e512104549b609c68acdb41 100644 (file)
@@ -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)
index 085188424482ece9b15ce4b748f5f45b5e1f7778..7ae65323c85d8b24759044f924133b4abe25b5ae 100644 (file)
@@ -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 25ae423fdd2fa8be519a6618c7f07a832276b048..a8ecfe9e59d99bc8d30afe6a828941c6f2addcd8 100644 (file)
--- 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;
 }
 
index 047f698572fc138e6eff44215d9273a1dc6ba214..c73fafe32c7dd886ebdf22e0f44d628c542ab391 100644 (file)
@@ -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
index 260fbcb887e96d4e5c5efabe2f33e9d37e72f747..a5ac7abeab62e4d94743cf9c7c3a58fd71907df9 100644 (file)
@@ -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));
+}
+