mirror of
https://github.com/virt-manager/virt-manager.git
synced 2025-02-25 18:55:27 -06:00
console: fix resize_to_guest for Spice
We also avoid division by zero if desktop_resolution has height of 0 This can happen with Spice, when switching resolution or when the resolution is unknown (not ready yet).
This commit is contained in:
parent
6a14834c7d
commit
a8f77da827
@ -252,11 +252,16 @@ class Viewer(object):
|
|||||||
def open_host(self, host, user, port, socketpath, password=None):
|
def open_host(self, host, user, port, socketpath, password=None):
|
||||||
raise NotImplementedError()
|
raise NotImplementedError()
|
||||||
|
|
||||||
|
def get_desktop_resolution(self):
|
||||||
|
raise NotImplementedError()
|
||||||
|
|
||||||
class VNCViewer(Viewer):
|
class VNCViewer(Viewer):
|
||||||
def __init__(self, console, config):
|
def __init__(self, console, config):
|
||||||
Viewer.__init__(self, console, config)
|
Viewer.__init__(self, console, config)
|
||||||
self.display = gtkvnc.Display()
|
self.display = gtkvnc.Display()
|
||||||
self.sockfd = None
|
self.sockfd = None
|
||||||
|
# Last noticed desktop resolution
|
||||||
|
self.desktop_resolution = None
|
||||||
|
|
||||||
def init_widget(self):
|
def init_widget(self):
|
||||||
# Set default grab key combination if found and supported
|
# Set default grab key combination if found and supported
|
||||||
@ -280,12 +285,19 @@ class VNCViewer(Viewer):
|
|||||||
lambda src: self.console.connected())
|
lambda src: self.console.connected())
|
||||||
self.display.connect("vnc-disconnected",
|
self.display.connect("vnc-disconnected",
|
||||||
lambda src: self.console.disconnected())
|
lambda src: self.console.disconnected())
|
||||||
self.display.connect("vnc-desktop-resize", self.console.desktop_resize)
|
self.display.connect("vnc-desktop-resize", self._desktop_resize)
|
||||||
self.display.connect("focus-in-event", self.console.viewer_focus_changed)
|
self.display.connect("focus-in-event", self.console.viewer_focus_changed)
|
||||||
self.display.connect("focus-out-event", self.console.viewer_focus_changed)
|
self.display.connect("focus-out-event", self.console.viewer_focus_changed)
|
||||||
|
|
||||||
self.display.show()
|
self.display.show()
|
||||||
|
|
||||||
|
def _desktop_resize(self, src_ignore, w, h):
|
||||||
|
self.desktop_resolution = (w, h)
|
||||||
|
self.console.window.get_widget("console-vnc-scroll").queue_resize()
|
||||||
|
|
||||||
|
def get_desktop_resolution(self):
|
||||||
|
return self.desktop_resolution
|
||||||
|
|
||||||
def _auth_credential(self, src_ignore, credList):
|
def _auth_credential(self, src_ignore, credList):
|
||||||
for cred in credList:
|
for cred in credList:
|
||||||
if cred in [gtkvnc.CREDENTIAL_PASSWORD,
|
if cred in [gtkvnc.CREDENTIAL_PASSWORD,
|
||||||
@ -388,6 +400,7 @@ class SpiceViewer(Viewer):
|
|||||||
self.spice_session = None
|
self.spice_session = None
|
||||||
self.display = None
|
self.display = None
|
||||||
self.audio = None
|
self.audio = None
|
||||||
|
self.display_channel = None
|
||||||
|
|
||||||
def _init_widget(self):
|
def _init_widget(self):
|
||||||
self.set_grab_keys()
|
self.set_grab_keys()
|
||||||
@ -404,6 +417,7 @@ class SpiceViewer(Viewer):
|
|||||||
self.spice_session = None
|
self.spice_session = None
|
||||||
self.audio = None
|
self.audio = None
|
||||||
self.display = None
|
self.display = None
|
||||||
|
self.display_channel = None
|
||||||
|
|
||||||
def is_open(self):
|
def is_open(self):
|
||||||
return self.spice_session != None
|
return self.spice_session != None
|
||||||
@ -431,6 +445,7 @@ class SpiceViewer(Viewer):
|
|||||||
|
|
||||||
if type(channel) == spice.DisplayChannel:
|
if type(channel) == spice.DisplayChannel:
|
||||||
channel_id = channel.get_property("channel-id")
|
channel_id = channel.get_property("channel-id")
|
||||||
|
self.display_channel = channel
|
||||||
self.display = spice.Display(self.spice_session, channel_id)
|
self.display = spice.Display(self.spice_session, channel_id)
|
||||||
self.console.window.get_widget("console-vnc-viewport").add(self.display)
|
self.console.window.get_widget("console-vnc-viewport").add(self.display)
|
||||||
self._init_widget()
|
self._init_widget()
|
||||||
@ -442,6 +457,11 @@ class SpiceViewer(Viewer):
|
|||||||
self.audio = spice.Audio(self.spice_session)
|
self.audio = spice.Audio(self.spice_session)
|
||||||
return
|
return
|
||||||
|
|
||||||
|
def get_desktop_resolution(self):
|
||||||
|
if not self.display_channel:
|
||||||
|
return None
|
||||||
|
return self.display_channel.get_properties("width", "height")
|
||||||
|
|
||||||
def open_host(self, host, user, port, socketpath, password=None):
|
def open_host(self, host, user, port, socketpath, password=None):
|
||||||
ignore = socketpath
|
ignore = socketpath
|
||||||
|
|
||||||
@ -501,9 +521,6 @@ class vmmConsolePages(vmmGObjectUI):
|
|||||||
self.gtk_settings_accel = None
|
self.gtk_settings_accel = None
|
||||||
self.gtk_settings_mnemonic = None
|
self.gtk_settings_mnemonic = None
|
||||||
|
|
||||||
# Last noticed desktop resolution
|
|
||||||
self.desktop_resolution = None
|
|
||||||
|
|
||||||
# Initialize display widget
|
# Initialize display widget
|
||||||
self.viewer = None
|
self.viewer = None
|
||||||
self.tunnels = None
|
self.tunnels = None
|
||||||
@ -684,10 +701,12 @@ class vmmConsolePages(vmmGObjectUI):
|
|||||||
|
|
||||||
def size_to_vm(self, src_ignore):
|
def size_to_vm(self, src_ignore):
|
||||||
# Resize the console to best fit the VM resolution
|
# Resize the console to best fit the VM resolution
|
||||||
if not self.desktop_resolution:
|
if not self.viewer:
|
||||||
|
return
|
||||||
|
if not self.viewer.get_desktop_resolution():
|
||||||
return
|
return
|
||||||
|
|
||||||
w, h = self.desktop_resolution
|
w, h = self.viewer.get_desktop_resolution()
|
||||||
self.topwin.unmaximize()
|
self.topwin.unmaximize()
|
||||||
self.topwin.resize(1, 1)
|
self.topwin.resize(1, 1)
|
||||||
self.queue_scroll_resize_helper(w, h)
|
self.queue_scroll_resize_helper(w, h)
|
||||||
@ -992,10 +1011,6 @@ class vmmConsolePages(vmmGObjectUI):
|
|||||||
self.config.set_console_password(self.vm, passwd.get_text(),
|
self.config.set_console_password(self.vm, passwd.get_text(),
|
||||||
username.get_text())
|
username.get_text())
|
||||||
|
|
||||||
def desktop_resize(self, src_ignore, w, h):
|
|
||||||
self.desktop_resolution = (w, h)
|
|
||||||
self.window.get_widget("console-vnc-scroll").queue_resize()
|
|
||||||
|
|
||||||
def queue_scroll_resize_helper(self, w, h):
|
def queue_scroll_resize_helper(self, w, h):
|
||||||
"""
|
"""
|
||||||
Resize the VNC container widget to the requested size. The new size
|
Resize the VNC container widget to the requested size. The new size
|
||||||
@ -1043,7 +1058,7 @@ class vmmConsolePages(vmmGObjectUI):
|
|||||||
widget.queue_resize()
|
widget.queue_resize()
|
||||||
|
|
||||||
def scroll_size_allocate(self, src_ignore, req):
|
def scroll_size_allocate(self, src_ignore, req):
|
||||||
if not self.viewer or not self.desktop_resolution:
|
if not self.viewer or not self.viewer.get_desktop_resolution():
|
||||||
return
|
return
|
||||||
|
|
||||||
scroll = self.window.get_widget("console-vnc-scroll")
|
scroll = self.window.get_widget("console-vnc-scroll")
|
||||||
@ -1053,7 +1068,9 @@ class vmmConsolePages(vmmGObjectUI):
|
|||||||
dy = 0
|
dy = 0
|
||||||
align_ratio = float(req.width) / float(req.height)
|
align_ratio = float(req.width) / float(req.height)
|
||||||
|
|
||||||
desktop_w, desktop_h = self.desktop_resolution
|
desktop_w, desktop_h = self.viewer.get_desktop_resolution()
|
||||||
|
if desktop_h == 0:
|
||||||
|
return
|
||||||
desktop_ratio = float(desktop_w) / float(desktop_h)
|
desktop_ratio = float(desktop_w) / float(desktop_h)
|
||||||
|
|
||||||
if not is_scale:
|
if not is_scale:
|
||||||
|
Loading…
Reference in New Issue
Block a user