[gtk+/client-side-windows: 36/284] Store colormap on impl window (necessary for e.g. foreign windows)
- From: Alexander Larsson <alexl src gnome org>
- To: svn-commits-list gnome org
- Subject: [gtk+/client-side-windows: 36/284] Store colormap on impl window (necessary for e.g. foreign windows)
- Date: Thu, 2 Apr 2009 14:02:44 -0400 (EDT)
commit bb709321f06997ed1e70198caee38100678b9dbe
Author: Alexander Larsson <alexl redhat com>
Date: Mon Dec 8 12:19:10 2008 +0100
Store colormap on impl window (necessary for e.g. foreign windows)
---
gdk/gdkwindow.c | 35 ++++++++++++++++++++++-------------
gdk/gdkwindow.h | 1 -
gdk/x11/gdkwindow-x11.c | 11 ++++-------
3 files changed, 26 insertions(+), 21 deletions(-)
diff --git a/gdk/gdkwindow.c b/gdk/gdkwindow.c
index a95d69b..2e8abaf 100644
--- a/gdk/gdkwindow.c
+++ b/gdk/gdkwindow.c
@@ -370,9 +370,6 @@ gdk_window_finalize (GObject *object)
if (obj->cursor)
gdk_cursor_unref (obj->cursor);
- if (obj->colormap)
- g_object_unref (obj->colormap);
-
G_OBJECT_CLASS (parent_class)->finalize (object);
}
@@ -668,7 +665,7 @@ gdk_window_new (GdkWindow *parent,
GdkWindowObject *private;
GdkScreen *screen;
GdkVisual *visual;
- int x, y, depth;
+ int x, y;
gboolean native;
GdkEventMask event_mask;
GdkWindow *real_parent;
@@ -774,13 +771,8 @@ gdk_window_new (GdkWindow *parent,
if (attributes->wclass == GDK_INPUT_OUTPUT)
{
- depth = visual->depth;
-
- if (attributes_mask & GDK_WA_COLORMAP)
- private->colormap = g_object_ref (attributes->colormap);
-
private->input_only = FALSE;
- private->depth = depth;
+ private->depth = visual->depth;
private->bg_color.pixel = 0; // TODO: BlackPixel (xdisplay, screen_x11->screen_num);
private->bg_color.red = private->bg_color.green = private->bg_color.blue = 0;
@@ -789,7 +781,6 @@ gdk_window_new (GdkWindow *parent,
}
else
{
- depth = 0;
private->depth = 0;
private->input_only = TRUE;
}
@@ -800,6 +791,12 @@ gdk_window_new (GdkWindow *parent,
native = FALSE; /* Default */
if (GDK_WINDOW_TYPE (private->parent) == GDK_WINDOW_ROOT)
native = TRUE; /* Always use native windows for toplevels */
+ else if (!private->input_only &&
+ ((attributes_mask & GDK_WA_COLORMAP &&
+ attributes->colormap != gdk_drawable_get_colormap ((GdkDrawable *)private->parent)) ||
+ (attributes_mask & GDK_WA_VISUAL &&
+ attributes->visual != gdk_drawable_get_visual ((GdkDrawable *)private->parent))))
+ native = TRUE; /* InputOutput window with different colormap or visual than parent, needs native window */
if (private->window_type == GDK_WINDOW_OFFSCREEN)
{
@@ -1052,6 +1049,7 @@ gdk_window_set_has_native (GdkWindow *window, gboolean has_native)
GdkDrawable *new_impl, *old_impl;
GdkScreen *screen;
GdkVisual *visual;
+ GdkWindowAttr attributes;
g_return_if_fail (GDK_IS_WINDOW (window));
@@ -1077,9 +1075,11 @@ gdk_window_set_has_native (GdkWindow *window, gboolean has_native)
screen = gdk_drawable_get_screen (window);
visual = gdk_drawable_get_visual (window);
+ attributes.colormap = gdk_drawable_get_colormap (window);
+
old_impl = private->impl;
_gdk_window_impl_new (window, (GdkWindow *)private->parent, screen, visual,
- get_native_event_mask (private), NULL, 0);
+ get_native_event_mask (private), &attributes, GDK_WA_COLORMAP);
new_impl = private->impl;
private->impl = old_impl;
@@ -3596,12 +3596,21 @@ static void
gdk_window_real_set_colormap (GdkDrawable *drawable,
GdkColormap *cmap)
{
+ GdkWindowObject *private;
+
g_return_if_fail (GDK_IS_WINDOW (drawable));
if (GDK_WINDOW_DESTROYED (drawable))
return;
+
+ private = (GdkWindowObject *)drawable;
+
+ /* different colormap than parent, requires native window */
+ if (!private->input_only &&
+ cmap != gdk_drawable_get_colormap ((GdkDrawable *)(private->parent)))
+ gdk_window_set_has_native ((GdkWindow *)drawable, TRUE);
- gdk_drawable_set_colormap (((GdkWindowObject*)drawable)->impl, cmap);
+ gdk_drawable_set_colormap (private->impl, cmap);
}
static GdkColormap*
diff --git a/gdk/gdkwindow.h b/gdk/gdkwindow.h
index 7a628b5..5b18ad2 100644
--- a/gdk/gdkwindow.h
+++ b/gdk/gdkwindow.h
@@ -331,7 +331,6 @@ struct _GdkWindowObject
guint32 clip_tag;
GdkRegion *clip_region; /* Clip region (wrt toplevel) in window coords */
GdkRegion *clip_region_with_children; /* Clip region in window coords */
- GdkColormap *colormap;
GdkCursor *cursor;
gint8 toplevel_window_type;
diff --git a/gdk/x11/gdkwindow-x11.c b/gdk/x11/gdkwindow-x11.c
index a133655..21fe7d6 100644
--- a/gdk/x11/gdkwindow-x11.c
+++ b/gdk/x11/gdkwindow-x11.c
@@ -644,7 +644,6 @@ _gdk_window_impl_new (GdkWindow *window,
XSetWindowAttributes xattributes;
long xattributes_mask;
XClassHint *class_hint;
- int depth;
unsigned int class;
const char *title;
@@ -709,12 +708,11 @@ _gdk_window_impl_new (GdkWindow *window,
if (!private->input_only)
{
class = InputOutput;
- depth = visual->depth;
- if (private->colormap)
+ if (attributes_mask & GDK_WA_COLORMAP)
{
- draw_impl->colormap = private->colormap;
- g_object_ref (private->colormap);
+ draw_impl->colormap = attributes->colormap;
+ g_object_ref (attributes->colormap);
}
else
{
@@ -756,7 +754,6 @@ _gdk_window_impl_new (GdkWindow *window,
}
else
{
- depth = 0;
class = InputOnly;
draw_impl->colormap = gdk_screen_get_system_colormap (screen);
g_object_ref (draw_impl->colormap);
@@ -766,7 +763,7 @@ _gdk_window_impl_new (GdkWindow *window,
private->x + private->parent->abs_x,
private->y + private->parent->abs_y,
private->width, private->height,
- 0, depth, class, xvisual,
+ 0, private->depth, class, xvisual,
xattributes_mask, &xattributes);
g_object_ref (window);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]