|
Packit |
8b6d7a |
/*
|
|
Packit |
8b6d7a |
* AT-SPI - Assistive Technology Service Provider Interface
|
|
Packit |
8b6d7a |
* (Gnome Accessibility Project; http://developer.gnome.org/projects/gap)
|
|
Packit |
8b6d7a |
*
|
|
Packit |
8b6d7a |
* Copyright 2009 Nokia.
|
|
Packit |
8b6d7a |
*
|
|
Packit |
8b6d7a |
* This library is free software; you can redistribute it and/or
|
|
Packit |
8b6d7a |
* modify it under the terms of the GNU Library General Public
|
|
Packit |
8b6d7a |
* License as published by the Free Software Foundation; either
|
|
Packit |
8b6d7a |
* version 2 of the License, or (at your option) any later version.
|
|
Packit |
8b6d7a |
*
|
|
Packit |
8b6d7a |
* This library is distributed in the hope that it will be useful,
|
|
Packit |
8b6d7a |
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
Packit |
8b6d7a |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
Packit |
8b6d7a |
* Library General Public License for more details.
|
|
Packit |
8b6d7a |
*
|
|
Packit |
8b6d7a |
* You should have received a copy of the GNU Library General Public
|
|
Packit |
8b6d7a |
* License along with this library; if not, write to the
|
|
Packit |
8b6d7a |
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
|
|
Packit |
8b6d7a |
* Boston, MA 02111-1307, USA.
|
|
Packit |
8b6d7a |
*/
|
|
Packit |
8b6d7a |
|
|
Packit |
8b6d7a |
#include <glib.h>
|
|
Packit |
8b6d7a |
|
|
Packit |
8b6d7a |
#include "event-source.h"
|
|
Packit |
8b6d7a |
|
|
Packit |
8b6d7a |
typedef struct _DisplaySource
|
|
Packit |
8b6d7a |
{
|
|
Packit |
8b6d7a |
GSource source;
|
|
Packit |
8b6d7a |
|
|
Packit |
8b6d7a |
Display *display;
|
|
Packit |
8b6d7a |
GPollFD event_poll_fd;
|
|
Packit |
8b6d7a |
} DisplaySource;
|
|
Packit |
8b6d7a |
|
|
Packit |
8b6d7a |
/*---------------------------------------------------------------------------*/
|
|
Packit |
8b6d7a |
|
|
Packit |
8b6d7a |
static void (*_spi_default_filter) (XEvent*, void*) = NULL;
|
|
Packit |
8b6d7a |
static void* _spi_default_filter_data = NULL;
|
|
Packit |
8b6d7a |
|
|
Packit |
8b6d7a |
/*---------------------------------------------------------------------------*/
|
|
Packit |
8b6d7a |
|
|
Packit |
8b6d7a |
static gboolean
|
|
Packit |
8b6d7a |
event_prepare (GSource *source, gint *timeout)
|
|
Packit |
8b6d7a |
{
|
|
Packit |
8b6d7a |
Display *display = ((DisplaySource *)source)->display;
|
|
Packit |
8b6d7a |
gboolean retval;
|
|
Packit |
8b6d7a |
|
|
Packit |
8b6d7a |
*timeout = -1;
|
|
Packit |
8b6d7a |
retval = XPending (display);
|
|
Packit |
8b6d7a |
|
|
Packit |
8b6d7a |
return retval;
|
|
Packit |
8b6d7a |
}
|
|
Packit |
8b6d7a |
|
|
Packit |
8b6d7a |
static gboolean
|
|
Packit |
8b6d7a |
event_check (GSource *source)
|
|
Packit |
8b6d7a |
{
|
|
Packit |
8b6d7a |
DisplaySource *display_source = (DisplaySource*)source;
|
|
Packit |
8b6d7a |
gboolean retval;
|
|
Packit |
8b6d7a |
|
|
Packit |
8b6d7a |
if (display_source->event_poll_fd.revents & G_IO_IN)
|
|
Packit |
8b6d7a |
retval = XPending (display_source->display);
|
|
Packit |
8b6d7a |
else
|
|
Packit |
8b6d7a |
retval = FALSE;
|
|
Packit |
8b6d7a |
|
|
Packit |
8b6d7a |
return retval;
|
|
Packit |
8b6d7a |
}
|
|
Packit |
8b6d7a |
|
|
Packit |
8b6d7a |
static gboolean
|
|
Packit |
8b6d7a |
event_dispatch (GSource *source, GSourceFunc callback, gpointer user_data)
|
|
Packit |
8b6d7a |
{
|
|
Packit |
8b6d7a |
Display *display = ((DisplaySource*)source)->display;
|
|
Packit |
8b6d7a |
XEvent xevent;
|
|
Packit |
8b6d7a |
|
|
Packit |
8b6d7a |
/* TODO - Should this be "if (XPending (display))"?
|
|
Packit |
8b6d7a |
* The effect of this might be to run other main loop functions
|
|
Packit |
8b6d7a |
* before dispatching the next XEvent.
|
|
Packit |
8b6d7a |
*/
|
|
Packit |
8b6d7a |
while (XPending (display))
|
|
Packit |
8b6d7a |
{
|
|
Packit |
8b6d7a |
XNextEvent (display, &xevent);
|
|
Packit |
8b6d7a |
|
|
Packit |
8b6d7a |
switch (xevent.type)
|
|
Packit |
8b6d7a |
{
|
|
Packit |
8b6d7a |
case KeyPress:
|
|
Packit |
8b6d7a |
case KeyRelease:
|
|
Packit |
8b6d7a |
break;
|
|
Packit |
8b6d7a |
default:
|
|
Packit |
8b6d7a |
if (XFilterEvent (&xevent, None))
|
|
Packit |
8b6d7a |
continue;
|
|
Packit |
8b6d7a |
}
|
|
Packit |
8b6d7a |
|
|
Packit |
8b6d7a |
if (_spi_default_filter)
|
|
Packit |
8b6d7a |
{
|
|
Packit |
8b6d7a |
_spi_default_filter (&xevent, _spi_default_filter_data);
|
|
Packit |
8b6d7a |
}
|
|
Packit |
8b6d7a |
}
|
|
Packit |
8b6d7a |
|
|
Packit |
8b6d7a |
return TRUE;
|
|
Packit |
8b6d7a |
}
|
|
Packit |
8b6d7a |
|
|
Packit |
8b6d7a |
/*---------------------------------------------------------------------------*/
|
|
Packit |
8b6d7a |
|
|
Packit |
8b6d7a |
static GSourceFuncs event_funcs = {
|
|
Packit |
8b6d7a |
event_prepare,
|
|
Packit |
8b6d7a |
event_check,
|
|
Packit |
8b6d7a |
event_dispatch,
|
|
Packit |
8b6d7a |
NULL
|
|
Packit |
8b6d7a |
};
|
|
Packit |
8b6d7a |
|
|
Packit |
8b6d7a |
static GSource *
|
|
Packit |
8b6d7a |
display_source_new (Display *display)
|
|
Packit |
8b6d7a |
{
|
|
Packit |
8b6d7a |
GSource *source = g_source_new (&event_funcs, sizeof (DisplaySource));
|
|
Packit |
8b6d7a |
DisplaySource *display_source = (DisplaySource *) source;
|
|
Packit |
8b6d7a |
g_source_set_name (source, "[at-spi2-core] display_source_funcs");
|
|
Packit |
8b6d7a |
|
|
Packit |
8b6d7a |
display_source->display = display;
|
|
Packit |
8b6d7a |
|
|
Packit |
8b6d7a |
return source;
|
|
Packit |
8b6d7a |
}
|
|
Packit |
8b6d7a |
|
|
Packit |
8b6d7a |
/*---------------------------------------------------------------------------*/
|
|
Packit |
8b6d7a |
|
|
Packit |
8b6d7a |
static DisplaySource *spi_display_source = NULL;
|
|
Packit |
8b6d7a |
|
|
Packit |
8b6d7a |
void
|
|
Packit |
8b6d7a |
spi_events_init (Display *display)
|
|
Packit |
8b6d7a |
{
|
|
Packit |
8b6d7a |
GSource *source;
|
|
Packit |
8b6d7a |
|
|
Packit |
8b6d7a |
int connection_number = ConnectionNumber (display);
|
|
Packit |
8b6d7a |
|
|
Packit |
8b6d7a |
source = display_source_new (display);
|
|
Packit |
8b6d7a |
spi_display_source = (DisplaySource*) source;
|
|
Packit |
8b6d7a |
|
|
Packit |
8b6d7a |
g_source_set_priority (source, G_PRIORITY_DEFAULT);
|
|
Packit |
8b6d7a |
|
|
Packit |
8b6d7a |
spi_display_source->event_poll_fd.fd = connection_number;
|
|
Packit |
8b6d7a |
spi_display_source->event_poll_fd.events = G_IO_IN;
|
|
Packit |
8b6d7a |
|
|
Packit |
8b6d7a |
g_source_add_poll (source, &spi_display_source->event_poll_fd);
|
|
Packit |
8b6d7a |
g_source_set_can_recurse (source, TRUE);
|
|
Packit |
8b6d7a |
g_source_attach (source, NULL);
|
|
Packit |
8b6d7a |
}
|
|
Packit |
8b6d7a |
|
|
Packit |
8b6d7a |
void
|
|
Packit |
8b6d7a |
spi_events_uninit ()
|
|
Packit |
8b6d7a |
{
|
|
Packit |
8b6d7a |
if (spi_display_source)
|
|
Packit |
8b6d7a |
{
|
|
Packit |
8b6d7a |
g_source_destroy ((GSource *) spi_display_source);
|
|
Packit |
8b6d7a |
g_source_unref ((GSource *) spi_display_source);
|
|
Packit |
8b6d7a |
spi_display_source = NULL;
|
|
Packit |
8b6d7a |
}
|
|
Packit |
8b6d7a |
}
|
|
Packit |
8b6d7a |
|
|
Packit |
8b6d7a |
void
|
|
Packit |
8b6d7a |
spi_set_events (long event_mask)
|
|
Packit |
8b6d7a |
{
|
|
Packit |
8b6d7a |
long xevent_mask = StructureNotifyMask | PropertyChangeMask;
|
|
Packit |
8b6d7a |
xevent_mask |= event_mask;
|
|
Packit |
8b6d7a |
|
|
Packit |
8b6d7a |
XSelectInput (spi_display_source->display,
|
|
Packit |
8b6d7a |
DefaultRootWindow (spi_display_source->display),
|
|
Packit |
8b6d7a |
xevent_mask);
|
|
Packit |
8b6d7a |
}
|
|
Packit |
8b6d7a |
|
|
Packit |
8b6d7a |
void
|
|
Packit |
8b6d7a |
spi_set_filter (void (*filter) (XEvent*, void*), void* data)
|
|
Packit |
8b6d7a |
{
|
|
Packit |
8b6d7a |
_spi_default_filter = filter;
|
|
Packit |
8b6d7a |
_spi_default_filter_data = data;
|
|
Packit |
8b6d7a |
}
|
|
Packit |
8b6d7a |
|
|
Packit |
8b6d7a |
/*END------------------------------------------------------------------------*/
|