Blame gdk/directfb/gdkevents-directfb.c

Packit Service fb6fa5
/* GDK - The GIMP Drawing Kit
Packit Service fb6fa5
 * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * This library is free software; you can redistribute it and/or
Packit Service fb6fa5
 * modify it under the terms of the GNU Lesser General Public
Packit Service fb6fa5
 * License as published by the Free Software Foundation; either
Packit Service fb6fa5
 * version 2 of the License, or (at your option) any later version.
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * This library is distributed in the hope that it will be useful,
Packit Service fb6fa5
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service fb6fa5
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit Service fb6fa5
 * Lesser General Public License for more details.
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * You should have received a copy of the GNU Lesser General Public
Packit Service fb6fa5
 * License along with this library; if not, write to the
Packit Service fb6fa5
 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Packit Service fb6fa5
 * Boston, MA 02111-1307, USA.
Packit Service fb6fa5
 */
Packit Service fb6fa5
Packit Service fb6fa5
/*
Packit Service fb6fa5
 * Modified by the GTK+ Team and others 1997-2000.  See the AUTHORS
Packit Service fb6fa5
 * file for a list of people on the GTK+ Team.
Packit Service fb6fa5
 */
Packit Service fb6fa5
Packit Service fb6fa5
/*
Packit Service fb6fa5
 * GTK+ DirectFB backend
Packit Service fb6fa5
 * Copyright (C) 2001-2002  convergence integrated media GmbH
Packit Service fb6fa5
 * Copyright (C) 2002-2004  convergence GmbH
Packit Service fb6fa5
 * Written by Denis Oliver Kropp <dok@convergence.de> and
Packit Service fb6fa5
 *            Sven Neumann <sven@convergence.de>
Packit Service fb6fa5
 */
Packit Service fb6fa5
Packit Service fb6fa5
#include "config.h"
Packit Service fb6fa5
#include "gdk.h"
Packit Service fb6fa5
#include "gdkdirectfb.h"
Packit Service fb6fa5
#include "gdkprivate-directfb.h"
Packit Service fb6fa5
Packit Service fb6fa5
#include "gdkinternals.h"
Packit Service fb6fa5
Packit Service fb6fa5
#include "gdkkeysyms.h"
Packit Service fb6fa5
Packit Service fb6fa5
#include "gdkinput-directfb.h"
Packit Service fb6fa5
#include <string.h>
Packit Service fb6fa5
Packit Service fb6fa5
#ifndef __GDK_X_H__
Packit Service fb6fa5
#define __GDK_X_H__
Packit Service fb6fa5
gboolean gdk_net_wm_supports (GdkAtom property);
Packit Service fb6fa5
#endif
Packit Service fb6fa5
Packit Service fb6fa5
#include "gdkalias.h"
Packit Service fb6fa5
Packit Service fb6fa5
#define EventBuffer _gdk_display->buffer
Packit Service fb6fa5
#define DirectFB _gdk_display->directfb
Packit Service fb6fa5
Packit Service fb6fa5
#include "gdkaliasdef.c"
Packit Service fb6fa5
Packit Service fb6fa5
D_DEBUG_DOMAIN (GDKDFB_Events, "GDKDFB/Events", "GDK DirectFB Events");
Packit Service fb6fa5
D_DEBUG_DOMAIN (GDKDFB_MouseEvents, "GDKDFB/Events/Mouse", "GDK DirectFB Mouse Events");
Packit Service fb6fa5
D_DEBUG_DOMAIN (GDKDFB_WindowEvents, "GDKDFB/Events/Window", "GDK DirectFB Window Events");
Packit Service fb6fa5
D_DEBUG_DOMAIN (GDKDFB_KeyEvents, "GDKDFB/Events/Key", "GDK DirectFB Key Events");
Packit Service fb6fa5
Packit Service fb6fa5
/*********************************************
Packit Service fb6fa5
 * Functions for maintaining the event queue *
Packit Service fb6fa5
 *********************************************/
Packit Service fb6fa5
Packit Service fb6fa5
static gboolean gdk_event_translate  (GdkEvent       *event,
Packit Service fb6fa5
                                      DFBWindowEvent *dfbevent,
Packit Service fb6fa5
                                      GdkWindow      *window);
Packit Service fb6fa5
Packit Service fb6fa5
/*
Packit Service fb6fa5
 * Private variable declarations
Packit Service fb6fa5
 */
Packit Service fb6fa5
static GList *client_filters;  /* Filters for client messages */
Packit Service fb6fa5
Packit Service fb6fa5
static gint
Packit Service fb6fa5
gdk_event_apply_filters (DFBWindowEvent *dfbevent,
Packit Service fb6fa5
                         GdkEvent *event,
Packit Service fb6fa5
                         GList *filters)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GList *tmp_list;
Packit Service fb6fa5
  GdkFilterReturn result;
Packit Service fb6fa5
Packit Service fb6fa5
  tmp_list = filters;
Packit Service fb6fa5
Packit Service fb6fa5
  while (tmp_list)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      GdkEventFilter *filter = (GdkEventFilter*) tmp_list->data;
Packit Service fb6fa5
Packit Service fb6fa5
      tmp_list = tmp_list->next;
Packit Service fb6fa5
      result = filter->function (dfbevent, event, filter->data);
Packit Service fb6fa5
      if (result !=  GDK_FILTER_CONTINUE)
Packit Service fb6fa5
        return result;
Packit Service fb6fa5
    }
Packit Service fb6fa5
Packit Service fb6fa5
  return GDK_FILTER_CONTINUE;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
dfb_events_process_window_event (DFBWindowEvent *dfbevent)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GdkDisplay *display = gdk_display_get_default ();
Packit Service fb6fa5
  GdkWindow  *window;
Packit Service fb6fa5
  GdkEvent   *event;
Packit Service fb6fa5
  GList      *node;
Packit Service fb6fa5
Packit Service fb6fa5
  window = gdk_directfb_window_id_table_lookup (dfbevent->window_id);
Packit Service fb6fa5
  if (!window)
Packit Service fb6fa5
    return;
Packit Service fb6fa5
Packit Service fb6fa5
  event = gdk_event_new (GDK_NOTHING);
Packit Service fb6fa5
Packit Service fb6fa5
  event->any.window = NULL;
Packit Service fb6fa5
Packit Service fb6fa5
  ((GdkEventPrivate *)event)->flags |= GDK_EVENT_PENDING;
Packit Service fb6fa5
Packit Service fb6fa5
  node = _gdk_event_queue_append (display, event);
Packit Service fb6fa5
Packit Service fb6fa5
  if (gdk_event_translate (event, dfbevent, window))
Packit Service fb6fa5
    {
Packit Service fb6fa5
      ((GdkEventPrivate *)event)->flags &= ~GDK_EVENT_PENDING;
Packit Service fb6fa5
      _gdk_windowing_got_event (display, node, event, 0);
Packit Service fb6fa5
    }
Packit Service fb6fa5
  else
Packit Service fb6fa5
    {
Packit Service fb6fa5
      _gdk_event_queue_remove_link (display, node);
Packit Service fb6fa5
      g_list_free_1 (node);
Packit Service fb6fa5
      gdk_event_free (event);
Packit Service fb6fa5
    }
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static gboolean
Packit Service fb6fa5
gdk_event_send_client_message_by_window (GdkEvent *event,
Packit Service fb6fa5
                                         GdkWindow *window)
Packit Service fb6fa5
{
Packit Service fb6fa5
  DFBUserEvent evt;
Packit Service fb6fa5
Packit Service fb6fa5
  g_return_val_if_fail(event != NULL, FALSE);
Packit Service fb6fa5
  g_return_val_if_fail(GDK_IS_WINDOW(window), FALSE);
Packit Service fb6fa5
Packit Service fb6fa5
  evt.clazz = DFEC_USER;
Packit Service fb6fa5
  evt.type = GPOINTER_TO_UINT (GDK_ATOM_TO_POINTER (event->client.message_type));
Packit Service fb6fa5
  evt.data = (void *) event->client.data.l[0];
Packit Service fb6fa5
Packit Service fb6fa5
  _gdk_display->buffer->PostEvent (_gdk_display->buffer, DFB_EVENT (&evt));
Packit Service fb6fa5
Packit Service fb6fa5
  return TRUE;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
dfb_events_dispatch (void)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GdkDisplay *display = gdk_display_get_default ();
Packit Service fb6fa5
  GdkEvent   *event;
Packit Service fb6fa5
Packit Service fb6fa5
  GDK_THREADS_ENTER ();
Packit Service fb6fa5
Packit Service fb6fa5
  while ((event = _gdk_event_unqueue (display)) != NULL)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      if (_gdk_event_func)
Packit Service fb6fa5
        (*_gdk_event_func) (event, _gdk_event_data);
Packit Service fb6fa5
Packit Service fb6fa5
      gdk_event_free (event);
Packit Service fb6fa5
    }
Packit Service fb6fa5
Packit Service fb6fa5
  GDK_THREADS_LEAVE ();
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static gboolean
Packit Service fb6fa5
dfb_events_io_func (GIOChannel   *channel,
Packit Service fb6fa5
                    GIOCondition  condition,
Packit Service fb6fa5
                    gpointer      data)
Packit Service fb6fa5
{
Packit Service fb6fa5
  gsize      i;
Packit Service fb6fa5
  gsize      read;
Packit Service fb6fa5
  GIOStatus  result;
Packit Service fb6fa5
  DFBEvent   buf[23];
Packit Service fb6fa5
  DFBEvent  *event;
Packit Service fb6fa5
Packit Service fb6fa5
  result = g_io_channel_read_chars (channel,
Packit Service fb6fa5
                                    (gchar *) buf, sizeof (buf), &read, NULL);
Packit Service fb6fa5
Packit Service fb6fa5
  if (result == G_IO_STATUS_ERROR)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      g_warning ("%s: GIOError occured", G_STRFUNC);
Packit Service fb6fa5
      return TRUE;
Packit Service fb6fa5
    }
Packit Service fb6fa5
Packit Service fb6fa5
  read /= sizeof (DFBEvent);
Packit Service fb6fa5
Packit Service fb6fa5
  for (i = 0, event = buf; i < read; i++, event++)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      switch (event->clazz)
