]> Pileus Git - ~andy/gtk/commitdiff
Use an unused high bit in the XID to mark fonts in the global xid hash
authorMatthias Clasen <mclasen@redhat.com>
Fri, 20 Jan 2006 04:35:24 +0000 (04:35 +0000)
committerMatthias Clasen <matthiasc@src.gnome.org>
Fri, 20 Jan 2006 04:35:24 +0000 (04:35 +0000)
2006-01-19  Matthias Clasen  <mclasen@redhat.com>

* gdk/x11/gdkprivate-x11.h (XID_FONT_BIT):
* gdk/x11/gdkfont-x11.c:
* gdk/x11/gdkxid.c: Use an unused high bit in the
XID to mark fonts in the global xid hash table.

* gdk/x11/gdkcursor-x11.c (update_cursor): Skip fonts
when iterating over the xid hash table, since calling
GDK_IS_WINDOW () on an GdkFont can cause a segfault.
(#327751, Ryan Lortie)

gdk/x11/gdkcursor-x11.c
gdk/x11/gdkfont-x11.c
gdk/x11/gdkprivate-x11.h
gdk/x11/gdkxid.c

index fb4f53b149b628549424ea675a63f062491c47e6..f5e8d15ea80eb867bdb5fdd58130e6ce50a8a2ae 100644 (file)
@@ -430,8 +430,12 @@ update_cursor (gpointer key,
               gpointer value,
               gpointer data)
 {
+  XID *xid = key;
   GdkCursor *cursor;
 
+  if (*xid & XID_FONT_BIT)
+    return;
+
   if (!GDK_IS_WINDOW (value))
     return;
 
index d4c67b401f8e1fabe2ed995491187755b1ead03b..4833283ab0fc31850d88e0e19fa21f7664f3e226 100644 (file)
@@ -50,6 +50,7 @@ struct _GdkFontPrivateX
   GdkDisplay *display;
 
   GSList *names;
+  XID xid;
 };
 
 static GHashTable *
@@ -214,13 +215,14 @@ gdk_font_load_for_display (GdkDisplay  *display,
       private->xfont = xfont;
       private->base.ref_count = 1;
       private->names = NULL;
+      private->xid = xfont->fid | XID_FONT_BIT;
  
       font = (GdkFont*) private;
       font->type = GDK_FONT_FONT;
       font->ascent =  xfont->ascent;
       font->descent = xfont->descent;
       
-      _gdk_xid_table_insert (display, &xfont->fid, font);
+      _gdk_xid_table_insert (display, &private->xid, font);
     }
 
   gdk_font_hash_insert (GDK_FONT_FONT, font, font_name);
index 0bd1868a05924c339118e8c2a11571e669f4f26b..f254deb8fa42ec489ffe77206af0225b127287ad 100644 (file)
@@ -86,6 +86,8 @@ struct _GdkVisualPrivate
   GdkScreen *screen;
 };
 
+#define XID_FONT_BIT (1<<31)
+
 void _gdk_xid_table_insert (GdkDisplay *display,
                            XID        *xid,
                            gpointer    data);
index b192f8c8b88ebf5f0a82ac4d9e8e6c645780e9b8..f336a203154d75e0e6fde5829762328748fb78ae 100644 (file)
@@ -36,6 +36,11 @@ static gboolean  gdk_xid_equal (XID *a,
                                XID *b);
 
 
+/* The 3 high bits of XIDs are unused. We use one to mark fonts, 
+ * since we must be able to skip fonts when iterating over all XIDs.
+ */
+#define XID_FONT_BIT (1<<31)
+
 void
 _gdk_xid_table_insert (GdkDisplay *display,
                       XID        *xid,
@@ -123,7 +128,7 @@ static gboolean
 gdk_xid_equal (XID *a,
               XID *b)
 {
-  return (*a == *b);
+  return ((*a & ~XID_FONT_BIT) == (*b & ~XID_FONT_BIT));
 }
 
 #define __GDK_XID_C__