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: