[gtk+/rendering-cleanup: 137/144] x11: Keep a default X Colormap in every visual to construct windows with
- From: Benjamin Otte <otte src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk+/rendering-cleanup: 137/144] x11: Keep a default X Colormap in every visual to construct windows with
- Date: Thu, 23 Sep 2010 21:28:52 +0000 (UTC)
commit cdcc17eec923974883c28dc80764774d6794ee63
Author: Benjamin Otte <otte redhat com>
Date: Sun Aug 29 17:48:58 2010 +0200
x11: Keep a default X Colormap in every visual to construct windows with
This way, we can specify a colormap when constructing windows. And ew
must do that to avoid BadMatch from XCreateWindow when we use a
different visual.
gdk/x11/gdkprivate-x11.h | 2 +
gdk/x11/gdkvisual-x11.c | 51 +++++++++++++++++++++++++++++++++++++++++++++-
gdk/x11/gdkwindow-x11.c | 2 +-
3 files changed, 53 insertions(+), 2 deletions(-)
---
diff --git a/gdk/x11/gdkprivate-x11.h b/gdk/x11/gdkprivate-x11.h
index 2e2edd4..87dfaf3 100644
--- a/gdk/x11/gdkprivate-x11.h
+++ b/gdk/x11/gdkprivate-x11.h
@@ -56,6 +56,8 @@ struct _GdkCursorPrivate
void _gdk_x11_error_handler_push (void);
void _gdk_x11_error_handler_pop (void);
+Colormap _gdk_visual_get_x11_colormap (GdkVisual *visual);
+
void _gdk_xid_table_insert (GdkDisplay *display,
XID *xid,
gpointer data);
diff --git a/gdk/x11/gdkvisual-x11.c b/gdk/x11/gdkvisual-x11.c
index 051f19a..a4d639d 100644
--- a/gdk/x11/gdkvisual-x11.c
+++ b/gdk/x11/gdkvisual-x11.c
@@ -38,6 +38,7 @@ struct _GdkVisualPrivate
{
Visual *xvisual;
GdkScreen *screen;
+ Colormap colormap;
};
struct _GdkVisualClass
@@ -71,11 +72,25 @@ static const gchar *const visual_names[] =
G_DEFINE_TYPE (GdkVisual, gdk_visual, G_TYPE_OBJECT)
static void
+gdk_visual_finalize (GObject *object)
+{
+ GdkVisualPrivate *priv = (GdkVisualPrivate *) object;
+
+ if (priv->colormap != None)
+ XFreeColormap (GDK_SCREEN_XDISPLAY (priv->screen),
+ priv->colormap);
+
+ G_OBJECT_CLASS (gdk_visual_parent_class)->finalize (object);
+}
+
+static void
gdk_visual_class_init (GdkVisualClass *visual_class)
{
GObjectClass *object_class = G_OBJECT_CLASS (visual_class);
g_type_class_add_private (object_class, sizeof (GdkVisualPrivate));
+
+ object_class->finalize = gdk_visual_finalize;
}
static void
@@ -84,6 +99,8 @@ gdk_visual_init (GdkVisual *visual)
visual->priv = G_TYPE_INSTANCE_GET_PRIVATE (visual,
GDK_TYPE_VISUAL,
GdkVisualPrivate);
+
+ visual->priv->colormap = None;
}
void
@@ -241,7 +258,11 @@ _gdk_visual_init (GdkScreen *screen)
for (i = 0; i < nvisuals; i++)
{
if (default_xvisual->visualid == visuals[i]->priv->xvisual->visualid)
- screen_x11->system_visual = visuals[i];
+ {
+ screen_x11->system_visual = visuals[i];
+ visuals[i]->priv->colormap = DefaultColormap (screen_x11->xdisplay,
+ screen_x11->screen_num);
+ }
/* For now, we only support 8888 ARGB for the "rgba visual".
* Additional formats (like ABGR) could be added later if they
@@ -633,6 +654,34 @@ gdk_visual_equal (Visual *a,
}
/**
+ * _gdk_visual_get_x11_colormap:
+ * @visual: the visual to get the colormap from
+ *
+ * Gets the colormap to use
+ *
+ * Returns: the X Colormap to use for new windows using @visual
+ **/
+Colormap
+_gdk_visual_get_x11_colormap (GdkVisual *visual)
+{
+ GdkVisualPrivate *priv;
+
+ g_return_val_if_fail (GDK_IS_VISUAL (visual), None);
+
+ priv = visual->priv;
+
+ if (priv->colormap == None)
+ {
+ priv->colormap = XCreateColormap (GDK_SCREEN_XDISPLAY (priv->screen),
+ GDK_SCREEN_XROOTWIN (priv->screen),
+ GDK_VISUAL_XVISUAL (visual),
+ AllocNone);
+ }
+
+ return priv->colormap;
+}
+
+/**
* gdk_x11_visual_get_xvisual:
* @visual: a #GdkVisual.
*
diff --git a/gdk/x11/gdkwindow-x11.c b/gdk/x11/gdkwindow-x11.c
index 820b379..bbdd080 100644
--- a/gdk/x11/gdkwindow-x11.c
+++ b/gdk/x11/gdkwindow-x11.c
@@ -784,7 +784,7 @@ _gdk_window_impl_new (GdkWindow *window,
xattributes_mask |= CWBitGravity;
- xattributes.colormap = GDK_COLORMAP_XCOLORMAP (draw_impl->colormap);
+ xattributes.colormap = _gdk_visual_get_x11_colormap (private->visual);
xattributes_mask |= CWColormap;
if (private->window_type == GDK_WINDOW_TEMP)
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]