virt-viewer 抢占键盘问题修复

这个问题困扰了我很久,今天终于解决了,发个帖子记录一下。

问题:
用 virt-viewer 打开虚拟机之后、鼠标进入虚拟机窗口时、移动鼠标时会自动抢占键盘。

期望:
在以上三种情况下不抢占键盘,但依然可以手动使用快捷键抢占键盘。

解决方案(假设系统是bullseye):

  1. 首先安装一些必需的软件包和构建依赖并下载libspice-client-gtk的源码:
    sudo apt install devscripts
    sudo apt build-dep libspice-client-gtk-3.0-5
    apt -t bullseye source libspice-client-gtk-3.0-5
    
  2. 进入源码目录:
    cd spice-gtk-0.39/
    
  3. 修改源码文件src/spice-widget.c
    @@ -1943,7 +1943,7 @@
     
         d->mouse_have_pointer = true;
         spice_gtk_session_set_mouse_has_pointer(d->gtk_session, true);
    -    try_keyboard_grab(display);
    +    d->keyboard_grab_released = TRUE;
         update_display(display);
     
         return true;
    @@ -1995,7 +1995,6 @@
         if (d->keyboard_grab_released)
             memset(d->activeseq, 0, sizeof(gboolean) * d->grabseq->nkeysyms);
         update_keyboard_focus(display, true);
    -    try_keyboard_grab(display);
     
         if (gtk_widget_get_realized(widget))
             update_display(display);
    @@ -2020,7 +2019,6 @@
             return true;
     #endif
     
    -    release_keys(display);
         update_keyboard_focus(display, false);
     
         return true;
    @@ -2119,12 +2117,6 @@
     
         d->seq_pressed = FALSE;
     
    -    if (d->keyboard_grab_released && d->keyboard_have_focus) {
    -        d->keyboard_grab_released = FALSE;
    -        release_keys(display);
    -        try_keyboard_grab(display);
    -    }
    -
         transform_input(display, motion->x, motion->y, &x, &y);
     
         switch (d->mouse_mode) {
    
  4. 修改版本号并打包:
    dch -n
    dpkg-buildpackage -b -us -uc
    
  5. 安装:
    sudo dpkg -i ../libspice-client-gtk-3.0-5_0.39-1.1_amd64.deb ../libspice-client-glib-2.0-8_0.39-1.1_amd64.deb ../spice-client-glib-usb-acl-helper_0.39-1.1_amd64.deb
    

sway 应该不用改代码就可以做到。