一、系统相关特性
1.认识系统
麒麟系统最初基于(GNU/Linux 发行版)研发。GNU/Linux(基于命令行的操作系统)本身没有图形界面,Linux图形界面是Linux下的应用程序实现的。图形界面并不是GNU/Linux的一部分,Windows95之后图形界面就在Windows系统内核中。以上是两种系统区别。
麒麟系统的桌面环境是UKUI,桌面库是X11
2.认识X11
X11(X Window System)是一种网格透明的窗口系统,X表示X协议,11是协议版本号。X 协议主要由 X server 和 X client 组成:
- X server(XFree86) 管理主机上与显示相关的硬件设置(如显卡、硬盘、鼠标等),它负责屏幕画面绘制与显示,以及将输入设置(如键盘、鼠标)的动作告知 X client。
- X client (即 X 应用程序) 则主要负责事件的处理(即程序的逻辑)。
X协议类似IP协议,X协议是由X应用程序和X服务器组成。eg:用显卡驱动程序去指挥显卡完成画图等操作。
X协议和XFree86(server端)关系:XFree86 实现了 X 服务器的功能。例如:协议指挥画图并显示,或者在Windows安装一个X服务器(XFree86)运行,这样在Linux上运行一个X应用,然后另一台Windows系统上显示。
X协议的Xlib(Client端)关系:Xlib方便开发 X Window 系统应用程序的库,封装了X协议内容,依赖于XFree86提供的服务。
二、窗口系统控制
需求背景
实现Unity在麒麟系统中发布应用程序并支持自定义窗口操作。
实现最大化、最小化
强调一点,Unity中通过libX11运行中创建出来的窗口是可以实现最大化等功能,我们针对是已有窗口(如Unity打包运行程序本身)
- 利用libX11中XMove、XResizeWindow、XsendEvent接口
- 进程调用终端更改窗口状态(fullscreen) ,windowID 支持16进制
wmctrl -i -r windowID -b add,fullscreen - 进程调用终端更改窗口状态(minimized_vert,minimized_vert)
wmctrl -i -r windowID -b add,minimized_vert,minimized_vert
注意
- SDL2和GTK3第三方库中最大化API会出现闪退
- libX11的直接控制最大化API不可用,并且XChangeProperty、XSendEvent等改变和发送状态事件接口,只会改变窗口状态,窗口表现没有更新。
- 通过XCreateWindow创建的窗口ID并不是wmctrl中应用窗口ID,以后者为主
实现隐藏标题栏
两种具体实现:
- libX11没办法实现复杂的标题栏隐藏功能
- 可以用第三方库Devilspie来实现,也是通过开启新进程读取指令的方式
echo '(if(matches (window_name) "SDLTest")(begin(undecorate)))' > hide_titlebar.ds devlispie hide_titlebar.ds
实现窗口拖拽
1.利用libX11 中XMoveWindow XResizeWindow XIconifyWindow XQueryPointer 等接口,获取鼠标坐标刷新窗口位置
void Update()
{
if (Input.GetMouseButton(0))
{
int x, y;
IntPtr windowIDStr = GetWindowIDByWmCtrl();
GetMousePosition(out x, out y);
MoveWindow(windowIDStr,x, y);
}
}
参考
链接: 认识x11
2万+

被折叠的 条评论
为什么被折叠?



