Blame gdk/x11/gdkevents-x11.c

Packit Service fb6fa5
/* GDK - The GIMP Drawing Kit
Packit Service fb6fa5
 * Copyright (C) 1995-2007 Peter Mattis, Spencer Kimball,
Packit Service fb6fa5
 * Josh MacDonald, Ryan Lortie
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-2007.  See the AUTHORS
Packit Service fb6fa5
 * file for a list of people on the GTK+ Team.  See the ChangeLog
Packit Service fb6fa5
 * files for a list of changes.  These files are distributed with
Packit Service fb6fa5
 * GTK+ at ftp://ftp.gtk.org/pub/gtk/. 
Packit Service fb6fa5
 */
Packit Service fb6fa5
Packit Service fb6fa5
#include "config.h"
Packit Service fb6fa5
Packit Service fb6fa5
#include "gdk.h"
Packit Service fb6fa5
#include "gdkprivate-x11.h"
Packit Service fb6fa5
#include "gdkinternals.h"
Packit Service fb6fa5
#include "gdkx.h"
Packit Service fb6fa5
#include "gdkscreen-x11.h"
Packit Service fb6fa5
#include "gdkdisplay-x11.h"
Packit Service fb6fa5
#include "gdkasync.h"
Packit Service fb6fa5
Packit Service fb6fa5
#include "gdkkeysyms.h"
Packit Service fb6fa5
Packit Service fb6fa5
#include "xsettings-client.h"
Packit Service fb6fa5
Packit Service fb6fa5
#include <string.h>
Packit Service fb6fa5
Packit Service fb6fa5
#include "gdkinputprivate.h"
Packit Service fb6fa5
#include "gdksettings.c"
Packit Service fb6fa5
#include "gdkalias.h"
Packit Service fb6fa5
Packit Service fb6fa5
Packit Service fb6fa5
#ifdef HAVE_XKB
Packit Service fb6fa5
#include <X11/XKBlib.h>
Packit Service fb6fa5
#endif
Packit Service fb6fa5
Packit Service fb6fa5
#ifdef HAVE_XSYNC
Packit Service fb6fa5
#include <X11/extensions/sync.h>
Packit Service fb6fa5
#endif
Packit Service fb6fa5
Packit Service fb6fa5
#ifdef HAVE_XFIXES
Packit Service fb6fa5
#include <X11/extensions/Xfixes.h>
Packit Service fb6fa5
#endif
Packit Service fb6fa5
Packit Service fb6fa5
#ifdef HAVE_RANDR
Packit Service fb6fa5
#include <X11/extensions/Xrandr.h>
Packit Service fb6fa5
#endif
Packit Service fb6fa5
Packit Service fb6fa5
#include <X11/Xatom.h>
Packit Service fb6fa5
Packit Service fb6fa5
typedef struct _GdkIOClosure GdkIOClosure;
Packit Service fb6fa5
typedef struct _GdkDisplaySource GdkDisplaySource;
Packit Service fb6fa5
typedef struct _GdkEventTypeX11 GdkEventTypeX11;
Packit Service fb6fa5
Packit Service fb6fa5
struct _GdkIOClosure
Packit Service fb6fa5
{
Packit Service fb6fa5
  GdkInputFunction function;
Packit Service fb6fa5
  GdkInputCondition condition;
Packit Service fb6fa5
  GDestroyNotify notify;
Packit Service fb6fa5
  gpointer data;
Packit Service fb6fa5
};
Packit Service fb6fa5
Packit Service fb6fa5
struct _GdkDisplaySource
Packit Service fb6fa5
{
Packit Service fb6fa5
  GSource source;
Packit Service fb6fa5
  
Packit Service fb6fa5
  GdkDisplay *display;
Packit Service fb6fa5
  GPollFD event_poll_fd;
Packit Service fb6fa5
};
Packit Service fb6fa5
Packit Service fb6fa5
struct _GdkEventTypeX11
Packit Service fb6fa5
{
Packit Service fb6fa5
  gint base;
Packit Service fb6fa5
  gint n_events;
Packit Service fb6fa5
};
Packit Service fb6fa5
Packit Service fb6fa5
/* 
Packit Service fb6fa5
 * Private function declarations
Packit Service fb6fa5
 */
Packit Service fb6fa5
Packit Service fb6fa5
static gint	 gdk_event_apply_filters (XEvent   *xevent,
Packit Service fb6fa5
					  GdkEvent *event,
Packit Service fb6fa5
					  GdkWindow *window);
Packit Service fb6fa5
static gboolean	 gdk_event_translate	 (GdkDisplay *display,
Packit Service fb6fa5
					  GdkEvent   *event, 
Packit Service fb6fa5
					  XEvent     *xevent,
Packit Service fb6fa5
					  gboolean    return_exposes);
Packit Service fb6fa5
Packit Service fb6fa5
static gboolean gdk_event_prepare  (GSource     *source,
Packit Service fb6fa5
				    gint        *timeout);
Packit Service fb6fa5
static gboolean gdk_event_check    (GSource     *source);
Packit Service fb6fa5
static gboolean gdk_event_dispatch (GSource     *source,
Packit Service fb6fa5
				    GSourceFunc  callback,
Packit Service fb6fa5
				    gpointer     user_data);
Packit Service fb6fa5
Packit Service fb6fa5
static GdkFilterReturn gdk_wm_protocols_filter (GdkXEvent *xev,
Packit Service fb6fa5
						GdkEvent  *event,
Packit Service fb6fa5
						gpointer   data);
Packit Service fb6fa5
Packit Service fb6fa5
static GSource *gdk_display_source_new (GdkDisplay *display);
Packit Service fb6fa5
static gboolean gdk_check_xpending     (GdkDisplay *display);
Packit Service fb6fa5
Packit Service fb6fa5
static Bool gdk_xsettings_watch_cb  (Window            window,
Packit Service fb6fa5
				     Bool              is_start,
Packit Service fb6fa5
				     long              mask,
Packit Service fb6fa5
				     void             *cb_data);
Packit Service fb6fa5
static void gdk_xsettings_notify_cb (const char       *name,
Packit Service fb6fa5
				     XSettingsAction   action,
Packit Service fb6fa5
				     XSettingsSetting *setting,
Packit Service fb6fa5
				     void             *data);
Packit Service fb6fa5
Packit Service fb6fa5
/* Private variable declarations
Packit Service fb6fa5
 */
Packit Service fb6fa5
Packit Service fb6fa5
static GList *display_sources;
Packit Service fb6fa5
Packit Service fb6fa5
static GSourceFuncs event_funcs = {
Packit Service fb6fa5
  gdk_event_prepare,
Packit Service fb6fa5
  gdk_event_check,
Packit Service fb6fa5
  gdk_event_dispatch,
Packit Service fb6fa5
  NULL
Packit Service fb6fa5
};
Packit Service fb6fa5
Packit Service fb6fa5
static GSource *
Packit Service fb6fa5
gdk_display_source_new (GdkDisplay *display)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GSource *source = g_source_new (&event_funcs, sizeof (GdkDisplaySource));
Packit Service fb6fa5
  GdkDisplaySource *display_source = (GdkDisplaySource *)source;
Packit Service fb6fa5
  char *name;
Packit Service fb6fa5
  
Packit Service fb6fa5
  name = g_strdup_printf ("GDK X11 Event source (%s)",
Packit Service fb6fa5
			  gdk_display_get_name (display));
Packit Service fb6fa5
  g_source_set_name (source, name);
Packit Service fb6fa5
  g_free (name);
Packit Service fb6fa5
  display_source->display = display;
Packit Service fb6fa5
  
Packit Service fb6fa5
  return source;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static gboolean
Packit Service fb6fa5
gdk_check_xpending (GdkDisplay *display)
Packit Service fb6fa5
{
Packit Service fb6fa5
  return XPending (GDK_DISPLAY_XDISPLAY (display));
Packit Service fb6fa5
}
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 void
Packit Service fb6fa5
refcounted_grab_server (Display *xdisplay)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GdkDisplay *display = gdk_x11_lookup_xdisplay (xdisplay);
Packit Service fb6fa5
Packit Service fb6fa5
  gdk_x11_display_grab (display);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
refcounted_ungrab_server (Display *xdisplay)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GdkDisplay *display = gdk_x11_lookup_xdisplay (xdisplay);
Packit Service fb6fa5
  
Packit Service fb6fa5
  gdk_x11_display_ungrab (display);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
void
Packit Service fb6fa5
_gdk_x11_events_init_screen (GdkScreen *screen)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GdkScreenX11 *screen_x11 = GDK_SCREEN_X11 (screen);
Packit Service fb6fa5
Packit Service fb6fa5
  /* Keep a flag to avoid extra notifies that we don't need
Packit Service fb6fa5
   */
Packit Service fb6fa5
  screen_x11->xsettings_in_init = TRUE;
Packit Service fb6fa5
  screen_x11->xsettings_client = xsettings_client_new_with_grab_funcs (screen_x11->xdisplay,
Packit Service fb6fa5
						                       screen_x11->screen_num,
Packit Service fb6fa5
						                       gdk_xsettings_notify_cb,
Packit Service fb6fa5
						                       gdk_xsettings_watch_cb,
Packit Service fb6fa5
						                       screen,
Packit Service fb6fa5
                                                                       refcounted_grab_server,
Packit Service fb6fa5
                                                                       refcounted_ungrab_server);
Packit Service fb6fa5
  screen_x11->xsettings_in_init = FALSE;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
void
Packit Service fb6fa5
_gdk_x11_events_uninit_screen (GdkScreen *screen)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GdkScreenX11 *screen_x11 = GDK_SCREEN_X11 (screen);
Packit Service fb6fa5
Packit Service fb6fa5
  if (screen_x11->xsettings_client)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      xsettings_client_destroy (screen_x11->xsettings_client);
Packit Service fb6fa5
      screen_x11->xsettings_client = NULL;
Packit Service fb6fa5
    }
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
void 
Packit Service fb6fa5
_gdk_events_init (GdkDisplay *display)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GSource *source;
Packit Service fb6fa5
  GdkDisplaySource *display_source;
Packit Service fb6fa5
  GdkDisplayX11 *display_x11 = GDK_DISPLAY_X11 (display);
Packit Service fb6fa5
  
Packit Service fb6fa5
  int connection_number = ConnectionNumber (display_x11->xdisplay);
Packit Service fb6fa5
  GDK_NOTE (MISC, g_message ("connection number: %d", connection_number));
Packit Service fb6fa5
Packit Service fb6fa5
Packit Service fb6fa5
  source = display_x11->event_source = gdk_display_source_new (display);
Packit Service fb6fa5
  display_source = (GdkDisplaySource*) source;
Packit Service fb6fa5
  g_source_set_priority (source, GDK_PRIORITY_EVENTS);
Packit Service fb6fa5
  
Packit Service fb6fa5
  display_source->event_poll_fd.fd = connection_number;
Packit Service fb6fa5
  display_source->event_poll_fd.events = G_IO_IN;
Packit Service fb6fa5
  
Packit Service fb6fa5
  g_source_add_poll (source, &display_source->event_poll_fd);
Packit Service fb6fa5
  g_source_set_can_recurse (source, TRUE);
Packit Service fb6fa5
  g_source_attach (source, NULL);
Packit Service fb6fa5
Packit Service fb6fa5
  display_sources = g_list_prepend (display_sources,display_source);
Packit Service fb6fa5
Packit Service fb6fa5
  gdk_display_add_client_message_filter (display,
Packit Service fb6fa5
					 gdk_atom_intern_static_string ("WM_PROTOCOLS"), 
Packit Service fb6fa5
					 gdk_wm_protocols_filter,   
Packit Service fb6fa5
					 NULL);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
void
Packit Service fb6fa5
_gdk_events_uninit (GdkDisplay *display)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GdkDisplayX11 *display_x11 = GDK_DISPLAY_X11 (display);
Packit Service fb6fa5
Packit Service fb6fa5
  if (display_x11->event_source)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      display_sources = g_list_remove (display_sources,
Packit Service fb6fa5
                                       display_x11->event_source);
Packit Service fb6fa5
      g_source_destroy (display_x11->event_source);
Packit Service fb6fa5
      g_source_unref (display_x11->event_source);
Packit Service fb6fa5
      display_x11->event_source = NULL;
Packit Service fb6fa5
    }
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
/**
Packit Service fb6fa5
 * gdk_events_pending:
Packit Service fb6fa5
 * 
Packit Service fb6fa5
 * Checks if any events are ready to be processed for any display.
Packit Service fb6fa5
 * 
Packit Service fb6fa5
 * Return value:  %TRUE if any events are pending.
Packit Service fb6fa5
 **/
Packit Service fb6fa5
gboolean
Packit Service fb6fa5
gdk_events_pending (void)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GList *tmp_list;
Packit Service fb6fa5
Packit Service fb6fa5
  for (tmp_list = display_sources; tmp_list; tmp_list = tmp_list->next)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      GdkDisplaySource *tmp_source = tmp_list->data;
Packit Service fb6fa5
      GdkDisplay *display = tmp_source->display;
Packit Service fb6fa5
      
Packit Service fb6fa5
      if (_gdk_event_queue_find_first (display))
Packit Service fb6fa5
	return TRUE;
Packit Service fb6fa5
    }
Packit Service fb6fa5
Packit Service fb6fa5
  for (tmp_list = display_sources; tmp_list; tmp_list = tmp_list->next)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      GdkDisplaySource *tmp_source = tmp_list->data;
Packit Service fb6fa5
      GdkDisplay *display = tmp_source->display;
Packit Service fb6fa5
      
Packit Service fb6fa5
      if (gdk_check_xpending (display))
Packit Service fb6fa5
	return TRUE;
Packit Service fb6fa5
    }
Packit Service fb6fa5
  
Packit Service fb6fa5
  return FALSE;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static Bool
Packit Service fb6fa5
graphics_expose_predicate (Display  *display,
Packit Service fb6fa5
			   XEvent   *xevent,
Packit Service fb6fa5
			   XPointer  arg)
Packit Service fb6fa5
{
Packit Service fb6fa5
  if (xevent->xany.window == GDK_DRAWABLE_XID ((GdkDrawable *)arg) &&
Packit Service fb6fa5
      (xevent->xany.type == GraphicsExpose ||
Packit Service fb6fa5
       xevent->xany.type == NoExpose))
Packit Service fb6fa5
    return True;
Packit Service fb6fa5
  else
Packit Service fb6fa5
    return False;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
/**
Packit Service fb6fa5
 * gdk_event_get_graphics_expose:
Packit Service fb6fa5
 * @window: the #GdkWindow to wait for the events for.
Packit Service fb6fa5
 * 
Packit Service fb6fa5
 * Waits for a GraphicsExpose or NoExpose event from the X server.
Packit Service fb6fa5
 * This is used in the #GtkText and #GtkCList widgets in GTK+ to make sure any
Packit Service fb6fa5
 * GraphicsExpose events are handled before the widget is scrolled.
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Return value:  a #GdkEventExpose if a GraphicsExpose was received, or %NULL if a
Packit Service fb6fa5
 * NoExpose event was received.
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Deprecated: 2.18:
Packit Service fb6fa5
 **/
Packit Service fb6fa5
GdkEvent*
Packit Service fb6fa5
gdk_event_get_graphics_expose (GdkWindow *window)
Packit Service fb6fa5
{
Packit Service fb6fa5
  XEvent xevent;
Packit Service fb6fa5
  GdkEvent *event;
Packit Service fb6fa5
  
Packit Service fb6fa5
  g_return_val_if_fail (window != NULL, NULL);
Packit Service fb6fa5
Packit Service fb6fa5
  XIfEvent (GDK_WINDOW_XDISPLAY (window), &xevent, 
Packit Service fb6fa5
	    graphics_expose_predicate, (XPointer) window);
Packit Service fb6fa5
  
Packit Service fb6fa5
  if (xevent.xany.type == GraphicsExpose)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      event = gdk_event_new (GDK_NOTHING);
Packit Service fb6fa5
      
Packit Service fb6fa5
      if (gdk_event_translate (GDK_WINDOW_DISPLAY (window), event,
Packit Service fb6fa5
			       &xevent, TRUE))
Packit Service fb6fa5
	return event;
Packit Service fb6fa5
      else
Packit Service fb6fa5
	gdk_event_free (event);
Packit Service fb6fa5
    }
Packit Service fb6fa5
  
Packit Service fb6fa5
  return NULL;	
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static gint
Packit Service fb6fa5
gdk_event_apply_filters (XEvent *xevent,
Packit Service fb6fa5
			 GdkEvent *event,
Packit Service fb6fa5
			 GdkWindow *window)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GList *tmp_list;
Packit Service fb6fa5
  GdkFilterReturn result;
Packit Service fb6fa5
  
Packit Service fb6fa5
  if (window == NULL)
Packit Service fb6fa5
    tmp_list = _gdk_default_filters;
Packit Service fb6fa5
  else
Packit Service fb6fa5
    {
Packit Service fb6fa5
      GdkWindowObject *window_private;
Packit Service fb6fa5
      window_private = (GdkWindowObject *) window;
Packit Service fb6fa5
      tmp_list = window_private->filters;
Packit Service fb6fa5
    }
Packit Service fb6fa5
Packit Service fb6fa5
  
Packit Service fb6fa5
  while (tmp_list)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      GdkEventFilter *filter = (GdkEventFilter*) tmp_list->data;
Packit Service fb6fa5
      GList *node;
Packit Service fb6fa5
      
Packit Service fb6fa5
      if ((filter->flags & GDK_EVENT_FILTER_REMOVED) != 0)
Packit Service fb6fa5
        {
Packit Service fb6fa5
          tmp_list = tmp_list->next;
Packit Service fb6fa5
          continue;
Packit Service fb6fa5
        }
Packit Service fb6fa5
Packit Service fb6fa5
      filter->ref_count++;
Packit Service fb6fa5
      result = filter->function (xevent, event, filter->data);
Packit Service fb6fa5
Packit Service fb6fa5
      /* Protect against unreffing the filter mutating the list */
Packit Service fb6fa5
      node = tmp_list->next;
Packit Service fb6fa5
Packit Service fb6fa5
      _gdk_event_filter_unref (window, filter);
Packit Service fb6fa5
Packit Service fb6fa5
      tmp_list = node;
Packit Service fb6fa5
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
/**
Packit Service fb6fa5
 * gdk_display_add_client_message_filter:
Packit Service fb6fa5
 * @display: a #GdkDisplay for which this message filter applies
Packit Service fb6fa5
 * @message_type: the type of ClientMessage events to receive.
Packit Service fb6fa5
 *   This will be checked against the @message_type field 
Packit Service fb6fa5
 *   of the XClientMessage event struct.
Packit Service fb6fa5
 * @func: the function to call to process the event.
Packit Service fb6fa5
 * @data: user data to pass to @func.
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Adds a filter to be called when X ClientMessage events are received.
Packit Service fb6fa5
 * See gdk_window_add_filter() if you are interested in filtering other
Packit Service fb6fa5
 * types of events.
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Since: 2.2
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
  GdkClientFilter *filter;
Packit Service fb6fa5
  g_return_if_fail (GDK_IS_DISPLAY (display));
Packit Service fb6fa5
  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
  
Packit Service fb6fa5
  GDK_DISPLAY_X11(display)->client_filters = 
Packit Service fb6fa5
    g_list_append (GDK_DISPLAY_X11 (display)->client_filters,
Packit Service fb6fa5
		   filter);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
/**
Packit Service fb6fa5
 * gdk_add_client_message_filter:
Packit Service fb6fa5
 * @message_type: the type of ClientMessage events to receive. This will be
Packit Service fb6fa5
 *     checked against the <structfield>message_type</structfield> field of the
Packit Service fb6fa5
 *     XClientMessage event struct.
Packit Service fb6fa5
 * @func: the function to call to process the event.
Packit Service fb6fa5
 * @data: user data to pass to @func. 
Packit Service fb6fa5
 * 
Packit Service fb6fa5
 * Adds a filter to the default display to be called when X ClientMessage events
Packit Service fb6fa5
 * are received. See gdk_display_add_client_message_filter().
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
static void
Packit Service fb6fa5
do_net_wm_state_changes (GdkWindow *window)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GdkToplevelX11 *toplevel = _gdk_x11_window_get_toplevel (window);
Packit Service fb6fa5
  GdkWindowState old_state;
Packit Service fb6fa5
  
Packit Service fb6fa5
  if (GDK_WINDOW_DESTROYED (window) ||
Packit Service fb6fa5
      gdk_window_get_window_type (window) != GDK_WINDOW_TOPLEVEL)
Packit Service fb6fa5
    return;
Packit Service fb6fa5
  
Packit Service fb6fa5
  old_state = gdk_window_get_state (window);
Packit Service fb6fa5
Packit Service fb6fa5
  /* For found_sticky to remain TRUE, we have to also be on desktop
Packit Service fb6fa5
   * 0xFFFFFFFF
Packit Service fb6fa5
   */
Packit Service fb6fa5
  if (old_state & GDK_WINDOW_STATE_STICKY)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      if (!(toplevel->have_sticky && toplevel->on_all_desktops))
Packit Service fb6fa5
        gdk_synthesize_window_state (window,
Packit Service fb6fa5
                                     GDK_WINDOW_STATE_STICKY,
Packit Service fb6fa5
                                     0);
Packit Service fb6fa5
    }
Packit Service fb6fa5
  else
Packit Service fb6fa5
    {
Packit Service fb6fa5
      if (toplevel->have_sticky && toplevel->on_all_desktops)
Packit Service fb6fa5
        gdk_synthesize_window_state (window,
Packit Service fb6fa5
                                     0,
Packit Service fb6fa5
                                     GDK_WINDOW_STATE_STICKY);
Packit Service fb6fa5
    }
