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;
65 struct _GdkOffscreenWindowClass
67 GdkDrawableClass parent_class;
70 #define GDK_TYPE_OFFSCREEN_WINDOW (gdk_offscreen_window_get_type())
71 #define GDK_OFFSCREEN_WINDOW(object) (G_TYPE_CHECK_INSTANCE_CAST ((object), GDK_TYPE_OFFSCREEN_WINDOW, GdkOffscreenWindow))
72 #define GDK_IS_OFFSCREEN_WINDOW(object) (G_TYPE_CHECK_INSTANCE_TYPE ((object), GDK_TYPE_OFFSCREEN_WINDOW))
73 #define GDK_OFFSCREEN_WINDOW_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GDK_TYPE_OFFSCREEN_WINDOW, GdkOffscreenWindowClass))
74 #define GDK_IS_OFFSCREEN_WINDOW_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GDK_TYPE_OFFSCREEN_WINDOW))
75 #define GDK_OFFSCREEN_WINDOW_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GDK_TYPE_OFFSCREEN_WINDOW, GdkOffscreenWindowClass))
77 static void gdk_offscreen_window_impl_iface_init (GdkWindowImplIface *iface);
78 static void gdk_offscreen_window_hide (GdkWindow *window);
80 G_DEFINE_TYPE_WITH_CODE (GdkOffscreenWindow,
83 G_IMPLEMENT_INTERFACE (GDK_TYPE_WINDOW_IMPL,
84 gdk_offscreen_window_impl_iface_init));
88 gdk_offscreen_window_finalize (GObject *object)
90 GdkOffscreenWindow *offscreen = GDK_OFFSCREEN_WINDOW (object);
92 if (offscreen->cursor)
93 gdk_cursor_unref (offscreen->cursor);
95 offscreen->cursor = NULL;
97 g_object_unref (offscreen->pixmap);
99 G_OBJECT_CLASS (gdk_offscreen_window_parent_class)->finalize (object);
103 gdk_offscreen_window_init (GdkOffscreenWindow *window)
108 gdk_offscreen_window_destroy (GdkWindow *window,
110 gboolean foreign_destroy)
112 GdkWindowObject *private = GDK_WINDOW_OBJECT (window);
113 GdkOffscreenWindow *offscreen;
115 offscreen = GDK_OFFSCREEN_WINDOW (private->impl);
117 gdk_offscreen_window_set_embedder (window, NULL);
120 gdk_offscreen_window_hide (window);
122 g_object_unref (offscreen->colormap);
123 offscreen->colormap = NULL;
127 is_parent_of (GdkWindow *parent,
138 w = gdk_window_get_parent (w);
145 gdk_offscreen_window_create_gc (GdkDrawable *drawable,
147 GdkGCValuesMask values_mask)
149 GdkOffscreenWindow *offscreen = GDK_OFFSCREEN_WINDOW (drawable);
151 return gdk_gc_new_with_values (offscreen->pixmap, values, values_mask);
154 static cairo_surface_t *
155 gdk_offscreen_window_ref_cairo_surface (GdkDrawable *drawable)
157 GdkOffscreenWindow *offscreen = GDK_OFFSCREEN_WINDOW (drawable);
159 return _gdk_drawable_ref_cairo_surface (offscreen->pixmap);
163 gdk_offscreen_window_get_colormap (GdkDrawable *drawable)
165 GdkOffscreenWindow *offscreen = GDK_OFFSCREEN_WINDOW (drawable);
167 return offscreen->colormap;
171 gdk_offscreen_window_set_colormap (GdkDrawable *drawable,
172 GdkColormap*colormap)
174 GdkOffscreenWindow *offscreen = GDK_OFFSCREEN_WINDOW (drawable);
176 if (colormap && GDK_WINDOW_DESTROYED (offscreen->wrapper))
179 if (offscreen->colormap == colormap)
182 if (offscreen->colormap)
183 g_object_unref (offscreen->colormap);
185 offscreen->colormap = colormap;
186 if (offscreen->colormap)
187 g_object_ref (offscreen->colormap);
192 gdk_offscreen_window_get_depth (GdkDrawable *drawable)
194 GdkOffscreenWindow *offscreen = GDK_OFFSCREEN_WINDOW (drawable);
196 return gdk_drawable_get_depth (offscreen->wrapper);
200 gdk_offscreen_window_get_source_drawable (GdkDrawable *drawable)
202 GdkOffscreenWindow *offscreen = GDK_OFFSCREEN_WINDOW (drawable);
204 return _gdk_drawable_get_source_drawable (offscreen->pixmap);
208 gdk_offscreen_window_get_composite_drawable (GdkDrawable *drawable,
213 gint *composite_x_offset,
214 gint *composite_y_offset)
216 GdkOffscreenWindow *offscreen = GDK_OFFSCREEN_WINDOW (drawable);
218 return g_object_ref (offscreen->pixmap);
222 gdk_offscreen_window_get_screen (GdkDrawable *drawable)
224 GdkOffscreenWindow *offscreen = GDK_OFFSCREEN_WINDOW (drawable);
226 return offscreen->screen;
230 gdk_offscreen_window_get_visual (GdkDrawable *drawable)
232 GdkOffscreenWindow *offscreen = GDK_OFFSCREEN_WINDOW (drawable);
234 return gdk_drawable_get_visual (offscreen->wrapper);
238 add_damage (GdkOffscreenWindow *offscreen,
244 cairo_region_t *damage;
253 /* This should really take into account line width, line
254 * joins (and miter) and line caps. But these are hard
255 * to compute, rarely used and generally a pain. And in
256 * the end a snug damage rectangle is not that important
257 * as multiple damages are generally created anyway.
259 * So, we just add some padding around the rect.
260 * We use a padding of 3 pixels, plus an extra row
261 * below and on the right for the normal line size. I.E.
262 * line from (0,0) to (2,0) gets h=0 but is really
263 * at least one pixel tall.
271 damage = cairo_region_create_rectangle (&rect);
272 _gdk_window_add_damage (offscreen->wrapper, damage);
273 cairo_region_destroy (damage);
277 get_real_drawable (GdkOffscreenWindow *offscreen)
279 GdkPixmapObject *pixmap;
280 pixmap = (GdkPixmapObject *) offscreen->pixmap;
281 return GDK_DRAWABLE (pixmap->impl);
285 gdk_offscreen_window_draw_drawable (GdkDrawable *drawable,
294 GdkDrawable *original_src)
296 GdkOffscreenWindow *offscreen = GDK_OFFSCREEN_WINDOW (drawable);
297 GdkDrawable *real_drawable = get_real_drawable (offscreen);
299 gdk_draw_drawable (real_drawable, gc,
304 add_damage (offscreen, xdest, ydest, width, height, FALSE);
308 gdk_offscreen_window_draw_rectangle (GdkDrawable *drawable,
316 GdkOffscreenWindow *offscreen = GDK_OFFSCREEN_WINDOW (drawable);
317 GdkDrawable *real_drawable = get_real_drawable (offscreen);
319 gdk_draw_rectangle (real_drawable,
320 gc, filled, x, y, width, height);
322 add_damage (offscreen, x, y, width, height, !filled);
327 gdk_offscreen_window_draw_arc (GdkDrawable *drawable,
337 GdkOffscreenWindow *offscreen = GDK_OFFSCREEN_WINDOW (drawable);
338 GdkDrawable *real_drawable = get_real_drawable (offscreen);
340 gdk_draw_arc (real_drawable,
349 add_damage (offscreen, x, y, width, height, !filled);
353 gdk_offscreen_window_draw_polygon (GdkDrawable *drawable,
359 GdkOffscreenWindow *offscreen = GDK_OFFSCREEN_WINDOW (drawable);
360 GdkDrawable *real_drawable = get_real_drawable (offscreen);
362 gdk_draw_polygon (real_drawable,
370 int min_x, min_y, max_x, max_y, i;
372 min_x = max_x = points[0].x;
373 min_y = max_y = points[0].y;
375 for (i = 1; i < npoints; i++)
377 min_x = MIN (min_x, points[i].x);
378 max_x = MAX (max_x, points[i].x);
379 min_y = MIN (min_y, points[i].y);
380 max_y = MAX (max_y, points[i].y);
383 add_damage (offscreen, min_x, min_y,
385 max_y - min_y, !filled);
390 gdk_offscreen_window_draw_points (GdkDrawable *drawable,
395 GdkOffscreenWindow *offscreen = GDK_OFFSCREEN_WINDOW (drawable);
396 GdkDrawable *real_drawable = get_real_drawable (offscreen);
398 gdk_draw_points (real_drawable,
406 int min_x, min_y, max_x, max_y, i;
408 min_x = max_x = points[0].x;
409 min_y = max_y = points[0].y;
411 for (i = 1; i < npoints; i++)
413 min_x = MIN (min_x, points[i].x);
414 max_x = MAX (max_x, points[i].x);
415 min_y = MIN (min_y, points[i].y);
416 max_y = MAX (max_y, points[i].y);
419 add_damage (offscreen, min_x, min_y,
427 gdk_offscreen_window_draw_segments (GdkDrawable *drawable,
432 GdkOffscreenWindow *offscreen = GDK_OFFSCREEN_WINDOW (drawable);
433 GdkDrawable *real_drawable = get_real_drawable (offscreen);
435 gdk_draw_segments (real_drawable,
442 int min_x, min_y, max_x, max_y, i;
444 min_x = max_x = segs[0].x1;
445 min_y = max_y = segs[0].y1;
447 for (i = 0; i < nsegs; i++)
449 min_x = MIN (min_x, segs[i].x1);
450 max_x = MAX (max_x, segs[i].x1);
451 min_x = MIN (min_x, segs[i].x2);
452 max_x = MAX (max_x, segs[i].x2);
453 min_y = MIN (min_y, segs[i].y1);
454 max_y = MAX (max_y, segs[i].y1);
455 min_y = MIN (min_y, segs[i].y2);
456 max_y = MAX (max_y, segs[i].y2);
459 add_damage (offscreen, min_x, min_y,
461 max_y - min_y, TRUE);
467 gdk_offscreen_window_draw_lines (GdkDrawable *drawable,
472 GdkOffscreenWindow *offscreen = GDK_OFFSCREEN_WINDOW (drawable);
473 GdkDrawable *real_drawable = get_real_drawable (offscreen);
474 GdkWindowObject *private = GDK_WINDOW_OBJECT (offscreen->wrapper);
476 gdk_draw_lines (real_drawable,
481 /* Hard to compute the minimal size, as we don't know the line
482 width, and since joins are hard to calculate.
483 Its not that often used anyway, damage it all */
484 add_damage (offscreen, 0, 0, private->width, private->height, TRUE);
488 _gdk_offscreen_window_new (GdkWindow *window,
491 GdkWindowAttr *attributes,
492 gint attributes_mask)
494 GdkWindowObject *private;
495 GdkOffscreenWindow *offscreen;
497 g_return_if_fail (attributes != NULL);
499 if (attributes->wclass != GDK_INPUT_OUTPUT)
500 return; /* Can't support input only offscreens */
502 private = (GdkWindowObject *)window;
504 if (private->parent != NULL && GDK_WINDOW_DESTROYED (private->parent))
507 private->impl = g_object_new (GDK_TYPE_OFFSCREEN_WINDOW, NULL);
508 offscreen = GDK_OFFSCREEN_WINDOW (private->impl);
509 offscreen->wrapper = window;
511 offscreen->screen = screen;
513 if (attributes_mask & GDK_WA_COLORMAP)
514 offscreen->colormap = g_object_ref (attributes->colormap);
517 if (gdk_screen_get_system_visual (screen) == visual)
519 offscreen->colormap = gdk_screen_get_system_colormap (screen);
520 g_object_ref (offscreen->colormap);
523 offscreen->colormap = gdk_colormap_new (visual, FALSE);
526 offscreen->pixmap = gdk_pixmap_new ((GdkDrawable *)private->parent,
530 gdk_drawable_set_colormap (offscreen->pixmap, offscreen->colormap);
534 gdk_offscreen_window_reparent (GdkWindow *window,
535 GdkWindow *new_parent,
539 GdkWindowObject *private = (GdkWindowObject *)window;
540 GdkWindowObject *new_parent_private = (GdkWindowObject *)new_parent;
541 GdkWindowObject *old_parent;
546 /* No input-output children of input-only windows */
547 if (new_parent_private->input_only && !private->input_only)
550 /* Don't create loops in hierarchy */
551 if (is_parent_of (window, new_parent))
555 was_mapped = GDK_WINDOW_IS_MAPPED (window);
557 gdk_window_hide (window);
560 private->parent->children = g_list_remove (private->parent->children, window);
562 old_parent = private->parent;
563 private->parent = new_parent_private;
567 if (new_parent_private)
568 private->parent->children = g_list_prepend (private->parent->children, window);
570 _gdk_synthesize_crossing_events_for_geometry_change (window);
572 _gdk_synthesize_crossing_events_for_geometry_change (GDK_WINDOW (old_parent));
578 from_embedder (GdkWindow *window,
579 double embedder_x, double embedder_y,
580 double *offscreen_x, double *offscreen_y)
582 GdkWindowObject *private;
584 private = (GdkWindowObject *)window;
586 g_signal_emit_by_name (private->impl_window,
588 embedder_x, embedder_y,
589 offscreen_x, offscreen_y,
594 to_embedder (GdkWindow *window,
595 double offscreen_x, double offscreen_y,
596 double *embedder_x, double *embedder_y)
598 GdkWindowObject *private;
600 private = (GdkWindowObject *)window;
602 g_signal_emit_by_name (private->impl_window,
604 offscreen_x, offscreen_y,
605 embedder_x, embedder_y,
610 gdk_offscreen_window_get_root_coords (GdkWindow *window,
616 GdkWindowObject *private = GDK_WINDOW_OBJECT (window);
617 GdkOffscreenWindow *offscreen;
623 offscreen = GDK_OFFSCREEN_WINDOW (private->impl);
624 if (offscreen->embedder)
630 tmpx = floor (dx + 0.5);
631 tmpy = floor (dy + 0.5);
632 gdk_window_get_root_coords (offscreen->embedder,
647 gdk_offscreen_window_get_deskrelative_origin (GdkWindow *window,
651 GdkWindowObject *private = GDK_WINDOW_OBJECT (window);
652 GdkOffscreenWindow *offscreen;
658 offscreen = GDK_OFFSCREEN_WINDOW (private->impl);
659 if (offscreen->embedder)
662 gdk_window_get_deskrelative_origin (offscreen->embedder,
668 tmpx = floor (tmpx + dx + 0.5);
669 tmpy = floor (tmpy + dy + 0.5);
682 gdk_offscreen_window_get_device_state (GdkWindow *window,
686 GdkModifierType *mask)
688 GdkWindowObject *private = GDK_WINDOW_OBJECT (window);
689 GdkOffscreenWindow *offscreen;
692 GdkModifierType tmpmask;
698 offscreen = GDK_OFFSCREEN_WINDOW (private->impl);
699 if (offscreen->embedder != NULL)
701 gdk_window_get_device_position (offscreen->embedder, device, &tmpx, &tmpy, &tmpmask);
702 from_embedder (window,
705 tmpx = floor (dtmpx + 0.5);
706 tmpy = floor (dtmpy + 0.5);
719 * gdk_offscreen_window_get_pixmap:
720 * @window: a #GdkWindow
722 * Gets the offscreen pixmap that an offscreen window renders into.
723 * If you need to keep this around over window resizes, you need to
724 * add a reference to it.
726 * Returns: The offscreen pixmap, or %NULL if not offscreen
731 gdk_offscreen_window_get_pixmap (GdkWindow *window)
733 GdkWindowObject *private = (GdkWindowObject *)window;
734 GdkOffscreenWindow *offscreen;
736 g_return_val_if_fail (GDK_IS_WINDOW (window), FALSE);
738 if (!GDK_IS_OFFSCREEN_WINDOW (private->impl))
741 offscreen = GDK_OFFSCREEN_WINDOW (private->impl);
742 return offscreen->pixmap;
746 gdk_offscreen_window_raise (GdkWindow *window)
748 /* gdk_window_raise already changed the stacking order */
749 _gdk_synthesize_crossing_events_for_geometry_change (window);
753 gdk_offscreen_window_lower (GdkWindow *window)
755 /* gdk_window_lower already changed the stacking order */
756 _gdk_synthesize_crossing_events_for_geometry_change (window);
760 gdk_offscreen_window_move_resize_internal (GdkWindow *window,
765 gboolean send_expose_events)
767 GdkWindowObject *private = (GdkWindowObject *)window;
768 GdkOffscreenWindow *offscreen;
771 GdkPixmap *old_pixmap;
773 offscreen = GDK_OFFSCREEN_WINDOW (private->impl);
780 if (private->destroyed)
785 dw = width - private->width;
786 dh = height - private->height;
791 if (private->width != width ||
792 private->height != height)
796 private->width = width;
797 private->height = height;
799 old_pixmap = offscreen->pixmap;
800 offscreen->pixmap = gdk_pixmap_new (GDK_DRAWABLE (old_pixmap),
805 cr = gdk_cairo_create (offscreen->pixmap);
806 gdk_cairo_set_source_pixmap (cr, old_pixmap, 0, 0);
811 if (GDK_WINDOW_IS_MAPPED (private))
813 // TODO: Only invalidate new area, i.e. for larger windows
814 gdk_window_invalidate_rect (window, NULL, TRUE);
815 _gdk_synthesize_crossing_events_for_geometry_change (window);
820 gdk_offscreen_window_move_resize (GdkWindow *window,
827 GdkWindowObject *private = (GdkWindowObject *)window;
828 GdkOffscreenWindow *offscreen;
830 offscreen = GDK_OFFSCREEN_WINDOW (private->impl);
839 width = private->width;
842 height = private->height;
844 gdk_offscreen_window_move_resize_internal (window, x, y,
850 gdk_offscreen_window_show (GdkWindow *window,
851 gboolean already_mapped)
853 GdkWindowObject *private = (GdkWindowObject *)window;
855 gdk_window_clear_area_e (window, 0, 0,
856 private->width, private->height);
861 gdk_offscreen_window_hide (GdkWindow *window)
863 GdkWindowObject *private;
864 GdkOffscreenWindow *offscreen;
867 g_return_if_fail (window != NULL);
869 private = (GdkWindowObject*) window;
870 offscreen = GDK_OFFSCREEN_WINDOW (private->impl);
872 /* May need to break grabs on children */
873 display = gdk_drawable_get_display (window);
875 /* TODO: This needs updating to the new grab world */
877 if (display->pointer_grab.window != NULL)
879 if (is_parent_of (window, display->pointer_grab.window))
881 /* Call this ourselves, even though gdk_display_pointer_ungrab
882 does so too, since we want to pass implicit == TRUE so the
883 broken grab event is generated */
884 _gdk_display_unset_has_pointer_grab (display,
888 gdk_display_pointer_ungrab (display, GDK_CURRENT_TIME);
895 gdk_offscreen_window_withdraw (GdkWindow *window)
900 gdk_offscreen_window_get_events (GdkWindow *window)
906 gdk_offscreen_window_set_events (GdkWindow *window,
907 GdkEventMask event_mask)
912 gdk_offscreen_window_set_background (GdkWindow *window,
913 const GdkColor *color)
915 GdkWindowObject *private = (GdkWindowObject *)window;
916 GdkColormap *colormap = gdk_drawable_get_colormap (window);
918 private->bg_color = *color;
919 gdk_colormap_query_color (colormap, private->bg_color.pixel, &private->bg_color);
921 if (private->bg_pixmap &&
922 private->bg_pixmap != GDK_PARENT_RELATIVE_BG &&
923 private->bg_pixmap != GDK_NO_BG)
924 g_object_unref (private->bg_pixmap);
926 private->bg_pixmap = NULL;
930 gdk_offscreen_window_set_back_pixmap (GdkWindow *window,
933 GdkWindowObject *private = (GdkWindowObject *)window;
936 private->bg_pixmap != GDK_PARENT_RELATIVE_BG &&
937 private->bg_pixmap != GDK_NO_BG &&
938 !gdk_drawable_get_colormap (pixmap))
940 g_warning ("gdk_window_set_back_pixmap(): pixmap must have a colormap");
944 if (private->bg_pixmap &&
945 private->bg_pixmap != GDK_PARENT_RELATIVE_BG &&
946 private->bg_pixmap != GDK_NO_BG)
947 g_object_unref (private->bg_pixmap);
949 private->bg_pixmap = pixmap;
952 private->bg_pixmap != GDK_PARENT_RELATIVE_BG &&
953 private->bg_pixmap != GDK_NO_BG)
954 g_object_ref (pixmap);
958 gdk_offscreen_window_shape_combine_region (GdkWindow *window,
959 const cairo_region_t *shape_region,
966 gdk_offscreen_window_input_shape_combine_region (GdkWindow *window,
967 const cairo_region_t *shape_region,
974 gdk_offscreen_window_set_static_gravities (GdkWindow *window,
981 gdk_offscreen_window_get_geometry (GdkWindow *window,
988 GdkWindowObject *private = (GdkWindowObject *)window;
990 g_return_if_fail (window == NULL || GDK_IS_WINDOW (window));
992 if (!GDK_WINDOW_DESTROYED (window))
999 *width = private->width;
1001 *height = private->height;
1003 *depth = private->depth;
1008 gdk_offscreen_window_queue_antiexpose (GdkWindow *window,
1009 cairo_region_t *area)
1015 gdk_offscreen_window_queue_translation (GdkWindow *window,
1017 cairo_region_t *area,
1024 * gdk_offscreen_window_set_embedder:
1025 * @window: a #GdkWindow
1026 * @embedder: the #GdkWindow that @window gets embedded in
1028 * Sets @window to be embedded in @embedder.
1030 * To fully embed an offscreen window, in addition to calling this
1031 * function, it is also necessary to handle the #GdkWindow::pick-embedded-child
1032 * signal on the @embedder and the #GdkWindow::to-embedder and
1033 * #GdkWindow::from-embedder signals on @window.
1038 gdk_offscreen_window_set_embedder (GdkWindow *window,
1039 GdkWindow *embedder)
1041 GdkWindowObject *private = (GdkWindowObject *)window;
1042 GdkOffscreenWindow *offscreen;
1044 g_return_if_fail (GDK_IS_WINDOW (window));
1046 if (!GDK_IS_OFFSCREEN_WINDOW (private->impl))
1049 offscreen = GDK_OFFSCREEN_WINDOW (private->impl);
1053 g_object_ref (embedder);
1054 GDK_WINDOW_OBJECT (embedder)->num_offscreen_children++;
1057 if (offscreen->embedder)
1059 g_object_unref (offscreen->embedder);
1060 GDK_WINDOW_OBJECT (offscreen->embedder)->num_offscreen_children--;
1063 offscreen->embedder = embedder;
1067 * gdk_offscreen_window_get_embedder:
1068 * @window: a #GdkWindow
1070 * Gets the window that @window is embedded in.
1072 * Returns: the embedding #GdkWindow, or %NULL if @window is not an
1073 * embedded offscreen window
1078 gdk_offscreen_window_get_embedder (GdkWindow *window)
1080 GdkWindowObject *private = (GdkWindowObject *)window;
1081 GdkOffscreenWindow *offscreen;
1083 g_return_val_if_fail (GDK_IS_WINDOW (window), NULL);
1085 if (!GDK_IS_OFFSCREEN_WINDOW (private->impl))
1088 offscreen = GDK_OFFSCREEN_WINDOW (private->impl);
1090 return offscreen->embedder;
1094 gdk_offscreen_window_class_init (GdkOffscreenWindowClass *klass)
1096 GdkDrawableClass *drawable_class = GDK_DRAWABLE_CLASS (klass);
1097 GObjectClass *object_class = G_OBJECT_CLASS (klass);
1099 object_class->finalize = gdk_offscreen_window_finalize;
1101 drawable_class->create_gc = gdk_offscreen_window_create_gc;
1102 drawable_class->ref_cairo_surface = gdk_offscreen_window_ref_cairo_surface;
1103 drawable_class->set_colormap = gdk_offscreen_window_set_colormap;
1104 drawable_class->get_colormap = gdk_offscreen_window_get_colormap;
1105 drawable_class->get_depth = gdk_offscreen_window_get_depth;
1106 drawable_class->get_screen = gdk_offscreen_window_get_screen;
1107 drawable_class->get_visual = gdk_offscreen_window_get_visual;
1108 drawable_class->get_source_drawable = gdk_offscreen_window_get_source_drawable;
1109 drawable_class->get_composite_drawable = gdk_offscreen_window_get_composite_drawable;
1111 drawable_class->draw_rectangle = gdk_offscreen_window_draw_rectangle;
1112 drawable_class->draw_arc = gdk_offscreen_window_draw_arc;
1113 drawable_class->draw_polygon = gdk_offscreen_window_draw_polygon;
1114 drawable_class->draw_drawable_with_src = gdk_offscreen_window_draw_drawable;
1115 drawable_class->draw_points = gdk_offscreen_window_draw_points;
1116 drawable_class->draw_segments = gdk_offscreen_window_draw_segments;
1117 drawable_class->draw_lines = gdk_offscreen_window_draw_lines;
1121 gdk_offscreen_window_impl_iface_init (GdkWindowImplIface *iface)
1123 iface->show = gdk_offscreen_window_show;
1124 iface->hide = gdk_offscreen_window_hide;
1125 iface->withdraw = gdk_offscreen_window_withdraw;
1126 iface->raise = gdk_offscreen_window_raise;
1127 iface->lower = gdk_offscreen_window_lower;
1128 iface->move_resize = gdk_offscreen_window_move_resize;
1129 iface->set_background = gdk_offscreen_window_set_background;
1130 iface->set_back_pixmap = gdk_offscreen_window_set_back_pixmap;
1131 iface->get_events = gdk_offscreen_window_get_events;
1132 iface->set_events = gdk_offscreen_window_set_events;
1133 iface->reparent = gdk_offscreen_window_reparent;
1134 iface->get_geometry = gdk_offscreen_window_get_geometry;
1135 iface->shape_combine_region = gdk_offscreen_window_shape_combine_region;
1136 iface->input_shape_combine_region = gdk_offscreen_window_input_shape_combine_region;
1137 iface->set_static_gravities = gdk_offscreen_window_set_static_gravities;
1138 iface->queue_antiexpose = gdk_offscreen_window_queue_antiexpose;
1139 iface->queue_translation = gdk_offscreen_window_queue_translation;
1140 iface->get_root_coords = gdk_offscreen_window_get_root_coords;
1141 iface->get_deskrelative_origin = gdk_offscreen_window_get_deskrelative_origin;
1142 iface->get_device_state = gdk_offscreen_window_get_device_state;
1143 iface->destroy = gdk_offscreen_window_destroy;