[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]

[libvirt] [Patch]: spice agent-mouse support.[v2]



Signed-off-by: Zhou Peng <zhoupeng nfs iscas ac cn>

spice agent-mouse support

diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in
index 6fcca94..d6d2f36 100644
--- a/docs/formatdomain.html.in
+++ b/docs/formatdomain.html.in
@@ -2742,7 +2742,10 @@ qemu-kvm -net nic,model=? /dev/null
               while <code>tlsPort</code> gives an alternative secure
               port number. The <code>autoport</code> attribute is the
               new preferred syntax for indicating autoallocation of
-              both port numbers.  The <code>listen</code> attribute is
+              both port numbers. The <code>agentmouse</code> attribute
+              is used to specify whether spice agent is used for client
+              mouse mode(default is on).
+              The <code>listen</code> attribute is
               an IP address for the server to listen
               on. The <code>passwd</code> attribute provides a SPICE
               password in clear text. The <code>keymap</code>
diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng
index 3908733..97b40d7 100644
--- a/docs/schemas/domaincommon.rng
+++ b/docs/schemas/domaincommon.rng
@@ -1650,6 +1650,14 @@
             </attribute>
           </optional>
           <optional>
+            <attribute name="agentmouse">
+              <choice>
+                <value>on</value>
+                <value>off</value>
+              </choice>
+            </attribute>
+          </optional>
+          <optional>
             <attribute name="listen">
               <ref name="addrIPorName"/>
             </attribute>
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index f9654f1..a5f88ec 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -460,6 +460,12 @@ VIR_ENUM_IMPL(virDomainGraphicsSpicePlaybackCompression,
               "on",
               "off");

