应该用不了多久,Wayland 就会取代 X Window System 在linux系统下的地位了。
尽管如此,稍微了解一点点X11编程的东西应该没有坏处。
客户端-服务器
大家都说X是 客户端-服务器 的架构。那么这一定是真的了,可是,这到底是什么意思呢?
- A client-server architecture is a general mechanism for handling a shared resource that several programs may want to access simultaneously. In the case of X, the shared resources are the drawing area and the input channel.
一个例子
![](http://hi.csdn.net/attachment/201105/17/0_1305645755JI1t.gif)
既然是X11编程,首先我们需要相应的头文件
#include<X11/Xlib.h>
int main()
{
前面提了X11是客户端-服务器架构,那么我们的程序(客户端)需要和服务器建立连接:
Display *dsp = XOpenDisplay(NULL);
if(!dsp) {
return 1;
}
建立连接后,就可以请求创建窗口了:
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
仅仅创建还不行,还需要map(想象成从内存拷贝到显存?)
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, NULL );
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;
}
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;
}
编译
编译就很简单了:
g++ hello.cpp -o hello -lX11
或正式一点
g++ hello.cpp -o hello `pkg-config --cflags --libs x11`
参考
分享到:
相关推荐
《Xorg-x11-xauth:CentOS中的X11转发关键工具》 在Linux世界中,图形界面的远程访问通常依赖于X11协议。然而,在进行SSH远程连接时,有时会出现连接缓慢或者提示“远程SSH服务器拒绝了X11转发请求”的问题。为了...
"Hello World"级别的代码通常是最基础的入门教程,用于演示编程语言或库的基本用法。 X11是X Window System的第11版,它提供了创建、管理和通信GUI元素的基本框架,如窗口、按钮、文本框等。X11不是一种编程语言,...
《深入解析x11vnc:从源码到应用》 x11vnc是一款流行的开源软件,用于在X Window System环境下实现远程桌面控制。它的核心功能是将本地的X11显示通过网络传输到远程客户端,使得用户可以随时随地访问和操作运行在另...
在Linux系统中,X11(也称为X Window System)是一种图形用户界面(GUI)协议,用于提供远程和本地的图形界面。它被广泛应用于各种Linux发行版,包括Ubuntu。在Ubuntu或ARM Linux设备上编译X11库是一项技术性较强的...
标题“gtk-x11-2.0”提及的是GTK+库的一个特定版本,它与X11窗口系统接口相结合。GTK+(GIMP Toolkit)是一个用于创建图形用户界面的开源工具包,广泛应用于Linux和Unix-like操作系统。在描述中提到的“opencv移植到...
超微 X11DPI-N主板用户手册
**X11服务器源码详解** X11,也称为X Window系统,是Unix和类Unix操作系统(包括Linux)上广泛使用的图形用户界面(GUI)系统。它定义了一个客户端-服务器模型,允许应用程序在本地或远程机器上显示图形窗口。X11...
在IT领域,X11是一种广泛使用的图形用户界面(GUI)协议,它是X Window系统的核心部分,主要用于构建和管理分布式操作系统环境中的图形界面。X11不仅提供了窗口管理的基础框架,还支持各种输入设备和输出设备间的...
超微X11SPL-F主板用户手册
超微 X11dai-n主板用户手册
在本文中,我们将深入探讨如何在Qt环境中结合X11和XCB(X Window System Core Protocol)技术,通过具体的例子来解析这些概念及其在实际应用中的作用。首先,让我们逐一了解这三个关键术语。 Qt是一个跨平台的应用...
KUKA X11 接線方式 主要針對庫卡機器人KRC4控制箱X11接腳說明,讓手臂可排除緊急停止狀態
在Linux系统中,尤其是基于X Window System(简称为X11)的桌面环境中,实现全局键鼠监控是一项常见的需求,例如用于开发系统监控工具、自动化脚本或游戏辅助程序等。X11提供了丰富的API接口,允许开发者监听并处理...
在C++编程环境中,利用FFmpeg库可以实现屏幕录制功能,而`x11grab`是FFmpeg中用于从X11窗口系统抓取视频流的模块,特别适用于在Linux环境下录制桌面操作。 首先,你需要确保已经正确地在你的系统上安装了FFmpeg库,...
LINUX egl X11 opengl代码 可以直接运行,包括makefile文件,可以参考编译
在IT领域,尤其是在图形用户界面(GUI)的开发中,X Window System(通常简称为X11或X)是一个至关重要的开源标准,它为操作系统提供了基础的窗口管理和图形支持。这个"X11下的图片解码程序"是专门针对X Window ...
库卡机器人 krc4 安全回路X11,短接方式,积累些积分啊。
《Xorg X11 Server Utilities 7.5详解》 在Linux世界中,图形用户界面(GUI)的实现离不开X Window系统,而Xorg X11则是其中最常见的一种实现方式。本文将深入探讨"Xorg-x11-server-utils-7.5.zip"这个压缩包所包含...
超微 X11DPG-QT主板用户手册
超微 X11DPL-I主板用户手册