No. Questo è il motivo per cui la maggior parte dei framework UI (Gtk, KDE, ecc.) Utilizzano loop principali personalizzati per poter ascoltare più sorgenti di eventi.
Internamente, XNextEvent utilizza un socket, quindi chiama select()
per sapere quando l'input è disponibile. Così puoi: Chiama ConnectionNumber(display)
per ottenere il descrittore di file che devi passare select()
Ciò consente di ascoltare diversi descrittori di file.
codice di esempio da http://www.linuxquestions.org/questions/showthread.php?p=2431345#post2431345
#include <stdio.h>
#include <stdlib.h>
#include <X11/Xlib.h>
#include <X11/Xutil.h>
Display *dis;
Window win;
int x11_fd;
fd_set in_fds;
struct timeval tv;
XEvent ev;
int main() {
dis = XOpenDisplay(NULL);
win = XCreateSimpleWindow(dis, RootWindow(dis, 0), 1, 1, 256, 256, \
0, BlackPixel (dis, 0), BlackPixel(dis, 0));
// You don't need all of these. Make the mask as you normally would.
XSelectInput(dis, win,
ExposureMask | KeyPressMask | KeyReleaseMask | PointerMotionMask |
ButtonPressMask | ButtonReleaseMask | StructureNotifyMask
);
XMapWindow(dis, win);
XFlush(dis);
// This returns the FD of the X11 display (or something like that)
x11_fd = ConnectionNumber(dis);
// Main loop
while(1) {
// Create a File Description Set containing x11_fd
FD_ZERO(&in_fds);
FD_SET(x11_fd, &in_fds);
// Set our timer. One second sounds good.
tv.tv_usec = 0;
tv.tv_sec = 1;
// Wait for X Event or a Timer
int num_ready_fds = select(x11_fd + 1, &in_fds, NULL, NULL, &tv);
if (num_ready_fds > 0)
printf("Event Received!\n");
else if (num_ready_fds == 0)
// Handle timer here
printf("Timer Fired!\n");
else
printf("An error occured!\n");
// Handle XEvents and flush the input
while(XPending(dis))
XNextEvent(dis, &ev);
}
return(0);
}
fonte
2011-12-21 16:21:08
Ciao Aaron questa è una soluzione eccezionale. In questa finestra si verificano solo gli eventi, è possibile ascoltare gli eventi del mouse a livello globale? E possibile bloccare gli eventi del mouse con questo metodo? – Noitidart
@Noitidart: Forse, ma non posso rispondere in un commento. Fai una nuova domanda, per favore e non dimenticare di fornire maggiori dettagli su cosa esattamente devi ottenere. –
Ah grazie mille ho postato domanda qui per favore: http://stackoverflow.com/questions/32262767/mouse-events-callback – Noitidart