X11 入门

x11 作为gui显示的河床,温生不知多少gui的框架。

这个基础参考是 开源中国的文章 《X11 入门练习》的源码,我将表述转换了下。
源码在我放在gitee 项目中 src 目录下 simple_window.c 文件中。

  1. 引入 xlib 头文件

    #include<X11/Xlib.h>
    
  2. 链接 x server

        Display * dsp = XOpenDisplay(NULL);
    
        if (!dsp) {
            return 1;
        }
    
  3. 创建窗口

        Window win = XCreateSimpleWindow(dsp,
            DefaultRootWindow(dsp),
            50,dic 50, // origin
            200, 200, // size
            0, black, // border
            white); // backgd   
    
  4. 将内存窗口数据拷贝到显卡存储中

        XMapWindow(dsp, win);
    
  5. XSelectInput 设置消息监听类型, 这里设置为 StructureNotifyMask - 通知接收事件通知
    StructureNotifyMask 在 X.h 文件中 168行 定义,这里前后有相关的其他宏定义。

        long eventMask = StructureNotifyMask;
        XSelectInput(dsp, win, eventMask);
    
  6. 然后等待server的 map 完成的通知

        XEvent evt;
        do {
            XNextEvent(dsp, & evt); // calls XFlush()
        } while (evt.type != MapNotify);
    
  7. 由于画图需要很多参数,xlib 提供了 画图的一个结构体,很多参数都有默认值,不用每次作图都设置各种参数。

        GC gc = XCreateGC(dsp, win, 0, NULL );
        XSetForeground( dsp, gc, black );
    
  8. XDrawLine画一条 (x1, y1)到(x2, y2) 的直线。该样例中画一条 (10,10) 到 (190,190) 的直线。

        XDrawLine(dsp, win, gc, 10, 10, 190, 190);
    
  9. 通知接受设置鼠标事件

        eventMask = ButtonPressMask | ButtonReleaseMask;
        XSelectInput(dsp, win, eventMask); // override prev
    
  10. 接受鼠标事件消息

        do {
            XNextEvent(dsp, & evt); // calls XFlush()
        } while (evt.type != ButtonRelease);
    
  11. 释放窗口和关闭到x server 的链接

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

可以用这个例子来熟悉下我们界面显示的过程和一个窗口应用的底层建立过程。


想起那句朴实无华且枯燥,大致就是说的x11吧,哈哈。

猜你喜欢

转载自blog.csdn.net/u012939880/article/details/108167383