Skip to content

Xorg相关知识学习

详情见: (Xorg)[https://wiki.archlinuxcn.org/wiki/Xorg]

1、X.Org

X.Org增强显示及输入驱动得到增强,支持Linux、Solaris。

2、X-window

X-window于1984年在麻省理工学院MIT)电脑科学研究室开始开发的,当时Bob Scheifler正在发展分散式系统(distributed system),同一时间 DEC公司的 Jim Gettys 正在麻省理工学院做 Athena 计划的一部分。两个计划都需要一个相同的东西——一套在UNIX机器上运行优良的视窗系统。因此合作关系开始展开,他们从斯坦福Stanford)大学得到了一套叫做W的实验性视窗系统。因为是根据W视窗系统的基础开始发展的,当发展到了足以和原先系统有明显区别时,他们把这个新系统叫做X。

3、X11

X11也叫做X Window系统,X Window系统 (X11或X)是一种 位图 显示的 视窗系统 。它是在 Unix 和 类Unix 操作系统 ,以及 OpenVMS 上建立图形用户界面 的标准工具包和协议,并可用于几乎所有已有的现代操作系统

4、xorg

xorg是X11的一个实现,而X Window System是一个C/S结构的程序,Xorg只是提供了一个X Server,负责底层的操作当你运行一个程序的时候,这个程序会连接到X server上,由X server接收键盘鼠标输入和负责屏幕输出窗口的移动,窗口标题的样式等等。

5、xFace

xFace是开源的基于Web技术的移动应用开发平台,允许开发者使用HTMLCSSJavaScript技术开发智能移动终端的应用程序。平台提供跨平台的中间件引擎,支持在智能移动终端的系统(Android、iOS、WindowsPhone 等)上运行符合平台规范的HTML应用,具有程序代码一次开发、多平台运行的优点,减少开发及维护的工作量。降低移动应用的开发门槛,帮助Web开发者以较小的成本代价完成从传统互联网领域向移动互联网领域的迁移。

最新版本xFace3.0全面支持HTML5标准,应用开发更简单、更快速、用户体验更好,具有平台安全、JS调用性能优化、支持多应用并发及管理、支持在线应用与本地应用业务形态等优点。其具有的应用管理能力,为移动电子商务、企业级门户等大型行业应用提供了必要的运营支撑。中国银联手机支付基于xFace技术已服务过百万用户。

xFace的应用兼容性较好,支持第三方WEB开发库和组件。在设备本地能力API方面,与国际流行的PhoneGap兼容。因此,基于xFace开发的移动应用具有较强的兼容性。针对用户的特殊需求,尤其是行业用户的定制化需求,xFace提供了Plugin插件扩展机制。同时,xFace还提供一系列应用开发工具来进一步降低开发难度并加快开发速度,包括:模拟器、Debugger工具、开发指南文档、应用打包工具等。

6、xorg.conf

linux切换命令行界面:ctrl+alt+fn 终端:init 5 ==> alt+fn

x11窗口会拦截快捷键ctrl+alt+fn,就跟Windows虚拟机窗口会拦截ctrl+alt+delete。 需要配置文件开启 /etc/X11/xorg.conf DontVTSwitch 修改为 false。

Section "ServerFlags"
    Option "DontVTSwitch" "false"
EndSection

startx命令进入图形界面。 一般来说,一台Linux会有6个会话,每个会话都有图形界面和命令模式。 如何更改linux系统的启动模式(命令行和图形界面)]( https://blog.csdn.net/liguojunNO1/article/details/88693696 )

在命令行中输入 vi /etc/inittab
systemctl get-default,意为获取当前启动模式
systemctl set-default multi-user.target (后面改为命令启动的语句)

multi-user.target命令行模式
graphical.target图形模式

6-1、缺少xorg.conf文件

从Redhat 6.0和Ubuntu 9.0以后xorg.conf这个老古董文件突然不见了,让很多DIY爱好者不知所踪,但你man xorg.conf时却能得到xorg.conf的帮助信息,为什么呢?官方解释是:The reason for this is that the configuration to be done on userlevel. OK那么就是说这件事要用户自己去做,很多高手会说这个简单用Xorg -configure这个命令就可以生成,但事,可但是那是在TEXT界面,但大部分用户在Graphic界面,那么我们要怎么做呢?切控制台肯定是不可以的,所以我们使用init 3这个命令就可以在Graphic mode直接切到TEXT mode,用init 5就可以切回来.恩,那么就没有障碍了,写如下script:

init 3
sleep 3
Xorg -configure
sleep 3
mv xorg.conf.new /etc/X11/xorg.conf
sleep 1
init 5

Wayland的核心协议已经实现的差不多了,它充分利用了Linux内核的KMS、GEM、DRM等技术,另外,它默认是支持3D加速的,也就是通过OpenGL ES进行图形的合成——光是这一点,X Window又要泪奔了。

7、X11编码入门

#include<X11/Xlib.h>
#include<unistd.h>
...
    XDrawLine(dsp, win, gc, 10, 10,190,190);

    // Send the "DrawLine" request to the server
    XFlush(dsp);
    // Wait for 10 seconds
    sleep(10);

    XDestroyWindow(dsp, win);
    XCloseDisplay(dsp);

    return 0;
}
编译
编译就很简单了:

g++ hello.cpp -o hello -lX11
或正式一点

g++ hello.cpp -o hello `pkg-config --cflags --libs x11`

