weston 窗口管理 (1)

news2025/1/16 13:55:52

窗口管理 (1)

一、概述

在传统嵌入式场景下,通常只会运行一个UI程序,故相当于单窗口程序,无需桌面服务器的介入;在桌面系统下,对于每一个UI程序而言,它们的行为相比于嵌入式场景仍然没有发生改变,其对接的仍然是窗口,只不过在同一个时刻允许多个UI程序同时运行.

无论如何对于UI程序,它们需要的仅仅是一个窗口,亦或者说是一块用于渲染的画布;UI程序并不关心渲染的程序最终是否呈现在了屏幕上,对于它们而言,将UI程序正确地渲染到画布上,即完成了它们的使命.

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-scurY99R-1673008813815)(…/…/image/shell/window_concept.png)]

在传统嵌入场景下, window 可能直接对接到真正意义上的物理屏幕,在 linux 上可能就是 KMS 架构中的 drm,而在桌面系统场景下,window大多先是对接到display server,然后由display server对接至KMS;从这里可以知道UI程序对接的是window,进一步说是一块内存或者显存而非真正的物理设备;但是从UI程序设计者而言,window对其而言又像是一块完整屏幕.

实际上 weston 并非只能对接 drm, 比如对接 rdp 实现远程桌面登录,对接 EGL 接入 OpenGL 的体系等等.

在桌面系统环境下,同一时间可能存在多个UI程序,意味着显示服务器需要同时管理多个窗口,而大多数情况下是只有一个输出设备的;那么对于显示服务器而言,就需要把多个窗口进行合成,将其按照一定的规则排列组合,组合成一张跟屏幕尺寸相等的画布.

二、适读人群

本文结构大体上分为两个部分,第一部分从用户的角度描述 weston 有关于此的实现,第二部分而从开发者的角度,描述 weston 有关于此部分的具体主体实现,帮助读者理解 weston 有关于窗口管理部分的业务逻辑.

本文基于 weston 分支 10.0.2 进行描述, ubuntu 或 deepin 下可以通过 sudo apt install weston 安装 weston, 并通过终端启动 weston.

三、分层设计

weston 里,窗口是通过分层进行管理的,并且 window 在这里可以简单的理解为 view 视图的概念.

请添加图片描述

不同的 layer 具有不同的优先级,而同一 layer 的不同 view 则根据前后顺序确认优先级.

weston 中, layer 大致上分为 (优先级自上而下):

  • WESTON_LAYER_POSITION_FADE : 渐变层,实现窗口切换过渡特效
  • WESTON_LAYER_POSITION_CURSOR : 鼠标层
  • WESTON_LAYER_POSITION_LOCK : 锁屏层
  • WESTON_LAYER_POSITION_TOP_UI : 输入法层 (比如说中文输入法)
  • WESTON_LAYER_POSITION_FULLSCREEN : 全屏层
  • WESTON_LAYER_POSITION_UI : 系统桌面层
  • WESTON_LAYER_POSITION_NORMAL : 应用层
  • WESTON_LAYER_POSITION_BOTTOM_UI : 未使用
  • WESTON_LAYER_POSITION_BACKGROUND : 背景层

(1) 实例描述

在讲解上面这些抽象的概念之前,先用一些实例来描述一下这些层级的使用.

在刚刚启动 weston 点击左上角的终端符号,应该可以看到:

请添加图片描述

而在长时间未操作后,应该会进入锁屏状态:

请添加图片描述

(2) 分层设计的原因

weston 的分层设计其实更多的是从业务的角度去进行考虑的,实际上 compositor 最后时并没有 view 这个概念, layerview 本质上就是一个二维链表的概念,最后面会将这个二维链表转化为只包含 view 的一维链表,按照 layer 的优先级顺序.

请添加图片描述

对于正常的UI程序,实际上只能接触到三个不同的 layer:

  • WESTON_LAYER_POSITION_FULLSCREEN
  • WESTON_LAYER_POSITION_NORMAL
  • WESTON_LAYER_POSITION_MINIMIZE (虚拟图层)

而对于操作系统而言,则可以操作到诸如 WESTON_LAYER_POSITION_UIWESTON_LAYER_POSITION_CURSORWESTON_LAYER_POSITION_BACKGROUND; 相对于UI程序而言,系统所控制的图层所包含的 view 是相当稳定的,例如 WESTON_LAYER_POSITION_NORMAL 图层通常情况下就只有一个任务栏的 view.

所以总体来说,不同图层的所有者大致可以分为应用系统两者;如果在未考虑当前 weston 分层设计的情况下,可能有人会将这个layer的设计修改为系统图层和应用图层两个图层进行管理,实际上添加部分逻辑处理之后这样做确实也是可以的.

