spice-gtk键盘灯的控制

news/2024/11/20 11:29:26/
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 */
}


http://www.ppmy.cn/news/625012.html

相关文章

基于遗传算法(GA)的多旅行商问题(MTSP)

matlab2016b可运行,输入城市位置,可以动态显示规划过程 % MTSPF_GA Fixed Multiple Traveling Salesmen Problem (M-TSP) Genetic Algorithm (GA) % Finds a (near) optimal solution to a variation of the M-TSP by setting % up a GA to search …

华为云obs桶授权

登录华为云控制台 https://auth.huaweicloud.com/authui/login.html?servicehttps://console.huaweicloud.com/console/#/login 进入并行文件系统页面 进入桶 添加ACL授权,填写被授权账号ID,点击确定即可

使用阿里云国际版应该避免哪些操作?

为确保系统稳定性,用户不得进行以下操作。否则,阿里云可能无法解决由以下违规操作引起的问题: 1) Windows系统中的PV Drivers 程序不可删除 PV Drivers程序为服务器虚拟化驱动程序,请不要针对该程序进行任何操作,如果删…

利用Python自动操纵鼠标键盘刷金币,工作室都是靠这种搬砖

不管是英雄联盟还是王者荣耀,总是有一个特殊的模式可以用来刷金币,为什么说是特殊模式呢?因为打的都是人机,或者并不影响游戏平衡,被其它玩家举报,同时你这种模式的战绩也没人去看你的。 如果能利用Python…

地下城装无盘服务器,DNF探秘地下城无尽模式:学会这3招,让你冲击服务器前10名!...

爱玩游戏,分享快乐,我是游戏欢乐Tree。 DNF里的探秘地下城活动已经与玩家们见面两天了,很多玩过卡牌游戏的玩家很快就适应了这个活动游戏的模式,并且玩的游刃有余直呼不过瘾!有很多兄弟发私信问大树,说这个…

地下城php补丁怎么用,dnf技能补丁怎么用到WeGame(附其使用教程)

今天给大家分享一些我自己觉得比较好看的一些补丁(第二期) 上一期感觉还行,分享一下剩余的女角色的补丁,女格斗,女魔法师,守护者,女暗夜。 这里还是啰嗦一下补丁是啥 (ps:补丁是用来修复DNF 只要补丁不会影…

dnf搬砖无盘服务器有什么要求,dnf:搬砖前大家必须注意的准备事项,你想让收入更多一些吗?...

dnf:搬砖前大家必须注意的准备事项,你想让收入更多一些吗? 由于策划宣传力度的增大以及最近活动的质量的增加,也是有了越来越多的萌新玩家来到了这片阿拉德大陆上,但是对于这些玩家的首要目的自然就是要进行对于装备的…

dnf7月7日服务器维护,关于DNF5在小长假更新后的第一次7月7日更新内容的详细说明...

DNF国服体验服务更新了的内容,主要包括五一版增加的一些小活动和氪金活动。为了让活跃的勇士们不至于很无聊和更新内容,也让玩家们在游戏中更加活跃,不断更新。这个问题的内容是相当好的,但实际上,他主要是从事一些将于…