Spicy 修改代码 实现双屏显示以及鼠标键盘绑定

Posted 乌托邦2号

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spicy 修改代码 实现双屏显示以及鼠标键盘绑定相关的知识,希望对你有一定的参考价值。

修改 spicy.c 

static SpiceWindow*create_spice_window(spice_connection *conn, SpiceChannel *channel, int id,gint monitor_id)

{
//注释掉的地方   就是隐藏菜单、工具栏和状态栏

   gtk_container_set_border_width(GTK_CONTAINER(vbox), 0);

   gtk_container_add(GTK_CONTAINER(win->toplevel), vbox);

   //gtk_box_pack_start(GTK_BOX(vbox), win->menubar, FALSE, FALSE, 0);zy

   //gtk_box_pack_start(GTK_BOX(vbox), win->toolbar, FALSE, FALSE, 0);zy

   gtk_box_pack_start(GTK_BOX(vbox), win->spice, TRUE, TRUE, 0);

   //gtk_box_pack_end(GTK_BOX(vbox), win->statusbar, FALSE, TRUE, 0);zy

   /* show window */

   if (fullscreen)

         {//zy  修改fullscreen 的功能,使其变成左屏显示(什么都不加为右屏显示)

         //printf("fullscreen:%s\\n",fullscreen);//zy

//       gtk_window_fullscreen(GTK_WINDOW(win->toplevel));zy

         gtk_window_set_default_size(GTK_WINDOW(win->toplevel),1000,600);//zy 设置窗口大小

         gtk_window_set_decorated(GTK_WINDOW(win->toplevel),FALSE);// add---zy

         gtk_window_move(GTK_WINDOW(win->toplevel),0,0);// add---zy 设置窗口起始位置

         }//zy

    Else  //右屏显示

         {
         gtk_window_set_default_size(GTK_WINDOW(win->toplevel),1000,600);//zy

         gtk_window_set_decorated(GTK_WINDOW(win->toplevel),FALSE);// add---zy

         gtk_window_move(GTK_WINDOW(win->toplevel),100,100);// add---zy

         }

}

static void menu_cb_select_usb_devices(GtkAction*action, void *data)

{
   gtk_box_set_spacing(GTK_BOX(gtk_bin_get_child(GTK_BIN(dialog))), 12);

   area = gtk_dialog_get_content_area(GTK_DIALOG(dialog));

   usb_device_widget = spice_usb_device_widget_new(win->conn->session,

                                                   NULL,fullscreen); /* default format */ //zy 加入一个bool型的参数

   g_signal_connect(usb_device_widget, "connect-failed",

                    G_CALLBACK(usb_connect_failed), NULL);

   gtk_box_pack_start(GTK_BOX(area), usb_device_widget, TRUE, TRUE, 0);

}

static void display_monitors(SpiceChannel*display, GParamSpec *pspec,

                             spice_connection*conn)

{
w = create_spice_window(conn, display, id,i);

           add_window(conn, w);

           spice_g_signal_connect_object(display, "display-mark",

                                         G_CALLBACK(display_mark), w, 0);

           gtk_widget_show(w->toplevel);

                 menu_cb_select_usb_devices(NULL,(void*)w);   //zy-add  调用函数,自动实现窗口菜单栏的点击消息发送

           update_auto_usbredir_sensitive(conn);

}

usb-device-widget.h

修改函数声明

GtkWidget*spice_usb_device_widget_new(SpiceSession   *session,

                                       constgchar     *device_format_string,

                                            gboolean fullscreen);//zy

usb-device-widget.c

加入功能(将两套键盘鼠标的ID存在指定的文件里,以便窗口启动时根据ID绑定对应的设备)

static GObject*spice_usb_device_widget_constructor(

GType gtype,guint n_properties, GObjectConstructParam *properties)

{
//----------------------------add-----------------zy

   gchar *desc;

   char list_r[24]="";

   char list_l[24]="";

   int flag_mouse = 0;

   int flag_keyboard = 0;

   for (i = 0; i < devices->len; i++)

    {
       desc = spice_usb_device_get_description(g_ptr_array_index(devices, i),

                                           priv->device_format_string);

        char *token = strtok(desc," ");

        while(token != NULL)

          {
             if(strcmp(token,"Mouse") == 0 ||strcmp(token,"MOUSE") == 0)

                {
                   token = strtok(NULL,"");

                   if(flag_mouse == 0)

                    {
                        strcat(list_r,token);

                        flag_mouse++;

                    }

                    else

                    {
                        strcat(list_l,token);

                    }

                }

            if(strcmp(token,"Keyboard") == 0 ||strcmp(token,"KEYBOARD") == 0)

                {
                   token = strtok(NULL,"");

                   if(flag_keyboard == 0)

                    {
                        strcat(list_r,token);

                        flag_keyboard++;

                    }

                    else

                    {
                        strcat(list_l,token);

                    }

                 }

               token = strtok(NULL,"");

           }

    }

    g_free(desc);  //zy-add--

    FILE *fp;

    fp=fopen("/root/right.txt","w+");

    if(fp==NULL)return;

    fputs(list_r,fp);

    fclose(fp);

    fp=fopen("/root/left.txt","w+");

    if(fp==NULL)return;

    fputs(list_l,fp);

    fclose(fp);

//----------------------------end----------------

}

添加功能,程序读取配置文件信息,一次比较将usb设备绑定到虚拟机内

static voiddevice_added_cb(SpiceUsbDeviceManager *manager,

SpiceUsbDevice*device, gpointer user_data)

{
//----------------------------------add------------zy----------

   char str1[12];

   char str2[12];

   FILE *fp;

   if(flag_r_screen)

    {
   fp = fopen("/root/right.txt","r+");

   if(fp == NULL) return;

    }

   else

    {
   fp = fopen("/root/left.txt","r+");

   if(fp == NULL) return;

    }

   fgets(str1,12,fp);

   fgets(str2,12,fp);

   fclose(fp);

   printf("%s\\n",str1);

   printf("%s\\n",str2);

   g_print(_("zy5_1_description:%s\\n"),desc);

   char *token = strtok(desc," ");

   while(token != NULL)

     {
       if(strcmp(token,str1) == 0 || strcmp(token,str2) == 0)

         {
            checkbox_clicked_cb(check,self);

         }

       token = strtok(NULL," ");

     }

   g_free(desc);

//---------------------------------end-------------------

}

修改点击事件处理函数,屏蔽掉状态的筛选,直接将传过来的设备添加到虚拟机中

static void checkbox_clicked_cb(GtkWidget*check, gpointer user_data)

{
/*  zy---del

   if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(check))) {
       connect_cb_data *data = g_new(connect_cb_data, 1);

       data->check = g_object_ref(check);

       data->self  =g_object_ref(self);

       spice_usb_device_manager_connect_device_async(priv->manager,

                                                     device,

                                                     NULL,

                                                     connect_cb,

                                                     data);

    }else {
       spice_usb_device_manager_disconnect_device(priv->manager,

                                                  device);

    }

   spice_usb_device_widget_update_status(self);

*/

///---------------------add----------------zy

       connect_cb_data *data = g_new(connect_cb_data, 1);

       data->check = g_object_ref(check);

       data->self  =g_object_ref(self);

       spice_usb_device_manager_connect_device_async(priv->manager,

                                                     device,

                                                     NULL,

                                                     connect_cb,

                                                     data);

//------------------------end----------------------zy------

}
————————————————
版权声明:本文为CSDN博主「傻呆」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_21398167/article/details/50804271

以上是关于Spicy 修改代码 实现双屏显示以及鼠标键盘绑定的主要内容,如果未能解决你的问题,请参考以下文章

使用delphi多线程实现绑定某个EXE的进程并且向它发送键盘鼠标消息的实例。

通过 KVM+virt-manager配置双屏虚拟机(两套键盘。鼠标)

win7双屏如何实现窗口从主屏移动到副屏?

双屏显示时如何设定主副屏

198Synergy - 鼠标键盘共享软件

我是双屏分别显示的,但在玩全屏游戏的时候,鼠标移不到第二个屏幕,第二个屏幕的分屏率变了,求解,谢谢