No. Esta es la razón por la que la mayoría de los marcos de IU (Gtk, KDE, etc.) utilizan bucles principales personalizados para poder escuchar más fuentes de eventos.
Internamente, XNextEvent usa un socket, por lo que llama a select()
para saber cuándo hay entradas disponibles. Entonces puede: Llamar al ConnectionNumber(display)
para obtener el descriptor de archivo que necesita pasar select()
que le permite escuchar varios descriptores de archivos.
código de ejemplo de 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);
}
Hola Aaron esta es una solución increíble. Esto solo captura eventos en esa ventana, ¿es posible escuchar eventos de mouse globalmente? ¿Y es posible bloquear los eventos del mouse con este método? – Noitidart
@Noitidart: Tal vez, pero no puedo responder eso en un comentario. Haga una nueva pregunta, por favor y no se olvide de dar más detalles de lo que necesita lograr exactamente. –
Ah, muchas gracias, he publicado una pregunta aquí, por favor: http://stackoverflow.com/questions/32262767/mouse-events-callback – Noitidart