mirror of
https://github.com/virt-manager/virt-manager.git
synced 2025-01-08 21:18:04 +03:00
virt-manager: add support for qemu-vdagent channel
This provides the UI support for the qemu-vdagent channel which allows clipboard sharing with VNC graphics (see previous commit for more information). The channel name in the device list was changed slightly in order to avoid confusion. Due to the fact that both the spice-vdagent and the qemu-vdagent specify the same virtio name (com.redhat.spice.0), both of these channels were showing up in the device list as "Channel spice", which is a bit confusing. In order to disambiguate these, channels now show up in the device list as "Channel {type} ({name})" instead of "Channel {name}". So for example, a qemu-vdagent channel would show up as: Channel Qemu vdagent (spice) Whereas a spice-vdagent channel would show up as: Channel Spice agent (spice) Signed-off-by: Jonathon Jongsma <jjongsma@redhat.com>
This commit is contained in:
parent
44355e5ed0
commit
caa99a6001
@ -725,7 +725,7 @@
|
|||||||
</packing>
|
</packing>
|
||||||
</child>
|
</child>
|
||||||
<child>
|
<child>
|
||||||
<!-- n-columns=2 n-rows=6 -->
|
<!-- n-columns=2 n-rows=7 -->
|
||||||
<object class="GtkGrid" id="char-table">
|
<object class="GtkGrid" id="char-table">
|
||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
<property name="can-focus">False</property>
|
<property name="can-focus">False</property>
|
||||||
@ -901,6 +901,32 @@
|
|||||||
<property name="top-attach">2</property>
|
<property name="top-attach">2</property>
|
||||||
</packing>
|
</packing>
|
||||||
</child>
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkLabel" id="char-vdagent-clipboard-label">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can-focus">False</property>
|
||||||
|
<property name="label" translatable="yes">_Share Clipboard:</property>
|
||||||
|
<property name="use-underline">True</property>
|
||||||
|
<property name="mnemonic-widget">char-vdagent-clipboard</property>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="left-attach">0</property>
|
||||||
|
<property name="top-attach">6</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkCheckButton" id="char-vdagent-clipboard">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can-focus">True</property>
|
||||||
|
<property name="receives-default">False</property>
|
||||||
|
<property name="halign">start</property>
|
||||||
|
<property name="draw-indicator">True</property>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="left-attach">1</property>
|
||||||
|
<property name="top-attach">6</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
<child internal-child="accessible">
|
<child internal-child="accessible">
|
||||||
<object class="AtkObject" id="char-table-atkobject">
|
<object class="AtkObject" id="char-table-atkobject">
|
||||||
<property name="AtkObject::accessible-name">char-tab</property>
|
<property name="AtkObject::accessible-name">char-tab</property>
|
||||||
|
@ -3506,7 +3506,7 @@
|
|||||||
<property name="margin-start">12</property>
|
<property name="margin-start">12</property>
|
||||||
<property name="margin-top">3</property>
|
<property name="margin-top">3</property>
|
||||||
<child>
|
<child>
|
||||||
<!-- n-columns=2 n-rows=7 -->
|
<!-- n-columns=2 n-rows=8 -->
|
||||||
<object class="GtkGrid" id="table37">
|
<object class="GtkGrid" id="table37">
|
||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
<property name="can-focus">False</property>
|
<property name="can-focus">False</property>
|
||||||
@ -3601,6 +3601,19 @@
|
|||||||
<property name="top-attach">6</property>
|
<property name="top-attach">6</property>
|
||||||
</packing>
|
</packing>
|
||||||
</child>
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkLabel" id="char-clipboard-sharing">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can-focus">False</property>
|
||||||
|
<property name="halign">start</property>
|
||||||
|
<property name="label" translatable="yes">label507</property>
|
||||||
|
<property name="selectable">True</property>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="left-attach">1</property>
|
||||||
|
<property name="top-attach">7</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
<child>
|
<child>
|
||||||
<object class="GtkLabel" id="char-source-host">
|
<object class="GtkLabel" id="char-source-host">
|
||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
@ -3673,6 +3686,18 @@
|
|||||||
<property name="top-attach">6</property>
|
<property name="top-attach">6</property>
|
||||||
</packing>
|
</packing>
|
||||||
</child>
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkLabel" id="char-clipboard-sharing-label">
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can-focus">False</property>
|
||||||
|
<property name="halign">end</property>
|
||||||
|
<property name="label" translatable="yes">Clipboard:</property>
|
||||||
|
</object>
|
||||||
|
<packing>
|
||||||
|
<property name="left-attach">0</property>
|
||||||
|
<property name="top-attach">7</property>
|
||||||
|
</packing>
|
||||||
|
</child>
|
||||||
<child>
|
<child>
|
||||||
<object class="GtkLabel" id="char-source-path-label">
|
<object class="GtkLabel" id="char-source-path-label">
|
||||||
<property name="visible">True</property>
|
<property name="visible">True</property>
|
||||||
|
@ -308,6 +308,7 @@ class vmmAddHardware(vmmGObjectUI):
|
|||||||
self.widget("char-path").set_text("")
|
self.widget("char-path").set_text("")
|
||||||
self.widget("char-channel").set_text("")
|
self.widget("char-channel").set_text("")
|
||||||
self.widget("char-auto-socket").set_active(True)
|
self.widget("char-auto-socket").set_active(True)
|
||||||
|
self.widget("char-vdagent-clipboard").set_active(True)
|
||||||
|
|
||||||
|
|
||||||
# RNG params
|
# RNG params
|
||||||
@ -399,7 +400,8 @@ class vmmAddHardware(vmmGObjectUI):
|
|||||||
DeviceSerial.TYPE_UNIX]
|
DeviceSerial.TYPE_UNIX]
|
||||||
if char_class.XML_NAME == "channel":
|
if char_class.XML_NAME == "channel":
|
||||||
ret = [DeviceSerial.TYPE_SPICEVMC,
|
ret = [DeviceSerial.TYPE_SPICEVMC,
|
||||||
DeviceSerial.TYPE_SPICEPORT] + ret
|
DeviceSerial.TYPE_SPICEPORT,
|
||||||
|
DeviceSerial.TYPE_QEMUVDAGENT] + ret
|
||||||
return ret
|
return ret
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
@ -425,6 +427,7 @@ class vmmAddHardware(vmmGObjectUI):
|
|||||||
DeviceSerial.TYPE_UNIX: _("UNIX socket"),
|
DeviceSerial.TYPE_UNIX: _("UNIX socket"),
|
||||||
DeviceSerial.TYPE_SPICEVMC: _("Spice agent"),
|
DeviceSerial.TYPE_SPICEVMC: _("Spice agent"),
|
||||||
DeviceSerial.TYPE_SPICEPORT: _("Spice port"),
|
DeviceSerial.TYPE_SPICEPORT: _("Spice port"),
|
||||||
|
DeviceSerial.TYPE_QEMUVDAGENT: _("QEMU vdagent"),
|
||||||
}
|
}
|
||||||
return labels.get(val, val)
|
return labels.get(val, val)
|
||||||
|
|
||||||
@ -1114,11 +1117,14 @@ class vmmAddHardware(vmmGObjectUI):
|
|||||||
supports_path = [dev.TYPE_FILE, dev.TYPE_UNIX,
|
supports_path = [dev.TYPE_FILE, dev.TYPE_UNIX,
|
||||||
dev.TYPE_DEV, dev.TYPE_PIPE]
|
dev.TYPE_DEV, dev.TYPE_PIPE]
|
||||||
supports_channel = [dev.TYPE_SPICEPORT]
|
supports_channel = [dev.TYPE_SPICEPORT]
|
||||||
|
supports_clipboard = [dev.TYPE_QEMUVDAGENT]
|
||||||
|
|
||||||
uiutil.set_grid_row_visible(self.widget("char-path-label"),
|
uiutil.set_grid_row_visible(self.widget("char-path-label"),
|
||||||
devtype in supports_path)
|
devtype in supports_path)
|
||||||
uiutil.set_grid_row_visible(self.widget("char-channel-label"),
|
uiutil.set_grid_row_visible(self.widget("char-channel-label"),
|
||||||
devtype in supports_channel)
|
devtype in supports_channel)
|
||||||
|
uiutil.set_grid_row_visible(self.widget("char-vdagent-clipboard-label"),
|
||||||
|
devtype in supports_clipboard)
|
||||||
|
|
||||||
uiutil.set_grid_row_visible(
|
uiutil.set_grid_row_visible(
|
||||||
self.widget("char-target-name-label"), ischan)
|
self.widget("char-target-name-label"), ischan)
|
||||||
@ -1472,6 +1478,7 @@ class vmmAddHardware(vmmGObjectUI):
|
|||||||
source_channel = self.widget("char-channel").get_text()
|
source_channel = self.widget("char-channel").get_text()
|
||||||
target_name = self.widget("char-target-name").get_child().get_text()
|
target_name = self.widget("char-target-name").get_child().get_text()
|
||||||
target_type = uiutil.get_list_selection(typebox)
|
target_type = uiutil.get_list_selection(typebox)
|
||||||
|
clipboard = self.widget("char-vdagent-clipboard").get_active()
|
||||||
|
|
||||||
if not self.widget("char-path").get_visible():
|
if not self.widget("char-path").get_visible():
|
||||||
source_path = None
|
source_path = None
|
||||||
@ -1486,6 +1493,7 @@ class vmmAddHardware(vmmGObjectUI):
|
|||||||
dev.type = devtype
|
dev.type = devtype
|
||||||
dev.source.path = source_path
|
dev.source.path = source_path
|
||||||
dev.source.channel = source_channel
|
dev.source.channel = source_channel
|
||||||
|
dev.source.clipboard_copypaste = clipboard
|
||||||
dev.target_name = target_name
|
dev.target_name = target_name
|
||||||
dev.target_type = target_type
|
dev.target_type = target_type
|
||||||
return dev
|
return dev
|
||||||
|
@ -207,10 +207,10 @@ def _label_for_device(dev, disk_bus_index):
|
|||||||
return _("Console %(num)d") % {"num": port + 1}
|
return _("Console %(num)d") % {"num": port + 1}
|
||||||
|
|
||||||
if devtype == "channel":
|
if devtype == "channel":
|
||||||
|
pretty_type = vmmAddHardware.char_pretty_type(dev.type)
|
||||||
name = vmmAddHardware.char_pretty_channel_name(dev.target_name)
|
name = vmmAddHardware.char_pretty_channel_name(dev.target_name)
|
||||||
if name:
|
if name:
|
||||||
return _("Channel %(name)s") % {"name": name}
|
return _("Channel %(type)s (%(name)s)") % {"type": pretty_type, "name": name}
|
||||||
pretty_type = vmmAddHardware.char_pretty_type(dev.type)
|
|
||||||
return _("Channel %(type)s") % {"type": pretty_type}
|
return _("Channel %(type)s") % {"type": pretty_type}
|
||||||
|
|
||||||
if devtype == "graphics":
|
if devtype == "graphics":
|
||||||
@ -2098,6 +2098,7 @@ class vmmDetails(vmmGObjectUI):
|
|||||||
primary = self.vm.serial_is_console_dup(chardev)
|
primary = self.vm.serial_is_console_dup(chardev)
|
||||||
show_target_type = not (char_type in ["serial", "parallel"])
|
show_target_type = not (char_type in ["serial", "parallel"])
|
||||||
is_qemuga = chardev.target_name == chardev.CHANNEL_NAME_QEMUGA
|
is_qemuga = chardev.target_name == chardev.CHANNEL_NAME_QEMUGA
|
||||||
|
show_clipboard = chardev.type == chardev.TYPE_QEMUVDAGENT
|
||||||
|
|
||||||
if char_type == "serial":
|
if char_type == "serial":
|
||||||
typelabel = _("Serial Device")
|
typelabel = _("Serial Device")
|
||||||
@ -2152,6 +2153,8 @@ class vmmDetails(vmmGObjectUI):
|
|||||||
# notifiations about connection state. For spice this UI field
|
# notifiations about connection state. For spice this UI field
|
||||||
# can get out of date
|
# can get out of date
|
||||||
show_ui("char-target-state", chardev.target_state, doshow=is_qemuga)
|
show_ui("char-target-state", chardev.target_state, doshow=is_qemuga)
|
||||||
|
clipboard = _("On") if chardev.source.clipboard_copypaste else _("Off")
|
||||||
|
show_ui("char-clipboard-sharing", clipboard, doshow=show_clipboard)
|
||||||
|
|
||||||
def _refresh_hostdev_page(self, hostdev):
|
def _refresh_hostdev_page(self, hostdev):
|
||||||
rom_bar = hostdev.rom_bar
|
rom_bar = hostdev.rom_bar
|
||||||
|
Loading…
Reference in New Issue
Block a user