Packit Service fb6fa5
Packit Service fb6fa5
  if (old_state & GDK_WINDOW_STATE_FULLSCREEN)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      if (!toplevel->have_fullscreen)
Packit Service fb6fa5
        gdk_synthesize_window_state (window,
Packit Service fb6fa5
                                     GDK_WINDOW_STATE_FULLSCREEN,
Packit Service fb6fa5
                                     0);
Packit Service fb6fa5
    }
Packit Service fb6fa5
  else
Packit Service fb6fa5
    {
Packit Service fb6fa5
      if (toplevel->have_fullscreen)
Packit Service fb6fa5
        gdk_synthesize_window_state (window,
Packit Service fb6fa5
                                     0,
Packit Service fb6fa5
                                     GDK_WINDOW_STATE_FULLSCREEN);
Packit Service fb6fa5
    }
Packit Service fb6fa5
  
Packit Service fb6fa5
  /* Our "maximized" means both vertical and horizontal; if only one,
Packit Service fb6fa5
   * we don't expose that via GDK
Packit Service fb6fa5
   */
Packit Service fb6fa5
  if (old_state & GDK_WINDOW_STATE_MAXIMIZED)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      if (!(toplevel->have_maxvert && toplevel->have_maxhorz))
Packit Service fb6fa5
        gdk_synthesize_window_state (window,
Packit Service fb6fa5
                                     GDK_WINDOW_STATE_MAXIMIZED,
Packit Service fb6fa5
                                     0);
Packit Service fb6fa5
    }
Packit Service fb6fa5
  else
Packit Service fb6fa5
    {
Packit Service fb6fa5
      if (toplevel->have_maxvert && toplevel->have_maxhorz)
Packit Service fb6fa5
        gdk_synthesize_window_state (window,
Packit Service fb6fa5
                                     0,
Packit Service fb6fa5
                                     GDK_WINDOW_STATE_MAXIMIZED);
Packit Service fb6fa5
    }
Packit Service fb6fa5
Packit Service fb6fa5
  if (old_state & GDK_WINDOW_STATE_ICONIFIED)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      if (!toplevel->have_hidden)
Packit Service fb6fa5
        gdk_synthesize_window_state (window,
Packit Service fb6fa5
                                     GDK_WINDOW_STATE_ICONIFIED,
Packit Service fb6fa5
                                     0);
Packit Service fb6fa5
    }
Packit Service fb6fa5
  else
Packit Service fb6fa5
    {
Packit Service fb6fa5
      if (toplevel->have_hidden)
Packit Service fb6fa5
        gdk_synthesize_window_state (window,
Packit Service fb6fa5
                                     0,
Packit Service fb6fa5
                                     GDK_WINDOW_STATE_ICONIFIED);
Packit Service fb6fa5
    }
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
gdk_check_wm_desktop_changed (GdkWindow *window)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GdkToplevelX11 *toplevel = _gdk_x11_window_get_toplevel (window);
Packit Service fb6fa5
  GdkDisplay *display = GDK_WINDOW_DISPLAY (window);
Packit Service fb6fa5
Packit Service fb6fa5
  Atom type;
Packit Service fb6fa5
  gint format;
Packit Service fb6fa5
  gulong nitems;
Packit Service fb6fa5
  gulong bytes_after;
Packit Service fb6fa5
  guchar *data;
Packit Service fb6fa5
  gulong *desktop;
Packit Service fb6fa5
Packit Service fb6fa5
  type = None;
Packit Service fb6fa5
  gdk_error_trap_push ();
Packit Service fb6fa5
  XGetWindowProperty (GDK_DISPLAY_XDISPLAY (display), 
Packit Service fb6fa5
                      GDK_WINDOW_XID (window),
Packit Service fb6fa5
                      gdk_x11_get_xatom_by_name_for_display (display, "_NET_WM_DESKTOP"),
Packit Service fb6fa5
                      0, G_MAXLONG, False, XA_CARDINAL, &type, 
Packit Service fb6fa5
                      &format, &nitems,
Packit Service fb6fa5
                      &bytes_after, &data);
Packit Service fb6fa5
  gdk_error_trap_pop ();
Packit Service fb6fa5
Packit Service fb6fa5
  if (type != None)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      desktop = (gulong *)data;
Packit Service fb6fa5
      toplevel->on_all_desktops = ((*desktop & 0xFFFFFFFF) == 0xFFFFFFFF);
Packit Service fb6fa5
      XFree (desktop);
Packit Service fb6fa5
    }
Packit Service fb6fa5
  else
Packit Service fb6fa5
    toplevel->on_all_desktops = FALSE;
Packit Service fb6fa5
      
Packit Service fb6fa5
  do_net_wm_state_changes (window);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
gdk_check_wm_state_changed (GdkWindow *window)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GdkToplevelX11 *toplevel = _gdk_x11_window_get_toplevel (window);
Packit Service fb6fa5
  GdkDisplay *display = GDK_WINDOW_DISPLAY (window);
Packit Service fb6fa5
  
Packit Service fb6fa5
  Atom type;
Packit Service fb6fa5
  gint format;
Packit Service fb6fa5
  gulong nitems;
Packit Service fb6fa5
  gulong bytes_after;
Packit Service fb6fa5
  guchar *data;
Packit Service fb6fa5
  Atom *atoms = NULL;
Packit Service fb6fa5
  gulong i;
Packit Service fb6fa5
Packit Service fb6fa5
  gboolean had_sticky = toplevel->have_sticky;
Packit Service fb6fa5
Packit Service fb6fa5
  toplevel->have_sticky = FALSE;
Packit Service fb6fa5
  toplevel->have_maxvert = FALSE;
Packit Service fb6fa5
  toplevel->have_maxhorz = FALSE;
Packit Service fb6fa5
  toplevel->have_fullscreen = FALSE;
Packit Service fb6fa5
  toplevel->have_hidden = FALSE;
Packit Service fb6fa5
Packit Service fb6fa5
  type = None;
Packit Service fb6fa5
  gdk_error_trap_push ();
Packit Service fb6fa5
  XGetWindowProperty (GDK_DISPLAY_XDISPLAY (display), GDK_WINDOW_XID (window),
Packit Service fb6fa5
		      gdk_x11_get_xatom_by_name_for_display (display, "_NET_WM_STATE"),
Packit Service fb6fa5
		      0, G_MAXLONG, False, XA_ATOM, &type, &format, &nitems,
Packit Service fb6fa5
		      &bytes_after, &data);
Packit Service fb6fa5
  gdk_error_trap_pop ();
Packit Service fb6fa5
Packit Service fb6fa5
  if (type != None)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      Atom sticky_atom = gdk_x11_get_xatom_by_name_for_display (display, "_NET_WM_STATE_STICKY");
Packit Service fb6fa5
      Atom maxvert_atom = gdk_x11_get_xatom_by_name_for_display (display, "_NET_WM_STATE_MAXIMIZED_VERT");
Packit Service fb6fa5
      Atom maxhorz_atom	= gdk_x11_get_xatom_by_name_for_display (display, "_NET_WM_STATE_MAXIMIZED_HORZ");
Packit Service fb6fa5
      Atom fullscreen_atom = gdk_x11_get_xatom_by_name_for_display (display, "_NET_WM_STATE_FULLSCREEN");
Packit Service fb6fa5
      Atom hidden_atom = gdk_x11_get_xatom_by_name_for_display (display, "_NET_WM_STATE_HIDDEN");
Packit Service fb6fa5
Packit Service fb6fa5
      atoms = (Atom *)data;
Packit Service fb6fa5
Packit Service fb6fa5
      i = 0;
Packit Service fb6fa5
      while (i < nitems)
Packit Service fb6fa5
        {
Packit Service fb6fa5
          if (atoms[i] == sticky_atom)
Packit Service fb6fa5
            toplevel->have_sticky = TRUE;
Packit Service fb6fa5
          else if (atoms[i] == maxvert_atom)
Packit Service fb6fa5
            toplevel->have_maxvert = TRUE;
Packit Service fb6fa5
          else if (atoms[i] == maxhorz_atom)
Packit Service fb6fa5
            toplevel->have_maxhorz = TRUE;
Packit Service fb6fa5
          else if (atoms[i] == fullscreen_atom)
Packit Service fb6fa5
            toplevel->have_fullscreen = TRUE;
Packit Service fb6fa5
          else if (atoms[i] == hidden_atom)
Packit Service fb6fa5
            toplevel->have_hidden = TRUE;
Packit Service fb6fa5
          
Packit Service fb6fa5
          ++i;
Packit Service fb6fa5
        }
Packit Service fb6fa5
Packit Service fb6fa5
      XFree (atoms);
Packit Service fb6fa5
    }
Packit Service fb6fa5
Packit Service fb6fa5
  /* When have_sticky is turned on, we have to check the DESKTOP property
Packit Service fb6fa5
   * as well.
Packit Service fb6fa5
   */
Packit Service fb6fa5
  if (toplevel->have_sticky && !had_sticky)
Packit Service fb6fa5
    gdk_check_wm_desktop_changed (window);
Packit Service fb6fa5
  else
Packit Service fb6fa5
    do_net_wm_state_changes (window);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
#define HAS_FOCUS(toplevel)                           \
Packit Service fb6fa5
  ((toplevel)->has_focus || (toplevel)->has_pointer_focus)
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
generate_focus_event (GdkWindow *window,
Packit Service fb6fa5
		      gboolean   in)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GdkEvent event;
Packit Service fb6fa5
  
Packit Service fb6fa5
  event.type = GDK_FOCUS_CHANGE;
Packit Service fb6fa5
  event.focus_change.window = window;
Packit Service fb6fa5
  event.focus_change.send_event = FALSE;
Packit Service fb6fa5
  event.focus_change.in = in;
Packit Service fb6fa5
  
Packit Service fb6fa5
  gdk_event_put (&event);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static gboolean
Packit Service fb6fa5
set_screen_from_root (GdkDisplay *display,
Packit Service fb6fa5
		      GdkEvent   *event,
Packit Service fb6fa5
		      Window      xrootwin)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GdkScreen *screen;
Packit Service fb6fa5
Packit Service fb6fa5
  screen = _gdk_x11_display_screen_for_xrootwin (display, xrootwin);
Packit Service fb6fa5
Packit Service fb6fa5
  if (screen)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      gdk_event_set_screen (event, screen);
Packit Service fb6fa5
Packit Service fb6fa5
      return TRUE;
Packit Service fb6fa5
    }
Packit Service fb6fa5
  
Packit Service fb6fa5
  return FALSE;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
translate_key_event (GdkDisplay *display,
Packit Service fb6fa5
		     GdkEvent   *event,
Packit Service fb6fa5
		     XEvent     *xevent)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GdkKeymap *keymap = gdk_keymap_get_for_display (display);
Packit Service fb6fa5
  gunichar c = 0;
Packit Service fb6fa5
  gchar buf[7];
Packit Service fb6fa5
  GdkModifierType consumed, state;
Packit Service fb6fa5
Packit Service fb6fa5
  event->key.type = xevent->xany.type == KeyPress ? GDK_KEY_PRESS : GDK_KEY_RELEASE;
Packit Service fb6fa5
  event->key.time = xevent->xkey.time;
Packit Service fb6fa5
Packit Service fb6fa5
  event->key.state = (GdkModifierType) xevent->xkey.state;
Packit Service fb6fa5
  event->key.group = _gdk_x11_get_group_for_state (display, xevent->xkey.state);
Packit Service fb6fa5
  event->key.hardware_keycode = xevent->xkey.keycode;
Packit Service fb6fa5
Packit Service fb6fa5
  event->key.keyval = GDK_VoidSymbol;
Packit Service fb6fa5
Packit Service fb6fa5
  gdk_keymap_translate_keyboard_state (keymap,
Packit Service fb6fa5
				       event->key.hardware_keycode,
Packit Service fb6fa5
				       event->key.state,
Packit Service fb6fa5
				       event->key.group,
Packit Service fb6fa5
				       &event->key.keyval,
Packit Service fb6fa5
                                       NULL, NULL, &consumed);
Packit Service fb6fa5
   state = event->key.state & ~consumed;
Packit Service fb6fa5
   _gdk_keymap_add_virtual_modifiers_compat (keymap, &state);
Packit Service fb6fa5
   event->key.state |= state;
Packit Service fb6fa5
Packit Service fb6fa5
  event->key.is_modifier = _gdk_keymap_key_is_modifier (keymap, event->key.hardware_keycode);
Packit Service fb6fa5
Packit Service fb6fa5
  /* Fill in event->string crudely, since various programs
Packit Service fb6fa5
   * depend on it.
Packit Service fb6fa5
   */
Packit Service fb6fa5
  event->key.string = NULL;
Packit Service fb6fa5
  
Packit Service fb6fa5
  if (event->key.keyval != GDK_VoidSymbol)
Packit Service fb6fa5
    c = gdk_keyval_to_unicode (event->key.keyval);
Packit Service fb6fa5
Packit Service fb6fa5
  if (c)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      gsize bytes_written;
Packit Service fb6fa5
      gint len;
Packit Service fb6fa5
Packit Service fb6fa5
      /* Apply the control key - Taken from Xlib
Packit Service fb6fa5
       */
Packit Service fb6fa5
      if (event->key.state & GDK_CONTROL_MASK)
Packit Service fb6fa5
	{
Packit Service fb6fa5
	  if ((c >= '@' && c < '\177') || c == ' ') c &= 0x1F;
Packit Service fb6fa5
	  else if (c == '2')
Packit Service fb6fa5
	    {
Packit Service fb6fa5
	      event->key.string = g_memdup ("\0\0", 2);
Packit Service fb6fa5
	      event->key.length = 1;
Packit Service fb6fa5
	      buf[0] = '\0';
Packit Service fb6fa5
	      goto out;
Packit Service fb6fa5
	    }
Packit Service fb6fa5
	  else if (c >= '3' && c <= '7') c -= ('3' - '\033');
Packit Service fb6fa5
	  else if (c == '8') c = '\177';
Packit Service fb6fa5
	  else if (c == '/') c = '_' & 0x1F;
Packit Service fb6fa5
	}
Packit Service fb6fa5
      
Packit Service fb6fa5
      len = g_unichar_to_utf8 (c, buf);
Packit Service fb6fa5
      buf[len] = '\0';
Packit Service fb6fa5
      
Packit Service fb6fa5
      event->key.string = g_locale_from_utf8 (buf, len,
Packit Service fb6fa5
					      NULL, &bytes_written,
Packit Service fb6fa5
					      NULL);
Packit Service fb6fa5
      if (event->key.string)
Packit Service fb6fa5
	event->key.length = bytes_written;
Packit Service fb6fa5
    }
Packit Service fb6fa5
  else if (event->key.keyval == GDK_Escape)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      event->key.length = 1;
Packit Service fb6fa5
      event->key.string = g_strdup ("\033");
Packit Service fb6fa5
    }
Packit Service fb6fa5
  else if (event->key.keyval == GDK_Return ||
Packit Service fb6fa5
	  event->key.keyval == GDK_KP_Enter)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      event->key.length = 1;
Packit Service fb6fa5
      event->key.string = g_strdup ("\r");
Packit Service fb6fa5
    }
Packit Service fb6fa5
Packit Service fb6fa5
  if (!event->key.string)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      event->key.length = 0;
Packit Service fb6fa5
      event->key.string = g_strdup ("");
Packit Service fb6fa5
    }
Packit Service fb6fa5
  
Packit Service fb6fa5
 out:
Packit Service fb6fa5
#ifdef G_ENABLE_DEBUG
Packit Service fb6fa5
  if (_gdk_debug_flags & GDK_DEBUG_EVENTS)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      g_message ("%s:\t\twindow: %ld	 key: %12s  %d",
Packit Service fb6fa5
		 event->type == GDK_KEY_PRESS ? "key press  " : "key release",
Packit Service fb6fa5
		 xevent->xkey.window,
Packit Service fb6fa5
		 event->key.keyval ? gdk_keyval_name (event->key.keyval) : "(none)",
Packit Service fb6fa5
		 event->key.keyval);
Packit Service fb6fa5
  
Packit Service fb6fa5
      if (event->key.length > 0)
Packit Service fb6fa5
	g_message ("\t\tlength: %4d string: \"%s\"",
Packit Service fb6fa5
		   event->key.length, buf);
Packit Service fb6fa5
    }
Packit Service fb6fa5
#endif /* G_ENABLE_DEBUG */  
Packit Service fb6fa5
  return;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
/**
Packit Service fb6fa5
 * gdk_x11_register_standard_event_type:
Packit Service fb6fa5
 * @display: a #GdkDisplay
Packit Service fb6fa5
 * @event_base: first event type code to register
Packit Service fb6fa5
 * @n_events: number of event type codes to register
Packit Service fb6fa5
 * 
Packit Service fb6fa5
 * Registers interest in receiving extension events with type codes
Packit Service fb6fa5
 * between @event_base and <literal>event_base + n_events - 1</literal>.
Packit Service fb6fa5
 * The registered events must have the window field in the same place
Packit Service fb6fa5
 * as core X events (this is not the case for e.g. XKB extension events).
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * If an event type is registered, events of this type will go through
Packit Service fb6fa5
 * global and window-specific filters (see gdk_window_add_filter()). 
Packit Service fb6fa5
 * Unregistered events will only go through global filters.
Packit Service fb6fa5
 * GDK may register the events of some X extensions on its own.
Packit Service fb6fa5
 * 
Packit Service fb6fa5
 * This function should only be needed in unusual circumstances, e.g.
Packit Service fb6fa5
 * when filtering XInput extension events on the root window.
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Since: 2.4
Packit Service fb6fa5
 **/
Packit Service fb6fa5
void
Packit Service fb6fa5
gdk_x11_register_standard_event_type (GdkDisplay          *display,
Packit Service fb6fa5
				      gint                 event_base,
Packit Service fb6fa5
				      gint                 n_events)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GdkEventTypeX11 *event_type;
Packit Service fb6fa5
  GdkDisplayX11 *display_x11;
Packit Service fb6fa5
Packit Service fb6fa5
  display_x11 = GDK_DISPLAY_X11 (display);
Packit Service fb6fa5
  event_type = g_new (GdkEventTypeX11, 1);
Packit Service fb6fa5
Packit Service fb6fa5
  event_type->base = event_base;
Packit Service fb6fa5
  event_type->n_events = n_events;
Packit Service fb6fa5
Packit Service fb6fa5
  display_x11->event_types = g_slist_prepend (display_x11->event_types, event_type);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
/* Return the window this has to do with, if any, rather
Packit Service fb6fa5
 * than the frame or root window that was selecting
Packit Service fb6fa5
 * for substructure
Packit Service fb6fa5
 */
Packit Service fb6fa5
static void
Packit Service fb6fa5
get_real_window (GdkDisplay *display,
Packit Service fb6fa5
		 XEvent     *event,
Packit Service fb6fa5
		 Window     *event_window,
Packit Service fb6fa5
		 Window     *filter_window)
Packit Service fb6fa5
{
Packit Service fb6fa5
  /* Core events all have an event->xany.window field, but that's
Packit Service fb6fa5
   * not true for extension events
Packit Service fb6fa5
   */
Packit Service fb6fa5
  if (event->type >= KeyPress &&
Packit Service fb6fa5
      event->type <= MappingNotify)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      *filter_window = event->xany.window;
Packit Service fb6fa5
      switch (event->type)
Packit Service fb6fa5
	{      
Packit Service fb6fa5
	case CreateNotify:
Packit Service fb6fa5
	  *event_window = event->xcreatewindow.window;
Packit Service fb6fa5
	  break;
Packit Service fb6fa5
	case DestroyNotify:
Packit Service fb6fa5
	  *event_window = event->xdestroywindow.window;
Packit Service fb6fa5
	  break;
Packit Service fb6fa5
	case UnmapNotify:
Packit Service fb6fa5
	  *event_window = event->xunmap.window;
Packit Service fb6fa5
	  break;
Packit Service fb6fa5
	case MapNotify:
Packit Service fb6fa5
	  *event_window = event->xmap.window;
Packit Service fb6fa5
	  break;
Packit Service fb6fa5
	case MapRequest:
Packit Service fb6fa5
	  *event_window = event->xmaprequest.window;
Packit Service fb6fa5
	  break;
Packit Service fb6fa5
	case ReparentNotify:
Packit Service fb6fa5
	  *event_window = event->xreparent.window;
Packit Service fb6fa5
	  break;
Packit Service fb6fa5
	case ConfigureNotify:
Packit Service fb6fa5
	  *event_window = event->xconfigure.window;
Packit Service fb6fa5
	  break;
Packit Service fb6fa5
	case ConfigureRequest:
Packit Service fb6fa5
	  *event_window = event->xconfigurerequest.window;
Packit Service fb6fa5
	  break;
Packit Service fb6fa5
	case GravityNotify:
Packit Service fb6fa5
	  *event_window = event->xgravity.window;
Packit Service fb6fa5
	  break;
Packit Service fb6fa5
	case CirculateNotify:
Packit Service fb6fa5
	  *event_window = event->xcirculate.window;
Packit Service fb6fa5
	  break;
Packit Service fb6fa5
	case CirculateRequest:
Packit Service fb6fa5
	  *event_window = event->xcirculaterequest.window;
Packit Service fb6fa5
	  break;
Packit Service fb6fa5
	default:
Packit Service fb6fa5
	  *event_window = event->xany.window;
Packit Service fb6fa5
	}
Packit Service fb6fa5
    }
Packit Service fb6fa5
  else
