Blame gdk/gdkdisplay.c

Packit Service fb6fa5
/* GDK - The GIMP Drawing Kit
Packit Service fb6fa5
 * gdkdisplay.c
Packit Service fb6fa5
 * 
Packit Service fb6fa5
 * Copyright 2001 Sun Microsystems Inc. 
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Erwann Chenede <erwann.chenede@sun.com>
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 Library 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
 * Library General Public License for more details.
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * You should have received a copy of the GNU Library 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
#include "config.h"
Packit Service fb6fa5
#include <math.h>
Packit Service fb6fa5
#include <glib.h>
Packit Service fb6fa5
#include "gdk.h"		/* gdk_event_send_client_message() */
Packit Service fb6fa5
#include "gdkdisplay.h"
Packit Service fb6fa5
#include "gdkwindowimpl.h"
Packit Service fb6fa5
#include "gdkinternals.h"
Packit Service fb6fa5
#include "gdkmarshalers.h"
Packit Service fb6fa5
#include "gdkscreen.h"
Packit Service fb6fa5
#include "gdkalias.h"
Packit Service fb6fa5
Packit Service fb6fa5
enum {
Packit Service fb6fa5
  CLOSED,
Packit Service fb6fa5
  LAST_SIGNAL
Packit Service fb6fa5
};
Packit Service fb6fa5
Packit Service fb6fa5
static void gdk_display_dispose    (GObject         *object);
Packit Service fb6fa5
static void gdk_display_finalize   (GObject         *object);
Packit Service fb6fa5
Packit Service fb6fa5
Packit Service fb6fa5
static void       singlehead_get_pointer (GdkDisplay       *display,
Packit Service fb6fa5
					  GdkScreen       **screen,
Packit Service fb6fa5
					  gint             *x,
Packit Service fb6fa5
					  gint             *y,
Packit Service fb6fa5
					  GdkModifierType  *mask);
Packit Service fb6fa5
static GdkWindow* singlehead_window_get_pointer (GdkDisplay       *display,
Packit Service fb6fa5
						 GdkWindow        *window,
Packit Service fb6fa5
						 gint             *x,
Packit Service fb6fa5
						 gint             *y,
Packit Service fb6fa5
						 GdkModifierType  *mask);
Packit Service fb6fa5
static GdkWindow* singlehead_window_at_pointer  (GdkDisplay       *display,
Packit Service fb6fa5
						 gint             *win_x,
Packit Service fb6fa5
						 gint             *win_y);
Packit Service fb6fa5
Packit Service fb6fa5
static GdkWindow* singlehead_default_window_get_pointer (GdkWindow       *window,
Packit Service fb6fa5
							 gint            *x,
Packit Service fb6fa5
							 gint            *y,
Packit Service fb6fa5
							 GdkModifierType *mask);
Packit Service fb6fa5
static GdkWindow* singlehead_default_window_at_pointer  (GdkScreen       *screen,
Packit Service fb6fa5
							 gint            *win_x,
Packit Service fb6fa5
							 gint            *win_y);
Packit Service fb6fa5
static GdkWindow *gdk_window_real_window_get_pointer     (GdkDisplay       *display,
Packit Service fb6fa5
                                                          GdkWindow        *window,
Packit Service fb6fa5
                                                          gint             *x,
Packit Service fb6fa5
                                                          gint             *y,
Packit Service fb6fa5
                                                          GdkModifierType  *mask);
Packit Service fb6fa5
static GdkWindow *gdk_display_real_get_window_at_pointer (GdkDisplay       *display,
Packit Service fb6fa5
                                                          gint             *win_x,
Packit Service fb6fa5
                                                          gint             *win_y);
Packit Service fb6fa5
Packit Service fb6fa5
static guint signals[LAST_SIGNAL] = { 0 };
Packit Service fb6fa5
Packit Service fb6fa5
static char *gdk_sm_client_id;
Packit Service fb6fa5
Packit Service fb6fa5
static const GdkDisplayPointerHooks default_pointer_hooks = {
Packit Service fb6fa5
  _gdk_windowing_get_pointer,
Packit Service fb6fa5
  gdk_window_real_window_get_pointer,
Packit Service fb6fa5
  gdk_display_real_get_window_at_pointer
Packit Service fb6fa5
};
Packit Service fb6fa5
Packit Service fb6fa5
static const GdkDisplayPointerHooks singlehead_pointer_hooks = {
Packit Service fb6fa5
  singlehead_get_pointer,
Packit Service fb6fa5
  singlehead_window_get_pointer,
Packit Service fb6fa5
  singlehead_window_at_pointer
Packit Service fb6fa5
};
Packit Service fb6fa5
Packit Service fb6fa5
static const GdkPointerHooks singlehead_default_pointer_hooks = {
Packit Service fb6fa5
  singlehead_default_window_get_pointer,
Packit Service fb6fa5
  singlehead_default_window_at_pointer
Packit Service fb6fa5
};
Packit Service fb6fa5
Packit Service fb6fa5
static const GdkPointerHooks *singlehead_current_pointer_hooks = &singlehead_default_pointer_hooks;
Packit Service fb6fa5
Packit Service fb6fa5
G_DEFINE_TYPE (GdkDisplay, gdk_display, G_TYPE_OBJECT)
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
gdk_display_class_init (GdkDisplayClass *class)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GObjectClass *object_class = G_OBJECT_CLASS (class);
Packit Service fb6fa5
  
Packit Service fb6fa5
  object_class->finalize = gdk_display_finalize;
Packit Service fb6fa5
  object_class->dispose = gdk_display_dispose;
Packit Service fb6fa5
Packit Service fb6fa5
  /**
Packit Service fb6fa5
   * GdkDisplay::closed:
Packit Service fb6fa5
   * @display: the object on which the signal is emitted
Packit Service fb6fa5
   * @is_error: %TRUE if the display was closed due to an error
Packit Service fb6fa5
   *
Packit Service fb6fa5
   * The ::closed signal is emitted when the connection to the windowing
Packit Service fb6fa5
   * system for @display is closed.
Packit Service fb6fa5
   *
Packit Service fb6fa5
   * Since: 2.2
Packit Service fb6fa5
   */   
Packit Service fb6fa5
  signals[CLOSED] =
Packit Service fb6fa5
    g_signal_new (g_intern_static_string ("closed"),
Packit Service fb6fa5
		  G_OBJECT_CLASS_TYPE (object_class),
Packit Service fb6fa5
		  G_SIGNAL_RUN_LAST,
Packit Service fb6fa5
		  G_STRUCT_OFFSET (GdkDisplayClass, closed),
Packit Service fb6fa5
		  NULL, NULL,
Packit Service fb6fa5
		  _gdk_marshal_VOID__BOOLEAN,
Packit Service fb6fa5
		  G_TYPE_NONE,
Packit Service fb6fa5
		  1,
Packit Service fb6fa5
		  G_TYPE_BOOLEAN);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
gdk_display_init (GdkDisplay *display)
Packit Service fb6fa5
{
Packit Service fb6fa5
  _gdk_displays = g_slist_prepend (_gdk_displays, display);
Packit Service fb6fa5
Packit Service fb6fa5
  display->button_click_time[0] = display->button_click_time[1] = 0;
Packit Service fb6fa5
  display->button_window[0] = display->button_window[1] = NULL;
Packit Service fb6fa5
  display->button_number[0] = display->button_number[1] = -1;
Packit Service fb6fa5
  display->button_x[0] = display->button_x[1] = 0;
Packit Service fb6fa5
  display->button_y[0] = display->button_y[1] = 0;
Packit Service fb6fa5
Packit Service fb6fa5
  display->double_click_time = 250;
Packit Service fb6fa5
  display->double_click_distance = 5;
Packit Service fb6fa5
Packit Service fb6fa5
  display->pointer_hooks = &default_pointer_hooks;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
gdk_display_dispose (GObject *object)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GdkDisplay *display = GDK_DISPLAY_OBJECT (object);
Packit Service fb6fa5
Packit Service fb6fa5
  g_list_foreach (display->queued_events, (GFunc)gdk_event_free, NULL);
Packit Service fb6fa5
  g_list_free (display->queued_events);
Packit Service fb6fa5
  display->queued_events = NULL;
Packit Service fb6fa5
  display->queued_tail = NULL;
Packit Service fb6fa5
Packit Service fb6fa5
  _gdk_displays = g_slist_remove (_gdk_displays, object);
Packit Service fb6fa5
Packit Service fb6fa5
  if (gdk_display_get_default() == display)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      if (_gdk_displays)
Packit Service fb6fa5
        gdk_display_manager_set_default_display (gdk_display_manager_get(),
Packit Service fb6fa5
                                                 _gdk_displays->data);
Packit Service fb6fa5
      else
Packit Service fb6fa5
        gdk_display_manager_set_default_display (gdk_display_manager_get(),
Packit Service fb6fa5
                                                 NULL);
Packit Service fb6fa5
    }
