From bd92619e9d14a05a4a080092c212972f28c28e2b Mon Sep 17 00:00:00 2001 From: Erwann Chenede Date: Thu, 20 Sep 2001 17:46:34 +0000 Subject: [PATCH] (20/09/01) Erwann Chenede - * grouped all display init in gdkdisplay-x11.c * created a per display X ID hashtable * create per display equivalent of gdk_[window|pixmap|font]_lookup & co. * added various convienience functions --- gdk/gdkinternals.h | 3 ++ gdk/x11/gdkdisplay-x11.c | 21 +++++++++++ gdk/x11/gdkdisplay-x11.h | 3 ++ gdk/x11/gdkdisplaymgr-x11.c | 8 ++-- gdk/x11/gdkdisplaymgr-x11.h | 11 +++--- gdk/x11/gdkdnd-x11.c | 13 ++++--- gdk/x11/gdkevents-x11.c | 11 ++++-- gdk/x11/gdkfont-x11.c | 7 ++-- gdk/x11/gdkgc-x11.c | 12 ++++-- gdk/x11/gdkmain-x11.c | 25 ++----------- gdk/x11/gdkpixmap-x11.c | 21 ++++++----- gdk/x11/gdkprivate-x11.h | 8 +++- gdk/x11/gdkscreen-x11.c | 4 +- gdk/x11/gdkscreen-x11.h | 2 +- gdk/x11/gdkselection-x11.c | 2 +- gdk/x11/gdkwindow-x11.c | 40 +++++++++++++------- gdk/x11/gdkx.h | 27 +++++++++++-- gdk/x11/gdkxid.c | 75 ++++++++++++++++++++++++++++++++++++- gtk/gtkplug.c | 14 +++++-- gtk/gtkselection.c | 9 +++-- gtk/gtksocket.c | 2 +- tests/simple.c | 47 ++++++++++++----------- 22 files changed, 255 insertions(+), 110 deletions(-) diff --git a/gdk/gdkinternals.h b/gdk/gdkinternals.h index 9be3296105..af68233f8f 100644 --- a/gdk/gdkinternals.h +++ b/gdk/gdkinternals.h @@ -145,6 +145,9 @@ void _gdk_cursor_destroy (GdkCursor *cursor); extern GdkArgDesc _gdk_windowing_args[]; GdkDisplay * _gdk_windowing_init_check (int argc, char **argv); +GdkDisplay * _gdk_windowing_init_check_for_display (int argc, + char **argv, + char *display_name); void _gdk_windowing_screen_init (GdkScreen *screen); void _gdk_windowing_window_get_offsets (GdkWindow *window, gint *x_offset, diff --git a/gdk/x11/gdkdisplay-x11.c b/gdk/x11/gdkdisplay-x11.c index d25c33f20e..e181448e85 100644 --- a/gdk/x11/gdkdisplay-x11.c +++ b/gdk/x11/gdkdisplay-x11.c @@ -288,3 +288,24 @@ gdk_x11_display_ungrab (GdkDisplay *display) if (display_impl->grab_count == 0) XUngrabServer (display_impl->xdisplay); } + +GdkDisplay * +gdk_display_init_new (int argc, char **argv, char *display_name) +{ + GdkDisplay *display = NULL; + GdkScreen *screen = NULL; + + display = _gdk_windowing_init_check_for_display (argc,argv,display_name); + if (!display) + return NULL; + + screen = gdk_display_get_default_screen (display); + + _gdk_visual_init (screen); + _gdk_windowing_window_init (screen); + _gdk_windowing_image_init (display); + gdk_events_init (display); + gdk_dnd_init (display); + + return display; +} diff --git a/gdk/x11/gdkdisplay-x11.h b/gdk/x11/gdkdisplay-x11.h index 56e58ea278..0db6f13bee 100644 --- a/gdk/x11/gdkdisplay-x11.h +++ b/gdk/x11/gdkdisplay-x11.h @@ -93,6 +93,9 @@ struct _GdkDisplayImplX11 /* list of filters for client messages */ GList *client_filters; + + /* X ID hashtable */ + GHashTable *xid_ht; }; struct _GdkDisplayImplX11Class diff --git a/gdk/x11/gdkdisplaymgr-x11.c b/gdk/x11/gdkdisplaymgr-x11.c index efaf841d75..e228df39ae 100644 --- a/gdk/x11/gdkdisplaymgr-x11.c +++ b/gdk/x11/gdkdisplaymgr-x11.c @@ -160,9 +160,6 @@ gdk_x11_display_manager_get_display (GdkDisplayManager * display_mgr, return NULL; } -/* Help functions & Macros */ - - GdkDisplayImplX11 * gdk_lookup_xdisplay (Display * display) { @@ -170,3 +167,8 @@ gdk_lookup_xdisplay (Display * display) GDK_DISPLAY_IMPL_X11 (gdk_x11_display_manager_get_display (_gdk_display_manager, display)); } +GSList * +gdk_x11_display_manager_get_open_displays (GdkDisplayManager *display_mgr) +{ + return _gdk_display_manager->open_displays; +} diff --git a/gdk/x11/gdkdisplaymgr-x11.h b/gdk/x11/gdkdisplaymgr-x11.h index eac7516688..85b0b9680a 100644 --- a/gdk/x11/gdkdisplaymgr-x11.h +++ b/gdk/x11/gdkdisplaymgr-x11.h @@ -44,11 +44,12 @@ struct _GdkDisplayManagerClass GObjectClass parent_class; }; -GdkScreen * gdk_x11_display_manager_get_screen_for_root (GdkDisplayManager *display_mgr, - Window root); -GdkDisplay * gdk_x11_display_manager_get_display (GdkDisplayManager *display_mgr, - Display *display); -GdkDisplayImplX11 *gdk_lookup_xdisplay (Display *display); +GdkScreen * gdk_x11_display_manager_get_screen_for_root (GdkDisplayManager *display_mgr, + Window root); +GdkDisplay * gdk_x11_display_manager_get_display (GdkDisplayManager *display_mgr, + Display *display); +GdkDisplayImplX11 *gdk_lookup_xdisplay (Display *display); +GSList * gdk_x11_display_manager_get_open_displays (GdkDisplayManager *display_mgr); #ifdef __cplusplus } diff --git a/gdk/x11/gdkdnd-x11.c b/gdk/x11/gdkdnd-x11.c index 28eca8c38f..0d01b70d74 100644 --- a/gdk/x11/gdkdnd-x11.c +++ b/gdk/x11/gdkdnd-x11.c @@ -29,6 +29,7 @@ #include #include "gdk.h" /* For gdk_flush() */ +#include "gdkx.h" #include "gdkdnd.h" #include "gdkproperty.h" #include "gdkinternals.h" @@ -1607,7 +1608,8 @@ motif_drag_context_new (GdkWindow *dest_window, { GdkDragContext *new_context; GdkDragContextPrivateX11 *private; - GdkDisplayImplX11 *display_impl = GDK_DISPLAY_IMPL_X11 (GDK_DRAWABLE_DISPLAY (dest_window)); + GdkDisplay *display = GDK_DRAWABLE_DISPLAY (dest_window); + GdkDisplayImplX11 *display_impl = GDK_DISPLAY_IMPL_X11 (display); /* FIXME, current_dest_drag really shouldn't be NULL'd * if we error below. @@ -1629,12 +1631,12 @@ motif_drag_context_new (GdkWindow *dest_window, new_context->protocol = GDK_DRAG_PROTO_MOTIF; new_context->is_source = FALSE; - new_context->source_window = gdk_window_lookup (source_window); + new_context->source_window = gdk_window_lookup_for_display (display, source_window); if (new_context->source_window) gdk_window_ref (new_context->source_window); else { - new_context->source_window = gdk_window_foreign_new_for_display (GDK_DRAWABLE_DISPLAY (dest_window), + new_context->source_window = gdk_window_foreign_new_for_display (display, source_window); if (!new_context->source_window) { @@ -2586,7 +2588,7 @@ xdnd_enter_filter (GdkXEvent *xev, new_context->protocol = GDK_DRAG_PROTO_XDND; new_context->is_source = FALSE; - new_context->source_window = gdk_window_lookup (source_window); + new_context->source_window = gdk_window_lookup_for_display (GDK_DRAWABLE_DISPLAY (event->any.window), source_window); if (new_context->source_window) gdk_window_ref (new_context->source_window); else @@ -2977,7 +2979,8 @@ gdk_drag_find_window (GdkDragContext *context, */ if ((recipient = gdk_drag_get_protocol (display, dest, protocol))) { - *dest_window = gdk_window_lookup (recipient); + *dest_window = gdk_window_lookup_for_display (display, + recipient); if (*dest_window) gdk_window_ref (*dest_window); else diff --git a/gdk/x11/gdkevents-x11.c b/gdk/x11/gdkevents-x11.c index d46392fd02..08cffd4e31 100644 --- a/gdk/x11/gdkevents-x11.c +++ b/gdk/x11/gdkevents-x11.c @@ -546,7 +546,7 @@ gdk_event_translate (GdkDisplay *display, /* Find the GdkWindow that this event occurred in. */ - window = gdk_window_lookup (xevent->xany.window); + window = gdk_window_lookup_for_display (display, xevent->xany.window); window_private = (GdkWindowObject *) window; if (window) @@ -919,7 +919,9 @@ gdk_event_translate (GdkDisplay *display, * lookup the corresponding GdkWindow. */ if (xevent->xcrossing.subwindow != None) - event->crossing.subwindow = gdk_window_lookup (xevent->xcrossing.subwindow); + event->crossing.subwindow = + gdk_window_lookup_for_display (display, + xevent->xcrossing.subwindow); else event->crossing.subwindow = NULL; @@ -1006,7 +1008,8 @@ gdk_event_translate (GdkDisplay *display, * lookup the corresponding GdkWindow. */ if (xevent->xcrossing.subwindow != None) - event->crossing.subwindow = gdk_window_lookup (xevent->xcrossing.subwindow); + event->crossing.subwindow = + gdk_window_lookup_for_display (display, xevent->xcrossing.subwindow); else event->crossing.subwindow = NULL; @@ -2338,7 +2341,7 @@ gdk_xsettings_watch_cb (Window window, { GdkWindow *gdkwin; - gdkwin = gdk_window_lookup (window); + gdkwin = gdk_window_lookup_for_all_displays (window); if (is_start) gdk_window_add_filter (gdkwin, gdk_xsettings_client_event_filter, NULL); else diff --git a/gdk/x11/gdkfont-x11.c b/gdk/x11/gdkfont-x11.c index b88f57f6da..458637f8fe 100644 --- a/gdk/x11/gdkfont-x11.c +++ b/gdk/x11/gdkfont-x11.c @@ -160,7 +160,7 @@ gdk_font_load_for_display (GdkDisplay *display, if (xfont == NULL) return NULL; - font = gdk_font_lookup (xfont->fid); + font = gdk_font_lookup_for_display (display, xfont->fid); if (font != NULL) { private = (GdkFontPrivateX *) font; @@ -182,7 +182,7 @@ gdk_font_load_for_display (GdkDisplay *display, font->ascent = xfont->ascent; font->descent = xfont->descent; - gdk_xid_table_insert (&xfont->fid, font); + gdk_xid_table_insert_for_display (display, &xfont->fid, font); } gdk_font_hash_insert (GDK_FONT_FONT, font, font_name); @@ -387,7 +387,8 @@ _gdk_font_destroy (GdkFont *font) switch (font->type) { case GDK_FONT_FONT: - gdk_xid_table_remove (((XFontStruct *) private->xfont)->fid); + gdk_xid_table_remove_for_display (private->display, + ((XFontStruct *) private->xfont)->fid); XFreeFont (GDK_DISPLAY_IMPL_X11(private->display)->xdisplay, (XFontStruct *) private->xfont); break; diff --git a/gdk/x11/gdkgc-x11.c b/gdk/x11/gdkgc-x11.c index 2b513ff4ad..0c45dcee9c 100644 --- a/gdk/x11/gdkgc-x11.c +++ b/gdk/x11/gdkgc-x11.c @@ -236,7 +236,9 @@ gdk_x11_gc_get_values (GdkGC *gc, { values->foreground.pixel = xvalues.foreground; values->background.pixel = xvalues.background; - values->font = gdk_font_lookup (xvalues.font); + values->font = + gdk_font_lookup_for_display (GDK_GC_DISPLAY (gc), + xvalues.font); switch (xvalues.function) { @@ -306,8 +308,12 @@ gdk_x11_gc_get_values (GdkGC *gc, break; } - values->tile = gdk_pixmap_lookup (xvalues.tile); - values->stipple = gdk_pixmap_lookup (xvalues.stipple); + values->tile = + gdk_pixmap_lookup_for_display (GDK_GC_DISPLAY (gc), + xvalues.tile); + values->stipple = + gdk_pixmap_lookup_for_display (GDK_GC_DISPLAY (gc), + xvalues.stipple); values->clip_mask = NULL; values->subwindow_mode = xvalues.subwindow_mode; values->ts_x_origin = xvalues.ts_x_origin; diff --git a/gdk/x11/gdkmain-x11.c b/gdk/x11/gdkmain-x11.c index e31e513b3b..35896a04e0 100644 --- a/gdk/x11/gdkmain-x11.c +++ b/gdk/x11/gdkmain-x11.c @@ -116,7 +116,9 @@ GdkArgDesc _gdk_windowing_args[] = { }; GdkDisplay * -_gdk_windowing_init_check_for_display (int argc, char **argv, char *display_name) +_gdk_windowing_init_check_for_display (int argc, + char **argv, + char *display_name) { XClassHint *class_hint; guint pid; @@ -205,27 +207,6 @@ _gdk_windowing_init_check (int argc, char **argv) return _gdk_windowing_init_check_for_display (argc, argv, gdk_display_name); } -GdkDisplay * -gdk_display_init_new (int argc, char **argv, char *display_name) -{ - GdkDisplay *display = NULL; - GdkScreen *screen = NULL; - - display = _gdk_windowing_init_check_for_display (argc,argv,display_name); - if (!display) - return NULL; - - screen = gdk_display_get_default_screen (display); - - _gdk_visual_init (screen); - _gdk_windowing_window_init (screen); - _gdk_windowing_image_init (display); - gdk_events_init (display); - gdk_dnd_init (display); - - return display; -} - #ifndef GDK_MULTIHEAD_SAFE void gdk_set_use_xshm (gboolean use_xshm) diff --git a/gdk/x11/gdkpixmap-x11.c b/gdk/x11/gdkpixmap-x11.c index 5e6ae982e2..c1a37b9dc9 100644 --- a/gdk/x11/gdkpixmap-x11.c +++ b/gdk/x11/gdkpixmap-x11.c @@ -128,7 +128,8 @@ gdk_pixmap_impl_x11_finalize (GObject *object) if (!impl->is_foreign) XFreePixmap (GDK_PIXMAP_XDISPLAY (wrapper), GDK_PIXMAP_XID (wrapper)); - gdk_xid_table_remove (GDK_PIXMAP_XID (wrapper)); + gdk_xid_table_remove_for_display (GDK_PIXMAP_DISPLAY (wrapper), + GDK_PIXMAP_XID (wrapper)); G_OBJECT_CLASS (parent_class)->finalize (object); } @@ -196,8 +197,8 @@ gdk_pixmap_new (GdkWindow *window, gdk_drawable_set_colormap (pixmap, cmap); } - gdk_xid_table_insert (&GDK_PIXMAP_XID (pixmap), pixmap); - + gdk_xid_table_insert_for_display (GDK_WINDOW_DISPLAY (window), + &GDK_PIXMAP_XID (pixmap), pixmap); return pixmap; } @@ -240,8 +241,8 @@ gdk_bitmap_create_from_data (GdkWindow *window, GDK_WINDOW_XID (window), (char *)data, width, height); - gdk_xid_table_insert (&GDK_PIXMAP_XID (pixmap), pixmap); - + gdk_xid_table_insert_for_display (GDK_WINDOW_DISPLAY (window), + &GDK_PIXMAP_XID (pixmap), pixmap); return pixmap; } @@ -294,8 +295,8 @@ gdk_pixmap_create_from_data (GdkWindow *window, (char *)data, width, height, fg->pixel, bg->pixel, depth); - gdk_xid_table_insert (&GDK_PIXMAP_XID (pixmap), pixmap); - + gdk_xid_table_insert_for_display (GDK_WINDOW_DISPLAY (window), + &GDK_PIXMAP_XID (pixmap), pixmap); return pixmap; } @@ -342,17 +343,19 @@ gdk_pixmap_foreign_new_for_screen (GdkScreen *screen, pix_impl->height = h_ret; GDK_PIXMAP_OBJECT (pixmap)->depth = depth_ret; - gdk_xid_table_insert(&GDK_PIXMAP_XID (pixmap), pixmap); + gdk_xid_table_insert_for_display (GDK_SCREEN_DISPLAY (screen), + &GDK_PIXMAP_XID (pixmap), pixmap); return pixmap; } - +#ifndef GDK_MULTIHEAD_SAFE GdkPixmap* gdk_pixmap_foreign_new (GdkNativeWindow anid) { GDK_NOTE (MULTIHEAD, g_message ("Use gdk_pixmap_foreign_new_for_screen instead\n")); return gdk_pixmap_foreign_new_for_screen (gdk_get_default_screen (),anid); } +#endif GdkScreen* gdk_pixmap_get_screen (GdkDrawable *drawable) diff --git a/gdk/x11/gdkprivate-x11.h b/gdk/x11/gdkprivate-x11.h index e067b1745e..c5fa0882d3 100644 --- a/gdk/x11/gdkprivate-x11.h +++ b/gdk/x11/gdkprivate-x11.h @@ -35,11 +35,15 @@ #include "gdkx.h" #include - +void gdk_xid_table_insert_for_display (GdkDisplay *display, + XID *xid, + gpointer data); +void gdk_xid_table_remove_for_display (GdkDisplay *display, + XID xid); +#ifndef GDK_MULTIHEAD_SAFE void gdk_xid_table_insert (XID *xid, gpointer data); void gdk_xid_table_remove (XID xid); -#ifndef GDK_MULTIHEAD_SAFE gint gdk_send_xevent (Window window, gboolean propagate, glong event_mask, diff --git a/gdk/x11/gdkscreen-x11.c b/gdk/x11/gdkscreen-x11.c index 1fd32e33e6..ae95b29cc0 100644 --- a/gdk/x11/gdkscreen-x11.c +++ b/gdk/x11/gdkscreen-x11.c @@ -195,8 +195,8 @@ gdk_X11_screen_get_window_at_pointer (GdkScreen *screen, } XUngrabServer (xdisplay); - window = gdk_window_lookup (xwindow_last); - + window = gdk_window_lookup_for_display (GDK_SCREEN_DISPLAY(screen), + xwindow_last); if (win_x) *win_x = window ? winx : -1; if (win_y) diff --git a/gdk/x11/gdkscreen-x11.h b/gdk/x11/gdkscreen-x11.h index af5cdb310d..f8e708e4ff 100644 --- a/gdk/x11/gdkscreen-x11.h +++ b/gdk/x11/gdkscreen-x11.h @@ -85,7 +85,7 @@ GType gdk_X11_screen_impl_get_type (); #define DEFAULT_GDK_SCREEN_IMPL_X11_FOR_DISPLAY(display) GDK_SCREEN_IMPL_X11(GDK_DISPLAY_GET_CLASS(display)->get_default_screen(display)) #define GDK_SCREEN_XDISPLAY(screen) (GDK_SCREEN_IMPL_X11(screen)->xdisplay) #define GDK_SCREEN_XROOTWIN(screen) (GDK_SCREEN_IMPL_X11(screen)->xroot_window) - +#define GDK_SCREEN_DISPLAY(screen) (GDK_SCREEN_IMPL_X11(screen)->display) G_END_DECLS #endif /* _GDK_SCREEN_X11_H__ */ diff --git a/gdk/x11/gdkselection-x11.c b/gdk/x11/gdkselection-x11.c index 646ec80c84..3cce042d80 100644 --- a/gdk/x11/gdkselection-x11.c +++ b/gdk/x11/gdkselection-x11.c @@ -186,7 +186,7 @@ gdk_selection_owner_get_for_display (GdkDisplay *display, if (xwindow == None) return NULL; - return gdk_window_lookup (xwindow); + return gdk_window_lookup_for_display (display, xwindow); } #ifndef GDK_MULTIHEAD_SAFE GdkWindow* diff --git a/gdk/x11/gdkwindow-x11.c b/gdk/x11/gdkwindow-x11.c index 0f728eb601..e89115c228 100644 --- a/gdk/x11/gdkwindow-x11.c +++ b/gdk/x11/gdkwindow-x11.c @@ -173,9 +173,11 @@ gdk_window_impl_x11_finalize (GObject *object) if (!GDK_WINDOW_DESTROYED (wrapper)) { - gdk_xid_table_remove (draw_impl->xid); + gdk_xid_table_remove_for_display (GDK_WINDOW_DISPLAY (object), + draw_impl->xid); if (window_impl->focus_window) - gdk_xid_table_remove (window_impl->focus_window); + gdk_xid_table_remove_for_display (GDK_WINDOW_DISPLAY (object), + window_impl->focus_window); } G_OBJECT_CLASS (parent_class)->finalize (object); @@ -305,7 +307,9 @@ _gdk_windowing_window_init (GdkScreen * screen) impl->height = height; screen_impl->colormap_initialised = TRUE; - gdk_xid_table_insert (&screen_impl->xroot_window, screen_impl->root_window); + gdk_xid_table_insert_for_display (screen_impl->display, + &screen_impl->xroot_window, + screen_impl->root_window); } GdkWindow * @@ -530,7 +534,8 @@ gdk_window_new (GdkWindow *parent, xattributes_mask, &xattributes); gdk_drawable_ref (window); - gdk_xid_table_insert (&draw_impl->xid, window); + gdk_xid_table_insert_for_display (screen_impl->display, + &draw_impl->xid, window); gdk_window_set_cursor (window, ((attributes_mask & GDK_WA_CURSOR) ? (attributes->cursor) : @@ -586,7 +591,8 @@ gdk_window_new (GdkWindow *parent, KeyPressMask | KeyReleaseMask | FocusChangeMask); XMapWindow (xdisplay, impl->focus_window); - gdk_xid_table_insert (&impl->focus_window, window); + gdk_xid_table_insert_for_display (screen_impl->display, + &impl->focus_window, window); } size_hints.flags = PSize; @@ -672,7 +678,8 @@ gdk_window_foreign_new_for_display (GdkDisplay *display, draw_impl = GDK_DRAWABLE_IMPL_X11 (private->impl); draw_impl->wrapper = GDK_DRAWABLE (window); - private->parent = gdk_xid_table_lookup (parent); + private->parent = gdk_xid_table_lookup_for_display (display, + parent); parent_private = (GdkWindowObject *)private->parent; @@ -700,16 +707,17 @@ gdk_window_foreign_new_for_display (GdkDisplay *display, _gdk_window_init_position (GDK_WINDOW (private)); gdk_drawable_ref (window); - gdk_xid_table_insert (&GDK_WINDOW_XID (window), window); - + gdk_xid_table_insert_for_display (display, + &GDK_WINDOW_XID (window), window); return window; } - +#ifndef GDK_MULTIHEAD_SAFE GdkWindow * gdk_window_foreign_new (GdkNativeWindow anid) { return gdk_window_foreign_new_for_display (gdk_get_default_display (), anid); } +#endif void _gdk_windowing_window_destroy (GdkWindow *window, @@ -780,9 +788,11 @@ gdk_window_destroy_notify (GdkWindow *window) _gdk_window_destroy (window, TRUE); } - gdk_xid_table_remove (GDK_WINDOW_XID (window)); + gdk_xid_table_remove_for_display (GDK_WINDOW_DISPLAY (window), + GDK_WINDOW_XID (window)); if (window_impl->focus_window) - gdk_xid_table_remove (window_impl->focus_window); + gdk_xid_table_remove_for_display (GDK_WINDOW_DISPLAY (window), + window_impl->focus_window); gdk_drawable_unref (window); } @@ -2132,7 +2142,8 @@ _gdk_windowing_window_get_pointer (GdkWindow *window, &root, &child, &rootx, &rooty, &winx, &winy, &xmask)) { if (child) - return_val = gdk_window_lookup (child); + return_val = gdk_window_lookup_for_display (GDK_WINDOW_DISPLAY (window), + child); } if (x) @@ -3887,10 +3898,10 @@ _gdk_moveresize_configure_done (GdkDisplay * display, XEvent *tmp_event; _MoveResizeData *mv_resize = g_object_get_data (G_OBJECT (display), "moveresize"); - g_assert (mv_resize != NULL); - if (window != g_object_get_data (G_OBJECT (display), "moveresize_window")) return FALSE; + + g_assert (mv_resize != NULL); if (mv_resize->moveresize_pending_event) { @@ -3899,6 +3910,7 @@ _gdk_moveresize_configure_done (GdkDisplay * display, _gdk_moveresize_handle_event (tmp_event); g_free (tmp_event); } + return TRUE; } static void diff --git a/gdk/x11/gdkx.h b/gdk/x11/gdkx.h index 6f25055123..72fd444cd8 100644 --- a/gdk/x11/gdkx.h +++ b/gdk/x11/gdkx.h @@ -138,6 +138,7 @@ GType gdk_gc_x11_get_type (void); #define GDK_IMAGE_XIMAGE(image) (((GdkImagePrivateX11 *) GDK_IMAGE (image)->windowing_data)->ximage) #define GDK_IMAGE_PRIVATE_DATA(image) ((GdkImagePrivateX11 *) GDK_IMAGE (image)->windowing_data) #define GDK_GC_XDISPLAY(gc) (GDK_SCREEN_XDISPLAY(GDK_GC_X11(gc)->screen)) +#define GDK_GC_DISPLAY(gc) (GDK_SCREEN_DISPLAY(GDK_GC_X11(gc)->screen)) #define GDK_COLORMAP_XDISPLAY(cmap) (((GdkColormapPrivateX11 *)GDK_COLORMAP (cmap)->windowing_data)->xdisplay) #define GDK_COLORMAP_XCOLORMAP(cmap) (((GdkColormapPrivateX11 *)GDK_COLORMAP (cmap)->windowing_data)->xcolormap) #define GDK_VISUAL_XVISUAL(vis) (((GdkVisualPrivate *) vis)->xvisual) @@ -165,13 +166,22 @@ Window gdk_get_client_window (Display *display, GdkPixmap *gdk_pixmap_foreign_new_for_screen (GdkScreen * screen, GdkNativeWindow anid); -GdkPixmap *gdk_pixmap_foreign_new (GdkNativeWindow anid); GdkWindow *gdk_window_foreign_new_for_display (GdkDisplay * display, GdkNativeWindow anid); -GdkWindow *gdk_window_foreign_new (GdkNativeWindow anid); /* Return the Gdk* for a particular XID */ -gpointer gdk_xid_table_lookup (XID xid); +gpointer gdk_xid_table_lookup_for_display (GdkDisplay *display, + XID xid); +gpointer gdk_xid_table_lookup_for_all_displays (XID xid); + +#define gdk_window_lookup_for_display(display, xid) \ + ((GdkWindow*) gdk_xid_table_lookup_for_display(display, xid)) +#define gdk_window_lookup_for_all_displays(xid) \ + ((GdkWindow*) gdk_xid_table_lookup_for_all_displays(xid)) +#define gdk_pixmap_lookup_for_display(display , xid) \ + ((GdkPixmap*) gdk_xid_table_lookup_for_display(display, xid)) +#define gdk_pixmap_lookup_for_all_displays(xid) \ + ((GdkPixmap*) gdk_xid_table_lookup_for_all_displays(xid)) guint32 gdk_x11_get_server_time (GdkWindow *window); @@ -180,14 +190,18 @@ gboolean gdk_net_wm_supports_for_screen (GdkScreen *screen, GdkAtom property); #ifndef GDK_MULTIHEAD_SAFE +GdkPixmap *gdk_pixmap_foreign_new (GdkNativeWindow anid); +GdkWindow *gdk_window_foreign_new (GdkNativeWindow anid); +gpointer gdk_xid_table_lookup (XID xid); gboolean gdk_net_wm_supports (GdkAtom property); void gdk_x11_grab_server (); void gdk_x11_ungrab_server (); -#endif #define gdk_window_lookup(xid) ((GdkWindow*) gdk_xid_table_lookup (xid)) #define gdk_pixmap_lookup(xid) ((GdkPixmap*) gdk_xid_table_lookup (xid)) +#endif + GC _gdk_x11_gc_flush (GdkGC *gc); GList *gdk_list_visuals_for_screen (GdkScreen *screen); @@ -220,8 +234,13 @@ struct _GdkFontPrivateX #define GDK_FONT_XDISPLAY(font) (((GdkFontPrivate *) font)->xdisplay) #define GDK_FONT_XFONT(font) (((GdkFontPrivateX *)font)->xfont) +#ifndef GDK_MULTIHEAD_SAFE + #define gdk_font_lookup(xid) ((GdkFont*) gdk_xid_table_lookup (xid)) +#endif /* GDK_MULTIHEAD_SAFE */ +#define gdk_font_lookup_for_display(display, xid) ((GdkFont*) gdk_xid_table_lookup_for_display (display, xid)) + #endif /* GDK_DISABLE_DEPRECATED */ G_END_DECLS diff --git a/gdk/x11/gdkxid.c b/gdk/x11/gdkxid.c index 8c46073a2a..5dbe9660a7 100644 --- a/gdk/x11/gdkxid.c +++ b/gdk/x11/gdkxid.c @@ -25,6 +25,8 @@ */ #include "gdkprivate-x11.h" +#include "gdkdisplay-x11.h" +#include "gdkdisplaymgr-x11.h" #include static guint gdk_xid_hash (XID *xid); @@ -32,9 +34,78 @@ static gboolean gdk_xid_equal (XID *a, XID *b); -static GHashTable *xid_ht = NULL; +void +gdk_xid_table_insert_for_display (GdkDisplay *display, + XID *xid, + gpointer data) +{ + GdkDisplayImplX11 *display_impl; + + g_return_if_fail (xid != NULL); + g_return_if_fail (GDK_IS_DISPLAY (display)); + + display_impl = GDK_DISPLAY_IMPL_X11 (display); + if (!display_impl->xid_ht) + display_impl->xid_ht = g_hash_table_new ((GHashFunc) gdk_xid_hash, + (GEqualFunc) gdk_xid_equal); + g_hash_table_insert (display_impl->xid_ht, xid, data); +} + +void +gdk_xid_table_remove_for_display (GdkDisplay *display, + XID xid) +{ + GdkDisplayImplX11 *display_impl; + + g_return_if_fail (GDK_IS_DISPLAY (display)); + + display_impl = GDK_DISPLAY_IMPL_X11 (display); + + if (!display_impl->xid_ht) + display_impl->xid_ht = g_hash_table_new ((GHashFunc) gdk_xid_hash, + (GEqualFunc) gdk_xid_equal); + + g_hash_table_remove (display_impl->xid_ht, &xid); +} + +gpointer +gdk_xid_table_lookup_for_display (GdkDisplay *display, + XID xid) +{ + GdkDisplayImplX11 *display_impl; + gpointer data = NULL; + + g_return_val_if_fail (GDK_IS_DISPLAY (display), NULL); + + display_impl = GDK_DISPLAY_IMPL_X11 (display); + + if (display_impl->xid_ht) + data = g_hash_table_lookup (display_impl->xid_ht, &xid); + + return data; +} + +gpointer +gdk_xid_table_lookup_for_all_displays (XID xid) +{ + GdkDisplay *tmp_display; + gpointer return_val = NULL; + GSList *tmp_iter = gdk_x11_display_manager_get_open_displays(gdk_get_display_manager ()); + + while (tmp_iter) + { + tmp_display = GDK_DISPLAY (tmp_iter->data); + return_val = gdk_xid_table_lookup_for_display (tmp_display, xid); + if (return_val) + return return_val; + tmp_iter = tmp_iter->next; + } + return FALSE; +} + +#ifndef GDK_MULTIHEAD_SAFE void gdk_xid_table_insert (XID *xid, gpointer data) @@ -68,7 +139,7 @@ gdk_xid_table_lookup (XID xid) return data; } - +#endif static guint gdk_xid_hash (XID *xid) diff --git a/gtk/gtkplug.c b/gtk/gtkplug.c index fb89cc2af6..06d447a708 100644 --- a/gtk/gtkplug.c +++ b/gtk/gtkplug.c @@ -298,12 +298,16 @@ gtk_plug_construct (GtkPlug *plug, { gpointer user_data = NULL; - plug->socket_window = gdk_window_lookup (socket_id); + plug->socket_window = + gdk_window_lookup_for_display (gdk_drawable_get_display (plug->socket_window), + socket_id); if (plug->socket_window) gdk_window_get_user_data (plug->socket_window, &user_data); else - plug->socket_window = gdk_window_foreign_new (socket_id); + plug->socket_window = + gdk_window_foreign_new_for_screen (gdk_drawable_get_screen (plug->socket_window), + socket_id); if (user_data) { @@ -1098,7 +1102,9 @@ gtk_plug_filter_func (GdkXEvent *gdk_xevent, GdkEvent *event, gpointer data) { /* Start of embedding protocol */ - plug->socket_window = gdk_window_lookup (xre->parent); + plug->socket_window = + gdk_window_lookup_for_display (gdk_drawable_get_display (plug->socket_window), + xre->parent); if (plug->socket_window) { gpointer user_data = NULL; @@ -1115,7 +1121,7 @@ gtk_plug_filter_func (GdkXEvent *gdk_xevent, GdkEvent *event, gpointer data) } else { - plug->socket_window = gdk_window_foreign_new (xre->parent); + plug->socket_window = gdk_window_foreign_new_for_screen (gdk_drawable_get_screen (plug->socket_window),xre->parent); if (!plug->socket_window) /* Already gone */ break; } diff --git a/gtk/gtkselection.c b/gtk/gtkselection.c index f41e935bf6..6f02ce4af1 100644 --- a/gtk/gtkselection.c +++ b/gtk/gtkselection.c @@ -1012,10 +1012,13 @@ gtk_selection_request (GtkWidget *widget, /* Create GdkWindow structure for the requestor */ #if defined(GDK_WINDOWING_WIN32) || defined(GDK_WINDOWING_X11) || defined(GDK_WINDOWING_FB) - info->requestor = gdk_window_lookup (event->requestor); + info->requestor = + gdk_window_lookup_for_display (gtk_widget_get_display (widget), + event->requestor); if (!info->requestor) - info->requestor = gdk_window_foreign_new_for_display (gtk_widget_get_display (widget), - event->requestor); + info->requestor = + gdk_window_foreign_new_for_display (gtk_widget_get_display (widget), + event->requestor); #else info->requestor = NULL; #endif diff --git a/gtk/gtksocket.c b/gtk/gtksocket.c index 7b8c2ffa07..a1a14b0df9 100644 --- a/gtk/gtksocket.c +++ b/gtk/gtksocket.c @@ -958,7 +958,7 @@ gtk_socket_add_window (GtkSocket *socket, GtkWidget *widget = GTK_WIDGET (socket); gpointer user_data = NULL; - socket->plug_window = gdk_window_lookup (xid); + socket->plug_window = gdk_window_lookup_for_display (GDK_WINDOW_DISPLAY(socket->plug_window), xid); if (socket->plug_window) { diff --git a/tests/simple.c b/tests/simple.c index b710f8c062..e2c99f26fd 100644 --- a/tests/simple.c +++ b/tests/simple.c @@ -12,32 +12,35 @@ main (int argc, char *argv[]) { GtkWidget *window; GtkWidget *button; - GdkDisplay *dpy2; - GdkScreen *scr2; + /* FIXME: This is not allowable - what is this supposed to be? */ + /* gdk_progclass = g_strdup ("XTerm"); */ gtk_init (&argc, &argv); - dpy2 = gdk_display_init_new (0, NULL, "diabolo:0.0"); - if(!dpy2) - { - printf ("impossible to open display aborting\n"); - exit(0); - } - scr2 = gdk_display_get_default_screen (dpy2); + window = g_object_connect (gtk_widget_new (gtk_window_get_type (), + "user_data", NULL, + "type", GTK_WINDOW_TOPLEVEL, + "title", "hello world", + "allow_grow", FALSE, + "allow_shrink", FALSE, + "border_width", 10, + NULL), + "signal::destroy", gtk_main_quit, NULL, + NULL); +/* button = g_object_connect (gtk_widget_new (gtk_button_get_type (), + "GtkButton::label", "hello world", + "GtkWidget::parent", window, + "GtkWidget::visible", TRUE, + NULL), + "signal::clicked", hello, NULL, + NULL);*/ + button = gtk_entry_new (); + gtk_container_add (GTK_CONTAINER (window), button); + gtk_widget_show (button); + gtk_widget_show (window); + gdk_window_set_decorations (window->window, 0); - g_print ("scr2 = %x\n",scr2); - - window = gtk_widget_new (gtk_invisible_get_type (), - "GtkInvisible::screen", scr2, - NULL); - if (scr2 != gtk_invisible_get_screen (GTK_INVISIBLE (window))) - g_print ("Set property didn't work\n"); - else - g_print ("Set property worked\n"); - -/* gtk_widget_show (window); - - gtk_main ();*/ + gtk_main (); return 0; }