Packit Service fb6fa5
        {
Packit Service fb6fa5
        case DFEC_WINDOW:
Packit Service fb6fa5
          /* TODO workaround to prevent two DWET_ENTER in a row from being delivered */
Packit Service fb6fa5
          if (event->window.type == DWET_ENTER) {
Packit Service fb6fa5
            if (i > 0 && buf[i - 1].window.type != DWET_ENTER)
Packit Service fb6fa5
              dfb_events_process_window_event (&event->window);
Packit Service fb6fa5
          }
Packit Service fb6fa5
          else
Packit Service fb6fa5
            dfb_events_process_window_event (&event->window);
Packit Service fb6fa5
          break;
Packit Service fb6fa5
Packit Service fb6fa5
        case DFEC_USER:
Packit Service fb6fa5
          {
Packit Service fb6fa5
            GList *list;
Packit Service fb6fa5
Packit Service fb6fa5
            GDK_NOTE (EVENTS, g_print (" client_message"));
Packit Service fb6fa5
Packit Service fb6fa5
            for (list = client_filters; list; list = list->next)
Packit Service fb6fa5
              {
Packit Service fb6fa5
                GdkClientFilter *filter     = list->data;
Packit Service fb6fa5
                DFBUserEvent    *user_event = (DFBUserEvent *) event;
Packit Service fb6fa5
                GdkAtom          type;
Packit Service fb6fa5
Packit Service fb6fa5
                type = GDK_POINTER_TO_ATOM (GUINT_TO_POINTER (user_event->type));
Packit Service fb6fa5
Packit Service fb6fa5
                if (filter->type == type)
Packit Service fb6fa5
                  {
Packit Service fb6fa5
                    if (filter->function (user_event,
Packit Service fb6fa5
                                          NULL,
Packit Service fb6fa5
                                          filter->data) != GDK_FILTER_CONTINUE)
Packit Service fb6fa5
                      break;
Packit Service fb6fa5
                  }
Packit Service fb6fa5
              }
Packit Service fb6fa5
          }
Packit Service fb6fa5
          break;
Packit Service fb6fa5
Packit Service fb6fa5
        default:
Packit Service fb6fa5
          break;
Packit Service fb6fa5
        }
Packit Service fb6fa5
    }
Packit Service fb6fa5
Packit Service fb6fa5
  EventBuffer->Reset (EventBuffer);
Packit Service fb6fa5
Packit Service fb6fa5
  dfb_events_dispatch ();
Packit Service fb6fa5
Packit Service fb6fa5
  return TRUE;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
void
Packit Service fb6fa5
_gdk_events_init (void)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GIOChannel *channel;
Packit Service fb6fa5
  GSource    *source;
Packit Service fb6fa5
  DFBResult   ret;
Packit Service fb6fa5
  gint        fd;
Packit Service fb6fa5
Packit Service fb6fa5
  ret = DirectFB->CreateEventBuffer (DirectFB, &EventBuffer);
Packit Service fb6fa5
  if (ret)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      DirectFBError ("_gdk_events_init: "
Packit Service fb6fa5
                     "IDirectFB::CreateEventBuffer() failed", ret);
Packit Service fb6fa5
      return;
Packit Service fb6fa5
    }
Packit Service fb6fa5
Packit Service fb6fa5
  ret = EventBuffer->CreateFileDescriptor (EventBuffer, &fd;;
Packit Service fb6fa5
  if (ret)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      DirectFBError ("_gdk_events_init: "
Packit Service fb6fa5
                     "IDirectFBEventBuffer::CreateFileDescriptor() failed",
Packit Service fb6fa5
                     ret);
Packit Service fb6fa5
      return;
Packit Service fb6fa5
    }
Packit Service fb6fa5
Packit Service fb6fa5
  channel = g_io_channel_unix_new (fd);
Packit Service fb6fa5
Packit Service fb6fa5
  g_io_channel_set_encoding (channel, NULL, NULL);
Packit Service fb6fa5
  g_io_channel_set_buffered (channel, FALSE);
Packit Service fb6fa5
Packit Service fb6fa5
  source = g_io_create_watch (channel, G_IO_IN);
Packit Service fb6fa5
Packit Service fb6fa5
  g_source_set_priority (source, G_PRIORITY_DEFAULT);
Packit Service fb6fa5
  g_source_set_can_recurse (source, TRUE);
Packit Service fb6fa5
  g_source_set_callback (source, (GSourceFunc) dfb_events_io_func, NULL, NULL);
Packit Service fb6fa5
Packit Service fb6fa5
  g_source_attach (source, NULL);
Packit Service fb6fa5
  g_source_unref (source);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
gboolean
Packit Service fb6fa5
gdk_events_pending (void)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GdkDisplay *display = gdk_display_get_default ();
Packit Service fb6fa5
Packit Service fb6fa5
  return _gdk_event_queue_find_first (display) ? TRUE : FALSE;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
GdkEvent *
Packit Service fb6fa5
gdk_event_get_graphics_expose (GdkWindow *window)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GdkDisplay *display;
Packit Service fb6fa5
  GList      *list;
Packit Service fb6fa5
Packit Service fb6fa5
  g_return_val_if_fail (GDK_IS_WINDOW (window), NULL);
Packit Service fb6fa5
Packit Service fb6fa5
  display = gdk_drawable_get_display (GDK_DRAWABLE (window));
Packit Service fb6fa5
Packit Service fb6fa5
  for (list = _gdk_event_queue_find_first (display); list; list = list->next)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      GdkEvent *event = list->data;
Packit Service fb6fa5
      if (event->type == GDK_EXPOSE && event->expose.window == window)
Packit Service fb6fa5
        break;
Packit Service fb6fa5
    }
Packit Service fb6fa5
Packit Service fb6fa5
  if (list)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      GdkEvent *retval = list->data;
Packit Service fb6fa5
Packit Service fb6fa5
      _gdk_event_queue_remove_link (display, list);
Packit Service fb6fa5
      g_list_free_1 (list);
Packit Service fb6fa5
Packit Service fb6fa5
      return retval;
Packit Service fb6fa5
    }
Packit Service fb6fa5
Packit Service fb6fa5
  return NULL;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