layer 这种设计方案一种可能性是在于虽然可以分为系统图层以及应用图层,但是系统图层并不一定全部都在应用图层之下.

请添加图片描述

可以看到系统所控制的 layer 部分在应用之上,部分在应用之下,以及 (DESKTOP) UI 在夹在 NORMAL 图层以及 FULLSCREEN 图层之间;甚至于 TOP_UI 还能同时被系统以及应用同时控制 (系统可能是提供软键盘,而应用则是特殊程序如输入法).

另外一个用layer进行设计的好处就是在于容易控制权限,例如 NORMAL 下图层可以旋转、移动、缩放,但是 FULLSCREEN 下这些行为则是禁止的.

四、分层案例描述

(1) 工作空间

weston 提供工作空间的概念,类似于 window 下的多桌面概念, 默认下 deepin 安装的 weston 是无配置启动的,默认工作空间为 1,要想测试多工作空间,则需要创建 weston.ini,并运行 weston -c weston.ini, weston.ini 的配置如下:

# file : weston.ini
[shell]
num-workspaces=6

然后实际运行效果如下:

请添加图片描述

快捷键为 WIN(SUPER) + Fx,默认情况下.

这个实际上的实现就是不断地切换 WESTON_LAYER_POSITION_NORMAL layer 实现的,具体视图如下:

请添加图片描述

(2) 权限差异

不同图层带来了不同的权限,以 NORMAL 图层进行最大化和取消最大化, FULLSCREEN 图层全屏和取消全屏进行演示:

请添加图片描述

最大化快捷键为 WIN + SHIFT + M,全屏快捷键为 WIN + SHIFT + F.

它们反映的一方面是 FULLSCREEN 图层的优先级高于 (DESKTOP) UI,所以可以遮挡住任务栏;另一个方面则是可活动范围,NORMAL图层的活动范围是整个屏幕去除(DESKTOP) UI的部分.

以上即是面向用户的所有描述,之后的章节将结合weston的实际代码逻辑讲解部分实例.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/145175.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Git的标签:tag

目录 1. 查看标签 1.1 简单查看 1.2 匹配筛选标签 2. 创建标签 2.1 附注标签 2.2 轻量标签 2.3 代码提交之后打标签 2.4 提交标签 3. 删除标签 4. 检出标签 Git 可以给仓库历史中的某一个提交打上标签,以示重要。 比较有代表性的是人们会使用这个功能来标记…

thrift OOM 内存溢出

最近经常发生thrift服务半夜宕机的问题,虽然是测试环境,但是每天早上重启也很恶心。 经过很长时间的摸索,终于找到了原因。先说背景: 我们用的thrift版本是0.9.2,用做service的rpc框架,某一天开始&#x…

安全狗云原生安全产品入选《2022网络安全技术应用试点示范项目名单》

近日,工信部正式发布《2022网络安全技术应用试点示范项目名单》。作为国内云原生安全领导厂商,安全狗也凭借突出的产品能力,入选名单。 据悉,此次评选需层层通过单位申报、部门初审和推荐、专家评审、网上公示等多个环节。安全狗…

玉湖冷链黄铮洪出任广东省物流标准化技术委员会副主任

1月5日,广东省物流标准化技术委员会(第三届)成立大会召开,玉湖冷链执行董事黄铮洪出任副主任委员。 大会现场 根据2022年9月广东省市场监督管理局发布的通告,决定成立第三届广东省物流标准化技术委员会(以下简称「标准化委员会」)。此次大会进…

七、k8s Service详解

文章目录1 Service介绍1.1 userspace 模式1.2 iptables 模式1.3 ipvs 模式2 Service类型3 Service使用3.1 实验环境准备3.2 ClusterIP类型的Service3.3 Endpoint3.4 HeadLiness类型的Service3.5 NodePort类型的Service3.6 LoadBalancer类型的Service3.7 ExternalName类型的Serv…

树莓派3B摄像头的详细使用教程(拍照+录像+监控)

树莓派4B摄像头的详细使用教程(拍照录像监控) 本篇博文将介绍树莓派摄像头是如何在树莓派开发板上从安装到使用的,博主过程中参考了许多帖子,现将整理的比较全面的过程分享出来,供大家参考使用。 排线连接 硬件连接时…

【阶段二】Python数据分析数据可视化工具使用02篇:条形图与雷达图

本篇的思维导图: 条形图 条形图与柱形图类似,几乎可以表达相同多的数据信息。条形图的柱形变为横向,从而导致与柱形图相比,条形图更加强调项目之间的大小对比。尤其在项目名称较长以及数量较多时,采用条形图可视化数据会更加美观、清晰。 代码 # 导入需要的包imp…

