* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
* Boston, MA 02111-1307, USA.
*/
+
+/*
+ * Modified by the GTK+ Team and others 1997-1999. See the AUTHORS
+ * file for a list of people on the GTK+ Team. See the ChangeLog
+ * files for a list of changes. These files are distributed with
+ * GTK+ at ftp://ftp.gtk.org/pub/gtk/.
+ */
+
#include "config.h"
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <X11/Xlib.h>
-#include "gdk.h"
+#include "gdkpixmap.h"
#include "gdkprivate.h"
+#include "gdkx.h"
typedef struct
{
gulong pixels[1];
} _GdkPixmapInfo;
+GdkDrawableClass _gdk_x11_pixmap_class;
+
+static void
+gdk_x11_pixmap_destroy (GdkPixmap *pixmap)
+{
+ XFreePixmap (GDK_DRAWABLE_XDISPLAY (pixmap), GDK_DRAWABLE_XID (pixmap));
+ gdk_xid_table_remove (GDK_DRAWABLE_XID (pixmap));
+
+ g_free (GDK_DRAWABLE_XDATA (pixmap));
+}
+
+static GdkDrawable *
+gdk_x11_pixmap_alloc (void)
+{
+ GdkDrawable *drawable;
+ GdkDrawablePrivate *private;
+
+ static GdkDrawableClass klass;
+ static gboolean initialized = FALSE;
+
+ if (!initialized)
+ {
+ initialized = TRUE;
+
+ klass = _gdk_x11_drawable_class;
+ klass.destroy = gdk_x11_pixmap_destroy;
+ }
+
+ drawable = gdk_drawable_alloc ();
+ private = (GdkDrawablePrivate *)drawable;
+
+ private->klass = &klass;
+ private->klass_data = g_new (GdkDrawableXData, 1);
+ private->window_type = GDK_DRAWABLE_PIXMAP;
+
+ return drawable;
+}
+
GdkPixmap*
gdk_pixmap_new (GdkWindow *window,
gint width,
gint depth)
{
GdkPixmap *pixmap;
- GdkWindowPrivate *private;
- GdkWindowPrivate *window_private;
+ GdkDrawablePrivate *private;
+ g_return_val_if_fail (window == NULL || GDK_IS_WINDOW (window), NULL);
g_return_val_if_fail ((window != NULL) || (depth != -1), NULL);
g_return_val_if_fail ((width != 0) && (height != 0), NULL);
-
+
if (!window)
- window = (GdkWindow*) &gdk_root_parent;
+ window = gdk_parent_root;
- window_private = (GdkWindowPrivate*) window;
- if (window_private->destroyed)
+ if (GDK_DRAWABLE_DESTROYED (window))
return NULL;
if (depth == -1)
- depth = gdk_window_get_visual (window)->depth;
-
- private = g_new0 (GdkWindowPrivate, 1);
- pixmap = (GdkPixmap*) private;
-
- private->xdisplay = window_private->xdisplay;
- private->window_type = GDK_WINDOW_PIXMAP;
- private->xwindow = XCreatePixmap (private->xdisplay, window_private->xwindow,
- width, height, depth);
- private->colormap = NULL;
- private->parent = NULL;
- private->x = 0;
- private->y = 0;
+ depth = gdk_drawable_get_visual (window)->depth;
+
+ pixmap = gdk_x11_pixmap_alloc ();
+ private = (GdkDrawablePrivate *)pixmap;
+
+ GDK_DRAWABLE_XDATA (private)->xdisplay = GDK_DRAWABLE_XDISPLAY (window);
+ GDK_DRAWABLE_XDATA (private)->xid = XCreatePixmap (GDK_DRAWABLE_XDISPLAY (pixmap),
+ GDK_DRAWABLE_XID (window),
+ width, height, depth);
private->width = width;
private->height = height;
- private->resize_count = 0;
- private->ref_count = 1;
- private->destroyed = 0;
- gdk_xid_table_insert (&private->xwindow, pixmap);
+ gdk_xid_table_insert (&GDK_DRAWABLE_XID (pixmap), pixmap);
return pixmap;
}
gint height)
{
GdkPixmap *pixmap;
- GdkWindowPrivate *private;
- GdkWindowPrivate *window_private;
+ GdkDrawablePrivate *private;
g_return_val_if_fail (data != NULL, NULL);
g_return_val_if_fail ((width != 0) && (height != 0), NULL);
+ g_return_val_if_fail (window == NULL || GDK_IS_WINDOW (window), NULL);
if (!window)
- window = (GdkWindow*) &gdk_root_parent;
+ window = gdk_parent_root;
- window_private = (GdkWindowPrivate*) window;
- if (window_private->destroyed)
+ if (GDK_DRAWABLE_DESTROYED (window))
return NULL;
- private = g_new0 (GdkWindowPrivate, 1);
- pixmap = (GdkPixmap*) private;
+ pixmap = gdk_x11_pixmap_alloc ();
+ private = (GdkDrawablePrivate *)pixmap;
- private->parent = NULL;
- private->xdisplay = window_private->xdisplay;
- private->window_type = GDK_WINDOW_PIXMAP;
- private->x = 0;
- private->y = 0;
private->width = width;
private->height = height;
- private->resize_count = 0;
- private->ref_count = 1;
- private->destroyed = FALSE;
- private->xwindow = XCreateBitmapFromData (private->xdisplay,
- window_private->xwindow,
- (char *)data, width, height);
+ GDK_DRAWABLE_XDATA (private)->xdisplay = GDK_DRAWABLE_XDISPLAY (window);
+ GDK_DRAWABLE_XDATA (private)->xid = XCreateBitmapFromData (GDK_DRAWABLE_XDISPLAY (window),
+ GDK_DRAWABLE_XID (window),
+ (char *)data, width, height);
- gdk_xid_table_insert (&private->xwindow, pixmap);
+ gdk_xid_table_insert (&GDK_DRAWABLE_XID (pixmap), pixmap);
return pixmap;
}
GdkColor *bg)
{
GdkPixmap *pixmap;
- GdkWindowPrivate *private;
- GdkWindowPrivate *window_private;
+ GdkDrawablePrivate *private;
+ g_return_val_if_fail (window == NULL || GDK_IS_WINDOW (window), NULL);
g_return_val_if_fail (data != NULL, NULL);
g_return_val_if_fail (fg != NULL, NULL);
g_return_val_if_fail (bg != NULL, NULL);
g_return_val_if_fail ((width != 0) && (height != 0), NULL);
if (!window)
- window = (GdkWindow*) &gdk_root_parent;
+ window = gdk_parent_root;
- window_private = (GdkWindowPrivate*) window;
- if (window_private->destroyed)
+ if (GDK_DRAWABLE_DESTROYED (window))
return NULL;
if (depth == -1)
- depth = gdk_window_get_visual (window)->depth;
+ depth = gdk_drawable_get_visual (window)->depth;
- private = g_new0 (GdkWindowPrivate, 1);
- pixmap = (GdkPixmap*) private;
+ pixmap = gdk_x11_pixmap_alloc ();
+ private = (GdkDrawablePrivate *)pixmap;
- private->parent = NULL;
- private->xdisplay = window_private->xdisplay;
- private->window_type = GDK_WINDOW_PIXMAP;
- private->x = 0;
- private->y = 0;
private->width = width;
private->height = height;
- private->resize_count = 0;
- private->ref_count = 1;
- private->destroyed = FALSE;
- private->xwindow = XCreatePixmapFromBitmapData (private->xdisplay,
- window_private->xwindow,
- (char *)data, width, height,
- fg->pixel, bg->pixel, depth);
+ GDK_DRAWABLE_XDATA (private)->xdisplay = GDK_DRAWABLE_XDISPLAY (window);
+ GDK_DRAWABLE_XDATA (private)->xid = XCreatePixmapFromBitmapData (GDK_DRAWABLE_XDISPLAY (window),
+ GDK_DRAWABLE_XID (window),
+ (char *)data, width, height,
+ fg->pixel, bg->pixel, depth);
- gdk_xid_table_insert (&private->xwindow, pixmap);
+ gdk_xid_table_insert (&GDK_DRAWABLE_XID (pixmap), pixmap);
return pixmap;
}
{
char instr[1024];
- while (!feof (infile))
+ while (1)
{
- fscanf (infile, "%1023s", instr);
+ if (fscanf (infile, "%1023s", instr) != 1)
+ return FALSE;
+
if (skip_comments == TRUE && strcmp (instr, "/*") == 0)
{
- fscanf (infile, "%1023s", instr);
- while (!feof (infile) && strcmp (instr, "*/") != 0)
- fscanf (infile, "%1023s", instr);
- fscanf(infile, "%1023s", instr);
+ do
+ {
+ if (fscanf (infile, "%1023s", instr) != 1)
+ return FALSE;
+ }
+ while (strcmp (instr, "*/") != 0);
}
- if (strcmp (instr, str)==0)
+ else if (strcmp (instr, str) == 0)
return TRUE;
}
-
- return FALSE;
}
static gint
g_warning ("Creating pixmap from xpm with NULL window and colormap");
if (window == NULL)
- window = (GdkWindow *)&gdk_root_parent;
+ window = gdk_parent_root;
if (colormap == NULL)
{
- colormap = gdk_window_get_colormap (window);
- visual = gdk_window_get_visual (window);
+ colormap = gdk_drawable_get_colormap (window);
+ visual = gdk_drawable_get_visual (window);
}
else
visual = ((GdkColormapPrivate *)colormap)->visual;
color_name = gdk_pixmap_extract_color (buffer);
- if (color_name == NULL ||
+ if (color_name == NULL || g_strcasecmp (color_name, "None") == 0 ||
gdk_color_parse (color_name, &color->color) == FALSE)
{
color->color = *transparent_color;
error:
if (mask)
- gdk_gc_destroy (gc);
+ gdk_gc_unref (gc);
if (image != NULL)
{
gc = gdk_gc_new (pixmap);
gdk_gc_set_foreground (gc, transparent_color);
gdk_draw_image (pixmap, gc, image, 0, 0, 0, 0, image->width, image->height);
- gdk_gc_destroy (gc);
- gdk_image_destroy (image);
+ gdk_gc_unref (gc);
+ gdk_image_unref (image);
}
else if (color_info)
gdk_xpm_destroy_notify (color_info);
gdk_pixmap_foreign_new (guint32 anid)
{
GdkPixmap *pixmap;
- GdkWindowPrivate *window_private;
- GdkWindowPrivate *private;
+ GdkDrawablePrivate *private;
Pixmap xpixmap;
Window root_return;
unsigned int x_ret, y_ret, w_ret, h_ret, bw_ret, depth_ret;
/* set the pixmap to the passed in value */
xpixmap = anid;
- /* get the root window */
- window_private = &gdk_root_parent;
/* get information about the Pixmap to fill in the structure for
the gdk window */
- if (!XGetGeometry(window_private->xdisplay, xpixmap, &root_return,
+ if (!XGetGeometry(GDK_DISPLAY(),
+ xpixmap, &root_return,
&x_ret, &y_ret, &w_ret, &h_ret, &bw_ret, &depth_ret))
return NULL;
- /* allocate a new gdk pixmap */
- private = g_new(GdkWindowPrivate, 1);
- pixmap = (GdkPixmap *)private;
-
- private->xdisplay = window_private->xdisplay;
- private->window_type = GDK_WINDOW_PIXMAP;
- private->xwindow = xpixmap;
- private->colormap = NULL;
- private->parent = NULL;
- private->x = 0;
- private->y = 0;
+ pixmap = gdk_x11_pixmap_alloc ();
+ private = (GdkDrawablePrivate *)pixmap;
+
+ GDK_DRAWABLE_XDATA (private)->xdisplay = GDK_DISPLAY ();
+ GDK_DRAWABLE_XDATA (private)->xid = xpixmap;
+
private->width = w_ret;
private->height = h_ret;
- private->resize_count = 0;
- private->ref_count = 1;
- private->destroyed = 0;
- gdk_xid_table_insert(&private->xwindow, pixmap);
-
- return pixmap;
-}
-
-GdkPixmap*
-gdk_pixmap_ref (GdkPixmap *pixmap)
-{
- GdkWindowPrivate *private = (GdkWindowPrivate *)pixmap;
- g_return_val_if_fail (pixmap != NULL, NULL);
+ gdk_xid_table_insert(&GDK_DRAWABLE_XID (pixmap), pixmap);
- private->ref_count += 1;
return pixmap;
}
-
-void
-gdk_pixmap_unref (GdkPixmap *pixmap)
-{
- GdkWindowPrivate *private = (GdkWindowPrivate *)pixmap;
- g_return_if_fail(pixmap != NULL);
-
- private->ref_count -= 1;
- if (private->ref_count == 0)
- {
- XFreePixmap (private->xdisplay, private->xwindow);
- gdk_xid_table_remove (private->xwindow);
- g_dataset_destroy (private);
- g_free (private);
- }
-}
-
-GdkBitmap *
-gdk_bitmap_ref (GdkBitmap *bitmap)
-{
- return (GdkBitmap *)gdk_pixmap_ref ((GdkPixmap *)bitmap);
-}
-
-void
-gdk_bitmap_unref (GdkBitmap *bitmap)
-{
- gdk_pixmap_unref ((GdkPixmap *)bitmap);
-}