Packit Service fb6fa5
    {
Packit Service fb6fa5
      GdkDisplayX11 *display_x11 = GDK_DISPLAY_X11 (display);
Packit Service fb6fa5
      GSList *tmp_list;
Packit Service fb6fa5
Packit Service fb6fa5
      for (tmp_list = display_x11->event_types;
Packit Service fb6fa5
	   tmp_list;
Packit Service fb6fa5
	   tmp_list = tmp_list->next)
Packit Service fb6fa5
	{
Packit Service fb6fa5
	  GdkEventTypeX11 *event_type = tmp_list->data;
Packit Service fb6fa5
Packit Service fb6fa5
	  if (event->type >= event_type->base &&
Packit Service fb6fa5
	      event->type < event_type->base + event_type->n_events)
Packit Service fb6fa5
	    {
Packit Service fb6fa5
	      *event_window = event->xany.window;
Packit Service fb6fa5
	      *filter_window = event->xany.window;
Packit Service fb6fa5
	      return;
Packit Service fb6fa5
	    }
Packit Service fb6fa5
	}
Packit Service fb6fa5
	   
Packit Service fb6fa5
      *event_window = None;
Packit Service fb6fa5
      *filter_window = None;
Packit Service fb6fa5
    }
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
#ifdef G_ENABLE_DEBUG
Packit Service fb6fa5
static const char notify_modes[][19] = {
Packit Service fb6fa5
  "NotifyNormal",
Packit Service fb6fa5
  "NotifyGrab",
Packit Service fb6fa5
  "NotifyUngrab",
Packit Service fb6fa5
  "NotifyWhileGrabbed"
Packit Service fb6fa5
};
Packit Service fb6fa5
Packit Service fb6fa5
static const char notify_details[][23] = {
Packit Service fb6fa5
  "NotifyAncestor",
Packit Service fb6fa5
  "NotifyVirtual",
Packit Service fb6fa5
  "NotifyInferior",
Packit Service fb6fa5
  "NotifyNonlinear",
Packit Service fb6fa5
  "NotifyNonlinearVirtual",
Packit Service fb6fa5
  "NotifyPointer",
Packit Service fb6fa5
  "NotifyPointerRoot",
Packit Service fb6fa5
  "NotifyDetailNone"
Packit Service fb6fa5
};
Packit Service fb6fa5
#endif
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
set_user_time (GdkWindow *window,
Packit Service fb6fa5
	       GdkEvent  *event)
Packit Service fb6fa5
{
Packit Service fb6fa5
  g_return_if_fail (event != NULL);
Packit Service fb6fa5
Packit Service fb6fa5
  window = gdk_window_get_toplevel (event->client.window);
Packit Service fb6fa5
  g_return_if_fail (GDK_IS_WINDOW (window));
Packit Service fb6fa5
Packit Service fb6fa5
  /* If an event doesn't have a valid timestamp, we shouldn't use it
Packit Service fb6fa5
   * to update the latest user interaction time.
Packit Service fb6fa5
   */
Packit Service fb6fa5
  if (gdk_event_get_time (event) != GDK_CURRENT_TIME)
Packit Service fb6fa5
    gdk_x11_window_set_user_time (gdk_window_get_toplevel (window),
Packit Service fb6fa5
                                  gdk_event_get_time (event));
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static gboolean
Packit Service fb6fa5
is_parent_of (GdkWindow *parent,
Packit Service fb6fa5
              GdkWindow *child)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GdkWindow *w;
Packit Service fb6fa5
Packit Service fb6fa5
  w = child;
Packit Service fb6fa5
  while (w != NULL)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      if (w == parent)
Packit Service fb6fa5
	return TRUE;
Packit Service fb6fa5
Packit Service fb6fa5
      w = gdk_window_get_parent (w);
Packit Service fb6fa5
    }
Packit Service fb6fa5
Packit Service fb6fa5
  return FALSE;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static gboolean
Packit Service fb6fa5
gdk_event_translate (GdkDisplay *display,
Packit Service fb6fa5
		     GdkEvent   *event,
Packit Service fb6fa5
		     XEvent     *xevent,
Packit Service fb6fa5
		     gboolean    return_exposes)
Packit Service fb6fa5
{
Packit Service fb6fa5
  
Packit Service fb6fa5
  GdkWindow *window;
Packit Service fb6fa5
  GdkWindowObject *window_private;
Packit Service fb6fa5
  GdkWindow *filter_window;
Packit Service fb6fa5
  GdkWindowImplX11 *window_impl = NULL;
Packit Service fb6fa5
  gboolean return_val;
Packit Service fb6fa5
  GdkScreen *screen = NULL;
Packit Service fb6fa5
  GdkScreenX11 *screen_x11 = NULL;
Packit Service fb6fa5
  GdkToplevelX11 *toplevel = NULL;
Packit Service fb6fa5
  GdkDisplayX11 *display_x11 = GDK_DISPLAY_X11 (display);
Packit Service fb6fa5
  Window xwindow, filter_xwindow;
Packit Service fb6fa5
  
Packit Service fb6fa5
  return_val = FALSE;
Packit Service fb6fa5
Packit Service fb6fa5
  /* init these, since the done: block uses them */
Packit Service fb6fa5
  window = NULL;
Packit Service fb6fa5
  window_private = NULL;
Packit Service fb6fa5
  event->any.window = NULL;
Packit Service fb6fa5
Packit Service fb6fa5
  if (_gdk_default_filters)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      /* Apply global filters */
Packit Service fb6fa5
      GdkFilterReturn result;
Packit Service fb6fa5
      result = gdk_event_apply_filters (xevent, event, NULL);
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
  /* Find the GdkWindow that this event relates to.
Packit Service fb6fa5
   * Basically this means substructure events
Packit Service fb6fa5
   * are reported same as structure events
Packit Service fb6fa5
   */
Packit Service fb6fa5
  get_real_window (display, xevent, &xwindow, &filter_xwindow);
Packit Service fb6fa5
  
Packit Service fb6fa5
  window = gdk_window_lookup_for_display (display, xwindow);
Packit Service fb6fa5
  /* We may receive events such as NoExpose/GraphicsExpose
Packit Service fb6fa5
   * and ShmCompletion for pixmaps
Packit Service fb6fa5
   */
Packit Service fb6fa5
  if (window && !GDK_IS_WINDOW (window))
Packit Service fb6fa5
    window = NULL;
Packit Service fb6fa5
  window_private = (GdkWindowObject *) window;
Packit Service fb6fa5
Packit Service fb6fa5
  /* We always run the filters for the window where the event
Packit Service fb6fa5
   * is delivered, not the window that it relates to
Packit Service fb6fa5
   */
Packit Service fb6fa5
  if (filter_xwindow == xwindow)
Packit Service fb6fa5
    filter_window = window;
Packit Service fb6fa5
  else
Packit Service fb6fa5
    {
Packit Service fb6fa5
      filter_window = gdk_window_lookup_for_display (display, filter_xwindow);
Packit Service fb6fa5
      if (filter_window && !GDK_IS_WINDOW (filter_window))
Packit Service fb6fa5
	filter_window = NULL;
Packit Service fb6fa5
    }
Packit Service fb6fa5
Packit Service fb6fa5
  if (window)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      screen = GDK_WINDOW_SCREEN (window);
Packit Service fb6fa5
      screen_x11 = GDK_SCREEN_X11 (screen);
Packit Service fb6fa5
      toplevel = _gdk_x11_window_get_toplevel (window);
Packit Service fb6fa5
    }
Packit Service fb6fa5
    
Packit Service fb6fa5
  if (window != NULL)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      /* Apply keyboard grabs to non-native windows */
Packit Service fb6fa5
      if (/* Is key event */
Packit Service fb6fa5
	  (xevent->type == KeyPress || xevent->type == KeyRelease) &&
Packit Service fb6fa5
	  /* And we have a grab */
Packit Service fb6fa5
	  display->keyboard_grab.window != NULL &&
Packit Service fb6fa5
	  (
Packit Service fb6fa5
	   /* The window is not a descendant of the grabbed window */
Packit Service fb6fa5
	   !is_parent_of ((GdkWindow *)display->keyboard_grab.window, window) ||
Packit Service fb6fa5
	   /* Or owner event is false */
Packit Service fb6fa5
	   !display->keyboard_grab.owner_events
Packit Service fb6fa5
	   )
Packit Service fb6fa5
	  )
Packit Service fb6fa5
        {
Packit Service fb6fa5
	  /* Report key event against grab window */
Packit Service fb6fa5
          window = display->keyboard_grab.window;;
Packit Service fb6fa5
          window_private = (GdkWindowObject *) window;
Packit Service fb6fa5
        }
Packit Service fb6fa5
Packit Service fb6fa5
      window_impl = GDK_WINDOW_IMPL_X11 (window_private->impl);
Packit Service fb6fa5
      
Packit Service fb6fa5
      /* Move key events on focus window to the real toplevel, and
Packit Service fb6fa5
       * filter out all other events on focus window
Packit Service fb6fa5
       */          
Packit Service fb6fa5
      if (toplevel && xwindow == toplevel->focus_window)
Packit Service fb6fa5
	{
Packit Service fb6fa5
	  switch (xevent->type)
Packit Service fb6fa5
	    {
Packit Service fb6fa5
	    case KeyPress:
Packit Service fb6fa5
	    case KeyRelease:
Packit Service fb6fa5
	      xwindow = GDK_WINDOW_XID (window);
Packit Service fb6fa5
	      xevent->xany.window = xwindow;
Packit Service fb6fa5
	      break;
Packit Service fb6fa5
	    default:
Packit Service fb6fa5
	      return FALSE;
Packit Service fb6fa5
	    }
Packit Service fb6fa5
	}
Packit Service fb6fa5
Packit Service fb6fa5
      g_object_ref (window);
Packit Service fb6fa5
    }
Packit Service fb6fa5
Packit Service fb6fa5
  event->any.window = window;
Packit Service fb6fa5
  event->any.send_event = xevent->xany.send_event ? TRUE : FALSE;
Packit Service fb6fa5
  
Packit Service fb6fa5
  if (window_private && GDK_WINDOW_DESTROYED (window))
Packit Service fb6fa5
    {
Packit Service fb6fa5
      if (xevent->type != DestroyNotify)
Packit Service fb6fa5
	{
Packit Service fb6fa5
	  return_val = FALSE;
Packit Service fb6fa5
	  goto done;
Packit Service fb6fa5
	}
Packit Service fb6fa5
    }
Packit Service fb6fa5
  else if (filter_window)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      /* Apply per-window filters */
Packit Service fb6fa5
      GdkWindowObject *filter_private = (GdkWindowObject *) filter_window;
Packit Service fb6fa5
      GdkFilterReturn result;
Packit Service fb6fa5
Packit Service fb6fa5
      if (filter_private->filters)
Packit Service fb6fa5
	{
Packit Service fb6fa5
	  g_object_ref (filter_window);
Packit Service fb6fa5
	  
Packit Service fb6fa5
	  result = gdk_event_apply_filters (xevent, event,
Packit Service fb6fa5
					    filter_window);
Packit Service fb6fa5
	  
Packit Service fb6fa5
	  g_object_unref (filter_window);
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
  if (xevent->type == DestroyNotify)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      int i, n;
Packit Service fb6fa5
Packit Service fb6fa5
      n = gdk_display_get_n_screens (display);
Packit Service fb6fa5
      for (i = 0; i < n; i++)
Packit Service fb6fa5
        {
Packit Service fb6fa5
          screen = gdk_display_get_screen (display, i);
Packit Service fb6fa5
          screen_x11 = GDK_SCREEN_X11 (screen);
Packit Service fb6fa5
Packit Service fb6fa5
          if (screen_x11->wmspec_check_window == xwindow)
Packit Service fb6fa5
            {
Packit Service fb6fa5
              screen_x11->wmspec_check_window = None;
Packit Service fb6fa5
              screen_x11->last_wmspec_check_time = 0;
Packit Service fb6fa5
              g_free (screen_x11->window_manager_name);
Packit Service fb6fa5
              screen_x11->window_manager_name = g_strdup ("unknown");
Packit Service fb6fa5
Packit Service fb6fa5
              /* careful, reentrancy */
Packit Service fb6fa5
              _gdk_x11_screen_window_manager_changed (screen);
Packit Service fb6fa5
Packit Service fb6fa5
              return_val = FALSE;
Packit Service fb6fa5
              goto done;
Packit Service fb6fa5
            }
Packit Service fb6fa5
        }
Packit Service fb6fa5
    }
Packit Service fb6fa5
Packit Service fb6fa5
  if (window &&
Packit Service fb6fa5
      (xevent->xany.type == MotionNotify ||
Packit Service fb6fa5
       xevent->xany.type == ButtonRelease))
Packit Service fb6fa5
    {
Packit Service fb6fa5
      if (_gdk_moveresize_handle_event (xevent))
Packit Service fb6fa5
	{
Packit Service fb6fa5
          return_val = FALSE;
Packit Service fb6fa5
          goto done;
Packit Service fb6fa5
        }
Packit Service fb6fa5
    }
Packit Service fb6fa5
  
Packit Service fb6fa5
  /* We do a "manual" conversion of the XEvent to a
Packit Service fb6fa5
   *  GdkEvent. The structures are mostly the same so
Packit Service fb6fa5
   *  the conversion is fairly straightforward. We also
Packit Service fb6fa5
   *  optionally print debugging info regarding events
Packit Service fb6fa5
   *  received.
Packit Service fb6fa5
   */
Packit Service fb6fa5
Packit Service fb6fa5
  return_val = TRUE;
Packit Service fb6fa5
Packit Service fb6fa5
  switch (xevent->type)
