【银河麒麟】桌面操作系统V10(SP1)_2403 窗口操作相关

一、系统相关特性

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 组成:

  1. X server(XFree86) 管理主机上与显示相关的硬件设置(如显卡、硬盘、鼠标等),它负责屏幕画面绘制与显示,以及将输入设置(如键盘、鼠标)的动作告知 X client。
  2. 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打包运行程序本身)

  1. 利用libX11中XMove、XResizeWindow、XsendEvent接口
  2. 进程调用终端更改窗口状态(fullscreen) ,windowID 支持16进制
    wmctrl -i -r windowID -b add,fullscreen
  3. 进程调用终端更改窗口状态(minimized_vert,minimized_vert)
    wmctrl -i -r windowID -b add,minimized_vert,minimized_vert

注意

  1. SDL2和GTK3第三方库中最大化API会出现闪退
  2. libX11的直接控制最大化API不可用,并且XChangeProperty、XSendEvent等改变和发送状态事件接口,只会改变窗口状态,窗口表现没有更新。
  3. 通过XCreateWindow创建的窗口ID并不是wmctrl中应用窗口ID,以后者为主

实现隐藏标题栏

两种具体实现:

  1. libX11没办法实现复杂的标题栏隐藏功能
  2. 可以用第三方库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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值