`
tomhibolu
  • 浏览: 1396097 次
文章分类
社区版块
存档分类
最新评论

X11 入门练习

 
阅读更多

应该用不了多久,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`

参考

分享到:
评论

相关推荐

    xorg-x11-xauth

    《Xorg-x11-xauth:CentOS中的X11转发关键工具》 在Linux世界中,图形界面的远程访问通常依赖于X11协议。然而,在进行SSH远程连接时,有时会出现连接缓慢或者提示“远程SSH服务器拒绝了X11转发请求”的问题。为了...

    代码样例:x11 demo

    "Hello World"级别的代码通常是最基础的入门教程,用于演示编程语言或库的基本用法。 X11是X Window System的第11版,它提供了创建、管理和通信GUI元素的基本框架,如窗口、按钮、文本框等。X11不是一种编程语言,...

    x11vnc-0.9.13.tar.gz

    《深入解析x11vnc:从源码到应用》 x11vnc是一款流行的开源软件,用于在X Window System环境下实现远程桌面控制。它的核心功能是将本地的X11显示通过网络传输到远程客户端,使得用户可以随时随地访问和操作运行在另...

    x11库如何编译到Ubuntu上或者交叉编译到arm linux上

    在Linux系统中,X11(也称为X Window System)是一种图形用户界面(GUI)协议,用于提供远程和本地的图形界面。它被广泛应用于各种Linux发行版,包括Ubuntu。在Ubuntu或ARM Linux设备上编译X11库是一项技术性较强的...

    gtk-x11-2.0

    标题“gtk-x11-2.0”提及的是GTK+库的一个特定版本,它与X11窗口系统接口相结合。GTK+(GIMP Toolkit)是一个用于创建图形用户界面的开源工具包,广泛应用于Linux和Unix-like操作系统。在描述中提到的“opencv移植到...

    超微 X11DPI-N主板用户手册

    超微 X11DPI-N主板用户手册

    x11 server 源码

    **X11服务器源码详解** X11,也称为X Window系统,是Unix和类Unix操作系统(包括Linux)上广泛使用的图形用户界面(GUI)系统。它定义了一个客户端-服务器模型,允许应用程序在本地或远程机器上显示图形窗口。X11...

    x11效果器调音软件.rar

    在IT领域,X11是一种广泛使用的图形用户界面(GUI)协议,它是X Window系统的核心部分,主要用于构建和管理分布式操作系统环境中的图形界面。X11不仅提供了窗口管理的基础框架,还支持各种输入设备和输出设备间的...

    超微X11SPL-F主板用户手册

    超微X11SPL-F主板用户手册

    超微 X11dai-n主板用户手册

    超微 X11dai-n主板用户手册

    Qt+x11+xcb的例子

    在本文中,我们将深入探讨如何在Qt环境中结合X11和XCB(X Window System Core Protocol)技术,通过具体的例子来解析这些概念及其在实际应用中的作用。首先,让我们逐一了解这三个关键术语。 Qt是一个跨平台的应用...

    KRC4_X11_接法.pdf

    KUKA X11 接線方式 主要針對庫卡機器人KRC4控制箱X11接腳說明,讓手臂可排除緊急停止狀態

    基于X11的Linux下的全局键鼠监控方法,只能获得键鼠动作,但是不能拦截,代码可直接运行

    在Linux系统中,尤其是基于X Window System(简称为X11)的桌面环境中,实现全局键鼠监控是一项常见的需求,例如用于开发系统监控工具、自动化脚本或游戏辅助程序等。X11提供了丰富的API接口,允许开发者监听并处理...

    ffmpeg录制视频(需要安装x11grab)--C++编程

    在C++编程环境中,利用FFmpeg库可以实现屏幕录制功能,而`x11grab`是FFmpeg中用于从X11窗口系统抓取视频流的模块,特别适用于在Linux环境下录制桌面操作。 首先,你需要确保已经正确地在你的系统上安装了FFmpeg库,...

    LINUX egl X11 opengl代码 可以直接运行

    LINUX egl X11 opengl代码 可以直接运行,包括makefile文件,可以参考编译

    x11下的图片解码程序

    在IT领域,尤其是在图形用户界面(GUI)的开发中,X Window System(通常简称为X11或X)是一个至关重要的开源标准,它为操作系统提供了基础的窗口管理和图形支持。这个"X11下的图片解码程序"是专门针对X Window ...

    X11-KRC4.pdf

    库卡机器人 krc4 安全回路X11,短接方式,积累些积分啊。

    xorg-x11-server-utils-7.5.zip

    《Xorg X11 Server Utilities 7.5详解》 在Linux世界中,图形用户界面(GUI)的实现离不开X Window系统,而Xorg X11则是其中最常见的一种实现方式。本文将深入探讨"Xorg-x11-server-utils-7.5.zip"这个压缩包所包含...

    超微 X11DPG-QT主板用户手册

    超微 X11DPG-QT主板用户手册

    超微 X11DPL-I主板用户手册

    超微 X11DPL-I主板用户手册

Global site tag (gtag.js) - Google Analytics