Packit Service fb6fa5
Packit Service fb6fa5
  G_OBJECT_CLASS (gdk_display_parent_class)->dispose (object);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
gdk_display_finalize (GObject *object)
Packit Service fb6fa5
{
Packit Service fb6fa5
  G_OBJECT_CLASS (gdk_display_parent_class)->finalize (object);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
/**
Packit Service fb6fa5
 * gdk_display_close:
Packit Service fb6fa5
 * @display: a #GdkDisplay
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Closes the connection to the windowing system for the given display,
Packit Service fb6fa5
 * and cleans up associated resources.
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Since: 2.2
Packit Service fb6fa5
 */
Packit Service fb6fa5
void
Packit Service fb6fa5
gdk_display_close (GdkDisplay *display)
Packit Service fb6fa5
{
Packit Service fb6fa5
  g_return_if_fail (GDK_IS_DISPLAY (display));
Packit Service fb6fa5
Packit Service fb6fa5
  if (!display->closed)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      display->closed = TRUE;
Packit Service fb6fa5
      
Packit Service fb6fa5
      g_signal_emit (display, signals[CLOSED], 0, FALSE);
Packit Service fb6fa5
      g_object_run_dispose (G_OBJECT (display));
Packit Service fb6fa5
      
Packit Service fb6fa5
      g_object_unref (display);
Packit Service fb6fa5
    }
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
/**
Packit Service fb6fa5
 * gdk_display_is_closed:
Packit Service fb6fa5
 * @display: a #GdkDisplay
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Finds out if the display has been closed.
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Returns: %TRUE if the display is closed.
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Since: 2.22
Packit Service fb6fa5
 */
Packit Service fb6fa5
gboolean
Packit Service fb6fa5
gdk_display_is_closed  (GdkDisplay  *display)
Packit Service fb6fa5
{
Packit Service fb6fa5
  g_return_val_if_fail (GDK_IS_DISPLAY (display), FALSE);
Packit Service fb6fa5
Packit Service fb6fa5
  return display->closed;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
/**
Packit Service fb6fa5
 * gdk_display_get_event:
Packit Service fb6fa5
 * @display: a #GdkDisplay
Packit Service fb6fa5
 * 
Packit Service fb6fa5
 * Gets the next #GdkEvent to be processed for @display, fetching events from the
Packit Service fb6fa5
 * windowing system if necessary.
Packit Service fb6fa5
 * 
Packit Service fb6fa5
 * Return value: the next #GdkEvent to be processed, or %NULL if no events
Packit Service fb6fa5
 * are pending. The returned #GdkEvent should be freed with gdk_event_free().
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Since: 2.2
Packit Service fb6fa5
 **/
Packit Service fb6fa5
GdkEvent*
Packit Service fb6fa5
gdk_display_get_event (GdkDisplay *display)
Packit Service fb6fa5
{
Packit Service fb6fa5
  g_return_val_if_fail (GDK_IS_DISPLAY (display), NULL);
Packit Service fb6fa5
  
Packit Service fb6fa5
  _gdk_events_queue (display);
Packit Service fb6fa5
  return _gdk_event_unqueue (display);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
/**
Packit Service fb6fa5
 * gdk_display_peek_event:
Packit Service fb6fa5
 * @display: a #GdkDisplay 
Packit Service fb6fa5
 * 
Packit Service fb6fa5
 * Gets a copy of the first #GdkEvent in the @display's event queue, without
Packit Service fb6fa5
 * removing the event from the queue.  (Note that this function will
Packit Service fb6fa5
 * not get more events from the windowing system.  It only checks the events
Packit Service fb6fa5
 * that have already been moved to the GDK event queue.)
Packit Service fb6fa5
 * 
Packit Service fb6fa5
 * Return value: a copy of the first #GdkEvent on the event queue, or %NULL 
Packit Service fb6fa5
 * if no events are in the queue. The returned #GdkEvent should be freed with
Packit Service fb6fa5
 * gdk_event_free().
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Since: 2.2
Packit Service fb6fa5
 **/
Packit Service fb6fa5
GdkEvent*
Packit Service fb6fa5
gdk_display_peek_event (GdkDisplay *display)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GList *tmp_list;
Packit Service fb6fa5
Packit Service fb6fa5
  g_return_val_if_fail (GDK_IS_DISPLAY (display), NULL);
Packit Service fb6fa5
Packit Service fb6fa5
  tmp_list = _gdk_event_queue_find_first (display);
Packit Service fb6fa5
  
Packit Service fb6fa5
  if (tmp_list)
Packit Service fb6fa5
    return gdk_event_copy (tmp_list->data);
Packit Service fb6fa5
  else
Packit Service fb6fa5
    return NULL;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
/**
Packit Service fb6fa5
 * gdk_display_put_event:
Packit Service fb6fa5
 * @display: a #GdkDisplay
Packit Service fb6fa5
 * @event: a #GdkEvent.
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Appends a copy of the given event onto the front of the event
Packit Service fb6fa5
 * queue for @display.
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Since: 2.2
Packit Service fb6fa5
 **/
Packit Service fb6fa5
void
Packit Service fb6fa5
gdk_display_put_event (GdkDisplay     *display,
Packit Service fb6fa5
		       const GdkEvent *event)
Packit Service fb6fa5
{
Packit Service fb6fa5
  g_return_if_fail (GDK_IS_DISPLAY (display));
Packit Service fb6fa5
  g_return_if_fail (event != NULL);
Packit Service fb6fa5
Packit Service fb6fa5
  _gdk_event_queue_append (display, gdk_event_copy (event));
Packit Service fb6fa5
  /* If the main loop is blocking in a different thread, wake it up */
Packit Service fb6fa5
  g_main_context_wakeup (NULL); 
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
/**
Packit Service fb6fa5
 * gdk_pointer_ungrab:
Packit Service fb6fa5
 * @time_: a timestamp from a #GdkEvent, or %GDK_CURRENT_TIME if no 
Packit Service fb6fa5
 *  timestamp is available.
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Ungrabs the pointer on the default display, if it is grabbed by this 
Packit Service fb6fa5
 * application.
Packit Service fb6fa5
 **/
Packit Service fb6fa5
void
Packit Service fb6fa5
gdk_pointer_ungrab (guint32 time)
Packit Service fb6fa5
{
Packit Service fb6fa5
  gdk_display_pointer_ungrab (gdk_display_get_default (), time);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
/**
Packit Service fb6fa5
 * gdk_pointer_is_grabbed:
Packit Service fb6fa5
 * 
Packit Service fb6fa5
 * Returns %TRUE if the pointer on the default display is currently 
Packit Service fb6fa5
 * grabbed by this application.
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Note that this does not take the inmplicit pointer grab on button
Packit Service fb6fa5
 * presses into account.
Packit Service fb6fa5
Packit Service fb6fa5
 * Return value: %TRUE if the pointer is currently grabbed by this application.* 
Packit Service fb6fa5
 **/
Packit Service fb6fa5
gboolean
Packit Service fb6fa5
gdk_pointer_is_grabbed (void)
Packit Service fb6fa5
{
Packit Service fb6fa5
  return gdk_display_pointer_is_grabbed (gdk_display_get_default ());
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
/**
Packit Service fb6fa5
 * gdk_keyboard_ungrab:
Packit Service fb6fa5
 * @time_: a timestamp from a #GdkEvent, or %GDK_CURRENT_TIME if no
Packit Service fb6fa5
 *        timestamp is available.
Packit Service fb6fa5
 * 
Packit Service fb6fa5
 * Ungrabs the keyboard on the default display, if it is grabbed by this 
Packit Service fb6fa5
 * application.
Packit Service fb6fa5
 **/
Packit Service fb6fa5
void
Packit Service fb6fa5
gdk_keyboard_ungrab (guint32 time)
Packit Service fb6fa5
{
Packit Service fb6fa5
  gdk_display_keyboard_ungrab (gdk_display_get_default (), time);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
/**
Packit Service fb6fa5
 * gdk_beep:
Packit Service fb6fa5
 * 
Packit Service fb6fa5
 * Emits a short beep on the default display.
Packit Service fb6fa5
 **/
Packit Service fb6fa5
void
Packit Service fb6fa5
gdk_beep (void)
Packit Service fb6fa5
{
Packit Service fb6fa5
  gdk_display_beep (gdk_display_get_default ());
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
/**
Packit Service fb6fa5
 * gdk_event_send_client_message:
Packit Service fb6fa5
 * @event: the #GdkEvent to send, which should be a #GdkEventClient.
Packit Service fb6fa5
 * @winid:  the window to send the X ClientMessage event to.
Packit Service fb6fa5
 * 
Packit Service fb6fa5
 * Sends an X ClientMessage event to a given window (which must be
Packit Service fb6fa5
 * on the default #GdkDisplay.)
Packit Service fb6fa5
 * This could be used for communicating between different applications,
Packit Service fb6fa5
 * though the amount of data is limited to 20 bytes.
Packit Service fb6fa5
 * 
Packit Service fb6fa5
 * Return value: non-zero on success.
Packit Service fb6fa5
 **/
Packit Service fb6fa5
gboolean
Packit Service fb6fa5
gdk_event_send_client_message (GdkEvent        *event,
Packit Service fb6fa5
			       GdkNativeWindow  winid)
Packit Service fb6fa5
{
Packit Service fb6fa5
  g_return_val_if_fail (event != NULL, FALSE);
Packit Service fb6fa5
Packit Service fb6fa5
  return gdk_event_send_client_message_for_display (gdk_display_get_default (),
Packit Service fb6fa5
						    event, winid);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
/**
Packit Service fb6fa5
 * gdk_event_send_clientmessage_toall:
Packit Service fb6fa5
 * @event: the #GdkEvent to send, which should be a #GdkEventClient.
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Sends an X ClientMessage event to all toplevel windows on the default
Packit Service fb6fa5
 * #GdkScreen.
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Toplevel windows are determined by checking for the WM_STATE property, as
Packit Service fb6fa5
 * 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 sent
Packit Service fb6fa5
 * to all children of the root window.
Packit Service fb6fa5
 **/
Packit Service fb6fa5
void
Packit Service fb6fa5
gdk_event_send_clientmessage_toall (GdkEvent *event)
Packit Service fb6fa5
{
Packit Service fb6fa5
  g_return_if_fail (event != NULL);
Packit Service fb6fa5
Packit Service fb6fa5
  gdk_screen_broadcast_client_message (gdk_screen_get_default (), event);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
/**
Packit Service fb6fa5
 * gdk_device_get_core_pointer:
Packit Service fb6fa5
 * 
Packit Service fb6fa5
 * Returns the core pointer device for the default display.
Packit Service fb6fa5
 * 
Packit Service fb6fa5
 * Return value: the core pointer device; this is owned by the
Packit Service fb6fa5
 *   display and should not be freed.
Packit Service fb6fa5
 **/
Packit Service fb6fa5
GdkDevice *
Packit Service fb6fa5
gdk_device_get_core_pointer (void)
Packit Service fb6fa5
{
Packit Service fb6fa5
  return gdk_display_get_core_pointer (gdk_display_get_default ());
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
/**
Packit Service fb6fa5
 * gdk_display_get_core_pointer:
Packit Service fb6fa5
 * @display: a #GdkDisplay
Packit Service fb6fa5
 * 
Packit Service fb6fa5
 * Returns the core pointer device for the given display
Packit Service fb6fa5
 * 
Packit Service fb6fa5
 * Return value: the core pointer device; this is owned by the
Packit Service fb6fa5
 *   display and should not be freed.
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Since: 2.2
Packit Service fb6fa5
 **/
Packit Service fb6fa5
GdkDevice *
Packit Service fb6fa5
gdk_display_get_core_pointer (GdkDisplay *display)
Packit Service fb6fa5
{
Packit Service fb6fa5
  return display->core_pointer;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
/**
Packit Service fb6fa5
 * gdk_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
 * (ICCCM) for information on the <literal>WM_CLIENT_LEADER</literal> property. 
Packit Service fb6fa5
 * (Both documents are part of the X Window System distribution.)
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Deprecated:2.24: Use gdk_x11_set_sm_client_id() instead
Packit Service fb6fa5
 **/
Packit Service fb6fa5
void
Packit Service fb6fa5
gdk_set_sm_client_id (const gchar* sm_client_id)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GSList *displays, *tmp_list;
Packit Service fb6fa5
  
Packit Service fb6fa5
  g_free (gdk_sm_client_id);
Packit Service fb6fa5
  gdk_sm_client_id = g_strdup (sm_client_id);
Packit Service fb6fa5
Packit Service fb6fa5
  displays = gdk_display_manager_list_displays (gdk_display_manager_get ());
Packit Service fb6fa5
  for (tmp_list = displays; tmp_list; tmp_list = tmp_list->next)
Packit Service fb6fa5
    _gdk_windowing_display_set_sm_client_id (tmp_list->data, sm_client_id);
Packit Service fb6fa5
Packit Service fb6fa5
  g_slist_free (displays);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
/**
Packit Service fb6fa5
 * _gdk_get_sm_client_id:
Packit Service fb6fa5
 * 
Packit Service fb6fa5
 * Gets the client ID set with gdk_set_sm_client_id(), if any.
Packit Service fb6fa5
 * 
Packit Service fb6fa5
 * Return value: Session ID, or %NULL if gdk_set_sm_client_id()
Packit Service fb6fa5
 *               has never been called.
Packit Service fb6fa5
 **/
Packit Service fb6fa5
const char *
Packit Service fb6fa5
_gdk_get_sm_client_id (void)
Packit Service fb6fa5
{
Packit Service fb6fa5
  return gdk_sm_client_id;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
void
Packit Service fb6fa5
_gdk_display_enable_motion_hints (GdkDisplay *display)
Packit Service fb6fa5
{
Packit Service fb6fa5
  gulong serial;
Packit Service fb6fa5
  
Packit Service fb6fa5
  if (display->pointer_info.motion_hint_serial != 0)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      serial = _gdk_windowing_window_get_next_serial (display);
Packit Service fb6fa5
      /* We might not actually generate the next request, so
Packit Service fb6fa5
	 make sure this triggers always, this may cause it to
Packit Service fb6fa5
	 trigger slightly too early, but this is just a hint
Packit Service fb6fa5
	 anyway. */
Packit Service fb6fa5
      if (serial > 0)
Packit Service fb6fa5
	serial--;
Packit Service fb6fa5
      if (serial < display->pointer_info.motion_hint_serial)
Packit Service fb6fa5
	display->pointer_info.motion_hint_serial = serial;
Packit Service fb6fa5
    }
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
/**
Packit Service fb6fa5
 * gdk_display_get_pointer:
Packit Service fb6fa5
 * @display: a #GdkDisplay
Packit Service fb6fa5
 * @screen: (out) (allow-none): location to store the screen that the
Packit Service fb6fa5
 *          cursor is on, or %NULL.
Packit Service fb6fa5
 * @x: (out) (allow-none): location to store root window X coordinate of pointer, or %NULL.
Packit Service fb6fa5
 * @y: (out) (allow-none): location to store root window Y coordinate of pointer, or %NULL.
Packit Service fb6fa5
 * @mask: (out) (allow-none): location to store current modifier mask, or %NULL
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Gets the current location of the pointer and the current modifier
Packit Service fb6fa5
 * mask for a given display.
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Since: 2.2
Packit Service fb6fa5
 **/
Packit Service fb6fa5
void
Packit Service fb6fa5
gdk_display_get_pointer (GdkDisplay      *display,
Packit Service fb6fa5
			 GdkScreen      **screen,
Packit Service fb6fa5
			 gint            *x,
Packit Service fb6fa5
			 gint            *y,
Packit Service fb6fa5
			 GdkModifierType *mask)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GdkScreen *tmp_screen;
Packit Service fb6fa5
  gint tmp_x, tmp_y;
Packit Service fb6fa5
  GdkModifierType tmp_mask;
Packit Service fb6fa5
  
Packit Service fb6fa5
  g_return_if_fail (GDK_IS_DISPLAY (display));
Packit Service fb6fa5
Packit Service fb6fa5
  display->pointer_hooks->get_pointer (display, &tmp_screen, &tmp_x, &tmp_y, &tmp_mask);
Packit Service fb6fa5
Packit Service fb6fa5
  if (screen)
Packit Service fb6fa5
    *screen = tmp_screen;
Packit Service fb6fa5
  if (x)
Packit Service fb6fa5
    *x = tmp_x;
Packit Service fb6fa5
  if (y)
Packit Service fb6fa5
    *y = tmp_y;
Packit Service fb6fa5
  if (mask)
Packit Service fb6fa5
    *mask = tmp_mask;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static GdkWindow *
Packit Service fb6fa5
gdk_display_real_get_window_at_pointer (GdkDisplay *display,
Packit Service fb6fa5
                                        gint       *win_x,
Packit Service fb6fa5
                                        gint       *win_y)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GdkWindow *window;
Packit Service fb6fa5
  gint x, y;
Packit Service fb6fa5
Packit Service fb6fa5
  window = _gdk_windowing_window_at_pointer (display, &x, &y, NULL, FALSE);
Packit Service fb6fa5
Packit Service fb6fa5
  /* This might need corrections, as the native window returned
Packit Service fb6fa5
     may contain client side children */
Packit Service fb6fa5
  if (window)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      double xx, yy;
Packit Service fb6fa5
Packit Service fb6fa5
      window = _gdk_window_find_descendant_at (window,
Packit Service fb6fa5
					       x, y,
Packit Service fb6fa5
					       &xx, &yy;;
Packit Service fb6fa5
      x = floor (xx + 0.5);
Packit Service fb6fa5
      y = floor (yy + 0.5);
Packit Service fb6fa5
    }
Packit Service fb6fa5
Packit Service fb6fa5
  *win_x = x;
Packit Service fb6fa5
  *win_y = y;
Packit Service fb6fa5
Packit Service fb6fa5
  return window;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static GdkWindow *
Packit Service fb6fa5
gdk_window_real_window_get_pointer (GdkDisplay       *display,
Packit Service fb6fa5
                                    GdkWindow        *window,
Packit Service fb6fa5
                                    gint             *x,
Packit Service fb6fa5
                                    gint             *y,
Packit Service fb6fa5
                                    GdkModifierType  *mask)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GdkWindowObject *private;
Packit Service fb6fa5
  gint tmpx, tmpy;
Packit Service fb6fa5
  GdkModifierType tmp_mask;
Packit Service fb6fa5
  gboolean normal_child;
Packit Service fb6fa5
Packit Service fb6fa5
  private = (GdkWindowObject *) window;
Packit Service fb6fa5
Packit Service fb6fa5
  normal_child = GDK_WINDOW_IMPL_GET_IFACE (private->impl)->get_pointer (window,
Packit Service fb6fa5
									 &tmpx, &tmpy,
Packit Service fb6fa5
									 &tmp_mask);
Packit Service fb6fa5
  /* We got the coords on the impl, convert to the window */
Packit Service fb6fa5
  tmpx -= private->abs_x;
Packit Service fb6fa5
  tmpy -= private->abs_y;
Packit Service fb6fa5
Packit Service fb6fa5
  if (x)
Packit Service fb6fa5
    *x = tmpx;
Packit Service fb6fa5
  if (y)
Packit Service fb6fa5
    *y = tmpy;
Packit Service fb6fa5
  if (mask)
Packit Service fb6fa5
    *mask = tmp_mask;
Packit Service fb6fa5
Packit Service fb6fa5
  if (normal_child)
Packit Service fb6fa5
    return _gdk_window_find_child_at (window, tmpx, tmpy);
Packit Service fb6fa5
  return NULL;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
/**
Packit Service fb6fa5
 * gdk_display_get_window_at_pointer:
Packit Service fb6fa5
 * @display: a #GdkDisplay
Packit Service fb6fa5
 * @win_x: (out) (allow-none): return location for x coordinate of the pointer location relative
Packit Service fb6fa5
 *    to the window origin, or %NULL
Packit Service fb6fa5
 * @win_y: (out) (allow-none): return location for y coordinate of the pointer location relative
Packit Service fb6fa5
 &    to the window origin, or %NULL
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Obtains the window underneath the mouse pointer, returning the location
Packit Service fb6fa5
 * of the pointer in that window in @win_x, @win_y for @screen. Returns %NULL
Packit Service fb6fa5
 * if the window under the mouse pointer is not known to GDK (for example, 
Packit Service fb6fa5
 * belongs to another application).
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Returns: (transfer none): the window under the mouse pointer, or %NULL
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Since: 2.2
Packit Service fb6fa5
 **/
Packit Service fb6fa5
GdkWindow *
Packit Service fb6fa5
gdk_display_get_window_at_pointer (GdkDisplay *display,
Packit Service fb6fa5
				   gint       *win_x,
Packit Service fb6fa5
				   gint       *win_y)
Packit Service fb6fa5
{
Packit Service fb6fa5
  gint tmp_x, tmp_y;
Packit Service fb6fa5
  GdkWindow *window;
Packit Service fb6fa5
Packit Service fb6fa5
  g_return_val_if_fail (GDK_IS_DISPLAY (display), NULL);
Packit Service fb6fa5
Packit Service fb6fa5
  window = display->pointer_hooks->window_at_pointer (display, &tmp_x, &tmp_y);
Packit Service fb6fa5
Packit Service fb6fa5
  if (win_x)
Packit Service fb6fa5
    *win_x = tmp_x;
Packit Service fb6fa5
  if (win_y)
Packit Service fb6fa5
    *win_y = tmp_y;
Packit Service fb6fa5
Packit Service fb6fa5
  return window;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
/**
Packit Service fb6fa5
 * gdk_display_set_pointer_hooks:
Packit Service fb6fa5
 * @display: a #GdkDisplay
Packit Service fb6fa5
 * @new_hooks: a table of pointers to functions for getting
Packit Service fb6fa5
 *   quantities related to the current pointer position,
Packit Service fb6fa5
 *   or %NULL to restore the default table.
Packit Service fb6fa5
 * 
Packit Service fb6fa5
 * This function allows for hooking into the operation
Packit Service fb6fa5
 * of getting the current location of the pointer on a particular
Packit Service fb6fa5
 * display. This is only useful for such low-level tools as an
Packit Service fb6fa5
 * event recorder. Applications should never have any
Packit Service fb6fa5
 * reason to use this facility.
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Return value: the previous pointer hook table
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Since: 2.2
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Deprecated: 2.24: This function will go away in GTK 3 for lack of use cases.
Packit Service fb6fa5
 **/
Packit Service fb6fa5
GdkDisplayPointerHooks *
Packit Service fb6fa5
gdk_display_set_pointer_hooks (GdkDisplay                   *display,
Packit Service fb6fa5
			       const GdkDisplayPointerHooks *new_hooks)
Packit Service fb6fa5
{
Packit Service fb6fa5
  const GdkDisplayPointerHooks *result;
Packit Service fb6fa5
Packit Service fb6fa5
  g_return_val_if_fail (GDK_IS_DISPLAY (display), NULL);
Packit Service fb6fa5
  result = display->pointer_hooks;
Packit Service fb6fa5
Packit Service fb6fa5
  if (new_hooks)
Packit Service fb6fa5
    display->pointer_hooks = new_hooks;
Packit Service fb6fa5
  else
Packit Service fb6fa5
    display->pointer_hooks = &default_pointer_hooks;
Packit Service fb6fa5
Packit Service fb6fa5
  return (GdkDisplayPointerHooks *)result;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
singlehead_get_pointer (GdkDisplay       *display,
Packit Service fb6fa5
			GdkScreen       **screen,
Packit Service fb6fa5
			gint             *x,
Packit Service fb6fa5
			gint             *y,
Packit Service fb6fa5
			GdkModifierType  *mask)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GdkScreen *default_screen = gdk_display_get_default_screen (display);
Packit Service fb6fa5
  GdkWindow *root_window = gdk_screen_get_root_window (default_screen);
Packit Service fb6fa5
Packit Service fb6fa5
  *screen = default_screen;
Packit Service fb6fa5
Packit Service fb6fa5
  singlehead_current_pointer_hooks->get_pointer (root_window, x, y, mask);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static GdkWindow*
Packit Service fb6fa5
singlehead_window_get_pointer (GdkDisplay       *display,
Packit Service fb6fa5
			       GdkWindow        *window,
Packit Service fb6fa5
			       gint             *x,
Packit Service fb6fa5
			       gint             *y,
Packit Service fb6fa5
			       GdkModifierType  *mask)
Packit Service fb6fa5
{
Packit Service fb6fa5
  return singlehead_current_pointer_hooks->get_pointer (window, x, y, mask);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static GdkWindow*
Packit Service fb6fa5
singlehead_window_at_pointer   (GdkDisplay *display,
Packit Service fb6fa5
				gint       *win_x,
Packit Service fb6fa5
				gint       *win_y)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GdkScreen *default_screen = gdk_display_get_default_screen (display);
Packit Service fb6fa5
Packit Service fb6fa5
  return singlehead_current_pointer_hooks->window_at_pointer (default_screen,
Packit Service fb6fa5
							      win_x, win_y);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static GdkWindow*
Packit Service fb6fa5
singlehead_default_window_get_pointer (GdkWindow       *window,
Packit Service fb6fa5
				       gint            *x,
Packit Service fb6fa5
				       gint            *y,
Packit Service fb6fa5
				       GdkModifierType *mask)
Packit Service fb6fa5
{
Packit Service fb6fa5
  return gdk_window_real_window_get_pointer (gdk_drawable_get_display (window),
Packit Service fb6fa5
                                             window, x, y, mask);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static GdkWindow*
Packit Service fb6fa5
singlehead_default_window_at_pointer  (GdkScreen       *screen,
Packit Service fb6fa5
				       gint            *win_x,
Packit Service fb6fa5
				       gint            *win_y)
Packit Service fb6fa5
{
Packit Service fb6fa5
  return gdk_display_real_get_window_at_pointer (gdk_screen_get_display (screen),
Packit Service fb6fa5
                                                 win_x, win_y);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
/**
Packit Service fb6fa5
 * gdk_set_pointer_hooks:
Packit Service fb6fa5
 * @new_hooks: a table of pointers to functions for getting
Packit Service fb6fa5
 *   quantities related to the current pointer position,
Packit Service fb6fa5
 *   or %NULL to restore the default table.
Packit Service fb6fa5
 * 
Packit Service fb6fa5
 * This function allows for hooking into the operation
Packit Service fb6fa5
 * of getting the current location of the pointer. This
Packit Service fb6fa5
 * is only useful for such low-level tools as an
Packit Service fb6fa5
 * event recorder. Applications should never have any
Packit Service fb6fa5
 * reason to use this facility.
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * This function is not multihead safe. For multihead operation,
Packit Service fb6fa5
 * see gdk_display_set_pointer_hooks().
Packit Service fb6fa5
 * 
Packit Service fb6fa5
 * Return value: the previous pointer hook table
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Deprecated: 2.24: This function will go away in GTK 3 for lack of use cases.
Packit Service fb6fa5
 **/
Packit Service fb6fa5
GdkPointerHooks *
Packit Service fb6fa5
gdk_set_pointer_hooks (const GdkPointerHooks *new_hooks)
Packit Service fb6fa5
{
Packit Service fb6fa5
  const GdkPointerHooks *result = singlehead_current_pointer_hooks;
Packit Service fb6fa5
Packit Service fb6fa5
  if (new_hooks)
Packit Service fb6fa5
    singlehead_current_pointer_hooks = new_hooks;
Packit Service fb6fa5
  else
Packit Service fb6fa5
    singlehead_current_pointer_hooks = &singlehead_default_pointer_hooks;
Packit Service fb6fa5
Packit Service fb6fa5
  gdk_display_set_pointer_hooks (gdk_display_get_default (),
Packit Service fb6fa5
				 &singlehead_pointer_hooks);
Packit Service fb6fa5
  
Packit Service fb6fa5
  return (GdkPointerHooks *)result;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
generate_grab_broken_event (GdkWindow *window,
Packit Service fb6fa5
			    gboolean   keyboard,
Packit Service fb6fa5
			    gboolean   implicit,
Packit Service fb6fa5
			    GdkWindow *grab_window)
Packit Service fb6fa5
{
Packit Service fb6fa5
  g_return_if_fail (window != NULL);
Packit Service fb6fa5
Packit Service fb6fa5
  if (!GDK_WINDOW_DESTROYED (window))
Packit Service fb6fa5
    {
Packit Service fb6fa5
      GdkEvent event;
Packit Service fb6fa5
      event.type = GDK_GRAB_BROKEN;
Packit Service fb6fa5
      event.grab_broken.window = window;
Packit Service fb6fa5
      event.grab_broken.send_event = 0;
Packit Service fb6fa5
      event.grab_broken.keyboard = keyboard;
Packit Service fb6fa5
      event.grab_broken.implicit = implicit;
Packit Service fb6fa5
      event.grab_broken.grab_window = grab_window;
Packit Service fb6fa5
      gdk_event_put (&event);
Packit Service fb6fa5
    }
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
GdkPointerGrabInfo *
Packit Service fb6fa5
_gdk_display_get_last_pointer_grab (GdkDisplay *display)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GList *l;
Packit Service fb6fa5
Packit Service fb6fa5
  l = g_list_last (display->pointer_grabs);
Packit Service fb6fa5
Packit Service fb6fa5
  if (l == NULL)
Packit Service fb6fa5
    return NULL;
Packit Service fb6fa5
  else
Packit Service fb6fa5
    return (GdkPointerGrabInfo *)l->data;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
Packit Service fb6fa5
GdkPointerGrabInfo *
Packit Service fb6fa5
_gdk_display_add_pointer_grab (GdkDisplay *display,
Packit Service fb6fa5
			       GdkWindow *window,
Packit Service fb6fa5
			       GdkWindow *native_window,
Packit Service fb6fa5
			       gboolean owner_events,
Packit Service fb6fa5
			       GdkEventMask event_mask,
Packit Service fb6fa5
			       unsigned long serial_start,
Packit Service fb6fa5
			       guint32 time,
Packit Service fb6fa5
			       gboolean implicit)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GdkPointerGrabInfo *info, *other_info;
Packit Service fb6fa5
  GList *l;
Packit Service fb6fa5
Packit Service fb6fa5
  info = g_new0 (GdkPointerGrabInfo, 1);
Packit Service fb6fa5
Packit Service fb6fa5
  info->window = g_object_ref (window);
Packit Service fb6fa5
  info->native_window = g_object_ref (native_window);
Packit Service fb6fa5
  info->serial_start = serial_start;
Packit Service fb6fa5
  info->serial_end = G_MAXULONG;
Packit Service fb6fa5
  info->owner_events = owner_events;
Packit Service fb6fa5
  info->event_mask = event_mask;
Packit Service fb6fa5
  info->time = time;
Packit Service fb6fa5
  info->implicit = implicit;
Packit Service fb6fa5
Packit Service fb6fa5
  /* Find the first grab that has a larger start time (if any) and insert
Packit Service fb6fa5
   * before that. I.E we insert after already existing grabs with same
Packit Service fb6fa5
   * start time */
Packit Service fb6fa5
  for (l = display->pointer_grabs; l != NULL; l = l->next)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      other_info = l->data;
Packit Service fb6fa5
      
Packit Service fb6fa5
      if (info->serial_start < other_info->serial_start)
Packit Service fb6fa5
	break;
Packit Service fb6fa5
    }
Packit Service fb6fa5
  display->pointer_grabs =
Packit Service fb6fa5
    g_list_insert_before (display->pointer_grabs, l, info);
Packit Service fb6fa5
Packit Service fb6fa5
  /* Make sure the new grab end before next grab */
Packit Service fb6fa5
  if (l)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      other_info = l->data;
Packit Service fb6fa5
      info->serial_end = other_info->serial_start;
Packit Service fb6fa5
    }
Packit Service fb6fa5
  
Packit Service fb6fa5
  /* Find any previous grab and update its end time */
Packit Service fb6fa5
  l = g_list_find  (display->pointer_grabs, info);
Packit Service fb6fa5
  l = l->prev;
Packit Service fb6fa5
  if (l)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      other_info = l->data;
Packit Service fb6fa5
      other_info->serial_end = serial_start;
Packit Service fb6fa5
    }
Packit Service fb6fa5
Packit Service fb6fa5
  return info;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
free_pointer_grab (GdkPointerGrabInfo *info)
Packit Service fb6fa5
{
Packit Service fb6fa5
  g_object_unref (info->window);
Packit Service fb6fa5
  g_object_unref (info->native_window);
Packit Service fb6fa5
  g_free (info);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
/* _gdk_synthesize_crossing_events only works inside one toplevel.
Packit Service fb6fa5
   This function splits things into two calls if needed, converting the
Packit Service fb6fa5
   coordinates to the right toplevel */
Packit Service fb6fa5
static void
Packit Service fb6fa5
synthesize_crossing_events (GdkDisplay *display,
Packit Service fb6fa5
			    GdkWindow *src_window,
Packit Service fb6fa5
			    GdkWindow *dest_window,
Packit Service fb6fa5
			    GdkCrossingMode crossing_mode,
Packit Service fb6fa5
			    guint32 time,
Packit Service fb6fa5
			    gulong serial)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GdkWindow *src_toplevel, *dest_toplevel;
Packit Service fb6fa5
  GdkModifierType state;
Packit Service fb6fa5
  int x, y;
Packit Service fb6fa5
Packit Service fb6fa5
  /* We use the native crossing events if all native */
Packit Service fb6fa5
  if (_gdk_native_windows)
Packit Service fb6fa5
    return;
Packit Service fb6fa5
  
Packit Service fb6fa5
  if (src_window)
Packit Service fb6fa5
    src_toplevel = gdk_window_get_toplevel (src_window);
Packit Service fb6fa5
  else
Packit Service fb6fa5
    src_toplevel = NULL;
Packit Service fb6fa5
  if (dest_window)
Packit Service fb6fa5
    dest_toplevel = gdk_window_get_toplevel (dest_window);
Packit Service fb6fa5
  else
Packit Service fb6fa5
    dest_toplevel = NULL;
Packit Service fb6fa5
Packit Service fb6fa5
  if (src_toplevel == NULL && dest_toplevel == NULL)
Packit Service fb6fa5
    return;
Packit Service fb6fa5
  
Packit Service fb6fa5
  if (src_toplevel == NULL ||
Packit Service fb6fa5
      src_toplevel == dest_toplevel)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      /* Same toplevels */
Packit Service fb6fa5
      gdk_window_get_pointer (dest_toplevel,
Packit Service fb6fa5
			      &x, &y, &state);
Packit Service fb6fa5
      _gdk_synthesize_crossing_events (display,
Packit Service fb6fa5
				       src_window,
Packit Service fb6fa5
				       dest_window,
Packit Service fb6fa5
				       crossing_mode,
Packit Service fb6fa5
				       x, y, state,
Packit Service fb6fa5
				       time,
Packit Service fb6fa5
				       NULL,
Packit Service fb6fa5
				       serial, FALSE);
Packit Service fb6fa5
    }
Packit Service fb6fa5
  else if (dest_toplevel == NULL)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      gdk_window_get_pointer (src_toplevel,
Packit Service fb6fa5
			      &x, &y, &state);
Packit Service fb6fa5
      _gdk_synthesize_crossing_events (display,
Packit Service fb6fa5
				       src_window,
Packit Service fb6fa5
				       NULL,
Packit Service fb6fa5
				       crossing_mode,
Packit Service fb6fa5
				       x, y, state,
Packit Service fb6fa5
				       time,
Packit Service fb6fa5
				       NULL,
Packit Service fb6fa5
				       serial, FALSE);
Packit Service fb6fa5
    }
Packit Service fb6fa5
  else
Packit Service fb6fa5
    {
Packit Service fb6fa5
      /* Different toplevels */
Packit Service fb6fa5
      gdk_window_get_pointer (src_toplevel,
Packit Service fb6fa5
			      &x, &y, &state);
Packit Service fb6fa5
      _gdk_synthesize_crossing_events (display,
Packit Service fb6fa5
				       src_window,
Packit Service fb6fa5
				       NULL,
Packit Service fb6fa5
				       crossing_mode,
Packit Service fb6fa5
				       x, y, state,
Packit Service fb6fa5
				       time,
Packit Service fb6fa5
				       NULL,
Packit Service fb6fa5
				       serial, FALSE);
Packit Service fb6fa5
      gdk_window_get_pointer (dest_toplevel,
Packit Service fb6fa5
			      &x, &y, &state);
Packit Service fb6fa5
      _gdk_synthesize_crossing_events (display,
Packit Service fb6fa5
				       NULL,
Packit Service fb6fa5
				       dest_window,
Packit Service fb6fa5
				       crossing_mode,
Packit Service fb6fa5
				       x, y, state,
Packit Service fb6fa5
				       time,
Packit Service fb6fa5
				       NULL,
Packit Service fb6fa5
				       serial, FALSE);
Packit Service fb6fa5
    }
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static GdkWindow *
Packit Service fb6fa5
get_current_toplevel (GdkDisplay *display,
Packit Service fb6fa5
		      int *x_out, int *y_out,
Packit Service fb6fa5
		      GdkModifierType *state_out)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GdkWindow *pointer_window;
Packit Service fb6fa5
  int x, y;
Packit Service fb6fa5
  GdkModifierType state;
Packit Service fb6fa5
Packit Service fb6fa5
  pointer_window = _gdk_windowing_window_at_pointer (display,  &x, &y, &state, TRUE);
Packit Service fb6fa5
  if (pointer_window != NULL &&
Packit Service fb6fa5
      (GDK_WINDOW_DESTROYED (pointer_window) ||
Packit Service fb6fa5
       GDK_WINDOW_TYPE (pointer_window) == GDK_WINDOW_ROOT ||
Packit Service fb6fa5
       GDK_WINDOW_TYPE (pointer_window) == GDK_WINDOW_FOREIGN))
Packit Service fb6fa5
    pointer_window = NULL;
Packit Service fb6fa5
Packit Service fb6fa5
  *x_out = x;
Packit Service fb6fa5
  *y_out = y;
Packit Service fb6fa5
  *state_out = state;
Packit Service fb6fa5
  return pointer_window;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static void
Packit Service fb6fa5
switch_to_pointer_grab (GdkDisplay *display,
Packit Service fb6fa5
			GdkPointerGrabInfo *grab,
Packit Service fb6fa5
			GdkPointerGrabInfo *last_grab,
Packit Service fb6fa5
			guint32 time,
Packit Service fb6fa5
			gulong serial)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GdkWindow *src_window, *pointer_window, *new_toplevel;
Packit Service fb6fa5
  GList *old_grabs;
Packit Service fb6fa5
  GdkModifierType state;
Packit Service fb6fa5
  int x, y;
Packit Service fb6fa5
Packit Service fb6fa5
  /* Temporarily unset pointer to make sure we send the crossing events below */
Packit Service fb6fa5
  old_grabs = display->pointer_grabs;
Packit Service fb6fa5
  display->pointer_grabs = NULL;
Packit Service fb6fa5
  
Packit Service fb6fa5
  if (grab)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      /* New grab is in effect */
Packit Service fb6fa5
      
Packit Service fb6fa5
      /* We need to generate crossing events for the grab.
Packit Service fb6fa5
       * However, there are never any crossing events for implicit grabs
Packit Service fb6fa5
       * TODO: ... Actually, this could happen if the pointer window
Packit Service fb6fa5
       *           doesn't have button mask so a parent gets the event... 
Packit Service fb6fa5
       */
Packit Service fb6fa5
      if (!grab->implicit)
Packit Service fb6fa5
	{
Packit Service fb6fa5
	  /* We send GRAB crossing events from the window under the pointer to the
Packit Service fb6fa5
	     grab window. Except if there is an old grab then we start from that */
Packit Service fb6fa5
	  if (last_grab)
Packit Service fb6fa5
	    src_window = last_grab->window;
Packit Service fb6fa5
	  else
Packit Service fb6fa5
	    src_window = display->pointer_info.window_under_pointer;
Packit Service fb6fa5
	  
Packit Service fb6fa5
	  if (src_window != grab->window)
Packit Service fb6fa5
	    {
Packit Service fb6fa5
	      synthesize_crossing_events (display,
Packit Service fb6fa5
					  src_window, grab->window,
Packit Service fb6fa5
					  GDK_CROSSING_GRAB, time, serial);
Packit Service fb6fa5
	    }
Packit Service fb6fa5
Packit Service fb6fa5
	  /* !owner_event Grabbing a window that we're not inside, current status is
Packit Service fb6fa5
	     now NULL (i.e. outside grabbed window) */
Packit Service fb6fa5
	  if (!grab->owner_events && display->pointer_info.window_under_pointer != grab->window)
Packit Service fb6fa5
	    _gdk_display_set_window_under_pointer (display, NULL);
Packit Service fb6fa5
	}
Packit Service fb6fa5
Packit Service fb6fa5
      grab->activated = TRUE;
Packit Service fb6fa5
    }
Packit Service fb6fa5
Packit Service fb6fa5
  if (last_grab)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      new_toplevel = NULL;
Packit Service fb6fa5
Packit Service fb6fa5
      if (grab == NULL /* ungrab */ ||
Packit Service fb6fa5
	  (!last_grab->owner_events && grab->owner_events) /* switched to owner_events */ )
Packit Service fb6fa5
	{
Packit Service fb6fa5
	  /* We force check what window we're in, and update the toplevel_under_pointer info,
Packit Service fb6fa5
	   * as that won't get told of this change with toplevel enter events.
Packit Service fb6fa5
	   */
Packit Service fb6fa5
	  if (display->pointer_info.toplevel_under_pointer)
Packit Service fb6fa5
	    g_object_unref (display->pointer_info.toplevel_under_pointer);
Packit Service fb6fa5
	  display->pointer_info.toplevel_under_pointer = NULL;
Packit Service fb6fa5
Packit Service fb6fa5
	  new_toplevel = get_current_toplevel (display, &x, &y, &state);
Packit Service fb6fa5
	  if (new_toplevel)
Packit Service fb6fa5
	    {
Packit Service fb6fa5
	      /* w is now toplevel and x,y in toplevel coords */
Packit Service fb6fa5
	      display->pointer_info.toplevel_under_pointer = g_object_ref (new_toplevel);
Packit Service fb6fa5
	      display->pointer_info.toplevel_x = x;
Packit Service fb6fa5
	      display->pointer_info.toplevel_y = y;
Packit Service fb6fa5
	      display->pointer_info.state = state;
Packit Service fb6fa5
	    }
Packit Service fb6fa5
	}
Packit Service fb6fa5
Packit Service fb6fa5
      if (grab == NULL) /* Ungrabbed, send events */
Packit Service fb6fa5
	{
Packit Service fb6fa5
	  pointer_window = NULL;
Packit Service fb6fa5
	  if (new_toplevel)
Packit Service fb6fa5
	    {
Packit Service fb6fa5
	      /* Find (possibly virtual) child window */
Packit Service fb6fa5
	      pointer_window =
Packit Service fb6fa5
		_gdk_window_find_descendant_at (new_toplevel,
Packit Service fb6fa5
						x, y,
Packit Service fb6fa5
						NULL, NULL);
Packit Service fb6fa5
	    }
Packit Service fb6fa5
	  
Packit Service fb6fa5
	  if (pointer_window != last_grab->window)
Packit Service fb6fa5
	    synthesize_crossing_events (display,
Packit Service fb6fa5
					last_grab->window, pointer_window,
Packit Service fb6fa5
					GDK_CROSSING_UNGRAB, time, serial);
Packit Service fb6fa5
	  
Packit Service fb6fa5
	  /* We're now ungrabbed, update the window_under_pointer */
Packit Service fb6fa5
	  _gdk_display_set_window_under_pointer (display, pointer_window);
Packit Service fb6fa5
	}
Packit Service fb6fa5
    }
Packit Service fb6fa5
  
Packit Service fb6fa5
  display->pointer_grabs = old_grabs;
Packit Service fb6fa5
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
void
Packit Service fb6fa5
_gdk_display_pointer_grab_update (GdkDisplay *display,
Packit Service fb6fa5
				  gulong current_serial)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GdkPointerGrabInfo *current_grab, *next_grab;
Packit Service fb6fa5
  guint32 time;
Packit Service fb6fa5
  
Packit Service fb6fa5
  time = display->last_event_time;
Packit Service fb6fa5
Packit Service fb6fa5
  while (display->pointer_grabs != NULL)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      current_grab = display->pointer_grabs->data;
Packit Service fb6fa5
Packit Service fb6fa5
      if (current_grab->serial_start > current_serial)
Packit Service fb6fa5
	return; /* Hasn't started yet */
Packit Service fb6fa5
      
Packit Service fb6fa5
      if (current_grab->serial_end > current_serial)
Packit Service fb6fa5
	{
Packit Service fb6fa5
	  /* This one hasn't ended yet.
Packit Service fb6fa5
	     its the currently active one or scheduled to be active */
Packit Service fb6fa5
Packit Service fb6fa5
	  if (!current_grab->activated)
Packit Service fb6fa5
	    switch_to_pointer_grab (display, current_grab, NULL, time, current_serial);
Packit Service fb6fa5
	  
Packit Service fb6fa5
	  break;
Packit Service fb6fa5
	}
Packit Service fb6fa5
Packit Service fb6fa5
Packit Service fb6fa5
      next_grab = NULL;
Packit Service fb6fa5
      if (display->pointer_grabs->next)
Packit Service fb6fa5
	{
Packit Service fb6fa5
	  /* This is the next active grab */
Packit Service fb6fa5
	  next_grab = display->pointer_grabs->next->data;
Packit Service fb6fa5
	  
Packit Service fb6fa5
	  if (next_grab->serial_start > current_serial)
Packit Service fb6fa5
	    next_grab = NULL; /* Actually its not yet active */
Packit Service fb6fa5
	}
Packit Service fb6fa5
Packit Service fb6fa5
      if ((next_grab == NULL && current_grab->implicit_ungrab) ||
Packit Service fb6fa5
	  (next_grab != NULL && current_grab->window != next_grab->window))
Packit Service fb6fa5
	generate_grab_broken_event (GDK_WINDOW (current_grab->window),
Packit Service fb6fa5
				    FALSE, current_grab->implicit,
Packit Service fb6fa5
				    next_grab? next_grab->window : NULL);
Packit Service fb6fa5
Packit Service fb6fa5
      /* Remove old grab */
Packit Service fb6fa5
      display->pointer_grabs =
Packit Service fb6fa5
	g_list_delete_link (display->pointer_grabs,
Packit Service fb6fa5
			    display->pointer_grabs);
Packit Service fb6fa5
      
Packit Service fb6fa5
      switch_to_pointer_grab (display,
Packit Service fb6fa5
			      next_grab, current_grab,
Packit Service fb6fa5
			      time, current_serial);
Packit Service fb6fa5
      
Packit Service fb6fa5
      free_pointer_grab (current_grab);
Packit Service fb6fa5
    }
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
static GList *
Packit Service fb6fa5
find_pointer_grab (GdkDisplay *display,
Packit Service fb6fa5
		   gulong serial)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GdkPointerGrabInfo *grab;
Packit Service fb6fa5
  GList *l;
Packit Service fb6fa5
Packit Service fb6fa5
  for (l = display->pointer_grabs; l != NULL; l = l->next)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      grab = l->data;
Packit Service fb6fa5
Packit Service fb6fa5
      if (serial >= grab->serial_start && serial < grab->serial_end)
Packit Service fb6fa5
	return l;
Packit Service fb6fa5
    }
Packit Service fb6fa5
  
Packit Service fb6fa5
  return NULL;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
Packit Service fb6fa5
Packit Service fb6fa5
GdkPointerGrabInfo *
Packit Service fb6fa5
_gdk_display_has_pointer_grab (GdkDisplay *display,
Packit Service fb6fa5
			       gulong serial)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GList *l;
Packit Service fb6fa5
Packit Service fb6fa5
  l = find_pointer_grab (display, serial);
Packit Service fb6fa5
  if (l)
Packit Service fb6fa5
    return l->data;
Packit Service fb6fa5
  
Packit Service fb6fa5
  return NULL;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
/* Returns true if last grab was ended
Packit Service fb6fa5
 * If if_child is non-NULL, end the grab only if the grabbed
Packit Service fb6fa5
 * window is the same as if_child or a descendant of it */
Packit Service fb6fa5
gboolean
Packit Service fb6fa5
_gdk_display_end_pointer_grab (GdkDisplay *display,
Packit Service fb6fa5
			       gulong serial,
Packit Service fb6fa5
			       GdkWindow *if_child,
Packit Service fb6fa5
			       gboolean implicit)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GdkPointerGrabInfo *grab;
Packit Service fb6fa5
  GList *l;
Packit Service fb6fa5
Packit Service fb6fa5
  l = find_pointer_grab (display, serial);
Packit Service fb6fa5
  
Packit Service fb6fa5
  if (l == NULL)
Packit Service fb6fa5
    return FALSE;
Packit Service fb6fa5
Packit Service fb6fa5
  grab = l->data;
Packit Service fb6fa5
  if (grab &&
Packit Service fb6fa5
      (if_child == NULL ||
Packit Service fb6fa5
       _gdk_window_event_parent_of (if_child, grab->window)))
Packit Service fb6fa5
    {
Packit Service fb6fa5
      grab->serial_end = serial;
Packit Service fb6fa5
      grab->implicit_ungrab = implicit;
Packit Service fb6fa5
      return l->next == NULL;
Packit Service fb6fa5
    }
Packit Service fb6fa5
  
Packit Service fb6fa5
  return FALSE;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
void
Packit Service fb6fa5
_gdk_display_set_has_keyboard_grab (GdkDisplay *display,
Packit Service fb6fa5
				    GdkWindow *window,
Packit Service fb6fa5
				    GdkWindow *native_window,
Packit Service fb6fa5
				    gboolean owner_events,
Packit Service fb6fa5
				    unsigned long serial,
Packit Service fb6fa5
				    guint32 time)
Packit Service fb6fa5
{
Packit Service fb6fa5
  if (display->keyboard_grab.window != NULL &&
Packit Service fb6fa5
      display->keyboard_grab.window != window)
Packit Service fb6fa5
    generate_grab_broken_event (display->keyboard_grab.window,
Packit Service fb6fa5
				TRUE, FALSE, window);
Packit Service fb6fa5
  
Packit Service fb6fa5
  display->keyboard_grab.window = window;
Packit Service fb6fa5
  display->keyboard_grab.native_window = native_window;
Packit Service fb6fa5
  display->keyboard_grab.owner_events = owner_events;
Packit Service fb6fa5
  display->keyboard_grab.serial = serial;
Packit Service fb6fa5
  display->keyboard_grab.time = time;      
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
void
Packit Service fb6fa5
_gdk_display_unset_has_keyboard_grab (GdkDisplay *display,
Packit Service fb6fa5
				      gboolean implicit)
Packit Service fb6fa5
{
Packit Service fb6fa5
  if (implicit)
Packit Service fb6fa5
    generate_grab_broken_event (display->keyboard_grab.window,
Packit Service fb6fa5
				TRUE, FALSE, NULL);
Packit Service fb6fa5
  display->keyboard_grab.window = NULL;  
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
/**
Packit Service fb6fa5
 * gdk_keyboard_grab_info_libgtk_only:
Packit Service fb6fa5
 * @display: the display for which to get the grab information
Packit Service fb6fa5
 * @grab_window: location to store current grab window
Packit Service fb6fa5
 * @owner_events: location to store boolean indicating whether
Packit Service fb6fa5
 *   the @owner_events flag to gdk_keyboard_grab() was %TRUE.
Packit Service fb6fa5
 * 
Packit Service fb6fa5
 * Determines information about the current keyboard grab.
Packit Service fb6fa5
 * This is not public API and must not be used by applications.
Packit Service fb6fa5
 * 
Packit Service fb6fa5
 * Return value: %TRUE if this application currently has the
Packit Service fb6fa5
 *  keyboard grabbed.
Packit Service fb6fa5
 **/
Packit Service fb6fa5
gboolean
Packit Service fb6fa5
gdk_keyboard_grab_info_libgtk_only (GdkDisplay *display,
Packit Service fb6fa5
				    GdkWindow **grab_window,
Packit Service fb6fa5
				    gboolean   *owner_events)
Packit Service fb6fa5
{
Packit Service fb6fa5
  g_return_val_if_fail (GDK_IS_DISPLAY (display), FALSE);
Packit Service fb6fa5
Packit Service fb6fa5
  if (display->keyboard_grab.window)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      if (grab_window)
Packit Service fb6fa5
        *grab_window = display->keyboard_grab.window;
Packit Service fb6fa5
      if (owner_events)
Packit Service fb6fa5
        *owner_events = display->keyboard_grab.owner_events;
Packit Service fb6fa5
Packit Service fb6fa5
      return TRUE;
Packit Service fb6fa5
    }
Packit Service fb6fa5
  else
Packit Service fb6fa5
    return FALSE;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
/**
Packit Service fb6fa5
 * gdk_pointer_grab_info_libgtk_only:
Packit Service fb6fa5
 * @display: the #GdkDisplay for which to get the grab information
Packit Service fb6fa5
 * @grab_window: location to store current grab window
Packit Service fb6fa5
 * @owner_events: location to store boolean indicating whether
Packit Service fb6fa5
 *   the @owner_events flag to gdk_pointer_grab() was %TRUE.
Packit Service fb6fa5
 * 
Packit Service fb6fa5
 * Determines information about the current pointer grab.
Packit Service fb6fa5
 * This is not public API and must not be used by applications.
Packit Service fb6fa5
 * 
Packit Service fb6fa5
 * Return value: %TRUE if this application currently has the
Packit Service fb6fa5
 *  pointer grabbed.
Packit Service fb6fa5
 **/
Packit Service fb6fa5
gboolean
Packit Service fb6fa5
gdk_pointer_grab_info_libgtk_only (GdkDisplay *display,
Packit Service fb6fa5
				   GdkWindow **grab_window,
Packit Service fb6fa5
				   gboolean   *owner_events)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GdkPointerGrabInfo *info;
Packit Service fb6fa5
  
Packit Service fb6fa5
  g_return_val_if_fail (GDK_IS_DISPLAY (display), FALSE);
Packit Service fb6fa5
Packit Service fb6fa5
  /* What we're interested in is the steady state (ie last grab),
Packit Service fb6fa5
     because we're interested e.g. if we grabbed so that we
Packit Service fb6fa5
     can ungrab, even if our grab is not active just yet. */
Packit Service fb6fa5
  info = _gdk_display_get_last_pointer_grab (display);
Packit Service fb6fa5
  
Packit Service fb6fa5
  if (info)
Packit Service fb6fa5
    {
Packit Service fb6fa5
      if (grab_window)
Packit Service fb6fa5
        *grab_window = info->window;
Packit Service fb6fa5
      if (owner_events)
Packit Service fb6fa5
        *owner_events = info->owner_events;
Packit Service fb6fa5
Packit Service fb6fa5
      return TRUE;
Packit Service fb6fa5
    }
Packit Service fb6fa5
  else
Packit Service fb6fa5
    return FALSE;
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
Packit Service fb6fa5
/**
Packit Service fb6fa5
 * gdk_display_pointer_is_grabbed:
Packit Service fb6fa5
 * @display: a #GdkDisplay
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Test if the pointer is grabbed.
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Returns: %TRUE if an active X pointer grab is in effect
Packit Service fb6fa5
 *
Packit Service fb6fa5
 * Since: 2.2
Packit Service fb6fa5
 */
Packit Service fb6fa5
gboolean
Packit Service fb6fa5
gdk_display_pointer_is_grabbed (GdkDisplay *display)
Packit Service fb6fa5
{
Packit Service fb6fa5
  GdkPointerGrabInfo *info;
Packit Service fb6fa5
  
Packit Service fb6fa5
  g_return_val_if_fail (GDK_IS_DISPLAY (display), TRUE);
Packit Service fb6fa5
Packit Service fb6fa5
  /* What we're interested in is the steady state (ie last grab),
Packit Service fb6fa5
     because we're interested e.g. if we grabbed so that we
Packit Service fb6fa5
     can ungrab, even if our grab is not active just yet. */
Packit Service fb6fa5
  info = _gdk_display_get_last_pointer_grab (display);
Packit Service fb6fa5
  
Packit Service fb6fa5
  return (info && !info->implicit);
Packit Service fb6fa5
}
Packit Service fb6fa5
Packit Service fb6fa5
#define __GDK_DISPLAY_C__
Packit Service fb6fa5
#include "gdkaliasdef.c"