summaryrefslogtreecommitdiff
path: root/gdk/x11/gdkpixmap-x11.c
diff options
context:
space:
mode:
authorOwen Taylor <otaylor@redhat.com>2002-04-25 22:29:14 +0000
committerOwen Taylor <otaylor@src.gnome.org>2002-04-25 22:29:14 +0000
commit425b9886c9e042bc4e8c789e6983127981aca6cf (patch)
tree9ee6face8770b4e4bea7d4b68cb4e31cb2aa86ab /gdk/x11/gdkpixmap-x11.c
parente39e92123b156b6a470d54fd4d9000d7eedcf478 (diff)
downloadgdk-pixbuf-425b9886c9e042bc4e8c789e6983127981aca6cf.tar.gz
Start of integration of Erwann Chenede's multihead work from the
Thu Apr 25 16:51:40 2002 Owen Taylor <otaylor@redhat.com> Start of integration of Erwann Chenede's multihead work from the gtk-multihead branch. * gdk/gdkdisplay.[ch] gdk/gdkscreen.[ch] gdk/x11/gdkdisplay-x11.[ch] gdk/x11/gdkscreen-x11.[ch] New classes representing a set of screens with attached input devices and a single contiguous area, respectively. * gdk/gdk.[ch] gdk/gdkinternals.h gdk/x11/gdkmain-x11.c: gdk/x11/gdkprivate-x11.h: Make the initialization interface simple _gdk_windowing_init() and do the rest in gdk_open_display() calls. * gdk/gdk.[ch]: Add gdk_parse_args() which can be used to do the display-independent part of initialization instead of gdk_init_[check]. * gdk/gdkcursor.h gdk/gdkfont.h gdk/gdkkeys.h gdk/gdkpixmap.h gdk/gdkproperty.h gdk/gdkselection.h gdk/gdkwindow.h: Add multihead variants (_for_display(), for_screen()) of functions getting information specific to a particular screen screen or display. * gdk/gdkscreen.[ch]: Add gdk_screen__* variants of functions like gdk_rgb_get_colormap() that used to get/list global objects. * gdk/x11/gdkx.h: Add functions for converting GdkScreen and GdkDisplay into the X equivalents. * gdk/x11/gdkwindow-x11.c: Removed gdk_window_xid_at_coords() not in the headers and unused. * configure.in gdk/x11/{gxid.c,gxid_lib.[ch],gdkinput-gxi.c}: Remove gxid support ... has not been tested for a long time... "xfree" support is more portable to non XFree86. * gdk/**.h: Add a GDK_MULTIHEAD_SAFE define that can be used to turn off functions that are inherently non-multihead safe. * gdk/**.c: add GDK_NOTE(multihead, ...) calls when functions are used in non-multihead-safe ways. * gdk/*.c gdk/x11/*.c: Changes to make the internals of GDK multihead safe.
Diffstat (limited to 'gdk/x11/gdkpixmap-x11.c')
-rw-r--r--gdk/x11/gdkpixmap-x11.c130
1 files changed, 101 insertions, 29 deletions
diff --git a/gdk/x11/gdkpixmap-x11.c b/gdk/x11/gdkpixmap-x11.c
index 1f335f220..450347c4a 100644
--- a/gdk/x11/gdkpixmap-x11.c
+++ b/gdk/x11/gdkpixmap-x11.c
@@ -36,6 +36,10 @@
#include "gdkpixmap-x11.h"
#include "gdkprivate-x11.h"
+#include "gdkscreen-x11.h"
+#include "gdkdisplay-x11.h"
+
+#include <gdk/gdkinternals.h>
typedef struct
{
@@ -127,14 +131,14 @@ gdk_pixmap_impl_x11_finalize (GObject *object)
GdkDrawableImplX11 *draw_impl = GDK_DRAWABLE_IMPL_X11 (impl);
if (draw_impl->picture)
- XRenderFreePicture (draw_impl->xdisplay, draw_impl->picture);
+ XRenderFreePicture (GDK_PIXMAP_XDISPLAY (wrapper), draw_impl->picture);
}
#endif /* HAVE_XFT */
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 (GDK_PIXMAP_DISPLAY (wrapper), GDK_PIXMAP_XID (wrapper));
G_OBJECT_CLASS (parent_class)->finalize (object);
}
@@ -167,7 +171,11 @@ gdk_pixmap_new (GdkWindow *window,
g_return_val_if_fail ((width != 0) && (height != 0), NULL);
if (!window)
- window = _gdk_parent_root;
+ {
+ GDK_NOTE (MULTIHEAD, g_message ("need to specify the screen parent window "
+ "for gdk_pixmap_new() to be multihead safe"));
+ window = gdk_screen_get_root_window (gdk_get_default_screen ());
+ }
if (GDK_IS_WINDOW (window) && GDK_WINDOW_DESTROYED (window))
return NULL;
@@ -181,7 +189,7 @@ gdk_pixmap_new (GdkWindow *window,
pix_impl = GDK_PIXMAP_IMPL_X11 (GDK_PIXMAP_OBJECT (pixmap)->impl);
draw_impl->wrapper = GDK_DRAWABLE (pixmap);
- draw_impl->xdisplay = GDK_WINDOW_XDISPLAY (window);
+ draw_impl->screen = GDK_WINDOW_SCREEN (window);
draw_impl->xid = XCreatePixmap (GDK_PIXMAP_XDISPLAY (pixmap),
GDK_WINDOW_XID (window),
width, height, depth);
@@ -198,8 +206,8 @@ gdk_pixmap_new (GdkWindow *window,
gdk_drawable_set_colormap (pixmap, cmap);
}
- gdk_xid_table_insert (&draw_impl->xid, pixmap);
-
+ _gdk_xid_table_insert (GDK_WINDOW_DISPLAY (window),
+ &GDK_PIXMAP_XID (pixmap), pixmap);
return pixmap;
}
@@ -217,9 +225,13 @@ gdk_bitmap_create_from_data (GdkWindow *window,
g_return_val_if_fail ((width != 0) && (height != 0), NULL);
g_return_val_if_fail (window == NULL || GDK_IS_DRAWABLE (window), NULL);
- if (!window)
- window = _gdk_parent_root;
-
+ if (!window)
+ {
+ GDK_NOTE (MULTIHEAD, g_message ("need to specify the screen parent window "
+ "for gdk_bitmap_create_from_data() to be multihead safe"));
+ window = gdk_screen_get_root_window (gdk_get_default_screen ());
+ }
+
if (GDK_IS_WINDOW (window) && GDK_WINDOW_DESTROYED (window))
return NULL;
@@ -233,13 +245,13 @@ gdk_bitmap_create_from_data (GdkWindow *window,
pix_impl->height = height;
GDK_PIXMAP_OBJECT (pixmap)->depth = 1;
- draw_impl->xdisplay = GDK_WINDOW_XDISPLAY (window);
+ draw_impl->screen = GDK_WINDOW_SCREEN (window);
draw_impl->xid = XCreateBitmapFromData (GDK_WINDOW_XDISPLAY (window),
GDK_WINDOW_XID (window),
(char *)data, width, height);
- gdk_xid_table_insert (&draw_impl->xid, pixmap);
-
+ _gdk_xid_table_insert (GDK_WINDOW_DISPLAY (window),
+ &GDK_PIXMAP_XID (pixmap), pixmap);
return pixmap;
}
@@ -264,7 +276,11 @@ gdk_pixmap_create_from_data (GdkWindow *window,
g_return_val_if_fail ((width != 0) && (height != 0), NULL);
if (!window)
- window = _gdk_parent_root;
+ {
+ GDK_NOTE (MULTIHEAD, g_message ("need to specify the screen parent window"
+ "for gdk_pixmap_create_from_data() to be multihead safe"));
+ window = gdk_screen_get_root_window (gdk_get_default_screen ());
+ }
if (GDK_IS_WINDOW (window) && GDK_WINDOW_DESTROYED (window))
return NULL;
@@ -282,19 +298,20 @@ gdk_pixmap_create_from_data (GdkWindow *window,
pix_impl->height = height;
GDK_PIXMAP_OBJECT (pixmap)->depth = depth;
- draw_impl->xdisplay = GDK_DRAWABLE_XDISPLAY (window);
+ draw_impl->screen = GDK_DRAWABLE_SCREEN (window);
draw_impl->xid = XCreatePixmapFromBitmapData (GDK_WINDOW_XDISPLAY (window),
GDK_WINDOW_XID (window),
(char *)data, width, height,
fg->pixel, bg->pixel, depth);
- gdk_xid_table_insert (&draw_impl->xid, pixmap);
-
+ _gdk_xid_table_insert (GDK_WINDOW_DISPLAY (window),
+ &GDK_PIXMAP_XID (pixmap), pixmap);
return pixmap;
}
/**
- * gdk_pixmap_foreign_new:
+ * gdk_pixmap_foreign_new_for_display:
+ * @screen : The #GdkScreen the @anid is located.
* @anid: a native pixmap handle.
*
* Wraps a native window in a #GdkPixmap.
@@ -306,8 +323,9 @@ gdk_pixmap_create_from_data (GdkWindow *window,
* Return value: the newly-created #GdkPixmap wrapper for the
* native pixmap or %NULL if the pixmap has been destroyed.
**/
-GdkPixmap*
-gdk_pixmap_foreign_new (GdkNativeWindow anid)
+GdkPixmap *
+gdk_pixmap_foreign_new_for_display (GdkDisplay *display,
+ GdkNativeWindow anid)
{
GdkPixmap *pixmap;
GdkDrawableImplX11 *draw_impl;
@@ -317,27 +335,28 @@ gdk_pixmap_foreign_new (GdkNativeWindow anid)
int x_ret, y_ret;
unsigned int w_ret, h_ret, bw_ret, depth_ret;
+ g_return_val_if_fail (GDK_IS_DISPLAY (display), NULL);
+
/* check to make sure we were passed something at
- least a little sane */
- g_return_val_if_fail((anid != 0), NULL);
+ * least a little sane */
+ g_return_val_if_fail ((anid != 0), NULL);
/* set the pixmap to the passed in value */
xpixmap = anid;
/* get information about the Pixmap to fill in the structure for
the gdk window */
- if (!XGetGeometry(GDK_DISPLAY(),
- xpixmap, &root_return,
- &x_ret, &y_ret, &w_ret, &h_ret, &bw_ret, &depth_ret))
- return NULL;
+ if (!XGetGeometry (GDK_SCREEN_XDISPLAY (display),
+ xpixmap, &root_return,
+ &x_ret, &y_ret, &w_ret, &h_ret, &bw_ret, &depth_ret))
+ return 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->xdisplay = GDK_DISPLAY ();
+ draw_impl->screen = _gdk_x11_display_screen_for_xrootwin (display, root_return);
draw_impl->xid = xpixmap;
pix_impl->is_foreign = TRUE;
@@ -345,12 +364,45 @@ gdk_pixmap_foreign_new (GdkNativeWindow anid)
pix_impl->height = h_ret;
GDK_PIXMAP_OBJECT (pixmap)->depth = depth_ret;
- gdk_xid_table_insert(&draw_impl->xid, pixmap);
+ _gdk_xid_table_insert (display, &GDK_PIXMAP_XID (pixmap), pixmap);
return pixmap;
}
/**
+ * gdk_pixmap_foreign_new:
+ * @anid: a native pixmap handle.
+ *
+ * Wraps a native window for the default display 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
+ * <type>XID</type>.
+ *
+ * Return value: the newly-created #GdkPixmap wrapper for the
+ * native pixmap or %NULL if the pixmap has been destroyed.
+ **/
+GdkPixmap*
+gdk_pixmap_foreign_new (GdkNativeWindow anid)
+{
+ return gdk_pixmap_foreign_new_for_display (gdk_get_default_display (), anid);
+}
+
+/**
+ * gdk_pixmap_get_screen :
+ * @drawable : the #GdkPixmap.
+ *
+ * Returns the #GdkScreen for which the pixmap was created.
+ *
+ * Returns: the #GdkScreen for which the pixmap was created.
+ */
+GdkScreen*
+gdk_pixmap_get_screen (GdkDrawable *drawable)
+{
+ return GDK_PIXMAP_SCREEN (drawable);
+}
+
+/**
* gdk_pixmap_lookup:
* @anid: a native pixmap handle.
*
@@ -365,5 +417,25 @@ gdk_pixmap_foreign_new (GdkNativeWindow anid)
GdkPixmap*
gdk_pixmap_lookup (GdkNativeWindow anid)
{
- return (GdkPixmap*) gdk_xid_table_lookup (anid);
+ return (GdkPixmap*) gdk_xid_table_lookup_for_display (gdk_get_default_display (), anid);
+}
+
+/**
+ * gdk_pixmap_lookup_for_display:
+ * @display : the #GdkDisplay associated with @anid
+ * @anid: a native pixmap handle.
+ *
+ * Looks up the #GdkPixmap that wraps the given native pixmap handle.
+ *
+ * For example in the X backend, a native pixmap handle is an Xlib
+ * <type>XID</type>.
+ *
+ * Return value: the #GdkWindow wrapper for the native window,
+ * or %NULL if there is none.
+ **/
+GdkPixmap*
+gdk_pixmap_lookup_for_display (GdkDisplay *display, GdkNativeWindow anid)
+{
+ g_return_val_if_fail (GDK_IS_DISPLAY (display), NULL);
+ return (GdkPixmap*) gdk_xid_table_lookup_for_display (display, anid);
}