]> Pileus Git - ~andy/gtk/blobdiff - gdk/x11/gdkpixmap-x11.c
Merges from gtk-1-2
[~andy/gtk] / gdk / x11 / gdkpixmap-x11.c
index 8df3145d7d06853efab7b3c8106d1233036758fe..45807cb6136ceb6051577fc62afb7c92448634fd 100644 (file)
  * 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>
@@ -24,8 +32,9 @@
 #include <unistd.h>
 #include <X11/Xlib.h>
 
-#include "gdk.h"
+#include "gdkpixmap.h"
 #include "gdkprivate.h"
+#include "gdkx.h"
 
 typedef struct
 {
@@ -41,6 +50,44 @@ 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,
@@ -48,40 +95,32 @@ gdk_pixmap_new (GdkWindow *window,
                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;
 }
@@ -93,38 +132,30 @@ gdk_bitmap_create_from_data (GdkWindow   *window,
                             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;
 }
@@ -139,9 +170,9 @@ gdk_pixmap_create_from_data (GdkWindow   *window,
                             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);
@@ -149,35 +180,27 @@ gdk_pixmap_create_from_data (GdkWindow   *window,
   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;
 }
@@ -189,21 +212,23 @@ gdk_pixmap_seek_string (FILE  *infile,
 {
   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
@@ -448,12 +473,12 @@ _gdk_pixmap_create_from_xpm (GdkWindow  *window,
     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;
@@ -510,7 +535,7 @@ _gdk_pixmap_create_from_xpm (GdkWindow  *window,
       
       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;
@@ -593,7 +618,7 @@ _gdk_pixmap_create_from_xpm (GdkWindow  *window,
  error:
   
   if (mask)
-    gdk_gc_destroy (gc);
+    gdk_gc_unref (gc);
   
   if (image != NULL)
     {
@@ -606,8 +631,8 @@ _gdk_pixmap_create_from_xpm (GdkWindow  *window,
       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);
@@ -752,8 +777,7 @@ GdkPixmap*
 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;
@@ -764,71 +788,24 @@ gdk_pixmap_foreign_new (guint32 anid)
   
   /* 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);
-}