1、控制键盘灯入口
1.1、SPICE服务器通过信号" inputs-modifiers"改变键盘灯
static void guest_modifiers_changed(SpiceInputsChannel *inputs, gpointer data)//信号改变键盘灯
{SpiceGtkSession *self = data;spice_gtk_session_sync_keyboard_modifiers_for_channel(self, inputs, FALSE);
}static void spice_inputs_channel_class_init(SpiceInputsChannelClass *klass)
{.../*** SpiceInputsChannel::inputs-modifiers:* @display: the #SpiceInputsChannel that emitted the signal** The #SpiceInputsChannel::inputs-modifiers signal is emitted when* the guest keyboard locks are changed. You can read the current* state from #SpiceInputsChannel:key-modifiers property.**//* TODO: use notify instead? */signals[SPICE_INPUTS_MODIFIERS] =g_signal_new("inputs-modifiers",G_OBJECT_CLASS_TYPE(gobject_class),G_SIGNAL_RUN_FIRST,G_STRUCT_OFFSET(SpiceInputsChannelClass, inputs_modifiers),NULL, NULL,g_cclosure_marshal_VOID__VOID,G_TYPE_NONE,0);channel_set_handlers(SPICE_CHANNEL_CLASS(klass));
}//在spice-gtk-session.c层进行连接,qt也需要连接
static void channel_new(SpiceSession *session, SpiceChannel *channel,gpointer user_data)
{...if (SPICE_IS_INPUTS_CHANNEL(channel)) {spice_g_signal_connect_object(channel, "inputs-modifiers",G_CALLBACK(guest_modifiers_changed), self, 0); //信号改变键盘灯spice_gtk_session_sync_keyboard_modifiers_for_channel(self, SPICE_INPUTS_CHANNEL(channel), TRUE); //立即改变键盘灯}
}
1.1.1、输入通道收到SPICE服务器初始化的时候,发信号改变键盘灯

/* coroutine context */
static void inputs_handle_init(SpiceChannel *channel, SpiceMsgIn *in)
{SpiceInputsChannelPrivate *c = SPICE_INPUTS_CHANNEL(channel)->priv;SpiceMsgInputsInit *init = spice_msg_in_parsed(in);c->modifiers = init->keyboard_modifiers;g_coroutine_signal_emit(channel, signals[SPICE_INPUTS_MODIFIERS], 0);
}

1.1.2、输入通道收到SPICE服务器改变键盘灯,发信号改变键盘灯

static void inputs_handle_modifiers(SpiceChannel *channel, SpiceMsgIn *in)
{SpiceInputsChannelPrivate *c = SPICE_INPUTS_CHANNEL(channel)->priv;SpiceMsgInputsKeyModifiers *modifiers = spice_msg_in_parsed(in);c->modifiers = modifiers->modifiers;g_coroutine_signal_emit(channel, signals[SPICE_INPUTS_MODIFIERS], 0);
}
1.2、gtk层外部调用接口
void spice_gtk_session_sync_keyboard_modifiers(SpiceGtkSession *self)
{GList *l = NULL, *channels = spice_session_get_channels(self->priv->session);for (l = channels; l != NULL; l = l->next) {if (SPICE_IS_INPUTS_CHANNEL(l->data)) {SpiceInputsChannel *inputs = SPICE_INPUTS_CHANNEL(l->data);spice_gtk_session_sync_keyboard_modifiers_for_channel(self, inputs, TRUE);//同步键盘灯}}g_list_free(channels);
}
1.3、new_channel时调用同步键盘灯
static void channel_new(SpiceSession *session, SpiceChannel *channel,gpointer user_data)
{g_return_if_fail(SPICE_IS_GTK_SESSION(user_data));SpiceGtkSession *self = user_data;SpiceGtkSessionPrivate *s = self->priv;if (SPICE_IS_MAIN_CHANNEL(channel)) {SPICE_DEBUG("Changing main channel from %p to %p", s->main, channel);s->main = SPICE_MAIN_CHANNEL(channel);g_signal_connect(channel, "main-clipboard-selection-grab",G_CALLBACK(clipboard_grab), self);g_signal_connect(channel, "main-clipboard-selection-request",G_CALLBACK(clipboard_request), self);g_signal_connect(channel, "main-clipboard-selection-release",G_CALLBACK(clipboard_release_delay), self);}if (SPICE_IS_INPUTS_CHANNEL(channel)) {spice_g_signal_connect_object(channel, "inputs-modifiers",G_CALLBACK(guest_modifiers_changed), self, 0); //信号改变键盘灯spice_gtk_session_sync_keyboard_modifiers_for_channel(self, SPICE_INPUTS_CHANNEL(channel), TRUE); //立即改变键盘灯}
}
2、键盘灯实际处理函数
//通过gtk设置键盘灯,qt需要重写
static void spice_gtk_session_sync_keyboard_modifiers_for_channel(SpiceGtkSession *self,SpiceInputsChannel* inputs,gboolean force)
{guint32 guest_modifiers = 0, client_modifiers = 0;g_return_if_fail(SPICE_IS_INPUTS_CHANNEL(inputs));if (SPICE_IS_GTK_SESSION(self) && !self->priv->sync_modifiers) {SPICE_DEBUG("Syncing modifiers is disabled");return;}g_object_get(inputs, "key-modifiers", &guest_modifiers, NULL);client_modifiers = get_keyboard_lock_modifiers();//获取本地键盘灯if (force || client_modifiers != guest_modifiers) {CHANNEL_DEBUG(inputs, "client_modifiers:0x%x, guest_modifiers:0x%x", client_modifiers, guest_modifiers);spice_inputs_channel_set_key_locks(inputs, client_modifiers);}
}//通过gtk获取本地键盘灯,qt需要重写
static guint32 get_keyboard_lock_modifiers(void)
{guint32 modifiers = 0;GdkKeymap *keyboard = gdk_keymap_get_for_display(gdk_display_get_default());//获取大小写灯if (gdk_keymap_get_caps_lock_state(keyboard)) {modifiers |= SPICE_INPUTS_CAPS_LOCK;}//获取小数字键盘灯if (gdk_keymap_get_num_lock_state(keyboard)) {modifiers |= SPICE_INPUTS_NUM_LOCK;}//获取滚轮灯if (gdk_keymap_get_scroll_lock_state(keyboard)) {modifiers |= SPICE_INPUTS_SCROLL_LOCK;}return modifiers;
}/**
* spice_inputs_channel_set_key_locks:
* @channel: a #SpiceInputsChannel
* @locks: #SpiceInputsLock modifiers flags
* 设置guest系统中的键盘灯(Caps大写灯, Num数字灯, Scroll滚动灯)
**/
void spice_inputs_channel_set_key_locks(SpiceInputsChannel *channel, guint locks)
{SpiceMsgOut *msg;if (spice_channel_get_read_only(SPICE_CHANNEL(channel)))return;msg = set_key_locks(channel, locks);if (!msg) /* you can set_key_locks() even if the channel is not ready */return;spice_msg_out_send(msg); /* main -> coroutine */
}

spice-gtk键盘灯的控制相关推荐

  1. 键盘动态库开发(修改键值映射和键盘灯控制)

    键盘动态库开发(修改键值映射和键盘灯控制) 开发需求 键盘DLL功能 1. 键盘OPEN 2. 键盘CLOSE 3. 键盘灯控制 4. 键值抓取 开发需求 需求:开发一款9键键盘DLL和演示程序,要求 ...

  2. Android开发之程序运行时保持屏幕、CPU、键盘灯的状态

    Android程序运行时,可以使用WakeLock保证程序运行中玩家无操作时,设备的状态. PowerManager.WakeLock的使用:Android使用Lock锁对电源进行控制,lock锁必须 ...

  3. Android键盘灯亮度控制

    最近4个月的时间,5个人做了两个Android的手机项目:一个2.2.1的,另一个是2.3.4:不知道其他公司是不是也是这样的工作量.对于我们相比之前的项目来说,完全是让我们超长发挥.从之前没有接触过 ...

  4. 华为G610(Android 4.2)永久关闭键盘灯的方法

    环境: 1.华为G610已经Root(我测试的是移动版) 2.装有RE浏览器 3.更改系统文件有风险,操作需谨慎 如果嫌麻烦,可以使用我开发的软件进行关闭. 软件名称:键盘灯终结者 下载地址:http ...

  5. 华为荣耀MagicBook笔记本 键盘灯怎么设置为常亮?

    华为荣耀MagicBook笔记本 键盘灯怎么设置为常亮? 我的电脑是F3控制的键盘灯, 开关按F3一下就好了 这是我的电脑型号:

  6. 联想笔记本电脑键盘灯怎么开启_联想笔记本电脑的键盘灯怎么开

    展开全部 1.联想笔记本部分型号具备键盘背32313133353236313431303231363533e4b893e5b19e31333431336664光功能,方法通过"FN+空格&q ...

  7. 在Ubuntu下更好的使用Thinkpad T60 - 键盘灯和指点杆

    Thinkpad的Linux用户群很大,在笔记本里属于Linux支持的比较好的,驱动基本上都有,ThinkWiKi还有很多Linux的文档. 每天上班都用Gaim来访问MSN和IRC,无意中发现Ubu ...

  8. pyautogui实现狼蛛键盘灯自动切换配置达到自动白天关键盘灯夜晚亮灯

    相关文档:https://pyautogui.readthedocs.io/en/latest/ windows系统:cmd中直接输入 pip install pyautogui Mac OS系统: ...

  9. 可以用c语言改笔记本键盘灯,笔记本有背光键盘重要吗?大部分没有背光键盘怎么办?...

    关于背光的必要性:这个要看具体用户的使用场合,如果在夜间且缺乏灯光的场合使用较多,那么背光键盘就显得很重要了,但是在平常管线充足的场合,背光没有太大帮助,外观上会更漂亮些. 对于没有背光的机器,有两种 ...

  10. python 写游戏好简单啊,我用键盘可以随意控制角色了【python 游戏实战 04】

    前言 本系列文章将会以通俗易懂的对话方式进行教学,对话中将涵盖了新手在学习中的一般问题.此系列将会持续更新,包括别的语言以及实战都将使用对话的方式进行教学,基础编程语言教学适用于零基础小白,之后实战课 ...

最新文章

  1. Java线程---休眠问题来看并发执行
  2. mysql下载地址与安装
  3. 【转】SAP技术趋势及建议
  4. 【Linux】【MySQL】CentOS7安装最新版MySQL8.0.13(最新版MySQL从安装到运行)
  5. 查询前10条_98条铁路!2021年底前计划开工建设铁路进度一览(10月8日更新)
  6. CSS图片链接、映射
  7. 使用Xmanger/Xbrowser 远程桌面Ubuntu 12.04 LTS
  8. 点击按钮显示和隐藏图片
  9. 送人玫瑰,手有余香----七夕情人节的电子玫瑰
  10. CDN及其加速原理(详解)
  11. 游戏数学: 计算屏幕点中的平面上的点(上帝视角)
  12. 关于android删除语音搜索功能的基本操作方法
  13. 如何利用Simulink来设计一个AEB的算法,并通过SCANeR仿真来测试?
  14. Java实现字数统计(中文英文韩文日文混合),类似word效果
  15. ECC-Elliptic Curves Cryptography,椭圆曲线密码编码学
  16. linux C之alarm函数(更改)
  17. 1111qqqqqqqq
  18. 2020年这些行业有可能会大爆发,抓住风口,奋力养家!
  19. shell中for循环拼接字符串
  20. oracle 视图怎么更新数据,Update视图数据(oracle)

热门文章

  1. python里orient_Python3 tkinter基础 Scale orient 横竖 resolution单步步长 length 长度 tickinterval 指示刻度...
  2. 一小只支付接口的自动化
  3. STM32之DMA及USART使用
  4. 证明STINGY SAT是NP-complete问题
  5. 第12章 项目采购管理
  6. bro RPM 离线安装
  7. html css样式出不来与背景图片出不来的解决办法
  8. 【无标题】无聊的代码
  9. BAO力解决找不到vc_runtimeMinimum_x64.msi问题
  10. 玩转Flash视频 FLV 简简单单