]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
qemu: spice agent-mouse support
authorPeng Zhou <ailvpeng25@gmail.com>
Fri, 9 Mar 2012 07:26:24 +0000 (15:26 +0800)
committerOsier Yang <jyang@redhat.com>
Fri, 9 Mar 2012 07:26:24 +0000 (15:26 +0800)
spice agent-mouse support

Usage:
  <graphics type='spice'>
    <mouse mode='client'|'server'/>
  <graphics/>

Signed-off-by: Osier Yang <jyang@redhat.com>
AUTHORS
docs/formatdomain.html.in
docs/schemas/domaincommon.rng
src/conf/domain_conf.c
src/conf/domain_conf.h
src/libvirt_private.syms
src/qemu/qemu_command.c
tests/qemuxml2argvdata/qemuxml2argv-graphics-spice-agentmouse.args [new file with mode: 0644]
tests/qemuxml2argvdata/qemuxml2argv-graphics-spice-agentmouse.xml [new file with mode: 0644]
tests/qemuxml2argvtest.c

diff --git a/AUTHORS b/AUTHORS
index 954fd1a68e63915dd82b33676202f6bcefb79a2c..e4bd51df12254e77b12a949223a4c2cd38deaada 100644 (file)
--- a/AUTHORS
+++ b/AUTHORS
@@ -224,6 +224,7 @@ Patches have also been contributed by:
   Peter Robinson       <pbrobinson@gmail.com>
   Benjamin Cama        <benoar@dolka.fr>
   Duncan Rance         <libvirt@dunquino.com>
+  Peng Zhou            <ailvpeng25@gmail.com>
 
   [....send patches to get your name here....]
 
index 7710c5bb4d020977113df3943f4e39f0fd098d1d..bf0675e65ff9da1999a5b91ec9ae088287569983 100644 (file)
@@ -2851,6 +2851,7 @@ qemu-kvm -net nic,model=? /dev/null
     &lt;image compression='auto_glz'/&gt;
     &lt;streaming mode='filter'/&gt;
     &lt;clipboard copypaste='no'/&gt;
+    &lt;mouse mode='client'/&gt;
   &lt;/graphics&gt;</pre>
             <p>
               Spice supports variable compression settings for audio,
@@ -2883,6 +2884,13 @@ qemu-kvm -net nic,model=? /dev/null
               to <code>no</code>, <span class="since">since
               0.9.3</span>.
             </p>
+            <p>
+              Mouse mode is set by the <code>mouse<code/> element,
+              setting it's <code>mode<code/> attribute to one of
+              <code>server</code> or <code>client</code> ,
+              <span class="since">since 0.9.11</span>. If no mode is
+              specified, the qemu default will be used (client mode).
+            </p>
           </dd>
           <dt><code>"rdp"</code></dt>
           <dd>
index 073ad37d66cb74025ea234c3b768b2c016bf9187..646a51b748549ba50fa8c19d2dfeefbf9b26e76c 100644 (file)
                 <empty/>
               </element>
             </optional>
+            <optional>
+              <element name="mouse">
+                <attribute name="mode">
+                  <choice>
+                    <value>server</value>
+                    <value>client</value>
+                  </choice>
+                </attribute>
+                <empty/>
+              </element>
+            </optional>
           </interleave>
         </group>
         <group>
index 333b10eab39d8593b5ca8c223503a6a311f2fb89..b185fe79af44741e503313f913bfda9377beb961 100644 (file)
@@ -465,6 +465,12 @@ VIR_ENUM_IMPL(virDomainGraphicsSpicePlaybackCompression,
               "on",
               "off");
 
+VIR_ENUM_IMPL(virDomainGraphicsSpiceMouseMode,
+              VIR_DOMAIN_GRAPHICS_SPICE_MOUSE_MODE_LAST,
+              "default",
+              "server",
+              "client");
+
 VIR_ENUM_IMPL(virDomainGraphicsSpiceStreamingMode,
               VIR_DOMAIN_GRAPHICS_SPICE_STREAMING_MODE_LAST,
               "default",
@@ -6180,6 +6186,26 @@ virDomainGraphicsDefParseXML(xmlNodePtr node,
                     VIR_FREE(copypaste);
 
                     def->data.spice.copypaste = copypasteVal;
+                } else if (xmlStrEqual(cur->name, BAD_CAST "mouse")) {
+                    const char *mode = virXMLPropString(cur, "mode");
+                    int modeVal;
+
+                    if (!mode) {
+                        virDomainReportError(VIR_ERR_XML_ERROR, "%s",
+                                             _("spice mouse missing mode"));
+                        goto error;
+                    }
+
+                    if ((modeVal = virDomainGraphicsSpiceMouseModeTypeFromString(mode)) <= 0) {
+                        virDomainReportError(VIR_ERR_XML_ERROR,
+                                             _("unknown mouse mode value '%s'"),
+                                             mode);
+                        VIR_FREE(mode);
+                        goto error;
+                    }
+                    VIR_FREE(mode);
+
+                    def->data.spice.mousemode = modeVal;
                 }
             }
             cur = cur->next;