Packit Service fb6fa5
    {
Packit Service fb6fa5
    case KeyPress:
Packit Service fb6fa5
      if (window_private == NULL)
Packit Service fb6fa5
        {
Packit Service fb6fa5
          return_val = FALSE;
Packit Service fb6fa5
          break;
Packit Service fb6fa5
        }
Packit Service fb6fa5
      translate_key_event (display, event, xevent);
Packit Service fb6fa5
      set_user_time (window, event);
Packit Service fb6fa5
      break;
Packit Service fb6fa5
Packit Service fb6fa5
    case KeyRelease:
Packit Service fb6fa5
      if (window_private == NULL)
Packit Service fb6fa5
        {
Packit Service fb6fa5
          return_val = FALSE;
Packit Service fb6fa5
          break;
Packit Service fb6fa5
        }
Packit Service fb6fa5
      
Packit Service fb6fa5
      /* Emulate detectable auto-repeat by checking to see
Packit Service fb6fa5
       * if the next event is a key press with the same
Packit Service fb6fa5
       * keycode and timestamp, and if so, ignoring the event.
Packit Service fb6fa5
       */
Packit Service fb6fa5
Packit Service fb6fa5
      if (!display_x11->have_xkb_autorepeat && XPending (xevent->xkey.display))
Packit Service fb6fa5
	{
Packit Service fb6fa5
	  XEvent next_event;
Packit Service fb6fa5
Packit Service fb6fa5
	  XPeekEvent (xevent->xkey.display, &next_event);
Packit Service fb6fa5
Packit Service fb6fa5
	  if (next_event.type == KeyPress &&
Packit Service fb6fa5
	      next_event.xkey.keycode == xevent->xkey.keycode &&
Packit Service fb6fa5
	      next_event.xkey.time == xevent->xkey.time)
Packit Service fb6fa5
	    {
Packit Service fb6fa5
	      return_val = FALSE;
Packit Service fb6fa5
	      break;
Packit Service fb6fa5
	    }
Packit Service fb6fa5
	}
Packit Service fb6fa5
Packit Service fb6fa5
      translate_key_event (display, event, xevent);
Packit Service fb6fa5
      break;
Packit Service fb6fa5
      
Packit Service fb6fa5
    case ButtonPress:
Packit Service fb6fa5
      GDK_NOTE (EVENTS, 
Packit Service fb6fa5
		g_message ("button press:\t\twindow: %ld  x,y: %d %d  button: %d",
Packit Service fb6fa5
			   xevent->xbutton.window,
Packit Service fb6fa5
			   xevent->xbutton.x, xevent->xbutton.y,
Packit Service fb6fa5
			   xevent->xbutton.button));
Packit Service fb6fa5
      
Packit Service fb6fa5
      if (window_private == NULL)
Packit Service fb6fa5
	{
Packit Service fb6fa5
	  return_val = FALSE;
Packit Service fb6fa5
	  break;
Packit Service fb6fa5
	}
Packit Service fb6fa5
      
Packit Service fb6fa5
      /* If we get a ButtonPress event where the button is 4 or 5,
Packit Service fb6fa5
	 it's a Scroll event */
Packit Service fb6fa5
      switch (xevent->xbutton.button)
Packit Service fb6fa5
        {
Packit Service fb6fa5
        case 4: /* up */
Packit Service fb6fa5
        case 5: /* down */
Packit Service fb6fa5
        case 6: /* left */
Packit Service fb6fa5
        case 7: /* right */
Packit Service fb6fa5
	  event->scroll.type = GDK_SCROLL;
Packit Service fb6fa5
Packit Service fb6fa5
          if (xevent->xbutton.button == 4)
Packit Service fb6fa5
            event->scroll.direction = GDK_SCROLL_UP;
Packit Service fb6fa5
          else if (xevent->xbutton.button == 5)
Packit Service fb6fa5
            event->scroll.direction = GDK_SCROLL_DOWN;
Packit Service fb6fa5
          else if (xevent->xbutton.button == 6)
Packit Service fb6fa5
            event->scroll.direction = GDK_SCROLL_LEFT;
Packit Service fb6fa5
          else
Packit Service fb6fa5
            event->scroll.direction = GDK_SCROLL_RIGHT;
Packit Service fb6fa5
Packit Service fb6fa5
	  event->scroll.window = window;
Packit Service fb6fa5
	  event->scroll.time = xevent->xbutton.time;
Packit Service fb6fa5
	  event->scroll.x = xevent->xbutton.x;
Packit Service fb6fa5
	  event->scroll.y = xevent->xbutton.y;
Packit Service fb6fa5
	  event->scroll.x_root = (gfloat)xevent->xbutton.x_root;
Packit Service fb6fa5
	  event->scroll.y_root = (gfloat)xevent->xbutton.y_root;
Packit Service fb6fa5
	  event->scroll.state = (GdkModifierType) xevent->xbutton.state;
Packit Service fb6fa5
	  event->scroll.device = display->core_pointer;
Packit Service fb6fa5
	  
Packit Service fb6fa5
	  if (!set_screen_from_root (display, event, xevent->xbutton.root))
Packit Service fb6fa5
	    {
Packit Service fb6fa5
	      return_val = FALSE;
Packit Service fb6fa5
	      break;
Packit Service fb6fa5
	    }
Packit Service fb6fa5
	  
Packit Service fb6fa5
          break;
Packit Service fb6fa5
          
Packit Service fb6fa5
        default:
Packit Service fb6fa5
	  event->button.type = GDK_BUTTON_PRESS;
Packit Service fb6fa5
	  event->button.window = window;
Packit Service fb6fa5
	  event->button.time = xevent->xbutton.time;
Packit Service fb6fa5
	  event->button.x = xevent->xbutton.x;
Packit Service fb6fa5
	  event->button.y = xevent->xbutton.y;
Packit Service fb6fa5
	  event->button.x_root = (gfloat)xevent->xbutton.x_root;
Packit Service fb6fa5
	  event->button.y_root = (gfloat)xevent->xbutton.y_root;
Packit Service fb6fa5
	  event->button.axes = NULL;
Packit Service fb6fa5
	  event->button.state = (GdkModifierType) xevent->xbutton.state;
Packit Service fb6fa5
	  event->button.button = xevent->xbutton.button;
Packit Service fb6fa5
	  event->button.device = display->core_pointer;
Packit Service fb6fa5
	  
Packit Service fb6fa5
	  if (!set_screen_from_root (display, event, xevent->xbutton.root))
Packit Service fb6fa5
	    {
Packit Service fb6fa5
	      return_val = FALSE;
Packit Service fb6fa5
	      break;
Packit Service fb6fa5
	    }
Packit Service fb6fa5
          break;
Packit Service fb6fa5
	}
Packit Service fb6fa5
Packit Service fb6fa5
      set_user_time (window, event);
Packit Service fb6fa5
Packit Service fb6fa5
      break;
Packit Service fb6fa5
      
Packit Service fb6fa5
    case ButtonRelease:
Packit Service fb6fa5
      GDK_NOTE (EVENTS, 
Packit Service fb6fa5
		g_message ("button release:\twindow: %ld  x,y: %d %d  button: %d",
Packit Service fb6fa5
			   xevent->xbutton.window,
Packit Service fb6fa5
			   xevent->xbutton.x, xevent->xbutton.y,
Packit Service fb6fa5
			   xevent->xbutton.button));
Packit Service fb6fa5
      
Packit Service fb6fa5
      if (window_private == NULL)
Packit Service fb6fa5
	{
Packit Service fb6fa5
	  return_val = FALSE;
Packit Service fb6fa5
	  break;
Packit Service fb6fa5
	}
Packit Service fb6fa5
      
Packit Service fb6fa5
      /* We treat button presses as scroll wheel events, so ignore the release */
Packit Service fb6fa5
      if (xevent->xbutton.button == 4 || xevent->xbutton.button == 5 ||
Packit Service fb6fa5
          xevent->xbutton.button == 6 || xevent->xbutton.button ==7)
Packit Service fb6fa5
	{
Packit Service fb6fa5
	  return_val = FALSE;
Packit Service fb6fa5
	  break;
Packit Service fb6fa5
	}
Packit Service fb6fa5
Packit Service fb6fa5
      event->button.type = GDK_BUTTON_RELEASE;
Packit Service fb6fa5
      event->button.window = window;
Packit Service fb6fa5
      event->button.time = xevent->xbutton.time;
Packit Service fb6fa5
      event->button.x = xevent->xbutton.x;
Packit Service fb6fa5
      event->button.y = xevent->xbutton.y;
Packit Service fb6fa5
      event->button.x_root = (gfloat)xevent->xbutton.x_root;
Packit Service fb6fa5
      event->button.y_root = (gfloat)xevent->xbutton.y_root;
Packit Service fb6fa5
      event->button.axes = NULL;
Packit Service fb6fa5
      event->button.state = (GdkModifierType) xevent->xbutton.state;
Packit Service fb6fa5
      event->button.button = xevent->xbutton.button;
Packit Service fb6fa5
      event->button.device = display->core_pointer;
Packit Service fb6fa5
Packit Service fb6fa5
      if (!set_screen_from_root (display, event, xevent->xbutton.root))
Packit Service fb6fa5
	return_val = FALSE;
Packit Service fb6fa5
      
Packit Service fb6fa5
      break;
Packit Service fb6fa5
      
Packit Service fb6fa5
    case MotionNotify:
Packit Service fb6fa5
      GDK_NOTE (EVENTS,
Packit Service fb6fa5
		g_message ("motion notify:\t\twindow: %ld  x,y: %d %d  hint: %s", 
Packit Service fb6fa5
			   xevent->xmotion.window,
Packit Service fb6fa5
			   xevent->xmotion.x, xevent->xmotion.y,
Packit Service fb6fa5
			   (xevent->xmotion.is_hint) ? "true" : "false"));
Packit Service fb6fa5
      
Packit Service fb6fa5
      if (window_private == NULL)
Packit Service fb6fa5
	{
Packit Service fb6fa5
	  return_val = FALSE;
Packit Service fb6fa5
	  break;
Packit Service fb6fa5
	}
Packit Service fb6fa5
Packit Service fb6fa5
      event->motion.type = GDK_MOTION_NOTIFY;
Packit Service fb6fa5
      event->motion.window = window;
Packit Service fb6fa5
      event->motion.time = xevent->xmotion.time;
Packit Service fb6fa5
      event->motion.x = xevent->xmotion.x;
Packit Service fb6fa5
      event->motion.y = xevent->xmotion.y;
Packit Service fb6fa5
      event->motion.x_root = (gfloat)xevent->xmotion.x_root;
Packit Service fb6fa5
      event->motion.y_root = (gfloat)xevent->xmotion.y_root;
Packit Service fb6fa5
      event->motion.axes = NULL;
Packit Service fb6fa5
      event->motion.state = (GdkModifierType) xevent->xmotion.state;
Packit Service fb6fa5
      event->motion.is_hint = xevent->xmotion.is_hint;
Packit Service fb6fa5
      event->motion.device = display->core_pointer;
Packit Service fb6fa5
      
Packit Service fb6fa5
      if (!set_screen_from_root (display, event, xevent->xbutton.root))
Packit Service fb6fa5
	{
Packit Service fb6fa5
	  return_val = FALSE;
Packit Service fb6fa5
	  break;
Packit Service fb6fa5
	}
Packit Service fb6fa5
            
Packit Service fb6fa5
      break;
Packit Service fb6fa5
      
Packit Service fb6fa5
    case EnterNotify:
Packit Service fb6fa5
      GDK_NOTE (EVENTS,
Packit Service fb6fa5
                g_message ("enter notify:\t\twindow: %ld  detail: %d subwin: %ld mode: %d",
Packit Service fb6fa5
                           xevent->xcrossing.window,
Packit Service fb6fa5
                           xevent->xcrossing.detail,
Packit Service fb6fa5
                           xevent->xcrossing.subwindow,
Packit Service fb6fa5
                           xevent->xcrossing.mode));
Packit Service fb6fa5
Packit Service fb6fa5
      if (window_private == NULL)
Packit Service fb6fa5
        {
Packit Service fb6fa5
          return_val = FALSE;
Packit Service fb6fa5
          break;
Packit Service fb6fa5
        }
Packit Service fb6fa5
      
Packit Service fb6fa5
      if (!set_screen_from_root (display, event, xevent->xbutton.root))
Packit Service fb6fa5
	{
Packit Service fb6fa5
	  return_val = FALSE;
Packit Service fb6fa5
	  break;
Packit Service fb6fa5
	}
Packit Service fb6fa5
      
Packit Service fb6fa5
      /* Handle focusing (in the case where no window manager is running */
Packit Service fb6fa5
      if (toplevel && xevent->xcrossing.detail != NotifyInferior)
Packit Service fb6fa5
	{
Packit Service fb6fa5
	  toplevel->has_pointer = TRUE;
Packit Service fb6fa5
Packit Service fb6fa5
	  if (xevent->xcrossing.focus && !toplevel->has_focus_window)
Packit Service fb6fa5
	    {
Packit Service fb6fa5
	      gboolean had_focus = HAS_FOCUS (toplevel);
Packit Service fb6fa5
	      
Packit Service fb6fa5
	      toplevel->has_pointer_focus = TRUE;
Packit Service fb6fa5
	      
Packit Service fb6fa5
	      if (HAS_FOCUS (toplevel) != had_focus)
Packit Service fb6fa5
		generate_focus_event (window, TRUE);
Packit Service fb6fa5
	    }
Packit Service fb6fa5
	}
Packit Service fb6fa5
Packit Service fb6fa5
      event->crossing.type = GDK_ENTER_NOTIFY;
Packit Service fb6fa5
      event->crossing.window = window;
Packit Service fb6fa5
      
Packit Service fb6fa5
      /* If the subwindow field of the XEvent is non-NULL, then
Packit Service fb6fa5
       *  lookup the corresponding GdkWindow.
Packit Service fb6fa5
       */
Packit Service fb6fa5
      if (xevent->xcrossing.subwindow != None)
Packit Service fb6fa5
	event->crossing.subwindow = gdk_window_lookup_for_display (display, xevent->xcrossing.subwindow);
Packit Service fb6fa5
      else
Packit Service fb6fa5
	event->crossing.subwindow = NULL;
Packit Service fb6fa5
      
Packit Service fb6fa5
      event->crossing.time = xevent->xcrossing.time;
Packit Service fb6fa5
      event->crossing.x = xevent->xcrossing.x;
Packit Service fb6fa5
      event->crossing.y = xevent->xcrossing.y;
Packit Service fb6fa5
      event->crossing.x_root = xevent->xcrossing.x_root;
Packit Service fb6fa5
      event->crossing.y_root = xevent->xcrossing.y_root;
Packit Service fb6fa5
      
Packit Service fb6fa5
      /* Translate the crossing mode into Gdk terms.
Packit Service fb6fa5
       */
Packit Service fb6fa5
      switch (xevent->xcrossing.mode)
Packit Service fb6fa5
	{
Packit Service fb6fa5
	case NotifyNormal:
Packit Service fb6fa5
	  event->crossing.mode = GDK_CROSSING_NORMAL;
Packit Service fb6fa5
	  break;
Packit Service fb6fa5
	case NotifyGrab:
Packit Service fb6fa5
	  event->crossing.mode = GDK_CROSSING_GRAB;
Packit Service fb6fa5
	  break;
Packit Service fb6fa5
	case NotifyUngrab:
Packit Service fb6fa5
	  event->crossing.mode = GDK_CROSSING_UNGRAB;
Packit Service fb6fa5
	  break;
Packit Service fb6fa5
	};
Packit Service fb6fa5
      
Packit Service fb6fa5
      /* Translate the crossing detail into Gdk terms.
Packit Service fb6fa5
       */
Packit Service fb6fa5
      switch (xevent->xcrossing.detail)
Packit Service fb6fa5
	{
Packit Service fb6fa5
	case NotifyInferior:
Packit Service fb6fa5
	  event->crossing.detail = GDK_NOTIFY_INFERIOR;
Packit Service fb6fa5
	  break;
Packit Service fb6fa5
	case NotifyAncestor:
Packit Service fb6fa5
	  event->crossing.detail = GDK_NOTIFY_ANCESTOR;
Packit Service fb6fa5
	  break;
Packit Service fb6fa5
	case NotifyVirtual:
Packit Service fb6fa5
	  event->crossing.detail = GDK_NOTIFY_VIRTUAL;
Packit Service fb6fa5
	  break;
Packit Service fb6fa5
	case NotifyNonlinear:
Packit Service fb6fa5
	  event->crossing.detail = GDK_NOTIFY_NONLINEAR;
Packit Service fb6fa5
	  break;
Packit Service fb6fa5
	case NotifyNonlinearVirtual:
Packit Service fb6fa5
	  event->crossing.detail = GDK_NOTIFY_NONLINEAR_VIRTUAL;
Packit Service fb6fa5
	  break;
Packit Service fb6fa5
	default:
Packit Service fb6fa5
	  event->crossing.detail = GDK_NOTIFY_UNKNOWN;
Packit Service fb6fa5
	  break;
Packit Service fb6fa5
	}
Packit Service fb6fa5
      
Packit Service fb6fa5
      event->crossing.focus = xevent->xcrossing.focus;
Packit Service fb6fa5
      event->crossing.state = xevent->xcrossing.state;
Packit Service fb6fa5
  
Packit Service fb6fa5
      break;
Packit Service fb6fa5
      
Packit Service fb6fa5
    case LeaveNotify:
Packit Service fb6fa5
      GDK_NOTE (EVENTS, 
Packit Service fb6fa5
                g_message ("leave notify:\t\twindow: %ld  detail: %d subwin: %ld mode: %d",
Packit Service fb6fa5
                           xevent->xcrossing.window,
Packit Service fb6fa5
                           xevent->xcrossing.detail,
Packit Service fb6fa5
                           xevent->xcrossing.subwindow,
Packit Service fb6fa5
                           xevent->xcrossing.mode));
Packit Service fb6fa5
Packit Service fb6fa5
      if (window_private == NULL)
Packit Service fb6fa5
        {
Packit Service fb6fa5
          return_val = FALSE;
Packit Service fb6fa5
          break;
Packit Service fb6fa5
        }
Packit Service fb6fa5
Packit Service fb6fa5
      if (!set_screen_from_root (display, event, xevent->xbutton.root))
Packit Service fb6fa5
	{
Packit Service fb6fa5
	  return_val = FALSE;
Packit Service fb6fa5
	  break;
Packit Service fb6fa5
	}
Packit Service fb6fa5
                  
Packit Service fb6fa5
      /* Handle focusing (in the case where no window manager is running */
Packit Service fb6fa5
      if (toplevel && xevent->xcrossing.detail != NotifyInferior)
Packit Service fb6fa5
	{
Packit Service fb6fa5
	  toplevel->has_pointer = FALSE;
Packit Service fb6fa5
Packit Service fb6fa5
	  if (xevent->xcrossing.focus && !toplevel->has_focus_window)
Packit Service fb6fa5
	    {
Packit Service fb6fa5
	      gboolean had_focus = HAS_FOCUS (toplevel);
Packit Service fb6fa5
	      
Packit Service fb6fa5
	      toplevel->has_pointer_focus = FALSE;
Packit Service fb6fa5
	      
Packit Service fb6fa5
	      if (HAS_FOCUS (toplevel) != had_focus)
Packit Service fb6fa5
		generate_focus_event (window, FALSE);
Packit Service fb6fa5
	    }
Packit Service fb6fa5
	}
Packit Service fb6fa5
Packit Service fb6fa5
      event->crossing.type = GDK_LEAVE_NOTIFY;
Packit Service fb6fa5
      event->crossing.window = window;
Packit Service fb6fa5
      
Packit Service fb6fa5
      /* If the subwindow field of the XEvent is non-NULL, then
Packit Service fb6fa5
       *  lookup the corresponding GdkWindow.
Packit Service fb6fa5
       */
Packit Service fb6fa5
      if (xevent->xcrossing.subwindow != None)
Packit Service fb6fa5
	event->crossing.subwindow = gdk_window_lookup_for_display (display, xevent->xcrossing.subwindow);
Packit Service fb6fa5
      else
Packit Service fb6fa5
	event->crossing.subwindow = NULL;
Packit Service fb6fa5
      
Packit Service fb6fa5
      event->crossing.time = xevent->xcrossing.time;
Packit Service fb6fa5
      event->crossing.x = xevent->xcrossing.x;
Packit Service fb6fa5
      event->crossing.y = xevent->xcrossing.y;
Packit Service fb6fa5
      event->crossing.x_root = xevent->xcrossing.x_root;
Packit Service fb6fa5
      event->crossing.y_root = xevent->xcrossing.y_root;
Packit Service fb6fa5
      
Packit Service fb6fa5
      /* Translate the crossing mode into Gdk terms.
Packit Service fb6fa5
       */
Packit Service fb6fa5
      switch (xevent->xcrossing.mode)
Packit Service fb6fa5
	{
Packit Service fb6fa5
	case NotifyNormal:
Packit Service fb6fa5
	  event->crossing.mode = GDK_CROSSING_NORMAL;
Packit Service fb6fa5
	  break;
Packit Service fb6fa5
	case NotifyGrab:
Packit Service fb6fa5
	  event->crossing.mode = GDK_CROSSING_GRAB;
Packit Service fb6fa5
	  break;
Packit Service fb6fa5
	case NotifyUngrab:
Packit Service fb6fa5
	  event->crossing.mode = GDK_CROSSING_UNGRAB;
Packit Service fb6fa5
	  break;
Packit Service fb6fa5
	};
Packit Service fb6fa5
      
Packit Service fb6fa5
      /* Translate the crossing detail into Gdk terms.
Packit Service fb6fa5
       */
Packit Service fb6fa5
      switch (xevent->xcrossing.detail)
Packit Service fb6fa5
	{
Packit Service fb6fa5
	case NotifyInferior:
Packit Service fb6fa5
	  event->crossing.detail = GDK_NOTIFY_INFERIOR;
Packit Service fb6fa5
	  break;
Packit Service fb6fa5
	case NotifyAncestor:
Packit Service fb6fa5
	  event->crossing.detail = GDK_NOTIFY_ANCESTOR;
Packit Service fb6fa5
	  break;
Packit Service fb6fa5
	case NotifyVirtual:
Packit Service fb6fa5
	  event->crossing.detail = GDK_NOTIFY_VIRTUAL;
Packit Service fb6fa5
	  break;
Packit Service fb6fa5
	case NotifyNonlinear:
Packit Service fb6fa5
	  event->crossing.detail = GDK_NOTIFY_NONLINEAR;
Packit Service fb6fa5
	  break;
Packit Service fb6fa5
	case NotifyNonlinearVirtual:
Packit Service fb6fa5
	  event->crossing.detail = GDK_NOTIFY_NONLINEAR_VIRTUAL;
Packit Service fb6fa5
	  break;
Packit Service fb6fa5
	default:
Packit Service fb6fa5
	  event->crossing.detail = GDK_NOTIFY_UNKNOWN;
Packit Service fb6fa5
	  break;
Packit Service fb6fa5
	}
Packit Service fb6fa5
      
Packit Service fb6fa5
      event->crossing.focus = xevent->xcrossing.focus;
Packit Service fb6fa5
      event->crossing.state = xevent->xcrossing.state;
Packit Service fb6fa5
      
Packit Service fb6fa5
      break;
Packit Service fb6fa5
      
Packit Service fb6fa5
      /* We only care about focus events that indicate that _this_
Packit Service fb6fa5
       * window (not a ancestor or child) got or lost the focus
Packit Service fb6fa5
       */
Packit Service fb6fa5
    case FocusIn:
Packit Service fb6fa5
      GDK_NOTE (EVENTS,
Packit Service fb6fa5
		g_message ("focus in:\t\twindow: %ld, detail: %s, mode: %s",
Packit Service fb6fa5
			   xevent->xfocus.window,
Packit Service fb6fa5
			   notify_details[xevent->xfocus.detail],
Packit Service fb6fa5
			   notify_modes[xevent->xfocus.mode]));
Packit Service fb6fa5
      
Packit Service fb6fa5
      if (toplevel)
Packit Service fb6fa5
	{
Packit Service fb6fa5
	  gboolean had_focus = HAS_FOCUS (toplevel);
Packit Service fb6fa5
	  
Packit Service fb6fa5
	  switch (xevent->xfocus.detail)
Packit Service fb6fa5
	    {
Packit Service fb6fa5
	    case NotifyAncestor:
Packit Service fb6fa5
	    case NotifyVirtual:
Packit Service fb6fa5
	      /* When the focus moves from an ancestor of the window to
Packit Service fb6fa5
	       * the window or a descendent of the window, *and* the
Packit Service fb6fa5
	       * pointer is inside the window, then we were previously
Packit Service fb6fa5
	       * receiving keystroke events in the has_pointer_focus
Packit Service fb6fa5
	       * case and are now receiving them in the
Packit Service fb6fa5
	       * has_focus_window case.
Packit Service fb6fa5
	       */
Packit Service fb6fa5
	      if (toplevel->has_pointer &&
Packit Service fb6fa5
		  xevent->xfocus.mode != NotifyGrab &&
Packit Service fb6fa5
		  xevent->xfocus.mode != NotifyUngrab)
Packit Service fb6fa5
		toplevel->has_pointer_focus = FALSE;
Packit Service fb6fa5
	      
Packit Service fb6fa5
	      /* fall through */
Packit Service fb6fa5
	    case NotifyNonlinear:
Packit Service fb6fa5
	    case NotifyNonlinearVirtual:
Packit Service fb6fa5
	      if (xevent->xfocus.mode != NotifyGrab &&
Packit Service fb6fa5
		  xevent->xfocus.mode != NotifyUngrab)
Packit Service fb6fa5
		toplevel->has_focus_window = TRUE;
Packit Service fb6fa5
	      /* We pretend that the focus moves to the grab
Packit Service fb6fa5
	       * window, so we pay attention to NotifyGrab
Packit Service fb6fa5
	       * NotifyUngrab, and ignore NotifyWhileGrabbed
Packit Service fb6fa5
	       */
Packit Service fb6fa5
	      if (xevent->xfocus.mode != NotifyWhileGrabbed)
Packit Service fb6fa5
		toplevel->has_focus = TRUE;
Packit Service fb6fa5
	      break;
Packit Service fb6fa5
	    case NotifyPointer:
Packit Service fb6fa5
	      /* The X server sends NotifyPointer/NotifyGrab,
Packit Service fb6fa5
	       * but the pointer focus is ignored while a
Packit Service fb6fa5
	       * grab is in effect
Packit Service fb6fa5
	       */
Packit Service fb6fa5
	      if (xevent->xfocus.mode != NotifyGrab &&
Packit Service fb6fa5
		  xevent->xfocus.mode != NotifyUngrab)
Packit Service fb6fa5
		toplevel->has_pointer_focus = TRUE;
Packit Service fb6fa5
	      break;
Packit Service fb6fa5
	    case NotifyInferior:
Packit Service fb6fa5
	    case NotifyPointerRoot:
Packit Service fb6fa5
	    case NotifyDetailNone:
Packit Service fb6fa5
	      break;
Packit Service fb6fa5
	    }
Packit Service fb6fa5
Packit Service fb6fa5
	  if (HAS_FOCUS (toplevel) != had_focus)
Packit Service fb6fa5
	    generate_focus_event (window, TRUE);
Packit Service fb6fa5
	}
Packit Service fb6fa5
      break;
Packit Service fb6fa5
    case FocusOut:
Packit Service fb6fa5
      GDK_NOTE (EVENTS,
Packit Service fb6fa5
		g_message ("focus out:\t\twindow: %ld, detail: %s, mode: %s",
Packit Service fb6fa5
			   xevent->xfocus.window,
Packit Service fb6fa5
			   notify_details[xevent->xfocus.detail],
Packit Service fb6fa5
			   notify_modes[xevent->xfocus.mode]));
Packit Service fb6fa5
      
Packit Service fb6fa5
      if (toplevel)
Packit Service fb6fa5
	{
Packit Service fb6fa5
	  gboolean had_focus = HAS_FOCUS (toplevel);
Packit Service fb6fa5
	    
Packit Service fb6fa5
	  switch (xevent->xfocus.detail)
Packit Service fb6fa5
	    {
Packit Service fb6fa5
	    case NotifyAncestor:
Packit Service fb6fa5
	    case NotifyVirtual:
Packit Service fb6fa5
	      /* When the focus moves from the window or a descendent
Packit Service fb6fa5
	       * of the window to an ancestor of the window, *and* the
Packit Service fb6fa5
	       * pointer is inside the window, then we were previously
Packit Service fb6fa5
	       * receiving keystroke events in the has_focus_window
Packit Service fb6fa5
	       * case and are now receiving them in the
Packit Service fb6fa5
	       * has_pointer_focus case.
Packit Service fb6fa5
	       */
Packit Service fb6fa5
	      if (toplevel->has_pointer &&
Packit Service fb6fa5
		  xevent->xfocus.mode != NotifyGrab &&
Packit Service fb6fa5
		  xevent->xfocus.mode != NotifyUngrab)
Packit Service fb6fa5
		toplevel->has_pointer_focus = TRUE;
Packit Service fb6fa5
Packit Service fb6fa5
	      /* fall through */
Packit Service fb6fa5
	    case NotifyNonlinear:
Packit Service fb6fa5
	    case NotifyNonlinearVirtual:
Packit Service fb6fa5
	      if (xevent->xfocus.mode != NotifyGrab &&
Packit Service fb6fa5
		  xevent->xfocus.mode != NotifyUngrab)
Packit Service fb6fa5
		toplevel->has_focus_window = FALSE;
Packit Service fb6fa5
	      if (xevent->xfocus.mode != NotifyWhileGrabbed)
Packit Service fb6fa5
		toplevel->has_focus = FALSE;
Packit Service fb6fa5
	      break;
Packit Service fb6fa5
	    case NotifyPointer:
Packit Service fb6fa5
	      if (xevent->xfocus.mode != NotifyGrab &&
Packit Service fb6fa5
		  xevent->xfocus.mode != NotifyUngrab)
Packit Service fb6fa5
		toplevel->has_pointer_focus = FALSE;
Packit Service fb6fa5
	    break;
Packit Service fb6fa5
	    case NotifyInferior:
Packit Service fb6fa5
	    case NotifyPointerRoot:
Packit Service fb6fa5
	    case NotifyDetailNone:
Packit Service fb6fa5
	      break;
Packit Service fb6fa5
	    }
Packit Service fb6fa5
Packit Service fb6fa5
	  if (HAS_FOCUS (toplevel) != had_focus)
Packit Service fb6fa5
	    generate_focus_event (window, FALSE);
Packit Service fb6fa5
	}
Packit Service fb6fa5
      break;
Packit Service fb6fa5
Packit Service fb6fa5
#if 0      
Packit Service fb6fa5
 	  /* gdk_keyboard_grab() causes following events. These events confuse
Packit Service fb6fa5
 	   * the XIM focus, so ignore them.
Packit Service fb6fa5
 	   */
Packit Service fb6fa5
 	  if (xevent->xfocus.mode == NotifyGrab ||
Packit Service fb6fa5
 	      xevent->xfocus.mode == NotifyUngrab)
Packit Service fb6fa5
 	    break;
Packit Service fb6fa5
#endif
Packit Service fb6fa5
Packit Service fb6fa5
    case KeymapNotify:
Packit Service fb6fa5
      GDK_NOTE (EVENTS,
Packit Service fb6fa5
		g_message ("keymap notify"));
Packit Service fb6fa5
Packit Service fb6fa5
      /* Not currently handled */
Packit Service fb6fa5
      return_val = FALSE;
Packit Service fb6fa5
      break;
Packit Service fb6fa5
      
Packit Service fb6fa5
    case Expose:
Packit Service fb6fa5
      GDK_NOTE (EVENTS,
Packit Service fb6fa5
		g_message ("expose:\t\twindow: %ld  %d	x,y: %d %d  w,h: %d %d%s",
Packit Service fb6fa5
			   xevent->xexpose.window, xevent->xexpose.count,
Packit Service fb6fa5
			   xevent->xexpose.x, xevent->xexpose.y,
Packit Service fb6fa5
			   xevent->xexpose.width, xevent->xexpose.height,
Packit Service fb6fa5
			   event->any.send_event ? " (send)" : ""));
Packit Service fb6fa5
     
Packit Service fb6fa5
      if (window_private == NULL)
Packit Service fb6fa5
        {
Packit Service fb6fa5
          return_val = FALSE;
Packit Service fb6fa5
          break;
Packit Service fb6fa5
        }
Packit Service fb6fa5
Packit Service fb6fa5
      {
Packit Service fb6fa5
	GdkRectangle expose_rect;
Packit Service fb6fa5
Packit Service fb6fa5
	expose_rect.x = xevent->xexpose.x;
Packit Service fb6fa5
	expose_rect.y = xevent->xexpose.y;
Packit Service fb6fa5
	expose_rect.width = xevent->xexpose.width;
Packit Service fb6fa5
	expose_rect.height = xevent->xexpose.height;
Packit Service fb6fa5
Packit Service fb6fa5
	_gdk_window_process_expose (window, xevent->xexpose.serial, &expose_rect);
Packit Service fb6fa5
	 return_val = FALSE;
Packit Service fb6fa5
      }
Packit Service fb6fa5
Packit Service fb6fa5
      break;
Packit Service fb6fa5
      
Packit Service fb6fa5
    case GraphicsExpose:
Packit Service fb6fa5
      {
Packit Service fb6fa5
	GdkRectangle expose_rect;
Packit Service fb6fa5
Packit Service fb6fa5
        GDK_NOTE (EVENTS,
Packit Service fb6fa5
		  g_message ("graphics expose:\tdrawable: %ld",
Packit Service fb6fa5
			     xevent->xgraphicsexpose.drawable));
Packit Service fb6fa5
 
Packit Service fb6fa5
        if (window_private == NULL)
Packit Service fb6fa5
          {
Packit Service fb6fa5
            return_val = FALSE;
Packit Service fb6fa5
            break;
Packit Service fb6fa5
          }
Packit Service fb6fa5
        
Packit Service fb6fa5
	expose_rect.x = xevent->xgraphicsexpose.x;
Packit Service fb6fa5
	expose_rect.y = xevent->xgraphicsexpose.y;
Packit Service fb6fa5
	expose_rect.width = xevent->xgraphicsexpose.width;
Packit Service fb6fa5
	expose_rect.height = xevent->xgraphicsexpose.height;
Packit Service fb6fa5
	    
Packit Service fb6fa5
	if (return_exposes)
Packit Service fb6fa5
	  {
Packit Service fb6fa5
	    event->expose.type = GDK_EXPOSE;
Packit Service fb6fa5
	    event->expose.area = expose_rect;
Packit Service fb6fa5
	    event->expose.region = gdk_region_rectangle (&expose_rect);
Packit Service fb6fa5
	    event->expose.window = window;
Packit Service fb6fa5
	    event->expose.count = xevent->xgraphicsexpose.count;
Packit Service fb6fa5
Packit Service fb6fa5
	    return_val = TRUE;
Packit Service fb6fa5
	  }
Packit Service fb6fa5
	else
Packit Service fb6fa5
	  {
Packit Service fb6fa5
	    _gdk_window_process_expose (window, xevent->xgraphicsexpose.serial, &expose_rect);
Packit Service fb6fa5
	    
Packit Service fb6fa5
	    return_val = FALSE;
Packit Service fb6fa5
	  }
Packit Service fb6fa5
	
Packit Service fb6fa5
      }
Packit Service fb6fa5
      break;
Packit Service fb6fa5
      
Packit Service fb6fa5
    case NoExpose:
Packit Service fb6fa5
      GDK_NOTE (EVENTS,
Packit Service fb6fa5
		g_message ("no expose:\t\tdrawable: %ld",
Packit Service fb6fa5
			   xevent->xnoexpose.drawable));
Packit Service fb6fa5
      
Packit Service fb6fa5
      event->no_expose.type = GDK_NO_EXPOSE;
Packit Service fb6fa5
      event->no_expose.window = window;
Packit Service fb6fa5
      
Packit Service fb6fa5
      break;
Packit Service fb6fa5
      
Packit Service fb6fa5
    case VisibilityNotify:
Packit Service fb6fa5
#ifdef G_ENABLE_DEBUG
Packit Service fb6fa5
      if (_gdk_debug_flags & GDK_DEBUG_EVENTS)
Packit Service fb6fa5
	switch (xevent->xvisibility.state)
Packit Service fb6fa5
	  {
Packit Service fb6fa5
	  case VisibilityFullyObscured:
Packit Service fb6fa5
	    g_message ("visibility notify:\twindow: %ld	 none",
Packit Service fb6fa5
		       xevent->xvisibility.window);
Packit Service fb6fa5
	    break;
Packit Service fb6fa5
	  case VisibilityPartiallyObscured:
Packit Service fb6fa5
	    g_message ("visibility notify:\twindow: %ld	 partial",
Packit Service fb6fa5
		       xevent->xvisibility.window);
Packit Service fb6fa5
	    break;
Packit Service fb6fa5
	  case VisibilityUnobscured:
Packit Service fb6fa5
	    g_message ("visibility notify:\twindow: %ld	 full",
Packit Service fb6fa5
		       xevent->xvisibility.window);
Packit Service fb6fa5
	    break;
Packit Service fb6fa5
	  }
Packit Service fb6fa5
#endif /* G_ENABLE_DEBUG */
Packit Service fb6fa5
      
Packit Service fb6fa5
      if (window_private == NULL)
Packit Service fb6fa5
        {
Packit Service fb6fa5
          return_val = FALSE;
Packit Service fb6fa5
          break;
Packit Service fb6fa5
        }
Packit Service fb6fa5
      
Packit Service fb6fa5
      event->visibility.type = GDK_VISIBILITY_NOTIFY;
Packit Service fb6fa5
      event->visibility.window = window;
Packit Service fb6fa5
      
Packit Service fb6fa5
      switch (xevent->xvisibility.state)
Packit Service fb6fa5
	{
Packit Service fb6fa5
	case VisibilityFullyObscured:
Packit Service fb6fa5
	  event->visibility.state = GDK_VISIBILITY_FULLY_OBSCURED;
Packit Service fb6fa5
	  break;
Packit Service fb6fa5
	  
Packit Service fb6fa5
	case VisibilityPartiallyObscured:
Packit Service fb6fa5
	  event->visibility.state = GDK_VISIBILITY_PARTIAL;
Packit Service fb6fa5
	  break;
Packit Service fb6fa5
	  
Packit Service fb6fa5
	case VisibilityUnobscured:
Packit Service fb6fa5
	  event->visibility.state = GDK_VISIBILITY_UNOBSCURED;
Packit Service fb6fa5
	  break;
Packit Service fb6fa5
	}
Packit Service fb6fa5
      
Packit Service fb6fa5
      break;
Packit Service fb6fa5
      
Packit Service fb6fa5
    case CreateNotify:
Packit Service fb6fa5
      GDK_NOTE (EVENTS,
Packit Service fb6fa5
		g_message ("create notify:\twindow: %ld  x,y: %d %d	w,h: %d %d  b-w: %d  parent: %ld	 ovr: %d",
Packit Service fb6fa5
			   xevent->xcreatewindow.window,
Packit Service fb6fa5
			   xevent->xcreatewindow.x,
Packit Service fb6fa5
			   xevent->xcreatewindow.y,
Packit Service fb6fa5
			   xevent->xcreatewindow.width,
Packit Service fb6fa5
			   xevent->xcreatewindow.height,
Packit Service fb6fa5
			   xevent->xcreatewindow.border_width,
Packit Service fb6fa5
			   xevent->xcreatewindow.parent,
Packit Service fb6fa5
			   xevent->xcreatewindow.override_redirect));
Packit Service fb6fa5
      /* not really handled */
Packit Service fb6fa5
      break;
Packit Service fb6fa5
      
Packit Service fb6fa5
    case DestroyNotify:
Packit Service fb6fa5
      GDK_NOTE (EVENTS,
Packit Service fb6fa5
		g_message ("destroy notify:\twindow: %ld",
Packit Service fb6fa5
			   xevent->xdestroywindow.window));
Packit Service fb6fa5
Packit Service fb6fa5
      /* Ignore DestroyNotify from SubstructureNotifyMask */
Packit Service fb6fa5
      if (xevent->xdestroywindow.window == xevent->xdestroywindow.event)
Packit Service fb6fa5
	{
Packit Service fb6fa5
	  event->any.type = GDK_DESTROY;
Packit Service fb6fa5
	  event->any.window = window;
Packit Service fb6fa5
	  
Packit Service fb6fa5
	  return_val = window_private && !GDK_WINDOW_DESTROYED (window);
Packit Service fb6fa5
	  
Packit Service fb6fa5
	  if (window && GDK_WINDOW_XID (window) != screen_x11->xroot_window)
Packit Service fb6fa5
	    gdk_window_destroy_notify (window);
Packit Service fb6fa5
	}
Packit Service fb6fa5
      else
Packit Service fb6fa5
	return_val = FALSE;
Packit Service fb6fa5
      
Packit Service fb6fa5
      break;
Packit Service fb6fa5
      
Packit Service fb6fa5
    case UnmapNotify:
Packit Service fb6fa5
      GDK_NOTE (EVENTS,
Packit Service fb6fa5
		g_message ("unmap notify:\t\twindow: %ld",
Packit Service fb6fa5
			   xevent->xmap.window));
Packit Service fb6fa5
      
Packit Service fb6fa5
      event->any.type = GDK_UNMAP;
Packit Service fb6fa5
      event->any.window = window;      
Packit Service fb6fa5
Packit Service fb6fa5
      /* If the WM supports the _NET_WM_STATE_HIDDEN hint, we do not want to
Packit Service fb6fa5
       * interpret UnmapNotify events as implying iconic state.
Packit Service fb6fa5
       * http://bugzilla.gnome.org/show_bug.cgi?id=590726.
Packit Service fb6fa5
       */
Packit Service fb6fa5
      if (screen &&
Packit Service fb6fa5
          !gdk_x11_screen_supports_net_wm_hint (screen,
Packit Service fb6fa5
                                                gdk_atom_intern_static_string ("_NET_WM_STATE_HIDDEN")))
Packit Service fb6fa5
        {
Packit Service fb6fa5
          /* If we are shown (not withdrawn) and get an unmap, it means we were
Packit Service fb6fa5
           * iconified in the X sense. If we are withdrawn, and get an unmap, it
Packit Service fb6fa5
           * means we hid the window ourselves, so we will have already flipped
Packit Service fb6fa5
           * the iconified bit off.
Packit Service fb6fa5
           */
Packit Service fb6fa5
          if (window && GDK_WINDOW_IS_MAPPED (window))
Packit Service fb6fa5
            gdk_synthesize_window_state (window,
Packit Service fb6fa5
                                         0,
Packit Service fb6fa5
                                         GDK_WINDOW_STATE_ICONIFIED);
Packit Service fb6fa5
        }
Packit Service fb6fa5
Packit Service fb6fa5
      if (window)
Packit Service fb6fa5
        _gdk_xgrab_check_unmap (window, xevent->xany.serial);
Packit Service fb6fa5
Packit Service fb6fa5
      break;
Packit Service fb6fa5
      
Packit Service fb6fa5
    case MapNotify:
Packit Service fb6fa5
      GDK_NOTE (EVENTS,
Packit Service fb6fa5
		g_message ("map notify:\t\twindow: %ld",
Packit Service fb6fa5
			   xevent->xmap.window));
Packit Service fb6fa5
      
Packit Service fb6fa5
      event->any.type = GDK_MAP;
Packit Service fb6fa5
      event->any.window = window;
Packit Service fb6fa5
Packit Service fb6fa5
      /* Unset iconified if it was set */
Packit Service fb6fa5
      if (window && (((GdkWindowObject*)window)->state & GDK_WINDOW_STATE_ICONIFIED))
Packit Service fb6fa5
        gdk_synthesize_window_state (window,
Packit Service fb6fa5
                                     GDK_WINDOW_STATE_ICONIFIED,
Packit Service fb6fa5
                                     0);
Packit Service fb6fa5
      
Packit Service fb6fa5
      break;
Packit Service fb6fa5
      
Packit Service fb6fa5
    case ReparentNotify:
Packit Service fb6fa5
      GDK_NOTE (EVENTS,
Packit Service fb6fa5
		g_message ("reparent notify:\twindow: %ld  x,y: %d %d  parent: %ld	ovr: %d",
Packit Service fb6fa5
			   xevent->xreparent.window,
Packit Service fb6fa5
			   xevent->xreparent.x,
Packit Service fb6fa5
			   xevent->xreparent.y,
Packit Service fb6fa5
			   xevent->xreparent.parent,
Packit Service fb6fa5
			   xevent->xreparent.override_redirect));
Packit Service fb6fa5
Packit Service fb6fa5
      /* Not currently handled */
Packit Service fb6fa5
      return_val = FALSE;
Packit Service fb6fa5
      break;
Packit Service fb6fa5
      
Packit Service fb6fa5
    case ConfigureNotify:
Packit Service fb6fa5
      GDK_NOTE (EVENTS,
Packit Service fb6fa5
		g_message ("configure notify:\twindow: %ld  x,y: %d %d	w,h: %d %d  b-w: %d  above: %ld	 ovr: %d%s",
Packit Service fb6fa5
			   xevent->xconfigure.window,
Packit Service fb6fa5
			   xevent->xconfigure.x,
Packit Service fb6fa5
			   xevent->xconfigure.y,
Packit Service fb6fa5
			   xevent->xconfigure.width,
Packit Service fb6fa5
			   xevent->xconfigure.height,
Packit Service fb6fa5
			   xevent->xconfigure.border_width,
Packit Service fb6fa5
			   xevent->xconfigure.above,
Packit Service fb6fa5
			   xevent->xconfigure.override_redirect,
Packit Service fb6fa5
			   !window
Packit Service fb6fa5
			   ? " (discarding)"
Packit Service fb6fa5
			   : GDK_WINDOW_TYPE (window) == GDK_WINDOW_CHILD
Packit Service fb6fa5
			   ? " (discarding child)"
Packit Service fb6fa5
			   : xevent->xconfigure.event != xevent->xconfigure.window
Packit Service fb6fa5
			   ? " (discarding substructure)"
Packit Service fb6fa5
			   : ""));
Packit Service fb6fa5
      if (window && GDK_WINDOW_TYPE (window) == GDK_WINDOW_ROOT)
Packit Service fb6fa5
        { 
Packit Service fb6fa5
	  window_private->width = xevent->xconfigure.width;
Packit Service fb6fa5
	  window_private->height = xevent->xconfigure.height;
Packit Service fb6fa5
Packit Service fb6fa5
	  _gdk_window_update_size (window);
Packit Service fb6fa5
	  _gdk_x11_drawable_update_size (window_private->impl);
Packit Service fb6fa5
	  _gdk_x11_screen_size_changed (screen, xevent);
Packit Service fb6fa5
        }
Packit Service fb6fa5
Packit Service fb6fa5
      if (window &&
Packit Service fb6fa5
	  xevent->xconfigure.event == xevent->xconfigure.window &&
Packit Service fb6fa5
	  !GDK_WINDOW_DESTROYED (window) &&
Packit Service fb6fa5
	  window_private->input_window != NULL)
Packit Service fb6fa5
	_gdk_input_configure_event (&xevent->xconfigure, window);
Packit Service fb6fa5
      
Packit Service fb6fa5
#ifdef HAVE_XSYNC
Packit Service fb6fa5
      if (toplevel && display_x11->use_sync && !XSyncValueIsZero (toplevel->pending_counter_value))
Packit Service fb6fa5
	{
Packit Service fb6fa5
	  toplevel->current_counter_value = toplevel->pending_counter_value;
Packit Service fb6fa5
	  XSyncIntToValue (&toplevel->pending_counter_value, 0);
Packit Service fb6fa5
	}
Packit Service fb6fa5
#endif
Packit Service fb6fa5
Packit Service fb6fa5
      if (!window ||
Packit Service fb6fa5
	  xevent->xconfigure.event != xevent->xconfigure.window ||
Packit Service fb6fa5
          GDK_WINDOW_TYPE (window) == GDK_WINDOW_CHILD ||
Packit Service fb6fa5
          GDK_WINDOW_TYPE (window) == GDK_WINDOW_ROOT)
Packit Service fb6fa5
	return_val = FALSE;
Packit Service fb6fa5
      else
Packit Service fb6fa5
	{
Packit Service fb6fa5
	  event->configure.type = GDK_CONFIGURE;
Packit Service fb6fa5
	  event->configure.window = window;
Packit Service fb6fa5
	  event->configure.width = xevent->xconfigure.width;
Packit Service fb6fa5
	  event->configure.height = xevent->xconfigure.height;
Packit Service fb6fa5
	  
Packit Service fb6fa5
	  if (!xevent->xconfigure.send_event &&
Packit Service fb6fa5
	      !xevent->xconfigure.override_redirect &&
Packit Service fb6fa5
	      !GDK_WINDOW_DESTROYED (window))
Packit Service fb6fa5
	    {
Packit Service fb6fa5
	      gint tx = 0;
Packit Service fb6fa5
	      gint ty = 0;
Packit Service fb6fa5
	      Window child_window = 0;
Packit Service fb6fa5
Packit Service fb6fa5
	      gdk_error_trap_push ();
Packit Service fb6fa5
	      if (XTranslateCoordinates (GDK_DRAWABLE_XDISPLAY (window),
Packit Service fb6fa5
					 GDK_DRAWABLE_XID (window),
Packit Service fb6fa5
					 screen_x11->xroot_window,
Packit Service fb6fa5
					 0, 0,
Packit Service fb6fa5
					 &tx, &ty,
Packit Service fb6fa5
					 &child_window))
Packit Service fb6fa5
		{
Packit Service fb6fa5
		  event->configure.x = tx;
Packit Service fb6fa5
		  event->configure.y = ty;
Packit Service fb6fa5
		}
Packit Service fb6fa5
	      gdk_error_trap_pop ();
Packit Service fb6fa5
	    }
Packit Service fb6fa5
	  else
Packit Service fb6fa5
	    {
Packit Service fb6fa5
	      event->configure.x = xevent->xconfigure.x;
Packit Service fb6fa5
	      event->configure.y = xevent->xconfigure.y;
Packit Service fb6fa5
	    }
Packit Service fb6fa5
	  window_private->x = event->configure.x;
Packit Service fb6fa5
	  window_private->y = event->configure.y;
Packit Service fb6fa5
	  window_private->width = xevent->xconfigure.width;
Packit Service fb6fa5
	  window_private->height = xevent->xconfigure.height;
Packit Service fb6fa5
	  
Packit Service fb6fa5
	  _gdk_window_update_size (window);
Packit Service fb6fa5
	  _gdk_x11_drawable_update_size (window_private->impl);
Packit Service fb6fa5
	  
Packit Service fb6fa5
	  if (window_private->resize_count >= 1)
Packit Service fb6fa5
	    {
Packit Service fb6fa5
	      window_private->resize_count -= 1;
Packit Service fb6fa5
Packit Service fb6fa5
	      if (window_private->resize_count == 0)
Packit Service fb6fa5
		_gdk_moveresize_configure_done (display, window);
Packit Service fb6fa5
	    }
Packit Service fb6fa5
	}
Packit Service fb6fa5
      break;
Packit Service fb6fa5
      
Packit Service fb6fa5
    case PropertyNotify:
Packit Service fb6fa5
      GDK_NOTE (EVENTS,
Packit Service fb6fa5
		g_message ("property notify:\twindow: %ld, atom(%ld): %s%s%s",
Packit Service fb6fa5
			   xevent->xproperty.window,
Packit Service fb6fa5
			   xevent->xproperty.atom,
Packit Service fb6fa5
			   "\"",
Packit Service fb6fa5
			   gdk_x11_get_xatom_name_for_display (display, xevent->xproperty.atom),
Packit Service fb6fa5
			   "\""));
Packit Service fb6fa5
Packit Service fb6fa5
      if (window_private == NULL)
Packit Service fb6fa5
        {
Packit Service fb6fa5
	  return_val = FALSE;
Packit Service fb6fa5
          break;
Packit Service fb6fa5
        }
Packit Service fb6fa5
Packit Service fb6fa5
      /* We compare with the serial of the last time we mapped the
Packit Service fb6fa5
       * window to avoid refetching properties that we set ourselves
Packit Service fb6fa5
       */
Packit Service fb6fa5
      if (toplevel &&
Packit Service fb6fa5
	  xevent->xproperty.serial >= toplevel->map_serial)
Packit Service fb6fa5
	{
Packit Service fb6fa5
	  if (xevent->xproperty.atom == gdk_x11_get_xatom_by_name_for_display (display, "_NET_WM_STATE"))
Packit Service fb6fa5
	    gdk_check_wm_state_changed (window);
Packit Service fb6fa5
	  
Packit Service fb6fa5
	  if (xevent->xproperty.atom == gdk_x11_get_xatom_by_name_for_display (display, "_NET_WM_DESKTOP"))
Packit Service fb6fa5
	    gdk_check_wm_desktop_changed (window);
Packit Service fb6fa5
	}
Packit Service fb6fa5
      
Packit Service fb6fa5
      if (window_private->event_mask & GDK_PROPERTY_CHANGE_MASK) 
Packit Service fb6fa5
	{
Packit Service fb6fa5
	  event->property.type = GDK_PROPERTY_NOTIFY;
Packit Service fb6fa5
	  event->property.window = window;
Packit Service fb6fa5
	  event->property.atom = gdk_x11_xatom_to_atom_for_display (display, xevent->xproperty.atom);
Packit Service fb6fa5
	  event->property.time = xevent->xproperty.time;
Packit Service fb6fa5
	  event->property.state = xevent->xproperty.state;
Packit Service fb6fa5
	}
Packit Service fb6fa5
      else
Packit Service fb6fa5
	return_val = FALSE;
Packit Service fb6fa5
Packit Service fb6fa5
      break;
Packit Service fb6fa5
      
Packit Service fb6fa5
    case SelectionClear:
Packit Service fb6fa5
      GDK_NOTE (EVENTS,
Packit Service fb6fa5
		g_message ("selection clear:\twindow: %ld",
Packit Service fb6fa5
			   xevent->xproperty.window));
Packit Service fb6fa5
Packit Service fb6fa5
      if (_gdk_selection_filter_clear_event (&xevent->xselectionclear))
Packit Service fb6fa5
	{
Packit Service fb6fa5
	  event->selection.type = GDK_SELECTION_CLEAR;
Packit Service fb6fa5
	  event->selection.window = window;
Packit Service fb6fa5
	  event->selection.selection = gdk_x11_xatom_to_atom_for_display (display, xevent->xselectionclear.selection);
Packit Service fb6fa5
	  event->selection.time = xevent->xselectionclear.time;
Packit Service fb6fa5
	}
Packit Service fb6fa5
      else
Packit Service fb6fa5
	return_val = FALSE;
Packit Service fb6fa5
	  
Packit Service fb6fa5
      break;
Packit Service fb6fa5
      
Packit Service fb6fa5
    case SelectionRequest:
Packit Service fb6fa5
      GDK_NOTE (EVENTS,
Packit Service fb6fa5
		g_message ("selection request:\twindow: %ld",
Packit Service fb6fa5
			   xevent->xproperty.window));
Packit Service fb6fa5
      
Packit Service fb6fa5
      event->selection.type = GDK_SELECTION_REQUEST;
Packit Service fb6fa5
      event->selection.window = window;
Packit Service fb6fa5
      event->selection.selection = gdk_x11_xatom_to_atom_for_display (display, xevent->xselectionrequest.selection);
Packit Service fb6fa5
      event->selection.target = gdk_x11_xatom_to_atom_for_display (display, xevent->xselectionrequest.target);
Packit Service fb6fa5
      event->selection.property = gdk_x11_xatom_to_atom_for_display (display, xevent->xselectionrequest.property);
Packit Service fb6fa5
      event->selection.requestor = xevent->xselectionrequest.requestor;
Packit Service fb6fa5
      event->selection.time = xevent->xselectionrequest.time;
Packit Service fb6fa5
      
Packit Service fb6fa5
      break;
Packit Service fb6fa5
      
Packit Service fb6fa5
    case SelectionNotify:
Packit Service fb6fa5
      GDK_NOTE (EVENTS,
Packit Service fb6fa5
		g_message ("selection notify:\twindow: %ld",
Packit Service fb6fa5
			   xevent->xproperty.window));
Packit Service fb6fa5
      
Packit Service fb6fa5
      
Packit Service fb6fa5
      event->selection.type = GDK_SELECTION_NOTIFY;
Packit Service fb6fa5
      event->selection.window = window;
Packit Service fb6fa5
      event->selection.selection = gdk_x11_xatom_to_atom_for_display (display, xevent->xselection.selection);
Packit Service fb6fa5
      event->selection.target = gdk_x11_xatom_to_atom_for_display (display, xevent->xselection.target);
Packit Service fb6fa5
      if (xevent->xselection.property == None)
Packit Service fb6fa5
        event->selection.property = GDK_NONE;
Packit Service fb6fa5
      else
Packit Service fb6fa5
        event->selection.property = gdk_x11_xatom_to_atom_for_display (display, xevent->xselection.property);
Packit Service fb6fa5
      event->selection.time = xevent->xselection.time;
Packit Service fb6fa5
      
Packit Service fb6fa5
      break;
Packit Service fb6fa5
      
Packit Service fb6fa5
    case ColormapNotify:
Packit Service fb6fa5
      GDK_NOTE (EVENTS,
Packit Service fb6fa5
		g_message ("colormap notify:\twindow: %ld",
Packit Service fb6fa5
			   xevent->xcolormap.window));
Packit Service fb6fa5
      
Packit Service fb6fa5
      /* Not currently handled */
Packit Service fb6fa5
      return_val = FALSE;
Packit Service fb6fa5
      break;
Packit Service fb6fa5
      
Packit Service fb6fa5
    case ClientMessage:
Packit Service fb6fa5
      {
Packit Service fb6fa5
	GList *tmp_list;
Packit Service fb6fa5
	GdkFilterReturn result = GDK_FILTER_CONTINUE;
Packit Service fb6fa5
	GdkAtom message_type = gdk_x11_xatom_to_atom_for_display (display, xevent->xclient.message_type);
Packit Service fb6fa5
Packit Service fb6fa5
	GDK_NOTE (EVENTS,
Packit Service fb6fa5
		  g_message ("client message:\twindow: %ld",
Packit Service fb6fa5
			     xevent->xclient.window));
Packit Service fb6fa5
	
Packit Service fb6fa5
	tmp_list = display_x11->client_filters;
Packit Service fb6fa5
	while (tmp_list)
Packit Service fb6fa5
	  {
Packit Service fb6fa5
	    GdkClientFilter *filter = tmp_list->data;
Packit Service fb6fa5
	    tmp_list = tmp_list->next;
Packit Service fb6fa5
	    
Packit Service fb6fa5
	    if (filter->type == message_type)
Packit Service fb6fa5
	      {
Packit Service fb6fa5
		result = (*filter->function) (xevent, event, filter->data);
Packit Service fb6fa5
		if (result != GDK_FILTER_CONTINUE)
Packit Service fb6fa5
		  break;
Packit Service fb6fa5
	      }
Packit Service fb6fa5
	  }
Packit Service fb6fa5
Packit Service fb6fa5
	switch (result)
Packit Service fb6fa5
	  {
Packit Service fb6fa5
	  case GDK_FILTER_REMOVE:
Packit Service fb6fa5
	    return_val = FALSE;
Packit Service fb6fa5
	    break;
Packit Service fb6fa5
	  case GDK_FILTER_TRANSLATE:
Packit Service fb6fa5
	    return_val = TRUE;
Packit Service fb6fa5
	    break;
Packit Service fb6fa5
	  case GDK_FILTER_CONTINUE:
Packit Service fb6fa5
	    /* Send unknown ClientMessage's on to Gtk for it to use */
Packit Service fb6fa5
            if (window_private == NULL)
Packit Service fb6fa5
              {
Packit Service fb6fa5
                return_val = FALSE;
Packit Service fb6fa5
              }
Packit Service fb6fa5
            else
Packit Service fb6fa5
              {
Packit Service fb6fa5
                event->client.type = GDK_CLIENT_EVENT;
Packit Service fb6fa5
                event->client.window = window;
Packit Service fb6fa5
                event->client.message_type = message_type;
Packit Service fb6fa5
                event->client.data_format = xevent->xclient.format;
Packit Service fb6fa5
                memcpy(&event->client.data, &xevent->xclient.data,
Packit Service fb6fa5
                       sizeof(event->client.data));
Packit Service fb6fa5
              }
Packit Service fb6fa5
            break;
Packit Service fb6fa5
          }
Packit Service fb6fa5
      }
Packit Service fb6fa5
      
Packit Service fb6fa5
      break;
Packit Service fb6fa5
      
Packit Service fb6fa5
    case MappingNotify:
Packit Service fb6fa5
      GDK_NOTE (EVENTS,
Packit Service fb6fa5
		g_message ("mapping notify"));
Packit Service fb6fa5
      
Packit Service fb6fa5
      /* Let XLib know that there is a new keyboard mapping.
Packit Service fb6fa5
       */
Packit Service fb6fa5
      XRefreshKeyboardMapping (&xevent->xmapping);
Packit Service fb6fa5
      _gdk_keymap_keys_changed (display);
Packit Service fb6fa5
      return_val = FALSE;
Packit Service fb6fa5
      break;
Packit Service fb6fa5
Packit Service fb6fa5
    default:
Packit Service fb6fa5
#ifdef HAVE_XKB
Packit Service fb6fa5
      if (xevent->type == display_x11->xkb_event_type)
Packit Service fb6fa5
	{
Packit Service fb6fa5
	  XkbEvent *xkb_event = (XkbEvent *)xevent;
Packit Service fb6fa5
Packit Service fb6fa5
	  switch (xkb_event->any.xkb_type)
Packit Service fb6fa5
	    {
Packit Service fb6fa5
	    case XkbNewKeyboardNotify:
Packit Service fb6fa5
	    case XkbMapNotify:
Packit Service fb6fa5
	      _gdk_keymap_keys_changed (display);
Packit Service fb6fa5
Packit Service fb6fa5
	      return_val = FALSE;
Packit Service fb6fa5
	      break;
Packit Service fb6fa5
	      
Packit Service fb6fa5
	    case XkbStateNotify:
Packit Service fb6fa5
	      _gdk_keymap_state_changed (display, xevent);
Packit Service fb6fa5
	      break;
Packit Service fb6fa5
	    }
Packit Service fb6fa5
	}
Packit Service fb6fa5
      else
Packit Service fb6fa5
#endif
Packit Service fb6fa5
#ifdef HAVE_XFIXES
Packit Service fb6fa5
      if (xevent->type - display_x11->xfixes_event_base == XFixesSelectionNotify)
Packit Service fb6fa5
	{
Packit Service fb6fa5
	  XFixesSelectionNotifyEvent *selection_notify = (XFixesSelectionNotifyEvent *)xevent;
Packit Service fb6fa5
Packit Service fb6fa5
	  _gdk_x11_screen_process_owner_change (screen, xevent);
Packit Service fb6fa5
	  
Packit Service fb6fa5
	  event->owner_change.type = GDK_OWNER_CHANGE;
Packit Service fb6fa5
	  event->owner_change.window = window;
Packit Service fb6fa5
	  event->owner_change.owner = selection_notify->owner;
Packit Service fb6fa5
	  event->owner_change.reason = selection_notify->subtype;
Packit Service fb6fa5
	  event->owner_change.selection = 
Packit Service fb6fa5
	    gdk_x11_xatom_to_atom_for_display (display, 
Packit Service fb6fa5
					       selection_notify->selection);
Packit Service fb6fa5
	  event->owner_change.time = selection_notify->timestamp;
Packit Service fb6fa5
	  event->owner_change.selection_time = selection_notify->selection_timestamp;
Packit Service fb6fa5
	  
Packit Service fb6fa5
	  return_val = TRUE;
Packit Service fb6fa5
	}
Packit Service fb6fa5
      else
Packit Service fb6fa5
#endif
Packit Service fb6fa5
#ifdef HAVE_RANDR
Packit Service fb6fa5
      if (xevent->type - display_x11->xrandr_event_base == RRScreenChangeNotify ||
Packit Service fb6fa5
          xevent->type - display_x11->xrandr_event_base == RRNotify)
Packit Service fb6fa5
	{
Packit Service fb6fa5
          if (screen)
Packit Service fb6fa5
            _gdk_x11_screen_size_changed (screen, xevent);
Packit Service fb6fa5
	}
Packit Service fb6fa5
      else
Packit Service fb6fa5
#endif
Packit Service fb6fa5
#if defined(HAVE_XCOMPOSITE) && defined (HAVE_XDAMAGE) && defined (HAVE_XFIXES)
Packit Service fb6fa5
      if (display_x11->have_xdamage && window_private && window_private->composited &&
Packit Service fb6fa5
	  xevent->type == display_x11->xdamage_event_base + XDamageNotify &&
Packit Service fb6fa5
	  ((XDamageNotifyEvent *) xevent)->damage == window_impl->damage)
Packit Service fb6fa5
	{
Packit Service fb6fa5
	  XDamageNotifyEvent *damage_event = (XDamageNotifyEvent *) xevent;
Packit Service fb6fa5
	  XserverRegion repair;
Packit Service fb6fa5
	  GdkRectangle rect;
Packit Service fb6fa5
Packit Service fb6fa5
	  rect.x = window_private->x + damage_event->area.x;
Packit Service fb6fa5
	  rect.y = window_private->y + damage_event->area.y;
Packit Service fb6fa5
	  rect.width = damage_event->area.width;
Packit Service fb6fa5
	  rect.height = damage_event->area.height;
Packit Service fb6fa5
Packit Service fb6fa5
	  repair = XFixesCreateRegion (display_x11->xdisplay,
Packit Service fb6fa5
				       &damage_event->area, 1);
Packit Service fb6fa5
	  XDamageSubtract (display_x11->xdisplay,
Packit Service fb6fa5
			   window_impl->damage,
Packit Service fb6fa5
			   repair, None);
Packit Service fb6fa5
	  XFixesDestroyRegion (display_x11->xdisplay, repair);
Packit Service fb6fa5
Packit Service fb6fa5
	  if (window_private->parent != NULL)
Packit Service fb6fa5
	    _gdk_window_process_expose (GDK_WINDOW (window_private->parent),
Packit Service fb6fa5
					damage_event->serial, &rect);
Packit Service fb6fa5
Packit Service fb6fa5
	  return_val = TRUE;
Packit Service fb6fa5
	}
Packit Service fb6fa5
      else
Packit Service fb6fa5
#endif
Packit Service fb6fa5
	{
Packit Service fb6fa5
	  /* something else - (e.g., a Xinput event) */
Packit Service fb6fa5
	  
Packit Service fb6fa5
	  if (window_private &&
Packit Service fb6fa5
	      !GDK_WINDOW_DESTROYED (window_private) &&
Packit Service fb6fa5
	      window_private->input_window)
Packit Service fb6fa5
	    return_val = _gdk_input_other_event (event, xevent, window);
Packit Service fb6fa5
	  else
Packit Service fb6fa5
	    return_val = FALSE;
Packit Service fb6fa5
	  
Packit Service fb6fa5
	  break;
Packit Service fb6fa5
	}
Packit Service fb6fa5
    }
