diff --git a/ChangeLog b/ChangeLog index 42df3f9f00..9b4010964b 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,12 @@ 2006-03-29 Matthias Clasen + * gdk/gdk.symbols: + * gdk/gdkpixmap.h: + * gdk/win32/gdkpixmap-win32.c: + * gdk/x11/gdkpixmap-x11.c (gdk_pixmap_foreign_new_for_screen): + New function to allow wrapping a native pixmap without + a server roundtrip. (#334954, David Baron) + * gtk/gtk.symbols: * gtk/gtkrecent*.c: Fix some symbol aliasing glitches. diff --git a/ChangeLog.pre-2-10 b/ChangeLog.pre-2-10 index 42df3f9f00..9b4010964b 100644 --- a/ChangeLog.pre-2-10 +++ b/ChangeLog.pre-2-10 @@ -1,5 +1,12 @@ 2006-03-29 Matthias Clasen + * gdk/gdk.symbols: + * gdk/gdkpixmap.h: + * gdk/win32/gdkpixmap-win32.c: + * gdk/x11/gdkpixmap-x11.c (gdk_pixmap_foreign_new_for_screen): + New function to allow wrapping a native pixmap without + a server roundtrip. (#334954, David Baron) + * gtk/gtk.symbols: * gtk/gtkrecent*.c: Fix some symbol aliasing glitches. diff --git a/docs/reference/gdk/gdk-sections.txt b/docs/reference/gdk/gdk-sections.txt index 7576717bf6..ceb12dc33b 100644 --- a/docs/reference/gdk/gdk-sections.txt +++ b/docs/reference/gdk/gdk-sections.txt @@ -1254,6 +1254,7 @@ gdkx_visual_get gdkx_colormap_get gdk_pixmap_foreign_new gdk_pixmap_foreign_new_for_display +gdk_pixmap_foreign_new_for_screen gdk_window_foreign_new gdk_window_foreign_new_for_display gdk_xid_table_lookup diff --git a/gdk/gdk.symbols b/gdk/gdk.symbols index 9f381a5e6e..908c549c68 100644 --- a/gdk/gdk.symbols +++ b/gdk/gdk.symbols @@ -917,6 +917,7 @@ gdk_pixmap_get_type G_GNUC_CONST gdk_pixmap_create_from_data gdk_pixmap_foreign_new gdk_pixmap_foreign_new_for_display +gdk_pixmap_foreign_new_for_screen gdk_pixmap_lookup gdk_pixmap_lookup_for_display gdk_pixmap_new diff --git a/gdk/gdkpixmap.h b/gdk/gdkpixmap.h index dd34443c36..1f9190b489 100644 --- a/gdk/gdkpixmap.h +++ b/gdk/gdkpixmap.h @@ -108,6 +108,11 @@ GdkPixmap* gdk_pixmap_foreign_new_for_display (GdkDisplay *display, GdkNativeWindow anid); GdkPixmap* gdk_pixmap_lookup_for_display (GdkDisplay *display, GdkNativeWindow anid); +GdkPixmap* gdk_pixmap_foreign_new_for_screen (GdkScreen *screen, + GdkNativeWindow anid, + gint width, + gint height, + gint depth); #ifndef GDK_DISABLE_DEPRECATED #define gdk_bitmap_ref gdk_drawable_ref diff --git a/gdk/win32/gdkpixmap-win32.c b/gdk/win32/gdkpixmap-win32.c index 362ef0759b..29193aeb82 100644 --- a/gdk/win32/gdkpixmap-win32.c +++ b/gdk/win32/gdkpixmap-win32.c @@ -446,6 +446,18 @@ gdk_pixmap_foreign_new_for_display (GdkDisplay *display, return gdk_pixmap_foreign_new (anid); } +GdkPixmap * +gdk_pixmap_foreign_new_for_screen (GdkScreen *screen, + GdkNativeWindow anid, + gint width, + gint height, + gint depth) +{ + g_return_val_if_fail (GDK_IS_SCREEN (screen), NULL); + + return gdk_pixmap_foreign_new (anid); +} + GdkPixmap* gdk_pixmap_foreign_new (GdkNativeWindow anid) { diff --git a/gdk/x11/gdkpixmap-x11.c b/gdk/x11/gdkpixmap-x11.c index 37849dd67b..4f58653d44 100644 --- a/gdk/x11/gdkpixmap-x11.c +++ b/gdk/x11/gdkpixmap-x11.c @@ -344,11 +344,9 @@ GdkPixmap * gdk_pixmap_foreign_new_for_display (GdkDisplay *display, GdkNativeWindow anid) { - GdkPixmap *pixmap; - GdkDrawableImplX11 *draw_impl; - GdkPixmapImplX11 *pix_impl; Pixmap xpixmap; Window root_return; + GdkScreen *screen; int x_ret, y_ret; unsigned int w_ret, h_ret, bw_ret, depth_ret; @@ -367,19 +365,66 @@ gdk_pixmap_foreign_new_for_display (GdkDisplay *display, xpixmap, &root_return, &x_ret, &y_ret, &w_ret, &h_ret, &bw_ret, &depth_ret)) return NULL; + + screen = _gdk_x11_display_screen_for_xrootwin (display, root_return); + return gdk_pixmap_foreign_new_for_screen (screen, anid, w_ret, h_ret, depth_ret); +} + +/** + * gdk_pixmap_foreign_new_for_screen: + * @screen: a #GdkScreen + * @anid: a native pixmap handle + * @width: the width of the pixmap identified by @anid + * @height: the height of the pixmap identified by @anid + * @depth: the depth of the pixmap identified by @anid + * + * Wraps a native pixmap in a #GdkPixmap. + * This may fail if the pixmap has been destroyed. + * + * For example in the X backend, a native pixmap handle is an Xlib + * XID. + * + * This function is an alternative to gdk_pixmap_foreign_new_for_display() + * for cases where the dimensions of the pixmap are known. For the X + * backend, this avoids a roundtrip to the server. + * + * Return value: the newly-created #GdkPixmap wrapper for the + * native pixmap or %NULL if the pixmap has been destroyed. + * + * Since: 2.10 + */ +GdkPixmap * +gdk_pixmap_foreign_new_for_screen (GdkScreen *screen, + GdkNativeWindow anid, + gint width, + gint height, + gint depth) +{ + Pixmap xpixmap; + GdkPixmap *pixmap; + GdkDrawableImplX11 *draw_impl; + GdkPixmapImplX11 *pix_impl; + + g_return_val_if_fail (GDK_IS_SCREEN (screen), NULL); + g_return_val_if_fail (anid != 0, NULL); + g_return_val_if_fail (width > 0, NULL); + g_return_val_if_fail (height > 0, NULL); + g_return_val_if_fail (depth > 0, NULL); pixmap = g_object_new (gdk_pixmap_get_type (), NULL); draw_impl = GDK_DRAWABLE_IMPL_X11 (GDK_PIXMAP_OBJECT (pixmap)->impl); pix_impl = GDK_PIXMAP_IMPL_X11 (GDK_PIXMAP_OBJECT (pixmap)->impl); draw_impl->wrapper = GDK_DRAWABLE (pixmap); - draw_impl->screen = _gdk_x11_display_screen_for_xrootwin (display, root_return); + xpixmap = anid; + + draw_impl->screen = screen; draw_impl->xid = xpixmap; pix_impl->is_foreign = TRUE; - pix_impl->width = w_ret; - pix_impl->height = h_ret; - GDK_PIXMAP_OBJECT (pixmap)->depth = depth_ret; + pix_impl->width = width; + pix_impl->height = height; + GDK_PIXMAP_OBJECT (pixmap)->depth = depth; _gdk_xid_table_insert (display, &GDK_PIXMAP_XID (pixmap), pixmap);