diff --git a/docs/reference/gdk/tmpl/x_interaction.sgml b/docs/reference/gdk/tmpl/x_interaction.sgml
index d35b258d97..71d742a3db 100644
--- a/docs/reference/gdk/tmpl/x_interaction.sgml
+++ b/docs/reference/gdk/tmpl/x_interaction.sgml
@@ -26,8 +26,9 @@ Obtains the Xlib window id of the root window of the default screen.
The current display.
-@object:
@Returns: an Xlib Display*.
+
+@object:
diff --git a/gdk/gdkdisplay.h b/gdk/gdkdisplay.h
index dd204e8c53..5ac43009fa 100644
--- a/gdk/gdkdisplay.h
+++ b/gdk/gdkdisplay.h
@@ -35,7 +35,7 @@ extern "C"
typedef struct _GdkDisplayClass GdkDisplayClass;
#define GDK_TYPE_DISPLAY (gdk_display_get_type ())
-#define GDK_DISPLAY(object) (G_TYPE_CHECK_INSTANCE_CAST ((object), GDK_TYPE_DISPLAY, GdkDisplay))
+#define GDK_DISPLAY_OBJECT(object) (G_TYPE_CHECK_INSTANCE_CAST ((object), GDK_TYPE_DISPLAY, GdkDisplay))
#define GDK_DISPLAY_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GDK_TYPE_DISPLAY, GdkDisplayClass))
#define GDK_IS_DISPLAY(object) (G_TYPE_CHECK_INSTANCE_TYPE ((object), GDK_TYPE_DISPLAY))
#define GDK_IS_DISPLAY_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GDK_TYPE_DISPLAY))
diff --git a/gdk/x11/gdkdisplaymgr-x11.c b/gdk/x11/gdkdisplaymgr-x11.c
index 8675c09bee..45c3feb7db 100644
--- a/gdk/x11/gdkdisplaymgr-x11.c
+++ b/gdk/x11/gdkdisplaymgr-x11.c
@@ -81,6 +81,9 @@ gdk_display_manager_set_default_display (GdkDisplayManager * display_mgr,
g_return_if_fail (GDK_IS_DISPLAY_MANAGER (display_mgr));
g_return_if_fail (GDK_IS_DISPLAY (default_display));
display_mgr->default_display = default_display;
+#ifndef GDK_MULTIHEAD_SAFE
+ gdk_display = GDK_DISPLAY_XDISPLAY (default_display);
+#endif
}
GdkDisplay *
diff --git a/gdk/x11/gdkdrawable-x11.c b/gdk/x11/gdkdrawable-x11.c
index 4930906d90..8c7d36c656 100644
--- a/gdk/x11/gdkdrawable-x11.c
+++ b/gdk/x11/gdkdrawable-x11.c
@@ -756,16 +756,40 @@ gdk_x11_get_depth (GdkDrawable *drawable)
return gdk_drawable_get_depth (GDK_DRAWABLE_IMPL_X11 (drawable)->wrapper);
}
+
+static GdkDrawable * get_impl_drawable (GdkDrawable *drawable)
+{
+ GdkDrawable *impl;
+
+ if (GDK_IS_WINDOW (drawable))
+ impl = ((GdkPixmapObject *)drawable)->impl;
+ else if (GDK_IS_PIXMAP (drawable))
+ impl = ((GdkPixmapObject *)drawable)->impl;
+ else
+ {
+ g_warning (G_STRLOC " drawable is not a pixmap or window");
+ return None;
+ }
+ return impl;
+}
+
+
static GdkScreen*
gdk_x11_get_screen (GdkDrawable *drawable)
{
- return GDK_DRAWABLE_IMPL_X11 (drawable)->screen;
+ if (GDK_IS_DRAWABLE_IMPL_X11 (drawable))
+ return GDK_DRAWABLE_IMPL_X11 (drawable)->screen;
+ else
+ return GDK_DRAWABLE_IMPL_X11 (get_impl_drawable (drawable))->screen;
}
static GdkDisplay*
gdk_x11_get_display (GdkDrawable *drawable)
{
- return gdk_screen_get_display (GDK_DRAWABLE_IMPL_X11 (drawable)->screen);
+ if (GDK_IS_DRAWABLE_IMPL_X11 (drawable))
+ return gdk_screen_get_display (GDK_DRAWABLE_IMPL_X11 (drawable)->screen);
+ else
+ return gdk_screen_get_display (GDK_DRAWABLE_IMPL_X11 (get_impl_drawable (drawable))->screen);
}
static GdkVisual*
diff --git a/gdk/x11/gdkevents-x11.c b/gdk/x11/gdkevents-x11.c
index cc5095769b..411271703f 100644
--- a/gdk/x11/gdkevents-x11.c
+++ b/gdk/x11/gdkevents-x11.c
@@ -366,7 +366,7 @@ gdk_add_client_message_filter (GdkAtom message_type,
filter->function = func;
filter->data = data;
- GDK_DISPLAY_IMPL_X11(display)->client_filters =
+ GDK_DISPLAY_IMPL_X11(gdk_get_default_display())->client_filters =
g_list_prepend (GDK_DISPLAY_IMPL_X11
(gdk_get_default_display())->client_filters,
filter);
diff --git a/gdk/x11/gdkglobals-x11.c b/gdk/x11/gdkglobals-x11.c
index e5d1ad431b..e5f1d4ba07 100644
--- a/gdk/x11/gdkglobals-x11.c
+++ b/gdk/x11/gdkglobals-x11.c
@@ -34,7 +34,6 @@
gboolean _gdk_use_xshm = TRUE; /* used as a cmd line arg */
gchar *_gdk_display_name = NULL;
GdkAtom _gdk_selection_property;
-
-GdkWindowObject *_gdk_xgrab_window = NULL; /* Window that currently holds the
- * x pointer grab
- */
+#ifndef GDK_MULTIHEAD_SAFE
+Display *gdk_display = NULL;
+#endif
diff --git a/gdk/x11/gdkx.h b/gdk/x11/gdkx.h
index a042cae5b6..8fbfcbb9de 100644
--- a/gdk/x11/gdkx.h
+++ b/gdk/x11/gdkx.h
@@ -29,12 +29,17 @@
#include
#include
+#include
#include
#include
G_BEGIN_DECLS
+#ifndef GDK_MULTIHEAD_SAFE
+extern Display *gdk_display;
+#endif
+
Display *gdk_x11_drawable_get_xdisplay (GdkDrawable *drawable);
XID gdk_x11_drawable_get_xid (GdkDrawable *drawable);
Display *gdk_x11_image_get_xdisplay (GdkImage *image);
@@ -60,6 +65,8 @@ gint gdk_x11_get_default_screen (void);
#define GDK_IMAGE_XDISPLAY(image) (gdk_x11_image_get_xdisplay (image))
#define GDK_IMAGE_XIMAGE(image) (gdk_x11_image_get_ximage (image))
+#define GDK_DISPLAY() gdk_get_default_display()
+
#ifdef INSIDE_GDK_X11
#include "gdkprivate-x11.h"
diff --git a/gdk/x11/gdkxid.c b/gdk/x11/gdkxid.c
index 462ac5927b..b689957313 100644
--- a/gdk/x11/gdkxid.c
+++ b/gdk/x11/gdkxid.c
@@ -100,34 +100,19 @@ void
gdk_xid_table_insert (XID *xid,
gpointer data)
{
- g_return_if_fail (xid != NULL);
-
- if (!xid_ht)
- xid_ht = g_hash_table_new ((GHashFunc) gdk_xid_hash,
- (GEqualFunc) gdk_xid_equal);
-
- g_hash_table_insert (xid_ht, xid, data);
+ gdk_xid_table_insert_for_display (gdk_get_default_display (), xid, data);
}
void
gdk_xid_table_remove (XID xid)
{
- if (!xid_ht)
- xid_ht = g_hash_table_new ((GHashFunc) gdk_xid_hash,
- (GEqualFunc) gdk_xid_equal);
-
- g_hash_table_remove (xid_ht, &xid);
+ gdk_xid_table_remove_for_display (gdk_get_default_display (), xid);
}
gpointer
gdk_xid_table_lookup (XID xid)
{
- gpointer data = NULL;
-
- if (xid_ht)
- data = g_hash_table_lookup (xid_ht, &xid);
-
- return data;
+ gdk_xid_table_lookup_for_display (gdk_get_default_display (), xid);
}
#endif
diff --git a/gtk/gtkrc.c b/gtk/gtkrc.c
index da1279b41d..33ed364d4f 100644
--- a/gtk/gtkrc.c
+++ b/gtk/gtkrc.c
@@ -803,7 +803,7 @@ gtk_rc_parse_string (const gchar *rc_string)
{
g_return_if_fail (rc_string != NULL);
- gtk_rc_parse_any (gtk_rc_context_get (gtk_settings_get_for_screen (gdk_get_default_scren ())),
+ gtk_rc_parse_any (gtk_rc_context_get (gtk_settings_get_for_screen (gdk_get_default_screen ())),
"-", -1, rc_string); /* FIXME */
}
#endif
@@ -916,7 +916,7 @@ gtk_rc_parse (const gchar *filename)
{
g_return_if_fail (filename != NULL);
- gtk_rc_parse_file (gtk_rc_context_get (gtk_settings_get_for_screen (gdk_get_default_scren ())),
+ gtk_rc_parse_file (gtk_rc_context_get (gtk_settings_get_for_screen (gdk_get_default_screen ())),
filename, GTK_PATH_PRIO_RC, TRUE); /* FIXME */
}
#endif
diff --git a/gtk/gtkwidget.c b/gtk/gtkwidget.c
index 945e5a9672..a703961fb7 100644
--- a/gtk/gtkwidget.c
+++ b/gtk/gtkwidget.c
@@ -4568,14 +4568,17 @@ gtk_widget_get_screen (GtkWidget *widget)
return GTK_WINDOW (GTK_MENU (toplevel)->toplevel)->screen;
if (GTK_IS_OPTION_MENU (toplevel))
return GTK_WINDOW (GTK_MENU(GTK_OPTION_MENU (toplevel)->menu)->toplevel)->screen;
-
-
+
+#ifdef GDK_MULTIHEAD_SAFE
g_warning (G_STRLOC ": Can't get associated screen"
" for a widget unless it is inside a toplevel GtkWindow\n"
" widget type is %s associated top level type is %s",
g_type_name (G_OBJECT_TYPE(G_OBJECT (widget))),
g_type_name (G_OBJECT_TYPE(G_OBJECT (toplevel))));
return NULL;
+#else
+ return gdk_get_default_display ();
+#endif
}
/**
* gtk_widget_has_screen: