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------

}

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值