void
Packit Service fb6fa5
_gdk_events_queue (GdkDisplay *display)
Packit Service fb6fa5
{
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
void
Packit Service fb6fa5
gdk_flush (void)
Packit Service fb6fa5
{
Packit Service fb6fa5
  gdk_display_flush (GDK_DISPLAY_OBJECT (_gdk_display));
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
/* Sends a ClientMessage to all toplevel client windows */
Packit Service fb6fa5
gboolean
Packit Service fb6fa5
gdk_event_send_client_message_for_display (GdkDisplay *display,
Packit Service fb6fa5
                                           GdkEvent   *event,
Packit Service fb6fa5
                                           guint32     xid)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GdkWindow *win = NULL;
Packit Service fb6fa5
  gboolean ret = TRUE;
Packit Service fb6fa5
Packit Service fb6fa5
  g_return_val_if_fail (event != NULL, FALSE);
Packit Service fb6fa5
Packit Service fb6fa5
  win = gdk_window_lookup_for_display (display, (GdkNativeWindow) xid);
Packit Service fb6fa5
Packit Service fb6fa5
  g_return_val_if_fail (win != NULL, FALSE);
Packit Service fb6fa5
Packit Service fb6fa5
  if ((GDK_WINDOW_OBJECT (win)->window_type != GDK_WINDOW_CHILD) &&
Packit Service fb6fa5
      (g_object_get_data (G_OBJECT (win), "gdk-window-child-handler")))
Packit Service fb6fa5
    {
Packit Service fb6fa5
      /* Managed window, check children */
Packit Service fb6fa5
      GList *ltmp = NULL;
Packit Service fb6fa5
      for (ltmp = GDK_WINDOW_OBJECT (win)->children; ltmp; ltmp = ltmp->next)
Packit Service fb6fa5
        {
Packit Service fb6fa5
          ret &= gdk_event_send_client_message_by_window (event,
Packit Service fb6fa5
                                                          GDK_WINDOW(ltmp->data));
Packit Service fb6fa5
        }
Packit Service fb6fa5
    }
Packit Service fb6fa5
  else
Packit Service fb6fa5
    {
Packit Service fb6fa5
      ret &= gdk_event_send_client_message_by_window (event, win);
Packit Service fb6fa5
    }
Packit Service fb6fa5
Packit Service fb6fa5
  return ret;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
/*****/
Packit Service fb6fa5
Packit Service fb6fa5
guint32
Packit Service fb6fa5
gdk_directfb_get_time (void)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GTimeVal tv;
Packit Service fb6fa5
Packit Service fb6fa5
  g_get_current_time (&tv;;
Packit Service fb6fa5
Packit Service fb6fa5
  return (guint32) tv.tv_sec * 1000 + tv.tv_usec / 1000;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
void
Packit Service fb6fa5
gdk_directfb_event_windows_add (GdkWindow *window)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GdkWindowImplDirectFB *impl;
Packit Service fb6fa5
Packit Service fb6fa5
  g_return_if_fail (GDK_IS_WINDOW (window));
Packit Service fb6fa5
Packit Service fb6fa5
  impl = GDK_WINDOW_IMPL_DIRECTFB (GDK_WINDOW_OBJECT (window)->impl);
Packit Service fb6fa5
Packit Service fb6fa5
  if (!impl->window)
Packit Service fb6fa5
    return;
Packit Service fb6fa5
Packit Service fb6fa5
  if (EventBuffer)
Packit Service fb6fa5
    impl->window->AttachEventBuffer (impl->window, EventBuffer);
Packit Service fb6fa5
  else
Packit Service fb6fa5
    impl->window->CreateEventBuffer (impl->window, &EventBuffer);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
void
Packit Service fb6fa5
gdk_directfb_event_windows_remove (GdkWindow *window)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GdkWindowImplDirectFB *impl;
Packit Service fb6fa5
Packit Service fb6fa5
  g_return_if_fail (GDK_IS_WINDOW (window));
Packit Service fb6fa5
Packit Service fb6fa5
  impl = GDK_WINDOW_IMPL_DIRECTFB (GDK_WINDOW_OBJECT (window)->impl);
Packit Service fb6fa5
Packit Service fb6fa5
  if (!impl->window)
Packit Service fb6fa5
    return;
Packit Service fb6fa5
Packit Service fb6fa5
  if (EventBuffer)
Packit Service fb6fa5
    impl->window->DetachEventBuffer (impl->window, EventBuffer);
Packit Service fb6fa5
  /* FIXME: should we warn if (! EventBuffer) ? */
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
GdkWindow *
Packit Service fb6fa5
gdk_directfb_child_at (GdkWindow *window,
Packit Service fb6fa5
                       gint      *winx,
Packit Service fb6fa5
                       gint      *winy)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GdkWindowObject *private;
Packit Service fb6fa5
  GList           *list;
Packit Service fb6fa5
Packit Service fb6fa5
  g_return_val_if_fail (GDK_IS_WINDOW (window), NULL);
Packit Service fb6fa5
Packit Service fb6fa5
  private = GDK_WINDOW_OBJECT (window);
Packit Service fb6fa5
  for (list = private->children; list; list = list->next)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      GdkWindowObject *win = list->data;
Packit Service fb6fa5
      gint wx, wy, ww, wh;
Packit Service fb6fa5
Packit Service fb6fa5
      gdk_window_get_geometry (GDK_WINDOW (win), &wx, &wy, &ww, &wh, NULL);
Packit Service fb6fa5
Packit Service fb6fa5
      if (GDK_WINDOW_IS_MAPPED (win) &&
Packit Service fb6fa5
          *winx >= wx  && *winx <  wx + ww  &&
Packit Service fb6fa5
          *winy >= wy  && *winy <  wy + wh)
Packit Service fb6fa5
        {
Packit Service fb6fa5
          *winx -= win->x;
Packit Service fb6fa5
          *winy -= win->y;
Packit Service fb6fa5
Packit Service fb6fa5
          return gdk_directfb_child_at (GDK_WINDOW (win), winx, winy);
Packit Service fb6fa5
        }
Packit Service fb6fa5
    }
Packit Service fb6fa5
Packit Service fb6fa5
  return window;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static gboolean
Packit Service fb6fa5
gdk_event_translate (GdkEvent       *event,
Packit Service fb6fa5
                     DFBWindowEvent *dfbevent,
Packit Service fb6fa5
                     GdkWindow      *window)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GdkWindowObject *private;
Packit Service fb6fa5
  GdkDisplay      *display;
Packit Service fb6fa5
  /* GdkEvent        *event    = NULL; */
Packit Service fb6fa5
  gboolean return_val = FALSE;
Packit Service fb6fa5
Packit Service fb6fa5
  g_return_val_if_fail (event != NULL, FALSE);
Packit Service fb6fa5
  g_return_val_if_fail (dfbevent != NULL, FALSE);
Packit Service fb6fa5
  g_return_val_if_fail (GDK_IS_WINDOW (window), FALSE);
Packit Service fb6fa5
Packit Service fb6fa5
  D_DEBUG_AT (GDKDFB_Events, "%s( %p, %p, %p )\n", G_STRFUNC,
Packit Service fb6fa5
              event, dfbevent, window);
Packit Service fb6fa5
Packit Service fb6fa5
  private = GDK_WINDOW_OBJECT (window);
Packit Service fb6fa5
Packit Service fb6fa5
  g_object_ref (G_OBJECT (window));
Packit Service fb6fa5
Packit Service fb6fa5
  event->any.window = NULL;
Packit Service fb6fa5
  event->any.send_event = FALSE;
Packit Service fb6fa5
Packit Service fb6fa5
  /*
Packit Service fb6fa5
   * Apply global filters
Packit Service fb6fa5
   *
Packit Service fb6fa5
   * If result is GDK_FILTER_CONTINUE, we continue as if nothing
Packit Service fb6fa5
   * happened. If it is GDK_FILTER_REMOVE or GDK_FILTER_TRANSLATE,
Packit Service fb6fa5
   * we return TRUE and won't dispatch the event.
Packit Service fb6fa5
   */
Packit Service fb6fa5
  if (_gdk_default_filters)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      GdkFilterReturn result;
Packit Service fb6fa5
      result = gdk_event_apply_filters (dfbevent, event, _gdk_default_filters);
Packit Service fb6fa5
Packit Service fb6fa5
      if (result != GDK_FILTER_CONTINUE)
Packit Service fb6fa5
        {
Packit Service fb6fa5
          return_val = (result == GDK_FILTER_TRANSLATE) ? TRUE : FALSE;
Packit Service fb6fa5
          goto done;
Packit Service fb6fa5
        }
Packit Service fb6fa5
    }
Packit Service fb6fa5
Packit Service fb6fa5
  /* Apply per-window filters */
Packit Service fb6fa5
  if (GDK_IS_WINDOW (window))
Packit Service fb6fa5
    {
Packit Service fb6fa5
      GdkFilterReturn result;
Packit Service fb6fa5
Packit Service fb6fa5
      if (private->filters)
Packit Service fb6fa5
	{
Packit Service fb6fa5
	  result = gdk_event_apply_filters (dfbevent, event, private->filters);
Packit Service fb6fa5
Packit Service fb6fa5
	  if (result != GDK_FILTER_CONTINUE)
Packit Service fb6fa5
	    {
Packit Service fb6fa5
	      return_val = (result == GDK_FILTER_TRANSLATE) ? TRUE : FALSE;
Packit Service fb6fa5
	      goto done;
Packit Service fb6fa5
	    }
Packit Service fb6fa5
	}
Packit Service fb6fa5
    }
Packit Service fb6fa5
Packit Service fb6fa5
  display = gdk_drawable_get_display (GDK_DRAWABLE (window));
Packit Service fb6fa5
Packit Service fb6fa5
  return_val = TRUE;
Packit Service fb6fa5
Packit Service fb6fa5
  switch (dfbevent->type)
Packit Service fb6fa5
    {
Packit Service fb6fa5
    case DWET_BUTTONDOWN:
Packit Service fb6fa5
    case DWET_BUTTONUP:
Packit Service fb6fa5
      /* Backend store */
Packit Service fb6fa5
      _gdk_directfb_mouse_x = dfbevent->cx;
Packit Service fb6fa5
      _gdk_directfb_mouse_y = dfbevent->cy;
Packit Service fb6fa5
Packit Service fb6fa5
      /* Event translation */
Packit Service fb6fa5
      gdk_directfb_event_fill (event, window,
Packit Service fb6fa5
                               dfbevent->type == DWET_BUTTONDOWN ?
Packit Service fb6fa5
                               GDK_BUTTON_PRESS : GDK_BUTTON_RELEASE);
Packit Service fb6fa5
      switch (dfbevent->button)
Packit Service fb6fa5
        {
Packit Service fb6fa5
        case DIBI_LEFT:
Packit Service fb6fa5
          event->button.button = 1;
Packit Service fb6fa5
          break;
Packit Service fb6fa5
Packit Service fb6fa5
        case DIBI_MIDDLE:
Packit Service fb6fa5
            event->button.button = 2;
Packit Service fb6fa5
            break;
Packit Service fb6fa5
Packit Service fb6fa5
        case DIBI_RIGHT:
Packit Service fb6fa5
          event->button.button = 3;
Packit Service fb6fa5
          break;
Packit Service fb6fa5
Packit Service fb6fa5
          default:
Packit Service fb6fa5
            event->button.button = dfbevent->button + 1;
Packit Service fb6fa5
            break;
Packit Service fb6fa5
        }
Packit Service fb6fa5
Packit Service fb6fa5
      event->button.window = window;
Packit Service fb6fa5
      event->button.x_root = dfbevent->cx;
Packit Service fb6fa5
      event->button.y_root = dfbevent->cy;
Packit Service fb6fa5
      event->button.x      = dfbevent->x;
Packit Service fb6fa5
      event->button.y      = dfbevent->y;
Packit Service fb6fa5
      event->button.state  = _gdk_directfb_modifiers;
Packit Service fb6fa5
      event->button.device = display->core_pointer;
Packit Service fb6fa5
      gdk_event_set_screen (event, _gdk_screen);
Packit Service fb6fa5
Packit Service fb6fa5
      D_DEBUG_AT (GDKDFB_MouseEvents, "  -> %s at %ix%i\n",
Packit Service fb6fa5
                  event->type == GDK_BUTTON_PRESS ? "buttonpress" : "buttonrelease",
Packit Service fb6fa5
                  (gint) event->button.x, (gint) event->button.y);
Packit Service fb6fa5
      break;
Packit Service fb6fa5
Packit Service fb6fa5
    case DWET_MOTION:
Packit Service fb6fa5
      /* Backend store */
Packit Service fb6fa5
      _gdk_directfb_mouse_x = dfbevent->cx;
Packit Service fb6fa5
      _gdk_directfb_mouse_y = dfbevent->cy;
Packit Service fb6fa5
Packit Service fb6fa5
      /* Event translation */
Packit Service fb6fa5
      gdk_directfb_event_fill (event, window, GDK_MOTION_NOTIFY);
Packit Service fb6fa5
      event->motion.x_root  = dfbevent->cx;
Packit Service fb6fa5
      event->motion.y_root  = dfbevent->cy;
Packit Service fb6fa5
      event->motion.x       = dfbevent->x;
Packit Service fb6fa5
      event->motion.y       = dfbevent->y;
Packit Service fb6fa5
      event->motion.axes    = NULL;
Packit Service fb6fa5
      event->motion.state   = _gdk_directfb_modifiers;
Packit Service fb6fa5
      event->motion.is_hint = FALSE;
Packit Service fb6fa5
      event->motion.device  = display->core_pointer;
Packit Service fb6fa5
      gdk_event_set_screen (event, _gdk_screen);
Packit Service fb6fa5
Packit Service fb6fa5
      D_DEBUG_AT (GDKDFB_MouseEvents, "  -> move pointer to %ix%i\n",
Packit Service fb6fa5
                  (gint) event->button.x, (gint) event->button.y);
Packit Service fb6fa5
      break;
Packit Service fb6fa5
Packit Service fb6fa5
    case DWET_GOTFOCUS:
Packit Service fb6fa5
      gdk_directfb_event_fill (event, window, GDK_FOCUS_CHANGE);
Packit Service fb6fa5
      event->focus_change.window = window;
Packit Service fb6fa5
      event->focus_change.in     = TRUE;
Packit Service fb6fa5
      break;
Packit Service fb6fa5
Packit Service fb6fa5
    case DWET_LOSTFOCUS:
Packit Service fb6fa5
      gdk_directfb_event_fill (event, window, GDK_FOCUS_CHANGE);
Packit Service fb6fa5
      event->focus_change.window = window;
Packit Service fb6fa5
      event->focus_change.in     = FALSE;
Packit Service fb6fa5
      break;
Packit Service fb6fa5
Packit Service fb6fa5
    case DWET_POSITION:
Packit Service fb6fa5
      gdk_directfb_event_fill (event, window, GDK_CONFIGURE);
Packit Service fb6fa5
      event->configure.x      = dfbevent->x;
Packit Service fb6fa5
      event->configure.y      = dfbevent->y;
Packit Service fb6fa5
      event->configure.width  = private->width;
Packit Service fb6fa5
      event->configure.height = private->height;
Packit Service fb6fa5
      break;
Packit Service fb6fa5
Packit Service fb6fa5
    case DWET_POSITION_SIZE:
Packit Service fb6fa5
      event->configure.x = dfbevent->x;
Packit Service fb6fa5
      event->configure.y = dfbevent->y;
Packit Service fb6fa5
      /* fallthru */
Packit Service fb6fa5
Packit Service fb6fa5
    case DWET_SIZE:
Packit Service fb6fa5
      gdk_directfb_event_fill (event, window, GDK_CONFIGURE);
Packit Service fb6fa5
      event->configure.window = window;
Packit Service fb6fa5
      event->configure.width  = dfbevent->w;
Packit Service fb6fa5
      event->configure.height = dfbevent->h;
Packit Service fb6fa5
Packit Service fb6fa5
      D_DEBUG_AT (GDKDFB_WindowEvents,
Packit Service fb6fa5
                  "  -> configure window %p at %ix%i-%ix%i\n",
Packit Service fb6fa5
                  window, event->configure.x, event->configure.y,
Packit Service fb6fa5
                  event->configure.width, event->configure.height);
Packit Service fb6fa5
      break;
Packit Service fb6fa5
Packit Service fb6fa5
    case DWET_KEYDOWN:
Packit Service fb6fa5
    case DWET_KEYUP:
Packit Service fb6fa5
      gdk_directfb_event_fill (event, window,
Packit Service fb6fa5
                               dfbevent->type == DWET_KEYUP ?
Packit Service fb6fa5
                               GDK_KEY_RELEASE : GDK_KEY_PRESS);
Packit Service fb6fa5
      event->key.window = window;
Packit Service fb6fa5
      gdk_directfb_translate_key_event (dfbevent, (GdkEventKey *) event);
Packit Service fb6fa5
Packit Service fb6fa5
      D_DEBUG_AT (GDKDFB_KeyEvents, "  -> key window=%p val=%x code=%x str=%s\n",
Packit Service fb6fa5
                  window,  event->key.keyval, event->key.hardware_keycode,
Packit Service fb6fa5
                  event->key.string);
Packit Service fb6fa5
      break;
Packit Service fb6fa5
Packit Service fb6fa5
    case DWET_ENTER:
Packit Service fb6fa5
    case DWET_LEAVE:
Packit Service fb6fa5
      /* Backend store */
Packit Service fb6fa5
      _gdk_directfb_mouse_x = dfbevent->cx;
Packit Service fb6fa5
      _gdk_directfb_mouse_y = dfbevent->cy;
Packit Service fb6fa5
Packit Service fb6fa5
      /* Event translation */
Packit Service fb6fa5
      gdk_directfb_event_fill (event, window,
Packit Service fb6fa5
                               dfbevent->type == DWET_ENTER ?
Packit Service fb6fa5
                               GDK_ENTER_NOTIFY : GDK_LEAVE_NOTIFY);
Packit Service fb6fa5
      event->crossing.window    = g_object_ref (window);
Packit Service fb6fa5
      event->crossing.subwindow = NULL;
Packit Service fb6fa5
      event->crossing.time      = GDK_CURRENT_TIME;
Packit Service fb6fa5
      event->crossing.x         = dfbevent->x;
Packit Service fb6fa5
      event->crossing.y         = dfbevent->y;
Packit Service fb6fa5
      event->crossing.x_root    = dfbevent->cx;
Packit Service fb6fa5
      event->crossing.y_root    = dfbevent->cy;
Packit Service fb6fa5
      event->crossing.mode      = GDK_CROSSING_NORMAL;
Packit Service fb6fa5
      event->crossing.detail    = GDK_NOTIFY_ANCESTOR;
Packit Service fb6fa5
      event->crossing.state     = 0;
Packit Service fb6fa5
Packit Service fb6fa5
      /**/
Packit Service fb6fa5
      if (gdk_directfb_apply_focus_opacity)
Packit Service fb6fa5
        {
Packit Service fb6fa5
          if (dfbevent->type == DWET_ENTER)
Packit Service fb6fa5
            {
Packit Service fb6fa5
              if (GDK_WINDOW_IS_MAPPED (window))
Packit Service fb6fa5
                GDK_WINDOW_IMPL_DIRECTFB (private->impl)->window->SetOpacity
Packit Service fb6fa5
                  (GDK_WINDOW_IMPL_DIRECTFB (private->impl)->window,
Packit Service fb6fa5
                   (GDK_WINDOW_IMPL_DIRECTFB (private->impl)->opacity >> 1) +
Packit Service fb6fa5
                   (GDK_WINDOW_IMPL_DIRECTFB (private->impl)->opacity >> 2));
Packit Service fb6fa5
            }
Packit Service fb6fa5
          else
Packit Service fb6fa5
            {
Packit Service fb6fa5
              GDK_WINDOW_IMPL_DIRECTFB (private->impl)->window->SetOpacity
Packit Service fb6fa5
                (GDK_WINDOW_IMPL_DIRECTFB (private->impl)->window,
Packit Service fb6fa5
                 GDK_WINDOW_IMPL_DIRECTFB (private->impl)->opacity);
Packit Service fb6fa5
            }
Packit Service fb6fa5
        }
Packit Service fb6fa5
Packit Service fb6fa5
      D_DEBUG_AT (GDKDFB_WindowEvents, "  -> %s window %p at relative=%ix%i absolute=%ix%i\n",
Packit Service fb6fa5
                  dfbevent->type == DWET_ENTER ? "enter" : "leave",
Packit Service fb6fa5
                  window, (gint) event->crossing.x, (gint) event->crossing.y,
Packit Service fb6fa5
                  (gint) event->crossing.x_root, (gint) event->crossing.y_root);
Packit Service fb6fa5
      break;
Packit Service fb6fa5
Packit Service fb6fa5
    case DWET_CLOSE:
Packit Service fb6fa5
      gdk_directfb_event_fill (event, window, GDK_DELETE);
Packit Service fb6fa5
      break;
Packit Service fb6fa5
Packit Service fb6fa5
    case DWET_DESTROYED:
Packit Service fb6fa5
      gdk_directfb_event_fill (event, window, GDK_DESTROY);
Packit Service fb6fa5
      gdk_window_destroy_notify (window);
Packit Service fb6fa5
      break;
Packit Service fb6fa5
Packit Service fb6fa5
    case DWET_WHEEL:
Packit Service fb6fa5
      /* Backend store */
Packit Service fb6fa5
      _gdk_directfb_mouse_x = dfbevent->cx;
Packit Service fb6fa5
      _gdk_directfb_mouse_y = dfbevent->cy;
Packit Service fb6fa5
Packit Service fb6fa5
      /* Event translation */
Packit Service fb6fa5
      gdk_directfb_event_fill (event, window, GDK_SCROLL);
Packit Service fb6fa5
      event->scroll.direction = (dfbevent->step > 0 ?
Packit Service fb6fa5
                                 GDK_SCROLL_UP : GDK_SCROLL_DOWN);
Packit Service fb6fa5
      event->scroll.x_root    = dfbevent->cx;
Packit Service fb6fa5
      event->scroll.y_root    = dfbevent->cy;
Packit Service fb6fa5
      event->scroll.x         = dfbevent->x;
Packit Service fb6fa5
      event->scroll.y         = dfbevent->y;
Packit Service fb6fa5
      event->scroll.state     = _gdk_directfb_modifiers;
Packit Service fb6fa5
      event->scroll.device    = display->core_pointer;
Packit Service fb6fa5
Packit Service fb6fa5
      D_DEBUG_AT (GDKDFB_MouseEvents, "  -> mouse scroll %s at %ix%i\n",
Packit Service fb6fa5
                  event->scroll.direction == GDK_SCROLL_UP ? "up" : "down",
Packit Service fb6fa5
                  (gint) event->scroll.x, (gint) event->scroll.y);
Packit Service fb6fa5
      break;
Packit Service fb6fa5
Packit Service fb6fa5
    default:
Packit Service fb6fa5
      g_message ("unhandled DirectFB windowing event 0x%08x", dfbevent->type);
Packit Service fb6fa5
    }
Packit Service fb6fa5
Packit Service fb6fa5
 done:
Packit Service fb6fa5
Packit Service fb6fa5
  g_object_unref (G_OBJECT (window));
Packit Service fb6fa5
Packit Service fb6fa5
  return return_val;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
gboolean
Packit Service fb6fa5
gdk_screen_get_setting (GdkScreen   *screen,
Packit Service fb6fa5
                        const gchar *name,
Packit Service fb6fa5
                        GValue      *value)
Packit Service fb6fa5
{
Packit Service fb6fa5
  return FALSE;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
void
Packit Service fb6fa5
gdk_display_add_client_message_filter (GdkDisplay   *display,
Packit Service fb6fa5
                                       GdkAtom       message_type,
Packit Service fb6fa5
                                       GdkFilterFunc func,
Packit Service fb6fa5
                                       gpointer      data)
Packit Service fb6fa5
{
Packit Service fb6fa5
  /* XXX: display should be used */
Packit Service fb6fa5
  GdkClientFilter *filter = g_new (GdkClientFilter, 1);
Packit Service fb6fa5
Packit Service fb6fa5
  filter->type = message_type;
Packit Service fb6fa5
  filter->function = func;
Packit Service fb6fa5
  filter->data = data;
Packit Service fb6fa5
  client_filters = g_list_append (client_filters, filter);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
Packit Service fb6fa5
void
Packit Service fb6fa5
gdk_add_client_message_filter (GdkAtom       message_type,
Packit Service fb6fa5
                               GdkFilterFunc func,
Packit Service fb6fa5
                               gpointer      data)
Packit Service fb6fa5
{
Packit Service fb6fa5
  gdk_display_add_client_message_filter (gdk_display_get_default (),
Packit Service fb6fa5
                                         message_type, func, data);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
void
Packit Service fb6fa5
gdk_screen_broadcast_client_message (GdkScreen *screen,
Packit Service fb6fa5
				     GdkEvent  *sev)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GdkWindow       *root_window;
Packit Service fb6fa5
  GdkWindowObject *private;
Packit Service fb6fa5
  GList           *top_level = NULL;
Packit Service fb6fa5
Packit Service fb6fa5
  g_return_if_fail (GDK_IS_SCREEN (screen));
Packit Service fb6fa5
  g_return_if_fail (sev != NULL);
Packit Service fb6fa5
Packit Service fb6fa5
  root_window = gdk_screen_get_root_window (screen);
Packit Service fb6fa5
Packit Service fb6fa5
  g_return_if_fail (GDK_IS_WINDOW (root_window));
Packit Service fb6fa5
Packit Service fb6fa5
  private = GDK_WINDOW_OBJECT (root_window);
Packit Service fb6fa5
Packit Service fb6fa5
  for (top_level = private->children; top_level; top_level = top_level->next)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      gdk_event_send_client_message_for_display (gdk_drawable_get_display (GDK_DRAWABLE (root_window)),
Packit Service fb6fa5
                                                 sev,
Packit Service fb6fa5
                                                 (guint32)(GDK_WINDOW_DFB_ID (GDK_WINDOW (top_level->data))));
Packit Service fb6fa5
    }
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
Packit Service fb6fa5
/**
Packit Service fb6fa5
 * gdk_net_wm_supports:
Packit Service fb6fa5
 * @property: a property atom.
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * This function is specific to the X11 backend of GDK, and indicates
Packit Service fb6fa5
 * whether the window manager for the default screen supports a certain
Packit Service fb6fa5
 * hint from the Extended Window Manager Hints Specification. See
Packit Service fb6fa5
 * gdk_x11_screen_supports_net_wm_hint() for complete details.
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Return value: %TRUE if the window manager supports @property
Packit Service fb6fa5
 **/
Packit Service fb6fa5
Packit Service fb6fa5
Packit Service fb6fa5
gboolean
Packit Service fb6fa5
gdk_net_wm_supports (GdkAtom property)
Packit Service fb6fa5
{
Packit Service fb6fa5
  return FALSE;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
void
Packit Service fb6fa5
_gdk_windowing_event_data_copy (const GdkEvent *src,
Packit Service fb6fa5
                                GdkEvent       *dst)
Packit Service fb6fa5
{
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
void
Packit Service fb6fa5
_gdk_windowing_event_data_free (GdkEvent *event)
Packit Service fb6fa5
{
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
#define __GDK_EVENTS_X11_C__
Packit Service fb6fa5
#include "gdkaliasdef.c"