-o生产的文件就是执行文件??

执行文件时可以影响正在运行的文件。

8、xdotool工具

xdotool 是一个用于模拟键盘、鼠标和窗口操作的命令行工具和库。它可以用于自动化任务、编写脚本以及与其他应用程序进行交互。

以下是一些 xdotool 库的常见用法:

模拟按键和鼠标点击:使用 xdotool 可以模拟按下和释放键盘上的按键,以及模拟鼠标的点击和移动。例如,可以使用 xdotool key 命令模拟按下和释放特定的按键,或使用 xdotool click 命令模拟鼠标点击。

控制窗口:xdotool 可以用于控制窗口的打开、关闭、最小化、最大化等操作。例如,可以使用 xdotool windowactivate 命令激活特定的窗口,或使用 xdotool windowminimize 命令最小化窗口。

获取窗口信息:xdotool 可以获取当前活动窗口的信息,如窗口的标题、位置和大小等。可以使用 xdotool getwindowfocus 命令获取当前活动窗口的 ID,然后使用其他命令获取更多窗口信息。

自动化任务:通过编写脚本,可以使用 xdotool 自动化执行一系列操作。例如,可以编写一个脚本来打开特定的应用程序、输入文本、点击按钮等。

请注意,xdotool 是一个命令行工具和库,需要在终端中使用。你可以在终端中输入 man xdotool 查看更多关于 xdotool 的详细信息和用法示例。

xprop   # 界面选取窗口获取窗口详细信息
xdotool search --all .  # 返回所有窗口的ID列表
xdotool search --name "窗口名称"    # 获取窗口的名称和ID
xdotool windowmove 81788956 100 100 # 移动窗口

9、X11编程

/* study_x11.cpp
 *
 * 学习X11编程
 *
 * author: hankin
 * date  : 2021.06.02
 *
 * Copyright (c) 2021 HanKin. All rights reserved.
 */

#include<X11/Xlib.h>

int main(int argc, char *argv[])
{
	// 程序(客户端)和服务器建立连接
	Display *dsp = XOpenDisplay(nullptr);
    if (!dsp) {
		printf("XOpenDisplay failed!\n");
        return -1;
    }
	
	if (XShmQueryExtension (x_display) &&
        XShmQueryVersion (x_display, &major, &minor, &pixmaps)) {
        x_shm_avail = true;
    }
	
	
	// 请求创建窗口
	int screenNumber = DefaultScreen(dsp);
    unsigned long white = WhitePixel(dsp,screenNumber);
    unsigned long black = BlackPixel(dsp,screenNumber);

    Window win = XCreateSimpleWindow(dsp,
            DefaultRootWindow(dsp),
            50, 50,   // origin
            200, 200, // size
            0, black, // border
            white );  // backgd
	
	// 想象成从内存拷贝到显存
	XMapWindow( dsp, win );
	
	// 通讯是双向的,告诉server我们对哪些事件感兴趣
	long eventMask = StructureNotifyMask;
    XSelectInput(dsp, win, eventMask);
	
	// 等待server的 map 完成的通知
	XEvent evt;
    do {
        XNextEvent(dsp, &evt);   // calls XFlush()
    } while (evt.type != MapNotify);
	
	// 由于server记不住我们的每次绘图操作的设置,我们将设置保存在“Graphics Context”中
	GC gc = XCreateGC(dsp, win, 0, nullptr);
    XSetForeground(dsp, gc, black);
	
	// 画线
    XDrawLine(dsp, win, gc, 10, 10,190,190);
	
	// 告诉server,我们对鼠标按键感兴趣
	eventMask = ButtonPressMask | ButtonReleaseMask;
    XSelectInput(dsp, win, eventMask); // override prev
	
	// 等待鼠标释放的事件
	do {
        XNextEvent(dsp, &evt);   // calls XFlush()
    } while (evt.type != ButtonRelease);
	
	// 收到鼠标按键后:销毁窗口,断开连接,退出程序
	XDestroyWindow(dsp, win);
    XCloseDisplay(dsp);

    return 0;
}

10、XFlush()

前面有一点没说,当我们执行了 XCreateSimpleWindow、XMapWindow 等操作时,数据还缓存在客户端。我们要确保数据送到server,需要调用 XFlush()。这一点我们可以类似写文件操作或网络写socket操作。

可是例子中为什么没有调用XFlush()呢?这是由于XNextEvent()内部会调用XFlush(),所以我们省略了。

如果我们程序后面不是等待鼠标按键来退出,而是睡眠10秒钟再退出,那么就需要显式调用XFlush()了

#include<X11/Xlib.h>
#include<unistd.h>
...
    XDrawLine(dsp, win, gc, 10, 10,190,190);

    // Send the "DrawLine" request to the server
    XFlush(dsp);
    // Wait for 10 seconds
    sleep(10);

    XDestroyWindow(dsp, win);
    XCloseDisplay(dsp);

    return 0;
}

11、编译

编译就很简单了:

g++ hello.cpp -o hello -lX11
或正式一点

g++ hello.cpp -o hello `pkg-config --cflags --libs x11`

12、x11/extensions/XShm.h: No such file or directory

编译的时候增加lXext参数。

止步于此 https://www.dssz.com/305438.htmlhttps://wenku.baidu.com/view/a5af4fd8ad51f01dc281f1ce.htmlhttps://blog.csdn.net/arag2009/article/details/18408113

This website is released under the MIT License.