应该用不了多久,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.
一个例子
既然是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`
参考
分享到:
相关推荐
centos 的x11转发工具,用于转发xshell连接请求,避免出现连接缓慢,连接警告 The remote SSH server rejected X11 forwarding request
KUKA X11 接線方式 主要針對庫卡機器人KRC4控制箱X11接腳說明,讓手臂可排除緊急停止狀態
x11、x11所依赖的库,以及x11如何编译到Ubuntu上或者交叉编译到arm linux上,文档中有详细的描述
库卡机器人 krc4 安全回路X11,短接方式,积累些积分啊。
x11vnc-0.9.13.tar.gz源码包
一些简单的x11 demo,都是Hello World级别的,没有什么特殊的地方
x11效果器调音软件
超微主板X11系列板载raid驱动for win2012
opencv移植到arm上时,缺少gtk-x11-2.0
自己基于fsl-imx-x11工具链编译的支持X11模式的vnc服务端应用,将此包解压至arm32平台的linux上,运行后,再PC端连接即可实现远程控制和显示
Qt+x11+xcb的例子, 详见http://blog.csdn.net/xgbing/article/details/79479380
基于X11的Linux下的全局键鼠监控方法,只能获得键鼠动作,但是不能拦截,代码可直接运行。 需要安装相关的X11的库,具体参见README.rd
因此,在这里只介绍安全信号通过X11接头的接线图。 X11的接线图根据控制柜型号不同,接线方式也不一样。 (1)KR C4 stand & KR C4 Midsize & KR C4 Extend 控制柜: 急停、安全门、安全光栅信号说明:建议接入...
xorg-x11-server-utils-7.5-13.el6.x86_64.rpm
X11 协议 protocol 源码包 服务包 linux
录制电脑屏幕操作,基于ffmpeg库使用C++程序开发的。电脑上需要安装x11grab。
三星X11拆机详细图解,保持为单个页面。实践证明,自己拆解清理是可行的!
PUTTY的能正确显示中文的配置,含X11转向设置
超微 X11DPI-N主板用户手册
超微服务器X11SL-F主板最新BIOS程序 2.1a,适合C232芯片组,提升稳定性与效率,配合纯DOS工具U盘升级,工具自行下载