mirror of
https://github.com/lbonn/rofi
synced 2024-11-16 00:48:02 +00:00
65 lines
1.8 KiB
C
65 lines
1.8 KiB
C
#include <glib.h>
|
|
#include <X11/Xlib.h>
|
|
#include "x11-event-source.h"
|
|
|
|
/**
|
|
* Custom X11 Source implementation.
|
|
*/
|
|
typedef struct _X11EventSource
|
|
{
|
|
// Source
|
|
GSource source;
|
|
// Polling field
|
|
gpointer fd_x11;
|
|
Display *display;
|
|
} X11EventSource;
|
|
|
|
static gboolean x11_event_source_prepare ( GSource * base, gint * timeout )
|
|
{
|
|
X11EventSource *xs = (X11EventSource *) base;
|
|
*timeout = -1;
|
|
return /*XPending ( xs->display ) || */ g_source_query_unix_fd ( base, xs->fd_x11 );
|
|
}
|
|
|
|
static gboolean x11_event_source_check ( GSource * base )
|
|
{
|
|
X11EventSource *xs = (X11EventSource *) base;
|
|
if ( g_source_query_unix_fd ( base, xs->fd_x11 ) ) {
|
|
return TRUE;
|
|
}
|
|
return FALSE;
|
|
}
|
|
|
|
static gboolean x11_event_source_dispatch ( GSource * base, GSourceFunc callback, gpointer data )
|
|
{
|
|
X11EventSource *xs = (X11EventSource *) base;
|
|
if ( callback ) {
|
|
if ( g_source_query_unix_fd ( base, xs->fd_x11 ) ) {
|
|
callback ( data );
|
|
}
|
|
}
|
|
return G_SOURCE_CONTINUE;;
|
|
}
|
|
|
|
static GSourceFuncs x11_event_source_funcs = {
|
|
x11_event_source_prepare,
|
|
x11_event_source_check,
|
|
x11_event_source_dispatch,
|
|
NULL
|
|
};
|
|
|
|
GSource * x11_event_source_new ( Display *display )
|
|
{
|
|
int x11_fd = ConnectionNumber ( display );
|
|
X11EventSource *source = (X11EventSource *) g_source_new ( &x11_event_source_funcs, sizeof ( X11EventSource ) );
|
|
source->display = display;
|
|
source->fd_x11 = g_source_add_unix_fd ( (GSource *) source, x11_fd, G_IO_IN | G_IO_ERR );
|
|
|
|
// Attach it to main loop.
|
|
g_source_attach ( (GSource *) source, NULL );
|
|
return (GSource *) source;
|
|
}
|
|
void x11_event_source_set_callback ( GSource *source, GSourceFunc callback )
|
|
{
|
|
g_source_set_callback ( source, callback, NULL, NULL );
|
|
}
|