当前位置: 首页 > news >正文

Android14窗口管理自适应投屏分辨率

环境

console:/ # cat /proc/version
Linux version 6.1.57 (机密信息) (Android (10087095, +pgo, +bolt, +lto, -mlgo, based on r487747c) clang version 17.0.2 (https://android.googlesource.com/toolchain/llvm-project d9f89f4d16663d5012e5c09495f3b30ece3d2362), LLD 17.0.2) #22 SMP PREEMPT Mon Feb 24 09:56:40 UTC 2025
 

auto_wm.c

$ cat auto_wm.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
/*
   persist.panel.width=800
   persist.panel.height=480
   persist.panel.density=178

 */
struct panel {
        int width;
        int height;
        int density;
};

static int get_remote_panel_info(struct panel *info)
{
        int ret = -1;
        FILE *fp = NULL;
        char buf[64] = {0};

        if((fp = fopen("/mnt/vendor/qcache/display_config.txt", "r")) != NULL)
        {
                do
                {
                        fgets(buf, sizeof(buf), fp);

                        if(sscanf(buf, (char *)"persist.panel.width=%d", &info->width) != 1)
                                break;

                        fgets(buf, sizeof(buf), fp);
                        if(sscanf(buf, (char *)"persist.panel.height=%d", &info->height) != 1)
                                break;

                        fgets(buf, sizeof(buf), fp);
                        if(sscanf(buf, (char *)"persist.panel.density=%d", &info->density) != 1)
                                break;
                        ret = 0;
                }
                while(0);

                fclose(fp);
        }
        return ret;
}

static int get_local_panel_info(struct panel *info)
{
        int ret = -1;
        FILE *fp = NULL;

        if((fp = popen("wm size", "r")) != NULL)
        {
                if(fscanf(fp, (char *)"Physical size: %dx%d", &info->width, &info->height) == 2)
                        ret = 0;

                pclose(fp);
        }
        if(ret != -1)
        {
                if((fp = popen("wm density", "r")) != NULL)
                {
                        if(fscanf(fp, "Physical density: %d", &info->density) != 1)
                                ret = -1;
                }
                else
                {
                        ret = -1;
                }
                pclose(fp);
        }
        return ret;
}

static int get_override_panel_info(struct panel *info)
{
        int ret = -1;
        FILE *fp = NULL;
        char buf[64] = {0};

        if((fp = popen("wm size", "r")) != NULL)
        {
                fgets(buf, sizeof(buf), fp);
                if(fscanf(fp, (char *)"Override size: %dx%d", &info->width, &info->height) == 2)
                        ret = 0;

                pclose(fp);
        }

        if((fp = popen("wm density", "r")) != NULL)
        {
                fgets(buf, sizeof(buf), fp);
                if(fscanf(fp, "Override density: %d", &info->density) != 1)
                        ret = -1;
        }
        else
        {
                ret = -1;
        }
        pclose(fp);
        return ret;
}

int main(int argc, char *argv[])
{
        int ret = -1;
        struct panel panel_remote = {0};
        struct panel panel_local = {0};
        struct panel panel_override = {0};
        char buf[64] = {0};

        while(1)
        {
                ret = get_remote_panel_info(&panel_remote);
                ret |= get_local_panel_info(&panel_local);
                get_override_panel_info(&panel_override);

                printf("remote:%d,%d,%d\n", panel_remote.width, panel_remote.height, panel_remote.density);
                printf("local:%d,%d,%d\n", panel_local.width, panel_local.height, panel_local.density);
                printf("override:%d,%d,%d\n", panel_override.width, panel_override.height, panel_override.density);

                if(ret != 0)
                {
                        sleep(1);
                        continue;
                }

                if(((panel_remote.width == panel_local.width) || (panel_remote.width == panel_override.width))
                                && ((panel_remote.height == panel_local.height) || (panel_remote.height == panel_override.height))
                                && ((panel_remote.density == panel_local.density) || (panel_remote.density == panel_override.density)))
                {
                        printf("#### ok\n");
                        break;
                }
                /*
                   setprop persist.vendor.framebuffer.main 1920x720p30
                   setprop persist.vendor.framebuffer.aux 1920x720p30
                   setprop persist.vendor.resolution.main 1920x720p30
                   setprop persist.vendor.resolution.aux 1920x720p30
                   wm size 1920x720
                   wm density 160
                 */
                snprintf(buf, sizeof(buf), (char *)"setprop persist.vendor.framebuffer.main %dx%dp30", panel_remote.width, panel_remote.height);
                system(buf);
                snprintf(buf, sizeof(buf), (char *)"setprop persist.vendor.framebuffer.aux %dx%dp30", panel_remote.width, panel_remote.height);
                system(buf);
                snprintf(buf, sizeof(buf), (char *)"setprop persist.vendor.resolution.main %dx%dp30", panel_remote.width, panel_remote.height);
                system(buf);
                snprintf(buf, sizeof(buf), (char *)"setprop persist.vendor.resolution.aux %dx%dp30", panel_remote.width, panel_remote.height);
                system(buf);
                snprintf(buf, sizeof(buf), (char *)"wm size %dx%d", panel_remote.width, panel_remote.height);
                system(buf);
                snprintf(buf, sizeof(buf), (char *)"wm density %d", panel_remote.density);
                system(buf);
        }
}

 

<完> 

 

相关文章:

  • 如何在视频中提取关键帧?
  • MySQL undo log,redo log和bin log日志文件的生成时间点、层级归属、存储位置及生命周期详解
  • Apache DolphinScheduler系列1-单节点部署及测试报告
  • ASP.NET Core 8.0学习笔记(二十八)——EFCore反向工程
  • React + TypeScript 复杂布局开发实战
  • 存储引擎、索引、SQL优化(MySQL笔记第四期)
  • Dashboard-frps
  • 【Azure 架构师学习笔记】- Azure Databricks (12) -- Medallion Architecture简介
  • 算法-数据结构(图)-DFS深度优先遍历
  • Cesium@1.126.0,创建3D瓦片,修改样式
  • 微信小程序网络请求与API调用:实现数据交互
  • Part-DB部署
  • 探索浮点数在内存中的存储(附带快速计算补码转十进制)
  • 网易云音乐分布式KV存储实践与演进
  • 博客系统完整开发流程
  • 观成科技:海莲花“PerfSpyRAT”木马加密通信分析
  • RK3399 Android10双WiFi功能实现
  • ubuntu+aarch64+dbeaver安装【亲测,避坑】
  • low rank decomposition如何用于矩阵的分解
  • Jenkins protoc: command not found
  • 著名心血管病学专家李国庆教授逝世,享年63岁
  • 海昏侯博物馆展览上新,“西汉帝陵文化展”将持续展出3个月
  • 美国务卿鲁比奥抵达会场,将参加俄乌会谈
  • 讲座预告|以危机为视角解读全球治理
  • 中国青年报:为见义勇为者安排补考,体现了教育的本质目标
  • 证监会:2024年依法从严查办证券期货违法案件739件,作出处罚决定592件、同比增10%