Blame gdk/x11/gdkmain-x11.c

Packit Service fb6fa5
/* GDK - The GIMP Drawing Kit
Packit Service fb6fa5
 * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * This library is free software; you can redistribute it and/or
Packit Service fb6fa5
 * modify it under the terms of the GNU Lesser General Public
Packit Service fb6fa5
 * License as published by the Free Software Foundation; either
Packit Service fb6fa5
 * version 2 of the License, or (at your option) any later version.
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * This library is distributed in the hope that it will be useful,
Packit Service fb6fa5
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service fb6fa5
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.	 See the GNU
Packit Service fb6fa5
 * Lesser General Public License for more details.
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * You should have received a copy of the GNU Lesser General Public
Packit Service fb6fa5
 * License along with this library; if not, write to the
Packit Service fb6fa5
 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Packit Service fb6fa5
 * Boston, MA 02111-1307, USA.
Packit Service fb6fa5
 */
Packit Service fb6fa5
Packit Service fb6fa5
/*
Packit Service fb6fa5
 * Modified by the GTK+ Team and others 1997-2000.  See the AUTHORS
Packit Service fb6fa5
 * file for a list of people on the GTK+ Team.  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 <glib/gprintf.h>
Packit Service fb6fa5
#include <stdlib.h>
Packit Service fb6fa5
#include <string.h>
Packit Service fb6fa5
#include <unistd.h>
Packit Service fb6fa5
#include <limits.h>
Packit Service fb6fa5
#include <errno.h>
Packit Service fb6fa5
Packit Service fb6fa5
#include <X11/Xatom.h>
Packit Service fb6fa5
#include <X11/Xlib.h>
Packit Service fb6fa5
#include <X11/Xutil.h>
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
#include "gdk.h"
Packit Service fb6fa5
Packit Service fb6fa5
#include "gdkx.h"
Packit Service fb6fa5
#include "gdkasync.h"
Packit Service fb6fa5
#include "gdkdisplay-x11.h"
Packit Service fb6fa5
#include "gdkinternals.h"
Packit Service fb6fa5
#include "gdkintl.h"
Packit Service fb6fa5
#include "gdkregion-generic.h"
Packit Service fb6fa5
#include "gdkinputprivate.h"
Packit Service fb6fa5
#include "gdkalias.h"
Packit Service fb6fa5
Packit Service fb6fa5
typedef struct _GdkPredicate  GdkPredicate;
Packit Service fb6fa5
typedef struct _GdkErrorTrap  GdkErrorTrap;
Packit Service fb6fa5
Packit Service fb6fa5
struct _GdkPredicate
Packit Service fb6fa5
{
Packit Service fb6fa5
  GdkEventFunc func;
Packit Service fb6fa5
  gpointer data;
Packit Service fb6fa5
};
Packit Service fb6fa5
Packit Service fb6fa5
struct _GdkErrorTrap
Packit Service fb6fa5
{
Packit Service fb6fa5
  int (*old_handler) (Display *, XErrorEvent *);
Packit Service fb6fa5
  gint error_warnings;
Packit Service fb6fa5
  gint error_code;
Packit Service fb6fa5
};
Packit Service fb6fa5
Packit Service fb6fa5
/* 
Packit Service fb6fa5
 * Private function declarations
Packit Service fb6fa5
 */
Packit Service fb6fa5
Packit Service fb6fa5
#ifndef HAVE_XCONVERTCASE
Packit Service fb6fa5
static void	 gdkx_XConvertCase	(KeySym	       symbol,
Packit Service fb6fa5
					 KeySym	      *lower,
Packit Service fb6fa5
					 KeySym	      *upper);
Packit Service fb6fa5
#define XConvertCase gdkx_XConvertCase
Packit Service fb6fa5
#endif
Packit Service fb6fa5
Packit Service fb6fa5
static int	    gdk_x_error			 (Display     *display, 
Packit Service fb6fa5
						  XErrorEvent *error);
Packit Service fb6fa5
static int	    gdk_x_io_error		 (Display     *display);
Packit Service fb6fa5
Packit Service fb6fa5
/* Private variable declarations
Packit Service fb6fa5
 */
Packit Service fb6fa5
static GSList *gdk_error_traps = NULL;               /* List of error traps */
Packit Service fb6fa5
static GSList *gdk_error_trap_free_list = NULL;      /* Free list */
Packit Service fb6fa5
Packit Service fb6fa5
const GOptionEntry _gdk_windowing_args[] = {
Packit Service fb6fa5
  { "sync", 0, 0, G_OPTION_ARG_NONE, &_gdk_synchronize, 
Packit Service fb6fa5
    /* Description of --sync in --help output */ N_("Make X calls synchronous"), NULL },
Packit Service fb6fa5
  { NULL }
Packit Service fb6fa5
};
Packit Service fb6fa5
Packit Service fb6fa5
void
Packit Service fb6fa5
_gdk_windowing_init (void)
Packit Service fb6fa5
{
Packit Service fb6fa5
  _gdk_x11_initialize_locale ();
Packit Service fb6fa5
  
Packit Service fb6fa5
  XSetErrorHandler (gdk_x_error);
Packit Service fb6fa5
  XSetIOErrorHandler (gdk_x_io_error);
Packit Service fb6fa5
Packit Service fb6fa5
  _gdk_selection_property = gdk_atom_intern_static_string ("GDK_SELECTION");
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
void
Packit Service fb6fa5
gdk_set_use_xshm (gboolean use_xshm)
Packit Service fb6fa5
{
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
gboolean
Packit Service fb6fa5
gdk_get_use_xshm (void)
Packit Service fb6fa5
{
Packit Service fb6fa5
  return GDK_DISPLAY_X11 (gdk_display_get_default ())->use_xshm;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static GdkGrabStatus
Packit Service fb6fa5
gdk_x11_convert_grab_status (gint status)
Packit Service fb6fa5
{
Packit Service fb6fa5
  switch (status)
Packit Service fb6fa5
    {
Packit Service fb6fa5
    case GrabSuccess:
Packit Service fb6fa5
      return GDK_GRAB_SUCCESS;
Packit Service fb6fa5
    case AlreadyGrabbed:
Packit Service fb6fa5
      return GDK_GRAB_ALREADY_GRABBED;
Packit Service fb6fa5
    case GrabInvalidTime:
Packit Service fb6fa5
      return GDK_GRAB_INVALID_TIME;
Packit Service fb6fa5
    case GrabNotViewable:
Packit Service fb6fa5
      return GDK_GRAB_NOT_VIEWABLE;
Packit Service fb6fa5
    case GrabFrozen:
Packit Service fb6fa5
      return GDK_GRAB_FROZEN;
Packit Service fb6fa5
    }
Packit Service fb6fa5
Packit Service fb6fa5
  g_assert_not_reached();
Packit Service fb6fa5
Packit Service fb6fa5
  return 0;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
has_pointer_grab_callback (GdkDisplay *display,
Packit Service fb6fa5
			   gpointer data,
Packit Service fb6fa5
			   gulong serial)
Packit Service fb6fa5
{
Packit Service fb6fa5
  _gdk_display_pointer_grab_update (display, serial);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
GdkGrabStatus
Packit Service fb6fa5
_gdk_windowing_pointer_grab (GdkWindow *window,
Packit Service fb6fa5
			     GdkWindow *native,
Packit Service fb6fa5
			     gboolean owner_events,
Packit Service fb6fa5
			     GdkEventMask event_mask,
Packit Service fb6fa5
			     GdkWindow *confine_to,
Packit Service fb6fa5
			     GdkCursor *cursor,
Packit Service fb6fa5
			     guint32 time)
Packit Service fb6fa5
{
Packit Service fb6fa5
  gint return_val;
Packit Service fb6fa5
  GdkCursorPrivate *cursor_private;
Packit Service fb6fa5
  GdkDisplayX11 *display_x11;
Packit Service fb6fa5
  guint xevent_mask;
Packit Service fb6fa5
  Window xwindow;
Packit Service fb6fa5
  Window xconfine_to;
Packit Service fb6fa5
  Cursor xcursor;
Packit Service fb6fa5
  int i;
Packit Service fb6fa5
Packit Service fb6fa5
  if (confine_to)
Packit Service fb6fa5
    confine_to = _gdk_window_get_impl_window (confine_to);
Packit Service fb6fa5
Packit Service fb6fa5
  display_x11 = GDK_DISPLAY_X11 (GDK_WINDOW_DISPLAY (native));
Packit Service fb6fa5
Packit Service fb6fa5
  cursor_private = (GdkCursorPrivate*) cursor;
Packit Service fb6fa5
Packit Service fb6fa5
  xwindow = GDK_WINDOW_XID (native);
Packit Service fb6fa5
Packit Service fb6fa5
  if (!confine_to || GDK_WINDOW_DESTROYED (confine_to))
Packit Service fb6fa5
    xconfine_to = None;
Packit Service fb6fa5
  else
Packit Service fb6fa5
    xconfine_to = GDK_WINDOW_XID (confine_to);
Packit Service fb6fa5
Packit Service fb6fa5
  if (!cursor)
Packit Service fb6fa5
    xcursor = None;
Packit Service fb6fa5
  else
Packit Service fb6fa5
    {
Packit Service fb6fa5
      _gdk_x11_cursor_update_theme (cursor);
Packit Service fb6fa5
      xcursor = cursor_private->xcursor;
Packit Service fb6fa5
    }
Packit Service fb6fa5
Packit Service fb6fa5
  xevent_mask = 0;
Packit Service fb6fa5
  for (i = 0; i < _gdk_nenvent_masks; i++)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      if (event_mask & (1 << (i + 1)))
Packit Service fb6fa5
	xevent_mask |= _gdk_event_mask_table[i];
Packit Service fb6fa5
    }
Packit Service fb6fa5
Packit Service fb6fa5
  /* We don't want to set a native motion hint mask, as we're emulating motion
Packit Service fb6fa5
   * hints. If we set a native one we just wouldn't get any events.
Packit Service fb6fa5
   */
Packit Service fb6fa5
  xevent_mask &= ~PointerMotionHintMask;
Packit Service fb6fa5
Packit Service fb6fa5
  return_val = _gdk_input_grab_pointer (window,
Packit Service fb6fa5
					native,
Packit Service fb6fa5
					owner_events,
Packit Service fb6fa5
					event_mask,
Packit Service fb6fa5
					confine_to,
Packit Service fb6fa5
					time);
Packit Service fb6fa5
Packit Service fb6fa5
  if (return_val == GrabSuccess ||
Packit Service fb6fa5
      G_UNLIKELY (!display_x11->trusted_client && return_val == AlreadyGrabbed))
Packit Service fb6fa5
    {
Packit Service fb6fa5
      if (!GDK_WINDOW_DESTROYED (native))
Packit Service fb6fa5
	{
Packit Service fb6fa5
#ifdef G_ENABLE_DEBUG
Packit Service fb6fa5
	  if (_gdk_debug_flags & GDK_DEBUG_NOGRABS)
Packit Service fb6fa5
	    return_val = GrabSuccess;
Packit Service fb6fa5
	  else
Packit Service fb6fa5
#endif
Packit Service fb6fa5
	    return_val = XGrabPointer (GDK_WINDOW_XDISPLAY (native),
Packit Service fb6fa5
				       xwindow,
Packit Service fb6fa5
				       owner_events,
Packit Service fb6fa5
				       xevent_mask,
Packit Service fb6fa5
				       GrabModeAsync, GrabModeAsync,
Packit Service fb6fa5
				       xconfine_to,
Packit Service fb6fa5
				       xcursor,
Packit Service fb6fa5
				       time);
Packit Service fb6fa5
	}
Packit Service fb6fa5
      else
Packit Service fb6fa5
	return_val = AlreadyGrabbed;
Packit Service fb6fa5
    }
Packit Service fb6fa5
Packit Service fb6fa5
  if (return_val == GrabSuccess)
Packit Service fb6fa5
    _gdk_x11_roundtrip_async (GDK_DISPLAY_OBJECT (display_x11),
Packit Service fb6fa5
			      has_pointer_grab_callback,
Packit Service fb6fa5
			      NULL);
Packit Service fb6fa5
Packit Service fb6fa5
  return gdk_x11_convert_grab_status (return_val);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
/*
Packit Service fb6fa5
 *--------------------------------------------------------------
Packit Service fb6fa5
 * gdk_keyboard_grab
Packit Service fb6fa5
 *
Packit Service fb6fa5
 *   Grabs the keyboard to a specific window
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Arguments:
Packit Service fb6fa5
 *   "window" is the window which will receive the grab
Packit Service fb6fa5
 *   "owner_events" specifies whether events will be reported as is,
Packit Service fb6fa5
 *     or relative to "window"
Packit Service fb6fa5
 *   "time" specifies the time
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Results:
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Side effects:
Packit Service fb6fa5
 *   requires a corresponding call to gdk_keyboard_ungrab
Packit Service fb6fa5
 *
Packit Service fb6fa5
 *--------------------------------------------------------------
Packit Service fb6fa5
 */
Packit Service fb6fa5
Packit Service fb6fa5
GdkGrabStatus
Packit Service fb6fa5
gdk_keyboard_grab (GdkWindow *	   window,
Packit Service fb6fa5
		   gboolean	   owner_events,
Packit Service fb6fa5
		   guint32	   time)
Packit Service fb6fa5
{
Packit Service fb6fa5
  gint return_val;
Packit Service fb6fa5
  unsigned long serial;
Packit Service fb6fa5
  GdkDisplay *display;
Packit Service fb6fa5
  GdkDisplayX11 *display_x11;
Packit Service fb6fa5
  GdkWindow *native;
Packit Service fb6fa5
Packit Service fb6fa5
  g_return_val_if_fail (window != NULL, 0);
Packit Service fb6fa5
  g_return_val_if_fail (GDK_IS_WINDOW (window), 0);
Packit Service fb6fa5
Packit Service fb6fa5
  native = gdk_window_get_toplevel (window);
Packit Service fb6fa5
Packit Service fb6fa5
  /* TODO: What do we do for offscreens and  children? We need to proxy the grab somehow */
Packit Service fb6fa5
  if (!GDK_IS_WINDOW_IMPL_X11 (GDK_WINDOW_OBJECT (native)->impl))
Packit Service fb6fa5
    return GDK_GRAB_SUCCESS;
Packit Service fb6fa5
Packit Service fb6fa5
  display = GDK_WINDOW_DISPLAY (native);
Packit Service fb6fa5
  display_x11 = GDK_DISPLAY_X11 (display);
Packit Service fb6fa5
Packit Service fb6fa5
  serial = NextRequest (GDK_WINDOW_XDISPLAY (native));
Packit Service fb6fa5
Packit Service fb6fa5
  if (!GDK_WINDOW_DESTROYED (native))
Packit Service fb6fa5
    {
Packit Service fb6fa5
#ifdef G_ENABLE_DEBUG
Packit Service fb6fa5
      if (_gdk_debug_flags & GDK_DEBUG_NOGRABS)
Packit Service fb6fa5
	return_val = GrabSuccess;
Packit Service fb6fa5
      else
Packit Service fb6fa5
#endif
Packit Service fb6fa5
	return_val = XGrabKeyboard (GDK_WINDOW_XDISPLAY (native),
Packit Service fb6fa5
				    GDK_WINDOW_XID (native),
Packit Service fb6fa5
				    owner_events,
Packit Service fb6fa5
				    GrabModeAsync, GrabModeAsync,
Packit Service fb6fa5
				    time);
Packit Service fb6fa5
	if (G_UNLIKELY (!display_x11->trusted_client && 
Packit Service fb6fa5
			return_val == AlreadyGrabbed))
Packit Service fb6fa5
	  /* we can't grab the keyboard, but we can do a GTK-local grab */
Packit Service fb6fa5
	  return_val = GrabSuccess;
Packit Service fb6fa5
    }
Packit Service fb6fa5
  else
Packit Service fb6fa5
    return_val = AlreadyGrabbed;
Packit Service fb6fa5
Packit Service fb6fa5
  if (return_val == GrabSuccess)
Packit Service fb6fa5
    _gdk_display_set_has_keyboard_grab (display,
Packit Service fb6fa5
					window,	native,
Packit Service fb6fa5
					owner_events,
Packit Service fb6fa5
					serial, time);
Packit Service fb6fa5
Packit Service fb6fa5
  return gdk_x11_convert_grab_status (return_val);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
/**
Packit Service fb6fa5
 * _gdk_xgrab_check_unmap:
Packit Service fb6fa5
 * @window: a #GdkWindow
Packit Service fb6fa5
 * @serial: serial from Unmap event (or from NextRequest(display)
Packit Service fb6fa5
 *   if the unmap is being done by this client.)
Packit Service fb6fa5
 * 
Packit Service fb6fa5
 * Checks to see if an unmap request or event causes the current
Packit Service fb6fa5
 * grab window to become not viewable, and if so, clear the
Packit Service fb6fa5
 * the pointer we keep to it.
Packit Service fb6fa5
 **/
Packit Service fb6fa5
void
Packit Service fb6fa5
_gdk_xgrab_check_unmap (GdkWindow *window,
Packit Service fb6fa5
			gulong     serial)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GdkDisplay *display = gdk_drawable_get_display (window);
Packit Service fb6fa5
Packit Service fb6fa5
  _gdk_display_end_pointer_grab (display, serial, window, TRUE);
Packit Service fb6fa5
Packit Service fb6fa5
  if (display->keyboard_grab.window &&
Packit Service fb6fa5
      serial >= display->keyboard_grab.serial)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      GdkWindowObject *private = GDK_WINDOW_OBJECT (window);
Packit Service fb6fa5
      GdkWindowObject *tmp = GDK_WINDOW_OBJECT (display->keyboard_grab.window);
Packit Service fb6fa5
Packit Service fb6fa5
      while (tmp && tmp != private)
Packit Service fb6fa5
	tmp = tmp->parent;
Packit Service fb6fa5
Packit Service fb6fa5
      if (tmp)
Packit Service fb6fa5
	_gdk_display_unset_has_keyboard_grab (display, TRUE);
Packit Service fb6fa5
    }
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
/**
Packit Service fb6fa5
 * _gdk_xgrab_check_destroy:
Packit Service fb6fa5
 * @window: a #GdkWindow
Packit Service fb6fa5
 * 
Packit Service fb6fa5
 * Checks to see if window is the current grab window, and if
Packit Service fb6fa5
 * so, clear the current grab window.
Packit Service fb6fa5
 **/
Packit Service fb6fa5
void
Packit Service fb6fa5
_gdk_xgrab_check_destroy (GdkWindow *window)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GdkDisplay *display = gdk_drawable_get_display (window);
Packit Service fb6fa5
  GdkPointerGrabInfo *grab;
Packit Service fb6fa5
Packit Service fb6fa5
  /* Make sure there is no lasting grab in this native
Packit Service fb6fa5
     window */
Packit Service fb6fa5
  grab = _gdk_display_get_last_pointer_grab (display);
Packit Service fb6fa5
  if (grab && grab->native_window == window)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      /* We don't know the actual serial to end, but it
Packit Service fb6fa5
	 doesn't really matter as this only happens
Packit Service fb6fa5
	 after we get told of the destroy from the
Packit Service fb6fa5
	 server so we know its ended in the server,
Packit Service fb6fa5
	 just make sure its ended. */
Packit Service fb6fa5
      grab->serial_end = grab->serial_start;
Packit Service fb6fa5
      grab->implicit_ungrab = TRUE;
Packit Service fb6fa5
    }
Packit Service fb6fa5
  
Packit Service fb6fa5
  if (window == display->keyboard_grab.native_window &&
Packit Service fb6fa5
      display->keyboard_grab.window != NULL)
Packit Service fb6fa5
    _gdk_display_unset_has_keyboard_grab (display, TRUE);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
void
Packit Service fb6fa5
_gdk_windowing_display_set_sm_client_id (GdkDisplay  *display,
Packit Service fb6fa5
					 const gchar *sm_client_id)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GdkDisplayX11 *display_x11 = GDK_DISPLAY_X11 (display);
Packit Service fb6fa5
Packit Service fb6fa5
  if (display->closed)
Packit Service fb6fa5
    return;
Packit Service fb6fa5
Packit Service fb6fa5
  if (sm_client_id && strcmp (sm_client_id, ""))
Packit Service fb6fa5
    {
Packit Service fb6fa5
      XChangeProperty (display_x11->xdisplay, display_x11->leader_window,
Packit Service fb6fa5
		       gdk_x11_get_xatom_by_name_for_display (display, "SM_CLIENT_ID"),
Packit Service fb6fa5
		       XA_STRING, 8, PropModeReplace, (guchar *)sm_client_id,
Packit Service fb6fa5
		       strlen (sm_client_id));
Packit Service fb6fa5
    }
Packit Service fb6fa5
  else
Packit Service fb6fa5
    XDeleteProperty (display_x11->xdisplay, display_x11->leader_window,
Packit Service fb6fa5
		     gdk_x11_get_xatom_by_name_for_display (display, "SM_CLIENT_ID"));
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
/**
Packit Service fb6fa5
 * gdk_x11_set_sm_client_id:
Packit Service fb6fa5
 * @sm_client_id: the client id assigned by the session manager when the
Packit Service fb6fa5
 *    connection was opened, or %NULL to remove the property.
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Sets the <literal>SM_CLIENT_ID</literal> property on the application's leader window so that
Packit Service fb6fa5
 * the window manager can save the application's state using the X11R6 ICCCM
Packit Service fb6fa5
 * session management protocol.
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * See the X Session Management Library documentation for more information on
Packit Service fb6fa5
 * session management and the Inter-Client Communication Conventions Manual
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Since: 2.24
Packit Service fb6fa5
 */
Packit Service fb6fa5
void
Packit Service fb6fa5
gdk_x11_set_sm_client_id (const gchar *sm_client_id)
Packit Service fb6fa5
{
Packit Service fb6fa5
  gdk_set_sm_client_id (sm_client_id);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
/* Close all open displays
Packit Service fb6fa5
 */
Packit Service fb6fa5
void
Packit Service fb6fa5
_gdk_windowing_exit (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
      XCloseDisplay (GDK_DISPLAY_XDISPLAY (tmp_list->data));
Packit Service fb6fa5
      
Packit Service fb6fa5
      tmp_list = tmp_list->next;
Packit Service fb6fa5
  }
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
/*
Packit Service fb6fa5
 *--------------------------------------------------------------
Packit Service fb6fa5
 * gdk_x_error
Packit Service fb6fa5
 *
Packit Service fb6fa5
 *   The X error handling routine.
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Arguments:
Packit Service fb6fa5
 *   "display" is the X display the error orignated from.
Packit Service fb6fa5
 *   "error" is the XErrorEvent that we are handling.
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Results:
Packit Service fb6fa5
 *   Either we were expecting some sort of error to occur,
Packit Service fb6fa5
 *   in which case we set the "_gdk_error_code" flag, or this
Packit Service fb6fa5
 *   error was unexpected, in which case we will print an
Packit Service fb6fa5
 *   error message and exit. (Since trying to continue will
Packit Service fb6fa5
 *   most likely simply lead to more errors).
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Side effects:
Packit Service fb6fa5
 *
Packit Service fb6fa5
 *--------------------------------------------------------------
Packit Service fb6fa5
 */
Packit Service fb6fa5
Packit Service fb6fa5
static int
Packit Service fb6fa5
gdk_x_error (Display	 *display,
Packit Service fb6fa5
	     XErrorEvent *error)
Packit Service fb6fa5
{
Packit Service fb6fa5
  if (error->error_code)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      if (_gdk_error_warnings)
Packit Service fb6fa5
	{
Packit Service fb6fa5
	  gchar buf[64];
Packit Service fb6fa5
          gchar *msg;
Packit Service fb6fa5
          
Packit Service fb6fa5
	  XGetErrorText (display, error->error_code, buf, 63);
Packit Service fb6fa5
Packit Service fb6fa5
          msg =
Packit Service fb6fa5
            g_strdup_printf ("The program '%s' received an X Window System error.\n"
Packit Service fb6fa5
                             "This probably reflects a bug in the program.\n"
Packit Service fb6fa5
                             "The error was '%s'.\n"
Packit Service fb6fa5
                             "  (Details: serial %ld error_code %d request_code %d minor_code %d)\n"
Packit Service fb6fa5
                             "  (Note to programmers: normally, X errors are reported asynchronously;\n"
Packit Service fb6fa5
                             "   that is, you will receive the error a while after causing it.\n"
Packit Service fb6fa5
                             "   To debug your program, run it with the --sync command line\n"
Packit Service fb6fa5
                             "   option to change this behavior. You can then get a meaningful\n"
Packit Service fb6fa5
                             "   backtrace from your debugger if you break on the gdk_x_error() function.)",
Packit Service fb6fa5
                             g_get_prgname (),
Packit Service fb6fa5
                             buf,
Packit Service fb6fa5
                             error->serial, 
Packit Service fb6fa5
                             error->error_code, 
Packit Service fb6fa5
                             error->request_code,
Packit Service fb6fa5
                             error->minor_code);
Packit Service fb6fa5
          
Packit Service fb6fa5
#ifdef G_ENABLE_DEBUG	  
Packit Service fb6fa5
	  g_error ("%s", msg);
Packit Service fb6fa5
#else /* !G_ENABLE_DEBUG */
Packit Service fb6fa5
	  g_fprintf (stderr, "%s\n", msg);
Packit Service fb6fa5
Packit Service fb6fa5
	  exit (1);
Packit Service fb6fa5
#endif /* G_ENABLE_DEBUG */
Packit Service fb6fa5
	}
Packit Service fb6fa5
      _gdk_error_code = error->error_code;
Packit Service fb6fa5
    }
Packit Service fb6fa5
  
Packit Service fb6fa5
  return 0;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
/*
Packit Service fb6fa5
 *--------------------------------------------------------------
Packit Service fb6fa5
 * gdk_x_io_error
Packit Service fb6fa5
 *
Packit Service fb6fa5
 *   The X I/O error handling routine.
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Arguments:
Packit Service fb6fa5
 *   "display" is the X display the error orignated from.
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Results:
Packit Service fb6fa5
 *   An X I/O error basically means we lost our connection
Packit Service fb6fa5
 *   to the X server. There is not much we can do to
Packit Service fb6fa5
 *   continue, so simply print an error message and exit.
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Side effects:
Packit Service fb6fa5
 *
Packit Service fb6fa5
 *--------------------------------------------------------------
Packit Service fb6fa5
 */
Packit Service fb6fa5
Packit Service fb6fa5
static int
Packit Service fb6fa5
gdk_x_io_error (Display *display)
Packit Service fb6fa5
{
Packit Service fb6fa5
  /* This is basically modelled after the code in XLib. We need
Packit Service fb6fa5
   * an explicit error handler here, so we can disable our atexit()
Packit Service fb6fa5
   * which would otherwise cause a nice segfault.
Packit Service fb6fa5
   * We fprintf(stderr, instead of g_warning() because g_warning()
Packit Service fb6fa5
   * could possibly be redirected to a dialog
Packit Service fb6fa5
   */
Packit Service fb6fa5
  if (errno == EPIPE)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      g_fprintf (stderr,
Packit Service fb6fa5
               "The application '%s' lost its connection to the display %s;\n"
Packit Service fb6fa5
               "most likely the X server was shut down or you killed/destroyed\n"
Packit Service fb6fa5
               "the application.\n",
Packit Service fb6fa5
               g_get_prgname (),
Packit Service fb6fa5
               display ? DisplayString (display) : gdk_get_display_arg_name ());
Packit Service fb6fa5
    }
Packit Service fb6fa5
  else
Packit Service fb6fa5
    {
Packit Service fb6fa5
      g_fprintf (stderr, "%s: Fatal IO error %d (%s) on X server %s.\n",
Packit Service fb6fa5
               g_get_prgname (),
Packit Service fb6fa5
	       errno, g_strerror (errno),
Packit Service fb6fa5
	       display ? DisplayString (display) : gdk_get_display_arg_name ());
Packit Service fb6fa5
    }
Packit Service fb6fa5
Packit Service fb6fa5
  exit(1);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
/*************************************************************
Packit Service fb6fa5
 * gdk_error_trap_push:
Packit Service fb6fa5
 *     Push an error trap. X errors will be trapped until
Packit Service fb6fa5
 *     the corresponding gdk_error_pop(), which will return
Packit Service fb6fa5
 *     the error code, if any.
Packit Service fb6fa5
 *   arguments:
Packit Service fb6fa5
 *     
Packit Service fb6fa5
 *   results:
Packit Service fb6fa5
 *************************************************************/
Packit Service fb6fa5
Packit Service fb6fa5
void
Packit Service fb6fa5
gdk_error_trap_push (void)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GSList *node;
Packit Service fb6fa5
  GdkErrorTrap *trap;
Packit Service fb6fa5
Packit Service fb6fa5
  if (gdk_error_trap_free_list)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      node = gdk_error_trap_free_list;
Packit Service fb6fa5
      gdk_error_trap_free_list = gdk_error_trap_free_list->next;
Packit Service fb6fa5
    }
Packit Service fb6fa5
  else
Packit Service fb6fa5
    {
Packit Service fb6fa5
      node = g_slist_alloc ();
Packit Service fb6fa5
      node->data = g_new (GdkErrorTrap, 1);
Packit Service fb6fa5
    }
Packit Service fb6fa5
Packit Service fb6fa5
  node->next = gdk_error_traps;
Packit Service fb6fa5
  gdk_error_traps = node;
Packit Service fb6fa5
  
Packit Service fb6fa5
  trap = node->data;
Packit Service fb6fa5
  trap->old_handler = XSetErrorHandler (gdk_x_error);
Packit Service fb6fa5
  trap->error_code = _gdk_error_code;
Packit Service fb6fa5
  trap->error_warnings = _gdk_error_warnings;
Packit Service fb6fa5
Packit Service fb6fa5
  _gdk_error_code = 0;
Packit Service fb6fa5
  _gdk_error_warnings = 0;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
/*************************************************************
Packit Service fb6fa5
 * gdk_error_trap_pop:
Packit Service fb6fa5
 *     Pop an error trap added with gdk_error_push()
Packit Service fb6fa5
 *   arguments:
Packit Service fb6fa5
 *     
Packit Service fb6fa5
 *   results:
Packit Service fb6fa5
 *     0, if no error occured, otherwise the error code.
Packit Service fb6fa5
 *************************************************************/
Packit Service fb6fa5
Packit Service fb6fa5
gint
Packit Service fb6fa5
gdk_error_trap_pop (void)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GSList *node;
Packit Service fb6fa5
  GdkErrorTrap *trap;
Packit Service fb6fa5
  gint result;
Packit Service fb6fa5
Packit Service fb6fa5
  g_return_val_if_fail (gdk_error_traps != NULL, 0);
Packit Service fb6fa5
Packit Service fb6fa5
  node = gdk_error_traps;
Packit Service fb6fa5
  gdk_error_traps = gdk_error_traps->next;
Packit Service fb6fa5
Packit Service fb6fa5
  node->next = gdk_error_trap_free_list;
Packit Service fb6fa5
  gdk_error_trap_free_list = node;
Packit Service fb6fa5
  
Packit Service fb6fa5
  result = _gdk_error_code;
Packit Service fb6fa5
  
Packit Service fb6fa5
  trap = node->data;
Packit Service fb6fa5
  _gdk_error_code = trap->error_code;
Packit Service fb6fa5
  _gdk_error_warnings = trap->error_warnings;
Packit Service fb6fa5
  XSetErrorHandler (trap->old_handler);
Packit Service fb6fa5
  
Packit Service fb6fa5
  return result;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
gchar *
Packit Service fb6fa5
gdk_get_display (void)
Packit Service fb6fa5
{
Packit Service fb6fa5
  return g_strdup (gdk_display_get_name (gdk_display_get_default ()));
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
/**
Packit Service fb6fa5
 * _gdk_send_xevent:
Packit Service fb6fa5
 * @display: #GdkDisplay which @window is on
Packit Service fb6fa5
 * @window: window ID to which to send the event
Packit Service fb6fa5
 * @propagate: %TRUE if the event should be propagated if the target window
Packit Service fb6fa5
 *             doesn't handle it.
Packit Service fb6fa5
 * @event_mask: event mask to match against, or 0 to send it to @window
Packit Service fb6fa5
 *              without regard to event masks.
Packit Service fb6fa5
 * @event_send: #XEvent to send
Packit Service fb6fa5
 * 
Packit Service fb6fa5
 * Send an event, like XSendEvent(), but trap errors and check
Packit Service fb6fa5
 * the result.
Packit Service fb6fa5
 * 
Packit Service fb6fa5
 * Return value: %TRUE if sending the event succeeded.
Packit Service fb6fa5
 **/
Packit Service fb6fa5
gint 
Packit Service fb6fa5
_gdk_send_xevent (GdkDisplay *display,
Packit Service fb6fa5
		  Window      window, 
Packit Service fb6fa5
		  gboolean    propagate, 
Packit Service fb6fa5
		  glong       event_mask,
Packit Service fb6fa5
		  XEvent     *event_send)
Packit Service fb6fa5
{
Packit Service fb6fa5
  gboolean result;
Packit Service fb6fa5
Packit Service fb6fa5
  if (display->closed)
Packit Service fb6fa5
    return FALSE;
Packit Service fb6fa5
Packit Service fb6fa5
  gdk_error_trap_push ();
Packit Service fb6fa5
  result = XSendEvent (GDK_DISPLAY_XDISPLAY (display), window, 
Packit Service fb6fa5
		       propagate, event_mask, event_send);
Packit Service fb6fa5
  XSync (GDK_DISPLAY_XDISPLAY (display), False);
Packit Service fb6fa5
  
Packit Service fb6fa5
  if (gdk_error_trap_pop ())
Packit Service fb6fa5
    return FALSE;
Packit Service fb6fa5
 
Packit Service fb6fa5
  return result;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
void
Packit Service fb6fa5
_gdk_region_get_xrectangles (const GdkRegion *region,
Packit Service fb6fa5
                             gint             x_offset,
Packit Service fb6fa5
                             gint             y_offset,
Packit Service fb6fa5
                             XRectangle     **rects,
Packit Service fb6fa5
                             gint            *n_rects)
Packit Service fb6fa5
{
Packit Service fb6fa5
  XRectangle *rectangles = g_new (XRectangle, region->numRects);
Packit Service fb6fa5
  GdkRegionBox *boxes = region->rects;
Packit Service fb6fa5
  gint i;
Packit Service fb6fa5
  
Packit Service fb6fa5
  for (i = 0; i < region->numRects; i++)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      rectangles[i].x = CLAMP (boxes[i].x1 + x_offset, G_MINSHORT, G_MAXSHORT);
Packit Service fb6fa5
      rectangles[i].y = CLAMP (boxes[i].y1 + y_offset, G_MINSHORT, G_MAXSHORT);
Packit Service fb6fa5
      rectangles[i].width = CLAMP (boxes[i].x2 + x_offset, G_MINSHORT, G_MAXSHORT) - rectangles[i].x;
Packit Service fb6fa5
      rectangles[i].height = CLAMP (boxes[i].y2 + y_offset, G_MINSHORT, G_MAXSHORT) - rectangles[i].y;
Packit Service fb6fa5
    }
Packit Service fb6fa5
Packit Service fb6fa5
  *rects = rectangles;
Packit Service fb6fa5
  *n_rects = region->numRects;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
/**
Packit Service fb6fa5
 * gdk_x11_grab_server:
Packit Service fb6fa5
 * 
Packit Service fb6fa5
 * Call gdk_x11_display_grab() on the default display. 
Packit Service fb6fa5
 * To ungrab the server again, use gdk_x11_ungrab_server(). 
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * gdk_x11_grab_server()/gdk_x11_ungrab_server() calls can be nested.
Packit Service fb6fa5
 **/ 
Packit Service fb6fa5
void
Packit Service fb6fa5
gdk_x11_grab_server (void)
Packit Service fb6fa5
{
Packit Service fb6fa5
  gdk_x11_display_grab (gdk_display_get_default ());
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
/**
Packit Service fb6fa5
 * gdk_x11_ungrab_server:
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Ungrab the default display after it has been grabbed with 
Packit Service fb6fa5
 * gdk_x11_grab_server(). 
Packit Service fb6fa5
 **/
Packit Service fb6fa5
void
Packit Service fb6fa5
gdk_x11_ungrab_server (void)
Packit Service fb6fa5
{
Packit Service fb6fa5
  gdk_x11_display_ungrab (gdk_display_get_default ());
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
/**
Packit Service fb6fa5
 * gdk_x11_get_default_screen:
Packit Service fb6fa5
 * 
Packit Service fb6fa5
 * Gets the default GTK+ screen number.
Packit Service fb6fa5
 * 
Packit Service fb6fa5
 * Return value: returns the screen number specified by
Packit Service fb6fa5
 *   the --display command line option or the DISPLAY environment
Packit Service fb6fa5
 *   variable when gdk_init() calls XOpenDisplay().
Packit Service fb6fa5
 **/
Packit Service fb6fa5
gint
Packit Service fb6fa5
gdk_x11_get_default_screen (void)
Packit Service fb6fa5
{
Packit Service fb6fa5
  return gdk_screen_get_number (gdk_screen_get_default ());
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
/**
Packit Service fb6fa5
 * gdk_x11_get_default_root_xwindow:
Packit Service fb6fa5
 * 
Packit Service fb6fa5
 * Gets the root window of the default screen 
Packit Service fb6fa5
 * (see gdk_x11_get_default_screen()).  
Packit Service fb6fa5
 * 
Packit Service fb6fa5
 * Return value: an Xlib <type>Window</type>.
Packit Service fb6fa5
 **/
Packit Service fb6fa5
Window
Packit Service fb6fa5
gdk_x11_get_default_root_xwindow (void)
Packit Service fb6fa5
{
Packit Service fb6fa5
  return GDK_SCREEN_XROOTWIN (gdk_screen_get_default ());
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
/**
Packit Service fb6fa5
 * gdk_x11_get_default_xdisplay:
Packit Service fb6fa5
 * 
Packit Service fb6fa5
 * Gets the default GTK+ display.
Packit Service fb6fa5
 * 
Packit Service fb6fa5
 * Return value: the Xlib <type>Display*</type> for the display
Packit Service fb6fa5
 * specified in the <option>--display</option> command line option 
Packit Service fb6fa5
 * or the <envar>DISPLAY</envar> environment variable.
Packit Service fb6fa5
 **/
Packit Service fb6fa5
Display *
Packit Service fb6fa5
gdk_x11_get_default_xdisplay (void)
Packit Service fb6fa5
{
Packit Service fb6fa5
  return GDK_DISPLAY_XDISPLAY (gdk_display_get_default ());
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
#define __GDK_MAIN_X11_C__
Packit Service fb6fa5
#include "gdkaliasdef.c"