RK 11.0 多屏模式下修改鼠标进入方式
要求:主屏在左,副屏在右。这种排列情况下鼠标仅可通过主屏的最右侧移入副屏的最左侧,或从副屏的最左侧移入主屏最右侧。
1.RK默认设计
1.1 RK的代码设计是当sys.mouse.presentation=1时,鼠标在屏幕边缘的时候就会移入另一个屏幕
- frameworks/native/services/inputflinger/reader/mapper/CursorInputMapper.cpp
void CursorInputMapper::sync(nsecs_t when) {...if (mSource == AINPUT_SOURCE_MOUSE) {if (moved || scrolled || buttonsChanged) {mPointerController->setPresentation(PointerControllerInterface::PRESENTATION_POINTER);if (moved) {mPointerController->move(deltaX, deltaY);}if (buttonsChanged) {mPointerController->setButtonState(currentButtonState);}mPointerController->unfade(PointerControllerInterface::TRANSITION_IMMEDIATE);}mPointerController->getPosition(&xCursorPosition, &yCursorPosition);pointerCoords.setAxisValue(AMOTION_EVENT_AXIS_X, xCursorPosition);pointerCoords.setAxisValue(AMOTION_EVENT_AXIS_Y, yCursorPosition);pointerCoords.setAxisValue(AMOTION_EVENT_AXIS_RELATIVE_X, deltaX);pointerCoords.setAxisValue(AMOTION_EVENT_AXIS_RELATIVE_Y, deltaY);char mMousePresentation[PROPERTY_VALUE_MAX] = {0};property_get("sys.mouse.presentation", mMousePresentation, "0");if (strcmp(mMousePresentation, "1") == 0) {displayId = mDisplayId;float minX, minY, maxX, maxY;if (mPointerController->getBounds(&minX, &minY, &maxX, &maxY)) {// 如果鼠标位置在屏幕四周边缘,进入另外的屏幕,重新赋值displayIdif (xCursorPosition==minX||xCursorPosition==maxX||yCursorPosition==minY||yCursorPosition==maxY{displayId=getPolicy()->notifyDisplayIdChanged();mDisplayId=displayId;}}}else{displayId = mPointerController->getDisplayId();}} else {pointerCoords.setAxisValue(AMOTION_EVENT_AXIS_X, deltaX);pointerCoords.setAxisValue(AMOTION_EVENT_AXIS_Y, deltaY);displayId = ADISPLAY_ID_NONE;}
}
1.2 鼠标进入不同屏,默认居中显示
- frameworks/base/libs/input/PointerController.cpp
void PointerController::setDisplayViewport(const DisplayViewport& viewport) {...// Reset cursor position to center if size or display changed.if (oldViewport.displayId != viewport.displayId|| oldDisplayWidth != newDisplayWidth|| oldDisplayHeight != newDisplayHeight) {float minX, minY, maxX, maxY;if (getBoundsLocked(&minX, &minY, &maxX, &maxY)) {mLocked.pointerX = (minX + maxX) * 0.5f;mLocked.pointerY = (minY + maxY) * 0.5f;// Reload icon resources for density may be changed.loadResourcesLocked();} else {mLocked.pointerX = 0;mLocked.pointerY = 0;}fadeOutAndReleaseAllSpotsLocked();} else if (oldViewport.orientation != viewport.orientation) {
}
2.修改鼠标进入方式
hdmi接入状态
- /frameworks/base/services/core/java/com/android/server/WiredAccessoryManager.java
public Pair<Integer, Integer> parseState(ExtconInfo extconInfo, String status) {...if (status.contains("HDMI")){SystemProperties.set("hdmi.plugged", status.contains("HDMI=1") ? "1":"0");}
}
2.1 主屏在左,副屏在右边模式下修改鼠标进入方式
- frameworks/native/services/inputflinger/reader/mapper/CursorInputMapper.cpp
void CursorInputMapper::sync(nsecs_t when) {...if (mSource == AINPUT_SOURCE_MOUSE) {if (moved || scrolled || buttonsChanged) {mPointerController->setPresentation(PointerControllerInterface::PRESENTATION_POINTER);if (moved) {mPointerController->move(deltaX, deltaY);}if (buttonsChanged) {mPointerController->setButtonState(currentButtonState);}mPointerController->unfade(PointerControllerInterface::TRANSITION_IMMEDIATE);}mPointerController->getPosition(&xCursorPosition, &yCursorPosition);pointerCoords.setAxisValue(AMOTION_EVENT_AXIS_X, xCursorPosition);pointerCoords.setAxisValue(AMOTION_EVENT_AXIS_Y, yCursorPosition);pointerCoords.setAxisValue(AMOTION_EVENT_AXIS_RELATIVE_X, deltaX);pointerCoords.setAxisValue(AMOTION_EVENT_AXIS_RELATIVE_Y, deltaY);char mMousePresentation[PROPERTY_VALUE_MAX] = {0};property_get("sys.mouse.presentation", mMousePresentation, "0");if (strcmp(mMousePresentation, "1") == 0) {//displayId = mDisplayId;char mHdmiPlugged[PROPERTY_VALUE_MAX] = {0};property_get("hdmi.plugged", mHdmiPlugged, "0");if (strcmp(mHdmiPlugged, "1") == 0){displayId = mDisplayId;} else {// 鼠标在副屏时,拔掉hdmi导致鼠标没有功能,强制id为主屏0displayId = 0;} float minX, minY, maxX, maxY;if (mPointerController->getBounds(&minX, &minY, &maxX, &maxY)){// 鼠标在主屏屏幕右边缘位置,重新赋值displayId,位置改变if (displayId == 0 && xCursorPosition==maxX) {displayId=getPolicy()->notifyDisplayIdChanged();mDisplayId=displayId;// 设置鼠标在副屏左侧显示if ((strcmp(mHdmiPlugged, "1") == 0)){mPointerController->setPosition(minX+10, yCursorPosition);}}// 鼠标在副屏屏幕左边缘位置,重新赋值displayId,位置改变((主屏id默认为0,副屏id切换后递增))if (displayId != 0 && xCursorPosition==minX){displayId=getPolicy()->notifyDisplayIdChanged();mDisplayId=displayId;// 设置鼠标在主屏右侧显示mPointerController->setPosition(maxX-10, yCursorPosition);}} }else{displayId = mPointerController->getDisplayId();}} else {pointerCoords.setAxisValue(AMOTION_EVENT_AXIS_X, deltaX);pointerCoords.setAxisValue(AMOTION_EVENT_AXIS_Y, deltaY);displayId = ADISPLAY_ID_NONE;}
}
相关文章:
RK 11.0 多屏模式下修改鼠标进入方式
要求:主屏在左,副屏在右。这种排列情况下鼠标仅可通过主屏的最右侧移入副屏的最左侧,或从副屏的最左侧移入主屏最右侧。 1.RK默认设计 1.1 RK的代码设计是当sys.mouse.presentation1时,鼠标在屏幕边缘的时候就会移入另一个屏幕 …...

【收录 Hello 算法】10.4 哈希优化策略
目录 10.4 哈希优化策略 10.4.1 线性查找:以时间换空间 10.4.2 哈希查找:以空间换时间 10.4 哈希优化策略 在算法题中,我们常通过将线性查找替换为哈希查找来降低算法的时间复杂度。我们借助一个算法题来加深理解。 Question 给…...
浅析部署架构中的GZone、RZone和CZone
在现代软件开发中,理解和应用各种技术概念是成功的重要因素。本文将详细介绍GZone、RZone和CZone三个概念,解释它们的定义、特点、功能及应用场景,并通过实际案例帮助读者更好地理解这些概念。 一、GZone 1.1 定义 GZone是指“Global Zone…...

【全开源】分类记账小程序系统源码(ThinkPHP+FastAdmin+UniApp)
基于ThinkPHPFastAdminUniAppvk-uView-uiVue3.0开发的一款支持多人协作的记账本小程序,可用于家庭,团队,组织以及个人的日常收支情况记录,支持周月年度统计。 :智能管理您的财务生活 一、引言:财务智能化…...
Android NDK系列(四)NDK的编译
Native工程一般会用到NDK,一般开发者使用的NDK是官方提供的,直接下载即可使用。在工作过程中一般很少要定义NDK,不过对于想了解NDK是怎么生成的,可以继续往下阅读。 Google提供了编译NDK的说明文档,地址为NDK编译&…...

Jenkins--从入门到入土
Jenkins–从入门到入土 文章目录 Jenkins--从入门到入土〇、概念提要--什么是CI/DI?1、CI(Continuous Integration,持续集成)2、DI(DevOps Integration,DevOps 集成)3、解决的问题 一、Jenkins安…...

文心一言 VS 讯飞星火 VS chatgpt (267)-- 算法导论20.2 2题
二、写出 PROTO-vEB-DELETE 的伪代码。通过扫描簇内的相关位,来更新相应的 summary 位。并且你实现的伪代码的最坏情况运行时间是多少?如果要写代码,请用go语言。 文心一言: 首先,让我们回顾一下vEB(Van …...
C 语言设计模式(结构型)
文章目录 代理模式场景示例 门面模式场景示例 桥接模式场景示例 适配器模式场景示例 外观模式场景示例 享元模式场景示例 装饰器模式场景示例 组合模式场景示例 代理模式 C语言中,代理模式通常用于实现对象的间接访问。代理模式是一种结构型设计模式,它…...

【云原生--K8S】K8S python接口研究
文章目录 前言一、搭建ubuntu运行环境1.运行ubuntu容器2.拷贝kubeconfig文件二、python程序获取k8s信息1.获取node信息2.获取svc信息3.常用kubernetes API总结前言 在前面的文章中我们都是通过kubectl命令行来访问操作K8S,但是在实际应用中可能需要提供更方便操作的图形化界面…...
5.26作业
服务器 2 3 #define BUFSIZE 10244 #define login_msg_len 205 6 typedef struct Node{7 char name[login_msg_len];8 struct sockaddr_in addr;9 struct Node *next;10 }Node;11 12 typedef struct Msgtype{13 char type;14 char username[login_msg_len]…...
链接库文件体积优化工具篇:bloaty
笔者之前参与过一个嵌入式智能手表项目,曾经碰到过这样一个问题:手表的flash大小只有2M,这意味着只能在上面烧录2M大小的代码。随着开发不断进行,代码越写越多,编译出来的bin也越来越大。最后bin大小超过了2M, 就没法烧…...

使用pyqt绘制一个爱心!
使用pyqt绘制一个爱心! 介绍效果代码 介绍 使用pyqt绘制一个爱心! 效果 代码 import sys from PyQt5.QtWidgets import QApplication, QMainWindow, QWidget from PyQt5.QtGui import QPainter, QPen, QBrush, QColor from PyQt5.QtCore import Qt, Q…...
关于 Transformer 的11个常见面试题
Transformer 是如何工作的? Transformer 是一种深度学习算法,特别适用于自然语言处理(NLP)任务,如语言翻译、语言生成和语言理解。它们能够处理长度可变的输入序列并捕捉长距离依赖关系,使其在理解和处理自…...
OS多核多线程锁记录笔记
自旋锁作用 自旋锁的是为了保护两个核上的公共资源,也就是全局变量,只有在一方也就是一个核抢到了自选锁,才能对公共资源进行操作修改,当然还有其他形似的锁如互斥锁,这里不比较两者的区别,以前没有深入的去…...
nginx做TCP代理
要实现TCP代理,可以使用Nginx的stream模块。stream模块允许Nginx作为一个转发代理来处理TCP流量,包括TCP代理、负载均衡和SSL终止等功能。 以下是配置Nginx实现TCP代理的基本步骤: 在Nginx配置文件中添加stream块,并在该块中配置…...
python 异常处理 try
异常 我们常见的代码错误后 会出现此类异常 SyntaxError:语法错误 AttributeError:属性错误 IndexError:索引错误 TypeError:类型错误 NameError:变量名不存在错误 KeyError:映射中不存在的关键字…...
月入10万+管道收益,揭秘旅游卡运营的5个阶段!
网上的项目众多,只要用心,便能发现不少商机。在互联网上运营,关键在于理解项目的底层逻辑。今天,我们来揭秘旅游卡项目,如何做到月入10万。 1、先赚成本 开始项目时,首要任务是回本。不要急于求成&#x…...

android_binder源码分析之_binder驱动使用服务
一,binder驱动源码分析,使用服务过程 uint32_t svcmgr_lookup(struct binder_state *bs, uint32_t target, const char *name) {uint32_t handle;unsigned iodata[512/4];struct binder_io msg, reply;bio_init(&msg, iodata, sizeof(iodata), 4);b…...
【波点音乐看广告】
import uiautomator2 as u2 import time from datetime import datetime import xml.etree.ElementTree as ET import re import os 连接设备 d u2.connect() os.system(‘adb shell chmod 775 /data/local/tmp/atx-agent’) os.system(‘adb shell /data/local/tmp/atx-age…...

[SWPUCTF 2021 新生赛]pop
常见的魔术方法 魔术方法__construct() 类的构造函数,在对象实例化时调用 __destruct() 类的析构函数,在对象被销毁时被调用 __call() 在对象中调用一个不可访问的对象时被调用,比如一个对象被调用时,里面没有程序想调用的属性 …...

智慧医疗能源事业线深度画像分析(上)
引言 医疗行业作为现代社会的关键基础设施,其能源消耗与环境影响正日益受到关注。随着全球"双碳"目标的推进和可持续发展理念的深入,智慧医疗能源事业线应运而生,致力于通过创新技术与管理方案,重构医疗领域的能源使用模式。这一事业线融合了能源管理、可持续发…...
模型参数、模型存储精度、参数与显存
模型参数量衡量单位 M:百万(Million) B:十亿(Billion) 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的,但是一个参数所表示多少字节不一定,需要看这个参数以什么…...

Python:操作 Excel 折叠
💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 Python 操作 Excel 系列 读取单元格数据按行写入设置行高和列宽自动调整行高和列宽水平…...

前端导出带有合并单元格的列表
// 导出async function exportExcel(fileName "共识调整.xlsx") {// 所有数据const exportData await getAllMainData();// 表头内容let fitstTitleList [];const secondTitleList [];allColumns.value.forEach(column > {if (!column.children) {fitstTitleL…...
ffmpeg(四):滤镜命令
FFmpeg 的滤镜命令是用于音视频处理中的强大工具,可以完成剪裁、缩放、加水印、调色、合成、旋转、模糊、叠加字幕等复杂的操作。其核心语法格式一般如下: ffmpeg -i input.mp4 -vf "滤镜参数" output.mp4或者带音频滤镜: ffmpeg…...
Python爬虫(二):爬虫完整流程
爬虫完整流程详解(7大核心步骤实战技巧) 一、爬虫完整工作流程 以下是爬虫开发的完整流程,我将结合具体技术点和实战经验展开说明: 1. 目标分析与前期准备 网站技术分析: 使用浏览器开发者工具(F12&…...
土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等
🔍 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术,可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势,还能有效评价重大生态工程…...

基于Springboot+Vue的办公管理系统
角色: 管理员、员工 技术: 后端: SpringBoot, Vue2, MySQL, Mybatis-Plus 前端: Vue2, Element-UI, Axios, Echarts, Vue-Router 核心功能: 该办公管理系统是一个综合性的企业内部管理平台,旨在提升企业运营效率和员工管理水…...
比较数据迁移后MySQL数据库和OceanBase数据仓库中的表
设计一个MySQL数据库和OceanBase数据仓库的表数据比较的详细程序流程,两张表是相同的结构,都有整型主键id字段,需要每次从数据库分批取得2000条数据,用于比较,比较操作的同时可以再取2000条数据,等上一次比较完成之后,开始比较,直到比较完所有的数据。比较操作需要比较…...

群晖NAS如何在虚拟机创建飞牛NAS
套件中心下载安装Virtual Machine Manager 创建虚拟机 配置虚拟机 飞牛官网下载 https://iso.liveupdate.fnnas.com/x86_64/trim/fnos-0.9.2-863.iso 群晖NAS如何在虚拟机创建飞牛NAS - 个人信息分享...