@@ -11896,7 +11922,8 @@ virDomainGraphicsDefFormat(virBufferPtr buf,
         }
         if (!children && (def->data.spice.image || def->data.spice.jpeg ||
                           def->data.spice.zlib || def->data.spice.playback ||
-                          def->data.spice.streaming || def->data.spice.copypaste)) {
+                          def->data.spice.streaming || def->data.spice.copypaste ||
+                          def->data.spice.mousemode)) {
             virBufferAddLit(buf, ">\n");
             children = 1;
         }
@@ -11915,6 +11942,9 @@ virDomainGraphicsDefFormat(virBufferPtr buf,
         if (def->data.spice.streaming)
             virBufferAsprintf(buf, "      <streaming mode='%s'/>\n",
                               virDomainGraphicsSpiceStreamingModeTypeToString(def->data.spice.streaming));
+        if (def->data.spice.mousemode)
+            virBufferAsprintf(buf, "      <mouse mode='%s'/>\n",
+                              virDomainGraphicsSpiceMouseModeTypeToString(def->data.spice.mousemode));
         if (def->data.spice.copypaste)
             virBufferAsprintf(buf, "      <clipboard copypaste='%s'/>\n",
                               virDomainGraphicsSpiceClipboardCopypasteTypeToString(def->data.spice.copypaste));
index 0f40f1d72159ee4f71678c65b68c803d987f0378..6fc307e3c1920208dd59f1e58b7e1fd6801b01b2 100644 (file)
@@ -1135,6 +1135,14 @@ enum virDomainGraphicsSpicePlaybackCompression {
     VIR_DOMAIN_GRAPHICS_SPICE_PLAYBACK_COMPRESSION_LAST
 };
 
+enum virDomainGraphicsSpiceMouseMode {
+    VIR_DOMAIN_GRAPHICS_SPICE_MOUSE_MODE_DEFAULT = 0,
+    VIR_DOMAIN_GRAPHICS_SPICE_MOUSE_MODE_SERVER,
+    VIR_DOMAIN_GRAPHICS_SPICE_MOUSE_MODE_CLIENT,
+
+    VIR_DOMAIN_GRAPHICS_SPICE_MOUSE_MODE_LAST
+};
+
 enum virDomainGraphicsSpiceStreamingMode {
     VIR_DOMAIN_GRAPHICS_SPICE_STREAMING_MODE_DEFAULT = 0,
     VIR_DOMAIN_GRAPHICS_SPICE_STREAMING_MODE_FILTER,
@@ -1202,6 +1210,7 @@ struct _virDomainGraphicsDef {
         struct {
             int port;
             int tlsPort;
+            int mousemode;
             char *keymap;
             virDomainGraphicsAuthDef auth;
             unsigned int autoport :1;
@@ -2124,6 +2133,7 @@ VIR_ENUM_DECL(virDomainGraphicsSpiceZlibCompression)
 VIR_ENUM_DECL(virDomainGraphicsSpicePlaybackCompression)
 VIR_ENUM_DECL(virDomainGraphicsSpiceStreamingMode)
 VIR_ENUM_DECL(virDomainGraphicsSpiceClipboardCopypaste)
+VIR_ENUM_DECL(virDomainGraphicsSpiceMouseMode)
 VIR_ENUM_DECL(virDomainNumatuneMemMode)
 VIR_ENUM_DECL(virDomainSnapshotState)
 /* from libvirt.h */
index 2a0b4d5b16a01b05b39127c26681a19c2736e8c1..d7ec221b630d01f265c051ed43b272e9ef4944d9 100644 (file)
@@ -345,6 +345,8 @@ virDomainGraphicsSpiceImageCompressionTypeFromString;
 virDomainGraphicsSpiceImageCompressionTypeToString;
 virDomainGraphicsSpiceJpegCompressionTypeFromString;
 virDomainGraphicsSpiceJpegCompressionTypeToString;
+virDomainGraphicsSpiceMouseModeTypeFromString;
+virDomainGraphicsSpiceMouseModeTypeToString;
 virDomainGraphicsSpicePlaybackCompressionTypeFromString;
 virDomainGraphicsSpicePlaybackCompressionTypeToString;
 virDomainGraphicsSpiceStreamingModeTypeFromString;
index d95064f85aabb8f7e8c9e48c78a5fe3a53658fb6..0ef3e3085584c11fe7717fae55264ce1a8e7c512 100644 (file)
@@ -5424,6 +5424,20 @@ qemuBuildCommandLine(virConnectPtr conn,
 
         VIR_FREE(netAddr);
 
+        int mm = def->graphics[0]->data.spice.mousemode;
+        if (mm) {
+            switch (mm) {
+            case VIR_DOMAIN_GRAPHICS_SPICE_MOUSE_MODE_SERVER:
+                virBufferAsprintf(&opt, ",agent-mouse=off");
+                break;
+            case VIR_DOMAIN_GRAPHICS_SPICE_MOUSE_MODE_CLIENT:
+                virBufferAsprintf(&opt, ",agent-mouse=on");
+                break;
+            default:
+                break;
+            }
+        }
+
         /* In the password case we set it via monitor command, to avoid
          * making it visible on CLI, so there's no use of password=XXX
          * in this bit of the code */
diff --git a/tests/qemuxml2argvdata/qemuxml2argv-graphics-spice-agentmouse.args b/tests/qemuxml2argvdata/qemuxml2argv-graphics-spice-agentmouse.args
new file mode 100644 (file)
index 0000000..2c3ef06
--- /dev/null
@@ -0,0 +1,8 @@
+LC_ALL=C PATH=/bin HOME=/home/test USER=test LOGNAME=test QEMU_AUDIO_DRV=spice \
+/usr/bin/qemu -S -M pc -m 214 -smp 1 -nodefconfig -nodefaults \
+-monitor unix:/tmp/test-monitor,server,nowait -no-acpi -boot c \
+-device virtio-serial-pci,id=virtio-serial1,bus=pci.0,addr=0xa \
+-hda /dev/HostVG/QEMUGuest1 -chardev spicevmc,id=charchannel0,name=vdagent \
+-device virtserialport,bus=virtio-serial1.0,nr=3,chardev=charchannel0,id=channel0,name=com.redhat.spice.0 \
+-usb -spice port=5903,tls-port=5904,addr=127.0.0.1,agent-mouse=off,x509-dir=/etc/pki/libvirt-spice,tls-channel=main \
+-device virtio-balloon-pci,id=balloon0,bus=pci.0,addr=0x3
diff --git a/tests/qemuxml2argvdata/qemuxml2argv-graphics-spice-agentmouse.xml b/tests/qemuxml2argvdata/qemuxml2argv-graphics-spice-agentmouse.xml
new file mode 100644 (file)
index 0000000..facc7ac
--- /dev/null
@@ -0,0 +1,36 @@
+<domain type='qemu'>
+  <name>QEMUGuest1</name>
+  <uuid>c7a5fdbd-edaf-9455-926a-d65c16db1809</uuid>
+  <memory>219136</memory>
+  <vcpu cpuset='1-4,8-20,525'>1</vcpu>
+  <os>
+    <type arch='i686' machine='pc'>hvm</type>
+    <boot dev='hd'/>
+  </os>
+  <clock offset='utc'/>
+  <on_poweroff>destroy</on_poweroff>
+  <on_reboot>restart</on_reboot>
+  <on_crash>destroy</on_crash>
+  <devices>
+    <emulator>/usr/bin/qemu</emulator>
+    <disk type='block' device='disk'>
+      <source dev='/dev/HostVG/QEMUGuest1'/>
+      <target dev='hda' bus='ide'/>
+      <address type='drive' controller='0' bus='0' target='0' unit='0'/>
+    </disk>
+    <controller type='usb' index='0'/>
+    <controller type='ide' index='0'/>
+    <controller type='virtio-serial' index='1'>
+      <address type='pci' domain='0x0000' bus='0x00' slot='0x0a' function='0x0'/>
+    </controller>
+    <graphics type='spice' port='5903' tlsPort='5904' autoport='no' listen='127.0.0.1'>
+      <mouse mode='server'/>
+      <channel name='main' mode='secure'/>
+    </graphics>
+    <channel type='spicevmc'>
+      <target type='virtio' name='com.redhat.spice.0'/>
+      <address type='virtio-serial' controller='1' bus='0' port='3'/>
+    </channel>
+    <memballoon model='virtio'/>
+  </devices>
+</domain>
index 0abc9cf0db7ce537e2c36866139b3834164cb78e..3cfd69c2c1d04437059f62f093f9ec917fbf6967 100644 (file)
@@ -511,6 +511,9 @@ mymain(void)
     DO_TEST("graphics-spice", false,
             QEMU_CAPS_VGA, QEMU_CAPS_VGA_QXL,
             QEMU_CAPS_DEVICE, QEMU_CAPS_SPICE);
+    DO_TEST("graphics-spice-agentmouse", false,
+            QEMU_CAPS_VGA, QEMU_CAPS_VGA_QXL,
+            QEMU_CAPS_DEVICE, QEMU_CAPS_SPICE);
     DO_TEST("graphics-spice-compression", false,
             QEMU_CAPS_VGA, QEMU_CAPS_VGA_QXL,
             QEMU_CAPS_DEVICE, QEMU_CAPS_SPICE);