1 /* GDK - The GIMP Drawing Kit
2 * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2 of the License, or (at your option) any later version.
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library; if not, write to the
16 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
17 * Boston, MA 02111-1307, USA.
21 * Modified by the GTK+ Team and others 1997-2005. See the AUTHORS
22 * file for a list of people on the GTK+ Team. See the ChangeLog
23 * files for a list of changes. These files are distributed with
24 * GTK+ at ftp://ftp.gtk.org/pub/gtk/.
30 #include "gdkwindow.h"
31 #include "gdkinternals.h"
32 #include "gdkwindowimpl.h"
33 #include "gdkpixmap.h"
34 #include "gdkdrawable.h"
36 #include "gdkscreen.h"
39 #include "gdkcursor.h"
44 * Offscreen windows can't be the child of a foreign window,
45 * nor contain foreign windows
46 * GDK_POINTER_MOTION_HINT_MASK isn't effective
49 typedef struct _GdkOffscreenWindow GdkOffscreenWindow;
50 typedef struct _GdkOffscreenWindowClass GdkOffscreenWindowClass;
52 struct _GdkOffscreenWindow
54 GdkDrawable parent_instance;
58 GdkColormap *colormap;
64 struct _GdkOffscreenWindowClass
66 GdkDrawableClass parent_class;
69 #define GDK_TYPE_OFFSCREEN_WINDOW (gdk_offscreen_window_get_type())
70 #define GDK_OFFSCREEN_WINDOW(object) (G_TYPE_CHECK_INSTANCE_CAST ((object), GDK_TYPE_OFFSCREEN_WINDOW, GdkOffscreenWindow))
71 #define GDK_IS_OFFSCREEN_WINDOW(object) (G_TYPE_CHECK_INSTANCE_TYPE ((object), GDK_TYPE_OFFSCREEN_WINDOW))
72 #define GDK_OFFSCREEN_WINDOW_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GDK_TYPE_OFFSCREEN_WINDOW, GdkOffscreenWindowClass))
73 #define GDK_IS_OFFSCREEN_WINDOW_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GDK_TYPE_OFFSCREEN_WINDOW))
74 #define GDK_OFFSCREEN_WINDOW_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GDK_TYPE_OFFSCREEN_WINDOW, GdkOffscreenWindowClass))
76 static void gdk_offscreen_window_impl_iface_init (GdkWindowImplIface *iface);
77 static void gdk_offscreen_window_hide (GdkWindow *window);
78 static void gdk_offscreen_window_clear_area (GdkWindow *window,
83 gboolean send_expose);
86 G_DEFINE_TYPE_WITH_CODE (GdkOffscreenWindow,
89 G_IMPLEMENT_INTERFACE (GDK_TYPE_WINDOW_IMPL,
90 gdk_offscreen_window_impl_iface_init));
94 gdk_offscreen_window_finalize (GObject *object)
96 GdkOffscreenWindow *offscreen = GDK_OFFSCREEN_WINDOW (object);
98 if (offscreen->cursor)
99 gdk_cursor_unref (offscreen->cursor);
101 offscreen->cursor = NULL;
103 gdk_pixmap_unref (offscreen->pixmap);
105 G_OBJECT_CLASS (gdk_offscreen_window_parent_class)->finalize (object);
109 gdk_offscreen_window_init (GdkOffscreenWindow *window)
114 _gdk_offscreen_window_destroy (GdkWindow *window,
117 GdkWindowObject *private = GDK_WINDOW_OBJECT (window);
118 GdkOffscreenWindow *offscreen;
120 offscreen = GDK_OFFSCREEN_WINDOW (private->impl);
123 gdk_offscreen_window_hide (window);
125 g_object_unref (offscreen->colormap);
126 offscreen->colormap = NULL;
130 is_parent_of (GdkWindow *parent,
141 w = gdk_window_get_parent (w);
148 gdk_offscreen_window_create_gc (GdkDrawable *drawable,
150 GdkGCValuesMask values_mask)
152 GdkOffscreenWindow *offscreen = GDK_OFFSCREEN_WINDOW (drawable);
154 return gdk_gc_new_with_values (offscreen->pixmap, values, values_mask);
158 gdk_offscreen_window_copy_to_image (GdkDrawable *drawable,
167 GdkOffscreenWindow *offscreen = GDK_OFFSCREEN_WINDOW (drawable);
169 return gdk_drawable_copy_to_image (offscreen->pixmap,
177 static cairo_surface_t *
178 gdk_offscreen_window_ref_cairo_surface (GdkDrawable *drawable)
180 GdkOffscreenWindow *offscreen = GDK_OFFSCREEN_WINDOW (drawable);
182 return _gdk_drawable_ref_cairo_surface (offscreen->pixmap);
186 gdk_offscreen_window_get_colormap (GdkDrawable *drawable)
188 GdkOffscreenWindow *offscreen = GDK_OFFSCREEN_WINDOW (drawable);
190 return offscreen->colormap;
194 gdk_offscreen_window_set_colormap (GdkDrawable *drawable,
195 GdkColormap*colormap)
197 GdkOffscreenWindow *offscreen = GDK_OFFSCREEN_WINDOW (drawable);
199 if (colormap && GDK_WINDOW_DESTROYED (offscreen->wrapper))
202 if (offscreen->colormap == colormap)
205 if (offscreen->colormap)
206 g_object_unref (offscreen->colormap);
208 offscreen->colormap = colormap;
209 if (offscreen->colormap)
210 g_object_ref (offscreen->colormap);
215 gdk_offscreen_window_get_depth (GdkDrawable *drawable)
217 GdkOffscreenWindow *offscreen = GDK_OFFSCREEN_WINDOW (drawable);
219 return gdk_drawable_get_depth (offscreen->wrapper);
223 gdk_offscreen_window_get_source_drawable (GdkDrawable *drawable)
225 GdkOffscreenWindow *offscreen = GDK_OFFSCREEN_WINDOW (drawable);
227 return _gdk_drawable_get_source_drawable (offscreen->pixmap);
231 gdk_offscreen_window_get_composite_drawable (GdkDrawable *drawable,
236 gint *composite_x_offset,
237 gint *composite_y_offset)
239 GdkOffscreenWindow *offscreen = GDK_OFFSCREEN_WINDOW (drawable);
241 return g_object_ref (offscreen->pixmap);
245 gdk_offscreen_window_get_screen (GdkDrawable *drawable)
247 GdkOffscreenWindow *offscreen = GDK_OFFSCREEN_WINDOW (drawable);
249 return offscreen->screen;
253 gdk_offscreen_window_get_visual (GdkDrawable *drawable)
255 GdkOffscreenWindow *offscreen = GDK_OFFSCREEN_WINDOW (drawable);
257 return gdk_drawable_get_visual (offscreen->wrapper);
261 add_damage (GdkOffscreenWindow *offscreen,
273 damage = gdk_region_rectangle (&rect);
274 _gdk_window_add_damage (offscreen->wrapper, damage);
275 gdk_region_destroy (damage);
279 gdk_offscreen_window_draw_drawable (GdkDrawable *drawable,
289 GdkOffscreenWindow *offscreen = GDK_OFFSCREEN_WINDOW (drawable);
290 GdkDrawable *real_drawable = GDK_DRAWABLE (offscreen->pixmap);
292 gdk_draw_drawable (real_drawable, gc,
297 add_damage (offscreen, xdest, ydest, width, height);
301 gdk_offscreen_window_draw_rectangle (GdkDrawable *drawable,
309 GdkOffscreenWindow *offscreen = GDK_OFFSCREEN_WINDOW (drawable);
310 GdkDrawable *real_drawable = GDK_DRAWABLE (offscreen->pixmap);
312 gdk_draw_rectangle (real_drawable,
313 gc, filled, x, y, width, height);
315 add_damage (offscreen, x, y, width, height);
320 gdk_offscreen_window_draw_arc (GdkDrawable *drawable,
330 GdkOffscreenWindow *offscreen = GDK_OFFSCREEN_WINDOW (drawable);
331 GdkDrawable *real_drawable = GDK_DRAWABLE (offscreen->pixmap);
333 gdk_draw_arc (real_drawable,
342 add_damage (offscreen, x, y, width, height);
346 gdk_offscreen_window_draw_polygon (GdkDrawable *drawable,
352 GdkOffscreenWindow *offscreen = GDK_OFFSCREEN_WINDOW (drawable);
353 GdkDrawable *real_drawable = GDK_DRAWABLE (offscreen->pixmap);
355 gdk_draw_polygon (real_drawable,
363 int min_x, min_y, max_x, max_y, i;
365 min_x = max_x = points[0].x;
366 min_y = max_y = points[0].y;
368 for (i = 1; i < npoints; i++)
370 min_x = MIN (min_x, points[i].x);
371 max_x = MAX (max_x, points[i].x);
372 min_y = MIN (min_y, points[i].y);
373 max_y = MAX (max_y, points[i].y);
376 add_damage (offscreen, min_x, min_y,
383 gdk_offscreen_window_draw_text (GdkDrawable *drawable,
391 GdkOffscreenWindow *offscreen = GDK_OFFSCREEN_WINDOW (drawable);
392 GdkDrawable *real_drawable = GDK_DRAWABLE (offscreen->pixmap);
393 GdkWindowObject *private = GDK_WINDOW_OBJECT (offscreen->wrapper);
395 gdk_draw_text (real_drawable,
403 /* Hard to compute the minimal size, not that often used anyway. */
404 add_damage (offscreen, 0, 0, private->width, private->height);
408 gdk_offscreen_window_draw_text_wc (GdkDrawable *drawable,
413 const GdkWChar *text,
416 GdkOffscreenWindow *offscreen = GDK_OFFSCREEN_WINDOW (drawable);
417 GdkDrawable *real_drawable = GDK_DRAWABLE (offscreen->pixmap);
418 GdkWindowObject *private = GDK_WINDOW_OBJECT (offscreen->wrapper);
420 gdk_draw_text_wc (real_drawable,
428 /* Hard to compute the minimal size, not that often used anyway. */
429 add_damage (offscreen, 0, 0, private->width, private->height);
433 gdk_offscreen_window_draw_points (GdkDrawable *drawable,
438 GdkOffscreenWindow *offscreen = GDK_OFFSCREEN_WINDOW (drawable);
439 GdkDrawable *real_drawable = GDK_DRAWABLE (offscreen->pixmap);
441 gdk_draw_points (real_drawable,
449 int min_x, min_y, max_x, max_y, i;
451 min_x = max_x = points[0].x;
452 min_y = max_y = points[0].y;
454 for (i = 1; i < npoints; i++)
456 min_x = MIN (min_x, points[i].x);
457 max_x = MAX (max_x, points[i].x);
458 min_y = MIN (min_y, points[i].y);
459 max_y = MAX (max_y, points[i].y);
462 add_damage (offscreen, min_x, min_y,
469 gdk_offscreen_window_draw_segments (GdkDrawable *drawable,
474 GdkOffscreenWindow *offscreen = GDK_OFFSCREEN_WINDOW (drawable);
475 GdkDrawable *real_drawable = GDK_DRAWABLE (offscreen->pixmap);
477 gdk_draw_segments (real_drawable,
484 int min_x, min_y, max_x, max_y, i;
486 min_x = max_x = segs[0].x1;
487 min_y = max_y = segs[0].y1;
489 for (i = 1; i < nsegs; i++)
491 min_x = MIN (min_x, segs[i].x1);
492 max_x = MAX (max_x, segs[i].x1);
493 min_x = MIN (min_x, segs[i].x2);
494 max_x = MAX (max_x, segs[i].x2);
495 min_y = MIN (min_y, segs[i].y1);
496 max_y = MAX (max_y, segs[i].y1);
497 min_y = MIN (min_y, segs[i].y2);
498 max_y = MAX (max_y, segs[i].y2);
501 add_damage (offscreen, min_x, min_y,
509 gdk_offscreen_window_draw_lines (GdkDrawable *drawable,
514 GdkOffscreenWindow *offscreen = GDK_OFFSCREEN_WINDOW (drawable);
515 GdkDrawable *real_drawable = GDK_DRAWABLE (offscreen->pixmap);
516 GdkWindowObject *private = GDK_WINDOW_OBJECT (offscreen->wrapper);
518 gdk_draw_lines (real_drawable,
523 /* Hard to compute the minimal size, as we don't know the line
524 width, and since joins are hard to calculate.
525 Its not that often used anyway, damage it all */
526 add_damage (offscreen, 0, 0, private->width, private->height);
530 gdk_offscreen_window_draw_image (GdkDrawable *drawable,
540 GdkOffscreenWindow *offscreen = GDK_OFFSCREEN_WINDOW (drawable);
541 GdkDrawable *real_drawable = GDK_DRAWABLE (offscreen->pixmap);
543 gdk_draw_image (real_drawable,
553 add_damage (offscreen, xdest, ydest, width, height);
558 gdk_offscreen_window_draw_pixbuf (GdkDrawable *drawable,
571 GdkOffscreenWindow *offscreen = GDK_OFFSCREEN_WINDOW (drawable);
572 GdkDrawable *real_drawable = GDK_DRAWABLE (offscreen->pixmap);
574 gdk_draw_pixbuf (real_drawable,
587 add_damage (offscreen, dest_x, dest_y, width, height);
592 _gdk_offscreen_window_new (GdkWindow *window,
595 GdkWindowAttr *attributes,
596 gint attributes_mask)
598 GdkWindowObject *parent_private;
599 GdkWindowObject *private;
600 GdkOffscreenWindow *offscreen;
602 g_return_if_fail (attributes != NULL);
604 if (attributes->wclass != GDK_INPUT_OUTPUT)
605 return; /* Can't support input only offscreens */
607 private = (GdkWindowObject *)window;
609 if (private->parent != NULL && GDK_WINDOW_DESTROYED (private->parent))
612 parent_private = (GdkWindowObject*) private->parent;
613 private->impl = g_object_new (GDK_TYPE_OFFSCREEN_WINDOW, NULL);
614 offscreen = GDK_OFFSCREEN_WINDOW (private->impl);
615 offscreen->wrapper = window;
617 offscreen->screen = screen;
619 if (attributes_mask & GDK_WA_COLORMAP)
620 offscreen->colormap = g_object_ref (attributes->colormap);
623 if (gdk_screen_get_system_visual (screen) == visual)
625 offscreen->colormap = gdk_screen_get_system_colormap (screen);
626 g_object_ref (offscreen->colormap);
629 offscreen->colormap = gdk_colormap_new (visual, FALSE);
632 offscreen->pixmap = gdk_pixmap_new ((GdkDrawable *)private->parent,
639 gdk_offscreen_window_reparent (GdkWindow *window,
640 GdkWindow *new_parent,
644 GdkWindowObject *private = (GdkWindowObject *)window;
645 GdkWindowObject *new_parent_private = (GdkWindowObject *)new_parent;
646 GdkWindowObject *old_parent;
647 GdkOffscreenWindow *offscreen;
652 /* No input-output children of input-only windows */
653 if (new_parent_private->input_only && !private->input_only)
656 /* Don't create loops in hierarchy */
657 if (is_parent_of (window, new_parent))
661 offscreen = GDK_OFFSCREEN_WINDOW (private->impl);
663 was_mapped = GDK_WINDOW_IS_MAPPED (window);
665 gdk_window_hide (window);
668 private->parent->children = g_list_remove (private->parent->children, window);
670 old_parent = private->parent;
671 private->parent = new_parent_private;
675 if (new_parent_private)
676 private->parent->children = g_list_prepend (private->parent->children, window);
678 _gdk_syntesize_crossing_events_for_geometry_change (window);
680 _gdk_syntesize_crossing_events_for_geometry_change (GDK_WINDOW (old_parent));
686 gdk_offscreen_window_get_origin (GdkWindow *window,
699 * gdk_window_get_offscreen_pixmap:
700 * @window: a #GdkWindow
702 * Gets the offscreen pixmap that an offscreen window renders into. If
703 * you need to keep this around over window resizes, you need to add a
706 * Returns: The offscreen pixmap, or NULL if not offscreen
709 gdk_window_get_offscreen_pixmap (GdkWindow *window)
711 GdkWindowObject *private = (GdkWindowObject *)window;
712 GdkOffscreenWindow *offscreen;
714 g_return_val_if_fail (GDK_IS_WINDOW (window), FALSE);
716 if (!GDK_IS_OFFSCREEN_WINDOW (private->impl))
719 offscreen = GDK_OFFSCREEN_WINDOW (private->impl);
720 return offscreen->pixmap;
724 gdk_offscreen_window_raise (GdkWindow *window)
726 /* gdk_window_raise already changed the stacking order */
727 _gdk_syntesize_crossing_events_for_geometry_change (window);
731 gdk_offscreen_window_lower (GdkWindow *window)
733 /* gdk_window_lower already changed the stacking order */
734 _gdk_syntesize_crossing_events_for_geometry_change (window);
738 gdk_offscreen_window_move_resize_internal (GdkWindow *window,
743 gboolean send_expose_events)
745 GdkWindowObject *private = (GdkWindowObject *)window;
746 GdkOffscreenWindow *offscreen;
749 GdkPixmap *old_pixmap;
751 offscreen = GDK_OFFSCREEN_WINDOW (private->impl);
758 if (private->destroyed)
763 dw = width - private->width;
764 dh = height - private->height;
769 if (private->width != width ||
770 private->height != height)
772 private->width = width;
773 private->height = height;
775 old_pixmap = offscreen->pixmap;
776 offscreen->pixmap = gdk_pixmap_new (GDK_DRAWABLE (old_pixmap),
781 gc = _gdk_drawable_get_scratch_gc (offscreen->pixmap, FALSE);
782 gdk_draw_drawable (offscreen->pixmap,
787 g_object_unref (old_pixmap);
790 if (GDK_WINDOW_IS_MAPPED (private))
792 // TODO: Only invalidate new area, i.e. for larger windows
793 gdk_window_invalidate_rect (window, NULL, TRUE);
794 _gdk_syntesize_crossing_events_for_geometry_change (window);
799 gdk_offscreen_window_move_resize (GdkWindow *window,
806 GdkWindowObject *private = (GdkWindowObject *)window;
807 GdkOffscreenWindow *offscreen;
809 offscreen = GDK_OFFSCREEN_WINDOW (private->impl);
818 width = private->width;
821 height = private->height;
823 gdk_offscreen_window_move_resize_internal (window, x, y,
829 gdk_offscreen_window_show (GdkWindow *window, gboolean raise)
831 GdkWindowObject *private = (GdkWindowObject *)window;
832 GdkOffscreenWindow *offscreen;
834 if (GDK_WINDOW_IS_MAPPED (window))
837 offscreen = GDK_OFFSCREEN_WINDOW (private->impl);
841 /* gdk_window_show already changed the stacking order if needed */
843 if (private->event_mask & GDK_STRUCTURE_MASK)
844 _gdk_make_event (GDK_WINDOW (private), GDK_MAP, NULL, FALSE);
846 if (private->parent && private->parent->event_mask & GDK_SUBSTRUCTURE_MASK)
847 _gdk_make_event (GDK_WINDOW (private), GDK_MAP, NULL, FALSE);
849 if (gdk_window_is_viewable (window))
850 _gdk_syntesize_crossing_events_for_geometry_change (window);
852 gdk_window_clear_area_e (window, 0, 0,
853 private->width, private->height);
858 gdk_offscreen_window_hide (GdkWindow *window)
860 GdkWindowObject *private;
861 GdkOffscreenWindow *offscreen;
864 g_return_if_fail (window != NULL);
866 private = (GdkWindowObject*) window;
867 offscreen = GDK_OFFSCREEN_WINDOW (private->impl);
869 if (!GDK_WINDOW_IS_MAPPED (private))
872 /* May need to break grabs on children */
873 display = gdk_drawable_get_display (window);
875 if (display->pointer_grab.window != NULL)
877 if (is_parent_of (window, display->pointer_grab.window))
879 /* Call this ourselves, even though gdk_display_pointer_ungrab
880 does so too, since we want to pass implicit == TRUE so the
881 broken grab event is generated */
882 _gdk_display_unset_has_pointer_grab (display,
886 gdk_display_pointer_ungrab (display, GDK_CURRENT_TIME);
890 if (private->event_mask & GDK_STRUCTURE_MASK)
891 _gdk_make_event (GDK_WINDOW (private), GDK_UNMAP, NULL, FALSE);
893 if (private->parent && private->parent->event_mask & GDK_SUBSTRUCTURE_MASK)
894 _gdk_make_event (GDK_WINDOW (private), GDK_UNMAP, NULL, FALSE);
896 private->state = GDK_WINDOW_STATE_WITHDRAWN;
898 _gdk_syntesize_crossing_events_for_geometry_change (window);
902 gdk_offscreen_window_withdraw (GdkWindow *window)
907 gdk_offscreen_window_get_events (GdkWindow *window)
913 gdk_offscreen_window_set_events (GdkWindow *window,
914 GdkEventMask event_mask)
919 setup_backing_rect_gc (GdkWindow *window, int x_offset, int y_offset)
921 GdkWindowObject *private = (GdkWindowObject *)window;
924 if (private->bg_pixmap == GDK_PARENT_RELATIVE_BG && private->parent)
926 x_offset += private->x;
927 y_offset += private->y;
929 return setup_backing_rect_gc (GDK_WINDOW (private->parent), x_offset, y_offset);
931 else if (private->bg_pixmap &&
932 private->bg_pixmap != GDK_PARENT_RELATIVE_BG &&
933 private->bg_pixmap != GDK_NO_BG)
936 GdkGCValues gc_values;
938 gc_values.fill = GDK_TILED;
939 gc_values.tile = private->bg_pixmap;
940 gc_values.ts_x_origin = -x_offset;
941 gc_values.ts_y_origin = -y_offset;
943 gc_mask = GDK_GC_FILL | GDK_GC_TILE | GDK_GC_TS_X_ORIGIN | GDK_GC_TS_Y_ORIGIN;
945 return gdk_gc_new_with_values (window, &gc_values, gc_mask);
949 gc = _gdk_drawable_get_scratch_gc (window, FALSE);
951 gdk_gc_set_foreground (gc, &private->bg_color);
957 gdk_offscreen_window_clear_area (GdkWindow *window,
962 gboolean send_expose)
966 if (GDK_WINDOW_DESTROYED (window))
969 /* Actual drawing is done by gdkwindow.c */
971 gc = setup_backing_rect_gc (window, 0, 0);
972 gdk_draw_rectangle (window, gc, TRUE, x, y, width, height);
977 GdkRectangle visible, rect;
979 visible.x = visible.y = 0;
980 gdk_drawable_get_size (GDK_DRAWABLE (window), &visible.width, &visible.height);
985 rect.height = height;
987 gdk_rectangle_intersect (&rect, &visible, &rect);
989 gdk_window_invalidate_rect (window, &rect, TRUE);
994 gdk_offscreen_window_set_background (GdkWindow *window,
995 const GdkColor *color)
997 GdkWindowObject *private = (GdkWindowObject *)window;
998 GdkColormap *colormap = gdk_drawable_get_colormap (window);
1000 private->bg_color = *color;
1001 gdk_colormap_query_color (colormap, private->bg_color.pixel, &private->bg_color);
1003 if (private->bg_pixmap &&
1004 private->bg_pixmap != GDK_PARENT_RELATIVE_BG &&
1005 private->bg_pixmap != GDK_NO_BG)
1006 g_object_unref (private->bg_pixmap);
1008 private->bg_pixmap = NULL;
1012 gdk_offscreen_window_set_back_pixmap (GdkWindow *window,
1015 GdkWindowObject *private = (GdkWindowObject *)window;
1018 private->bg_pixmap != GDK_PARENT_RELATIVE_BG &&
1019 private->bg_pixmap != GDK_NO_BG &&
1020 !gdk_drawable_get_colormap (pixmap))
1022 g_warning ("gdk_window_set_back_pixmap(): pixmap must have a colormap");
1026 if (private->bg_pixmap &&
1027 private->bg_pixmap != GDK_PARENT_RELATIVE_BG &&
1028 private->bg_pixmap != GDK_NO_BG)
1029 g_object_unref (private->bg_pixmap);
1031 private->bg_pixmap = pixmap;
1034 private->bg_pixmap != GDK_PARENT_RELATIVE_BG &&
1035 private->bg_pixmap != GDK_NO_BG)
1036 g_object_ref (pixmap);
1040 gdk_offscreen_window_shape_combine_mask (GdkWindow *window,
1048 gdk_offscreen_window_shape_combine_region (GdkWindow *window,
1049 const GdkRegion *shape_region,
1056 gdk_offscreen_window_set_child_shapes (GdkWindow *window)
1061 gdk_offscreen_window_merge_child_shapes (GdkWindow *window)
1066 gdk_offscreen_window_set_static_gravities (GdkWindow *window,
1067 gboolean use_static)
1073 gdk_offscreen_window_set_cursor (GdkWindow *window,
1076 GdkWindowObject *private = (GdkWindowObject *)window;
1077 GdkOffscreenWindow *offscreen;
1079 offscreen = GDK_OFFSCREEN_WINDOW (private->impl);
1081 if (offscreen->cursor)
1083 gdk_cursor_unref (offscreen->cursor);
1084 offscreen->cursor = NULL;
1088 offscreen->cursor = gdk_cursor_ref (cursor);
1090 /* TODO: The cursor is never actually used... */
1094 gdk_offscreen_window_get_geometry (GdkWindow *window,
1101 GdkWindowObject *private = (GdkWindowObject *)window;
1102 GdkOffscreenWindow *offscreen;
1104 offscreen = GDK_OFFSCREEN_WINDOW (private->impl);
1106 g_return_if_fail (window == NULL || GDK_IS_WINDOW (window));
1108 if (!GDK_WINDOW_DESTROYED (window))
1115 *width = private->width;
1117 *height = private->height;
1119 *depth = private->depth;
1124 * gdk_window_set_offscreen_hooks:
1125 * @offscreen_window: a offscreen #GdkWindow
1126 * @hooks: a table of pointers to functions for handling offscreen
1127 * window coordinates translations
1129 * Sets the parent-to-offscreen-child and offscreen-child-to-parent coordinate
1130 * translation functions for offscreen windows.
1132 * This function is useful for complex widgets employing
1133 * offscreen windows.
1138 gdk_window_set_offscreen_hooks (GdkWindow *offscreen_window,
1139 const GdkOffscreenChildHooks *hooks)
1141 GdkWindowObject *private;
1143 g_return_if_fail (GDK_IS_WINDOW (offscreen_window));
1144 g_return_if_fail (hooks != NULL);
1146 private = (GdkWindowObject *) offscreen_window;
1148 private->offscreen_hooks = hooks;
1152 gdk_offscreen_window_queue_antiexpose (GdkWindow *window,
1159 gdk_offscreen_window_class_init (GdkOffscreenWindowClass *klass)
1161 GdkDrawableClass *drawable_class = GDK_DRAWABLE_CLASS (klass);
1162 GObjectClass *object_class = G_OBJECT_CLASS (klass);
1164 object_class->finalize = gdk_offscreen_window_finalize;
1166 drawable_class->create_gc = gdk_offscreen_window_create_gc;
1167 drawable_class->_copy_to_image = gdk_offscreen_window_copy_to_image;
1168 drawable_class->ref_cairo_surface = gdk_offscreen_window_ref_cairo_surface;
1169 drawable_class->set_colormap = gdk_offscreen_window_set_colormap;
1170 drawable_class->get_colormap = gdk_offscreen_window_get_colormap;
1171 drawable_class->get_depth = gdk_offscreen_window_get_depth;
1172 drawable_class->get_screen = gdk_offscreen_window_get_screen;
1173 drawable_class->get_visual = gdk_offscreen_window_get_visual;
1174 drawable_class->get_source_drawable = gdk_offscreen_window_get_source_drawable;
1175 drawable_class->get_composite_drawable = gdk_offscreen_window_get_composite_drawable;
1177 drawable_class->draw_rectangle = gdk_offscreen_window_draw_rectangle;
1178 drawable_class->draw_arc = gdk_offscreen_window_draw_arc;
1179 drawable_class->draw_polygon = gdk_offscreen_window_draw_polygon;
1180 drawable_class->draw_text = gdk_offscreen_window_draw_text;
1181 drawable_class->draw_text_wc = gdk_offscreen_window_draw_text_wc;
1182 drawable_class->draw_drawable = gdk_offscreen_window_draw_drawable;
1183 drawable_class->draw_points = gdk_offscreen_window_draw_points;
1184 drawable_class->draw_segments = gdk_offscreen_window_draw_segments;
1185 drawable_class->draw_lines = gdk_offscreen_window_draw_lines;
1186 drawable_class->draw_image = gdk_offscreen_window_draw_image;
1187 drawable_class->draw_pixbuf = gdk_offscreen_window_draw_pixbuf;
1191 gdk_offscreen_window_impl_iface_init (GdkWindowImplIface *iface)
1193 iface->show = gdk_offscreen_window_show;
1194 iface->hide = gdk_offscreen_window_hide;
1195 iface->withdraw = gdk_offscreen_window_withdraw;
1196 iface->raise = gdk_offscreen_window_raise;
1197 iface->lower = gdk_offscreen_window_lower;
1198 iface->move_resize = gdk_offscreen_window_move_resize;
1199 iface->set_background = gdk_offscreen_window_set_background;
1200 iface->set_back_pixmap = gdk_offscreen_window_set_back_pixmap;
1201 iface->get_events = gdk_offscreen_window_get_events;
1202 iface->set_events = gdk_offscreen_window_set_events;
1203 iface->clear_area = gdk_offscreen_window_clear_area;
1204 iface->reparent = gdk_offscreen_window_reparent;
1205 iface->set_cursor = gdk_offscreen_window_set_cursor;
1206 iface->get_geometry = gdk_offscreen_window_get_geometry;
1207 iface->shape_combine_mask = gdk_offscreen_window_shape_combine_mask;
1208 iface->shape_combine_region = gdk_offscreen_window_shape_combine_region;
1209 iface->set_child_shapes = gdk_offscreen_window_set_child_shapes;
1210 iface->merge_child_shapes = gdk_offscreen_window_merge_child_shapes;
1211 iface->set_static_gravities = gdk_offscreen_window_set_static_gravities;
1212 iface->queue_antiexpose = gdk_offscreen_window_queue_antiexpose;
1213 iface->get_origin = gdk_offscreen_window_get_origin;
1216 #define __GDK_OFFSCREEN_WINDOW_C__
1217 #include "gdkaliasdef.c"