Реализация функциональности буфера обмена на X (* nix) с учетом XWindow *? - PullRequest
0 голосов
/ 26 ноября 2011

Я использую Allegro5 API для создания своего окна и управления им. Это позволяет мне получить доступ к XWindow, которое он создает с помощью XCreateWindow

У меня есть доступ к d-> окну, но это все. Исходя из этого, есть ли способ, которым я мог бы взаимодействовать с XEvents, отправленными в это окно? Я хочу реализовать функциональность буфера обмена. Я просто не уверен, как справляться с событиями XSelection.

1 Ответ

0 голосов
/ 27 ноября 2011

Вам необходимо создать цикл xevent и обработать определенные xevents . Здесь - это пример xlib hello world, и именно так вы можете это сделать.

Пример скопирован с здесь :

 #include<X11/Xlib.h>
 #include<stdio.h>
 #include<stdlib.h>

 int main()
 {
    Display *dpy;
    Window rootwin;
    Window win;
    Colormap cmap;
    XEvent e;
    int scr;
    GC gc;


    if(!(dpy=XOpenDisplay(NULL))) {
        fprintf(stderr, "ERROR: could not open display\n");
        exit(1);
    }

    scr = DefaultScreen(dpy);
    rootwin = RootWindow(dpy, scr);
    cmap = DefaultColormap(dpy, scr);


    win=XCreateSimpleWindow(dpy, rootwin, 1, 1, 100, 50, 0, 
            BlackPixel(dpy, scr), BlackPixel(dpy, scr));

    XStoreName(dpy, win, "hello");


    gc=XCreateGC(dpy, win, 0, NULL);
    XSetForeground(dpy, gc, WhitePixel(dpy, scr));

    XSelectInput(dpy, win, ExposureMask|ButtonPressMask);

    XMapWindow(dpy, win);

    while(1) {
        XNextEvent(dpy, &e);
        if(e.type==Expose && e.xexpose.count<1)
            XDrawString(dpy, win, gc, 10, 10, "Hello World!", 12);
        else if(e.type==ButtonPress) break;
    }

    XCloseDisplay(dpy);
 }

Для сборки создайте Makefile:

all: hello

hello: hello.o
    cc -o hello -Wall -L/usr/X11R6/lib -lX11 hello.o

hello.o: hello.c
    cc -o hello.o -Wall -I/usr/X11R6/include -c hello.c
...