Store colormap on impl window (necessary for e.g. foreign windows)

This commit is contained in:
Alexander Larsson 2008-12-08 12:19:10 +01:00 committed by Alexander Larsson
parent 2fa6f32d8e
commit bb709321f0
3 changed files with 26 additions and 21 deletions

View File

@ -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*

View File

@ -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;

View File

@ -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);