MiniGUI内核事件线程简单分析

news/2024/11/23 17:09:24/

前言

之前看了一篇介绍MiniGUI事件分发的文章MiniGUI事件分发机制,但是最近项目中遇到问题需要排查下事件分发的细节,周六看了下,这里做个记录.

1. 关于EventLoop

文件路径: ./src/kernel/init.c
static void* EventLoop (void* data)
{LWEVENT lwe;int event;lwe.data.me.x = 0; lwe.data.me.y = 0;sem_post ((sem_t*)data);while (__mg_quiting_stage > _MG_QUITING_STAGE_EVENT) {event = IAL_WaitEvent (IAL_MOUSEEVENT | IAL_KEYEVENT, 0,NULL, NULL, NULL, (void*)&__mg_event_timeout);if (event < 0) {usleep(10*1000); /*reduce the CPU usage frequency*/continue;}lwe.status = 0L;lwe.data.me.status = 0;// 鼠标事件if (event & IAL_MOUSEEVENT && kernel_GetLWEvent (IAL_MOUSEEVENT, &lwe))ParseEvent (&lwe);lwe.status = 0L;lwe.data.ke.status = 0;// 按键事件if (event & IAL_KEYEVENT && kernel_GetLWEvent (IAL_KEYEVENT, &lwe))ParseEvent (&lwe);if (event == 0 && kernel_GetLWEvent (0, &lwe))ParseEvent (&lwe);}/* printf("Quit from EventLoop()\n"); */return NULL;
}
  • while循环一开始会调用IAL_WaitEvent函数获取事件,获取到事件的话会实时处理, 没有事件的话会延时10毫秒等待(防止CPU过度使用),IAL_WaitEvent函数会调用对应输入引擎的实现,tslib中是使用select监听输入事件。
  • 接下来,会根据事件类型对事件进行加工,事件类型这里分为鼠标事件和按键事件,TFT屏幕设备的话主要关心的可能还是鼠标事件,因为这里面有按下,抬起,滑动事件。
  • kernel_GetLWEvent 函数会对事件进行加工处理,需要保留的事件就会交给parseEvent函数进行解析,不需要保留的函数就会丢弃。

2. kernel_GetLWEvent

BOOL kernel_GetLWEvent (int event, PLWEVENT lwe)
{/*---省略---*/timeout_count = 0;/* There was an event occurred. */if (event & IAL_MOUSEEVENT) {lwe->type = LWETYPE_MOUSE;// 获取button事件if (kernel_RefreshCursor(&me->x, &me->y, &button)) {me->event = ME_MOVED;time1 = 0;time2 = 0;//Note:should contains button state in MSG_MOUSEMOVEif (button == oldbutton)goto mouseret;}// 左键的处理逻辑if ( !(oldbutton & IAL_MOUSE_LEFTBUTTON) && (button & IAL_MOUSE_LEFTBUTTON) ){license_on_input();interval = __mg_timer_counter - time1;if (interval <= dblclicktime)me->event = ME_LEFTDBLCLICK;elseme->event = ME_LEFTDOWN;time1 = __mg_timer_counter;goto mouseret;}if ( (oldbutton & IAL_MOUSE_LEFTBUTTON) && !(button & IAL_MOUSE_LEFTBUTTON) ){license_on_input();me->event = ME_LEFTUP;goto mouseret;}// 下面是右键的button事件--暂不分析if ( !(oldbutton & IAL_MOUSE_RIGHTBUTTON) && (button & IAL_MOUSE_RIGHTBUTTON) ){interval = __mg_timer_counter - time2;if (interval <= dblclicktime)me->event = ME_RIGHTDBLCLICK;elseme->event = ME_RIGHTDOWN;time2 = __mg_timer_counter;goto mouseret;}if ( (oldbutton & IAL_MOUSE_RIGHTBUTTON) && !(button & IAL_MOUSE_RIGHTBUTTON) ){me->event = ME_RIGHTUP;goto mouseret;}}/*-------keyevent事件暂不展开------*/old_lwe.type = 0;return 0;mouseret:status &= ~(MASK_KS_BUTTONS);oldbutton = button;if (oldbutton & IAL_MOUSE_LEFTBUTTON)status |= KS_LEFTBUTTON;if (oldbutton & IAL_MOUSE_RIGHTBUTTON)status |= KS_RIGHTBUTTON;me->status = status;memcpy (&old_lwe, lwe, sizeof (LWEVENT));__mg_event_timeout.tv_sec = 0;__mg_event_timeout.tv_usec = timeoutusec;return 1;
}
  • 该函数包含了对鼠标事件和按键事件的处理逻辑,按键事件此处不进行分析,主要是对鼠标事件进行分析
  • 一开始会调用kernel_RefreshCursor函数获取button是按下还是抬起,并获取坐标值。获取button的方法是调用输入引擎的IAL_GetMouseButton函数,该函数获取的button值最终又是由mouse_update函数赋值的,赋值的原理就是,压力值>0认为是按下,反之认为是抬起。
    mouse_update函数中使用的是ts_read函数获取触摸数值,该函数只支持单指,多指的话需要调用ts_read_mt函数获取
  • kernel_GetLWEvent 函数接下来会用oldbutton 和 button来判断按下还是抬起逻辑,oldbutton = 0,button = 1是按下,oldbutton = 1,button = 0是抬起,这里没有对oldbutton = 0,button = 0 或者oldbutton = 1,button = 1进行处理,原因是单指操作时,只有这两种逻辑,如果有多指操作的话,这里就需要添加全0或者全1逻辑的处理。
  • kernel_GetLWEvent 函数的返回结果会决定接下来是否进入事件解析逻辑,即parseEvent,parseEvent函数对事件进行处理后,决定是否放入消息队列中。

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

相关文章

一款红队批量脆弱点搜集工具

功能 指纹识别:调用“三米前有香蕉皮“前辈工具&#xff0c;他的工具比finger好用 寻找资产中404&#xff0c;403&#xff0c;以及网页中存在的其他薄弱点&#xff0c;以及需要特定路径访问的资产 后续会把nuclei加进来 目前只有windows可以用 使用 第一次使用脚本请运行p…

CTFShow-WEB入门篇--信息搜集详细Wp

CTFShow-WEB入门篇详细Wp 信息收集&#xff1a;web1&#xff1a;web2&#xff1a;web3&#xff1a;web4&#xff1a;web5&#xff1a;web6&#xff1a;web7&#xff1a;web8&#xff1a;web9&#xff1a;web10&#xff1a;web11&#xff1a;web12&#xff1a;web13&#xff1a;…

【单目标优化算法】沙猫群优化算法(Matlab代码实现)

&#x1f4a5; &#x1f4a5; &#x1f49e; &#x1f49e; 欢迎来到本博客 ❤️ ❤️ &#x1f4a5; &#x1f4a5; &#x1f3c6; 博主优势&#xff1a; &#x1f31e; &#x1f31e; &#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 …

【软件测试】cookie、session和token的区别

今天就来说说session、cookie、token这三者之间的关系&#xff01;最近这仨玩意搞得头有点大 为什么会有它们三个 我们都知道 HTTP 协议是无状态的&#xff0c;所谓的无状态就是客户端每次想要与服务端通信&#xff0c;都必须重新与服务端链接&#xff0c;意味着请求一次客户…

实验篇(7.2) 07. 通过安全隧道访问指定网站 (SSL) ❀ 远程访问

【简介】通过前面的实验&#xff0c;我们已经了解了SSL VPN的隧道模式。FortiClient客户端拨号后&#xff0c;访问服务器IP的流量&#xff0c;会通过安全隧道到达远端防火墙&#xff0c;并访问DMZ接口下的服务器。那如果我想让更多的访问走安全隧道&#xff0c;但是又不确定是哪…

Python爬取壁纸

import requests # 此模板需下载&#xff0c;cmd 中输入 pip install requests import re import os 爬取步骤 # 第一步 爬取数据 # 第二步 解析数据 # 第三步 保存数据 def change_title(name):new_name re.sub([/\*?<>"|], _, name)return new_nameprint…

Logstash配置输出Syslog

一、简介 Logstash 是一个开源的数据收集引擎&#xff0c;它具有备实时数据传输能力&#xff0c;可以统一过滤来自不同源的数据&#xff0c;并按照开发者的制定的规范输出到目的地。 二、安装 老版本的Logstash 依赖 JDK1.8 &#xff0c;因此在安装之前请确保机器已经安装和…

android 8.0 原生壁纸,HUAWEI华为Nova 8 (Pro) 手机内置原生壁纸分享

华为发布了最新的第8代Nova系列手机。一如既往&#xff0c;华为Nova 8系列中推出了三种型号&#xff0c;分别是Nova 8、Nova 8 Pro和Nova 8 SE。 HUAWEI nova 8 屏幕方面则采用了 6.57 英寸的 OLED 曲面屏&#xff0c;屏幕色彩方面则为 10.7亿色&#xff0c;DCI-P3 广色域&…