修改 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 修改代码 实现双屏显示以及鼠标键盘绑定相关推荐

  1. 在window的cmd命令行中通过chcp修改代码页--正确显示utf-8字符

    Mt8616的开发板通过adb工具可以在Windows系统的cmd命令行显示出debug信息,但是mt8516开发板的系统上是移植的裁剪的linux系统,也就是里面的文件是utf-8的编码形式,不能正 ...

  2. 双屏显示时鼠标如何从左(右)侧移入另一屏

    鼠标拖动两个屏幕位置交换即可

  3. 记录一下idea修改代码之后还是显示原程序不能提交代码的问题

    在网上看了一下原因就是要配置class输出路径,请按下ctrl+shift+alt+s:

  4. Selenium 利用 JS/JQ 操作元素、鼠标键盘事件、Cookie 操作

    今天是持续写作的第 26 / 100 天. 如果你有想要交流的想法.技术,欢迎在评论区留言. 本篇博客主要学习 Selenium 中如何利用 JavaScript 与 JQuery 操作页面元素,以及 ...

  5. win10 双屏显示 鼠标可以从主屏幕左侧滑入右侧竖屏

    win10 双屏显示 鼠标可以从主屏幕左侧滑入右侧竖屏 把之前的位置用鼠标拖拽一下,放到左边即可.

  6. SVN 检查修改或者提交代码时候一直显示please wait的解决办法(汉化版本显示请稍候)

    在提交使用vue写的前端代码时候一直显示"请稍候",检查修改时候也是这样显示. 原因是 : 下载代码后 npm install 安装了依赖. 可以在SVN中取消对相关依赖的控制. ...

  7. 解决问题:ubuntu双屏显示的时候,鼠标从左屏幕向右切在边界处会卡顿,需要快速移动鼠标冲过

    问题描述: ubuntu双屏显示的时候,鼠标从左屏幕向右切在边界处会卡顿: 解决办法: 快速移动鼠标冲过 在系统设置下选择显示,双击后关闭粘滞边缘选项即可 不敢相信,我忍受了三个星期的问题今天终于解决 ...

  8. SourceInsight 修改代码后无法保存,显示“xxx is busy or opened by another process”

    SourceInsight 修改代码后无法保存,显示"xxx is busy or opened by another process" 是文件夹权限的问题,更新一下权限就行 ch ...

  9. IDEA几个设置:设置空格显示成小点、显示行数、 Ctrl + 鼠标滚轮 快捷键来控制代码字体大小显示、护眼背景色

    1.设置空格显示成小点和显示行数,最初如图所示 1.1 现在进行设置,设置如图. 1.2 设置后有行数显示,空格变成小点显示效果图. 2.Ctrl + 鼠标滚轮 快捷键来控制代码字体大小显示 3.设置 ...

最新文章

  1. 谨慎使用PHP的引用
  2. ELK菜鸟手记 (三) - X-Pack权限控制之给Kibana加上登录控制以及index_not_found_exception问题解决
  3. poj 2524 Ubiquitous Religions (并查集)
  4. Javascript 面向对象编程中的‘new’
  5. 深入理解JS中this关键字
  6. 使用HTML5技术开发的超酷颜色选择器
  7. pytorch必须掌握的的4种学习率衰减策略
  8. xp系统web服务器搭建教程,Windows_XP配置WEB服务器教程(图)
  9. python3打包exe运行没反应_python selenium运行,打包exe常见问题解决方法
  10. 前端学习(1349):用户的增删改查操作6删除
  11. 如何成为一个技术“牛人”
  12. android 绘图流程,Android View绘制流程
  13. linux等候脚本,linux – 在bash脚本中继续之前等待通过ssh运行的脚本完成
  14. 【STM32F407F429H7的DSP教程】第34章 滤波器基础知识
  15. RANSAC算法思想与实现点云粗配准
  16. MiroTik 路由器配置无线中继模式(超细教程)
  17. usnews2015美国大学计算机排名,2019USNews美国大学计算机专业排名
  18. 每个工程师都应该知道的 5 个射频发射器测量指标(自NI官网翻译)
  19. 【NOIP模拟】序列
  20. 选择面向 USB4 数据线的 ESD 保护

热门文章

  1. airpodspro窃听模式_苹果详解AirPods Pro无线耳机:主动降噪是这样实现的
  2. 编译tensorflow遇见JVM out错误
  3. dir under linux.Linux下的类dir程序.
  4. 不规则四边形的平行四边形化
  5. 中科红旗开源Linux解决方案
  6. RGB显示屏的辐射超标问题点及解决方案
  7. 三观不合,永远不会是一路人!
  8. [HNOI2005]狡猾的商人(差分约束)
  9. 【实验】多周期CPU微程序设计
  10. 接吻的十大忌讳及对策