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;}
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/15188.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/15188.shtml
英文地址,請注明出處:http://en.pswp.cn/web/15188.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

CISP-PTE筆記整理

目錄 漏洞基礎代碼合集 網安基礎 常見名詞 信息收集 環境和變量的配置 HTTP請求頭基礎 HTTP基礎知識 MySql基礎語法 各系統的敏感目錄路徑 工具使用 Hackbar的tips java下載配置 Xray下載配置&使用 burp爆破賬號密碼和C段&注意事項 SqlMap爆破&創建…

Unity Miscellaneous入門

概述 在Unity中有非常多好用的組件&#xff0c;也是Unity為我們提供的方便的開發工具&#xff0c;它的功能可能不是主流的內容&#xff0c;比如渲染&#xff0c;音樂&#xff0c;視頻等等&#xff0c;所有Unity把這些內容統一歸到了一個雜項文件組中。 Unity組件入門篇總目錄-…

Python線程

Python線程 1. 進程和線程 先來了解下進程和線程。 類比&#xff1a; 一個工廠&#xff0c;至少有一個車間&#xff0c;一個車間中至少有一個工人&#xff0c;最終是工人在工作。 一個程序&#xff0c;至少有一個進程&#xff0c;一個進程中至少有一個線程&#xff0c;最終…

langchain實戰-從0到1搭建ai聊天機器人

介紹 當前&#xff0c;人工智能大模型公司如雨后春筍般迅速涌現&#xff0c;例如 OpenAI、文心一言、通義千問等&#xff0c;它們提供了成熟的 API 調用服務。然而&#xff0c;隨之而來的是不同公司的繁瑣協議接入過程&#xff0c;這讓許多開發者感到頭疼不已。有沒有一種統一…

SpringBoot + Redis實現對接口的限流

目錄 前言 什么是限流&#xff1f; 實現限流 創建一個注解類 接著創建一個切面類 前言 在項目中&#xff0c;對于接口的限流&#xff0c;是任何項目都必不可少的一部分&#xff0c;主要是為了防止用戶頻繁的發送請求&#xff0c;對服務器造成壓力。 另外一點就是防止外來攻…

C++之第八課

課程列表 今天我們來學一學C里的一些實用的東西。 1.域寬 說到域寬setw&#xff0c;就叒要加頭文件了。 #include<iomanip> 使用格式是&#xff1a; cout<<setw(5)<<"123"; setw括號里面可以改數字&#xff0c;后面就是輸出內容了&#xff…

COD論文筆記 Boundary-Guided Camouflaged Object Detection

動機 挑戰性任務&#xff1a;偽裝物體檢測&#xff08;COD&#xff09;是一個重要且具有挑戰性的任務&#xff0c;因為偽裝物體往往與背景高度相似&#xff0c;使得準確識別和分割非常困難。現有方法的不足&#xff1a;現有的深度學習方法難以有效識別偽裝物體的結構和細節&am…

MySQL索引、視圖練習

素材 1.學生表&#xff1a;Student (Sno, Sname, Ssex , Sage, Sdept) 學號&#xff0c;姓名&#xff0c;性別&#xff0c;年齡&#xff0c;所在系 Sno為主鍵 2.課程表&#xff1a;Course (Cno, Cname,) 課程號&#xff0c;課程名 Cno為主鍵 3.學生選課表&#xff1a;SC (Sno…

Home Credit - Credit Risk Model Stability

本篇是對Kaggle上Home Credit - Credit Risk Model Stability競賽中的開源代碼VotingClassifier Home Credit的解讀。原鏈接在VotingClassifier Home Credit (kaggle.com)。 %%writefile script.py import sys from pathlib import Path import subprocess import os import g…

人工智能的發展現狀,AI將如何改變IT行業,哪些職業將最先失業

文章目錄 一、人工智能的發展現狀1、技術進展與突破2、商業應用與市場3、挑戰與問題4、未來趨勢 二、AI將如何改變IT行業1、工作方式的轉變&#xff1a;2、未來發展的推動&#xff1a;3、用戶服務和體驗的提升&#xff1a;4、創新和轉型的推動&#xff1a;5、融入日常生活和工作…

淺談JMeter運行原理

淺談JMeter運行原理 JMeter架構基礎 JMeter基于Java平臺開發&#xff0c;運行于Java虛擬機&#xff08;JVM&#xff09;之上。這意味著它可以在任何支持JVM的操作系統上運行&#xff0c;包括Windows、Linux、macOS等。其核心架構設計圍繞著多線程執行機制&#xff0c;這使得它…

AI大模型探索之路-實戰篇6: Function Calling技術調研之詳細流程剖析

系列篇章&#x1f4a5; AI大模型探索之路-實戰篇4&#xff1a;DB-GPT數據應用開發框架調研實踐 AI大模型探索之路-實戰篇5&#xff1a; Open Interpreter開放代碼解釋器調研實踐 目錄 系列篇章&#x1f4a5;一、前言二、Function Calling詳細流程剖析1、創建OpenAI客戶端2、定…

PCL 法向量加權的RANSAC擬合分割平面

目錄 一、算法原理1、原理概述2、主要函數二、代碼實現三、結果展示四、相關鏈接本文由CSDN點云俠原創,原文鏈接。如果你不是在點云俠的博客中看到該文章,那么此處便是不要臉的爬蟲。 一、算法原理 1、原理概述

鴻蒙布局List簡介

鴻蒙布局List簡介 List--常見的布局容器List 創建方式創建方式一&#xff0c;通過Listitem創建方式二&#xff0c;通過ForEach和Listitem創建方式三&#xff0c;通過ListItemGroup List–常見的布局容器 List是在app開發中最常見的一種布局方式&#xff0c;例如通訊錄、新聞列…

Wpf 使用 Prism 實戰開發Day24

自定義詢問窗口 當需要關閉系統或進行刪除數據或進行其他操作的時候&#xff0c;需要詢問用戶是否要執行對應的操作。那么就需要一個彈窗來給用戶進行提示。 一.添加自定義詢問窗口視圖 (MsgView.xaml) 1.首先&#xff0c;添加一個自定義詢問窗口視圖 (MsgView.xaml) <Use…

域內攻擊 ----->約束非約束委派攻擊

在域中&#xff0c;除了我們常見的橫向移動以外&#xff0c;還有很多攻擊&#xff0c;像什么kerberoasting&#xff0c;委派攻擊&#xff0c;NTLMrelay啊...... 還有很多&#xff08;暫時只知道這些&#xff09; 以前在一篇公眾號看到的一個笑話也薈萃了網安的一些攻擊手法&am…

vscode終端運行pnpm,yarn不成功問題

vscode終端運行pnpm&#xff0c;yarn不成功問題 1.問題描述2.解決辦法 1.問題描述 全局安裝了pnpm后&#xff0c;cmd窗口執行pnpm -v可以查看版本信息&#xff0c;在項目目錄可以執行操作&#xff0c;但是在vscode中無法執行并報錯 2.解決辦法 以管理員身份運行vscode打開vscod…

《拯救大學生課設不掛科第二期之Windows11下安裝VC6.0(VC++6.0)與跑通Hello World C語言程序教程》【官方筆記】

背景與目標人群&#xff1a; 大學第一次學C語言的時候&#xff0c;大部分老師會選擇VC6這個編輯器。 但由于很多人是新手&#xff0c;第一次上大學學C語言。 老師要求VC6.0&#xff08;VC6.0&#xff09;寫C語言跑程序可能很多人還是第一次接觸電腦。 需要安裝VC6這個編輯器…