+VIR_ENUM_IMPL(virDomainGraphicsSpiceAgentMouse,
+              VIR_DOMAIN_GRAPHICS_SPICE_AGENT_MOUSE_LAST,
+              "default",
+              "on",
+              "off");
+
 VIR_ENUM_IMPL(virDomainGraphicsSpiceStreamingMode,
               VIR_DOMAIN_GRAPHICS_SPICE_STREAMING_MODE_LAST,
               "default",
@@ -5288,6 +5294,7 @@ virDomainGraphicsDefParseXML(xmlNodePtr node,
     int nListens;
     xmlNodePtr *listenNodes = NULL;
     char *listenAddr = NULL;
+    char *agentmouse = NULL;
     xmlNodePtr save = ctxt->node;

     if (VIR_ALLOC(def) < 0) {
@@ -5543,6 +5550,20 @@ virDomainGraphicsDefParseXML(xmlNodePtr node,
             VIR_FREE(autoport);
         }

+        if ((agentmouse = virXMLPropString(node, "agentmouse")) != NULL) {
+            int am;
+            if ((am = virDomainGraphicsSpiceAgentMouseTypeFromString(
+                agentmouse)) <= 0) {
+                virDomainReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+                                     _("unknown spice agentmouse mode '%s'"),
+                                     agentmouse);
+                VIR_FREE(agentmouse);
+                goto error;
+            }
+            VIR_FREE(agentmouse);
+            def->data.spice.agentmouse = am;
+        }
+
         def->data.spice.keymap = virXMLPropString(node, "keymap");

         if (virDomainGraphicsAuthDefParseXML(node, &def->data.spice.auth,
@@ -11255,6 +11276,8 @@ virDomainGraphicsDefFormat(virBufferPtr buf,
 {
     const char *type = virDomainGraphicsTypeToString(def->type);
     const char *listenAddr = NULL;
+    const char *agentmouse = virDomainGraphicsSpiceAgentMouseTypeToString(
+                             def->data.spice.agentmouse);
     int children = 0;
     int i;

@@ -11364,6 +11387,9 @@ virDomainGraphicsDefFormat(virBufferPtr buf,
         if (listenAddr)
             virBufferAsprintf(buf, " listen='%s'", listenAddr);

+        if (def->data.spice.agentmouse)
+            virBufferEscapeString(buf, " agentmouse='%s'", agentmouse);
+
         if (def->data.spice.keymap)
             virBufferEscapeString(buf, " keymap='%s'",
                                   def->data.spice.keymap);
diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
index 596be4d..bdc9a45 100644
--- a/src/conf/domain_conf.h
+++ b/src/conf/domain_conf.h
@@ -1003,6 +1003,14 @@ enum virDomainGraphicsSpicePlaybackCompression {
     VIR_DOMAIN_GRAPHICS_SPICE_PLAYBACK_COMPRESSION_LAST
 };

+enum virDomainGraphicsSpiceAgentMouse {
+    VIR_DOMAIN_GRAPHICS_SPICE_AGENT_MOUSE_DEFAULT = 0,
+    VIR_DOMAIN_GRAPHICS_SPICE_AGENT_MOUSE_ON,
+    VIR_DOMAIN_GRAPHICS_SPICE_AGENT_MOUSE_OFF,
+
+    VIR_DOMAIN_GRAPHICS_SPICE_AGENT_MOUSE_LAST
+};
+
 enum virDomainGraphicsSpiceStreamingMode {
     VIR_DOMAIN_GRAPHICS_SPICE_STREAMING_MODE_DEFAULT = 0,
     VIR_DOMAIN_GRAPHICS_SPICE_STREAMING_MODE_FILTER,
@@ -1072,6 +1080,7 @@ struct _virDomainGraphicsDef {
         struct {
             int port;
             int tlsPort;
+            int agentmouse;
             char *keymap;
             virDomainGraphicsAuthDef auth;
             unsigned int autoport :1;
@@ -2061,6 +2070,7 @@ VIR_ENUM_DECL(virDomainGraphicsSpiceZlibCompression)
 VIR_ENUM_DECL(virDomainGraphicsSpicePlaybackCompression)
 VIR_ENUM_DECL(virDomainGraphicsSpiceStreamingMode)
 VIR_ENUM_DECL(virDomainGraphicsSpiceClipboardCopypaste)
+VIR_ENUM_DECL(virDomainGraphicsSpiceAgentMouse)
 VIR_ENUM_DECL(virDomainNumatuneMemMode)
 VIR_ENUM_DECL(virDomainSnapshotState)
 /* from libvirt.h */
diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
index b9baf9a..ba8523a 100644
--- a/src/libvirt_private.syms
+++ b/src/libvirt_private.syms
@@ -252,6 +252,8 @@ virDomainChrDefFree;
 virDomainChrDefNew;
 virDomainChrSourceDefCopy;
 virDomainChrSourceDefFree;
+virDomainGraphicsSpiceAgentMouseTypeFromString;
+virDomainGraphicsSpiceAgentMouseTypeToString;
 virDomainChrSpicevmcTypeFromString;
 virDomainChrSpicevmcTypeToString;
 virDomainChrTcpProtocolTypeFromString;
diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c
index 64a4546..2bbc077 100644
--- a/src/qemu/qemu_capabilities.c
+++ b/src/qemu/qemu_capabilities.c
@@ -154,6 +154,7 @@ VIR_ENUM_IMPL(qemuCaps, QEMU_CAPS_LAST,
               "drive-iotune", /* 85 */
               "system_wakeup",
               "scsi-disk.channel",
+              "spice-agent-mouse",
     );

 struct qemu_feature_flags {
@@ -1049,8 +1050,13 @@ qemuCapsComputeCmdFlags(const char *help,
         if ((p = strstr(p, "|none")) && p < nl)
             qemuCapsSet(flags, QEMU_CAPS_VGA_NONE);
     }
-    if (strstr(help, "-spice"))
+    if (strstr(help, "-spice")) {
         qemuCapsSet(flags, QEMU_CAPS_SPICE);
+
+        /* If SPICE is avail, agent-mouse option will be avail for qemu,
+         * although 'qemu --help' doesn't show it. */
+        qemuCapsSet(flags, QEMU_CAPS_SPICE_AGENTMOUSE);
+    }
     if (strstr(help, "boot=on"))
         qemuCapsSet(flags, QEMU_CAPS_DRIVE_BOOT);
     if (strstr(help, "serial=s"))
diff --git a/src/qemu/qemu_capabilities.h b/src/qemu/qemu_capabilities.h
index db584ce..2e9faba 100644
--- a/src/qemu/qemu_capabilities.h
+++ b/src/qemu/qemu_capabilities.h
@@ -122,6 +122,7 @@ enum qemuCapsFlags {
     QEMU_CAPS_DRIVE_IOTUNE       = 85, /* -drive bps= and friends */
     QEMU_CAPS_WAKEUP             = 86, /* system_wakeup monitor command */
     QEMU_CAPS_SCSI_DISK_CHANNEL  = 87, /* Is scsi-disk.channel available? */
+    QEMU_CAPS_SPICE_AGENTMOUSE   = 88, /* -spice agent-mouse=on|off */

     QEMU_CAPS_LAST,                   /* this must always be the last item */
 };
diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
index 01adf0d..9d5a9ad 100644
--- a/src/qemu/qemu_command.c
+++ b/src/qemu/qemu_command.c
@@ -5391,6 +5391,18 @@ qemuBuildCommandLine(virConnectPtr conn,

         VIR_FREE(netAddr);

+        const char *agentmouse = virDomainGraphicsSpiceAgentMouseTypeToString(
+                                 def->graphics[0]->data.spice.agentmouse);
+        if (def->graphics[0]->data.spice.agentmouse) {
+            if (qemuCapsGet(qemuCaps, QEMU_CAPS_SPICE_AGENTMOUSE))
+                virBufferAsprintf(&opt, ",agent-mouse=%s", agentmouse);
+            else {
+                qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
+                            _("spice agent-mouse is not supported
with this QEMU"));
+                goto error;
+            }
+        }
+
         /* 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-spice-agentmouse.args
b/tests/qemuxml2argvdata/qemuxml2argv-spice-agentmouse.args
new file mode 100644
index 0000000..46be6d8
--- /dev/null
+++ b/tests/qemuxml2argvdata/qemuxml2argv-spice-agentmouse.args
@@ -0,0 +1,19 @@
+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
+
+#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=on,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-spice-agentmouse.xml
b/tests/qemuxml2argvdata/qemuxml2argv-spice-agentmouse.xml
new file mode 100644
index 0000000..4b36c2c
--- /dev/null
+++ b/tests/qemuxml2argvdata/qemuxml2argv-spice-agentmouse.xml
@@ -0,0 +1,38 @@
+<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' agentmouse='on'>
+-->
+    <graphics type='spice' port='5903' tlsPort='5904' autoport='no'
listen='127.0.0.1' agentmouse='off'>
+      <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>
diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c
index fcffc27..9a27333 100644
--- a/tests/qemuxml2argvtest.c
+++ b/tests/qemuxml2argvtest.c
@@ -514,6 +514,10 @@ mymain(void)
     DO_TEST("graphics-spice-compression", 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,
+            QEMU_CAPS_SPICE_AGENTMOUSE);
     DO_TEST("graphics-spice-timeout", false,
             QEMU_CAPS_DRIVE,
             QEMU_CAPS_VGA, QEMU_CAPS_VGA_QXL,

-- 
Zhou Peng
Signed-off-by: Zhou Peng <zhoupeng nfs iscas ac cn>

spice agent-mouse support

diff --git a/docs/formatdomain.html.in b/docs/formatdomain.html.in
index 6fcca94..d6d2f36 100644
--- a/docs/formatdomain.html.in
+++ b/docs/formatdomain.html.in
@@ -2742,7 +2742,10 @@ qemu-kvm -net nic,model=? /dev/null
               while <code>tlsPort</code> gives an alternative secure
               port number. The <code>autoport</code> attribute is the
               new preferred syntax for indicating autoallocation of
-              both port numbers.  The <code>listen</code> attribute is
+              both port numbers. The <code>agentmouse</code> attribute
+              is used to specify whether spice agent is used for client
+              mouse mode(default is on).
+              The <code>listen</code> attribute is
               an IP address for the server to listen
               on. The <code>passwd</code> attribute provides a SPICE
               password in clear text. The <code>keymap</code>
diff --git a/docs/schemas/domaincommon.rng b/docs/schemas/domaincommon.rng
index 3908733..97b40d7 100644
--- a/docs/schemas/domaincommon.rng
+++ b/docs/schemas/domaincommon.rng
@@ -1650,6 +1650,14 @@
             </attribute>
           </optional>
           <optional>
+            <attribute name="agentmouse">
+              <choice>
+                <value>on</value>
+                <value>off</value>
+              </choice>
+            </attribute>
+          </optional>
+          <optional>
             <attribute name="listen">
               <ref name="addrIPorName"/>
             </attribute>
diff --git a/src/conf/domain_conf.c b/src/conf/domain_conf.c
index f9654f1..a5f88ec 100644
--- a/src/conf/domain_conf.c
+++ b/src/conf/domain_conf.c
@@ -460,6 +460,12 @@ VIR_ENUM_IMPL(virDomainGraphicsSpicePlaybackCompression,
               "on",
               "off");
 
+VIR_ENUM_IMPL(virDomainGraphicsSpiceAgentMouse,
+              VIR_DOMAIN_GRAPHICS_SPICE_AGENT_MOUSE_LAST,
+              "default",
+              "on",
+              "off");
+
 VIR_ENUM_IMPL(virDomainGraphicsSpiceStreamingMode,
               VIR_DOMAIN_GRAPHICS_SPICE_STREAMING_MODE_LAST,
               "default",
@@ -5288,6 +5294,7 @@ virDomainGraphicsDefParseXML(xmlNodePtr node,
     int nListens;
     xmlNodePtr *listenNodes = NULL;
     char *listenAddr = NULL;
+    char *agentmouse = NULL;
     xmlNodePtr save = ctxt->node;
 
     if (VIR_ALLOC(def) < 0) {
@@ -5543,6 +5550,20 @@ virDomainGraphicsDefParseXML(xmlNodePtr node,
             VIR_FREE(autoport);
         }
 
+        if ((agentmouse = virXMLPropString(node, "agentmouse")) != NULL) {
+            int am;
+            if ((am = virDomainGraphicsSpiceAgentMouseTypeFromString(
+                agentmouse)) <= 0) {
+                virDomainReportError(VIR_ERR_CONFIG_UNSUPPORTED,
+                                     _("unknown spice agentmouse mode '%s'"),
+                                     agentmouse);
+                VIR_FREE(agentmouse);
+                goto error;
+            }
+            VIR_FREE(agentmouse);
+            def->data.spice.agentmouse = am;
+        }
+
         def->data.spice.keymap = virXMLPropString(node, "keymap");
 
         if (virDomainGraphicsAuthDefParseXML(node, &def->data.spice.auth,
@@ -11255,6 +11276,8 @@ virDomainGraphicsDefFormat(virBufferPtr buf,
 {
     const char *type = virDomainGraphicsTypeToString(def->type);
     const char *listenAddr = NULL;
+    const char *agentmouse = virDomainGraphicsSpiceAgentMouseTypeToString(
+                             def->data.spice.agentmouse);
     int children = 0;
     int i;
 
@@ -11364,6 +11387,9 @@ virDomainGraphicsDefFormat(virBufferPtr buf,
         if (listenAddr)
             virBufferAsprintf(buf, " listen='%s'", listenAddr);
 
+        if (def->data.spice.agentmouse)
+            virBufferEscapeString(buf, " agentmouse='%s'", agentmouse);
+
         if (def->data.spice.keymap)
             virBufferEscapeString(buf, " keymap='%s'",
                                   def->data.spice.keymap);
diff --git a/src/conf/domain_conf.h b/src/conf/domain_conf.h
index 596be4d..bdc9a45 100644
--- a/src/conf/domain_conf.h
+++ b/src/conf/domain_conf.h
@@ -1003,6 +1003,14 @@ enum virDomainGraphicsSpicePlaybackCompression {
     VIR_DOMAIN_GRAPHICS_SPICE_PLAYBACK_COMPRESSION_LAST
 };
 
+enum virDomainGraphicsSpiceAgentMouse {
+    VIR_DOMAIN_GRAPHICS_SPICE_AGENT_MOUSE_DEFAULT = 0,
+    VIR_DOMAIN_GRAPHICS_SPICE_AGENT_MOUSE_ON,
+    VIR_DOMAIN_GRAPHICS_SPICE_AGENT_MOUSE_OFF,
+
+    VIR_DOMAIN_GRAPHICS_SPICE_AGENT_MOUSE_LAST
+};
+
 enum virDomainGraphicsSpiceStreamingMode {
     VIR_DOMAIN_GRAPHICS_SPICE_STREAMING_MODE_DEFAULT = 0,
     VIR_DOMAIN_GRAPHICS_SPICE_STREAMING_MODE_FILTER,
@@ -1072,6 +1080,7 @@ struct _virDomainGraphicsDef {
         struct {
             int port;
             int tlsPort;
+            int agentmouse;
             char *keymap;
             virDomainGraphicsAuthDef auth;
             unsigned int autoport :1;
@@ -2061,6 +2070,7 @@ VIR_ENUM_DECL(virDomainGraphicsSpiceZlibCompression)
 VIR_ENUM_DECL(virDomainGraphicsSpicePlaybackCompression)
 VIR_ENUM_DECL(virDomainGraphicsSpiceStreamingMode)
 VIR_ENUM_DECL(virDomainGraphicsSpiceClipboardCopypaste)
+VIR_ENUM_DECL(virDomainGraphicsSpiceAgentMouse)
 VIR_ENUM_DECL(virDomainNumatuneMemMode)
 VIR_ENUM_DECL(virDomainSnapshotState)
 /* from libvirt.h */
diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
index b9baf9a..ba8523a 100644
--- a/src/libvirt_private.syms
+++ b/src/libvirt_private.syms
@@ -252,6 +252,8 @@ virDomainChrDefFree;
 virDomainChrDefNew;
 virDomainChrSourceDefCopy;
 virDomainChrSourceDefFree;
+virDomainGraphicsSpiceAgentMouseTypeFromString;
+virDomainGraphicsSpiceAgentMouseTypeToString;
 virDomainChrSpicevmcTypeFromString;
 virDomainChrSpicevmcTypeToString;
 virDomainChrTcpProtocolTypeFromString;
diff --git a/src/qemu/qemu_capabilities.c b/src/qemu/qemu_capabilities.c
index 64a4546..2bbc077 100644
--- a/src/qemu/qemu_capabilities.c
+++ b/src/qemu/qemu_capabilities.c
@@ -154,6 +154,7 @@ VIR_ENUM_IMPL(qemuCaps, QEMU_CAPS_LAST,
               "drive-iotune", /* 85 */
               "system_wakeup",
               "scsi-disk.channel",
+              "spice-agent-mouse",
     );
 
 struct qemu_feature_flags {
@@ -1049,8 +1050,13 @@ qemuCapsComputeCmdFlags(const char *help,
         if ((p = strstr(p, "|none")) && p < nl)
             qemuCapsSet(flags, QEMU_CAPS_VGA_NONE);
     }
-    if (strstr(help, "-spice"))
+    if (strstr(help, "-spice")) {
         qemuCapsSet(flags, QEMU_CAPS_SPICE);
+
+        /* If SPICE is avail, agent-mouse option will be avail for qemu,
+         * although 'qemu --help' doesn't show it. */
+        qemuCapsSet(flags, QEMU_CAPS_SPICE_AGENTMOUSE);
+    }
     if (strstr(help, "boot=on"))
         qemuCapsSet(flags, QEMU_CAPS_DRIVE_BOOT);
     if (strstr(help, "serial=s"))
diff --git a/src/qemu/qemu_capabilities.h b/src/qemu/qemu_capabilities.h
index db584ce..2e9faba 100644
--- a/src/qemu/qemu_capabilities.h
+++ b/src/qemu/qemu_capabilities.h
@@ -122,6 +122,7 @@ enum qemuCapsFlags {
     QEMU_CAPS_DRIVE_IOTUNE       = 85, /* -drive bps= and friends */
     QEMU_CAPS_WAKEUP             = 86, /* system_wakeup monitor command */
     QEMU_CAPS_SCSI_DISK_CHANNEL  = 87, /* Is scsi-disk.channel available? */
+    QEMU_CAPS_SPICE_AGENTMOUSE   = 88, /* -spice agent-mouse=on|off */
 
     QEMU_CAPS_LAST,                   /* this must always be the last item */
 };
diff --git a/src/qemu/qemu_command.c b/src/qemu/qemu_command.c
index 01adf0d..9d5a9ad 100644
--- a/src/qemu/qemu_command.c
+++ b/src/qemu/qemu_command.c
@@ -5391,6 +5391,18 @@ qemuBuildCommandLine(virConnectPtr conn,
 
         VIR_FREE(netAddr);
 
+        const char *agentmouse = virDomainGraphicsSpiceAgentMouseTypeToString(
+                                 def->graphics[0]->data.spice.agentmouse);
+        if (def->graphics[0]->data.spice.agentmouse) {
+            if (qemuCapsGet(qemuCaps, QEMU_CAPS_SPICE_AGENTMOUSE))
+                virBufferAsprintf(&opt, ",agent-mouse=%s", agentmouse);
+            else {
+                qemuReportError(VIR_ERR_CONFIG_UNSUPPORTED, "%s",
+                            _("spice agent-mouse is not supported with this QEMU"));
+                goto error;
+            }
+        }
+
         /* 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-spice-agentmouse.args b/tests/qemuxml2argvdata/qemuxml2argv-spice-agentmouse.args
new file mode 100644
index 0000000..46be6d8
--- /dev/null
+++ b/tests/qemuxml2argvdata/qemuxml2argv-spice-agentmouse.args
@@ -0,0 +1,19 @@
+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
+
+#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=on,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-spice-agentmouse.xml b/tests/qemuxml2argvdata/qemuxml2argv-spice-agentmouse.xml
new file mode 100644
index 0000000..4b36c2c
--- /dev/null
+++ b/tests/qemuxml2argvdata/qemuxml2argv-spice-agentmouse.xml
@@ -0,0 +1,38 @@
+<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' agentmouse='on'>
+-->
+    <graphics type='spice' port='5903' tlsPort='5904' autoport='no' listen='127.0.0.1' agentmouse='off'>
+      <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>
diff --git a/tests/qemuxml2argvtest.c b/tests/qemuxml2argvtest.c
index fcffc27..9a27333 100644
--- a/tests/qemuxml2argvtest.c
+++ b/tests/qemuxml2argvtest.c
@@ -514,6 +514,10 @@ mymain(void)
     DO_TEST("graphics-spice-compression", 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,
+            QEMU_CAPS_SPICE_AGENTMOUSE);
     DO_TEST("graphics-spice-timeout", false,
             QEMU_CAPS_DRIVE,
             QEMU_CAPS_VGA, QEMU_CAPS_VGA_QXL,

[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]