Blame registryd/event-source.c

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------------------------------------------------------------------------*/