序言
通过Virt Manager研究学习Spice gtk的Python方法
你将学到什么
Virt Manager研究
显示代码定位
首先我们使用Virt Manager来观察桌面连接窗口
然后我们使用glade打开Virt Manager源码目录下的ui目录下的文件进行比对,发现details.ui就是我们前面见到的窗口,对应的处理代码为details.py,并且我们知道对应的处理信号为on_control_vm_console_toggled
接着我们在details.py文件找到对应处理函数
# 绑定信号处理函数
"on_control_vm_console_toggled": self.details_console_changed,
# 处理函数核心逻辑
pages.set_current_page(DETAILS_PAGE_CONSOLE)
分析函数我们知道信号的处理逻辑就是切换到DETAILS_PAGE_CONSOLE页面,然后我们找到对应的页面知道对应的处理信号为on_console_pages_switch_page
查找信号对应的处理函数,我们知道最终的显示代码位于console.py中,继续分析UI文件,我们知道我们最终要关注的部件就是console-gfx-viewport,接下来我们来研究下console.py文件的vmmConsolePages类
vmmConsolePages类分析
首先分析类的初始化代码,我们发现如下注释
def __init__(self, vm, builder, topwin)
# Initialize display widget
self._viewer = None
很显然这个_viewer就是用作显示的widget,查找代码找到_viewer赋值处
def _init_viewer(self):
# 省略部分代码
try:
if ginfo.gtype == "vnc":
viewer_class = VNCViewer
elif ginfo.gtype == "spice":
if have_spice_gtk:
viewer_class = SpiceViewer
else:
raise RuntimeError("Error opening Spice console, "
"SpiceClientGtk missing")
self._viewer = viewer_class(self.vm, ginfo)
self._connect_viewer_signals()
self._refresh_enable_accel()
self._viewer.console_open()
except Exception, e:
logging.exception("Error connection to graphical console")
self._activate_unavailable_page(
_("Error connecting to graphical console") + ":\n%s" % e)
很显然SpiceViewer就是实现spice gtk调用的类,它位于viewers.py文件中,在研究这个类之前我们要先研究下传入的两个参数viewer_class(self.vm, ginfo),其中self.vm是一个vmmDomain类对象(位于domain.py文件),ginfo变量是一个ConnectionInfo类对象(位于sshtunnels.py文件)。ConnectionInfo类对象作用就是保存套接字服务端信息,vmmDomain类对象作用就是保存libvirt虚拟机信息。
SpiceViewer代码分析
首先我们来看下官方文档的描述
SpiceSession处理所有SpiceChannel连接,它同时还保存了连接信息比如服务器地址和端口。你也可以简单的设置"uri"比如 spice://127.0.0.1?port=5930 来设置你的连接信息。通过关联channel-new信号到SpiceSession对象,你将会收到连接就绪通知,并进行互动。比如SpiceInputsChannel准备就绪并且收到SPICE_CHANNEL_OPENED事件,你就可以通过spice_inputs_key_press()来发送按键事件;如果SpiceMainChannel处于可用状态,你就可以开始共享剪切板了等等。一旦SpiceSession对象属性设置完成,我们就能通过调用spice_session_connect()开始与Spice server的通信。
通过官网的描述使用SpiceSession的步骤如下:</