- Upstream bug fixes (bsc#1027942)
ba08f84b-addstorage-Return-to-using-qcow2-sparse-by-default.patch a010c49b-cli-Fix-os-variant-help-introspection.patch 79ebcbcb-viewers-Fix-spice-audio.patch e5a51f63-details-Change-Close-accelerator-to-ctrl+shift+w.patch 9c13d2f8-Remove-use-of-problematic-terminology.patch - jsc#SLE-16582, Upgrade virt-manager >= 3.x OBS-URL: https://build.opensuse.org/package/show/Virtualization/virt-manager?expand=0&rev=511
This commit is contained in:
parent
6de106691e
commit
0c9d900197
50
79ebcbcb-viewers-Fix-spice-audio.patch
Normal file
50
79ebcbcb-viewers-Fix-spice-audio.patch
Normal file
@ -0,0 +1,50 @@
|
|||||||
|
Subject: viewers: Fix spice audio
|
||||||
|
From: Cole Robinson crobinso@redhat.com Mon Sep 21 11:35:51 2020 -0400
|
||||||
|
Date: Mon Sep 21 11:35:51 2020 -0400:
|
||||||
|
Git: 79ebcbcb71d77548443b7943d65bacb216c93769
|
||||||
|
|
||||||
|
Commit 1689ebb25 removed what I thought was an unused audio
|
||||||
|
handle in the spice viewer code, but apparently it does
|
||||||
|
something. Strangely some VMs work fine (linux, windows 7),
|
||||||
|
but my windows 10 VMs need this to actually get audio.
|
||||||
|
No clue what that's all about
|
||||||
|
|
||||||
|
https://bugzilla.redhat.com/show_bug.cgi?id=1881080
|
||||||
|
|
||||||
|
Signed-off-by: Cole Robinson <crobinso@redhat.com>
|
||||||
|
|
||||||
|
diff --git a/virtManager/details/viewers.py b/virtManager/details/viewers.py
|
||||||
|
index 46ff1431..da9f906d 100644
|
||||||
|
--- a/virtManager/details/viewers.py
|
||||||
|
+++ b/virtManager/details/viewers.py
|
||||||
|
@@ -476,6 +476,7 @@ class SpiceViewer(Viewer):
|
||||||
|
Viewer.__init__(self, *args, **kwargs)
|
||||||
|
self._spice_session = None
|
||||||
|
self._display = None
|
||||||
|
+ self._audio = None
|
||||||
|
self._main_channel = None
|
||||||
|
self._display_channel = None
|
||||||
|
self._usbdev_manager = None
|
||||||
|
@@ -618,6 +619,14 @@ class SpiceViewer(Viewer):
|
||||||
|
self._init_widget()
|
||||||
|
self.emit("connected")
|
||||||
|
|
||||||
|
+ elif (type(channel) in [SpiceClientGLib.PlaybackChannel,
|
||||||
|
+ SpiceClientGLib.RecordChannel] and
|
||||||
|
+ not self._audio):
|
||||||
|
+ # It's unclear why we need this audio handle, but it
|
||||||
|
+ # does matter:
|
||||||
|
+ # https://bugzilla.redhat.com/show_bug.cgi?id=1881080
|
||||||
|
+ self._audio = SpiceClientGLib.Audio.get(self._spice_session, None)
|
||||||
|
+
|
||||||
|
def _agent_connected_cb(self, src, val):
|
||||||
|
self.emit("agent-connected") # pragma: no cover
|
||||||
|
|
||||||
|
@@ -631,6 +640,7 @@ class SpiceViewer(Viewer):
|
||||||
|
_SIGS.disconnect_obj_signals(self._spice_session)
|
||||||
|
self._spice_session.disconnect()
|
||||||
|
self._spice_session = None
|
||||||
|
+ self._audio = None
|
||||||
|
if self._display:
|
||||||
|
self._display.destroy()
|
||||||
|
self._display = None
|
226
9c13d2f8-Remove-use-of-problematic-terminology.patch
Normal file
226
9c13d2f8-Remove-use-of-problematic-terminology.patch
Normal file
@ -0,0 +1,226 @@
|
|||||||
|
Subject: Remove use of problematic terminology
|
||||||
|
From: Cole Robinson crobinso@redhat.com Wed Sep 23 14:33:17 2020 -0400
|
||||||
|
Date: Wed Sep 23 14:33:17 2020 -0400:
|
||||||
|
Git: 9c13d2f8788414f1ab5b0300ce82b5d9ce277880
|
||||||
|
|
||||||
|
Following kernel recommendation here:
|
||||||
|
https://lkml.org/lkml/2020/7/4/229
|
||||||
|
|
||||||
|
Signed-off-by: Cole Robinson <crobinso@redhat.com>
|
||||||
|
|
||||||
|
Index: virt-manager-3.0.0/man/virt-install.rst
|
||||||
|
===================================================================
|
||||||
|
--- virt-manager-3.0.0.orig/man/virt-install.rst
|
||||||
|
+++ virt-manager-3.0.0/man/virt-install.rst
|
||||||
|
@@ -1247,7 +1247,7 @@ Connect the guest to the host network. E
|
||||||
|
Tell virt-install not to add any default network interface.
|
||||||
|
|
||||||
|
If ``--network`` is omitted a single NIC will be created in the guest. If
|
||||||
|
-there is a bridge device in the host with a physical interface enslaved,
|
||||||
|
+there is a bridge device in the host with a physical interface attached,
|
||||||
|
that will be used for connectivity. Failing that, the virtual network
|
||||||
|
called ``default`` will be used. This option can be specified multiple
|
||||||
|
times to setup more than one NIC.
|
||||||
|
Index: virt-manager-3.0.0/tests/uitests/test_addhardware.py
|
||||||
|
===================================================================
|
||||||
|
--- virt-manager-3.0.0.orig/tests/uitests/test_addhardware.py
|
||||||
|
+++ virt-manager-3.0.0/tests/uitests/test_addhardware.py
|
||||||
|
@@ -310,7 +310,7 @@ class AddHardware(lib.testcase.UITestCas
|
||||||
|
self.app.open(break_setfacl=True)
|
||||||
|
details = self.app.open_details_window("test-clone-simple")
|
||||||
|
|
||||||
|
- # Say 'Yes' and it should fail, then blacklist the paths
|
||||||
|
+ # Say 'Yes' and it should fail, then denylist the paths
|
||||||
|
addhw = self._open_addhw_window(details)
|
||||||
|
tab = self._select_hw(addhw, "Storage", "storage-tab")
|
||||||
|
tab.find_fuzzy("Select or create", "radio").click()
|
||||||
|
Index: virt-manager-3.0.0/tests/uitests/test_connection.py
|
||||||
|
===================================================================
|
||||||
|
--- virt-manager-3.0.0.orig/tests/uitests/test_connection.py
|
||||||
|
+++ virt-manager-3.0.0/tests/uitests/test_connection.py
|
||||||
|
@@ -15,7 +15,7 @@ class UITestConnection(lib.testcase.UITe
|
||||||
|
|
||||||
|
def testConnectionBlacklist(self):
|
||||||
|
self.app.open(
|
||||||
|
- extra_opts=["--test-options=object-blacklist=test-many-devices"])
|
||||||
|
+ extra_opts=["--test-options=object-denylist=test-many-devices"])
|
||||||
|
manager = self.app.topwin
|
||||||
|
|
||||||
|
def _delete_vm(vmname):
|
||||||
|
Index: virt-manager-3.0.0/virtManager/connection.py
|
||||||
|
===================================================================
|
||||||
|
--- virt-manager-3.0.0.orig/virtManager/connection.py
|
||||||
|
+++ virt-manager-3.0.0/virtManager/connection.py
|
||||||
|
@@ -38,46 +38,46 @@ class _ObjectList(vmmGObject):
|
||||||
|
vmmGObject.__init__(self)
|
||||||
|
|
||||||
|
self._objects = []
|
||||||
|
- self._blacklist = {}
|
||||||
|
+ self._denylist = {}
|
||||||
|
self._lock = threading.Lock()
|
||||||
|
|
||||||
|
def _cleanup(self):
|
||||||
|
self._objects = []
|
||||||
|
|
||||||
|
- def _blacklist_key(self, obj):
|
||||||
|
+ def _denylist_key(self, obj):
|
||||||
|
return str(obj.__class__) + obj.get_name()
|
||||||
|
|
||||||
|
- def add_blacklist(self, obj):
|
||||||
|
+ def add_denylist(self, obj):
|
||||||
|
"""
|
||||||
|
- Add an object to the blacklist. Basically a list of objects we
|
||||||
|
+ Add an object to the denylist. Basically a list of objects we
|
||||||
|
choose not to poll, because they threw an error at init time
|
||||||
|
|
||||||
|
- :param obj: vmmLibvirtObject to blacklist
|
||||||
|
+ :param obj: vmmLibvirtObject to denylist
|
||||||
|
:returns: number of added object to list
|
||||||
|
"""
|
||||||
|
- key = self._blacklist_key(obj)
|
||||||
|
- count = self._blacklist.get(key, 0)
|
||||||
|
- self._blacklist[key] = count + 1
|
||||||
|
- return self._blacklist[key]
|
||||||
|
+ key = self._denylist_key(obj)
|
||||||
|
+ count = self._denylist.get(key, 0)
|
||||||
|
+ self._denylist[key] = count + 1
|
||||||
|
+ return self._denylist[key]
|
||||||
|
|
||||||
|
- def remove_blacklist(self, obj):
|
||||||
|
+ def remove_denylist(self, obj):
|
||||||
|
"""
|
||||||
|
- :param obj: vmmLibvirtObject to remove from blacklist
|
||||||
|
- :returns: True if object was blacklisted or False otherwise.
|
||||||
|
+ :param obj: vmmLibvirtObject to remove from denylist
|
||||||
|
+ :returns: True if object was denylisted or False otherwise.
|
||||||
|
"""
|
||||||
|
- key = self._blacklist_key(obj)
|
||||||
|
- return bool(self._blacklist.pop(key, 0))
|
||||||
|
+ key = self._denylist_key(obj)
|
||||||
|
+ return bool(self._denylist.pop(key, 0))
|
||||||
|
|
||||||
|
- def in_blacklist(self, obj):
|
||||||
|
+ def in_denylist(self, obj):
|
||||||
|
"""
|
||||||
|
- If an object is in list only once don't consider it blacklisted,
|
||||||
|
+ If an object is in list only once don't consider it denylisted,
|
||||||
|
give it one more chance.
|
||||||
|
|
||||||
|
:param obj: vmmLibvirtObject to check
|
||||||
|
- :returns: True if object is blacklisted
|
||||||
|
+ :returns: True if object is denylisted
|
||||||
|
"""
|
||||||
|
- key = self._blacklist_key(obj)
|
||||||
|
- return self._blacklist.get(key, 0) >= _ObjectList.BLACKLIST_COUNT
|
||||||
|
+ key = self._denylist_key(obj)
|
||||||
|
+ return self._denylist.get(key, 0) >= _ObjectList.BLACKLIST_COUNT
|
||||||
|
|
||||||
|
def remove(self, obj):
|
||||||
|
"""
|
||||||
|
@@ -90,7 +90,7 @@ class _ObjectList(vmmGObject):
|
||||||
|
# Identity check is sufficient here, since we should never be
|
||||||
|
# asked to remove an object that wasn't at one point in the list.
|
||||||
|
if obj not in self._objects:
|
||||||
|
- return self.remove_blacklist(obj)
|
||||||
|
+ return self.remove_denylist(obj)
|
||||||
|
|
||||||
|
self._objects.remove(obj)
|
||||||
|
return True
|
||||||
|
@@ -1060,11 +1060,11 @@ class vmmConnection(vmmGObject):
|
||||||
|
|
||||||
|
if initialize_failed:
|
||||||
|
log.debug("Blacklisting %s=%s", class_name, obj.get_name())
|
||||||
|
- count = self._objects.add_blacklist(obj)
|
||||||
|
- log.debug("Object added in blacklist, count=%d", count)
|
||||||
|
+ count = self._objects.add_denylist(obj)
|
||||||
|
+ log.debug("Object added in denylist, count=%d", count)
|
||||||
|
return
|
||||||
|
|
||||||
|
- self._objects.remove_blacklist(obj)
|
||||||
|
+ self._objects.remove_denylist(obj)
|
||||||
|
if not self._objects.add(obj):
|
||||||
|
log.debug("New %s=%s requested, but it's already tracked.",
|
||||||
|
class_name, obj.get_name())
|
||||||
|
@@ -1134,7 +1134,7 @@ class vmmConnection(vmmGObject):
|
||||||
|
|
||||||
|
gone_objects.extend(gone)
|
||||||
|
preexisting_objects.extend([o for o in master if o not in new])
|
||||||
|
- new = [n for n in new if not self._objects.in_blacklist(n)]
|
||||||
|
+ new = [n for n in new if not self._objects.in_denylist(n)]
|
||||||
|
return new
|
||||||
|
|
||||||
|
new_vms = _process_objects("vms")
|
||||||
|
Index: virt-manager-3.0.0/virtManager/lib/testmock.py
|
||||||
|
===================================================================
|
||||||
|
--- virt-manager-3.0.0.orig/virtManager/lib/testmock.py
|
||||||
|
+++ virt-manager-3.0.0/virtManager/lib/testmock.py
|
||||||
|
@@ -157,7 +157,7 @@ class CLITestOptionsClass:
|
||||||
|
Spice doesn't return values here when we are just testing
|
||||||
|
against seabios in uitests, this fakes it to hit more code paths
|
||||||
|
* fake-systray: Enable the fake systray window
|
||||||
|
- * object-blacklist=NAME: Make object initialize for that name
|
||||||
|
+ * object-denylist=NAME: Make object initialize for that name
|
||||||
|
fail to test some connection code paths
|
||||||
|
* conn-crash: Test connection abruptly closing like when
|
||||||
|
libvirtd is restarted.
|
||||||
|
@@ -205,7 +205,7 @@ class CLITestOptionsClass:
|
||||||
|
self.fake_vnc_username = _get("fake-vnc-username")
|
||||||
|
self.fake_console_resolution = _get("fake-console-resolution")
|
||||||
|
self.fake_systray = _get("fake-systray")
|
||||||
|
- self.object_blacklist = _get_value("object-blacklist")
|
||||||
|
+ self.object_denylist = _get_value("object-denylist")
|
||||||
|
self.conn_crash = _get("conn-crash")
|
||||||
|
self.fake_agent_event = _get_value("fake-agent-event")
|
||||||
|
self.fake_nodedev_event = _get_value("fake-nodedev-event")
|
||||||
|
Index: virt-manager-3.0.0/virtManager/object/domain.py
|
||||||
|
===================================================================
|
||||||
|
--- virt-manager-3.0.0.orig/virtManager/object/domain.py
|
||||||
|
+++ virt-manager-3.0.0/virtManager/object/domain.py
|
||||||
|
@@ -393,7 +393,7 @@ class vmmDomain(vmmLibvirtObject):
|
||||||
|
self.get_uuid() == "00000000-0000-0000-0000-000000000000"):
|
||||||
|
# We don't want virt-manager to track Domain-0 since it
|
||||||
|
# doesn't work with our UI. Raising an error will ensures it
|
||||||
|
- # is blacklisted.
|
||||||
|
+ # is denylisted.
|
||||||
|
raise RuntimeError( # pragma: no cover
|
||||||
|
"Can't track Domain-0 as a vmmDomain")
|
||||||
|
|
||||||
|
Index: virt-manager-3.0.0/virtManager/object/libvirtobject.py
|
||||||
|
===================================================================
|
||||||
|
--- virt-manager-3.0.0.orig/virtManager/object/libvirtobject.py
|
||||||
|
+++ virt-manager-3.0.0/virtManager/object/libvirtobject.py
|
||||||
|
@@ -171,7 +171,7 @@ class vmmLibvirtObject(vmmGObject):
|
||||||
|
|
||||||
|
initialize_failed = False
|
||||||
|
try:
|
||||||
|
- if self.config.CLITestOptions.object_blacklist == self._name:
|
||||||
|
+ if self.config.CLITestOptions.object_denylist == self._name:
|
||||||
|
raise RuntimeError("fake initialization error")
|
||||||
|
|
||||||
|
self._init_libvirt_state()
|
||||||
|
Index: virt-manager-3.0.0/virtinst/devices/graphics.py
|
||||||
|
===================================================================
|
||||||
|
--- virt-manager-3.0.0.orig/virtinst/devices/graphics.py
|
||||||
|
+++ virt-manager-3.0.0/virtinst/devices/graphics.py
|
||||||
|
@@ -151,7 +151,7 @@ class DeviceGraphics(Device):
|
||||||
|
def _spice_supported(self):
|
||||||
|
if not self.conn.is_qemu() and not self.conn.is_test():
|
||||||
|
return False
|
||||||
|
- # Spice has issues on some host arches, like ppc, so whitelist it
|
||||||
|
+ # Spice has issues on some host arches, like ppc, so allow it
|
||||||
|
if self.conn.caps.host.cpu.arch not in ["i686", "x86_64"]:
|
||||||
|
return False
|
||||||
|
return True
|
||||||
|
Index: virt-manager-3.0.0/virtinst/devices/interface.py
|
||||||
|
===================================================================
|
||||||
|
--- virt-manager-3.0.0.orig/virtinst/devices/interface.py
|
||||||
|
+++ virt-manager-3.0.0/virtinst/devices/interface.py
|
||||||
|
@@ -72,7 +72,7 @@ def _host_default_bridge():
|
||||||
|
return dev # pragma: no cover
|
||||||
|
|
||||||
|
# Old style, peth0 == phys dev, eth0 == netloop, xenbr0 == bridge,
|
||||||
|
- # vif0.0 == netloop enslaved, eth0 == default route
|
||||||
|
+ # vif0.0 == netloop attached, eth0 == default route
|
||||||
|
try:
|
||||||
|
defn = int(dev[-1])
|
||||||
|
except Exception: # pragma: no cover
|
20
a010c49b-cli-Fix-os-variant-help-introspection.patch
Normal file
20
a010c49b-cli-Fix-os-variant-help-introspection.patch
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
Subject: cli: Fix --os-variant=help introspection
|
||||||
|
From: Cole Robinson crobinso@redhat.com Sun Sep 20 16:00:33 2020 -0400
|
||||||
|
Date: Sun Sep 20 16:00:46 2020 -0400:
|
||||||
|
Git: a010c49b8b3c0ecca5ec99d962b2b98f25694a37
|
||||||
|
|
||||||
|
Signed-off-by: Cole Robinson <crobinso@redhat.com>
|
||||||
|
|
||||||
|
Index: virt-manager-3.0.0/virtinst/cli.py
|
||||||
|
===================================================================
|
||||||
|
--- virt-manager-3.0.0.orig/virtinst/cli.py
|
||||||
|
+++ virt-manager-3.0.0/virtinst/cli.py
|
||||||
|
@@ -1830,7 +1830,7 @@ class OSVariantData(object):
|
||||||
|
|
||||||
|
|
||||||
|
class ParserOSVariant(VirtCLIParser):
|
||||||
|
- cli_arg_name = "os-variant"
|
||||||
|
+ cli_arg_name = "os_variant"
|
||||||
|
supports_clearxml = False
|
||||||
|
|
||||||
|
@classmethod
|
@ -0,0 +1,86 @@
|
|||||||
|
Subject: addstorage: Return to using qcow2 sparse by default
|
||||||
|
From: Cole Robinson crobinso@redhat.com Sat Sep 19 18:06:45 2020 -0400
|
||||||
|
Date: Sun Sep 20 10:11:36 2020 -0400:
|
||||||
|
Git: ba08f84b3408744e9aa9763d100e8aa217c1f5ff
|
||||||
|
|
||||||
|
https://bugzilla.redhat.com/show_bug.cgi?id=1759454
|
||||||
|
|
||||||
|
See 15a6a7e2105440df528f75c4df4d2471df28bd1e
|
||||||
|
|
||||||
|
The idea behind virt-manager's sparse vs nonsparse default, is that if
|
||||||
|
the user selected 'raw' for as the default image format, assume they
|
||||||
|
want to maximize performance, so fully allocate the disk.
|
||||||
|
|
||||||
|
qcow2 didn't support anything except sparse, so the sparse=True vs
|
||||||
|
sparse=False made no difference. So we always set sparse=False
|
||||||
|
|
||||||
|
Then qcow2 grows non-sparse support, and virt-manager is suddenly
|
||||||
|
defaulting to it, which is not the intention.
|
||||||
|
|
||||||
|
Default to sparse when requested format isn't raw
|
||||||
|
|
||||||
|
Signed-off-by: Cole Robinson <crobinso@redhat.com>
|
||||||
|
|
||||||
|
Index: virt-manager-3.0.0/tests/uitests/test_addhardware.py
|
||||||
|
===================================================================
|
||||||
|
--- virt-manager-3.0.0.orig/tests/uitests/test_addhardware.py
|
||||||
|
+++ virt-manager-3.0.0/tests/uitests/test_addhardware.py
|
||||||
|
@@ -152,11 +152,8 @@ class AddHardware(lib.testcase.UITestCas
|
||||||
|
tab.combo_select("Cache mode:", "none")
|
||||||
|
tab.combo_select("Discard mode:", "ignore")
|
||||||
|
tab.combo_select("Detect zeroes:", "unmap")
|
||||||
|
- # Size too big
|
||||||
|
- tab.find("GiB", "spin button").set_text("2000")
|
||||||
|
- self._finish(addhw, check=None)
|
||||||
|
- self.app.click_alert_button("not enough free space", "Close")
|
||||||
|
- tab.find("GiB", "spin button").set_text("1.5")
|
||||||
|
+ # High number but we are non-sparse by default so it won't complain
|
||||||
|
+ tab.find("GiB", "spin button").set_text("200000")
|
||||||
|
self._finish(addhw, check=details)
|
||||||
|
|
||||||
|
# USB disk with removable setting
|
||||||
|
Index: virt-manager-3.0.0/tests/uitests/test_createvm.py
|
||||||
|
===================================================================
|
||||||
|
--- virt-manager-3.0.0.orig/tests/uitests/test_createvm.py
|
||||||
|
+++ virt-manager-3.0.0/tests/uitests/test_createvm.py
|
||||||
|
@@ -201,12 +201,11 @@ class NewVM(lib.testcase.UITestCase):
|
||||||
|
self.forward(newvm)
|
||||||
|
self.forward(newvm)
|
||||||
|
|
||||||
|
- # Trigger size validation failure
|
||||||
|
+ # qcow2 default shouldn't trigger size error
|
||||||
|
sizetext = newvm.find(None, "spin button", "GiB")
|
||||||
|
sizetext.set_text("10000000")
|
||||||
|
- self.forward(newvm, check=False)
|
||||||
|
- self.app.click_alert_button("Storage parameter error", "OK")
|
||||||
|
- sizetext.set_text("1")
|
||||||
|
+ _forward(newvm)
|
||||||
|
+ _back(newvm)
|
||||||
|
|
||||||
|
# Use the storage browser to select a local file
|
||||||
|
storagetext = newvm.find("storage-entry")
|
||||||
|
Index: virt-manager-3.0.0/virtManager/device/addstorage.py
|
||||||
|
===================================================================
|
||||||
|
--- virt-manager-3.0.0.orig/virtManager/device/addstorage.py
|
||||||
|
+++ virt-manager-3.0.0/virtManager/device/addstorage.py
|
||||||
|
@@ -251,14 +251,18 @@ class vmmAddStorage(vmmGObjectUI):
|
||||||
|
if disk.wants_storage_creation():
|
||||||
|
pool = disk.get_parent_pool()
|
||||||
|
size = uiutil.spin_get_helper(self.widget("storage-size"))
|
||||||
|
- sparse = False
|
||||||
|
+ fmt = self.conn.get_default_storage_format()
|
||||||
|
+
|
||||||
|
+ # If the user changed the default disk format to raw, assume
|
||||||
|
+ # they want to maximize performance, so fully allocate the
|
||||||
|
+ # disk image. Otherwise use sparse
|
||||||
|
+ sparse = fmt != 'raw'
|
||||||
|
|
||||||
|
vol_install = virtinst.DeviceDisk.build_vol_install(
|
||||||
|
disk.conn, os.path.basename(disk.path), pool,
|
||||||
|
size, sparse)
|
||||||
|
disk.set_vol_install(vol_install)
|
||||||
|
|
||||||
|
- fmt = self.conn.get_default_storage_format()
|
||||||
|
if disk.get_vol_install().supports_format():
|
||||||
|
log.debug("Using default prefs format=%s for path=%s",
|
||||||
|
fmt, disk.path)
|
104
e5a51f63-details-Change-Close-accelerator-to-ctrl+shift+w.patch
Normal file
104
e5a51f63-details-Change-Close-accelerator-to-ctrl+shift+w.patch
Normal file
@ -0,0 +1,104 @@
|
|||||||
|
Subject: details: Change Close accelerator to ctrl+shift+w
|
||||||
|
From: Cole Robinson crobinso@redhat.com Mon Sep 21 14:33:25 2020 -0400
|
||||||
|
Date: Mon Sep 21 14:33:25 2020 -0400:
|
||||||
|
Git: e5a51f637411b4b2efc789fdef99eb4860ac3b9f
|
||||||
|
|
||||||
|
Close accelerator changes ctrl+w -> ctrl+shift+w
|
||||||
|
Quit accelerator changes ctrl+q -> ctrl+shift+q
|
||||||
|
|
||||||
|
After aafb874c8, if the mouse pointer isn't inside the console
|
||||||
|
window, it has keyboard focus but ctrl+w will be sent to the vmwindow
|
||||||
|
and not the VM. ctrl+w is a common shortcut for deleting a word so
|
||||||
|
this is pretty disruptive if you are typing inside the VM
|
||||||
|
|
||||||
|
Use gnome-terminal-esque accelerators starting with ctrl+shift to
|
||||||
|
reduce the chance of collision.
|
||||||
|
|
||||||
|
https://bugzilla.redhat.com/show_bug.cgi?id=1880295
|
||||||
|
|
||||||
|
Signed-off-by: Cole Robinson <crobinso@redhat.com>
|
||||||
|
|
||||||
|
Index: virt-manager-3.0.0/tests/uitests/test_livetests.py
|
||||||
|
===================================================================
|
||||||
|
--- virt-manager-3.0.0.orig/tests/uitests/test_livetests.py
|
||||||
|
+++ virt-manager-3.0.0/tests/uitests/test_livetests.py
|
||||||
|
@@ -146,7 +146,7 @@ class Console(lib.testcase.UITestCase):
|
||||||
|
# Check that modifiers don't work
|
||||||
|
win.click()
|
||||||
|
self.app.sleep(1)
|
||||||
|
- win.keyCombo("<ctrl>w")
|
||||||
|
+ win.keyCombo("<ctrl><shift>w")
|
||||||
|
lib.utils.check(lambda: win.showing)
|
||||||
|
dom.destroy()
|
||||||
|
win.find("Guest is not running.")
|
||||||
|
@@ -315,13 +315,13 @@ class Console(lib.testcase.UITestCase):
|
||||||
|
|
||||||
|
# Ensure ctrl+w doesn't close the window, modifiers are disabled
|
||||||
|
term.click()
|
||||||
|
- win.keyCombo("<ctrl>w")
|
||||||
|
+ win.keyCombo("<ctrl><shift>w")
|
||||||
|
lib.utils.check(lambda: win.showing)
|
||||||
|
- # Shut it down, ensure <ctrl>w works again
|
||||||
|
+ # Shut it down, ensure accelerator works again
|
||||||
|
self._destroy(win)
|
||||||
|
win.click_title()
|
||||||
|
self.app.sleep(1)
|
||||||
|
- win.keyCombo("<ctrl>w")
|
||||||
|
+ win.keyCombo("<ctrl><shift>w")
|
||||||
|
lib.utils.check(lambda: not win.showing)
|
||||||
|
|
||||||
|
|
||||||
|
Index: virt-manager-3.0.0/ui/vmwindow.ui
|
||||||
|
===================================================================
|
||||||
|
--- virt-manager-3.0.0.orig/ui/vmwindow.ui
|
||||||
|
+++ virt-manager-3.0.0/ui/vmwindow.ui
|
||||||
|
@@ -3,6 +3,16 @@
|
||||||
|
<interface>
|
||||||
|
<requires lib="gtk+" version="3.22"/>
|
||||||
|
<object class="GtkAccelGroup" id="accelgroup1"/>
|
||||||
|
+ <object class="GtkImage" id="image1">
|
||||||
|
+ <property name="visible">True</property>
|
||||||
|
+ <property name="can_focus">False</property>
|
||||||
|
+ <property name="stock">gtk-close</property>
|
||||||
|
+ </object>
|
||||||
|
+ <object class="GtkImage" id="image2">
|
||||||
|
+ <property name="visible">True</property>
|
||||||
|
+ <property name="can_focus">False</property>
|
||||||
|
+ <property name="stock">gtk-quit</property>
|
||||||
|
+ </object>
|
||||||
|
<object class="GtkWindow" id="vmm-vmwindow">
|
||||||
|
<property name="can_focus">False</property>
|
||||||
|
<property name="title" translatable="yes">Virtual Machine</property>
|
||||||
|
@@ -48,24 +58,28 @@
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkImageMenuItem" id="close4">
|
||||||
|
- <property name="label">gtk-close</property>
|
||||||
|
+ <property name="label">_Close</property>
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can_focus">False</property>
|
||||||
|
<property name="use_underline">True</property>
|
||||||
|
- <property name="use_stock">True</property>
|
||||||
|
+ <property name="image">image1</property>
|
||||||
|
+ <property name="use_stock">False</property>
|
||||||
|
<property name="accel_group">accelgroup1</property>
|
||||||
|
<signal name="activate" handler="on_details_menu_close_activate" swapped="no"/>
|
||||||
|
+ <accelerator key="w" signal="activate" modifiers="GDK_SHIFT_MASK | GDK_CONTROL_MASK"/>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
<child>
|
||||||
|
<object class="GtkImageMenuItem" id="quit3">
|
||||||
|
- <property name="label">gtk-quit</property>
|
||||||
|
+ <property name="label">_Quit</property>
|
||||||
|
<property name="visible">True</property>
|
||||||
|
<property name="can_focus">False</property>
|
||||||
|
<property name="use_underline">True</property>
|
||||||
|
- <property name="use_stock">True</property>
|
||||||
|
+ <property name="image">image2</property>
|
||||||
|
+ <property name="use_stock">False</property>
|
||||||
|
<property name="accel_group">accelgroup1</property>
|
||||||
|
<signal name="activate" handler="on_details_menu_quit_activate" swapped="no"/>
|
||||||
|
+ <accelerator key="q" signal="activate" modifiers="GDK_SHIFT_MASK | GDK_CONTROL_MASK"/>
|
||||||
|
</object>
|
||||||
|
</child>
|
||||||
|
</object>
|
@ -1,7 +1,17 @@
|
|||||||
|
-------------------------------------------------------------------
|
||||||
|
Mon Sep 28 08:17:59 MDT 2020 - carnold@suse.com
|
||||||
|
|
||||||
|
- Upstream bug fixes (bsc#1027942)
|
||||||
|
ba08f84b-addstorage-Return-to-using-qcow2-sparse-by-default.patch
|
||||||
|
a010c49b-cli-Fix-os-variant-help-introspection.patch
|
||||||
|
79ebcbcb-viewers-Fix-spice-audio.patch
|
||||||
|
e5a51f63-details-Change-Close-accelerator-to-ctrl+shift+w.patch
|
||||||
|
9c13d2f8-Remove-use-of-problematic-terminology.patch
|
||||||
|
|
||||||
-------------------------------------------------------------------
|
-------------------------------------------------------------------
|
||||||
Wed Sep 16 05:24:21 MDT 2020 - carnold@suse.com
|
Wed Sep 16 05:24:21 MDT 2020 - carnold@suse.com
|
||||||
|
|
||||||
- Update to virt-manager 3.0.0 (fate#326786)
|
- jsc#SLE-16582, Upgrade virt-manager >= 3.x
|
||||||
virt-manager-3.0.0.tar.bz2
|
virt-manager-3.0.0.tar.bz2
|
||||||
* virt-install –cloud-init support (Athina Plaskasoviti, Cole
|
* virt-install –cloud-init support (Athina Plaskasoviti, Cole
|
||||||
Robinson)
|
Robinson)
|
||||||
|
@ -32,6 +32,11 @@ Source1: virt-install.rb
|
|||||||
Source2: virt-install.desktop
|
Source2: virt-install.desktop
|
||||||
Source3: virt-manager-supportconfig
|
Source3: virt-manager-supportconfig
|
||||||
# Upstream Patches
|
# Upstream Patches
|
||||||
|
Patch1: ba08f84b-addstorage-Return-to-using-qcow2-sparse-by-default.patch
|
||||||
|
Patch2: a010c49b-cli-Fix-os-variant-help-introspection.patch
|
||||||
|
Patch3: 79ebcbcb-viewers-Fix-spice-audio.patch
|
||||||
|
Patch4: e5a51f63-details-Change-Close-accelerator-to-ctrl+shift+w.patch
|
||||||
|
Patch5: 9c13d2f8-Remove-use-of-problematic-terminology.patch
|
||||||
# SUSE Only
|
# SUSE Only
|
||||||
Patch70: virtman-desktop.patch
|
Patch70: virtman-desktop.patch
|
||||||
Patch71: virtman-kvm.patch
|
Patch71: virtman-kvm.patch
|
||||||
@ -154,6 +159,11 @@ machine).
|
|||||||
%prep
|
%prep
|
||||||
%setup -q
|
%setup -q
|
||||||
# Upstream Patches
|
# Upstream Patches
|
||||||
|
%patch1 -p1
|
||||||
|
%patch2 -p1
|
||||||
|
%patch3 -p1
|
||||||
|
%patch4 -p1
|
||||||
|
%patch5 -p1
|
||||||
# SUSE Only
|
# SUSE Only
|
||||||
%patch70 -p1
|
%patch70 -p1
|
||||||
%patch71 -p1
|
%patch71 -p1
|
||||||
|
Loading…
Reference in New Issue
Block a user