Packit Service fb6fa5
Packit Service fb6fa5
 done:
Packit Service fb6fa5
  if (return_val)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      if (event->any.window)
Packit Service fb6fa5
	g_object_ref (event->any.window);
Packit Service fb6fa5
      if (((event->any.type == GDK_ENTER_NOTIFY) ||
Packit Service fb6fa5
	   (event->any.type == GDK_LEAVE_NOTIFY)) &&
Packit Service fb6fa5
	  (event->crossing.subwindow != NULL))
Packit Service fb6fa5
	g_object_ref (event->crossing.subwindow);
Packit Service fb6fa5
    }
Packit Service fb6fa5
  else
Packit Service fb6fa5
    {
Packit Service fb6fa5
      /* Mark this event as having no resources to be freed */
Packit Service fb6fa5
      event->any.window = NULL;
Packit Service fb6fa5
      event->any.type = GDK_NOTHING;
Packit Service fb6fa5
    }
Packit Service fb6fa5
  
Packit Service fb6fa5
  if (window)
Packit Service fb6fa5
    g_object_unref (window);
Packit Service fb6fa5
Packit Service fb6fa5
  return return_val;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static GdkFilterReturn
Packit Service fb6fa5
gdk_wm_protocols_filter (GdkXEvent *xev,
Packit Service fb6fa5
			 GdkEvent  *event,
Packit Service fb6fa5
			 gpointer data)
