0%

【Linux技术分享】X11学习(一)基本窗口的建立

X11学习(一)基本窗口的建立

http://mech.math.msu.su/~vvb/2course/Borisenko/CppProjects/GWindow/xintro.html.

简介

  1. X11是什么

    X提供了GUI一个在unix系统下基本框架,可以绘图,移动窗口,显示窗口,与鼠标键盘一系列的交互。当前X已经更新到第11版所以简称为X11协议。与其类似的可以参考Wayland

窗口的初始化

  1. XOpenDisplay

    func:Display *XOpenDisplay(char *display_name);

    作用:打开指定X的服务器,返回一个关于服务器的display结构体。参数传入为NULL则是本机环境,如果是局域网地址则可以通过:来隔开,hostname:number.screen_number

    例子:

    1
    2
    Display *display = XOpenDisplay(NULL); //本机环境
    XOpenDisplay("192.168.0.12:0"); //局域网
  2. XCreateSimpleWindow

    func: Window XCreateWindow(display, parent, x, y, width, height, border_width, depth, class, visual, valuemask, attributes)

    作用:创建一个简单窗口并返回一个窗口句柄

    例子:

    1
    Windows win = XCreateSimpleWindow(dpy, root, 0, 0, width, height, 0, 0, 0xFFFF7700);//窗口创建
  3. XSelectInput

    func: int XSelectInput(Display *display, Window w, long event_mask);

    作用: 选择窗口所需要监听的事件,第三个参数就是传入事件。否则X就不监听窗口的任何事件。

    例子:

    1
    XSelectInput(xfc->display, xfc->window, KeyPressMask);
  4. XMapWindow

    func: XMapWindow(Display *display, Window w);

    作用: 关联并映射子窗口让其能同步获取事件和显示。

    例子:

    1
    XMapWindow(xfc->display, xfc->window);      //关联窗口并显示

    窗口事件处理

  5. XNextEvent

    func: XNextEvent(Display *display, XEvent)

    作用: 从事件队列获取下一个事件,如果队列为空则刷新缓存直到获取下一个事件。

    例子:

    1
    2
    3
    XEvent event = {0}; //X的事件
    XNextEvent(xfc->display, &event);//拉取窗口事件
    printf("event:%d\n",event.type);

简单窗口的创建

main.c:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include <X11/Xlib.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(void) {
Display *d;
Window w;
XEvent e;
const char *msg = "Hello, World!";
int s;

d = XOpenDisplay(NULL);
if (d == NULL) {
fprintf(stderr, "Cannot open display\n");
exit(1);
}

s = DefaultScreen(d);
w = XCreateSimpleWindow(d, RootWindow(d, s), 10, 10, 100, 100, 1, 0, 0xFFFF7700);
XSelectInput(d, w, ExposureMask | KeyPressMask);
XMapWindow(d, w);

while (1) {
XNextEvent(d, &e);
if (e.type == Expose) {
XFillRectangle(d, w, DefaultGC(d, s), 20, 20, 10, 10);
XDrawString(d, w, DefaultGC(d, s), 10, 50, msg, strlen(msg));
}
if (e.type == KeyPress)
break;
}

XCloseDisplay(d);
return 0;
}