java学习day70(乐友商城)授权中心

1.无状态登录原理 1.1.什么是有状态? 有状态服务,即服务端需要记录每次会话的客户端信息,从而识别客户端身份,根据用户身份进行请求的处理,典型的设计如tomcat中的session。 例如登录:用户登录后&#x…

cubeIDE开发, stm32的C库应用分析

一、stm32的C库 cubeIDE针对STM32芯片开发,提供个了两大库,HLA库和C库(集成GNU Tools for STM32工具链时提供,该工具链同样是意法半导体提供,可在http:// www.st.com单独下载),前者帮助开发这简…

P1055 [NOIP2008 普及组] ISBN 号码————C++

文章目录题目[\[NOIP2008 普及组\] ISBN 号码](https://www.luogu.com.cn/problem/P1055)题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1样例 #2样例输入 #2样例输出 #2提示解题思路1Code运行结果解题思路2Code运行结果题目 [NOIP2008 普及组] ISBN 号码 题目描述 …

windows 安装jenkins运行发布vue项目到linux服务器

文章目录背景安装jenkins安装插件安装nodej插件Publish over SSH系统配置Publish over SSH全局工具配置设置node构建项目创建一个freestyle的项目Discard old buildsgit命令报错Host key verification failedBuild背景 由于服务器上运行jenkins很卡,所以对于小公司…

windows安装jenkins运行发布java springboot项目到linux服务器

文章目录背景安装jenkins安装插件安装maven插件Publish over SSH系统配置Global propertiesPublish over SSH全局工具配置设置jdk设置maven设置git构建java maven项目freestyle 或者maven都可以Discard old buildsgit命令报错Host key verification failed每次构建前清理构建环…

可观测性之Log4j2优雅日志打印

可观测性之Log4j2优雅日志打印# 简介 对于Log4j2大家应该都不是很陌生,听说最多的应该是2021年年底出现的安全漏洞了,不过最让大家头痛的应该不仅仅是这个安全漏洞的处理,安全漏洞通过升级最新的依赖版本即可快速解决,平时在使用…

基于Java+SpringMvc+vue+element实现上海汽车博物馆平台

基于JavaSpringMvcvueelement实现上海汽车博物馆平台 博主介绍:5年java开发经验,专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 超级帅帅吴 Java毕设项目精品实战案例《500套》 欢迎点赞 收藏 ⭐留言 文末获取源…

C语言.表白神器.爱你之心之闪耀

前言 爱你之心之闪耀,这个名字比较沙雕哈哈哈。。。 爱你之心之闪耀前言爱心函数的选取爱心函数1爱心函数2简单爱心粒子发射原理爱心结构一些宏初始化init创建若干爱心并初始化setHeart展示爱心showHeart爱心变大modifyHeart设置音乐主函数Love.hLove.cpp祝有情人&a…

【有营养的算法笔记】一文轻松学会高精度算法(加减乘除)

👑作者主页:进击的安度因 🏠学习社区:进击的安度因(个人社区) 📖专栏链接:有营养的算法笔记 文章目录一、前言二、高精度加法1、思想及模板2、代码实现三、高精度减法1、思路及模板2…

电脑一键重装系统卡在正在准备就绪怎么办

最近有些用户想要给电脑换新的系统使用,选择一键重装工具重装,但结果卡住了,小白一键重装系统卡在正在准备就绪怎么办?下面小编就教下大家小白一键重装系统卡在正在准备就绪怎么办的解决办法。 工具/原料: 系统版本:…

七 近代史案例欣赏

首先打开我们的编译器,EgretWing,新建一个Egret项目。 新建好后如下图: 主要文件夹介绍 libs:包类文件夹 resource:资源文件夹 src:编写代码文件夹 template:前端文件夹 代码编写 1 打开src中Main.ts文件找到crea…

Scala中的协变点、逆变点、不变点如何确定?

阅读《scala编程》时,我们知道了类的类型参数是可以型变(variance)的。型变包含以下三种: 协变(convariant):如果S是T的子类型,则C1[S]也是C1[T]的子类型,则称C1在类型参…

leetcode 208. 实现 Trie (前缀树)【字典树(前缀树)的介绍与思路整理】

题目 Trie(发音类似 “try”)或者说 前缀树 是一种树形数据结构,用于高效地存储和检索字符串数据集中的键。这一数据结构有相当多的应用情景,例如自动补完和拼写检查。 请你实现 Trie 类: Trie() 初始化前缀树对象。…