Packit Service fb6fa5
{
Packit Service fb6fa5
  XEvent *xevent = (XEvent *)xev;
Packit Service fb6fa5
  GdkWindow *win = event->any.window;
Packit Service fb6fa5
  GdkDisplay *display;
Packit Service fb6fa5
  Atom atom;
Packit Service fb6fa5
Packit Service fb6fa5
  if (!win)
Packit Service fb6fa5
      return GDK_FILTER_REMOVE;    
Packit Service fb6fa5
Packit Service fb6fa5
  display = GDK_WINDOW_DISPLAY (win);
Packit Service fb6fa5
  atom = (Atom)xevent->xclient.data.l[0];
Packit Service fb6fa5
Packit Service fb6fa5
  if (atom == gdk_x11_get_xatom_by_name_for_display (display, "WM_DELETE_WINDOW"))
Packit Service fb6fa5
    {
Packit Service fb6fa5
  /* The delete window request specifies a window
Packit Service fb6fa5
   *  to delete. We don't actually destroy the
Packit Service fb6fa5
   *  window because "it is only a request". (The
Packit Service fb6fa5
   *  window might contain vital data that the
Packit Service fb6fa5
   *  program does not want destroyed). Instead
Packit Service fb6fa5
   *  the event is passed along to the program,
Packit Service fb6fa5
   *  which should then destroy the window.
Packit Service fb6fa5
   */
Packit Service fb6fa5
      GDK_NOTE (EVENTS,
Packit Service fb6fa5
		g_message ("delete window:\t\twindow: %ld",
Packit Service fb6fa5
			   xevent->xclient.window));
Packit Service fb6fa5
      
Packit Service fb6fa5
      event->any.type = GDK_DELETE;
Packit Service fb6fa5
Packit Service fb6fa5
      gdk_x11_window_set_user_time (win, xevent->xclient.data.l[1]);
Packit Service fb6fa5
Packit Service fb6fa5
      return GDK_FILTER_TRANSLATE;
Packit Service fb6fa5
    }
Packit Service fb6fa5
  else if (atom == gdk_x11_get_xatom_by_name_for_display (display, "WM_TAKE_FOCUS"))
Packit Service fb6fa5
    {
Packit Service fb6fa5
      GdkToplevelX11 *toplevel = _gdk_x11_window_get_toplevel (event->any.window);
Packit Service fb6fa5
      GdkWindowObject *private = (GdkWindowObject *)win;
Packit Service fb6fa5
Packit Service fb6fa5
      /* There is no way of knowing reliably whether we are viewable;
Packit Service fb6fa5
       * _gdk_x11_set_input_focus_safe() traps errors asynchronously.
Packit Service fb6fa5
       */
Packit Service fb6fa5
      if (toplevel && private->accept_focus)
Packit Service fb6fa5
	_gdk_x11_set_input_focus_safe (display, toplevel->focus_window,
Packit Service fb6fa5
				       RevertToParent,
Packit Service fb6fa5
				       xevent->xclient.data.l[1]);
Packit Service fb6fa5
Packit Service fb6fa5
      return GDK_FILTER_REMOVE;
Packit Service fb6fa5
    }
Packit Service fb6fa5
  else if (atom == gdk_x11_get_xatom_by_name_for_display (display, "_NET_WM_PING") &&
Packit Service fb6fa5
	   !_gdk_x11_display_is_root_window (display,
Packit Service fb6fa5
					     xevent->xclient.window))
Packit Service fb6fa5
    {
Packit Service fb6fa5
      XClientMessageEvent xclient = xevent->xclient;
Packit Service fb6fa5
      
Packit Service fb6fa5
      xclient.window = GDK_WINDOW_XROOTWIN (win);
Packit Service fb6fa5
      XSendEvent (GDK_WINDOW_XDISPLAY (win), 
Packit Service fb6fa5
		  xclient.window,
Packit Service fb6fa5
		  False, 
Packit Service fb6fa5
		  SubstructureRedirectMask | SubstructureNotifyMask, (XEvent *)&xclient);
Packit Service fb6fa5
Packit Service fb6fa5
      return GDK_FILTER_REMOVE;
Packit Service fb6fa5
    }
Packit Service fb6fa5
  else if (atom == gdk_x11_get_xatom_by_name_for_display (display, "_NET_WM_SYNC_REQUEST") &&
Packit Service fb6fa5
	   GDK_DISPLAY_X11 (display)->use_sync)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      GdkToplevelX11 *toplevel = _gdk_x11_window_get_toplevel (event->any.window);
Packit Service fb6fa5
      if (toplevel)
Packit Service fb6fa5
	{
Packit Service fb6fa5
#ifdef HAVE_XSYNC
Packit Service fb6fa5
	  XSyncIntsToValue (&toplevel->pending_counter_value, 
Packit Service fb6fa5
			    xevent->xclient.data.l[2], 
Packit Service fb6fa5
			    xevent->xclient.data.l[3]);
Packit Service fb6fa5
#endif
Packit Service fb6fa5
	}
Packit Service fb6fa5
      return GDK_FILTER_REMOVE;
Packit Service fb6fa5
    }
