2008-07-01 22:57:50 +00:00
|
|
|
|
/* GDK - The GIMP Drawing Kit
|
2002-04-25 22:29:14 +00:00
|
|
|
|
* gdkdisplay.c
|
|
|
|
|
*
|
|
|
|
|
* Copyright 2001 Sun Microsystems Inc.
|
|
|
|
|
*
|
|
|
|
|
* Erwann Chenede <erwann.chenede@sun.com>
|
|
|
|
|
*
|
|
|
|
|
* This library is free software; you can redistribute it and/or
|
|
|
|
|
* modify it under the terms of the GNU Library General Public
|
|
|
|
|
* License as published by the Free Software Foundation; either
|
|
|
|
|
* version 2 of the License, or (at your option) any later version.
|
|
|
|
|
*
|
|
|
|
|
* This library is distributed in the hope that it will be useful,
|
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
|
|
|
* Library General Public License for more details.
|
|
|
|
|
*
|
|
|
|
|
* You should have received a copy of the GNU Library General Public
|
2012-02-27 13:01:10 +00:00
|
|
|
|
* License along with this library. If not, see <http://www.gnu.org/licenses/>.
|
2002-04-25 22:29:14 +00:00
|
|
|
|
*/
|
|
|
|
|
|
2008-06-22 14:28:52 +00:00
|
|
|
|
#include "config.h"
|
2010-10-15 02:05:51 +00:00
|
|
|
|
|
2002-04-25 22:29:14 +00:00
|
|
|
|
#include "gdkdisplay.h"
|
2010-12-11 05:14:53 +00:00
|
|
|
|
#include "gdkdisplayprivate.h"
|
2010-10-15 02:05:51 +00:00
|
|
|
|
|
2016-10-28 21:38:16 +00:00
|
|
|
|
#include "gdkintl.h"
|
2014-11-07 13:40:22 +00:00
|
|
|
|
#include "gdk-private.h"
|
|
|
|
|
|
2014-05-29 03:55:53 +00:00
|
|
|
|
#include "gdkclipboardprivate.h"
|
2010-12-13 18:53:34 +00:00
|
|
|
|
#include "gdkdeviceprivate.h"
|
2013-04-10 21:11:52 +00:00
|
|
|
|
#include "gdkdisplaymanagerprivate.h"
|
2010-10-15 02:05:51 +00:00
|
|
|
|
#include "gdkevents.h"
|
2018-03-20 10:46:11 +00:00
|
|
|
|
#include "gdksurfaceimpl.h"
|
2002-04-25 22:29:14 +00:00
|
|
|
|
#include "gdkinternals.h"
|
2016-04-25 13:07:56 +00:00
|
|
|
|
#include "gdkmonitorprivate.h"
|
2010-07-09 00:34:45 +00:00
|
|
|
|
|
2013-07-03 09:52:58 +00:00
|
|
|
|
#include <math.h>
|
2010-10-15 02:05:51 +00:00
|
|
|
|
#include <glib.h>
|
2002-04-25 22:29:14 +00:00
|
|
|
|
|
2013-07-03 09:52:58 +00:00
|
|
|
|
/* for the use of round() */
|
|
|
|
|
#include "fallback-c89.c"
|
2010-11-15 02:37:21 +00:00
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* SECTION:gdkdisplay
|
2017-11-01 22:19:34 +00:00
|
|
|
|
* @Short_description: Controls a set of monitors and their associated input devices
|
2010-11-15 02:37:21 +00:00
|
|
|
|
* @Title: GdkDisplay
|
|
|
|
|
*
|
2017-12-26 19:05:00 +00:00
|
|
|
|
* GdkDisplay objects are the GDK representation of a workstation.
|
2014-02-02 06:07:39 +00:00
|
|
|
|
*
|
2017-12-26 19:05:00 +00:00
|
|
|
|
* Their purpose are two-fold:
|
|
|
|
|
* - To manage and provide information about input devices (pointers, keyboards, etc)
|
|
|
|
|
* - To manage and provide information about output devices (monitors, projectors, etc)
|
2011-02-09 06:32:24 +00:00
|
|
|
|
*
|
2017-11-23 21:23:41 +00:00
|
|
|
|
* Most of the input device handling has been factored out into separate #GdkSeat
|
|
|
|
|
* objects. Every display has a one or more seats, which can be accessed with
|
|
|
|
|
* gdk_display_get_default_seat() and gdk_display_list_seats().
|
|
|
|
|
*
|
|
|
|
|
* Output devices are represented by #GdkMonitor objects, which can be accessed
|
2017-12-26 19:05:00 +00:00
|
|
|
|
* with gdk_display_get_monitor() and similar APIs.
|
2010-11-15 02:37:21 +00:00
|
|
|
|
*/
|
|
|
|
|
|
2017-12-26 19:39:24 +00:00
|
|
|
|
/**
|
|
|
|
|
* GdkDisplay:
|
|
|
|
|
*
|
2017-12-26 19:05:00 +00:00
|
|
|
|
* The GdkDisplay struct contains only private fields and should not
|
2017-12-26 19:39:24 +00:00
|
|
|
|
* be accessed directly.
|
|
|
|
|
*/
|
2016-10-28 21:38:16 +00:00
|
|
|
|
enum
|
|
|
|
|
{
|
|
|
|
|
PROP_0,
|
|
|
|
|
PROP_COMPOSITED,
|
|
|
|
|
PROP_RGBA,
|
|
|
|
|
LAST_PROP
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
static GParamSpec *props[LAST_PROP] = { NULL, };
|
2010-11-15 02:37:21 +00:00
|
|
|
|
|
2002-08-01 23:43:13 +00:00
|
|
|
|
enum {
|
2010-05-25 22:38:44 +00:00
|
|
|
|
OPENED,
|
2002-08-01 23:43:13 +00:00
|
|
|
|
CLOSED,
|
2015-12-09 11:25:10 +00:00
|
|
|
|
SEAT_ADDED,
|
|
|
|
|
SEAT_REMOVED,
|
2016-04-01 03:10:37 +00:00
|
|
|
|
MONITOR_ADDED,
|
|
|
|
|
MONITOR_REMOVED,
|
2017-10-30 13:00:49 +00:00
|
|
|
|
SETTING_CHANGED,
|
2002-08-01 23:43:13 +00:00
|
|
|
|
LAST_SIGNAL
|
|
|
|
|
};
|
|
|
|
|
|
2010-05-25 22:38:44 +00:00
|
|
|
|
static void gdk_display_dispose (GObject *object);
|
|
|
|
|
static void gdk_display_finalize (GObject *object);
|
2016-05-01 17:18:55 +00:00
|
|
|
|
static void gdk_display_put_event_nocopy (GdkDisplay *display,
|
|
|
|
|
GdkEvent *event);
|
2010-05-25 22:38:44 +00:00
|
|
|
|
|
2002-10-07 19:42:49 +00:00
|
|
|
|
|
2010-12-09 06:08:05 +00:00
|
|
|
|
static GdkAppLaunchContext *gdk_display_real_get_app_launch_context (GdkDisplay *display);
|
2002-10-07 19:42:49 +00:00
|
|
|
|
|
2002-08-01 23:43:13 +00:00
|
|
|
|
static guint signals[LAST_SIGNAL] = { 0 };
|
|
|
|
|
|
2006-05-14 03:58:06 +00:00
|
|
|
|
G_DEFINE_TYPE (GdkDisplay, gdk_display, G_TYPE_OBJECT)
|
2002-04-25 22:29:14 +00:00
|
|
|
|
|
2016-10-28 21:38:16 +00:00
|
|
|
|
static void
|
|
|
|
|
gdk_display_get_property (GObject *object,
|
|
|
|
|
guint prop_id,
|
|
|
|
|
GValue *value,
|
|
|
|
|
GParamSpec *pspec)
|
|
|
|
|
{
|
|
|
|
|
GdkDisplay *display = GDK_DISPLAY (object);
|
|
|
|
|
|
|
|
|
|
switch (prop_id)
|
|
|
|
|
{
|
|
|
|
|
case PROP_COMPOSITED:
|
|
|
|
|
g_value_set_boolean (value, gdk_display_is_composited (display));
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
case PROP_RGBA:
|
|
|
|
|
g_value_set_boolean (value, gdk_display_is_rgba (display));
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
default:
|
|
|
|
|
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2013-04-09 11:32:03 +00:00
|
|
|
|
static void
|
|
|
|
|
gdk_display_real_make_default (GdkDisplay *display)
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
2013-04-17 21:53:42 +00:00
|
|
|
|
static void
|
|
|
|
|
gdk_display_real_opened (GdkDisplay *display)
|
|
|
|
|
{
|
2013-04-17 21:56:22 +00:00
|
|
|
|
_gdk_display_manager_add_display (gdk_display_manager_get (), display);
|
2013-04-17 21:53:42 +00:00
|
|
|
|
}
|
|
|
|
|
|
2014-10-28 04:47:58 +00:00
|
|
|
|
static void
|
|
|
|
|
gdk_display_real_event_data_copy (GdkDisplay *display,
|
|
|
|
|
const GdkEvent *src,
|
|
|
|
|
GdkEvent *dst)
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
|
gdk_display_real_event_data_free (GdkDisplay *display,
|
|
|
|
|
GdkEvent *dst)
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
2015-11-26 18:52:23 +00:00
|
|
|
|
static GdkSeat *
|
|
|
|
|
gdk_display_real_get_default_seat (GdkDisplay *display)
|
|
|
|
|
{
|
|
|
|
|
if (!display->seats)
|
|
|
|
|
return NULL;
|
|
|
|
|
|
|
|
|
|
return display->seats->data;
|
|
|
|
|
}
|
|
|
|
|
|
2016-09-03 16:33:30 +00:00
|
|
|
|
static GdkMonitor *
|
|
|
|
|
gdk_display_real_get_primary_monitor (GdkDisplay *display)
|
|
|
|
|
{
|
|
|
|
|
return gdk_display_get_monitor (display, 0);
|
|
|
|
|
}
|
|
|
|
|
|
2002-04-25 22:29:14 +00:00
|
|
|
|
static void
|
|
|
|
|
gdk_display_class_init (GdkDisplayClass *class)
|
|
|
|
|
{
|
|
|
|
|
GObjectClass *object_class = G_OBJECT_CLASS (class);
|
2010-05-25 22:38:44 +00:00
|
|
|
|
|
2002-04-25 22:29:14 +00:00
|
|
|
|
object_class->finalize = gdk_display_finalize;
|
Start implementing display/screen closing scheme; keep a flag for whether
Thu Aug 1 11:26:03 2002 Owen Taylor <otaylor@redhat.com>
* gdk/gdkdisplay.[ch] gdk/gdkscreen.[ch] gdkinternals.h:
Start implementing display/screen closing scheme; keep a
flag for whether displays and screens are closed,
call g_object_run_dispose(). Remove public gdk_screen_close().
* gdk/x11/gdkdisplay-x11.c gdk/x11/gdkscreen-x11.c: Add
dispose() methods; move appropriate parts of the finalize
there.
* gdk/x11/gdkcolor-x11.c gdk/x11/gdkimage-x11.c
gdk/x11/gdkmain-x11.c gdk/x11/gdkpango-x11.c
gdk/x11/gdkpixmap-x11.c gdk/x11/gdkproperty-x11.c
gdk/x11/gdkselection-x11.c gdk/x11/gdkwindow-x11.c:
Start of making everything correctly ignore operations
when a display has been closed.
* gdk/x11/gdkwindow-x11.c (gdk_window_get_decorations):
Handle decorations == NULL.
* gdk/x11/gdkcolor-x11.c (gdk_colormap_remove):
Remove unnecessary hash table creation.
* gdk/x11/gdkinput.c gdk/x11/gdkinput-x11.c gdk/win32/gdkinput.c
Fix up gdk_device_get_history - handle events, n_events == NULL,
etc.
* gdk/x11/gdkproperty-x11.c (gdk_property_get):
Handle failure better.
* gdk/x11/gdkselection-x11.c (gdk_selection_property_get):
Handle failure better, handle data == NULL, move docs
here, remove an excess round trip by asking for
all selection data at once.
* gdk/gdkselection.c gdk/win32/{x11,win32}/gdkselection-{x11,win32}.c
gdk/{x11,win32}/gdkmain-{x11,win32}.c gdk/gdkdisplay.c: Move
gdk_text_property_to_text_list(), gdk_string_to_compound_text(),
gdk_display_set_sm_client_id() to display-independent part of GDK.
* gdk/Makefile.am (gdk_c_sources): Sort gdkdisplay/screen.[ch]
into the right place.
2002-08-01 15:28:40 +00:00
|
|
|
|
object_class->dispose = gdk_display_dispose;
|
2016-10-28 21:38:16 +00:00
|
|
|
|
object_class->get_property = gdk_display_get_property;
|
2002-08-01 23:43:13 +00:00
|
|
|
|
|
2010-12-09 06:08:05 +00:00
|
|
|
|
class->get_app_launch_context = gdk_display_real_get_app_launch_context;
|
2018-03-20 11:05:26 +00:00
|
|
|
|
class->surface_type = GDK_TYPE_SURFACE;
|
2010-12-09 06:08:05 +00:00
|
|
|
|
|
2013-04-17 21:53:42 +00:00
|
|
|
|
class->opened = gdk_display_real_opened;
|
2013-04-09 11:32:03 +00:00
|
|
|
|
class->make_default = gdk_display_real_make_default;
|
2014-10-28 04:47:58 +00:00
|
|
|
|
class->event_data_copy = gdk_display_real_event_data_copy;
|
|
|
|
|
class->event_data_free = gdk_display_real_event_data_free;
|
2015-11-26 18:52:23 +00:00
|
|
|
|
class->get_default_seat = gdk_display_real_get_default_seat;
|
2013-04-09 11:32:03 +00:00
|
|
|
|
|
2016-09-03 16:33:30 +00:00
|
|
|
|
class->get_primary_monitor = gdk_display_real_get_primary_monitor;
|
|
|
|
|
|
2016-10-28 21:38:16 +00:00
|
|
|
|
/**
|
|
|
|
|
* GdkDisplay:composited:
|
|
|
|
|
*
|
|
|
|
|
* %TRUE if the display properly composits the alpha channel.
|
|
|
|
|
* See gdk_display_is_composited() for details.
|
|
|
|
|
*/
|
|
|
|
|
props[PROP_COMPOSITED] =
|
|
|
|
|
g_param_spec_boolean ("composited",
|
|
|
|
|
P_("Composited"),
|
|
|
|
|
P_("Composited"),
|
|
|
|
|
TRUE,
|
2017-11-18 02:38:08 +00:00
|
|
|
|
G_PARAM_READABLE | G_PARAM_STATIC_STRINGS);
|
2016-10-28 21:38:16 +00:00
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* GdkDisplay:rgba:
|
|
|
|
|
*
|
|
|
|
|
* %TRUE if the display supports an alpha channel. See gdk_display_is_rgba()
|
|
|
|
|
* for details.
|
|
|
|
|
*/
|
|
|
|
|
props[PROP_RGBA] =
|
|
|
|
|
g_param_spec_boolean ("rgba",
|
|
|
|
|
P_("RGBA"),
|
|
|
|
|
P_("RGBA"),
|
|
|
|
|
TRUE,
|
2017-11-18 02:38:08 +00:00
|
|
|
|
G_PARAM_READABLE | G_PARAM_STATIC_STRINGS);
|
2016-10-28 21:38:16 +00:00
|
|
|
|
|
|
|
|
|
g_object_class_install_properties (object_class, LAST_PROP, props);
|
|
|
|
|
|
2010-05-25 22:38:44 +00:00
|
|
|
|
/**
|
2010-05-25 23:27:42 +00:00
|
|
|
|
* GdkDisplay::opened:
|
2010-05-25 22:38:44 +00:00
|
|
|
|
* @display: the object on which the signal is emitted
|
|
|
|
|
*
|
2010-05-25 23:27:42 +00:00
|
|
|
|
* The ::opened signal is emitted when the connection to the windowing
|
|
|
|
|
* system for @display is opened.
|
2010-05-25 22:38:44 +00:00
|
|
|
|
*/
|
|
|
|
|
signals[OPENED] =
|
|
|
|
|
g_signal_new (g_intern_static_string ("opened"),
|
|
|
|
|
G_OBJECT_CLASS_TYPE (object_class),
|
|
|
|
|
G_SIGNAL_RUN_LAST,
|
2013-04-17 21:53:42 +00:00
|
|
|
|
G_STRUCT_OFFSET (GdkDisplayClass, opened),
|
|
|
|
|
NULL, NULL,
|
2010-05-25 22:38:44 +00:00
|
|
|
|
g_cclosure_marshal_VOID__VOID,
|
|
|
|
|
G_TYPE_NONE, 0);
|
|
|
|
|
|
2003-09-30 00:36:29 +00:00
|
|
|
|
/**
|
|
|
|
|
* GdkDisplay::closed:
|
|
|
|
|
* @display: the object on which the signal is emitted
|
|
|
|
|
* @is_error: %TRUE if the display was closed due to an error
|
|
|
|
|
*
|
|
|
|
|
* The ::closed signal is emitted when the connection to the windowing
|
|
|
|
|
* system for @display is closed.
|
|
|
|
|
*/
|
2002-08-01 23:43:13 +00:00
|
|
|
|
signals[CLOSED] =
|
2005-09-01 05:11:46 +00:00
|
|
|
|
g_signal_new (g_intern_static_string ("closed"),
|
2002-08-01 23:43:13 +00:00
|
|
|
|
G_OBJECT_CLASS_TYPE (object_class),
|
|
|
|
|
G_SIGNAL_RUN_LAST,
|
|
|
|
|
G_STRUCT_OFFSET (GdkDisplayClass, closed),
|
|
|
|
|
NULL, NULL,
|
2017-12-12 23:47:07 +00:00
|
|
|
|
g_cclosure_marshal_VOID__BOOLEAN,
|
2002-08-01 23:43:13 +00:00
|
|
|
|
G_TYPE_NONE,
|
|
|
|
|
1,
|
|
|
|
|
G_TYPE_BOOLEAN);
|
2015-12-09 11:25:10 +00:00
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* GdkDisplay::seat-added:
|
|
|
|
|
* @display: the object on which the signal is emitted
|
|
|
|
|
* @seat: the seat that was just added
|
|
|
|
|
*
|
|
|
|
|
* The ::seat-added signal is emitted whenever a new seat is made
|
|
|
|
|
* known to the windowing system.
|
|
|
|
|
*/
|
|
|
|
|
signals[SEAT_ADDED] =
|
|
|
|
|
g_signal_new (g_intern_static_string ("seat-added"),
|
|
|
|
|
G_OBJECT_CLASS_TYPE (object_class),
|
|
|
|
|
G_SIGNAL_RUN_LAST,
|
|
|
|
|
0, NULL, NULL,
|
|
|
|
|
g_cclosure_marshal_VOID__OBJECT,
|
|
|
|
|
G_TYPE_NONE, 1, GDK_TYPE_SEAT);
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* GdkDisplay::seat-removed:
|
|
|
|
|
* @display: the object on which the signal is emitted
|
2016-02-26 01:12:53 +00:00
|
|
|
|
* @seat: the seat that was just removed
|
2015-12-09 11:25:10 +00:00
|
|
|
|
*
|
|
|
|
|
* The ::seat-removed signal is emitted whenever a seat is removed
|
|
|
|
|
* by the windowing system.
|
|
|
|
|
*/
|
|
|
|
|
signals[SEAT_REMOVED] =
|
|
|
|
|
g_signal_new (g_intern_static_string ("seat-removed"),
|
|
|
|
|
G_OBJECT_CLASS_TYPE (object_class),
|
|
|
|
|
G_SIGNAL_RUN_LAST,
|
|
|
|
|
0, NULL, NULL,
|
|
|
|
|
g_cclosure_marshal_VOID__OBJECT,
|
|
|
|
|
G_TYPE_NONE, 1, GDK_TYPE_SEAT);
|
2016-04-01 03:10:37 +00:00
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* GdkDisplay::monitor-added:
|
|
|
|
|
* @display: the objedct on which the signal is emitted
|
|
|
|
|
* @monitor: the monitor that was just added
|
|
|
|
|
*
|
|
|
|
|
* The ::monitor-added signal is emitted whenever a monitor is
|
|
|
|
|
* added.
|
|
|
|
|
*/
|
|
|
|
|
signals[MONITOR_ADDED] =
|
|
|
|
|
g_signal_new (g_intern_static_string ("monitor-added"),
|
|
|
|
|
G_OBJECT_CLASS_TYPE (object_class),
|
|
|
|
|
G_SIGNAL_RUN_LAST,
|
|
|
|
|
0, NULL, NULL,
|
|
|
|
|
g_cclosure_marshal_VOID__OBJECT,
|
|
|
|
|
G_TYPE_NONE, 1, GDK_TYPE_MONITOR);
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* GdkDisplay::monitor-removed:
|
|
|
|
|
* @display: the object on which the signal is emitted
|
|
|
|
|
* @monitor: the monitor that was just removed
|
|
|
|
|
*
|
|
|
|
|
* The ::monitor-removed signal is emitted whenever a monitor is
|
|
|
|
|
* removed.
|
|
|
|
|
*/
|
|
|
|
|
signals[MONITOR_REMOVED] =
|
|
|
|
|
g_signal_new (g_intern_static_string ("monitor-removed"),
|
|
|
|
|
G_OBJECT_CLASS_TYPE (object_class),
|
|
|
|
|
G_SIGNAL_RUN_LAST,
|
|
|
|
|
0, NULL, NULL,
|
|
|
|
|
g_cclosure_marshal_VOID__OBJECT,
|
|
|
|
|
G_TYPE_NONE, 1, GDK_TYPE_MONITOR);
|
2017-10-30 13:00:49 +00:00
|
|
|
|
|
2017-12-26 14:30:44 +00:00
|
|
|
|
/**
|
|
|
|
|
* GdkDisplay::setting-changed:
|
|
|
|
|
* @display: the object on which the signal is emitted
|
|
|
|
|
* @setting: the name of the setting that changed
|
|
|
|
|
*
|
|
|
|
|
* The ::setting-changed signal is emitted whenever a setting
|
|
|
|
|
* changes its value.
|
|
|
|
|
*/
|
2017-10-30 13:00:49 +00:00
|
|
|
|
signals[SETTING_CHANGED] =
|
|
|
|
|
g_signal_new (g_intern_static_string ("setting-changed"),
|
|
|
|
|
G_OBJECT_CLASS_TYPE (object_class),
|
|
|
|
|
G_SIGNAL_RUN_LAST,
|
|
|
|
|
0, NULL, NULL,
|
|
|
|
|
NULL,
|
|
|
|
|
G_TYPE_NONE, 1, G_TYPE_STRING | G_SIGNAL_TYPE_STATIC_SCOPE);
|
2002-04-25 22:29:14 +00:00
|
|
|
|
}
|
|
|
|
|
|
2010-05-25 22:38:44 +00:00
|
|
|
|
static void
|
2018-03-20 10:40:08 +00:00
|
|
|
|
free_pointer_info (GdkPointerSurfaceInfo *info)
|
2010-05-25 22:38:44 +00:00
|
|
|
|
{
|
2018-03-20 11:05:26 +00:00
|
|
|
|
g_clear_object (&info->surface_under_pointer);
|
2018-03-20 10:40:08 +00:00
|
|
|
|
g_slice_free (GdkPointerSurfaceInfo, info);
|
2010-05-25 22:38:44 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static void
|
|
|
|
|
free_device_grab (GdkDeviceGrabInfo *info)
|
|
|
|
|
{
|
2018-03-20 14:14:10 +00:00
|
|
|
|
g_object_unref (info->surface);
|
2018-03-20 11:05:26 +00:00
|
|
|
|
g_object_unref (info->native_surface);
|
2010-05-25 22:38:44 +00:00
|
|
|
|
g_free (info);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static gboolean
|
|
|
|
|
free_device_grabs_foreach (gpointer key,
|
|
|
|
|
gpointer value,
|
|
|
|
|
gpointer user_data)
|
|
|
|
|
{
|
|
|
|
|
GList *list = value;
|
|
|
|
|
|
2012-01-03 01:18:50 +00:00
|
|
|
|
g_list_free_full (list, (GDestroyNotify) free_device_grab);
|
2010-05-25 22:38:44 +00:00
|
|
|
|
|
|
|
|
|
return TRUE;
|
|
|
|
|
}
|
|
|
|
|
|
2002-04-25 22:29:14 +00:00
|
|
|
|
static void
|
|
|
|
|
gdk_display_init (GdkDisplay *display)
|
|
|
|
|
{
|
|
|
|
|
display->double_click_time = 250;
|
2003-12-16 00:56:48 +00:00
|
|
|
|
display->double_click_distance = 5;
|
2002-10-07 19:42:49 +00:00
|
|
|
|
|
2010-05-25 22:38:44 +00:00
|
|
|
|
display->device_grabs = g_hash_table_new (NULL, NULL);
|
|
|
|
|
|
|
|
|
|
display->pointers_info = g_hash_table_new_full (NULL, NULL, NULL,
|
|
|
|
|
(GDestroyNotify) free_pointer_info);
|
|
|
|
|
|
2018-01-11 13:53:57 +00:00
|
|
|
|
display->debug_flags = _gdk_debug_flags;
|
2016-10-29 16:06:24 +00:00
|
|
|
|
|
|
|
|
|
display->composited = TRUE;
|
|
|
|
|
display->rgba = TRUE;
|
2002-04-25 22:29:14 +00:00
|
|
|
|
}
|
|
|
|
|
|
Start implementing display/screen closing scheme; keep a flag for whether
Thu Aug 1 11:26:03 2002 Owen Taylor <otaylor@redhat.com>
* gdk/gdkdisplay.[ch] gdk/gdkscreen.[ch] gdkinternals.h:
Start implementing display/screen closing scheme; keep a
flag for whether displays and screens are closed,
call g_object_run_dispose(). Remove public gdk_screen_close().
* gdk/x11/gdkdisplay-x11.c gdk/x11/gdkscreen-x11.c: Add
dispose() methods; move appropriate parts of the finalize
there.
* gdk/x11/gdkcolor-x11.c gdk/x11/gdkimage-x11.c
gdk/x11/gdkmain-x11.c gdk/x11/gdkpango-x11.c
gdk/x11/gdkpixmap-x11.c gdk/x11/gdkproperty-x11.c
gdk/x11/gdkselection-x11.c gdk/x11/gdkwindow-x11.c:
Start of making everything correctly ignore operations
when a display has been closed.
* gdk/x11/gdkwindow-x11.c (gdk_window_get_decorations):
Handle decorations == NULL.
* gdk/x11/gdkcolor-x11.c (gdk_colormap_remove):
Remove unnecessary hash table creation.
* gdk/x11/gdkinput.c gdk/x11/gdkinput-x11.c gdk/win32/gdkinput.c
Fix up gdk_device_get_history - handle events, n_events == NULL,
etc.
* gdk/x11/gdkproperty-x11.c (gdk_property_get):
Handle failure better.
* gdk/x11/gdkselection-x11.c (gdk_selection_property_get):
Handle failure better, handle data == NULL, move docs
here, remove an excess round trip by asking for
all selection data at once.
* gdk/gdkselection.c gdk/win32/{x11,win32}/gdkselection-{x11,win32}.c
gdk/{x11,win32}/gdkmain-{x11,win32}.c gdk/gdkdisplay.c: Move
gdk_text_property_to_text_list(), gdk_string_to_compound_text(),
gdk_display_set_sm_client_id() to display-independent part of GDK.
* gdk/Makefile.am (gdk_c_sources): Sort gdkdisplay/screen.[ch]
into the right place.
2002-08-01 15:28:40 +00:00
|
|
|
|
static void
|
|
|
|
|
gdk_display_dispose (GObject *object)
|
|
|
|
|
{
|
2010-12-20 16:11:00 +00:00
|
|
|
|
GdkDisplay *display = GDK_DISPLAY (object);
|
2002-08-01 23:43:13 +00:00
|
|
|
|
|
2013-04-10 21:11:52 +00:00
|
|
|
|
_gdk_display_manager_remove_display (gdk_display_manager_get (), display);
|
|
|
|
|
|
2018-05-29 19:53:44 +00:00
|
|
|
|
g_list_free_full (display->queued_events, (GDestroyNotify) g_object_unref);
|
2002-08-01 23:43:13 +00:00
|
|
|
|
display->queued_events = NULL;
|
|
|
|
|
display->queued_tail = NULL;
|
|
|
|
|
|
2006-04-04 14:02:03 +00:00
|
|
|
|
G_OBJECT_CLASS (gdk_display_parent_class)->dispose (object);
|
Start implementing display/screen closing scheme; keep a flag for whether
Thu Aug 1 11:26:03 2002 Owen Taylor <otaylor@redhat.com>
* gdk/gdkdisplay.[ch] gdk/gdkscreen.[ch] gdkinternals.h:
Start implementing display/screen closing scheme; keep a
flag for whether displays and screens are closed,
call g_object_run_dispose(). Remove public gdk_screen_close().
* gdk/x11/gdkdisplay-x11.c gdk/x11/gdkscreen-x11.c: Add
dispose() methods; move appropriate parts of the finalize
there.
* gdk/x11/gdkcolor-x11.c gdk/x11/gdkimage-x11.c
gdk/x11/gdkmain-x11.c gdk/x11/gdkpango-x11.c
gdk/x11/gdkpixmap-x11.c gdk/x11/gdkproperty-x11.c
gdk/x11/gdkselection-x11.c gdk/x11/gdkwindow-x11.c:
Start of making everything correctly ignore operations
when a display has been closed.
* gdk/x11/gdkwindow-x11.c (gdk_window_get_decorations):
Handle decorations == NULL.
* gdk/x11/gdkcolor-x11.c (gdk_colormap_remove):
Remove unnecessary hash table creation.
* gdk/x11/gdkinput.c gdk/x11/gdkinput-x11.c gdk/win32/gdkinput.c
Fix up gdk_device_get_history - handle events, n_events == NULL,
etc.
* gdk/x11/gdkproperty-x11.c (gdk_property_get):
Handle failure better.
* gdk/x11/gdkselection-x11.c (gdk_selection_property_get):
Handle failure better, handle data == NULL, move docs
here, remove an excess round trip by asking for
all selection data at once.
* gdk/gdkselection.c gdk/win32/{x11,win32}/gdkselection-{x11,win32}.c
gdk/{x11,win32}/gdkmain-{x11,win32}.c gdk/gdkdisplay.c: Move
gdk_text_property_to_text_list(), gdk_string_to_compound_text(),
gdk_display_set_sm_client_id() to display-independent part of GDK.
* gdk/Makefile.am (gdk_c_sources): Sort gdkdisplay/screen.[ch]
into the right place.
2002-08-01 15:28:40 +00:00
|
|
|
|
}
|
|
|
|
|
|
2002-04-25 22:29:14 +00:00
|
|
|
|
static void
|
|
|
|
|
gdk_display_finalize (GObject *object)
|
|
|
|
|
{
|
2010-12-20 16:11:00 +00:00
|
|
|
|
GdkDisplay *display = GDK_DISPLAY (object);
|
2010-05-25 22:38:44 +00:00
|
|
|
|
|
|
|
|
|
g_hash_table_foreach_remove (display->device_grabs,
|
|
|
|
|
free_device_grabs_foreach,
|
|
|
|
|
NULL);
|
|
|
|
|
g_hash_table_destroy (display->device_grabs);
|
|
|
|
|
|
|
|
|
|
g_hash_table_destroy (display->pointers_info);
|
|
|
|
|
|
2016-09-08 09:18:16 +00:00
|
|
|
|
g_list_free_full (display->seats, g_object_unref);
|
2016-02-29 19:59:36 +00:00
|
|
|
|
|
2006-04-04 14:02:03 +00:00
|
|
|
|
G_OBJECT_CLASS (gdk_display_parent_class)->finalize (object);
|
2002-04-25 22:29:14 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* gdk_display_close:
|
|
|
|
|
* @display: a #GdkDisplay
|
|
|
|
|
*
|
2003-09-30 00:36:29 +00:00
|
|
|
|
* Closes the connection to the windowing system for the given display,
|
Start implementing display/screen closing scheme; keep a flag for whether
Thu Aug 1 11:26:03 2002 Owen Taylor <otaylor@redhat.com>
* gdk/gdkdisplay.[ch] gdk/gdkscreen.[ch] gdkinternals.h:
Start implementing display/screen closing scheme; keep a
flag for whether displays and screens are closed,
call g_object_run_dispose(). Remove public gdk_screen_close().
* gdk/x11/gdkdisplay-x11.c gdk/x11/gdkscreen-x11.c: Add
dispose() methods; move appropriate parts of the finalize
there.
* gdk/x11/gdkcolor-x11.c gdk/x11/gdkimage-x11.c
gdk/x11/gdkmain-x11.c gdk/x11/gdkpango-x11.c
gdk/x11/gdkpixmap-x11.c gdk/x11/gdkproperty-x11.c
gdk/x11/gdkselection-x11.c gdk/x11/gdkwindow-x11.c:
Start of making everything correctly ignore operations
when a display has been closed.
* gdk/x11/gdkwindow-x11.c (gdk_window_get_decorations):
Handle decorations == NULL.
* gdk/x11/gdkcolor-x11.c (gdk_colormap_remove):
Remove unnecessary hash table creation.
* gdk/x11/gdkinput.c gdk/x11/gdkinput-x11.c gdk/win32/gdkinput.c
Fix up gdk_device_get_history - handle events, n_events == NULL,
etc.
* gdk/x11/gdkproperty-x11.c (gdk_property_get):
Handle failure better.
* gdk/x11/gdkselection-x11.c (gdk_selection_property_get):
Handle failure better, handle data == NULL, move docs
here, remove an excess round trip by asking for
all selection data at once.
* gdk/gdkselection.c gdk/win32/{x11,win32}/gdkselection-{x11,win32}.c
gdk/{x11,win32}/gdkmain-{x11,win32}.c gdk/gdkdisplay.c: Move
gdk_text_property_to_text_list(), gdk_string_to_compound_text(),
gdk_display_set_sm_client_id() to display-independent part of GDK.
* gdk/Makefile.am (gdk_c_sources): Sort gdkdisplay/screen.[ch]
into the right place.
2002-08-01 15:28:40 +00:00
|
|
|
|
* and cleans up associated resources.
|
2002-04-25 22:29:14 +00:00
|
|
|
|
*/
|
|
|
|
|
void
|
|
|
|
|
gdk_display_close (GdkDisplay *display)
|
|
|
|
|
{
|
|
|
|
|
g_return_if_fail (GDK_IS_DISPLAY (display));
|
Start implementing display/screen closing scheme; keep a flag for whether
Thu Aug 1 11:26:03 2002 Owen Taylor <otaylor@redhat.com>
* gdk/gdkdisplay.[ch] gdk/gdkscreen.[ch] gdkinternals.h:
Start implementing display/screen closing scheme; keep a
flag for whether displays and screens are closed,
call g_object_run_dispose(). Remove public gdk_screen_close().
* gdk/x11/gdkdisplay-x11.c gdk/x11/gdkscreen-x11.c: Add
dispose() methods; move appropriate parts of the finalize
there.
* gdk/x11/gdkcolor-x11.c gdk/x11/gdkimage-x11.c
gdk/x11/gdkmain-x11.c gdk/x11/gdkpango-x11.c
gdk/x11/gdkpixmap-x11.c gdk/x11/gdkproperty-x11.c
gdk/x11/gdkselection-x11.c gdk/x11/gdkwindow-x11.c:
Start of making everything correctly ignore operations
when a display has been closed.
* gdk/x11/gdkwindow-x11.c (gdk_window_get_decorations):
Handle decorations == NULL.
* gdk/x11/gdkcolor-x11.c (gdk_colormap_remove):
Remove unnecessary hash table creation.
* gdk/x11/gdkinput.c gdk/x11/gdkinput-x11.c gdk/win32/gdkinput.c
Fix up gdk_device_get_history - handle events, n_events == NULL,
etc.
* gdk/x11/gdkproperty-x11.c (gdk_property_get):
Handle failure better.
* gdk/x11/gdkselection-x11.c (gdk_selection_property_get):
Handle failure better, handle data == NULL, move docs
here, remove an excess round trip by asking for
all selection data at once.
* gdk/gdkselection.c gdk/win32/{x11,win32}/gdkselection-{x11,win32}.c
gdk/{x11,win32}/gdkmain-{x11,win32}.c gdk/gdkdisplay.c: Move
gdk_text_property_to_text_list(), gdk_string_to_compound_text(),
gdk_display_set_sm_client_id() to display-independent part of GDK.
* gdk/Makefile.am (gdk_c_sources): Sort gdkdisplay/screen.[ch]
into the right place.
2002-08-01 15:28:40 +00:00
|
|
|
|
|
|
|
|
|
if (!display->closed)
|
|
|
|
|
{
|
|
|
|
|
display->closed = TRUE;
|
2002-08-01 23:43:13 +00:00
|
|
|
|
|
|
|
|
|
g_signal_emit (display, signals[CLOSED], 0, FALSE);
|
Start implementing display/screen closing scheme; keep a flag for whether
Thu Aug 1 11:26:03 2002 Owen Taylor <otaylor@redhat.com>
* gdk/gdkdisplay.[ch] gdk/gdkscreen.[ch] gdkinternals.h:
Start implementing display/screen closing scheme; keep a
flag for whether displays and screens are closed,
call g_object_run_dispose(). Remove public gdk_screen_close().
* gdk/x11/gdkdisplay-x11.c gdk/x11/gdkscreen-x11.c: Add
dispose() methods; move appropriate parts of the finalize
there.
* gdk/x11/gdkcolor-x11.c gdk/x11/gdkimage-x11.c
gdk/x11/gdkmain-x11.c gdk/x11/gdkpango-x11.c
gdk/x11/gdkpixmap-x11.c gdk/x11/gdkproperty-x11.c
gdk/x11/gdkselection-x11.c gdk/x11/gdkwindow-x11.c:
Start of making everything correctly ignore operations
when a display has been closed.
* gdk/x11/gdkwindow-x11.c (gdk_window_get_decorations):
Handle decorations == NULL.
* gdk/x11/gdkcolor-x11.c (gdk_colormap_remove):
Remove unnecessary hash table creation.
* gdk/x11/gdkinput.c gdk/x11/gdkinput-x11.c gdk/win32/gdkinput.c
Fix up gdk_device_get_history - handle events, n_events == NULL,
etc.
* gdk/x11/gdkproperty-x11.c (gdk_property_get):
Handle failure better.
* gdk/x11/gdkselection-x11.c (gdk_selection_property_get):
Handle failure better, handle data == NULL, move docs
here, remove an excess round trip by asking for
all selection data at once.
* gdk/gdkselection.c gdk/win32/{x11,win32}/gdkselection-{x11,win32}.c
gdk/{x11,win32}/gdkmain-{x11,win32}.c gdk/gdkdisplay.c: Move
gdk_text_property_to_text_list(), gdk_string_to_compound_text(),
gdk_display_set_sm_client_id() to display-independent part of GDK.
* gdk/Makefile.am (gdk_c_sources): Sort gdkdisplay/screen.[ch]
into the right place.
2002-08-01 15:28:40 +00:00
|
|
|
|
g_object_run_dispose (G_OBJECT (display));
|
|
|
|
|
|
2002-09-25 07:23:55 +00:00
|
|
|
|
g_object_unref (display);
|
Start implementing display/screen closing scheme; keep a flag for whether
Thu Aug 1 11:26:03 2002 Owen Taylor <otaylor@redhat.com>
* gdk/gdkdisplay.[ch] gdk/gdkscreen.[ch] gdkinternals.h:
Start implementing display/screen closing scheme; keep a
flag for whether displays and screens are closed,
call g_object_run_dispose(). Remove public gdk_screen_close().
* gdk/x11/gdkdisplay-x11.c gdk/x11/gdkscreen-x11.c: Add
dispose() methods; move appropriate parts of the finalize
there.
* gdk/x11/gdkcolor-x11.c gdk/x11/gdkimage-x11.c
gdk/x11/gdkmain-x11.c gdk/x11/gdkpango-x11.c
gdk/x11/gdkpixmap-x11.c gdk/x11/gdkproperty-x11.c
gdk/x11/gdkselection-x11.c gdk/x11/gdkwindow-x11.c:
Start of making everything correctly ignore operations
when a display has been closed.
* gdk/x11/gdkwindow-x11.c (gdk_window_get_decorations):
Handle decorations == NULL.
* gdk/x11/gdkcolor-x11.c (gdk_colormap_remove):
Remove unnecessary hash table creation.
* gdk/x11/gdkinput.c gdk/x11/gdkinput-x11.c gdk/win32/gdkinput.c
Fix up gdk_device_get_history - handle events, n_events == NULL,
etc.
* gdk/x11/gdkproperty-x11.c (gdk_property_get):
Handle failure better.
* gdk/x11/gdkselection-x11.c (gdk_selection_property_get):
Handle failure better, handle data == NULL, move docs
here, remove an excess round trip by asking for
all selection data at once.
* gdk/gdkselection.c gdk/win32/{x11,win32}/gdkselection-{x11,win32}.c
gdk/{x11,win32}/gdkmain-{x11,win32}.c gdk/gdkdisplay.c: Move
gdk_text_property_to_text_list(), gdk_string_to_compound_text(),
gdk_display_set_sm_client_id() to display-independent part of GDK.
* gdk/Makefile.am (gdk_c_sources): Sort gdkdisplay/screen.[ch]
into the right place.
2002-08-01 15:28:40 +00:00
|
|
|
|
}
|
2002-04-25 22:29:14 +00:00
|
|
|
|
}
|
|
|
|
|
|
2010-07-14 08:48:54 +00:00
|
|
|
|
/**
|
|
|
|
|
* gdk_display_is_closed:
|
|
|
|
|
* @display: a #GdkDisplay
|
|
|
|
|
*
|
2010-08-17 03:52:03 +00:00
|
|
|
|
* Finds out if the display has been closed.
|
|
|
|
|
*
|
|
|
|
|
* Returns: %TRUE if the display is closed.
|
2010-07-14 08:48:54 +00:00
|
|
|
|
*/
|
|
|
|
|
gboolean
|
|
|
|
|
gdk_display_is_closed (GdkDisplay *display)
|
|
|
|
|
{
|
|
|
|
|
g_return_val_if_fail (GDK_IS_DISPLAY (display), FALSE);
|
|
|
|
|
|
|
|
|
|
return display->closed;
|
|
|
|
|
}
|
|
|
|
|
|
2002-04-25 22:29:14 +00:00
|
|
|
|
/**
|
|
|
|
|
* gdk_display_get_event:
|
|
|
|
|
* @display: a #GdkDisplay
|
|
|
|
|
*
|
|
|
|
|
* Gets the next #GdkEvent to be processed for @display, fetching events from the
|
|
|
|
|
* windowing system if necessary.
|
|
|
|
|
*
|
2017-12-21 19:13:28 +00:00
|
|
|
|
* Returns: (nullable) (transfer full): the next #GdkEvent to be processed,
|
|
|
|
|
* or %NULL if no events are pending
|
|
|
|
|
*/
|
|
|
|
|
GdkEvent *
|
2002-04-25 22:29:14 +00:00
|
|
|
|
gdk_display_get_event (GdkDisplay *display)
|
|
|
|
|
{
|
|
|
|
|
g_return_val_if_fail (GDK_IS_DISPLAY (display), NULL);
|
2010-12-11 01:46:42 +00:00
|
|
|
|
|
2013-11-11 23:04:34 +00:00
|
|
|
|
if (display->event_pause_count == 0)
|
|
|
|
|
GDK_DISPLAY_GET_CLASS (display)->queue_events (display);
|
2012-10-07 15:47:49 +00:00
|
|
|
|
|
|
|
|
|
return _gdk_event_unqueue (display);
|
2002-04-25 22:29:14 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* gdk_display_peek_event:
|
2002-04-30 16:29:49 +00:00
|
|
|
|
* @display: a #GdkDisplay
|
2002-04-25 22:29:14 +00:00
|
|
|
|
*
|
2014-02-07 18:01:26 +00:00
|
|
|
|
* Gets a copy of the first #GdkEvent in the @display’s event queue, without
|
2002-04-25 22:29:14 +00:00
|
|
|
|
* removing the event from the queue. (Note that this function will
|
|
|
|
|
* not get more events from the windowing system. It only checks the events
|
|
|
|
|
* that have already been moved to the GDK event queue.)
|
|
|
|
|
*
|
2017-12-21 19:13:28 +00:00
|
|
|
|
* Returns: (nullable) (transfer full): the first #GdkEvent on the
|
|
|
|
|
* event queue
|
2002-04-25 22:29:14 +00:00
|
|
|
|
**/
|
2017-12-21 19:13:28 +00:00
|
|
|
|
GdkEvent *
|
2002-04-25 22:29:14 +00:00
|
|
|
|
gdk_display_peek_event (GdkDisplay *display)
|
|
|
|
|
{
|
|
|
|
|
GList *tmp_list;
|
|
|
|
|
|
|
|
|
|
g_return_val_if_fail (GDK_IS_DISPLAY (display), NULL);
|
|
|
|
|
|
|
|
|
|
tmp_list = _gdk_event_queue_find_first (display);
|
|
|
|
|
|
2017-12-21 19:13:28 +00:00
|
|
|
|
if (tmp_list != NULL)
|
2017-10-31 14:40:16 +00:00
|
|
|
|
return g_object_ref (tmp_list->data);
|
2017-12-21 19:13:28 +00:00
|
|
|
|
|
|
|
|
|
return NULL;
|
2002-04-25 22:29:14 +00:00
|
|
|
|
}
|
|
|
|
|
|
2016-05-01 17:18:55 +00:00
|
|
|
|
static void
|
|
|
|
|
gdk_display_put_event_nocopy (GdkDisplay *display,
|
|
|
|
|
GdkEvent *event)
|
|
|
|
|
{
|
|
|
|
|
_gdk_event_queue_append (display, event);
|
|
|
|
|
}
|
|
|
|
|
|
2002-04-25 22:29:14 +00:00
|
|
|
|
/**
|
|
|
|
|
* gdk_display_put_event:
|
|
|
|
|
* @display: a #GdkDisplay
|
|
|
|
|
* @event: a #GdkEvent.
|
|
|
|
|
*
|
|
|
|
|
* Appends a copy of the given event onto the front of the event
|
|
|
|
|
* queue for @display.
|
|
|
|
|
**/
|
|
|
|
|
void
|
2008-01-15 15:32:37 +00:00
|
|
|
|
gdk_display_put_event (GdkDisplay *display,
|
|
|
|
|
const GdkEvent *event)
|
2002-04-25 22:29:14 +00:00
|
|
|
|
{
|
|
|
|
|
g_return_if_fail (GDK_IS_DISPLAY (display));
|
|
|
|
|
g_return_if_fail (event != NULL);
|
|
|
|
|
|
2016-05-01 17:18:55 +00:00
|
|
|
|
gdk_display_put_event_nocopy (display, gdk_event_copy (event));
|
2002-04-25 22:29:14 +00:00
|
|
|
|
}
|
Changes multihead reorganizing code for win32 support, mostly from a patch
Wed Jun 5 18:34:47 2002 Owen Taylor <otaylor@redhat.com>
Changes multihead reorganizing code for win32 support,
mostly from a patch by Hans Breuer.
* gdk/gdkcolor.c gdk/x11/gdkcolor-x11.c gdk/gdkcursor.c
gdk/x11/gdkcursor-x11.c gdk/gdkevents.c gdk/x11/gdkevents-x11.c
gdk/gdkfont.c gdk/x11/gdkfont-x11.c gdk/gdkkeys.c
gdk/x11/gdkkeys-x11.c gdk/gdkimage.c gdk/x11/gdkimage-x11.c
gdk/gdkscreen.c gdk/x11/gdkmain-x11.c
gdk/gdkdisplay.c gdk/gdkevents-x11.c gdk/gdkpango.c
gdk/x11/gdkpango-x11.c gdk/gdkselection.c
gdk/x11/gdkselection-x11.c gdk/gdkwindow.c
gdk/x11/gdkwindow-x11.c gdk/gdkvisual.c gdk/x11/gdkvisual-x11.c:
Move port-independent singlehead wrapper functions into
port-independent part of GDK. (#80009)
* gdk/win32/gdkcolor-win32.c gdk/win32/gdkcursor-win32.c
gdk/win32/gdkevents-win32.c gdk/win32/gdkfont-win32.c
gdk/win32/gdkimage-win32.c gdk/win32/gdkkeys-win32.c
gdk/win32/gdkmain-win32.c gdk/win32/gdkproperty-win32.c
gdk/win32/gdkselection-win32.c gdk/win32/gkwindow-win32.c:
Turn singlehead functions into "multihead" functions that ignore
their GdkDisplay or GdkScreen arguments.
* gdk/win32/gdkdrawable-win32.c gdk/win32/gdkevents-win32.c
gdk/win32/gdkinput-win32.c gdk/win32/gdkprivate-win32.h:
Misc multihead-compatibility changes.
* gtk/gtk.def gdk/gdk.def: Update for multihead functions.
* gdk/gdkcolormap.h gdk/gdkvisual.h gdk/x11/gdkcolormap-x11.c
gdk/x11/gdkvisual-x11.c: Remove the screen fields
from the public parts of the colormap/visual structures, add accessors
instead.
* gdk/gdkpixbuf-render.c gdk/gdkpixmap.c gdk/gdkrgb.c
gdk/x11/gdkcolormap-x11.c gdk/x11/gdkimage-x11.c
gdk/x11/gdkimage-x11.c gdk/x11/gdkprivate-x11.h gtk/gtkgc.c
gtk/gtkstyle.c gtk/gtkwidget.c: Use accessors to get the screen
for colormaps, visuals; move the fields into the private
structures for the x11 backend.
* gdk/gdkdisplay.[ch] gdk/x11/gdkdisplay-x11.[ch]
gdk/gdkscreen.[ch] gdk/x11/gdkscreen-x11.c:
Remove virtualization of screen and display functions.
(#79990, patch from Erwann Chenede)
* gdk/win32/gdkdisplay-x11.c gdk/win32/gdkscreen-win32.c
gdk/win32/{Makefile.am, makefile.msc, makefile.mingw}:
New files containing stub implementations of Display,
Screen functions.
* gdk/x11/gdkscreen-x11.[ch] gdk/x11/gdkdisplay-x11.[ch]
gdk/x11/gdkx.h: Clean up function exports and what
headers they are in. (#79954)
* gdk/x11/gdkx.h: Fix macro that was referring to a non-existant
screen->screen_num. (In the patch for #79972, Erwann Chenede)
* gdk/gdkscreen.c gdk/gdkwindow.c gdk/x11/gdkinternals.h
gdk/x11/gdkscreen-x11.c: Fix gdk_screen_get_window_at_pointer()
to use window hooks. (#79972, patch partly from Erwann Chenede)
* gdk/x11/gdkdisplay-x11.c gdk/x11/gdkevents-x11.c: Fix
some warnings.
2002-06-06 00:26:42 +00:00
|
|
|
|
|
2008-07-18 13:03:42 +00:00
|
|
|
|
static void
|
2016-05-01 17:18:55 +00:00
|
|
|
|
generate_grab_broken_event (GdkDisplay *display,
|
2018-03-20 14:14:10 +00:00
|
|
|
|
GdkSurface *surface,
|
2016-05-01 17:18:55 +00:00
|
|
|
|
GdkDevice *device,
|
|
|
|
|
gboolean implicit,
|
2018-03-20 14:14:10 +00:00
|
|
|
|
GdkSurface *grab_surface)
|
2008-07-18 13:03:42 +00:00
|
|
|
|
{
|
2018-03-20 14:14:10 +00:00
|
|
|
|
g_return_if_fail (surface != NULL);
|
2008-07-18 13:03:42 +00:00
|
|
|
|
|
2018-03-20 14:14:10 +00:00
|
|
|
|
if (!GDK_SURFACE_DESTROYED (surface))
|
2008-07-18 13:03:42 +00:00
|
|
|
|
{
|
2010-05-25 22:38:44 +00:00
|
|
|
|
GdkEvent *event;
|
|
|
|
|
|
|
|
|
|
event = gdk_event_new (GDK_GRAB_BROKEN);
|
2018-03-20 14:14:10 +00:00
|
|
|
|
event->any.surface = g_object_ref (surface);
|
2017-10-11 13:35:29 +00:00
|
|
|
|
event->any.send_event = FALSE;
|
2010-05-25 22:38:44 +00:00
|
|
|
|
event->grab_broken.implicit = implicit;
|
2018-03-20 14:14:10 +00:00
|
|
|
|
event->grab_broken.grab_surface = grab_surface;
|
2010-05-25 22:38:44 +00:00
|
|
|
|
gdk_event_set_device (event, device);
|
2010-11-23 19:25:13 +00:00
|
|
|
|
event->grab_broken.keyboard = (gdk_device_get_source (device) == GDK_SOURCE_KEYBOARD) ? TRUE : FALSE;
|
2010-05-25 22:38:44 +00:00
|
|
|
|
|
2016-05-01 17:18:55 +00:00
|
|
|
|
gdk_display_put_event_nocopy (display, event);
|
2008-07-18 13:03:42 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2010-05-25 22:38:44 +00:00
|
|
|
|
GdkDeviceGrabInfo *
|
|
|
|
|
_gdk_display_get_last_device_grab (GdkDisplay *display,
|
|
|
|
|
GdkDevice *device)
|
2009-01-31 18:42:44 +00:00
|
|
|
|
{
|
|
|
|
|
GList *l;
|
|
|
|
|
|
2010-05-25 22:38:44 +00:00
|
|
|
|
l = g_hash_table_lookup (display->device_grabs, device);
|
2009-01-31 18:42:44 +00:00
|
|
|
|
|
2010-05-25 22:38:44 +00:00
|
|
|
|
if (l)
|
|
|
|
|
{
|
|
|
|
|
l = g_list_last (l);
|
|
|
|
|
return l->data;
|
|
|
|
|
}
|
2009-01-31 18:42:44 +00:00
|
|
|
|
|
2010-05-25 22:38:44 +00:00
|
|
|
|
return NULL;
|
|
|
|
|
}
|
2009-01-31 18:42:44 +00:00
|
|
|
|
|
2010-05-25 22:38:44 +00:00
|
|
|
|
GdkDeviceGrabInfo *
|
|
|
|
|
_gdk_display_add_device_grab (GdkDisplay *display,
|
|
|
|
|
GdkDevice *device,
|
2018-03-20 14:14:10 +00:00
|
|
|
|
GdkSurface *surface,
|
2018-03-20 11:05:26 +00:00
|
|
|
|
GdkSurface *native_surface,
|
2010-05-25 22:38:44 +00:00
|
|
|
|
GdkGrabOwnership grab_ownership,
|
|
|
|
|
gboolean owner_events,
|
|
|
|
|
GdkEventMask event_mask,
|
|
|
|
|
unsigned long serial_start,
|
|
|
|
|
guint32 time,
|
|
|
|
|
gboolean implicit)
|
2009-01-31 18:42:44 +00:00
|
|
|
|
{
|
2010-05-25 22:38:44 +00:00
|
|
|
|
GdkDeviceGrabInfo *info, *other_info;
|
|
|
|
|
GList *grabs, *l;
|
2009-01-31 18:42:44 +00:00
|
|
|
|
|
2010-05-25 22:38:44 +00:00
|
|
|
|
info = g_new0 (GdkDeviceGrabInfo, 1);
|
2009-01-31 18:42:44 +00:00
|
|
|
|
|
2018-03-20 14:14:10 +00:00
|
|
|
|
info->surface = g_object_ref (surface);
|
2018-03-20 11:05:26 +00:00
|
|
|
|
info->native_surface = g_object_ref (native_surface);
|
2009-01-31 18:42:44 +00:00
|
|
|
|
info->serial_start = serial_start;
|
|
|
|
|
info->serial_end = G_MAXULONG;
|
|
|
|
|
info->owner_events = owner_events;
|
|
|
|
|
info->event_mask = event_mask;
|
|
|
|
|
info->time = time;
|
|
|
|
|
info->implicit = implicit;
|
2010-05-25 22:38:44 +00:00
|
|
|
|
info->ownership = grab_ownership;
|
|
|
|
|
|
|
|
|
|
grabs = g_hash_table_lookup (display->device_grabs, device);
|
2009-01-31 18:42:44 +00:00
|
|
|
|
|
|
|
|
|
/* Find the first grab that has a larger start time (if any) and insert
|
|
|
|
|
* before that. I.E we insert after already existing grabs with same
|
|
|
|
|
* start time */
|
2010-05-25 22:38:44 +00:00
|
|
|
|
for (l = grabs; l != NULL; l = l->next)
|
2008-07-18 13:03:42 +00:00
|
|
|
|
{
|
2009-01-31 18:42:44 +00:00
|
|
|
|
other_info = l->data;
|
2010-05-25 22:38:44 +00:00
|
|
|
|
|
2009-01-31 18:42:44 +00:00
|
|
|
|
if (info->serial_start < other_info->serial_start)
|
|
|
|
|
break;
|
|
|
|
|
}
|
2010-05-25 22:38:44 +00:00
|
|
|
|
|
|
|
|
|
grabs = g_list_insert_before (grabs, l, info);
|
2009-01-31 18:42:44 +00:00
|
|
|
|
|
|
|
|
|
/* Make sure the new grab end before next grab */
|
|
|
|
|
if (l)
|
|
|
|
|
{
|
|
|
|
|
other_info = l->data;
|
|
|
|
|
info->serial_end = other_info->serial_start;
|
2008-07-18 13:03:42 +00:00
|
|
|
|
}
|
2010-05-25 22:38:44 +00:00
|
|
|
|
|
2009-01-31 18:42:44 +00:00
|
|
|
|
/* Find any previous grab and update its end time */
|
2010-05-25 22:38:44 +00:00
|
|
|
|
l = g_list_find (grabs, info);
|
2009-01-31 18:42:44 +00:00
|
|
|
|
l = l->prev;
|
|
|
|
|
if (l)
|
2008-07-18 13:03:42 +00:00
|
|
|
|
{
|
2009-01-31 18:42:44 +00:00
|
|
|
|
other_info = l->data;
|
|
|
|
|
other_info->serial_end = serial_start;
|
|
|
|
|
}
|
|
|
|
|
|
2010-05-25 22:38:44 +00:00
|
|
|
|
g_hash_table_insert (display->device_grabs, device, grabs);
|
2009-01-31 18:42:44 +00:00
|
|
|
|
|
2010-05-25 22:38:44 +00:00
|
|
|
|
return info;
|
2009-01-31 18:42:44 +00:00
|
|
|
|
}
|
|
|
|
|
|
2018-03-20 10:40:08 +00:00
|
|
|
|
static GdkSurface *
|
2010-05-25 22:38:44 +00:00
|
|
|
|
get_current_toplevel (GdkDisplay *display,
|
|
|
|
|
GdkDevice *device,
|
|
|
|
|
int *x_out,
|
|
|
|
|
int *y_out,
|
2009-07-10 15:30:42 +00:00
|
|
|
|
GdkModifierType *state_out)
|
|
|
|
|
{
|
2018-03-20 14:14:10 +00:00
|
|
|
|
GdkSurface *pointer_surface;
|
2013-07-03 09:52:58 +00:00
|
|
|
|
gdouble x, y;
|
2009-07-10 15:30:42 +00:00
|
|
|
|
GdkModifierType state;
|
|
|
|
|
|
2018-03-20 14:14:10 +00:00
|
|
|
|
pointer_surface = _gdk_device_surface_at_position (device, &x, &y, &state, TRUE);
|
2010-05-25 22:38:44 +00:00
|
|
|
|
|
2018-03-20 14:14:10 +00:00
|
|
|
|
if (pointer_surface != NULL &&
|
|
|
|
|
(GDK_SURFACE_DESTROYED (pointer_surface) ||
|
|
|
|
|
GDK_SURFACE_TYPE (pointer_surface) == GDK_SURFACE_FOREIGN))
|
|
|
|
|
pointer_surface = NULL;
|
2009-07-10 15:30:42 +00:00
|
|
|
|
|
2013-07-03 09:52:58 +00:00
|
|
|
|
*x_out = round (x);
|
|
|
|
|
*y_out = round (y);
|
2009-07-10 15:30:42 +00:00
|
|
|
|
*state_out = state;
|
2010-12-13 22:43:10 +00:00
|
|
|
|
|
2018-03-20 14:14:10 +00:00
|
|
|
|
return pointer_surface;
|
2009-07-10 15:30:42 +00:00
|
|
|
|
}
|
|
|
|
|
|
2009-01-31 18:42:44 +00:00
|
|
|
|
static void
|
2010-05-25 22:38:44 +00:00
|
|
|
|
switch_to_pointer_grab (GdkDisplay *display,
|
|
|
|
|
GdkDevice *device,
|
2010-12-13 01:12:43 +00:00
|
|
|
|
GdkDevice *source_device,
|
2010-05-25 22:38:44 +00:00
|
|
|
|
GdkDeviceGrabInfo *grab,
|
|
|
|
|
GdkDeviceGrabInfo *last_grab,
|
|
|
|
|
guint32 time,
|
|
|
|
|
gulong serial)
|
2009-01-31 18:42:44 +00:00
|
|
|
|
{
|
2018-03-20 10:40:08 +00:00
|
|
|
|
GdkSurface *new_toplevel;
|
|
|
|
|
GdkPointerSurfaceInfo *info;
|
2009-01-31 18:42:44 +00:00
|
|
|
|
GList *old_grabs;
|
|
|
|
|
GdkModifierType state;
|
2011-01-24 01:32:50 +00:00
|
|
|
|
int x = 0, y = 0;
|
2009-01-31 18:42:44 +00:00
|
|
|
|
|
|
|
|
|
/* Temporarily unset pointer to make sure we send the crossing events below */
|
2010-05-25 22:38:44 +00:00
|
|
|
|
old_grabs = g_hash_table_lookup (display->device_grabs, device);
|
|
|
|
|
g_hash_table_steal (display->device_grabs, device);
|
|
|
|
|
info = _gdk_display_get_pointer_info (display, device);
|
|
|
|
|
|
2009-01-31 18:42:44 +00:00
|
|
|
|
if (grab)
|
|
|
|
|
{
|
|
|
|
|
/* New grab is in effect */
|
|
|
|
|
if (!grab->implicit)
|
2008-12-15 09:24:54 +00:00
|
|
|
|
{
|
2018-03-20 14:14:10 +00:00
|
|
|
|
/* !owner_event Grabbing a surface that we're not inside, current status is
|
|
|
|
|
now NULL (i.e. outside grabbed surface) */
|
|
|
|
|
if (!grab->owner_events && info->surface_under_pointer != grab->surface)
|
2018-03-20 11:05:26 +00:00
|
|
|
|
_gdk_display_set_surface_under_pointer (display, device, NULL);
|
2009-01-31 18:42:44 +00:00
|
|
|
|
}
|
2009-07-10 15:30:42 +00:00
|
|
|
|
|
2009-01-31 18:42:44 +00:00
|
|
|
|
grab->activated = TRUE;
|
|
|
|
|
}
|
2009-07-10 15:30:42 +00:00
|
|
|
|
|
|
|
|
|
if (last_grab)
|
2009-01-31 18:42:44 +00:00
|
|
|
|
{
|
2009-07-10 15:30:42 +00:00
|
|
|
|
new_toplevel = NULL;
|
|
|
|
|
|
|
|
|
|
if (grab == NULL /* ungrab */ ||
|
|
|
|
|
(!last_grab->owner_events && grab->owner_events) /* switched to owner_events */ )
|
|
|
|
|
{
|
2011-01-24 01:32:50 +00:00
|
|
|
|
/* Ungrabbed slave devices don't have a position by
|
|
|
|
|
* itself, rather depend on its master pointer, so
|
|
|
|
|
* it doesn't make sense to track any position for
|
|
|
|
|
* these after the grab
|
|
|
|
|
*/
|
|
|
|
|
if (grab || gdk_device_get_device_type (device) != GDK_DEVICE_TYPE_SLAVE)
|
|
|
|
|
new_toplevel = get_current_toplevel (display, device, &x, &y, &state);
|
|
|
|
|
|
2009-07-10 15:30:42 +00:00
|
|
|
|
if (new_toplevel)
|
|
|
|
|
{
|
|
|
|
|
/* w is now toplevel and x,y in toplevel coords */
|
2018-03-20 11:05:26 +00:00
|
|
|
|
_gdk_display_set_surface_under_pointer (display, device, new_toplevel);
|
2010-05-25 22:38:44 +00:00
|
|
|
|
info->toplevel_x = x;
|
|
|
|
|
info->toplevel_y = y;
|
|
|
|
|
info->state = state;
|
2009-07-10 15:30:42 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (grab == NULL) /* Ungrabbed, send events */
|
2009-01-31 18:42:44 +00:00
|
|
|
|
{
|
2018-03-20 11:05:26 +00:00
|
|
|
|
/* We're now ungrabbed, update the surface_under_pointer */
|
|
|
|
|
_gdk_display_set_surface_under_pointer (display, device, new_toplevel);
|
2009-07-10 15:30:42 +00:00
|
|
|
|
}
|
2008-07-18 13:03:42 +00:00
|
|
|
|
}
|
|
|
|
|
|
2010-05-25 22:38:44 +00:00
|
|
|
|
g_hash_table_insert (display->device_grabs, device, old_grabs);
|
2008-07-18 13:03:42 +00:00
|
|
|
|
}
|
|
|
|
|
|
2016-02-28 15:22:31 +00:00
|
|
|
|
void
|
|
|
|
|
_gdk_display_update_last_event (GdkDisplay *display,
|
|
|
|
|
const GdkEvent *event)
|
|
|
|
|
{
|
|
|
|
|
if (gdk_event_get_time (event) != GDK_CURRENT_TIME)
|
|
|
|
|
display->last_event_time = gdk_event_get_time (event);
|
|
|
|
|
}
|
|
|
|
|
|
2008-07-18 13:03:42 +00:00
|
|
|
|
void
|
2010-05-25 22:38:44 +00:00
|
|
|
|
_gdk_display_device_grab_update (GdkDisplay *display,
|
|
|
|
|
GdkDevice *device,
|
2010-12-13 01:12:43 +00:00
|
|
|
|
GdkDevice *source_device,
|
2010-05-25 22:38:44 +00:00
|
|
|
|
gulong current_serial)
|
2008-07-18 13:03:42 +00:00
|
|
|
|
{
|
2010-05-25 22:38:44 +00:00
|
|
|
|
GdkDeviceGrabInfo *current_grab, *next_grab;
|
|
|
|
|
GList *grabs;
|
2009-01-31 18:42:44 +00:00
|
|
|
|
guint32 time;
|
2010-05-25 22:38:44 +00:00
|
|
|
|
|
2009-01-31 18:42:44 +00:00
|
|
|
|
time = display->last_event_time;
|
2010-05-25 22:38:44 +00:00
|
|
|
|
grabs = g_hash_table_lookup (display->device_grabs, device);
|
2008-07-18 13:03:42 +00:00
|
|
|
|
|
2010-05-25 22:38:44 +00:00
|
|
|
|
while (grabs != NULL)
|
2009-01-31 18:42:44 +00:00
|
|
|
|
{
|
2010-05-25 22:38:44 +00:00
|
|
|
|
current_grab = grabs->data;
|
2008-12-15 12:38:41 +00:00
|
|
|
|
|
2009-01-31 18:42:44 +00:00
|
|
|
|
if (current_grab->serial_start > current_serial)
|
|
|
|
|
return; /* Hasn't started yet */
|
2010-05-25 22:38:44 +00:00
|
|
|
|
|
2009-09-28 13:26:19 +00:00
|
|
|
|
if (current_grab->serial_end > current_serial)
|
2009-01-31 18:42:44 +00:00
|
|
|
|
{
|
|
|
|
|
/* This one hasn't ended yet.
|
|
|
|
|
its the currently active one or scheduled to be active */
|
2008-07-18 13:03:42 +00:00
|
|
|
|
|
2009-01-31 18:42:44 +00:00
|
|
|
|
if (!current_grab->activated)
|
2010-05-25 22:38:44 +00:00
|
|
|
|
{
|
2010-11-23 19:25:13 +00:00
|
|
|
|
if (gdk_device_get_source (device) != GDK_SOURCE_KEYBOARD)
|
2010-12-13 01:12:43 +00:00
|
|
|
|
switch_to_pointer_grab (display, device, source_device, current_grab, NULL, time, current_serial);
|
2010-05-25 22:38:44 +00:00
|
|
|
|
}
|
|
|
|
|
|
2009-01-31 18:42:44 +00:00
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
next_grab = NULL;
|
2010-05-25 22:38:44 +00:00
|
|
|
|
if (grabs->next)
|
2008-12-15 09:24:54 +00:00
|
|
|
|
{
|
2009-01-31 18:42:44 +00:00
|
|
|
|
/* This is the next active grab */
|
2010-05-25 22:38:44 +00:00
|
|
|
|
next_grab = grabs->next->data;
|
|
|
|
|
|
2009-01-31 18:42:44 +00:00
|
|
|
|
if (next_grab->serial_start > current_serial)
|
|
|
|
|
next_grab = NULL; /* Actually its not yet active */
|
2008-12-15 09:24:54 +00:00
|
|
|
|
}
|
|
|
|
|
|
2009-08-27 11:11:04 +00:00
|
|
|
|
if ((next_grab == NULL && current_grab->implicit_ungrab) ||
|
2018-03-20 14:14:10 +00:00
|
|
|
|
(next_grab != NULL && current_grab->surface != next_grab->surface))
|
|
|
|
|
generate_grab_broken_event (display, GDK_SURFACE (current_grab->surface),
|
2010-05-25 22:38:44 +00:00
|
|
|
|
device,
|
2011-12-28 23:06:45 +00:00
|
|
|
|
current_grab->implicit,
|
2018-03-20 14:14:10 +00:00
|
|
|
|
next_grab? next_grab->surface : NULL);
|
2008-12-15 09:24:54 +00:00
|
|
|
|
|
2009-01-31 18:42:44 +00:00
|
|
|
|
/* Remove old grab */
|
2010-05-25 22:38:44 +00:00
|
|
|
|
grabs = g_list_delete_link (grabs, grabs);
|
|
|
|
|
g_hash_table_insert (display->device_grabs, device, grabs);
|
|
|
|
|
|
2010-11-23 19:25:13 +00:00
|
|
|
|
if (gdk_device_get_source (device) != GDK_SOURCE_KEYBOARD)
|
2010-12-13 01:12:43 +00:00
|
|
|
|
switch_to_pointer_grab (display, device, source_device,
|
2010-05-25 22:38:44 +00:00
|
|
|
|
next_grab, current_grab,
|
|
|
|
|
time, current_serial);
|
|
|
|
|
|
|
|
|
|
free_device_grab (current_grab);
|
2008-12-15 09:24:54 +00:00
|
|
|
|
}
|
2009-01-31 18:42:44 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static GList *
|
2010-05-25 22:38:44 +00:00
|
|
|
|
grab_list_find (GList *grabs,
|
|
|
|
|
gulong serial)
|
2009-01-31 18:42:44 +00:00
|
|
|
|
{
|
2010-05-25 22:38:44 +00:00
|
|
|
|
GdkDeviceGrabInfo *grab;
|
2009-01-31 18:42:44 +00:00
|
|
|
|
|
2010-05-25 22:38:44 +00:00
|
|
|
|
while (grabs)
|
2008-12-15 09:24:54 +00:00
|
|
|
|
{
|
2010-05-25 22:38:44 +00:00
|
|
|
|
grab = grabs->data;
|
2008-12-15 09:24:54 +00:00
|
|
|
|
|
2009-01-31 18:42:44 +00:00
|
|
|
|
if (serial >= grab->serial_start && serial < grab->serial_end)
|
2010-05-25 22:38:44 +00:00
|
|
|
|
return grabs;
|
|
|
|
|
|
|
|
|
|
grabs = grabs->next;
|
2008-07-18 13:03:42 +00:00
|
|
|
|
}
|
2010-05-25 22:38:44 +00:00
|
|
|
|
|
2009-01-31 18:42:44 +00:00
|
|
|
|
return NULL;
|
|
|
|
|
}
|
|
|
|
|
|
2010-05-25 22:38:44 +00:00
|
|
|
|
static GList *
|
|
|
|
|
find_device_grab (GdkDisplay *display,
|
|
|
|
|
GdkDevice *device,
|
|
|
|
|
gulong serial)
|
|
|
|
|
{
|
|
|
|
|
GList *l;
|
2008-12-15 09:24:54 +00:00
|
|
|
|
|
2010-05-25 22:38:44 +00:00
|
|
|
|
l = g_hash_table_lookup (display->device_grabs, device);
|
|
|
|
|
return grab_list_find (l, serial);
|
|
|
|
|
}
|
2009-01-31 18:42:44 +00:00
|
|
|
|
|
2010-05-25 22:38:44 +00:00
|
|
|
|
GdkDeviceGrabInfo *
|
|
|
|
|
_gdk_display_has_device_grab (GdkDisplay *display,
|
|
|
|
|
GdkDevice *device,
|
|
|
|
|
gulong serial)
|
2009-01-31 18:42:44 +00:00
|
|
|
|
{
|
|
|
|
|
GList *l;
|
|
|
|
|
|
2010-05-25 22:38:44 +00:00
|
|
|
|
l = find_device_grab (display, device, serial);
|
2009-01-31 18:42:44 +00:00
|
|
|
|
if (l)
|
|
|
|
|
return l->data;
|
2010-05-25 22:38:44 +00:00
|
|
|
|
|
2009-01-31 18:42:44 +00:00
|
|
|
|
return NULL;
|
|
|
|
|
}
|
|
|
|
|
|
2009-08-27 11:30:20 +00:00
|
|
|
|
/* Returns true if last grab was ended
|
|
|
|
|
* If if_child is non-NULL, end the grab only if the grabbed
|
2018-03-20 14:14:10 +00:00
|
|
|
|
* surface is the same as if_child or a descendant of it */
|
2009-01-31 18:42:44 +00:00
|
|
|
|
gboolean
|
2010-05-25 22:38:44 +00:00
|
|
|
|
_gdk_display_end_device_grab (GdkDisplay *display,
|
|
|
|
|
GdkDevice *device,
|
|
|
|
|
gulong serial,
|
2018-03-20 10:40:08 +00:00
|
|
|
|
GdkSurface *if_child,
|
2010-05-25 22:38:44 +00:00
|
|
|
|
gboolean implicit)
|
2009-01-31 18:42:44 +00:00
|
|
|
|
{
|
2010-05-25 22:38:44 +00:00
|
|
|
|
GdkDeviceGrabInfo *grab;
|
2009-01-31 18:42:44 +00:00
|
|
|
|
GList *l;
|
|
|
|
|
|
2010-05-25 22:38:44 +00:00
|
|
|
|
l = find_device_grab (display, device, serial);
|
|
|
|
|
|
2009-01-31 18:42:44 +00:00
|
|
|
|
if (l == NULL)
|
|
|
|
|
return FALSE;
|
|
|
|
|
|
|
|
|
|
grab = l->data;
|
|
|
|
|
if (grab &&
|
|
|
|
|
(if_child == NULL ||
|
2018-03-20 14:14:10 +00:00
|
|
|
|
_gdk_surface_event_parent_of (if_child, grab->surface)))
|
2009-01-31 18:42:44 +00:00
|
|
|
|
{
|
|
|
|
|
grab->serial_end = serial;
|
|
|
|
|
grab->implicit_ungrab = implicit;
|
|
|
|
|
return l->next == NULL;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return FALSE;
|
2009-01-23 14:23:19 +00:00
|
|
|
|
}
|
|
|
|
|
|
2010-05-25 22:38:44 +00:00
|
|
|
|
/* Returns TRUE if device events are not blocked by any grab */
|
|
|
|
|
gboolean
|
|
|
|
|
_gdk_display_check_grab_ownership (GdkDisplay *display,
|
|
|
|
|
GdkDevice *device,
|
|
|
|
|
gulong serial)
|
|
|
|
|
{
|
|
|
|
|
GHashTableIter iter;
|
|
|
|
|
gpointer key, value;
|
|
|
|
|
GdkGrabOwnership higher_ownership, device_ownership;
|
|
|
|
|
gboolean device_is_keyboard;
|
|
|
|
|
|
|
|
|
|
g_hash_table_iter_init (&iter, display->device_grabs);
|
|
|
|
|
higher_ownership = device_ownership = GDK_OWNERSHIP_NONE;
|
2010-11-23 19:25:13 +00:00
|
|
|
|
device_is_keyboard = (gdk_device_get_source (device) == GDK_SOURCE_KEYBOARD);
|
2010-05-25 22:38:44 +00:00
|
|
|
|
|
|
|
|
|
while (g_hash_table_iter_next (&iter, &key, &value))
|
|
|
|
|
{
|
|
|
|
|
GdkDeviceGrabInfo *grab;
|
|
|
|
|
GdkDevice *dev;
|
|
|
|
|
GList *grabs;
|
|
|
|
|
|
|
|
|
|
dev = key;
|
|
|
|
|
grabs = value;
|
|
|
|
|
grabs = grab_list_find (grabs, serial);
|
|
|
|
|
|
|
|
|
|
if (!grabs)
|
|
|
|
|
continue;
|
|
|
|
|
|
|
|
|
|
/* Discard device if it's not of the same type */
|
2010-11-23 19:25:13 +00:00
|
|
|
|
if ((device_is_keyboard && gdk_device_get_source (dev) != GDK_SOURCE_KEYBOARD) ||
|
|
|
|
|
(!device_is_keyboard && gdk_device_get_source (dev) == GDK_SOURCE_KEYBOARD))
|
2010-05-25 22:38:44 +00:00
|
|
|
|
continue;
|
|
|
|
|
|
|
|
|
|
grab = grabs->data;
|
|
|
|
|
|
|
|
|
|
if (dev == device)
|
|
|
|
|
device_ownership = grab->ownership;
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
if (grab->ownership > higher_ownership)
|
|
|
|
|
higher_ownership = grab->ownership;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (higher_ownership > device_ownership)
|
|
|
|
|
{
|
|
|
|
|
/* There's a higher priority ownership
|
|
|
|
|
* going on for other device(s)
|
|
|
|
|
*/
|
|
|
|
|
return FALSE;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return TRUE;
|
2009-01-23 14:23:19 +00:00
|
|
|
|
}
|
|
|
|
|
|
2018-03-20 10:40:08 +00:00
|
|
|
|
GdkPointerSurfaceInfo *
|
2010-05-25 22:38:44 +00:00
|
|
|
|
_gdk_display_get_pointer_info (GdkDisplay *display,
|
|
|
|
|
GdkDevice *device)
|
2009-01-23 14:23:19 +00:00
|
|
|
|
{
|
2018-03-20 10:40:08 +00:00
|
|
|
|
GdkPointerSurfaceInfo *info;
|
2010-05-25 22:38:44 +00:00
|
|
|
|
|
2011-12-06 19:29:22 +00:00
|
|
|
|
if (device && gdk_device_get_source (device) == GDK_SOURCE_KEYBOARD)
|
|
|
|
|
device = gdk_device_get_associated_device (device);
|
|
|
|
|
|
2010-05-25 22:38:44 +00:00
|
|
|
|
if (G_UNLIKELY (!device))
|
|
|
|
|
return NULL;
|
|
|
|
|
|
|
|
|
|
info = g_hash_table_lookup (display->pointers_info, device);
|
|
|
|
|
|
|
|
|
|
if (G_UNLIKELY (!info))
|
|
|
|
|
{
|
2018-03-20 10:40:08 +00:00
|
|
|
|
info = g_slice_new0 (GdkPointerSurfaceInfo);
|
2010-05-25 22:38:44 +00:00
|
|
|
|
g_hash_table_insert (display->pointers_info, device, info);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return info;
|
2008-07-18 13:03:42 +00:00
|
|
|
|
}
|
|
|
|
|
|
2010-05-25 22:38:44 +00:00
|
|
|
|
void
|
|
|
|
|
_gdk_display_pointer_info_foreach (GdkDisplay *display,
|
|
|
|
|
GdkDisplayPointerInfoForeach func,
|
|
|
|
|
gpointer user_data)
|
2009-01-23 14:23:19 +00:00
|
|
|
|
{
|
2010-05-25 22:38:44 +00:00
|
|
|
|
GHashTableIter iter;
|
|
|
|
|
gpointer key, value;
|
2009-01-23 14:23:19 +00:00
|
|
|
|
|
2010-05-25 22:38:44 +00:00
|
|
|
|
g_hash_table_iter_init (&iter, display->pointers_info);
|
|
|
|
|
|
|
|
|
|
while (g_hash_table_iter_next (&iter, &key, &value))
|
2009-01-23 14:23:19 +00:00
|
|
|
|
{
|
2018-03-20 10:40:08 +00:00
|
|
|
|
GdkPointerSurfaceInfo *info = value;
|
2010-05-25 22:38:44 +00:00
|
|
|
|
GdkDevice *device = key;
|
2009-01-23 14:23:19 +00:00
|
|
|
|
|
2010-05-25 22:38:44 +00:00
|
|
|
|
(func) (display, device, info, user_data);
|
2009-01-23 14:23:19 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
2008-07-18 13:03:42 +00:00
|
|
|
|
|
2014-11-07 13:40:22 +00:00
|
|
|
|
/*< private >
|
|
|
|
|
* gdk_device_grab_info:
|
2010-05-25 22:38:44 +00:00
|
|
|
|
* @display: the display for which to get the grab information
|
|
|
|
|
* @device: device to get the grab information from
|
2018-03-20 14:14:10 +00:00
|
|
|
|
* @grab_surface: (out) (transfer none): location to store current grab surface
|
2010-12-07 18:03:55 +00:00
|
|
|
|
* @owner_events: (out): location to store boolean indicating whether
|
2016-10-24 08:13:14 +00:00
|
|
|
|
* the @owner_events flag to gdk_device_grab() was %TRUE.
|
2010-05-25 22:38:44 +00:00
|
|
|
|
*
|
|
|
|
|
* Determines information about the current keyboard grab.
|
2008-07-18 13:03:42 +00:00
|
|
|
|
* This is not public API and must not be used by applications.
|
2010-05-25 22:38:44 +00:00
|
|
|
|
*
|
2014-02-19 23:49:43 +00:00
|
|
|
|
* Returns: %TRUE if this application currently has the
|
2010-05-25 22:38:44 +00:00
|
|
|
|
* keyboard grabbed.
|
2014-11-07 13:40:22 +00:00
|
|
|
|
*/
|
2008-07-18 13:03:42 +00:00
|
|
|
|
gboolean
|
2014-11-07 13:40:22 +00:00
|
|
|
|
gdk_device_grab_info (GdkDisplay *display,
|
|
|
|
|
GdkDevice *device,
|
2018-03-20 14:14:10 +00:00
|
|
|
|
GdkSurface **grab_surface,
|
2014-11-07 13:40:22 +00:00
|
|
|
|
gboolean *owner_events)
|
2008-07-18 13:03:42 +00:00
|
|
|
|
{
|
2010-05-25 22:38:44 +00:00
|
|
|
|
GdkDeviceGrabInfo *info;
|
|
|
|
|
|
2008-07-18 13:03:42 +00:00
|
|
|
|
g_return_val_if_fail (GDK_IS_DISPLAY (display), FALSE);
|
2010-05-25 22:38:44 +00:00
|
|
|
|
g_return_val_if_fail (GDK_IS_DEVICE (device), FALSE);
|
|
|
|
|
|
|
|
|
|
info = _gdk_display_get_last_device_grab (display, device);
|
2008-07-18 13:03:42 +00:00
|
|
|
|
|
2009-01-31 18:42:44 +00:00
|
|
|
|
if (info)
|
2008-07-18 13:03:42 +00:00
|
|
|
|
{
|
2018-03-20 14:14:10 +00:00
|
|
|
|
if (grab_surface)
|
|
|
|
|
*grab_surface = info->surface;
|
2008-07-18 13:03:42 +00:00
|
|
|
|
if (owner_events)
|
2009-01-31 18:42:44 +00:00
|
|
|
|
*owner_events = info->owner_events;
|
2008-07-18 13:03:42 +00:00
|
|
|
|
|
|
|
|
|
return TRUE;
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
return FALSE;
|
|
|
|
|
}
|
|
|
|
|
|
2010-05-25 22:38:44 +00:00
|
|
|
|
/**
|
|
|
|
|
* gdk_display_device_is_grabbed:
|
|
|
|
|
* @display: a #GdkDisplay
|
|
|
|
|
* @device: a #GdkDevice
|
|
|
|
|
*
|
|
|
|
|
* Returns %TRUE if there is an ongoing grab on @device for @display.
|
|
|
|
|
*
|
|
|
|
|
* Returns: %TRUE if there is a grab in effect for @device.
|
|
|
|
|
**/
|
|
|
|
|
gboolean
|
|
|
|
|
gdk_display_device_is_grabbed (GdkDisplay *display,
|
|
|
|
|
GdkDevice *device)
|
|
|
|
|
{
|
|
|
|
|
GdkDeviceGrabInfo *info;
|
|
|
|
|
|
2008-07-18 13:03:42 +00:00
|
|
|
|
g_return_val_if_fail (GDK_IS_DISPLAY (display), TRUE);
|
2010-05-25 22:38:44 +00:00
|
|
|
|
g_return_val_if_fail (GDK_IS_DEVICE (device), TRUE);
|
2009-01-31 18:42:44 +00:00
|
|
|
|
|
2009-02-02 14:37:02 +00:00
|
|
|
|
/* What we're interested in is the steady state (ie last grab),
|
|
|
|
|
because we're interested e.g. if we grabbed so that we
|
|
|
|
|
can ungrab, even if our grab is not active just yet. */
|
2010-05-25 22:38:44 +00:00
|
|
|
|
info = _gdk_display_get_last_device_grab (display, device);
|
|
|
|
|
|
2009-01-31 18:42:44 +00:00
|
|
|
|
return (info && !info->implicit);
|
2008-07-18 13:03:42 +00:00
|
|
|
|
}
|
|
|
|
|
|
2010-12-05 21:37:03 +00:00
|
|
|
|
/**
|
|
|
|
|
* gdk_display_get_name:
|
|
|
|
|
* @display: a #GdkDisplay
|
|
|
|
|
*
|
|
|
|
|
* Gets the name of the display.
|
|
|
|
|
*
|
|
|
|
|
* Returns: a string representing the display name. This string is owned
|
|
|
|
|
* by GDK and should not be modified or freed.
|
|
|
|
|
*/
|
2011-06-06 18:05:18 +00:00
|
|
|
|
const gchar *
|
2010-12-05 21:37:03 +00:00
|
|
|
|
gdk_display_get_name (GdkDisplay *display)
|
|
|
|
|
{
|
2011-02-28 16:34:52 +00:00
|
|
|
|
g_return_val_if_fail (GDK_IS_DISPLAY (display), NULL);
|
|
|
|
|
|
|
|
|
|
return GDK_DISPLAY_GET_CLASS (display)->get_name (display);
|
2010-12-05 21:37:03 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* gdk_display_beep:
|
|
|
|
|
* @display: a #GdkDisplay
|
|
|
|
|
*
|
|
|
|
|
* Emits a short beep on @display
|
|
|
|
|
*/
|
|
|
|
|
void
|
|
|
|
|
gdk_display_beep (GdkDisplay *display)
|
|
|
|
|
{
|
2011-02-28 16:34:52 +00:00
|
|
|
|
g_return_if_fail (GDK_IS_DISPLAY (display));
|
|
|
|
|
|
|
|
|
|
GDK_DISPLAY_GET_CLASS (display)->beep (display);
|
2010-12-05 21:37:03 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* gdk_display_sync:
|
|
|
|
|
* @display: a #GdkDisplay
|
|
|
|
|
*
|
|
|
|
|
* Flushes any requests queued for the windowing system and waits until all
|
|
|
|
|
* requests have been handled. This is often used for making sure that the
|
|
|
|
|
* display is synchronized with the current state of the program. Calling
|
|
|
|
|
* gdk_display_sync() before gdk_error_trap_pop() makes sure that any errors
|
|
|
|
|
* generated from earlier requests are handled before the error trap is
|
|
|
|
|
* removed.
|
|
|
|
|
*
|
|
|
|
|
* This is most useful for X11. On windowing systems where requests are
|
|
|
|
|
* handled synchronously, this function will do nothing.
|
|
|
|
|
*/
|
|
|
|
|
void
|
|
|
|
|
gdk_display_sync (GdkDisplay *display)
|
|
|
|
|
{
|
2011-02-28 16:34:52 +00:00
|
|
|
|
g_return_if_fail (GDK_IS_DISPLAY (display));
|
|
|
|
|
|
|
|
|
|
GDK_DISPLAY_GET_CLASS (display)->sync (display);
|
2010-12-05 21:37:03 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* gdk_display_flush:
|
|
|
|
|
* @display: a #GdkDisplay
|
|
|
|
|
*
|
|
|
|
|
* Flushes any requests queued for the windowing system; this happens automatically
|
|
|
|
|
* when the main loop blocks waiting for new events, but if your application
|
|
|
|
|
* is drawing without returning control to the main loop, you may need
|
2014-01-17 15:25:30 +00:00
|
|
|
|
* to call this function explicitly. A common case where this function
|
2010-12-05 21:37:03 +00:00
|
|
|
|
* needs to be called is when an application is executing drawing commands
|
|
|
|
|
* from a thread other than the thread where the main loop is running.
|
|
|
|
|
*
|
|
|
|
|
* This is most useful for X11. On windowing systems where requests are
|
|
|
|
|
* handled synchronously, this function will do nothing.
|
|
|
|
|
*/
|
|
|
|
|
void
|
|
|
|
|
gdk_display_flush (GdkDisplay *display)
|
|
|
|
|
{
|
2011-02-28 16:34:52 +00:00
|
|
|
|
g_return_if_fail (GDK_IS_DISPLAY (display));
|
|
|
|
|
|
|
|
|
|
GDK_DISPLAY_GET_CLASS (display)->flush (display);
|
2010-12-05 21:37:03 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* gdk_display_get_default_group:
|
|
|
|
|
* @display: a #GdkDisplay
|
|
|
|
|
*
|
2018-03-20 14:14:10 +00:00
|
|
|
|
* Returns the default group leader surface for all toplevel surfaces
|
|
|
|
|
* on @display. This surface is implicitly created by GDK.
|
2018-03-20 10:40:08 +00:00
|
|
|
|
* See gdk_surface_set_group().
|
2010-12-05 21:37:03 +00:00
|
|
|
|
*
|
2018-03-20 14:14:10 +00:00
|
|
|
|
* Returns: (transfer none): The default group leader surface
|
2010-12-05 21:37:03 +00:00
|
|
|
|
* for @display
|
|
|
|
|
**/
|
2018-03-20 10:40:08 +00:00
|
|
|
|
GdkSurface *
|
2010-12-05 21:37:03 +00:00
|
|
|
|
gdk_display_get_default_group (GdkDisplay *display)
|
|
|
|
|
{
|
2011-02-28 16:34:52 +00:00
|
|
|
|
g_return_val_if_fail (GDK_IS_DISPLAY (display), NULL);
|
|
|
|
|
|
|
|
|
|
return GDK_DISPLAY_GET_CLASS (display)->get_default_group (display);
|
2010-12-05 21:37:03 +00:00
|
|
|
|
}
|
|
|
|
|
|
2014-05-29 03:55:53 +00:00
|
|
|
|
/**
|
|
|
|
|
* gdk_display_get_clipboard:
|
|
|
|
|
* @display: a #GdkDisplay
|
|
|
|
|
*
|
|
|
|
|
* Gets the clipboard used for copy/paste operations.
|
|
|
|
|
*
|
2017-12-21 19:13:28 +00:00
|
|
|
|
* Returns: (transfer none): the display's clipboard
|
|
|
|
|
*/
|
2014-05-29 03:55:53 +00:00
|
|
|
|
GdkClipboard *
|
|
|
|
|
gdk_display_get_clipboard (GdkDisplay *display)
|
|
|
|
|
{
|
|
|
|
|
g_return_val_if_fail (GDK_IS_DISPLAY (display), NULL);
|
|
|
|
|
|
|
|
|
|
if (display->clipboard == NULL)
|
|
|
|
|
display->clipboard = gdk_clipboard_new (display);
|
|
|
|
|
|
|
|
|
|
return display->clipboard;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* gdk_display_get_primary_clipboard:
|
|
|
|
|
* @display: a #GdkDisplay
|
|
|
|
|
*
|
|
|
|
|
* Gets the clipboard used for the primary selection. On backends where the
|
|
|
|
|
* primary clipboard is not supported natively, GDK emulates this clipboard
|
|
|
|
|
* locally.
|
|
|
|
|
*
|
2017-12-21 19:13:28 +00:00
|
|
|
|
* Returns: (transfer none): the primary clipboard
|
|
|
|
|
*/
|
2014-05-29 03:55:53 +00:00
|
|
|
|
GdkClipboard *
|
|
|
|
|
gdk_display_get_primary_clipboard (GdkDisplay *display)
|
|
|
|
|
{
|
|
|
|
|
g_return_val_if_fail (GDK_IS_DISPLAY (display), NULL);
|
|
|
|
|
|
|
|
|
|
if (display->primary_clipboard == NULL)
|
|
|
|
|
display->primary_clipboard = gdk_clipboard_new (display);
|
|
|
|
|
|
|
|
|
|
return display->primary_clipboard;
|
|
|
|
|
}
|
|
|
|
|
|
2010-12-05 21:37:03 +00:00
|
|
|
|
/**
|
|
|
|
|
* gdk_display_supports_shapes:
|
|
|
|
|
* @display: a #GdkDisplay
|
|
|
|
|
*
|
2018-03-20 10:40:08 +00:00
|
|
|
|
* Returns %TRUE if gdk_surface_shape_combine_mask() can
|
2010-12-05 21:37:03 +00:00
|
|
|
|
* be used to create shaped windows on @display.
|
|
|
|
|
*
|
|
|
|
|
* Returns: %TRUE if shaped windows are supported
|
|
|
|
|
*/
|
|
|
|
|
gboolean
|
|
|
|
|
gdk_display_supports_shapes (GdkDisplay *display)
|
|
|
|
|
{
|
2011-02-28 16:34:52 +00:00
|
|
|
|
g_return_val_if_fail (GDK_IS_DISPLAY (display), FALSE);
|
|
|
|
|
|
|
|
|
|
return GDK_DISPLAY_GET_CLASS (display)->supports_shapes (display);
|
2010-12-05 21:37:03 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* gdk_display_supports_input_shapes:
|
|
|
|
|
* @display: a #GdkDisplay
|
|
|
|
|
*
|
2018-03-20 10:40:08 +00:00
|
|
|
|
* Returns %TRUE if gdk_surface_input_shape_combine_mask() can
|
2018-03-20 14:14:10 +00:00
|
|
|
|
* be used to modify the input shape of surfaces on @display.
|
2010-12-05 21:37:03 +00:00
|
|
|
|
*
|
2018-03-20 14:14:10 +00:00
|
|
|
|
* Returns: %TRUE if surfaces with modified input shape are supported
|
2010-12-05 21:37:03 +00:00
|
|
|
|
*/
|
|
|
|
|
gboolean
|
|
|
|
|
gdk_display_supports_input_shapes (GdkDisplay *display)
|
|
|
|
|
{
|
2011-02-28 16:34:52 +00:00
|
|
|
|
g_return_val_if_fail (GDK_IS_DISPLAY (display), FALSE);
|
|
|
|
|
|
|
|
|
|
return GDK_DISPLAY_GET_CLASS (display)->supports_input_shapes (display);
|
2010-12-05 21:37:03 +00:00
|
|
|
|
}
|
|
|
|
|
|
2010-12-09 06:08:05 +00:00
|
|
|
|
static GdkAppLaunchContext *
|
|
|
|
|
gdk_display_real_get_app_launch_context (GdkDisplay *display)
|
|
|
|
|
{
|
|
|
|
|
GdkAppLaunchContext *ctx;
|
|
|
|
|
|
2010-12-24 22:37:00 +00:00
|
|
|
|
ctx = g_object_new (GDK_TYPE_APP_LAUNCH_CONTEXT,
|
|
|
|
|
"display", display,
|
|
|
|
|
NULL);
|
2010-12-09 06:08:05 +00:00
|
|
|
|
|
|
|
|
|
return ctx;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* gdk_display_get_app_launch_context:
|
|
|
|
|
* @display: a #GdkDisplay
|
|
|
|
|
*
|
|
|
|
|
* Returns a #GdkAppLaunchContext suitable for launching
|
|
|
|
|
* applications on the given display.
|
|
|
|
|
*
|
2011-01-18 09:01:17 +00:00
|
|
|
|
* Returns: (transfer full): a new #GdkAppLaunchContext for @display.
|
2010-12-09 06:08:05 +00:00
|
|
|
|
* Free with g_object_unref() when done
|
|
|
|
|
*/
|
|
|
|
|
GdkAppLaunchContext *
|
|
|
|
|
gdk_display_get_app_launch_context (GdkDisplay *display)
|
|
|
|
|
{
|
2011-02-28 16:34:52 +00:00
|
|
|
|
g_return_val_if_fail (GDK_IS_DISPLAY (display), NULL);
|
|
|
|
|
|
|
|
|
|
return GDK_DISPLAY_GET_CLASS (display)->get_app_launch_context (display);
|
2010-12-09 06:08:05 +00:00
|
|
|
|
}
|
2010-12-10 06:27:10 +00:00
|
|
|
|
|
2010-12-11 00:42:09 +00:00
|
|
|
|
/**
|
|
|
|
|
* gdk_display_open:
|
|
|
|
|
* @display_name: the name of the display to open
|
|
|
|
|
*
|
|
|
|
|
* Opens a display.
|
|
|
|
|
*
|
2014-05-08 19:55:50 +00:00
|
|
|
|
* Returns: (nullable) (transfer none): a #GdkDisplay, or %NULL if the
|
|
|
|
|
* display could not be opened
|
2010-12-11 00:42:09 +00:00
|
|
|
|
*/
|
|
|
|
|
GdkDisplay *
|
|
|
|
|
gdk_display_open (const gchar *display_name)
|
|
|
|
|
{
|
2011-02-28 16:34:52 +00:00
|
|
|
|
return gdk_display_manager_open_display (gdk_display_manager_get (),
|
|
|
|
|
display_name);
|
2010-12-11 00:42:09 +00:00
|
|
|
|
}
|
|
|
|
|
|
2010-12-25 05:02:39 +00:00
|
|
|
|
/**
|
|
|
|
|
* gdk_display_has_pending:
|
|
|
|
|
* @display: a #GdkDisplay
|
|
|
|
|
*
|
|
|
|
|
* Returns whether the display has events that are waiting
|
|
|
|
|
* to be processed.
|
|
|
|
|
*
|
|
|
|
|
* Returns: %TRUE if there are events ready to be processed.
|
|
|
|
|
*/
|
2010-12-11 00:42:09 +00:00
|
|
|
|
gboolean
|
|
|
|
|
gdk_display_has_pending (GdkDisplay *display)
|
|
|
|
|
{
|
2011-02-28 16:34:52 +00:00
|
|
|
|
g_return_val_if_fail (GDK_IS_DISPLAY (display), FALSE);
|
|
|
|
|
|
2010-12-11 00:42:09 +00:00
|
|
|
|
return GDK_DISPLAY_GET_CLASS (display)->has_pending (display);
|
|
|
|
|
}
|
2010-12-13 17:36:35 +00:00
|
|
|
|
|
2010-12-13 19:05:59 +00:00
|
|
|
|
gulong
|
|
|
|
|
_gdk_display_get_next_serial (GdkDisplay *display)
|
|
|
|
|
{
|
|
|
|
|
return GDK_DISPLAY_GET_CLASS (display)->get_next_serial (display);
|
|
|
|
|
}
|
2010-12-14 01:46:00 +00:00
|
|
|
|
|
2010-12-25 05:02:39 +00:00
|
|
|
|
/**
|
|
|
|
|
* gdk_display_notify_startup_complete:
|
|
|
|
|
* @display: a #GdkDisplay
|
|
|
|
|
* @startup_id: a startup-notification identifier, for which
|
|
|
|
|
* notification process should be completed
|
|
|
|
|
*
|
|
|
|
|
* Indicates to the GUI environment that the application has
|
|
|
|
|
* finished loading, using a given identifier.
|
|
|
|
|
*
|
|
|
|
|
* GTK+ will call this function automatically for #GtkWindow
|
|
|
|
|
* with custom startup-notification identifier unless
|
|
|
|
|
* gtk_window_set_auto_startup_notification() is called to
|
|
|
|
|
* disable that feature.
|
|
|
|
|
*/
|
2010-12-14 01:46:00 +00:00
|
|
|
|
void
|
|
|
|
|
gdk_display_notify_startup_complete (GdkDisplay *display,
|
|
|
|
|
const gchar *startup_id)
|
|
|
|
|
{
|
2011-02-28 16:34:52 +00:00
|
|
|
|
g_return_if_fail (GDK_IS_DISPLAY (display));
|
|
|
|
|
|
2010-12-14 01:46:00 +00:00
|
|
|
|
GDK_DISPLAY_GET_CLASS (display)->notify_startup_complete (display, startup_id);
|
|
|
|
|
}
|
2010-12-15 05:37:40 +00:00
|
|
|
|
|
2012-09-26 14:28:06 +00:00
|
|
|
|
void
|
2012-10-07 18:13:56 +00:00
|
|
|
|
_gdk_display_pause_events (GdkDisplay *display)
|
2012-09-26 14:28:06 +00:00
|
|
|
|
{
|
2012-10-07 18:13:56 +00:00
|
|
|
|
display->event_pause_count++;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
|
_gdk_display_unpause_events (GdkDisplay *display)
|
|
|
|
|
{
|
|
|
|
|
g_return_if_fail (display->event_pause_count > 0);
|
|
|
|
|
|
|
|
|
|
display->event_pause_count--;
|
2012-09-26 14:28:06 +00:00
|
|
|
|
}
|
|
|
|
|
|
2010-12-15 05:37:40 +00:00
|
|
|
|
void
|
|
|
|
|
_gdk_display_event_data_copy (GdkDisplay *display,
|
|
|
|
|
const GdkEvent *event,
|
|
|
|
|
GdkEvent *new_event)
|
|
|
|
|
{
|
|
|
|
|
GDK_DISPLAY_GET_CLASS (display)->event_data_copy (display, event, new_event);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
|
_gdk_display_event_data_free (GdkDisplay *display,
|
|
|
|
|
GdkEvent *event)
|
|
|
|
|
{
|
|
|
|
|
GDK_DISPLAY_GET_CLASS (display)->event_data_free (display, event);
|
|
|
|
|
}
|
2010-12-16 00:07:36 +00:00
|
|
|
|
|
|
|
|
|
void
|
2018-03-20 11:05:26 +00:00
|
|
|
|
_gdk_display_create_surface_impl (GdkDisplay *display,
|
2018-03-20 14:14:10 +00:00
|
|
|
|
GdkSurface *surface,
|
2018-03-20 10:40:08 +00:00
|
|
|
|
GdkSurface *real_parent,
|
2010-12-16 00:07:36 +00:00
|
|
|
|
GdkEventMask event_mask,
|
2018-03-20 10:40:08 +00:00
|
|
|
|
GdkSurfaceAttr *attributes)
|
2010-12-16 00:07:36 +00:00
|
|
|
|
{
|
2018-03-20 11:05:26 +00:00
|
|
|
|
GDK_DISPLAY_GET_CLASS (display)->create_surface_impl (display,
|
2018-03-20 14:14:10 +00:00
|
|
|
|
surface,
|
2010-12-16 00:07:36 +00:00
|
|
|
|
real_parent,
|
|
|
|
|
event_mask,
|
2016-11-07 00:33:43 +00:00
|
|
|
|
attributes);
|
2010-12-16 00:07:36 +00:00
|
|
|
|
}
|
2010-12-16 05:08:42 +00:00
|
|
|
|
|
2018-03-20 10:40:08 +00:00
|
|
|
|
GdkSurface *
|
2018-03-20 14:14:10 +00:00
|
|
|
|
_gdk_display_create_surface (GdkDisplay *display)
|
2010-12-21 02:06:59 +00:00
|
|
|
|
{
|
2018-03-20 11:05:26 +00:00
|
|
|
|
return g_object_new (GDK_DISPLAY_GET_CLASS (display)->surface_type,
|
2016-10-27 13:38:41 +00:00
|
|
|
|
"display", display,
|
|
|
|
|
NULL);
|
2010-12-21 02:06:59 +00:00
|
|
|
|
}
|
|
|
|
|
|
2017-12-15 11:53:13 +00:00
|
|
|
|
/**
|
|
|
|
|
* gdk_display_get_keymap:
|
|
|
|
|
* @display: the #GdkDisplay
|
|
|
|
|
*
|
|
|
|
|
* Returns the #GdkKeymap attached to @display.
|
|
|
|
|
*
|
|
|
|
|
* Returns: (transfer none): the #GdkKeymap attached to @display.
|
|
|
|
|
*/
|
|
|
|
|
GdkKeymap *
|
|
|
|
|
gdk_display_get_keymap (GdkDisplay *display)
|
|
|
|
|
{
|
|
|
|
|
g_return_val_if_fail (GDK_IS_DISPLAY (display), NULL);
|
|
|
|
|
|
|
|
|
|
return GDK_DISPLAY_GET_CLASS (display)->get_keymap (display);
|
|
|
|
|
}
|
|
|
|
|
|
2014-10-09 08:45:44 +00:00
|
|
|
|
/*< private >
|
|
|
|
|
* gdk_display_make_gl_context_current:
|
|
|
|
|
* @display: a #GdkDisplay
|
|
|
|
|
* @context: (optional): a #GdkGLContext, or %NULL
|
|
|
|
|
*
|
|
|
|
|
* Makes the given @context the current GL context, or unsets
|
|
|
|
|
* the current GL context if @context is %NULL.
|
|
|
|
|
*/
|
2014-10-30 10:46:09 +00:00
|
|
|
|
gboolean
|
2014-10-09 08:45:44 +00:00
|
|
|
|
gdk_display_make_gl_context_current (GdkDisplay *display,
|
|
|
|
|
GdkGLContext *context)
|
|
|
|
|
{
|
2014-10-30 10:46:09 +00:00
|
|
|
|
return GDK_DISPLAY_GET_CLASS (display)->make_gl_context_current (display, context);
|
2014-10-09 08:45:44 +00:00
|
|
|
|
}
|
2014-11-10 19:39:57 +00:00
|
|
|
|
|
2018-01-11 13:53:57 +00:00
|
|
|
|
GdkDebugFlags
|
|
|
|
|
gdk_display_get_debug_flags (GdkDisplay *display)
|
2014-11-10 19:39:57 +00:00
|
|
|
|
{
|
2018-01-12 00:48:27 +00:00
|
|
|
|
return display ? display->debug_flags : _gdk_debug_flags;
|
2014-11-10 19:39:57 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void
|
2018-01-11 13:53:57 +00:00
|
|
|
|
gdk_display_set_debug_flags (GdkDisplay *display,
|
|
|
|
|
GdkDebugFlags flags)
|
2014-11-10 19:39:57 +00:00
|
|
|
|
{
|
2018-01-11 13:53:57 +00:00
|
|
|
|
display->debug_flags = flags;
|
2014-11-10 19:39:57 +00:00
|
|
|
|
}
|
2014-11-10 20:23:14 +00:00
|
|
|
|
|
2016-10-28 21:38:16 +00:00
|
|
|
|
/**
|
|
|
|
|
* gdk_display_is_composited:
|
|
|
|
|
* @display: a #GdkDisplay
|
|
|
|
|
*
|
2018-03-20 14:14:10 +00:00
|
|
|
|
* Returns whether surfaces can reasonably be expected to have
|
2016-10-28 21:38:16 +00:00
|
|
|
|
* their alpha channel drawn correctly on the screen. Check
|
|
|
|
|
* gdk_display_is_rgba() for wether the display supports an
|
|
|
|
|
* alpha channel.
|
|
|
|
|
*
|
|
|
|
|
* On X11 this function returns whether a compositing manager is
|
|
|
|
|
* compositing on @display.
|
|
|
|
|
*
|
|
|
|
|
* On modern displays, this value is always %TRUE.
|
|
|
|
|
*
|
2018-03-20 14:14:10 +00:00
|
|
|
|
* Returns: Whether surfaces with RGBA visuals can reasonably be
|
2016-10-28 21:38:16 +00:00
|
|
|
|
* expected to have their alpha channels drawn correctly on the screen.
|
|
|
|
|
**/
|
|
|
|
|
gboolean
|
|
|
|
|
gdk_display_is_composited (GdkDisplay *display)
|
|
|
|
|
{
|
|
|
|
|
g_return_val_if_fail (GDK_IS_DISPLAY (display), FALSE);
|
|
|
|
|
|
2016-10-29 02:37:20 +00:00
|
|
|
|
return display->composited;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
|
gdk_display_set_composited (GdkDisplay *display,
|
|
|
|
|
gboolean composited)
|
|
|
|
|
{
|
|
|
|
|
g_return_if_fail (GDK_IS_DISPLAY (display));
|
|
|
|
|
|
|
|
|
|
if (display->composited == composited)
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
display->composited = composited;
|
|
|
|
|
|
|
|
|
|
g_object_notify_by_pspec (G_OBJECT (display), props[PROP_COMPOSITED]);
|
2016-10-28 21:38:16 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* gdk_display_is_rgba:
|
|
|
|
|
* @display: a #GdkDisplay
|
|
|
|
|
*
|
2018-03-20 14:14:10 +00:00
|
|
|
|
* Returns wether surfaces on this @display are created with an
|
2016-10-28 21:38:16 +00:00
|
|
|
|
* alpha channel.
|
|
|
|
|
*
|
|
|
|
|
* Even if a %TRUE is returned, it is possible that the
|
2018-03-20 14:14:10 +00:00
|
|
|
|
* surface’s alpha channel won’t be honored when displaying the
|
|
|
|
|
* surface on the screen: in particular, for X an appropriate
|
2016-10-28 21:38:16 +00:00
|
|
|
|
* windowing manager and compositing manager must be running to
|
|
|
|
|
* provide appropriate display. Use gdk_display_is_composited()
|
|
|
|
|
* to check if that is the case.
|
|
|
|
|
*
|
2018-03-20 14:14:10 +00:00
|
|
|
|
* For setting an overall opacity for a top-level surface, see
|
2018-03-20 10:40:08 +00:00
|
|
|
|
* gdk_surface_set_opacity().
|
2016-10-28 21:38:16 +00:00
|
|
|
|
*
|
|
|
|
|
* On modern displays, this value is always %TRUE.
|
|
|
|
|
*
|
2018-03-20 14:14:10 +00:00
|
|
|
|
* Returns: %TRUE if surfaces are created with an alpha channel or
|
2016-10-28 21:38:16 +00:00
|
|
|
|
* %FALSE if the display does not support this functionality.
|
|
|
|
|
**/
|
|
|
|
|
gboolean
|
|
|
|
|
gdk_display_is_rgba (GdkDisplay *display)
|
|
|
|
|
{
|
|
|
|
|
g_return_val_if_fail (GDK_IS_DISPLAY (display), FALSE);
|
|
|
|
|
|
2016-10-29 02:37:20 +00:00
|
|
|
|
return display->rgba;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
|
gdk_display_set_rgba (GdkDisplay *display,
|
|
|
|
|
gboolean rgba)
|
|
|
|
|
{
|
|
|
|
|
g_return_if_fail (GDK_IS_DISPLAY (display));
|
|
|
|
|
|
|
|
|
|
if (display->rgba == rgba)
|
|
|
|
|
return;
|
|
|
|
|
|
|
|
|
|
display->rgba = rgba;
|
|
|
|
|
|
|
|
|
|
g_object_notify_by_pspec (G_OBJECT (display), props[PROP_RGBA]);
|
2016-10-28 21:38:16 +00:00
|
|
|
|
}
|
|
|
|
|
|
2017-11-24 16:31:18 +00:00
|
|
|
|
static void
|
|
|
|
|
device_removed_cb (GdkSeat *seat,
|
|
|
|
|
GdkDevice *device,
|
|
|
|
|
GdkDisplay *display)
|
|
|
|
|
{
|
|
|
|
|
g_hash_table_remove (display->device_grabs, device);
|
|
|
|
|
g_hash_table_remove (display->pointers_info, device);
|
|
|
|
|
|
|
|
|
|
/* FIXME: change core pointer and remove from device list */
|
|
|
|
|
}
|
2016-10-28 21:38:16 +00:00
|
|
|
|
|
2015-11-26 18:52:23 +00:00
|
|
|
|
void
|
|
|
|
|
gdk_display_add_seat (GdkDisplay *display,
|
|
|
|
|
GdkSeat *seat)
|
|
|
|
|
{
|
|
|
|
|
g_return_if_fail (GDK_IS_DISPLAY (display));
|
|
|
|
|
g_return_if_fail (GDK_IS_SEAT (seat));
|
|
|
|
|
|
2016-02-28 17:31:20 +00:00
|
|
|
|
display->seats = g_list_append (display->seats, g_object_ref (seat));
|
2015-12-09 11:25:10 +00:00
|
|
|
|
g_signal_emit (display, signals[SEAT_ADDED], 0, seat);
|
2017-11-24 16:31:18 +00:00
|
|
|
|
|
|
|
|
|
g_signal_connect (seat, "device-removed", G_CALLBACK (device_removed_cb), display);
|
2015-11-26 18:52:23 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
|
gdk_display_remove_seat (GdkDisplay *display,
|
|
|
|
|
GdkSeat *seat)
|
|
|
|
|
{
|
|
|
|
|
GList *link;
|
|
|
|
|
|
|
|
|
|
g_return_if_fail (GDK_IS_DISPLAY (display));
|
|
|
|
|
g_return_if_fail (GDK_IS_SEAT (seat));
|
|
|
|
|
|
2017-11-24 16:31:18 +00:00
|
|
|
|
g_signal_handlers_disconnect_by_func (seat, G_CALLBACK (device_removed_cb), display);
|
|
|
|
|
|
2015-11-26 18:52:23 +00:00
|
|
|
|
link = g_list_find (display->seats, seat);
|
|
|
|
|
|
|
|
|
|
if (link)
|
|
|
|
|
{
|
|
|
|
|
display->seats = g_list_remove_link (display->seats, link);
|
2015-12-09 11:25:10 +00:00
|
|
|
|
g_signal_emit (display, signals[SEAT_REMOVED], 0, seat);
|
2015-11-26 18:52:23 +00:00
|
|
|
|
g_object_unref (link->data);
|
|
|
|
|
g_list_free (link);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* gdk_display_get_default_seat:
|
|
|
|
|
* @display: a #GdkDisplay
|
|
|
|
|
*
|
|
|
|
|
* Returns the default #GdkSeat for this display.
|
|
|
|
|
*
|
|
|
|
|
* Returns: (transfer none): the default seat.
|
|
|
|
|
**/
|
|
|
|
|
GdkSeat *
|
|
|
|
|
gdk_display_get_default_seat (GdkDisplay *display)
|
|
|
|
|
{
|
|
|
|
|
GdkDisplayClass *display_class;
|
|
|
|
|
|
|
|
|
|
g_return_val_if_fail (GDK_IS_DISPLAY (display), NULL);
|
|
|
|
|
|
|
|
|
|
display_class = GDK_DISPLAY_GET_CLASS (display);
|
|
|
|
|
|
|
|
|
|
return display_class->get_default_seat (display);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* gdk_display_list_seats:
|
|
|
|
|
* @display: a #GdkDisplay
|
|
|
|
|
*
|
|
|
|
|
* Returns the list of seats known to @display.
|
|
|
|
|
*
|
|
|
|
|
* Returns: (transfer container) (element-type GdkSeat): the
|
|
|
|
|
* list of seats known to the #GdkDisplay
|
|
|
|
|
**/
|
|
|
|
|
GList *
|
|
|
|
|
gdk_display_list_seats (GdkDisplay *display)
|
|
|
|
|
{
|
|
|
|
|
g_return_val_if_fail (GDK_IS_DISPLAY (display), NULL);
|
|
|
|
|
|
|
|
|
|
return g_list_copy (display->seats);
|
|
|
|
|
}
|
2016-04-01 03:10:37 +00:00
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* gdk_display_get_n_monitors:
|
|
|
|
|
* @display: a #GdkDisplay
|
|
|
|
|
*
|
|
|
|
|
* Gets the number of monitors that belong to @display.
|
|
|
|
|
*
|
|
|
|
|
* The returned number is valid until the next emission of the
|
|
|
|
|
* #GdkDisplay::monitor-added or #GdkDisplay::monitor-removed signal.
|
|
|
|
|
*
|
|
|
|
|
* Returns: the number of monitors
|
|
|
|
|
*/
|
|
|
|
|
int
|
|
|
|
|
gdk_display_get_n_monitors (GdkDisplay *display)
|
|
|
|
|
{
|
|
|
|
|
g_return_val_if_fail (GDK_IS_DISPLAY (display), 0);
|
|
|
|
|
|
2016-04-25 13:07:56 +00:00
|
|
|
|
if (GDK_DISPLAY_GET_CLASS (display)->get_n_monitors == NULL)
|
|
|
|
|
return 1;
|
|
|
|
|
|
2016-04-01 03:10:37 +00:00
|
|
|
|
return GDK_DISPLAY_GET_CLASS (display)->get_n_monitors (display);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* gdk_display_get_monitor:
|
|
|
|
|
* @display: a #GdkDisplay
|
|
|
|
|
* @monitor_num: number of the monitor
|
|
|
|
|
*
|
|
|
|
|
* Gets a monitor associated with this display.
|
|
|
|
|
*
|
2016-09-22 11:56:47 +00:00
|
|
|
|
* Returns: (nullable) (transfer none): the #GdkMonitor, or %NULL if
|
2016-04-01 03:10:37 +00:00
|
|
|
|
* @monitor_num is not a valid monitor number
|
|
|
|
|
*/
|
|
|
|
|
GdkMonitor *
|
|
|
|
|
gdk_display_get_monitor (GdkDisplay *display,
|
|
|
|
|
gint monitor_num)
|
|
|
|
|
{
|
|
|
|
|
g_return_val_if_fail (GDK_IS_DISPLAY (display), NULL);
|
|
|
|
|
|
|
|
|
|
return GDK_DISPLAY_GET_CLASS (display)->get_monitor (display, monitor_num);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* gdk_display_get_primary_monitor:
|
|
|
|
|
* @display: a #GdkDisplay
|
|
|
|
|
*
|
|
|
|
|
* Gets the primary monitor for the display.
|
|
|
|
|
*
|
|
|
|
|
* The primary monitor is considered the monitor where the “main desktop”
|
2018-03-20 14:14:10 +00:00
|
|
|
|
* lives. While normal application surfaces typically allow the window
|
|
|
|
|
* manager to place the surfaces, specialized desktop applications
|
2016-04-01 03:10:37 +00:00
|
|
|
|
* such as panels should place themselves on the primary monitor.
|
|
|
|
|
*
|
2016-09-03 16:33:30 +00:00
|
|
|
|
* If no monitor is the designated primary monitor, any monitor
|
|
|
|
|
* (usually the first) may be returned. To make sure there is a dedicated
|
|
|
|
|
* primary monitor, use gdk_monitor_is_primary() on the returned monitor.
|
|
|
|
|
*
|
|
|
|
|
* Returns: (transfer none): the primary monitor, or any monitor if no
|
|
|
|
|
* primary monitor is configured by the user
|
2016-04-01 03:10:37 +00:00
|
|
|
|
*/
|
|
|
|
|
GdkMonitor *
|
|
|
|
|
gdk_display_get_primary_monitor (GdkDisplay *display)
|
|
|
|
|
{
|
|
|
|
|
g_return_val_if_fail (GDK_IS_DISPLAY (display), NULL);
|
|
|
|
|
|
2016-09-03 16:33:30 +00:00
|
|
|
|
return GDK_DISPLAY_GET_CLASS (display)->get_primary_monitor (display);
|
2016-04-01 03:10:37 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* gdk_display_get_monitor_at_point:
|
|
|
|
|
* @display: a #GdkDisplay
|
|
|
|
|
* @x: the x coordinate of the point
|
|
|
|
|
* @y: the y coordinate of the point
|
|
|
|
|
*
|
|
|
|
|
* Gets the monitor in which the point (@x, @y) is located,
|
|
|
|
|
* or a nearby monitor if the point is not in any monitor.
|
|
|
|
|
*
|
|
|
|
|
* Returns: (transfer none): the monitor containing the point
|
|
|
|
|
*/
|
|
|
|
|
GdkMonitor *
|
|
|
|
|
gdk_display_get_monitor_at_point (GdkDisplay *display,
|
|
|
|
|
int x,
|
|
|
|
|
int y)
|
|
|
|
|
{
|
2016-05-26 11:45:51 +00:00
|
|
|
|
GdkMonitor *nearest = NULL;
|
2016-04-01 03:10:37 +00:00
|
|
|
|
int nearest_dist = G_MAXINT;
|
|
|
|
|
int n_monitors, i;
|
|
|
|
|
|
|
|
|
|
g_return_val_if_fail (GDK_IS_DISPLAY (display), NULL);
|
|
|
|
|
|
|
|
|
|
n_monitors = gdk_display_get_n_monitors (display);
|
|
|
|
|
for (i = 0; i < n_monitors; i++)
|
|
|
|
|
{
|
|
|
|
|
GdkMonitor *monitor;
|
|
|
|
|
GdkRectangle geometry;
|
|
|
|
|
int dist_x, dist_y, dist;
|
|
|
|
|
|
|
|
|
|
monitor = gdk_display_get_monitor (display, i);
|
|
|
|
|
gdk_monitor_get_geometry (monitor, &geometry);
|
|
|
|
|
|
|
|
|
|
if (x < geometry.x)
|
|
|
|
|
dist_x = geometry.x - x;
|
|
|
|
|
else if (geometry.x + geometry.width <= x)
|
|
|
|
|
dist_x = x - (geometry.x + geometry.width) + 1;
|
|
|
|
|
else
|
|
|
|
|
dist_x = 0;
|
|
|
|
|
|
|
|
|
|
if (y < geometry.y)
|
|
|
|
|
dist_y = geometry.y - y;
|
|
|
|
|
else if (geometry.y + geometry.height <= y)
|
|
|
|
|
dist_y = y - (geometry.y + geometry.height) + 1;
|
|
|
|
|
else
|
|
|
|
|
dist_y = 0;
|
|
|
|
|
|
|
|
|
|
dist = dist_x + dist_y;
|
|
|
|
|
if (dist < nearest_dist)
|
|
|
|
|
{
|
|
|
|
|
nearest_dist = dist;
|
|
|
|
|
nearest = monitor;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (nearest_dist == 0)
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return nearest;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
2018-03-20 11:05:26 +00:00
|
|
|
|
* gdk_display_get_monitor_at_surface:
|
2016-04-01 03:10:37 +00:00
|
|
|
|
* @display: a #GdkDisplay
|
2018-03-20 14:14:10 +00:00
|
|
|
|
* @surface: a #GdkSurface
|
2016-04-01 03:10:37 +00:00
|
|
|
|
*
|
2018-03-20 14:14:10 +00:00
|
|
|
|
* Gets the monitor in which the largest area of @surface
|
|
|
|
|
* resides, or a monitor close to @surface if it is outside
|
2016-04-01 03:10:37 +00:00
|
|
|
|
* of all monitors.
|
|
|
|
|
*
|
2018-03-20 14:14:10 +00:00
|
|
|
|
* Returns: (transfer none): the monitor with the largest overlap with @surface
|
2016-04-01 03:10:37 +00:00
|
|
|
|
*/
|
|
|
|
|
GdkMonitor *
|
2018-03-20 11:05:26 +00:00
|
|
|
|
gdk_display_get_monitor_at_surface (GdkDisplay *display,
|
2018-03-20 14:14:10 +00:00
|
|
|
|
GdkSurface *surface)
|
2016-04-01 03:10:37 +00:00
|
|
|
|
{
|
|
|
|
|
GdkRectangle win;
|
|
|
|
|
int n_monitors, i;
|
|
|
|
|
int area = 0;
|
|
|
|
|
GdkMonitor *best = NULL;
|
2016-05-17 11:09:23 +00:00
|
|
|
|
GdkDisplayClass *class;
|
2016-04-01 03:10:37 +00:00
|
|
|
|
|
|
|
|
|
g_return_val_if_fail (GDK_IS_DISPLAY (display), NULL);
|
|
|
|
|
|
2016-05-17 11:09:23 +00:00
|
|
|
|
class = GDK_DISPLAY_GET_CLASS (display);
|
2018-03-20 11:05:26 +00:00
|
|
|
|
if (class->get_monitor_at_surface)
|
2016-05-17 11:09:23 +00:00
|
|
|
|
{
|
2018-03-20 14:14:10 +00:00
|
|
|
|
best = class->get_monitor_at_surface (display, surface);
|
2016-05-17 11:09:23 +00:00
|
|
|
|
|
|
|
|
|
if (best)
|
|
|
|
|
return best;
|
|
|
|
|
}
|
|
|
|
|
|
2018-03-20 14:14:10 +00:00
|
|
|
|
gdk_surface_get_geometry (surface, &win.x, &win.y, &win.width, &win.height);
|
|
|
|
|
gdk_surface_get_origin (surface, &win.x, &win.y);
|
2016-04-01 03:10:37 +00:00
|
|
|
|
|
|
|
|
|
n_monitors = gdk_display_get_n_monitors (display);
|
|
|
|
|
for (i = 0; i < n_monitors; i++)
|
|
|
|
|
{
|
|
|
|
|
GdkMonitor *monitor;
|
|
|
|
|
GdkRectangle mon, intersect;
|
|
|
|
|
int overlap;
|
|
|
|
|
|
|
|
|
|
monitor = gdk_display_get_monitor (display, i);
|
|
|
|
|
gdk_monitor_get_geometry (monitor, &mon);
|
|
|
|
|
gdk_rectangle_intersect (&win, &mon, &intersect);
|
|
|
|
|
overlap = intersect.width *intersect.height;
|
|
|
|
|
if (overlap > area)
|
|
|
|
|
{
|
|
|
|
|
area = overlap;
|
|
|
|
|
best = monitor;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (best)
|
|
|
|
|
return best;
|
|
|
|
|
|
|
|
|
|
return gdk_display_get_monitor_at_point (display,
|
|
|
|
|
win.x + win.width / 2,
|
|
|
|
|
win.y + win.height / 2);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
|
gdk_display_monitor_added (GdkDisplay *display,
|
|
|
|
|
GdkMonitor *monitor)
|
|
|
|
|
{
|
|
|
|
|
g_signal_emit (display, signals[MONITOR_ADDED], 0, monitor);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
|
gdk_display_monitor_removed (GdkDisplay *display,
|
|
|
|
|
GdkMonitor *monitor)
|
|
|
|
|
{
|
|
|
|
|
g_signal_emit (display, signals[MONITOR_REMOVED], 0, monitor);
|
|
|
|
|
gdk_monitor_invalidate (monitor);
|
|
|
|
|
}
|
2017-10-08 15:38:38 +00:00
|
|
|
|
|
|
|
|
|
void
|
|
|
|
|
gdk_display_emit_opened (GdkDisplay *display)
|
|
|
|
|
{
|
|
|
|
|
g_signal_emit (display, signals[OPENED], 0);
|
|
|
|
|
}
|
2017-10-30 13:00:49 +00:00
|
|
|
|
|
2017-12-26 15:21:45 +00:00
|
|
|
|
/**
|
|
|
|
|
* gdk_display_get_setting:
|
|
|
|
|
* @display: a #GdkDisplay
|
|
|
|
|
* @name: the name of the setting
|
|
|
|
|
* @value: location to store the value of the setting
|
|
|
|
|
*
|
|
|
|
|
* Retrieves a desktop-wide setting such as double-click time
|
|
|
|
|
* for the @display.
|
|
|
|
|
*
|
|
|
|
|
* Returns: %TRUE if the setting existed and a value was stored
|
|
|
|
|
* in @value, %FALSE otherwise
|
|
|
|
|
*/
|
2017-10-30 13:00:49 +00:00
|
|
|
|
gboolean
|
|
|
|
|
gdk_display_get_setting (GdkDisplay *display,
|
|
|
|
|
const char *name,
|
|
|
|
|
GValue *value)
|
|
|
|
|
{
|
2017-10-30 20:44:47 +00:00
|
|
|
|
g_return_val_if_fail (GDK_IS_DISPLAY (display), FALSE);
|
|
|
|
|
g_return_val_if_fail (name != NULL, FALSE);
|
|
|
|
|
g_return_val_if_fail (value != NULL, FALSE);
|
|
|
|
|
|
|
|
|
|
return GDK_DISPLAY_GET_CLASS (display)->get_setting (display, name, value);
|
2017-10-30 13:00:49 +00:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
|
gdk_display_setting_changed (GdkDisplay *display,
|
|
|
|
|
const char *name)
|
|
|
|
|
{
|
|
|
|
|
g_signal_emit (display, signals[SETTING_CHANGED], 0, name);
|
|
|
|
|
}
|
2017-11-17 20:39:08 +00:00
|
|
|
|
|
|
|
|
|
guint32
|
|
|
|
|
gdk_display_get_last_seen_time (GdkDisplay *display)
|
|
|
|
|
{
|
|
|
|
|
g_return_val_if_fail (GDK_IS_DISPLAY (display), GDK_CURRENT_TIME);
|
|
|
|
|
|
|
|
|
|
if (GDK_DISPLAY_GET_CLASS (display)->get_last_seen_time)
|
|
|
|
|
return GDK_DISPLAY_GET_CLASS (display)->get_last_seen_time (display);
|
|
|
|
|
|
|
|
|
|
return GDK_CURRENT_TIME;
|
|
|
|
|
}
|
|
|
|
|
|
2017-11-17 21:22:21 +00:00
|
|
|
|
void
|
|
|
|
|
gdk_display_set_double_click_time (GdkDisplay *display,
|
|
|
|
|
guint msec)
|
|
|
|
|
{
|
|
|
|
|
display->double_click_time = msec;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
|
gdk_display_set_double_click_distance (GdkDisplay *display,
|
|
|
|
|
guint distance)
|
|
|
|
|
{
|
|
|
|
|
display->double_click_distance = distance;
|
|
|
|
|
}
|
2017-11-17 22:42:12 +00:00
|
|
|
|
|
|
|
|
|
void
|
|
|
|
|
gdk_display_set_cursor_theme (GdkDisplay *display,
|
|
|
|
|
const char *name,
|
|
|
|
|
int size)
|
|
|
|
|
{
|
|
|
|
|
if (GDK_DISPLAY_GET_CLASS (display)->set_cursor_theme)
|
|
|
|
|
GDK_DISPLAY_GET_CLASS (display)->set_cursor_theme (display, name, size);
|
|
|
|
|
}
|