Blame gdk/gdkoffscreenwindow.c

Packit 98cdb6
/* GDK - The GIMP Drawing Kit
Packit 98cdb6
 * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
Packit 98cdb6
 *
Packit 98cdb6
 * This library is free software; you can redistribute it and/or
Packit 98cdb6
 * modify it under the terms of the GNU Lesser General Public
Packit 98cdb6
 * License as published by the Free Software Foundation; either
Packit 98cdb6
 * version 2 of the License, or (at your option) any later version.
Packit 98cdb6
 *
Packit 98cdb6
 * This library is distributed in the hope that it will be useful,
Packit 98cdb6
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit 98cdb6
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit 98cdb6
 * Lesser General Public License for more details.
Packit 98cdb6
 *
Packit 98cdb6
 * You should have received a copy of the GNU Lesser General Public
Packit 98cdb6
 * License along with this library; if not, write to the
Packit 98cdb6
 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Packit 98cdb6
 * Boston, MA 02111-1307, USA.
Packit 98cdb6
 */
Packit 98cdb6
Packit 98cdb6
/*
Packit 98cdb6
 * Modified by the GTK+ Team and others 1997-2005.  See the AUTHORS
Packit 98cdb6
 * file for a list of people on the GTK+ Team.  See the ChangeLog
Packit 98cdb6
 * files for a list of changes.  These files are distributed with
Packit 98cdb6
 * GTK+ at ftp://ftp.gtk.org/pub/gtk/.
Packit 98cdb6
 */
Packit 98cdb6
Packit 98cdb6
#include <config.h>
Packit 98cdb6
#include <math.h>
Packit 98cdb6
#include "gdk.h"
Packit 98cdb6
#include "gdkwindow.h"
Packit 98cdb6
#include "gdkinternals.h"
Packit 98cdb6
#include "gdkwindowimpl.h"
Packit 98cdb6
#include "gdkpixmap.h"
Packit 98cdb6
#include "gdkdrawable.h"
Packit 98cdb6
#include "gdktypes.h"
Packit 98cdb6
#include "gdkscreen.h"
Packit 98cdb6
#include "gdkgc.h"
Packit 98cdb6
#include "gdkcolor.h"
Packit 98cdb6
#include "gdkcursor.h"
Packit 98cdb6
#include "gdkalias.h"
Packit 98cdb6
Packit 98cdb6
/* LIMITATIONS:
Packit 98cdb6
 *
Packit 98cdb6
 * Offscreen windows can't be the child of a foreign window,
Packit 98cdb6
 *   nor contain foreign windows
Packit 98cdb6
 * GDK_POINTER_MOTION_HINT_MASK isn't effective
Packit 98cdb6
 */
Packit 98cdb6
Packit 98cdb6
typedef struct _GdkOffscreenWindowClass GdkOffscreenWindowClass;
Packit 98cdb6
Packit 98cdb6
struct _GdkOffscreenWindow
Packit 98cdb6
{
Packit 98cdb6
  GdkDrawable parent_instance;
Packit 98cdb6
Packit 98cdb6
  GdkWindow *wrapper;
Packit 98cdb6
  GdkCursor *cursor;
Packit 98cdb6
  GdkColormap *colormap;
Packit 98cdb6
  GdkScreen *screen;
Packit 98cdb6
Packit 98cdb6
  GdkPixmap *pixmap;
Packit 98cdb6
  GdkWindow *embedder;
Packit 98cdb6
};
Packit 98cdb6
Packit 98cdb6
struct _GdkOffscreenWindowClass
Packit 98cdb6
{
Packit 98cdb6
  GdkDrawableClass parent_class;
Packit 98cdb6
};
Packit 98cdb6
Packit 98cdb6
#define GDK_OFFSCREEN_WINDOW_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass), GDK_TYPE_OFFSCREEN_WINDOW, GdkOffscreenWindowClass))
Packit 98cdb6
#define GDK_IS_OFFSCREEN_WINDOW_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GDK_TYPE_OFFSCREEN_WINDOW))
Packit 98cdb6
#define GDK_OFFSCREEN_WINDOW_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS ((obj), GDK_TYPE_OFFSCREEN_WINDOW, GdkOffscreenWindowClass))
Packit 98cdb6
Packit 98cdb6
static void       gdk_offscreen_window_impl_iface_init    (GdkWindowImplIface         *iface);
Packit 98cdb6
static void       gdk_offscreen_window_hide               (GdkWindow                  *window);
Packit 98cdb6
Packit 98cdb6
G_DEFINE_TYPE_WITH_CODE (GdkOffscreenWindow,
Packit 98cdb6
			 gdk_offscreen_window,
Packit 98cdb6
			 GDK_TYPE_DRAWABLE,
Packit 98cdb6
			 G_IMPLEMENT_INTERFACE (GDK_TYPE_WINDOW_IMPL,
Packit 98cdb6
						gdk_offscreen_window_impl_iface_init));
Packit 98cdb6
Packit 98cdb6
Packit 98cdb6
static void
Packit 98cdb6
gdk_offscreen_window_finalize (GObject *object)
Packit 98cdb6
{
Packit 98cdb6
  GdkOffscreenWindow *offscreen = GDK_OFFSCREEN_WINDOW (object);
Packit 98cdb6
Packit 98cdb6
  if (offscreen->cursor)
Packit 98cdb6
    gdk_cursor_unref (offscreen->cursor);
Packit 98cdb6
Packit 98cdb6
  offscreen->cursor = NULL;
Packit 98cdb6
Packit 98cdb6
  g_object_unref (offscreen->pixmap);
Packit 98cdb6
Packit 98cdb6
  G_OBJECT_CLASS (gdk_offscreen_window_parent_class)->finalize (object);
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static void
Packit 98cdb6
gdk_offscreen_window_init (GdkOffscreenWindow *window)
Packit 98cdb6
{
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static void
Packit 98cdb6
gdk_offscreen_window_destroy (GdkWindow *window,
Packit 98cdb6
			      gboolean   recursing,
Packit 98cdb6
			      gboolean   foreign_destroy)
Packit 98cdb6
{
Packit 98cdb6
  GdkWindowObject *private = GDK_WINDOW_OBJECT (window);
Packit 98cdb6
  GdkOffscreenWindow *offscreen;
Packit 98cdb6
Packit 98cdb6
  offscreen = GDK_OFFSCREEN_WINDOW (private->impl);
Packit 98cdb6
Packit 98cdb6
  gdk_offscreen_window_set_embedder (window, NULL);
Packit 98cdb6
  
Packit 98cdb6
  if (!recursing)
Packit 98cdb6
    gdk_offscreen_window_hide (window);
Packit 98cdb6
Packit 98cdb6
  g_object_unref (offscreen->colormap);
Packit 98cdb6
  offscreen->colormap = NULL;
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static gboolean
Packit 98cdb6
is_parent_of (GdkWindow *parent,
Packit 98cdb6
	      GdkWindow *child)
Packit 98cdb6
{
Packit 98cdb6
  GdkWindow *w;
Packit 98cdb6
Packit 98cdb6
  w = child;
Packit 98cdb6
  while (w != NULL)
Packit 98cdb6
    {
Packit 98cdb6
      if (w == parent)
Packit 98cdb6
	return TRUE;
Packit 98cdb6
Packit 98cdb6
      w = gdk_window_get_parent (w);
Packit 98cdb6
    }
Packit 98cdb6
Packit 98cdb6
  return FALSE;
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static GdkGC *
Packit 98cdb6
gdk_offscreen_window_create_gc (GdkDrawable     *drawable,
Packit 98cdb6
				GdkGCValues     *values,
Packit 98cdb6
				GdkGCValuesMask  values_mask)
Packit 98cdb6
{
Packit 98cdb6
  GdkOffscreenWindow *offscreen = GDK_OFFSCREEN_WINDOW (drawable);
Packit 98cdb6
Packit 98cdb6
  return gdk_gc_new_with_values (offscreen->pixmap, values, values_mask);
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static GdkImage*
Packit 98cdb6
gdk_offscreen_window_copy_to_image (GdkDrawable    *drawable,
Packit 98cdb6
				    GdkImage       *image,
Packit 98cdb6
				    gint            src_x,
Packit 98cdb6
				    gint            src_y,
Packit 98cdb6
				    gint            dest_x,
Packit 98cdb6
				    gint            dest_y,
Packit 98cdb6
				    gint            width,
Packit 98cdb6
				    gint            height)
Packit 98cdb6
{
Packit 98cdb6
  GdkOffscreenWindow *offscreen = GDK_OFFSCREEN_WINDOW (drawable);
Packit 98cdb6
Packit 98cdb6
  return gdk_drawable_copy_to_image (offscreen->pixmap,
Packit 98cdb6
				     image,
Packit 98cdb6
				     src_x,
Packit 98cdb6
				     src_y,
Packit 98cdb6
				     dest_x, dest_y,
Packit 98cdb6
				     width, height);
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static cairo_surface_t *
Packit 98cdb6
gdk_offscreen_window_ref_cairo_surface (GdkDrawable *drawable)
Packit 98cdb6
{
Packit 98cdb6
  GdkOffscreenWindow *offscreen = GDK_OFFSCREEN_WINDOW (drawable);
Packit 98cdb6
Packit 98cdb6
  return _gdk_drawable_ref_cairo_surface (offscreen->pixmap);
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static GdkColormap*
Packit 98cdb6
gdk_offscreen_window_get_colormap (GdkDrawable *drawable)
Packit 98cdb6
{
Packit 98cdb6
  GdkOffscreenWindow *offscreen = GDK_OFFSCREEN_WINDOW (drawable);
Packit 98cdb6
Packit 98cdb6
  return offscreen->colormap;
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static void
Packit 98cdb6
gdk_offscreen_window_set_colormap (GdkDrawable *drawable,
Packit 98cdb6
				   GdkColormap*colormap)
Packit 98cdb6
{
Packit 98cdb6
  GdkOffscreenWindow *offscreen = GDK_OFFSCREEN_WINDOW (drawable);
Packit 98cdb6
Packit 98cdb6
  if (colormap && GDK_WINDOW_DESTROYED (offscreen->wrapper))
Packit 98cdb6
    return;
Packit 98cdb6
Packit 98cdb6
  if (offscreen->colormap == colormap)
Packit 98cdb6
    return;
Packit 98cdb6
Packit 98cdb6
  if (offscreen->colormap)
Packit 98cdb6
    g_object_unref (offscreen->colormap);
Packit 98cdb6
Packit 98cdb6
  offscreen->colormap = colormap;
Packit 98cdb6
  if (offscreen->colormap)
Packit 98cdb6
    g_object_ref (offscreen->colormap);
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
Packit 98cdb6
static gint
Packit 98cdb6
gdk_offscreen_window_get_depth (GdkDrawable *drawable)
Packit 98cdb6
{
Packit 98cdb6
  GdkOffscreenWindow *offscreen = GDK_OFFSCREEN_WINDOW (drawable);
Packit 98cdb6
Packit 98cdb6
  return gdk_drawable_get_depth (offscreen->wrapper);
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static GdkDrawable *
Packit 98cdb6
gdk_offscreen_window_get_source_drawable (GdkDrawable  *drawable)
Packit 98cdb6
{
Packit 98cdb6
  GdkOffscreenWindow *offscreen = GDK_OFFSCREEN_WINDOW (drawable);
Packit 98cdb6
Packit 98cdb6
  return _gdk_drawable_get_source_drawable (offscreen->pixmap);
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static GdkDrawable *
Packit 98cdb6
gdk_offscreen_window_get_composite_drawable (GdkDrawable *drawable,
Packit 98cdb6
					     gint         x,
Packit 98cdb6
					     gint         y,
Packit 98cdb6
					     gint         width,
Packit 98cdb6
					     gint         height,
Packit 98cdb6
					     gint        *composite_x_offset,
Packit 98cdb6
					     gint        *composite_y_offset)
Packit 98cdb6
{
Packit 98cdb6
  GdkOffscreenWindow *offscreen = GDK_OFFSCREEN_WINDOW (drawable);
Packit 98cdb6
Packit 98cdb6
  return g_object_ref (offscreen->pixmap);
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static GdkScreen*
Packit 98cdb6
gdk_offscreen_window_get_screen (GdkDrawable *drawable)
Packit 98cdb6
{
Packit 98cdb6
  GdkOffscreenWindow *offscreen = GDK_OFFSCREEN_WINDOW (drawable);
Packit 98cdb6
Packit 98cdb6
  return offscreen->screen;
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static GdkVisual*
Packit 98cdb6
gdk_offscreen_window_get_visual (GdkDrawable    *drawable)
Packit 98cdb6
{
Packit 98cdb6
  GdkOffscreenWindow *offscreen = GDK_OFFSCREEN_WINDOW (drawable);
Packit 98cdb6
Packit 98cdb6
  return gdk_drawable_get_visual (offscreen->wrapper);
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static void
Packit 98cdb6
add_damage (GdkOffscreenWindow *offscreen,
Packit 98cdb6
	    int x, int y,
Packit 98cdb6
	    int w, int h,
Packit 98cdb6
	    gboolean is_line)
Packit 98cdb6
{
Packit 98cdb6
  GdkRectangle rect;
Packit 98cdb6
  GdkRegion *damage;
Packit 98cdb6
Packit 98cdb6
  rect.x = x;
Packit 98cdb6
  rect.y = y;
Packit 98cdb6
  rect.width = w;
Packit 98cdb6
  rect.height = h;
Packit 98cdb6
Packit 98cdb6
  if (is_line)
Packit 98cdb6
    {
Packit 98cdb6
      /* This should really take into account line width, line
Packit 98cdb6
       * joins (and miter) and line caps. But these are hard
Packit 98cdb6
       * to compute, rarely used and generally a pain. And in
Packit 98cdb6
       * the end a snug damage rectangle is not that important
Packit 98cdb6
       * as multiple damages are generally created anyway.
Packit 98cdb6
       *
Packit 98cdb6
       * So, we just add some padding around the rect.
Packit 98cdb6
       * We use a padding of 3 pixels, plus an extra row
Packit 98cdb6
       * below and on the right for the normal line size. I.E.
Packit 98cdb6
       * line from (0,0) to (2,0) gets h=0 but is really
Packit 98cdb6
       * at least one pixel tall.
Packit 98cdb6
       */
Packit 98cdb6
      rect.x -= 3;
Packit 98cdb6
      rect.y -= 3;
Packit 98cdb6
      rect.width += 7;
Packit 98cdb6
      rect.height += 7;
Packit 98cdb6
    }
Packit 98cdb6
Packit 98cdb6
  damage = gdk_region_rectangle (&rect);
Packit 98cdb6
  _gdk_window_add_damage (offscreen->wrapper, damage);
Packit 98cdb6
  gdk_region_destroy (damage);
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static GdkDrawable *
Packit 98cdb6
get_real_drawable (GdkOffscreenWindow *offscreen)
Packit 98cdb6
{
Packit 98cdb6
  GdkPixmapObject *pixmap;
Packit 98cdb6
  pixmap = (GdkPixmapObject *) offscreen->pixmap;
Packit 98cdb6
  return GDK_DRAWABLE (pixmap->impl);
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static void
Packit 98cdb6
gdk_offscreen_window_draw_drawable (GdkDrawable *drawable,
Packit 98cdb6
				    GdkGC       *gc,
Packit 98cdb6
				    GdkPixmap   *src,
Packit 98cdb6
				    gint         xsrc,
Packit 98cdb6
				    gint         ysrc,
Packit 98cdb6
				    gint         xdest,
Packit 98cdb6
				    gint         ydest,
Packit 98cdb6
				    gint         width,
Packit 98cdb6
				    gint         height,
Packit 98cdb6
				    GdkDrawable *original_src)
Packit 98cdb6
{
Packit 98cdb6
  GdkOffscreenWindow *offscreen = GDK_OFFSCREEN_WINDOW (drawable);
Packit 98cdb6
  GdkDrawable *real_drawable = get_real_drawable (offscreen);
Packit 98cdb6
Packit 98cdb6
  gdk_draw_drawable (real_drawable, gc,
Packit 98cdb6
		     src, xsrc, ysrc,
Packit 98cdb6
		     xdest, ydest,
Packit 98cdb6
		     width, height);
Packit 98cdb6
Packit 98cdb6
  add_damage (offscreen, xdest, ydest, width, height, FALSE);
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static void
Packit 98cdb6
gdk_offscreen_window_draw_rectangle (GdkDrawable  *drawable,
Packit 98cdb6
				     GdkGC	  *gc,
Packit 98cdb6
				     gboolean	   filled,
Packit 98cdb6
				     gint	   x,
Packit 98cdb6
				     gint	   y,
Packit 98cdb6
				     gint	   width,
Packit 98cdb6
				     gint	   height)
Packit 98cdb6
{
Packit 98cdb6
  GdkOffscreenWindow *offscreen = GDK_OFFSCREEN_WINDOW (drawable);
Packit 98cdb6
  GdkDrawable *real_drawable = get_real_drawable (offscreen);
Packit 98cdb6
Packit 98cdb6
  gdk_draw_rectangle (real_drawable,
Packit 98cdb6
		      gc, filled, x, y, width, height);
Packit 98cdb6
Packit 98cdb6
  add_damage (offscreen, x, y, width, height, !filled);
Packit 98cdb6
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static void
Packit 98cdb6
gdk_offscreen_window_draw_arc (GdkDrawable  *drawable,
Packit 98cdb6
			       GdkGC	       *gc,
Packit 98cdb6
			       gboolean	filled,
Packit 98cdb6
			       gint		x,
Packit 98cdb6
			       gint		y,
Packit 98cdb6
			       gint		width,
Packit 98cdb6
			       gint		height,
Packit 98cdb6
			       gint		angle1,
Packit 98cdb6
			       gint		angle2)
Packit 98cdb6
{
Packit 98cdb6
  GdkOffscreenWindow *offscreen = GDK_OFFSCREEN_WINDOW (drawable);
Packit 98cdb6
  GdkDrawable *real_drawable = get_real_drawable (offscreen);
Packit 98cdb6
Packit 98cdb6
  gdk_draw_arc (real_drawable,
Packit 98cdb6
		gc,
Packit 98cdb6
		filled,
Packit 98cdb6
		x,
Packit 98cdb6
		y,
Packit 98cdb6
		width,
Packit 98cdb6
		height,
Packit 98cdb6
		angle1,
Packit 98cdb6
		angle2);
Packit 98cdb6
  add_damage (offscreen, x, y, width, height, !filled);
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static void
Packit 98cdb6
gdk_offscreen_window_draw_polygon (GdkDrawable  *drawable,
Packit 98cdb6
				   GdkGC	       *gc,
Packit 98cdb6
				   gboolean	filled,
Packit 98cdb6
				   GdkPoint     *points,
Packit 98cdb6
				   gint		npoints)
Packit 98cdb6
{
Packit 98cdb6
  GdkOffscreenWindow *offscreen = GDK_OFFSCREEN_WINDOW (drawable);
Packit 98cdb6
  GdkDrawable *real_drawable = get_real_drawable (offscreen);
Packit 98cdb6
Packit 98cdb6
  gdk_draw_polygon (real_drawable,
Packit 98cdb6
		    gc,
Packit 98cdb6
		    filled,
Packit 98cdb6
		    points,
Packit 98cdb6
		    npoints);
Packit 98cdb6
Packit 98cdb6
  if (npoints > 0)
Packit 98cdb6
    {
Packit 98cdb6
      int min_x, min_y, max_x, max_y, i;
Packit 98cdb6
Packit 98cdb6
      min_x = max_x = points[0].x;
Packit 98cdb6
      min_y = max_y = points[0].y;
Packit 98cdb6
Packit 98cdb6
	for (i = 1; i < npoints; i++)
Packit 98cdb6
	  {
Packit 98cdb6
	    min_x = MIN (min_x, points[i].x);
Packit 98cdb6
	    max_x = MAX (max_x, points[i].x);
Packit 98cdb6
	    min_y = MIN (min_y, points[i].y);
Packit 98cdb6
	    max_y = MAX (max_y, points[i].y);
Packit 98cdb6
	  }
Packit 98cdb6
Packit 98cdb6
	add_damage (offscreen, min_x, min_y,
Packit 98cdb6
		    max_x - min_x,
Packit 98cdb6
		    max_y - min_y, !filled);
Packit 98cdb6
    }
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static void
Packit 98cdb6
gdk_offscreen_window_draw_text (GdkDrawable  *drawable,
Packit 98cdb6
				GdkFont      *font,
Packit 98cdb6
				GdkGC	       *gc,
Packit 98cdb6
				gint		x,
Packit 98cdb6
				gint		y,
Packit 98cdb6
				const gchar  *text,
Packit 98cdb6
				gint		text_length)
Packit 98cdb6
{
Packit 98cdb6
  GdkOffscreenWindow *offscreen = GDK_OFFSCREEN_WINDOW (drawable);
Packit 98cdb6
  GdkDrawable *real_drawable = get_real_drawable (offscreen);
Packit 98cdb6
  GdkWindowObject *private = GDK_WINDOW_OBJECT (offscreen->wrapper);
Packit 98cdb6
Packit 98cdb6
  gdk_draw_text (real_drawable,
Packit 98cdb6
		 font,
Packit 98cdb6
		 gc,
Packit 98cdb6
		 x,
Packit 98cdb6
		 y,
Packit 98cdb6
		 text,
Packit 98cdb6
		 text_length);
Packit 98cdb6
Packit 98cdb6
  /* Hard to compute the minimal size, not that often used anyway. */
Packit 98cdb6
  add_damage (offscreen, 0, 0, private->width, private->height, FALSE);
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static void
Packit 98cdb6
gdk_offscreen_window_draw_text_wc (GdkDrawable	 *drawable,
Packit 98cdb6
				   GdkFont	 *font,
Packit 98cdb6
				   GdkGC		 *gc,
Packit 98cdb6
				   gint		  x,
Packit 98cdb6
				   gint		  y,
Packit 98cdb6
				   const GdkWChar *text,
Packit 98cdb6
				   gint		  text_length)
Packit 98cdb6
{
Packit 98cdb6
  GdkOffscreenWindow *offscreen = GDK_OFFSCREEN_WINDOW (drawable);
Packit 98cdb6
  GdkDrawable *real_drawable = get_real_drawable (offscreen);
Packit 98cdb6
  GdkWindowObject *private = GDK_WINDOW_OBJECT (offscreen->wrapper);
Packit 98cdb6
Packit 98cdb6
  gdk_draw_text_wc (real_drawable,
Packit 98cdb6
		    font,
Packit 98cdb6
		    gc,
Packit 98cdb6
		    x,
Packit 98cdb6
		    y,
Packit 98cdb6
		    text,
Packit 98cdb6
		    text_length);
Packit 98cdb6
Packit 98cdb6
  /* Hard to compute the minimal size, not that often used anyway. */
Packit 98cdb6
  add_damage (offscreen, 0, 0, private->width, private->height, FALSE);
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static void
Packit 98cdb6
gdk_offscreen_window_draw_points (GdkDrawable  *drawable,
Packit 98cdb6
				  GdkGC	       *gc,
Packit 98cdb6
				  GdkPoint     *points,
Packit 98cdb6
				  gint		npoints)
Packit 98cdb6
{
Packit 98cdb6
  GdkOffscreenWindow *offscreen = GDK_OFFSCREEN_WINDOW (drawable);
Packit 98cdb6
  GdkDrawable *real_drawable = get_real_drawable (offscreen);
Packit 98cdb6
Packit 98cdb6
  gdk_draw_points (real_drawable,
Packit 98cdb6
		   gc,
Packit 98cdb6
		   points,
Packit 98cdb6
		   npoints);
Packit 98cdb6
Packit 98cdb6
Packit 98cdb6
  if (npoints > 0)
Packit 98cdb6
    {
Packit 98cdb6
      int min_x, min_y, max_x, max_y, i;
Packit 98cdb6
Packit 98cdb6
      min_x = max_x = points[0].x;
Packit 98cdb6
      min_y = max_y = points[0].y;
Packit 98cdb6
Packit 98cdb6
	for (i = 1; i < npoints; i++)
Packit 98cdb6
	  {
Packit 98cdb6
	    min_x = MIN (min_x, points[i].x);
Packit 98cdb6
	    max_x = MAX (max_x, points[i].x);
Packit 98cdb6
	    min_y = MIN (min_y, points[i].y);
Packit 98cdb6
	    max_y = MAX (max_y, points[i].y);
Packit 98cdb6
	  }
Packit 98cdb6
Packit 98cdb6
	add_damage (offscreen, min_x, min_y,
Packit 98cdb6
		    max_x - min_x + 1,
Packit 98cdb6
		    max_y - min_y + 1,
Packit 98cdb6
		    FALSE);
Packit 98cdb6
    }
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static void
Packit 98cdb6
gdk_offscreen_window_draw_segments (GdkDrawable  *drawable,
Packit 98cdb6
				    GdkGC	 *gc,
Packit 98cdb6
				    GdkSegment   *segs,
Packit 98cdb6
				    gint	  nsegs)
Packit 98cdb6
{
Packit 98cdb6
  GdkOffscreenWindow *offscreen = GDK_OFFSCREEN_WINDOW (drawable);
Packit 98cdb6
  GdkDrawable *real_drawable = get_real_drawable (offscreen);
Packit 98cdb6
Packit 98cdb6
  gdk_draw_segments (real_drawable,
Packit 98cdb6
		     gc,
Packit 98cdb6
		     segs,
Packit 98cdb6
		     nsegs);
Packit 98cdb6
Packit 98cdb6
  if (nsegs > 0)
Packit 98cdb6
    {
Packit 98cdb6
      int min_x, min_y, max_x, max_y, i;
Packit 98cdb6
Packit 98cdb6
      min_x = max_x = segs[0].x1;
Packit 98cdb6
      min_y = max_y = segs[0].y1;
Packit 98cdb6
Packit 98cdb6
	for (i = 0; i < nsegs; i++)
Packit 98cdb6
	  {
Packit 98cdb6
	    min_x = MIN (min_x, segs[i].x1);
Packit 98cdb6
	    max_x = MAX (max_x, segs[i].x1);
Packit 98cdb6
	    min_x = MIN (min_x, segs[i].x2);
Packit 98cdb6
	    max_x = MAX (max_x, segs[i].x2);
Packit 98cdb6
	    min_y = MIN (min_y, segs[i].y1);
Packit 98cdb6
	    max_y = MAX (max_y, segs[i].y1);
Packit 98cdb6
	    min_y = MIN (min_y, segs[i].y2);
Packit 98cdb6
	    max_y = MAX (max_y, segs[i].y2);
Packit 98cdb6
	  }
Packit 98cdb6
Packit 98cdb6
	add_damage (offscreen, min_x, min_y,
Packit 98cdb6
		    max_x - min_x,
Packit 98cdb6
		    max_y - min_y, TRUE);
Packit 98cdb6
    }
Packit 98cdb6
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static void
Packit 98cdb6
gdk_offscreen_window_draw_lines (GdkDrawable  *drawable,
Packit 98cdb6
				 GdkGC        *gc,
Packit 98cdb6
				 GdkPoint     *points,
Packit 98cdb6
				 gint          npoints)
Packit 98cdb6
{
Packit 98cdb6
  GdkOffscreenWindow *offscreen = GDK_OFFSCREEN_WINDOW (drawable);
Packit 98cdb6
  GdkDrawable *real_drawable = get_real_drawable (offscreen);
Packit 98cdb6
  GdkWindowObject *private = GDK_WINDOW_OBJECT (offscreen->wrapper);
Packit 98cdb6
Packit 98cdb6
  gdk_draw_lines (real_drawable,
Packit 98cdb6
		  gc,
Packit 98cdb6
		  points,
Packit 98cdb6
		  npoints);
Packit 98cdb6
Packit 98cdb6
  /* Hard to compute the minimal size, as we don't know the line
Packit 98cdb6
     width, and since joins are hard to calculate.
Packit 98cdb6
     Its not that often used anyway, damage it all */
Packit 98cdb6
  add_damage (offscreen, 0, 0, private->width, private->height, TRUE);
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static void
Packit 98cdb6
gdk_offscreen_window_draw_image (GdkDrawable *drawable,
Packit 98cdb6
				 GdkGC	      *gc,
Packit 98cdb6
				 GdkImage    *image,
Packit 98cdb6
				 gint	       xsrc,
Packit 98cdb6
				 gint	       ysrc,
Packit 98cdb6
				 gint	       xdest,
Packit 98cdb6
				 gint	       ydest,
Packit 98cdb6
				 gint	       width,
Packit 98cdb6
				 gint	       height)
Packit 98cdb6
{
Packit 98cdb6
  GdkOffscreenWindow *offscreen = GDK_OFFSCREEN_WINDOW (drawable);
Packit 98cdb6
  GdkDrawable *real_drawable = get_real_drawable (offscreen);
Packit 98cdb6
Packit 98cdb6
  gdk_draw_image (real_drawable,
Packit 98cdb6
		  gc,
Packit 98cdb6
		  image,
Packit 98cdb6
		  xsrc,
Packit 98cdb6
		  ysrc,
Packit 98cdb6
		  xdest,
Packit 98cdb6
		  ydest,
Packit 98cdb6
		  width,
Packit 98cdb6
		  height);
Packit 98cdb6
Packit 98cdb6
  add_damage (offscreen, xdest, ydest, width, height, FALSE);
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
Packit 98cdb6
static void
Packit 98cdb6
gdk_offscreen_window_draw_pixbuf (GdkDrawable *drawable,
Packit 98cdb6
				  GdkGC       *gc,
Packit 98cdb6
				  GdkPixbuf   *pixbuf,
Packit 98cdb6
				  gint         src_x,
Packit 98cdb6
				  gint         src_y,
Packit 98cdb6
				  gint         dest_x,
Packit 98cdb6
				  gint         dest_y,
Packit 98cdb6
				  gint         width,
Packit 98cdb6
				  gint         height,
Packit 98cdb6
				  GdkRgbDither dither,
Packit 98cdb6
				  gint         x_dither,
Packit 98cdb6
				  gint         y_dither)
Packit 98cdb6
{
Packit 98cdb6
  GdkOffscreenWindow *offscreen = GDK_OFFSCREEN_WINDOW (drawable);
Packit 98cdb6
  GdkDrawable *real_drawable = get_real_drawable (offscreen);
Packit 98cdb6
Packit 98cdb6
  gdk_draw_pixbuf (real_drawable,
Packit 98cdb6
		   gc,
Packit 98cdb6
		   pixbuf,
Packit 98cdb6
		   src_x,
Packit 98cdb6
		   src_y,
Packit 98cdb6
		   dest_x,
Packit 98cdb6
		   dest_y,
Packit 98cdb6
		   width,
Packit 98cdb6
		   height,
Packit 98cdb6
		   dither,
Packit 98cdb6
		   x_dither,
Packit 98cdb6
		   y_dither);
Packit 98cdb6
Packit 98cdb6
  add_damage (offscreen, dest_x, dest_y, width, height, FALSE);
Packit 98cdb6
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
void
Packit 98cdb6
_gdk_offscreen_window_new (GdkWindow     *window,
Packit 98cdb6
			   GdkScreen     *screen,
Packit 98cdb6
			   GdkVisual     *visual,
Packit 98cdb6
			   GdkWindowAttr *attributes,
Packit 98cdb6
			   gint           attributes_mask)
Packit 98cdb6
{
Packit 98cdb6
  GdkWindowObject *private;
Packit 98cdb6
  GdkOffscreenWindow *offscreen;
Packit 98cdb6
Packit 98cdb6
  g_return_if_fail (attributes != NULL);
Packit 98cdb6
Packit 98cdb6
  if (attributes->wclass != GDK_INPUT_OUTPUT)
Packit 98cdb6
    return; /* Can't support input only offscreens */
Packit 98cdb6
Packit 98cdb6
  private = (GdkWindowObject *)window;
Packit 98cdb6
Packit 98cdb6
  if (private->parent != NULL && GDK_WINDOW_DESTROYED (private->parent))
Packit 98cdb6
    return;
Packit 98cdb6
Packit 98cdb6
  private->impl = g_object_new (GDK_TYPE_OFFSCREEN_WINDOW, NULL);
Packit 98cdb6
  offscreen = GDK_OFFSCREEN_WINDOW (private->impl);
Packit 98cdb6
  offscreen->wrapper = window;
Packit 98cdb6
Packit 98cdb6
  offscreen->screen = screen;
Packit 98cdb6
Packit 98cdb6
  if (attributes_mask & GDK_WA_COLORMAP)
Packit 98cdb6
    offscreen->colormap = g_object_ref (attributes->colormap);
Packit 98cdb6
  else
Packit 98cdb6
    {
Packit 98cdb6
      if (gdk_screen_get_system_visual (screen) == visual)
Packit 98cdb6
	{
Packit 98cdb6
	  offscreen->colormap = gdk_screen_get_system_colormap (screen);
Packit 98cdb6
	  g_object_ref (offscreen->colormap);
Packit 98cdb6
	}
Packit 98cdb6
      else
Packit 98cdb6
	offscreen->colormap = gdk_colormap_new (visual, FALSE);
Packit 98cdb6
    }
Packit 98cdb6
Packit 98cdb6
  offscreen->pixmap = gdk_pixmap_new ((GdkDrawable *)private->parent,
Packit 98cdb6
				      private->width,
Packit 98cdb6
				      private->height,
Packit 98cdb6
				      private->depth);
Packit 98cdb6
  gdk_drawable_set_colormap (offscreen->pixmap, offscreen->colormap);
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static gboolean
Packit 98cdb6
gdk_offscreen_window_reparent (GdkWindow *window,
Packit 98cdb6
			       GdkWindow *new_parent,
Packit 98cdb6
			       gint       x,
Packit 98cdb6
			       gint       y)
Packit 98cdb6
{
Packit 98cdb6
  GdkWindowObject *private = (GdkWindowObject *)window;
Packit 98cdb6
  GdkWindowObject *new_parent_private = (GdkWindowObject *)new_parent;
Packit 98cdb6
  GdkWindowObject *old_parent;
Packit 98cdb6
  gboolean was_mapped;
Packit 98cdb6
Packit 98cdb6
  if (new_parent)
Packit 98cdb6
    {
Packit 98cdb6
      /* No input-output children of input-only windows */
Packit 98cdb6
      if (new_parent_private->input_only && !private->input_only)
Packit 98cdb6
	return FALSE;
Packit 98cdb6
Packit 98cdb6
      /* Don't create loops in hierarchy */
Packit 98cdb6
      if (is_parent_of (window, new_parent))
Packit 98cdb6
	return FALSE;
Packit 98cdb6
    }
Packit 98cdb6
Packit 98cdb6
  was_mapped = GDK_WINDOW_IS_MAPPED (window);
Packit 98cdb6
Packit 98cdb6
  gdk_window_hide (window);
Packit 98cdb6
Packit 98cdb6
  if (private->parent)
Packit 98cdb6
    private->parent->children = g_list_remove (private->parent->children, window);
Packit 98cdb6
Packit 98cdb6
  old_parent = private->parent;
Packit 98cdb6
  private->parent = new_parent_private;
Packit 98cdb6
  private->x = x;
Packit 98cdb6
  private->y = y;
Packit 98cdb6
Packit 98cdb6
  if (new_parent_private)
Packit 98cdb6
    private->parent->children = g_list_prepend (private->parent->children, window);
Packit 98cdb6
Packit 98cdb6
  _gdk_synthesize_crossing_events_for_geometry_change (window);
Packit 98cdb6
  if (old_parent)
Packit 98cdb6
    _gdk_synthesize_crossing_events_for_geometry_change (GDK_WINDOW (old_parent));
Packit 98cdb6
Packit 98cdb6
  return was_mapped;
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static void
Packit 98cdb6
from_embedder (GdkWindow *window,
Packit 98cdb6
	       double embedder_x, double embedder_y,
Packit 98cdb6
	       double *offscreen_x, double *offscreen_y)
Packit 98cdb6
{
Packit 98cdb6
  GdkWindowObject *private;
Packit 98cdb6
Packit 98cdb6
  private = (GdkWindowObject *)window;
Packit 98cdb6
Packit 98cdb6
  g_signal_emit_by_name (private->impl_window,
Packit 98cdb6
			 "from-embedder",
Packit 98cdb6
			 embedder_x, embedder_y,
Packit 98cdb6
			 offscreen_x, offscreen_y,
Packit 98cdb6
			 NULL);
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static void
Packit 98cdb6
to_embedder (GdkWindow *window,
Packit 98cdb6
	     double offscreen_x, double offscreen_y,
Packit 98cdb6
	     double *embedder_x, double *embedder_y)
Packit 98cdb6
{
Packit 98cdb6
  GdkWindowObject *private;
Packit 98cdb6
Packit 98cdb6
  private = (GdkWindowObject *)window;
Packit 98cdb6
Packit 98cdb6
  g_signal_emit_by_name (private->impl_window,
Packit 98cdb6
			 "to-embedder",
Packit 98cdb6
			 offscreen_x, offscreen_y,
Packit 98cdb6
			 embedder_x, embedder_y,
Packit 98cdb6
			 NULL);
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static gint
Packit 98cdb6
gdk_offscreen_window_get_root_coords (GdkWindow *window,
Packit 98cdb6
				      gint       x,
Packit 98cdb6
				      gint       y,
Packit 98cdb6
				      gint      *root_x,
Packit 98cdb6
				      gint      *root_y)
Packit 98cdb6
{
Packit 98cdb6
  GdkWindowObject *private = GDK_WINDOW_OBJECT (window);
Packit 98cdb6
  GdkOffscreenWindow *offscreen;
Packit 98cdb6
  int tmpx, tmpy;
Packit 98cdb6
Packit 98cdb6
  tmpx = x;
Packit 98cdb6
  tmpy = y;
Packit 98cdb6
Packit 98cdb6
  offscreen = GDK_OFFSCREEN_WINDOW (private->impl);
Packit 98cdb6
  if (offscreen->embedder)
Packit 98cdb6
    {
Packit 98cdb6
      double dx, dy;
Packit 98cdb6
      to_embedder (window,
Packit 98cdb6
		   x, y,
Packit 98cdb6
		   &dx, &dy;;
Packit 98cdb6
      tmpx = floor (dx + 0.5);
Packit 98cdb6
      tmpy = floor (dy + 0.5);
Packit 98cdb6
      gdk_window_get_root_coords (offscreen->embedder,
Packit 98cdb6
				  tmpx, tmpy,
Packit 98cdb6
				  &tmpx, &tmpy);
Packit 98cdb6
Packit 98cdb6
    }
Packit 98cdb6
Packit 98cdb6
  if (root_x)
Packit 98cdb6
    *root_x = tmpx;
Packit 98cdb6
  if (root_y)
Packit 98cdb6
    *root_y = tmpy;
Packit 98cdb6
Packit 98cdb6
  return TRUE;
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static gint
Packit 98cdb6
gdk_offscreen_window_get_deskrelative_origin (GdkWindow *window,
Packit 98cdb6
					      gint      *x,
Packit 98cdb6
					      gint      *y)
Packit 98cdb6
{
Packit 98cdb6
  GdkWindowObject *private = GDK_WINDOW_OBJECT (window);
Packit 98cdb6
  GdkOffscreenWindow *offscreen;
Packit 98cdb6
  int tmpx, tmpy;
Packit 98cdb6
Packit 98cdb6
  tmpx = 0;
Packit 98cdb6
  tmpy = 0;
Packit 98cdb6
Packit 98cdb6
  offscreen = GDK_OFFSCREEN_WINDOW (private->impl);
Packit 98cdb6
  if (offscreen->embedder)
Packit 98cdb6
    {
Packit 98cdb6
      double dx, dy;
Packit 98cdb6
      gdk_window_get_deskrelative_origin (offscreen->embedder,
Packit 98cdb6
					  &tmpx, &tmpy);
Packit 98cdb6
Packit 98cdb6
      to_embedder (window,
Packit 98cdb6
		   0, 0,
Packit 98cdb6
		   &dx, &dy;;
Packit 98cdb6
      tmpx = floor (tmpx + dx + 0.5);
Packit 98cdb6
      tmpy = floor (tmpy + dy + 0.5);
Packit 98cdb6
    }
Packit 98cdb6
Packit 98cdb6
Packit 98cdb6
  if (x)
Packit 98cdb6
    *x = tmpx;
Packit 98cdb6
  if (y)
Packit 98cdb6
    *y = tmpy;
Packit 98cdb6
Packit 98cdb6
  return TRUE;
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static gboolean
Packit 98cdb6
gdk_offscreen_window_get_pointer (GdkWindow       *window,
Packit 98cdb6
				  gint            *x,
Packit 98cdb6
				  gint            *y,
Packit 98cdb6
				  GdkModifierType *mask)
Packit 98cdb6
{
Packit 98cdb6
  GdkWindowObject *private = GDK_WINDOW_OBJECT (window);
Packit 98cdb6
  GdkOffscreenWindow *offscreen;
Packit 98cdb6
  int tmpx, tmpy;
Packit 98cdb6
  double dtmpx, dtmpy;
Packit 98cdb6
  GdkModifierType tmpmask;
Packit 98cdb6
Packit 98cdb6
  tmpx = 0;
Packit 98cdb6
  tmpy = 0;
Packit 98cdb6
  tmpmask = 0;
Packit 98cdb6
Packit 98cdb6
  offscreen = GDK_OFFSCREEN_WINDOW (private->impl);
Packit 98cdb6
  if (offscreen->embedder != NULL)
Packit 98cdb6
    {
Packit 98cdb6
      gdk_window_get_pointer (offscreen->embedder, &tmpx, &tmpy, &tmpmask);
Packit 98cdb6
      from_embedder (window,
Packit 98cdb6
		     tmpx, tmpy,
Packit 98cdb6
		     &dtmpx, &dtmpy);
Packit 98cdb6
      tmpx = floor (dtmpx + 0.5);
Packit 98cdb6
      tmpy = floor (dtmpy + 0.5);
Packit 98cdb6
    }
Packit 98cdb6
Packit 98cdb6
  if (x)
Packit 98cdb6
    *x = tmpx;
Packit 98cdb6
  if (y)
Packit 98cdb6
    *y = tmpy;
Packit 98cdb6
  if (mask)
Packit 98cdb6
    *mask = tmpmask;
Packit 98cdb6
  return TRUE;
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
GdkDrawable *
Packit 98cdb6
_gdk_offscreen_window_get_real_drawable (GdkOffscreenWindow *offscreen)
Packit 98cdb6
{
Packit 98cdb6
  return get_real_drawable (offscreen);
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
/**
Packit 98cdb6
 * gdk_offscreen_window_get_pixmap:
Packit 98cdb6
 * @window: a #GdkWindow
Packit 98cdb6
 *
Packit 98cdb6
 * Gets the offscreen pixmap that an offscreen window renders into.
Packit 98cdb6
 * If you need to keep this around over window resizes, you need to
Packit 98cdb6
 * add a reference to it.
Packit 98cdb6
 *
Packit 98cdb6
 * Returns: The offscreen pixmap, or %NULL if not offscreen
Packit 98cdb6
 *
Packit 98cdb6
 * Since: 2.18
Packit 98cdb6
 */
Packit 98cdb6
GdkPixmap *
Packit 98cdb6
gdk_offscreen_window_get_pixmap (GdkWindow *window)
Packit 98cdb6
{
Packit 98cdb6
  GdkWindowObject *private = (GdkWindowObject *)window;
Packit 98cdb6
  GdkOffscreenWindow *offscreen;
Packit 98cdb6
Packit 98cdb6
  g_return_val_if_fail (GDK_IS_WINDOW (window), FALSE);
Packit 98cdb6
Packit 98cdb6
  if (!GDK_IS_OFFSCREEN_WINDOW (private->impl))
Packit 98cdb6
    return NULL;
Packit 98cdb6
Packit 98cdb6
  offscreen = GDK_OFFSCREEN_WINDOW (private->impl);
Packit 98cdb6
  return offscreen->pixmap;
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static void
Packit 98cdb6
gdk_offscreen_window_raise (GdkWindow *window)
Packit 98cdb6
{
Packit 98cdb6
  /* gdk_window_raise already changed the stacking order */
Packit 98cdb6
  _gdk_synthesize_crossing_events_for_geometry_change (window);
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static void
Packit 98cdb6
gdk_offscreen_window_lower (GdkWindow *window)
Packit 98cdb6
{
Packit 98cdb6
  /* gdk_window_lower already changed the stacking order */
Packit 98cdb6
  _gdk_synthesize_crossing_events_for_geometry_change (window);
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static void
Packit 98cdb6
gdk_offscreen_window_move_resize_internal (GdkWindow *window,
Packit 98cdb6
					   gint       x,
Packit 98cdb6
					   gint       y,
Packit 98cdb6
					   gint       width,
Packit 98cdb6
					   gint       height,
Packit 98cdb6
					   gboolean   send_expose_events)
Packit 98cdb6
{
Packit 98cdb6
  GdkWindowObject *private = (GdkWindowObject *)window;
Packit 98cdb6
  GdkOffscreenWindow *offscreen;
Packit 98cdb6
  gint dx, dy, dw, dh;
Packit 98cdb6
  GdkGC *gc;
Packit 98cdb6
  GdkPixmap *old_pixmap;
Packit 98cdb6
Packit 98cdb6
  offscreen = GDK_OFFSCREEN_WINDOW (private->impl);
Packit 98cdb6
Packit 98cdb6
  if (width < 1)
Packit 98cdb6
    width = 1;
Packit 98cdb6
  if (height < 1)
Packit 98cdb6
    height = 1;
Packit 98cdb6
Packit 98cdb6
  if (private->destroyed)
Packit 98cdb6
    return;
Packit 98cdb6
Packit 98cdb6
  dx = x - private->x;
Packit 98cdb6
  dy = y - private->y;
Packit 98cdb6
  dw = width - private->width;
Packit 98cdb6
  dh = height - private->height;
Packit 98cdb6
Packit 98cdb6
  private->x = x;
Packit 98cdb6
  private->y = y;
Packit 98cdb6
Packit 98cdb6
  if (private->width != width ||
Packit 98cdb6
      private->height != height)
Packit 98cdb6
    {
Packit 98cdb6
      private->width = width;
Packit 98cdb6
      private->height = height;
Packit 98cdb6
Packit 98cdb6
      old_pixmap = offscreen->pixmap;
Packit 98cdb6
      offscreen->pixmap = gdk_pixmap_new (GDK_DRAWABLE (old_pixmap),
Packit 98cdb6
					  width,
Packit 98cdb6
					  height,
Packit 98cdb6
					  private->depth);
Packit 98cdb6
Packit 98cdb6
      gc = _gdk_drawable_get_scratch_gc (offscreen->pixmap, FALSE);
Packit 98cdb6
      gdk_draw_drawable (offscreen->pixmap,
Packit 98cdb6
			 gc,
Packit 98cdb6
			 old_pixmap,
Packit 98cdb6
			 0,0, 0, 0,
Packit 98cdb6
			 -1, -1);
Packit 98cdb6
      g_object_unref (old_pixmap);
Packit 98cdb6
    }
Packit 98cdb6
Packit 98cdb6
  if (GDK_WINDOW_IS_MAPPED (private))
Packit 98cdb6
    {
Packit 98cdb6
      // TODO: Only invalidate new area, i.e. for larger windows
Packit 98cdb6
      gdk_window_invalidate_rect (window, NULL, TRUE);
Packit 98cdb6
      _gdk_synthesize_crossing_events_for_geometry_change (window);
Packit 98cdb6
    }
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static void
Packit 98cdb6
gdk_offscreen_window_move_resize (GdkWindow *window,
Packit 98cdb6
				  gboolean   with_move,
Packit 98cdb6
				  gint       x,
Packit 98cdb6
				  gint       y,
Packit 98cdb6
				  gint       width,
Packit 98cdb6
				  gint       height)
Packit 98cdb6
{
Packit 98cdb6
  GdkWindowObject *private = (GdkWindowObject *)window;
Packit 98cdb6
  GdkOffscreenWindow *offscreen;
Packit 98cdb6
Packit 98cdb6
  offscreen = GDK_OFFSCREEN_WINDOW (private->impl);
Packit 98cdb6
Packit 98cdb6
  if (!with_move)
Packit 98cdb6
    {
Packit 98cdb6
      x = private->x;
Packit 98cdb6
      y = private->y;
Packit 98cdb6
    }
Packit 98cdb6
Packit 98cdb6
  if (width < 0)
Packit 98cdb6
    width = private->width;
Packit 98cdb6
Packit 98cdb6
  if (height < 0)
Packit 98cdb6
    height = private->height;
Packit 98cdb6
Packit 98cdb6
  gdk_offscreen_window_move_resize_internal (window, x, y,
Packit 98cdb6
					     width, height,
Packit 98cdb6
					     TRUE);
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static void
Packit 98cdb6
gdk_offscreen_window_show (GdkWindow *window,
Packit 98cdb6
			   gboolean already_mapped)
Packit 98cdb6
{
Packit 98cdb6
  GdkWindowObject *private = (GdkWindowObject *)window;
Packit 98cdb6
Packit 98cdb6
  gdk_window_clear_area_e (window, 0, 0,
Packit 98cdb6
			   private->width, private->height);
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
Packit 98cdb6
static void
Packit 98cdb6
gdk_offscreen_window_hide (GdkWindow *window)
Packit 98cdb6
{
Packit 98cdb6
  GdkWindowObject *private;
Packit 98cdb6
  GdkOffscreenWindow *offscreen;
Packit 98cdb6
  GdkDisplay *display;
Packit 98cdb6
Packit 98cdb6
  g_return_if_fail (window != NULL);
Packit 98cdb6
Packit 98cdb6
  private = (GdkWindowObject*) window;
Packit 98cdb6
  offscreen = GDK_OFFSCREEN_WINDOW (private->impl);
Packit 98cdb6
Packit 98cdb6
  /* May need to break grabs on children */
Packit 98cdb6
  display = gdk_drawable_get_display (window);
Packit 98cdb6
Packit 98cdb6
  /* TODO: This needs updating to the new grab world */
Packit 98cdb6
#if 0
Packit 98cdb6
  if (display->pointer_grab.window != NULL)
Packit 98cdb6
    {
Packit 98cdb6
      if (is_parent_of (window, display->pointer_grab.window))
Packit 98cdb6
	{
Packit 98cdb6
	  /* Call this ourselves, even though gdk_display_pointer_ungrab
Packit 98cdb6
	     does so too, since we want to pass implicit == TRUE so the
Packit 98cdb6
	     broken grab event is generated */
Packit 98cdb6
	  _gdk_display_unset_has_pointer_grab (display,
Packit 98cdb6
					       TRUE,
Packit 98cdb6
					       FALSE,
Packit 98cdb6
					       GDK_CURRENT_TIME);
Packit 98cdb6
	  gdk_display_pointer_ungrab (display, GDK_CURRENT_TIME);
Packit 98cdb6
	}
Packit 98cdb6
    }
Packit 98cdb6
#endif
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static void
Packit 98cdb6
gdk_offscreen_window_withdraw (GdkWindow *window)
Packit 98cdb6
{
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static GdkEventMask
Packit 98cdb6
gdk_offscreen_window_get_events (GdkWindow *window)
Packit 98cdb6
{
Packit 98cdb6
  return 0;
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static void
Packit 98cdb6
gdk_offscreen_window_set_events (GdkWindow       *window,
Packit 98cdb6
				 GdkEventMask     event_mask)
Packit 98cdb6
{
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static void
Packit 98cdb6
gdk_offscreen_window_set_background (GdkWindow      *window,
Packit 98cdb6
				     const GdkColor *color)
Packit 98cdb6
{
Packit 98cdb6
  GdkWindowObject *private = (GdkWindowObject *)window;
Packit 98cdb6
  GdkColormap *colormap = gdk_drawable_get_colormap (window);
Packit 98cdb6
Packit 98cdb6
  private->bg_color = *color;
Packit 98cdb6
  gdk_colormap_query_color (colormap, private->bg_color.pixel, &private->bg_color);
Packit 98cdb6
Packit 98cdb6
  if (private->bg_pixmap &&
Packit 98cdb6
      private->bg_pixmap != GDK_PARENT_RELATIVE_BG &&
Packit 98cdb6
      private->bg_pixmap != GDK_NO_BG)
Packit 98cdb6
    g_object_unref (private->bg_pixmap);
Packit 98cdb6
Packit 98cdb6
  private->bg_pixmap = NULL;
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static void
Packit 98cdb6
gdk_offscreen_window_set_back_pixmap (GdkWindow *window,
Packit 98cdb6
				      GdkPixmap *pixmap)
Packit 98cdb6
{
Packit 98cdb6
  GdkWindowObject *private = (GdkWindowObject *)window;
Packit 98cdb6
Packit 98cdb6
  if (pixmap &&
Packit 98cdb6
      private->bg_pixmap != GDK_PARENT_RELATIVE_BG &&
Packit 98cdb6
      private->bg_pixmap != GDK_NO_BG &&
Packit 98cdb6
      !gdk_drawable_get_colormap (pixmap))
Packit 98cdb6
    {
Packit 98cdb6
      g_warning ("gdk_window_set_back_pixmap(): pixmap must have a colormap");
Packit 98cdb6
      return;
Packit 98cdb6
    }
Packit 98cdb6
Packit 98cdb6
  if (private->bg_pixmap &&
Packit 98cdb6
      private->bg_pixmap != GDK_PARENT_RELATIVE_BG &&
Packit 98cdb6
      private->bg_pixmap != GDK_NO_BG)
Packit 98cdb6
    g_object_unref (private->bg_pixmap);
Packit 98cdb6
Packit 98cdb6
  private->bg_pixmap = pixmap;
Packit 98cdb6
Packit 98cdb6
  if (pixmap &&
Packit 98cdb6
      private->bg_pixmap != GDK_PARENT_RELATIVE_BG &&
Packit 98cdb6
      private->bg_pixmap != GDK_NO_BG)
Packit 98cdb6
    g_object_ref (pixmap);
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static void
Packit 98cdb6
gdk_offscreen_window_shape_combine_region (GdkWindow       *window,
Packit 98cdb6
					   const GdkRegion *shape_region,
Packit 98cdb6
					   gint             offset_x,
Packit 98cdb6
					   gint             offset_y)
Packit 98cdb6
{
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static void
Packit 98cdb6
gdk_offscreen_window_input_shape_combine_region (GdkWindow       *window,
Packit 98cdb6
						 const GdkRegion *shape_region,
Packit 98cdb6
						 gint             offset_x,
Packit 98cdb6
						 gint             offset_y)
Packit 98cdb6
{
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static gboolean
Packit 98cdb6
gdk_offscreen_window_set_static_gravities (GdkWindow *window,
Packit 98cdb6
					   gboolean   use_static)
Packit 98cdb6
{
Packit 98cdb6
  return TRUE;
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static void
Packit 98cdb6
gdk_offscreen_window_set_cursor (GdkWindow *window,
Packit 98cdb6
				 GdkCursor *cursor)
Packit 98cdb6
{
Packit 98cdb6
  GdkWindowObject *private = (GdkWindowObject *)window;
Packit 98cdb6
  GdkOffscreenWindow *offscreen;
Packit 98cdb6
Packit 98cdb6
  offscreen = GDK_OFFSCREEN_WINDOW (private->impl);
Packit 98cdb6
Packit 98cdb6
  if (offscreen->cursor)
Packit 98cdb6
    {
Packit 98cdb6
      gdk_cursor_unref (offscreen->cursor);
Packit 98cdb6
      offscreen->cursor = NULL;
Packit 98cdb6
    }
Packit 98cdb6
Packit 98cdb6
  if (cursor)
Packit 98cdb6
    offscreen->cursor = gdk_cursor_ref (cursor);
Packit 98cdb6
Packit 98cdb6
  /* TODO: The cursor is never actually used... */
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static void
Packit 98cdb6
gdk_offscreen_window_get_geometry (GdkWindow *window,
Packit 98cdb6
				   gint      *x,
Packit 98cdb6
				   gint      *y,
Packit 98cdb6
				   gint      *width,
Packit 98cdb6
				   gint      *height,
Packit 98cdb6
				   gint      *depth)
Packit 98cdb6
{
Packit 98cdb6
  GdkWindowObject *private = (GdkWindowObject *)window;
Packit 98cdb6
Packit 98cdb6
  g_return_if_fail (window == NULL || GDK_IS_WINDOW (window));
Packit 98cdb6
Packit 98cdb6
  if (!GDK_WINDOW_DESTROYED (window))
Packit 98cdb6
    {
Packit 98cdb6
      if (x)
Packit 98cdb6
	*x = private->x;
Packit 98cdb6
      if (y)
Packit 98cdb6
	*y = private->y;
Packit 98cdb6
      if (width)
Packit 98cdb6
	*width = private->width;
Packit 98cdb6
      if (height)
Packit 98cdb6
	*height = private->height;
Packit 98cdb6
      if (depth)
Packit 98cdb6
	*depth = private->depth;
Packit 98cdb6
    }
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static gboolean
Packit 98cdb6
gdk_offscreen_window_queue_antiexpose (GdkWindow *window,
Packit 98cdb6
				       GdkRegion *area)
Packit 98cdb6
{
Packit 98cdb6
  return FALSE;
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static void
Packit 98cdb6
gdk_offscreen_window_queue_translation (GdkWindow *window,
Packit 98cdb6
					GdkGC     *gc,
Packit 98cdb6
					GdkRegion *area,
Packit 98cdb6
					gint       dx,
Packit 98cdb6
					gint       dy)
Packit 98cdb6
{
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
/**
Packit 98cdb6
 * gdk_offscreen_window_set_embedder:
Packit 98cdb6
 * @window: a #GdkWindow
Packit 98cdb6
 * @embedder: the #GdkWindow that @window gets embedded in
Packit 98cdb6
 *
Packit 98cdb6
 * Sets @window to be embedded in @embedder.
Packit 98cdb6
 *
Packit 98cdb6
 * To fully embed an offscreen window, in addition to calling this
Packit 98cdb6
 * function, it is also necessary to handle the #GdkWindow::pick-embedded-child
Packit 98cdb6
 * signal on the @embedder and the #GdkWindow::to-embedder and
Packit 98cdb6
 * #GdkWindow::from-embedder signals on @window.
Packit 98cdb6
 *
Packit 98cdb6
 * Since: 2.18
Packit 98cdb6
 */
Packit 98cdb6
void
Packit 98cdb6
gdk_offscreen_window_set_embedder (GdkWindow     *window,
Packit 98cdb6
				   GdkWindow     *embedder)
Packit 98cdb6
{
Packit 98cdb6
  GdkWindowObject *private = (GdkWindowObject *)window;
Packit 98cdb6
  GdkOffscreenWindow *offscreen;
Packit 98cdb6
Packit 98cdb6
  g_return_if_fail (GDK_IS_WINDOW (window));
Packit 98cdb6
Packit 98cdb6
  if (!GDK_IS_OFFSCREEN_WINDOW (private->impl))
Packit 98cdb6
    return;
Packit 98cdb6
Packit 98cdb6
  offscreen = GDK_OFFSCREEN_WINDOW (private->impl);
Packit 98cdb6
Packit 98cdb6
  if (embedder)
Packit 98cdb6
    {
Packit 98cdb6
      g_object_ref (embedder);
Packit 98cdb6
      GDK_WINDOW_OBJECT (embedder)->num_offscreen_children++;
Packit 98cdb6
    }
Packit 98cdb6
Packit 98cdb6
  if (offscreen->embedder)
Packit 98cdb6
    {
Packit 98cdb6
      g_object_unref (offscreen->embedder);
Packit 98cdb6
      GDK_WINDOW_OBJECT (offscreen->embedder)->num_offscreen_children--;
Packit 98cdb6
    }
Packit 98cdb6
Packit 98cdb6
  offscreen->embedder = embedder;
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
/**
Packit 98cdb6
 * gdk_offscreen_window_get_embedder:
Packit 98cdb6
 * @window: a #GdkWindow
Packit 98cdb6
 *
Packit 98cdb6
 * Gets the window that @window is embedded in.
Packit 98cdb6
 *
Packit 98cdb6
 * Returns: the embedding #GdkWindow, or %NULL if @window is not an
Packit 98cdb6
 *     embedded offscreen window
Packit 98cdb6
 *
Packit 98cdb6
 * Since: 2.18
Packit 98cdb6
 */
Packit 98cdb6
GdkWindow *
Packit 98cdb6
gdk_offscreen_window_get_embedder (GdkWindow *window)
Packit 98cdb6
{
Packit 98cdb6
  GdkWindowObject *private = (GdkWindowObject *)window;
Packit 98cdb6
  GdkOffscreenWindow *offscreen;
Packit 98cdb6
Packit 98cdb6
  g_return_val_if_fail (GDK_IS_WINDOW (window), NULL);
Packit 98cdb6
Packit 98cdb6
  if (!GDK_IS_OFFSCREEN_WINDOW (private->impl))
Packit 98cdb6
    return NULL;
Packit 98cdb6
Packit 98cdb6
  offscreen = GDK_OFFSCREEN_WINDOW (private->impl);
Packit 98cdb6
Packit 98cdb6
  return offscreen->embedder;
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static void
Packit 98cdb6
gdk_offscreen_window_class_init (GdkOffscreenWindowClass *klass)
Packit 98cdb6
{
Packit 98cdb6
  GdkDrawableClass *drawable_class = GDK_DRAWABLE_CLASS (klass);
Packit 98cdb6
  GObjectClass *object_class = G_OBJECT_CLASS (klass);
Packit 98cdb6
Packit 98cdb6
  object_class->finalize = gdk_offscreen_window_finalize;
Packit 98cdb6
Packit 98cdb6
  drawable_class->create_gc = gdk_offscreen_window_create_gc;
Packit 98cdb6
  drawable_class->_copy_to_image = gdk_offscreen_window_copy_to_image;
Packit 98cdb6
  drawable_class->ref_cairo_surface = gdk_offscreen_window_ref_cairo_surface;
Packit 98cdb6
  drawable_class->set_colormap = gdk_offscreen_window_set_colormap;
Packit 98cdb6
  drawable_class->get_colormap = gdk_offscreen_window_get_colormap;
Packit 98cdb6
  drawable_class->get_depth = gdk_offscreen_window_get_depth;
Packit 98cdb6
  drawable_class->get_screen = gdk_offscreen_window_get_screen;
Packit 98cdb6
  drawable_class->get_visual = gdk_offscreen_window_get_visual;
Packit 98cdb6
  drawable_class->get_source_drawable = gdk_offscreen_window_get_source_drawable;
Packit 98cdb6
  drawable_class->get_composite_drawable = gdk_offscreen_window_get_composite_drawable;
Packit 98cdb6
Packit 98cdb6
  drawable_class->draw_rectangle = gdk_offscreen_window_draw_rectangle;
Packit 98cdb6
  drawable_class->draw_arc = gdk_offscreen_window_draw_arc;
Packit 98cdb6
  drawable_class->draw_polygon = gdk_offscreen_window_draw_polygon;
Packit 98cdb6
  drawable_class->draw_text = gdk_offscreen_window_draw_text;
Packit 98cdb6
  drawable_class->draw_text_wc = gdk_offscreen_window_draw_text_wc;
Packit 98cdb6
  drawable_class->draw_drawable_with_src = gdk_offscreen_window_draw_drawable;
Packit 98cdb6
  drawable_class->draw_points = gdk_offscreen_window_draw_points;
Packit 98cdb6
  drawable_class->draw_segments = gdk_offscreen_window_draw_segments;
Packit 98cdb6
  drawable_class->draw_lines = gdk_offscreen_window_draw_lines;
Packit 98cdb6
  drawable_class->draw_image = gdk_offscreen_window_draw_image;
Packit 98cdb6
  drawable_class->draw_pixbuf = gdk_offscreen_window_draw_pixbuf;
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static void
Packit 98cdb6
gdk_offscreen_window_impl_iface_init (GdkWindowImplIface *iface)
Packit 98cdb6
{
Packit 98cdb6
  iface->show = gdk_offscreen_window_show;
Packit 98cdb6
  iface->hide = gdk_offscreen_window_hide;
Packit 98cdb6
  iface->withdraw = gdk_offscreen_window_withdraw;
Packit 98cdb6
  iface->raise = gdk_offscreen_window_raise;
Packit 98cdb6
  iface->lower = gdk_offscreen_window_lower;
Packit 98cdb6
  iface->move_resize = gdk_offscreen_window_move_resize;
Packit 98cdb6
  iface->set_background = gdk_offscreen_window_set_background;
Packit 98cdb6
  iface->set_back_pixmap = gdk_offscreen_window_set_back_pixmap;
Packit 98cdb6
  iface->get_events = gdk_offscreen_window_get_events;
Packit 98cdb6
  iface->set_events = gdk_offscreen_window_set_events;
Packit 98cdb6
  iface->reparent = gdk_offscreen_window_reparent;
Packit 98cdb6
  iface->set_cursor = gdk_offscreen_window_set_cursor;
Packit 98cdb6
  iface->get_geometry = gdk_offscreen_window_get_geometry;
Packit 98cdb6
  iface->shape_combine_region = gdk_offscreen_window_shape_combine_region;
Packit 98cdb6
  iface->input_shape_combine_region = gdk_offscreen_window_input_shape_combine_region;
Packit 98cdb6
  iface->set_static_gravities = gdk_offscreen_window_set_static_gravities;
Packit 98cdb6
  iface->queue_antiexpose = gdk_offscreen_window_queue_antiexpose;
Packit 98cdb6
  iface->queue_translation = gdk_offscreen_window_queue_translation;
Packit 98cdb6
  iface->get_root_coords = gdk_offscreen_window_get_root_coords;
Packit 98cdb6
  iface->get_deskrelative_origin = gdk_offscreen_window_get_deskrelative_origin;
Packit 98cdb6
  iface->get_pointer = gdk_offscreen_window_get_pointer;
Packit 98cdb6
  iface->destroy = gdk_offscreen_window_destroy;
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
#define __GDK_OFFSCREEN_WINDOW_C__
Packit 98cdb6
#include "gdkaliasdef.c"