Packit Service fb6fa5
  
Packit Service fb6fa5
  return GDK_FILTER_CONTINUE;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
void
Packit Service fb6fa5
_gdk_events_queue (GdkDisplay *display)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GList *node;
Packit Service fb6fa5
  GdkEvent *event;
Packit Service fb6fa5
  XEvent xevent;
Packit Service fb6fa5
  Display *xdisplay = GDK_DISPLAY_XDISPLAY (display);
Packit Service fb6fa5
Packit Service fb6fa5
  while (!_gdk_event_queue_find_first(display) && XPending (xdisplay))
Packit Service fb6fa5
    {
Packit Service fb6fa5
      XNextEvent (xdisplay, &xevent);
Packit Service fb6fa5
Packit Service fb6fa5
      switch (xevent.type)
Packit Service fb6fa5
	{
Packit Service fb6fa5
	case KeyPress:
Packit Service fb6fa5
	case KeyRelease:
Packit Service fb6fa5
	  break;
Packit Service fb6fa5
	default:
Packit Service fb6fa5
	  if (XFilterEvent (&xevent, None))
Packit Service fb6fa5
	    continue;
Packit Service fb6fa5
	}
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
      event->any.send_event = xevent.xany.send_event ? TRUE : FALSE;
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 (display, event, &xevent, FALSE))
Packit Service fb6fa5
	{
Packit Service fb6fa5
	  ((GdkEventPrivate *)event)->flags &= ~GDK_EVENT_PENDING;
Packit Service fb6fa5
          _gdk_windowing_got_event (display, node, event, xevent.xany.serial);
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
Packit Service fb6fa5
static gboolean  
Packit Service fb6fa5
gdk_event_prepare (GSource  *source,
Packit Service fb6fa5
		   gint     *timeout)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GdkDisplay *display = ((GdkDisplaySource*)source)->display;
Packit Service fb6fa5
  gboolean retval;
Packit Service fb6fa5
  
Packit Service fb6fa5
  GDK_THREADS_ENTER ();
Packit Service fb6fa5
Packit Service fb6fa5
  *timeout = -1;
Packit Service fb6fa5
  retval = (_gdk_event_queue_find_first (display) != NULL || 
Packit Service fb6fa5
	    gdk_check_xpending (display));
Packit Service fb6fa5
  
Packit Service fb6fa5
  GDK_THREADS_LEAVE ();
Packit Service fb6fa5
Packit Service fb6fa5
  return retval;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static gboolean  
Packit Service fb6fa5
gdk_event_check (GSource *source) 
Packit Service fb6fa5
{
Packit Service fb6fa5
  GdkDisplaySource *display_source = (GdkDisplaySource*)source;
Packit Service fb6fa5
  gboolean retval;
Packit Service fb6fa5
Packit Service fb6fa5
  GDK_THREADS_ENTER ();
Packit Service fb6fa5
Packit Service fb6fa5
  if (display_source->event_poll_fd.revents & G_IO_IN)
Packit Service fb6fa5
    retval = (_gdk_event_queue_find_first (display_source->display) != NULL || 
Packit Service fb6fa5
	      gdk_check_xpending (display_source->display));
Packit Service fb6fa5
  else
Packit Service fb6fa5
    retval = FALSE;
Packit Service fb6fa5
Packit Service fb6fa5
  GDK_THREADS_LEAVE ();
Packit Service fb6fa5
Packit Service fb6fa5
  return retval;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static gboolean  
Packit Service fb6fa5
gdk_event_dispatch (GSource    *source,
Packit Service fb6fa5
		    GSourceFunc callback,
Packit Service fb6fa5
		    gpointer    user_data)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GdkDisplay *display = ((GdkDisplaySource*)source)->display;
Packit Service fb6fa5
  GdkEvent *event;
Packit Service fb6fa5
 
Packit Service fb6fa5
  GDK_THREADS_ENTER ();
Packit Service fb6fa5
Packit Service fb6fa5
  _gdk_events_queue (display);
Packit Service fb6fa5
  event = _gdk_event_unqueue (display);
Packit Service fb6fa5
Packit Service fb6fa5
  if (event)
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
  return TRUE;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
/**
Packit Service fb6fa5
 * gdk_event_send_client_message_for_display:
Packit Service fb6fa5
 * @display: the #GdkDisplay for the window where the message is to be sent.
Packit Service fb6fa5
 * @event: the #GdkEvent to send, which should be a #GdkEventClient.
Packit Service fb6fa5
 * @winid: the window to send the client message to.
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * On X11, sends an X ClientMessage event to a given window. On
Packit Service fb6fa5
 * Windows, sends a message registered with the name
Packit Service fb6fa5
 * GDK_WIN32_CLIENT_MESSAGE.
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * This could be used for communicating between different
Packit Service fb6fa5
 * applications, though the amount of data is limited to 20 bytes on
Packit Service fb6fa5
 * X11, and to just four bytes on Windows.
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Returns: non-zero on success.
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Since: 2.2
Packit Service fb6fa5
 */
Packit Service fb6fa5
gboolean
Packit Service fb6fa5
gdk_event_send_client_message_for_display (GdkDisplay     *display,
Packit Service fb6fa5
					   GdkEvent       *event,
Packit Service fb6fa5
					   GdkNativeWindow winid)
Packit Service fb6fa5
{
Packit Service fb6fa5
  XEvent sev;
Packit Service fb6fa5
  
Packit Service fb6fa5
  g_return_val_if_fail(event != NULL, FALSE);
Packit Service fb6fa5
Packit Service fb6fa5
  /* Set up our event to send, with the exception of its target window */
Packit Service fb6fa5
  sev.xclient.type = ClientMessage;
Packit Service fb6fa5
  sev.xclient.display = GDK_DISPLAY_XDISPLAY (display);
Packit Service fb6fa5
  sev.xclient.format = event->client.data_format;
Packit Service fb6fa5
  sev.xclient.window = winid;
Packit Service fb6fa5
  memcpy(&sev.xclient.data, &event->client.data, sizeof (sev.xclient.data));
Packit Service fb6fa5
  sev.xclient.message_type = gdk_x11_atom_to_xatom_for_display (display, event->client.message_type);
Packit Service fb6fa5
  
Packit Service fb6fa5
  return _gdk_send_xevent (display, winid, False, NoEventMask, &sev;;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
Packit Service fb6fa5
Packit Service fb6fa5
/* Sends a ClientMessage to all toplevel client windows */
Packit Service fb6fa5
static gboolean
Packit Service fb6fa5
gdk_event_send_client_message_to_all_recurse (GdkDisplay *display,
Packit Service fb6fa5
					      XEvent     *xev, 
Packit Service fb6fa5
					      guint32     xid,
Packit Service fb6fa5
					      guint       level)
Packit Service fb6fa5
{
Packit Service fb6fa5
  Atom type = None;
Packit Service fb6fa5
  int format;
Packit Service fb6fa5
  unsigned long nitems, after;
Packit Service fb6fa5
  unsigned char *data;
Packit Service fb6fa5
  Window *ret_children, ret_root, ret_parent;
Packit Service fb6fa5
  unsigned int ret_nchildren;
Packit Service fb6fa5
  gboolean send = FALSE;
Packit Service fb6fa5
  gboolean found = FALSE;
Packit Service fb6fa5
  gboolean result = FALSE;
Packit Service fb6fa5
  int i;
Packit Service fb6fa5
  
Packit Service fb6fa5
  gdk_error_trap_push ();
Packit Service fb6fa5
  
Packit Service fb6fa5
  if (XGetWindowProperty (GDK_DISPLAY_XDISPLAY (display), xid, 
Packit Service fb6fa5
			  gdk_x11_get_xatom_by_name_for_display (display, "WM_STATE"),
Packit Service fb6fa5
			  0, 0, False, AnyPropertyType,
Packit Service fb6fa5
			  &type, &format, &nitems, &after, &data) != Success)
Packit Service fb6fa5
    goto out;
Packit Service fb6fa5
  
Packit Service fb6fa5
  if (type)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      send = TRUE;
Packit Service fb6fa5
      XFree (data);
Packit Service fb6fa5
    }
Packit Service fb6fa5
  else
Packit Service fb6fa5
    {
Packit Service fb6fa5
      /* OK, we're all set, now let's find some windows to send this to */
Packit Service fb6fa5
      if (!XQueryTree (GDK_DISPLAY_XDISPLAY (display), xid,
Packit Service fb6fa5
		      &ret_root, &ret_parent,
Packit Service fb6fa5
		      &ret_children, &ret_nchildren))	
Packit Service fb6fa5
	goto out;
Packit Service fb6fa5
Packit Service fb6fa5
      for(i = 0; i < ret_nchildren; i++)
Packit Service fb6fa5
	if (gdk_event_send_client_message_to_all_recurse (display, xev, ret_children[i], level + 1))
Packit Service fb6fa5
	  found = TRUE;
Packit Service fb6fa5
Packit Service fb6fa5
      XFree (ret_children);
Packit Service fb6fa5
    }
Packit Service fb6fa5
Packit Service fb6fa5
  if (send || (!found && (level == 1)))
Packit Service fb6fa5
    {
Packit Service fb6fa5
      xev->xclient.window = xid;
Packit Service fb6fa5
      _gdk_send_xevent (display, xid, False, NoEventMask, xev);
Packit Service fb6fa5
    }
Packit Service fb6fa5
Packit Service fb6fa5
  result = send || found;
Packit Service fb6fa5
Packit Service fb6fa5
 out:
Packit Service fb6fa5
  gdk_error_trap_pop ();
Packit Service fb6fa5
Packit Service fb6fa5
  return result;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
/**
Packit Service fb6fa5
 * gdk_screen_broadcast_client_message:
Packit Service fb6fa5
 * @screen: the #GdkScreen where the event will be broadcasted.
Packit Service fb6fa5
 * @event: the #GdkEvent.
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * On X11, sends an X ClientMessage event to all toplevel windows on
Packit Service fb6fa5
 * @screen. 
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Toplevel windows are determined by checking for the WM_STATE property, 
Packit Service fb6fa5
 * as described in the Inter-Client Communication Conventions Manual (ICCCM).
Packit Service fb6fa5
 * If no windows are found with the WM_STATE property set, the message is 
Packit Service fb6fa5
 * sent to all children of the root window.
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * On Windows, broadcasts a message registered with the name
Packit Service fb6fa5
 * GDK_WIN32_CLIENT_MESSAGE to all top-level windows. The amount of
Packit Service fb6fa5
 * data is limited to one long, i.e. four bytes.
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Since: 2.2
Packit Service fb6fa5
 */
Packit Service fb6fa5
Packit Service fb6fa5
void
Packit Service fb6fa5
gdk_screen_broadcast_client_message (GdkScreen *screen, 
Packit Service fb6fa5
				     GdkEvent  *event)
Packit Service fb6fa5
{
Packit Service fb6fa5
  XEvent sev;
Packit Service fb6fa5
  GdkWindow *root_window;
Packit Service fb6fa5
Packit Service fb6fa5
  g_return_if_fail (event != NULL);
Packit Service fb6fa5
  
Packit Service fb6fa5
  root_window = gdk_screen_get_root_window (screen);
Packit Service fb6fa5
  
Packit Service fb6fa5
  /* Set up our event to send, with the exception of its target window */
Packit Service fb6fa5
  sev.xclient.type = ClientMessage;
Packit Service fb6fa5
  sev.xclient.display = GDK_WINDOW_XDISPLAY (root_window);
Packit Service fb6fa5
  sev.xclient.format = event->client.data_format;
Packit Service fb6fa5
  memcpy(&sev.xclient.data, &event->client.data, sizeof (sev.xclient.data));
Packit Service fb6fa5
  sev.xclient.message_type = 
Packit Service fb6fa5
    gdk_x11_atom_to_xatom_for_display (GDK_WINDOW_DISPLAY (root_window),
Packit Service fb6fa5
				       event->client.message_type);
Packit Service fb6fa5
Packit Service fb6fa5
  gdk_event_send_client_message_to_all_recurse (gdk_screen_get_display (screen),
Packit Service fb6fa5
						&sev, 
Packit Service fb6fa5
						GDK_WINDOW_XID (root_window), 
Packit Service fb6fa5
						0);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
/*
Packit Service fb6fa5
 *--------------------------------------------------------------
Packit Service fb6fa5
 * gdk_flush
Packit Service fb6fa5
 *
Packit Service fb6fa5
 *   Flushes the Xlib output buffer and then waits
Packit Service fb6fa5
 *   until all requests have been received and processed
Packit Service fb6fa5
 *   by the X server. The only real use for this function
Packit Service fb6fa5
 *   is in dealing with XShm.
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Arguments:
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Results:
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Side effects:
Packit Service fb6fa5
 *
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
  GSList *tmp_list = _gdk_displays;
Packit Service fb6fa5
  
Packit Service fb6fa5
  while (tmp_list)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      XSync (GDK_DISPLAY_XDISPLAY (tmp_list->data), False);
Packit Service fb6fa5
      tmp_list = tmp_list->next;
Packit Service fb6fa5
    }
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static Bool
Packit Service fb6fa5
timestamp_predicate (Display *display,
Packit Service fb6fa5
		     XEvent  *xevent,
Packit Service fb6fa5
		     XPointer arg)
Packit Service fb6fa5
{
Packit Service fb6fa5
  Window xwindow = GPOINTER_TO_UINT (arg);
Packit Service fb6fa5
  GdkDisplay *gdk_display = gdk_x11_lookup_xdisplay (display);
Packit Service fb6fa5
Packit Service fb6fa5
  if (xevent->type == PropertyNotify &&
Packit Service fb6fa5
      xevent->xproperty.window == xwindow &&
Packit Service fb6fa5
      xevent->xproperty.atom == gdk_x11_get_xatom_by_name_for_display (gdk_display,
Packit Service fb6fa5
								       "GDK_TIMESTAMP_PROP"))
Packit Service fb6fa5
    return True;
Packit Service fb6fa5
Packit Service fb6fa5
  return False;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
/**
Packit Service fb6fa5
 * gdk_x11_get_server_time:
Packit Service fb6fa5
 * @window: a #GdkWindow, used for communication with the server.
Packit Service fb6fa5
 *          The window must have GDK_PROPERTY_CHANGE_MASK in its
Packit Service fb6fa5
 *          events mask or a hang will result.
Packit Service fb6fa5
 * 
Packit Service fb6fa5
 * Routine to get the current X server time stamp. 
Packit Service fb6fa5
 * 
Packit Service fb6fa5
 * Return value: the time stamp.
Packit Service fb6fa5
 **/
Packit Service fb6fa5
guint32
Packit Service fb6fa5
gdk_x11_get_server_time (GdkWindow *window)
Packit Service fb6fa5
{
Packit Service fb6fa5
  Display *xdisplay;
Packit Service fb6fa5
  Window   xwindow;
Packit Service fb6fa5
  guchar c = 'a';
Packit Service fb6fa5
  XEvent xevent;
Packit Service fb6fa5
  Atom timestamp_prop_atom;
Packit Service fb6fa5
Packit Service fb6fa5
  g_return_val_if_fail (GDK_IS_WINDOW (window), 0);
Packit Service fb6fa5
  g_return_val_if_fail (!GDK_WINDOW_DESTROYED (window), 0);
Packit Service fb6fa5
Packit Service fb6fa5
  xdisplay = GDK_WINDOW_XDISPLAY (window);
Packit Service fb6fa5
  xwindow = GDK_WINDOW_XWINDOW (window);
Packit Service fb6fa5
  timestamp_prop_atom = 
Packit Service fb6fa5
    gdk_x11_get_xatom_by_name_for_display (GDK_WINDOW_DISPLAY (window),
Packit Service fb6fa5
					   "GDK_TIMESTAMP_PROP");
Packit Service fb6fa5
  
Packit Service fb6fa5
  XChangeProperty (xdisplay, xwindow, timestamp_prop_atom,
Packit Service fb6fa5
		   timestamp_prop_atom,
Packit Service fb6fa5
		   8, PropModeReplace, &c, 1);
Packit Service fb6fa5
Packit Service fb6fa5
  XIfEvent (xdisplay, &xevent,
Packit Service fb6fa5
	    timestamp_predicate, GUINT_TO_POINTER(xwindow));
Packit Service fb6fa5
Packit Service fb6fa5
  return xevent.xproperty.time;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
fetch_net_wm_check_window (GdkScreen *screen)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GdkScreenX11 *screen_x11;
Packit Service fb6fa5
  GdkDisplay *display;
Packit Service fb6fa5
  Atom type;
Packit Service fb6fa5
  gint format;
Packit Service fb6fa5
  gulong n_items;
Packit Service fb6fa5
  gulong bytes_after;
Packit Service fb6fa5
  guchar *data;
Packit Service fb6fa5
  Window *xwindow;
Packit Service fb6fa5
  GTimeVal tv;
Packit Service fb6fa5
  gint error;
Packit Service fb6fa5
Packit Service fb6fa5
  screen_x11 = GDK_SCREEN_X11 (screen);
Packit Service fb6fa5
  display = screen_x11->display;
Packit Service fb6fa5
Packit Service fb6fa5
  g_return_if_fail (GDK_DISPLAY_X11 (display)->trusted_client);
Packit Service fb6fa5
  
Packit Service fb6fa5
  g_get_current_time (&tv;;
Packit Service fb6fa5
Packit Service fb6fa5
  if (ABS  (tv.tv_sec - screen_x11->last_wmspec_check_time) < 15)
Packit Service fb6fa5
    return; /* we've checked recently */
Packit Service fb6fa5
Packit Service fb6fa5
  screen_x11->last_wmspec_check_time = tv.tv_sec;
Packit Service fb6fa5
Packit Service fb6fa5
  data = NULL;
Packit Service fb6fa5
  XGetWindowProperty (screen_x11->xdisplay, screen_x11->xroot_window,
Packit Service fb6fa5
		      gdk_x11_get_xatom_by_name_for_display (display, "_NET_SUPPORTING_WM_CHECK"),
Packit Service fb6fa5
		      0, G_MAXLONG, False, XA_WINDOW, &type, &format,
Packit Service fb6fa5
		      &n_items, &bytes_after, &data);
Packit Service fb6fa5
  
Packit Service fb6fa5
  if (type != XA_WINDOW)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      if (data)
Packit Service fb6fa5
        XFree (data);
Packit Service fb6fa5
      return;
Packit Service fb6fa5
    }
Packit Service fb6fa5
Packit Service fb6fa5
  xwindow = (Window *)data;
Packit Service fb6fa5
Packit Service fb6fa5
  if (screen_x11->wmspec_check_window == *xwindow)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      XFree (xwindow);
Packit Service fb6fa5
      return;
Packit Service fb6fa5
    }
Packit Service fb6fa5
Packit Service fb6fa5
  gdk_error_trap_push ();
Packit Service fb6fa5
Packit Service fb6fa5
  /* Find out if this WM goes away, so we can reset everything. */
Packit Service fb6fa5
  XSelectInput (screen_x11->xdisplay, *xwindow, StructureNotifyMask);
Packit Service fb6fa5
  gdk_display_sync (display);
Packit Service fb6fa5
Packit Service fb6fa5
  error = gdk_error_trap_pop ();
Packit Service fb6fa5
  if (!error)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      screen_x11->wmspec_check_window = *xwindow;
Packit Service fb6fa5
      screen_x11->need_refetch_net_supported = TRUE;
Packit Service fb6fa5
      screen_x11->need_refetch_wm_name = TRUE;
Packit Service fb6fa5
Packit Service fb6fa5
      /* Careful, reentrancy */
Packit Service fb6fa5
      _gdk_x11_screen_window_manager_changed (GDK_SCREEN (screen_x11));
Packit Service fb6fa5
    }
Packit Service fb6fa5
  else if (error == BadWindow)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      /* Leftover property, try again immediately, new wm may be starting up */
Packit Service fb6fa5
      screen_x11->last_wmspec_check_time = 0;
Packit Service fb6fa5
    }
Packit Service fb6fa5
Packit Service fb6fa5
  XFree (xwindow);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
/**
Packit Service fb6fa5
 * gdk_x11_screen_get_window_manager_name:
Packit Service fb6fa5
 * @screen: a #GdkScreen 
Packit Service fb6fa5
 * 
Packit Service fb6fa5
 * Returns the name of the window manager for @screen. 
Packit Service fb6fa5
 * 
Packit Service fb6fa5
 * Return value: the name of the window manager screen @screen, or 
Packit Service fb6fa5
 * "unknown" if the window manager is unknown. The string is owned by GDK
Packit Service fb6fa5
 * and should not be freed.
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Since: 2.2
Packit Service fb6fa5
 **/
Packit Service fb6fa5
const char*
Packit Service fb6fa5
gdk_x11_screen_get_window_manager_name (GdkScreen *screen)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GdkScreenX11 *screen_x11;
Packit Service fb6fa5
Packit Service fb6fa5
  screen_x11 = GDK_SCREEN_X11 (screen);
Packit Service fb6fa5
  
Packit Service fb6fa5
  if (!G_LIKELY (GDK_DISPLAY_X11 (screen_x11->display)->trusted_client))
Packit Service fb6fa5
    return screen_x11->window_manager_name;
Packit Service fb6fa5
Packit Service fb6fa5
  fetch_net_wm_check_window (screen);
Packit Service fb6fa5
Packit Service fb6fa5
  if (screen_x11->need_refetch_wm_name)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      /* Get the name of the window manager */
Packit Service fb6fa5
      screen_x11->need_refetch_wm_name = FALSE;
Packit Service fb6fa5
Packit Service fb6fa5
      g_free (screen_x11->window_manager_name);
Packit Service fb6fa5
      screen_x11->window_manager_name = g_strdup ("unknown");
Packit Service fb6fa5
      
Packit Service fb6fa5
      if (screen_x11->wmspec_check_window != None)
Packit Service fb6fa5
        {
Packit Service fb6fa5
          Atom type;
Packit Service fb6fa5
          gint format;
Packit Service fb6fa5
          gulong n_items;
Packit Service fb6fa5
          gulong bytes_after;
Packit Service fb6fa5
          gchar *name;
Packit Service fb6fa5
          
Packit Service fb6fa5
          name = NULL;
Packit Service fb6fa5
Packit Service fb6fa5
	  gdk_error_trap_push ();
Packit Service fb6fa5
          
Packit Service fb6fa5
          XGetWindowProperty (GDK_DISPLAY_XDISPLAY (screen_x11->display),
Packit Service fb6fa5
                              screen_x11->wmspec_check_window,
Packit Service fb6fa5
                              gdk_x11_get_xatom_by_name_for_display (screen_x11->display,
Packit Service fb6fa5
                                                                     "_NET_WM_NAME"),
Packit Service fb6fa5
                              0, G_MAXLONG, False,
Packit Service fb6fa5
                              gdk_x11_get_xatom_by_name_for_display (screen_x11->display,
Packit Service fb6fa5
                                                                     "UTF8_STRING"),
Packit Service fb6fa5
                              &type, &format, 
Packit Service fb6fa5
                              &n_items, &bytes_after,
Packit Service fb6fa5
                              (guchar **)&name);
Packit Service fb6fa5
          
Packit Service fb6fa5
          gdk_display_sync (screen_x11->display);
Packit Service fb6fa5
          
Packit Service fb6fa5
          gdk_error_trap_pop ();
Packit Service fb6fa5
          
Packit Service fb6fa5
          if (name != NULL)
Packit Service fb6fa5
            {
Packit Service fb6fa5
              g_free (screen_x11->window_manager_name);
Packit Service fb6fa5
              screen_x11->window_manager_name = g_strdup (name);
Packit Service fb6fa5
              XFree (name);
Packit Service fb6fa5
            }
Packit Service fb6fa5
        }
Packit Service fb6fa5
    }
Packit Service fb6fa5
  
Packit Service fb6fa5
  return GDK_SCREEN_X11 (screen)->window_manager_name;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
typedef struct _NetWmSupportedAtoms NetWmSupportedAtoms;
Packit Service fb6fa5
Packit Service fb6fa5
struct _NetWmSupportedAtoms
Packit Service fb6fa5
{
Packit Service fb6fa5
  Atom *atoms;
Packit Service fb6fa5
  gulong n_atoms;
Packit Service fb6fa5
};
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
cleanup_atoms(gpointer data)
Packit Service fb6fa5
{
Packit Service fb6fa5
  NetWmSupportedAtoms *supported_atoms = data;
Packit Service fb6fa5
  if (supported_atoms->atoms)
Packit Service fb6fa5
      XFree (supported_atoms->atoms);
Packit Service fb6fa5
  g_free (supported_atoms);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
/**
Packit Service fb6fa5
 * gdk_x11_screen_supports_net_wm_hint:
Packit Service fb6fa5
 * @screen: the relevant #GdkScreen.
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 supports a certain hint from the
Packit Service fb6fa5
 * Extended Window Manager Hints Specification. You can find this
Packit Service fb6fa5
 * specification on 
Packit Service fb6fa5
 * <ulink url="http://www.freedesktop.org">http://www.freedesktop.org</ulink>.
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * When using this function, keep in mind that the window manager
Packit Service fb6fa5
 * can change over time; so you shouldn't use this function in
Packit Service fb6fa5
 * a way that impacts persistent application state. A common bug
Packit Service fb6fa5
 * is that your application can start up before the window manager
Packit Service fb6fa5
 * does when the user logs in, and before the window manager starts
Packit Service fb6fa5
 * gdk_x11_screen_supports_net_wm_hint() will return %FALSE for every property.
Packit Service fb6fa5
 * You can monitor the window_manager_changed signal on #GdkScreen to detect
Packit Service fb6fa5
 * a window manager change.
Packit Service fb6fa5
 * 
Packit Service fb6fa5
 * Return value: %TRUE if the window manager supports @property
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Since: 2.2
Packit Service fb6fa5
 **/
Packit Service fb6fa5
gboolean
Packit Service fb6fa5
gdk_x11_screen_supports_net_wm_hint (GdkScreen *screen,
Packit Service fb6fa5
				     GdkAtom    property)
Packit Service fb6fa5
{
Packit Service fb6fa5
  gulong i;
Packit Service fb6fa5
  GdkScreenX11 *screen_x11;
Packit Service fb6fa5
  NetWmSupportedAtoms *supported_atoms;
Packit Service fb6fa5
  GdkDisplay *display;
Packit Service fb6fa5
Packit Service fb6fa5
  g_return_val_if_fail (GDK_IS_SCREEN (screen), FALSE);
Packit Service fb6fa5
  
Packit Service fb6fa5
  screen_x11 = GDK_SCREEN_X11 (screen);
Packit Service fb6fa5
  display = screen_x11->display;
Packit Service fb6fa5
Packit Service fb6fa5
  if (!G_LIKELY (GDK_DISPLAY_X11 (display)->trusted_client))
Packit Service fb6fa5
    return FALSE;
Packit Service fb6fa5
Packit Service fb6fa5
  supported_atoms = g_object_get_data (G_OBJECT (screen), "gdk-net-wm-supported-atoms");
Packit Service fb6fa5
  if (!supported_atoms)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      supported_atoms = g_new0 (NetWmSupportedAtoms, 1);
Packit Service fb6fa5
      g_object_set_data_full (G_OBJECT (screen), "gdk-net-wm-supported-atoms", supported_atoms, cleanup_atoms);
Packit Service fb6fa5
    }
Packit Service fb6fa5
Packit Service fb6fa5
  fetch_net_wm_check_window (screen);
Packit Service fb6fa5
Packit Service fb6fa5
  if (screen_x11->wmspec_check_window == None)
Packit Service fb6fa5
    return FALSE;
Packit Service fb6fa5
  
Packit Service fb6fa5
  if (screen_x11->need_refetch_net_supported)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      /* WM has changed since we last got the supported list,
Packit Service fb6fa5
       * refetch it.
Packit Service fb6fa5
       */
Packit Service fb6fa5
      Atom type;
Packit Service fb6fa5
      gint format;
Packit Service fb6fa5
      gulong bytes_after;
Packit Service fb6fa5
Packit Service fb6fa5
      screen_x11->need_refetch_net_supported = FALSE;
Packit Service fb6fa5
      
Packit Service fb6fa5
      if (supported_atoms->atoms)
Packit Service fb6fa5
        XFree (supported_atoms->atoms);
Packit Service fb6fa5
      
Packit Service fb6fa5
      supported_atoms->atoms = NULL;
Packit Service fb6fa5
      supported_atoms->n_atoms = 0;
Packit Service fb6fa5
      
Packit Service fb6fa5
      XGetWindowProperty (GDK_DISPLAY_XDISPLAY (display), screen_x11->xroot_window,
Packit Service fb6fa5
                          gdk_x11_get_xatom_by_name_for_display (display, "_NET_SUPPORTED"),
Packit Service fb6fa5
                          0, G_MAXLONG, False, XA_ATOM, &type, &format, 
Packit Service fb6fa5
                          &supported_atoms->n_atoms, &bytes_after,
Packit Service fb6fa5
                          (guchar **)&supported_atoms->atoms);
Packit Service fb6fa5
      
Packit Service fb6fa5
      if (type != XA_ATOM)
Packit Service fb6fa5
        return FALSE;
Packit Service fb6fa5
    }
Packit Service fb6fa5
  
Packit Service fb6fa5
  if (supported_atoms->atoms == NULL)
Packit Service fb6fa5
    return FALSE;
Packit Service fb6fa5
  
Packit Service fb6fa5
  i = 0;
Packit Service fb6fa5
  while (i < supported_atoms->n_atoms)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      if (supported_atoms->atoms[i] == gdk_x11_atom_to_xatom_for_display (display, property))
Packit Service fb6fa5
        return TRUE;
Packit Service fb6fa5
      
Packit Service fb6fa5
      ++i;
Packit Service fb6fa5
    }
Packit Service fb6fa5
  
Packit Service fb6fa5
  return FALSE;
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
 * Deprecated:2.24: Use gdk_x11_screen_supports_net_wm_hint() instead
Packit Service fb6fa5
 **/
Packit Service fb6fa5
gboolean
Packit Service fb6fa5
gdk_net_wm_supports (GdkAtom property)
Packit Service fb6fa5
{
Packit Service fb6fa5
  return gdk_x11_screen_supports_net_wm_hint (gdk_screen_get_default (), property);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
gdk_xsettings_notify_cb (const char       *name,
Packit Service fb6fa5
			 XSettingsAction   action,
Packit Service fb6fa5
			 XSettingsSetting *setting,
Packit Service fb6fa5
			 void             *data)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GdkEvent new_event;
Packit Service fb6fa5
  GdkScreen *screen = data;
Packit Service fb6fa5
  GdkScreenX11 *screen_x11 = data;
Packit Service fb6fa5
  int i;
Packit Service fb6fa5
Packit Service fb6fa5
  if (screen_x11->xsettings_in_init)
Packit Service fb6fa5
    return;
Packit Service fb6fa5
  
Packit Service fb6fa5
  new_event.type = GDK_SETTING;
Packit Service fb6fa5
  new_event.setting.window = gdk_screen_get_root_window (screen);
Packit Service fb6fa5
  new_event.setting.send_event = FALSE;
Packit Service fb6fa5
  new_event.setting.name = NULL;
Packit Service fb6fa5
Packit Service fb6fa5
  for (i = 0; i < GDK_SETTINGS_N_ELEMENTS() ; i++)
Packit Service fb6fa5
    if (strcmp (GDK_SETTINGS_X_NAME (i), name) == 0)
Packit Service fb6fa5
      {
Packit Service fb6fa5
	new_event.setting.name = (char*) GDK_SETTINGS_GDK_NAME (i);
Packit Service fb6fa5
	break;
Packit Service fb6fa5
      }
Packit Service fb6fa5
  
Packit Service fb6fa5
  if (!new_event.setting.name)
Packit Service fb6fa5
    return;
Packit Service fb6fa5
  
Packit Service fb6fa5
  switch (action)
Packit Service fb6fa5
    {
Packit Service fb6fa5
    case XSETTINGS_ACTION_NEW:
Packit Service fb6fa5
      new_event.setting.action = GDK_SETTING_ACTION_NEW;
Packit Service fb6fa5
      break;
Packit Service fb6fa5
    case XSETTINGS_ACTION_CHANGED:
Packit Service fb6fa5
      new_event.setting.action = GDK_SETTING_ACTION_CHANGED;
Packit Service fb6fa5
      break;
Packit Service fb6fa5
    case XSETTINGS_ACTION_DELETED:
Packit Service fb6fa5
      new_event.setting.action = GDK_SETTING_ACTION_DELETED;
Packit Service fb6fa5
      break;
Packit Service fb6fa5
    }
Packit Service fb6fa5
Packit Service fb6fa5
  gdk_event_put (&new_event);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static gboolean
Packit Service fb6fa5
check_transform (const gchar *xsettings_name,
Packit Service fb6fa5
		 GType        src_type,
Packit Service fb6fa5
		 GType        dest_type)
Packit Service fb6fa5
{
Packit Service fb6fa5
  if (!g_value_type_transformable (src_type, dest_type))
Packit Service fb6fa5
    {
Packit Service fb6fa5
      g_warning ("Cannot transform xsetting %s of type %s to type %s\n",
Packit Service fb6fa5
		 xsettings_name,
Packit Service fb6fa5
		 g_type_name (src_type),
Packit Service fb6fa5
		 g_type_name (dest_type));
Packit Service fb6fa5
      return FALSE;
Packit Service fb6fa5
    }
Packit Service fb6fa5
  else
Packit Service fb6fa5
    return TRUE;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
/**
Packit Service fb6fa5
 * gdk_screen_get_setting:
Packit Service fb6fa5
 * @screen: the #GdkScreen where the setting is located
Packit Service fb6fa5
 * @name: the name of the setting
Packit Service fb6fa5
 * @value: location to store the value of the setting
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Retrieves a desktop-wide setting such as double-click time
Packit Service fb6fa5
 * for the #GdkScreen @screen. 
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * FIXME needs a list of valid settings here, or a link to 
Packit Service fb6fa5
 * more information.
Packit Service fb6fa5
 * 
Packit Service fb6fa5
 * Returns: %TRUE if the setting existed and a value was stored
Packit Service fb6fa5
 *   in @value, %FALSE otherwise.
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Since: 2.2
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
Packit Service fb6fa5
  const char *xsettings_name = NULL;
Packit Service fb6fa5
  XSettingsResult result;
Packit Service fb6fa5
  XSettingsSetting *setting = NULL;
Packit Service fb6fa5
  GdkScreenX11 *screen_x11;
Packit Service fb6fa5
  gboolean success = FALSE;
Packit Service fb6fa5
  gint i;
Packit Service fb6fa5
  GValue tmp_val = { 0, };
Packit Service fb6fa5
  
Packit Service fb6fa5
  g_return_val_if_fail (GDK_IS_SCREEN (screen), FALSE);
Packit Service fb6fa5
  
Packit Service fb6fa5
  screen_x11 = GDK_SCREEN_X11 (screen);
Packit Service fb6fa5
Packit Service fb6fa5
  for (i = 0; i < GDK_SETTINGS_N_ELEMENTS(); i++)
Packit Service fb6fa5
    if (strcmp (GDK_SETTINGS_GDK_NAME (i), name) == 0)
Packit Service fb6fa5
      {
Packit Service fb6fa5
	xsettings_name = GDK_SETTINGS_X_NAME (i);
Packit Service fb6fa5
	break;
Packit Service fb6fa5
      }
Packit Service fb6fa5
Packit Service fb6fa5
  if (!xsettings_name)
Packit Service fb6fa5
    goto out;
Packit Service fb6fa5
Packit Service fb6fa5
  result = xsettings_client_get_setting (screen_x11->xsettings_client, 
Packit Service fb6fa5
					 xsettings_name, &setting);
Packit Service fb6fa5
  if (result != XSETTINGS_SUCCESS)
Packit Service fb6fa5
    goto out;
Packit Service fb6fa5
Packit Service fb6fa5
  switch (setting->type)
Packit Service fb6fa5
    {
Packit Service fb6fa5
    case XSETTINGS_TYPE_INT:
Packit Service fb6fa5
      if (check_transform (xsettings_name, G_TYPE_INT, G_VALUE_TYPE (value)))
Packit Service fb6fa5
	{
Packit Service fb6fa5
	  g_value_init (&tmp_val, G_TYPE_INT);
Packit Service fb6fa5
	  g_value_set_int (&tmp_val, setting->data.v_int);
Packit Service fb6fa5
	  g_value_transform (&tmp_val, value);
Packit Service fb6fa5
Packit Service fb6fa5
	  success = TRUE;
Packit Service fb6fa5
	}
Packit Service fb6fa5
      break;
Packit Service fb6fa5
    case XSETTINGS_TYPE_STRING:
Packit Service fb6fa5
      if (check_transform (xsettings_name, G_TYPE_STRING, G_VALUE_TYPE (value)))
Packit Service fb6fa5
	{
Packit Service fb6fa5
	  g_value_init (&tmp_val, G_TYPE_STRING);
Packit Service fb6fa5
	  g_value_set_string (&tmp_val, setting->data.v_string);
Packit Service fb6fa5
	  g_value_transform (&tmp_val, value);
Packit Service fb6fa5
Packit Service fb6fa5
	  success = TRUE;
Packit Service fb6fa5
	}
Packit Service fb6fa5
      break;
Packit Service fb6fa5
    case XSETTINGS_TYPE_COLOR:
Packit Service fb6fa5
      if (!check_transform (xsettings_name, GDK_TYPE_COLOR, G_VALUE_TYPE (value)))
Packit Service fb6fa5
	{
Packit Service fb6fa5
	  GdkColor color;
Packit Service fb6fa5
	  
Packit Service fb6fa5
	  g_value_init (&tmp_val, GDK_TYPE_COLOR);
Packit Service fb6fa5
Packit Service fb6fa5
	  color.pixel = 0;
Packit Service fb6fa5
	  color.red = setting->data.v_color.red;
Packit Service fb6fa5
	  color.green = setting->data.v_color.green;
Packit Service fb6fa5
	  color.blue = setting->data.v_color.blue;
Packit Service fb6fa5
	  
Packit Service fb6fa5
	  g_value_set_boxed (&tmp_val, &color;;
Packit Service fb6fa5
	  
Packit Service fb6fa5
	  g_value_transform (&tmp_val, value);
Packit Service fb6fa5
	  
Packit Service fb6fa5
	  success = TRUE;
Packit Service fb6fa5
	}
Packit Service fb6fa5
      break;
Packit Service fb6fa5
    }
Packit Service fb6fa5
  
Packit Service fb6fa5
  g_value_unset (&tmp_val);
Packit Service fb6fa5
Packit Service fb6fa5
 out:
Packit Service fb6fa5
  if (setting)
Packit Service fb6fa5
    xsettings_setting_free (setting);
Packit Service fb6fa5
Packit Service fb6fa5
  if (success)
Packit Service fb6fa5
    return TRUE;
Packit Service fb6fa5
  else
Packit Service fb6fa5
    return _gdk_x11_get_xft_setting (screen, name, value);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static GdkFilterReturn 
Packit Service fb6fa5
gdk_xsettings_client_event_filter (GdkXEvent *xevent,
Packit Service fb6fa5
				   GdkEvent  *event,
Packit Service fb6fa5
				   gpointer   data)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GdkScreenX11 *screen = data;
Packit Service fb6fa5
  
Packit Service fb6fa5
  if (xsettings_client_process_event (screen->xsettings_client, (XEvent *)xevent))
Packit Service fb6fa5
    return GDK_FILTER_REMOVE;
Packit Service fb6fa5
  else
Packit Service fb6fa5
    return GDK_FILTER_CONTINUE;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static Bool
Packit Service fb6fa5
gdk_xsettings_watch_cb (Window   window,
Packit Service fb6fa5
			Bool	 is_start,
Packit Service fb6fa5
			long     mask,
Packit Service fb6fa5
			void    *cb_data)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GdkWindow *gdkwin;
Packit Service fb6fa5
  GdkScreen *screen = cb_data;
Packit Service fb6fa5
Packit Service fb6fa5
  gdkwin = gdk_window_lookup_for_display (gdk_screen_get_display (screen), window);
Packit Service fb6fa5
Packit Service fb6fa5
  if (is_start)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      if (gdkwin)
Packit Service fb6fa5
	g_object_ref (gdkwin);
Packit Service fb6fa5
      else
Packit Service fb6fa5
	{
Packit Service fb6fa5
	  gdkwin = gdk_window_foreign_new_for_display (gdk_screen_get_display (screen), window);
Packit Service fb6fa5
	  
Packit Service fb6fa5
	  /* gdk_window_foreign_new_for_display() can fail and return NULL if the
Packit Service fb6fa5
	   * window has already been destroyed.
Packit Service fb6fa5
	   */
Packit Service fb6fa5
	  if (!gdkwin)
Packit Service fb6fa5
	    return False;
Packit Service fb6fa5
	}
Packit Service fb6fa5
Packit Service fb6fa5
      gdk_window_add_filter (gdkwin, gdk_xsettings_client_event_filter, screen);
Packit Service fb6fa5
    }
Packit Service fb6fa5
  else
Packit Service fb6fa5
    {
Packit Service fb6fa5
      if (!gdkwin)
Packit Service fb6fa5
	{
Packit Service fb6fa5
	  /* gdkwin should not be NULL here, since if starting the watch succeeded
Packit Service fb6fa5
	   * we have a reference on the window. It might mean that the caller didn't
Packit Service fb6fa5
	   * remove the watch when it got a DestroyNotify event. Or maybe the
Packit Service fb6fa5
	   * caller ignored the return value when starting the watch failed.
Packit Service fb6fa5
	   */
Packit Service fb6fa5
	  g_warning ("gdk_xsettings_watch_cb(): Couldn't find window to unwatch");
Packit Service fb6fa5
	  return False;
Packit Service fb6fa5
	}
Packit Service fb6fa5
      
Packit Service fb6fa5
      gdk_window_remove_filter (gdkwin, gdk_xsettings_client_event_filter, screen);
Packit Service fb6fa5
      g_object_unref (gdkwin);
Packit Service fb6fa5
    }
Packit Service fb6fa5
Packit Service fb6fa5
  return True;
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"