Blame gdk/quartz/gdkwindow-quartz.c

Packit 98cdb6
/* gdkwindow-quartz.c
Packit 98cdb6
 *
Packit 98cdb6
 * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
Packit 98cdb6
 * Copyright (C) 2005-2007 Imendio AB
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
#include "config.h"
Packit 98cdb6
#include <Carbon/Carbon.h>
Packit 98cdb6
Packit 98cdb6
#include "gdk.h"
Packit 98cdb6
#include "gdkwindowimpl.h"
Packit 98cdb6
#include "gdkprivate-quartz.h"
Packit 98cdb6
#include "gdkscreen-quartz.h"
Packit 98cdb6
#include "gdkinputprivate.h"
Packit 98cdb6
Packit 98cdb6
static gpointer parent_class;
Packit 98cdb6
Packit 98cdb6
static GSList   *update_nswindows;
Packit 98cdb6
static gboolean  in_process_all_updates = FALSE;
Packit 98cdb6
Packit 98cdb6
static GSList *main_window_stack;
Packit 98cdb6
Packit 98cdb6
#define FULLSCREEN_DATA "fullscreen-data"
Packit 98cdb6
Packit 98cdb6
typedef struct
Packit 98cdb6
{
Packit 98cdb6
  gint            x, y;
Packit 98cdb6
  gint            width, height;
Packit 98cdb6
  GdkWMDecoration decor;
Packit 98cdb6
} FullscreenSavedGeometry;
Packit 98cdb6
Packit 98cdb6
Packit 98cdb6
static void update_toplevel_order (void);
Packit 98cdb6
static void clear_toplevel_order  (void);
Packit 98cdb6
Packit 98cdb6
static FullscreenSavedGeometry *get_fullscreen_geometry (GdkWindow *window);
Packit 98cdb6
Packit 98cdb6
#define WINDOW_IS_TOPLEVEL(window)		     \
Packit 98cdb6
  (GDK_WINDOW_TYPE (window) != GDK_WINDOW_CHILD &&   \
Packit 98cdb6
   GDK_WINDOW_TYPE (window) != GDK_WINDOW_FOREIGN && \
Packit 98cdb6
   GDK_WINDOW_TYPE (window) != GDK_WINDOW_OFFSCREEN)
Packit 98cdb6
Packit 98cdb6
static void gdk_window_impl_iface_init (GdkWindowImplIface *iface);
Packit 98cdb6
Packit 98cdb6
gboolean
Packit 98cdb6
gdk_quartz_window_is_quartz (GdkWindow *window)
Packit 98cdb6
{
Packit 98cdb6
  return GDK_WINDOW_IS_QUARTZ (window);
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
NSView *
Packit 98cdb6
gdk_quartz_window_get_nsview (GdkWindow *window)
Packit 98cdb6
{
Packit 98cdb6
  GdkWindowObject *private = (GdkWindowObject *)window;
Packit 98cdb6
Packit 98cdb6
  g_return_val_if_fail (GDK_WINDOW_IS_QUARTZ (window), NULL);
Packit 98cdb6
Packit 98cdb6
  if (GDK_WINDOW_DESTROYED (window))
Packit 98cdb6
    return NULL;
Packit 98cdb6
Packit 98cdb6
  return ((GdkWindowImplQuartz *)private->impl)->view;
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
NSWindow *
Packit 98cdb6
gdk_quartz_window_get_nswindow (GdkWindow *window)
Packit 98cdb6
{
Packit 98cdb6
  GdkWindowObject *private = (GdkWindowObject *)window;
Packit 98cdb6
Packit 98cdb6
  if (GDK_WINDOW_DESTROYED (window))
Packit 98cdb6
    return NULL;
Packit 98cdb6
Packit 98cdb6
  return ((GdkWindowImplQuartz *)private->impl)->toplevel;
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static CGContextRef
Packit 98cdb6
gdk_window_impl_quartz_get_context (GdkDrawable *drawable,
Packit 98cdb6
				    gboolean     antialias)
Packit 98cdb6
{
Packit 98cdb6
  GdkDrawableImplQuartz *drawable_impl = GDK_DRAWABLE_IMPL_QUARTZ (drawable);
Packit 98cdb6
  GdkWindowImplQuartz *window_impl = GDK_WINDOW_IMPL_QUARTZ (drawable);
Packit 98cdb6
  CGContextRef cg_context;
Packit 98cdb6
Packit 98cdb6
  if (GDK_WINDOW_DESTROYED (drawable_impl->wrapper))
Packit 98cdb6
    return NULL;
Packit 98cdb6
Packit 98cdb6
  /* Lock focus when not called as part of a drawRect call. This
Packit 98cdb6
   * is needed when called from outside "real" expose events, for
Packit 98cdb6
   * example for synthesized expose events when realizing windows
Packit 98cdb6
   * and for widgets that send fake expose events like the arrow
Packit 98cdb6
   * buttons in spinbuttons or the position marker in rulers.
Packit 98cdb6
   */
Packit 98cdb6
  if (window_impl->in_paint_rect_count == 0)
Packit 98cdb6
    {
Packit 98cdb6
      if (![window_impl->view lockFocusIfCanDraw])
Packit 98cdb6
        return NULL;
Packit 98cdb6
    }
Packit 98cdb6
Packit 98cdb6
  cg_context = [[NSGraphicsContext currentContext] graphicsPort];
Packit 98cdb6
  CGContextSaveGState (cg_context);
Packit 98cdb6
  CGContextSetAllowsAntialiasing (cg_context, antialias);
Packit 98cdb6
Packit 98cdb6
  /* We'll emulate the clipping caused by double buffering here */
Packit 98cdb6
  if (window_impl->begin_paint_count != 0)
Packit 98cdb6
    {
Packit 98cdb6
      CGRect rect;
Packit 98cdb6
      CGRect *cg_rects;
Packit 98cdb6
      GdkRectangle *rects;
Packit 98cdb6
      gint n_rects, i;
Packit 98cdb6
Packit 98cdb6
      gdk_region_get_rectangles (window_impl->paint_clip_region,
Packit 98cdb6
                                 &rects, &n_rects);
Packit 98cdb6
Packit 98cdb6
      if (n_rects == 1)
Packit 98cdb6
        cg_rects = ▭
Packit 98cdb6
      else
Packit 98cdb6
        cg_rects = g_new (CGRect, n_rects);
Packit 98cdb6
Packit 98cdb6
      for (i = 0; i < n_rects; i++)
Packit 98cdb6
        {
Packit 98cdb6
          cg_rects[i].origin.x = rects[i].x;
Packit 98cdb6
          cg_rects[i].origin.y = rects[i].y;
Packit 98cdb6
          cg_rects[i].size.width = rects[i].width;
Packit 98cdb6
          cg_rects[i].size.height = rects[i].height;
Packit 98cdb6
        }
Packit 98cdb6
Packit 98cdb6
      CGContextClipToRects (cg_context, cg_rects, n_rects);
Packit 98cdb6
Packit 98cdb6
      g_free (rects);
Packit 98cdb6
      if (cg_rects != &rect)
Packit 98cdb6
        g_free (cg_rects);
Packit 98cdb6
    }
Packit 98cdb6
Packit 98cdb6
  return cg_context;
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static void
Packit 98cdb6
check_grab_unmap (GdkWindow *window)
Packit 98cdb6
{
Packit 98cdb6
  GdkDisplay *display = gdk_drawable_get_display (window);
Packit 98cdb6
Packit 98cdb6
  _gdk_display_end_pointer_grab (display, 0, window, TRUE);
Packit 98cdb6
Packit 98cdb6
  if (display->keyboard_grab.window)
Packit 98cdb6
    {
Packit 98cdb6
      GdkWindowObject *private = GDK_WINDOW_OBJECT (window);
Packit 98cdb6
      GdkWindowObject *tmp = GDK_WINDOW_OBJECT (display->keyboard_grab.window);
Packit 98cdb6
Packit 98cdb6
      while (tmp && tmp != private)
Packit 98cdb6
	tmp = tmp->parent;
Packit 98cdb6
Packit 98cdb6
      if (tmp)
Packit 98cdb6
	_gdk_display_unset_has_keyboard_grab (display, TRUE);
Packit 98cdb6
    }
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static void
Packit 98cdb6
check_grab_destroy (GdkWindow *window)
Packit 98cdb6
{
Packit 98cdb6
  GdkDisplay *display = gdk_drawable_get_display (window);
Packit 98cdb6
  GdkPointerGrabInfo *grab;
Packit 98cdb6
Packit 98cdb6
  /* Make sure there is no lasting grab in this native window */
Packit 98cdb6
  grab = _gdk_display_get_last_pointer_grab (display);
Packit 98cdb6
  if (grab && grab->native_window == window)
Packit 98cdb6
    {
Packit 98cdb6
      /* Serials are always 0 in quartz, but for clarity: */
Packit 98cdb6
      grab->serial_end = grab->serial_start;
Packit 98cdb6
      grab->implicit_ungrab = TRUE;
Packit 98cdb6
    }
Packit 98cdb6
Packit 98cdb6
  if (window == display->keyboard_grab.native_window &&
Packit 98cdb6
      display->keyboard_grab.window != NULL)
Packit 98cdb6
    _gdk_display_unset_has_keyboard_grab (display, TRUE);
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static void
Packit 98cdb6
gdk_window_impl_quartz_finalize (GObject *object)
Packit 98cdb6
{
Packit 98cdb6
  GdkWindowImplQuartz *impl = GDK_WINDOW_IMPL_QUARTZ (object);
Packit 98cdb6
Packit 98cdb6
  check_grab_destroy (GDK_DRAWABLE_IMPL_QUARTZ (object)->wrapper);
Packit 98cdb6
Packit 98cdb6
  if (impl->paint_clip_region)
Packit 98cdb6
    gdk_region_destroy (impl->paint_clip_region);
Packit 98cdb6
Packit 98cdb6
  if (impl->transient_for)
Packit 98cdb6
    g_object_unref (impl->transient_for);
Packit 98cdb6
Packit 98cdb6
  G_OBJECT_CLASS (parent_class)->finalize (object);
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static void
Packit 98cdb6
gdk_window_impl_quartz_class_init (GdkWindowImplQuartzClass *klass)
Packit 98cdb6
{
Packit 98cdb6
  GObjectClass *object_class = G_OBJECT_CLASS (klass);
Packit 98cdb6
  GdkDrawableImplQuartzClass *drawable_quartz_class = GDK_DRAWABLE_IMPL_QUARTZ_CLASS (klass);
Packit 98cdb6
Packit 98cdb6
  parent_class = g_type_class_peek_parent (klass);
Packit 98cdb6
Packit 98cdb6
  object_class->finalize = gdk_window_impl_quartz_finalize;
Packit 98cdb6
Packit 98cdb6
  drawable_quartz_class->get_context = gdk_window_impl_quartz_get_context;
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static void
Packit 98cdb6
gdk_window_impl_quartz_init (GdkWindowImplQuartz *impl)
Packit 98cdb6
{
Packit 98cdb6
  impl->type_hint = GDK_WINDOW_TYPE_HINT_NORMAL;
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static void
Packit 98cdb6
gdk_window_impl_quartz_begin_paint_region (GdkPaintable    *paintable,
Packit 98cdb6
                                           GdkWindow       *window,
Packit 98cdb6
					   const GdkRegion *region)
Packit 98cdb6
{
Packit 98cdb6
  GdkWindowImplQuartz *impl = GDK_WINDOW_IMPL_QUARTZ (paintable);
Packit 98cdb6
  GdkWindowObject *private = (GdkWindowObject*)window;
Packit 98cdb6
  int n_rects;
Packit 98cdb6
  GdkRectangle *rects = NULL;
Packit 98cdb6
  GdkPixmap *bg_pixmap;
Packit 98cdb6
  GdkRegion *clipped_and_offset_region;
Packit 98cdb6
  gboolean free_clipped_and_offset_region = TRUE;
Packit 98cdb6
Packit 98cdb6
  bg_pixmap = private->bg_pixmap;
Packit 98cdb6
Packit 98cdb6
  clipped_and_offset_region = gdk_region_copy (region);
Packit 98cdb6
Packit 98cdb6
  gdk_region_intersect (clipped_and_offset_region,
Packit 98cdb6
                        private->clip_region_with_children);
Packit 98cdb6
  gdk_region_offset (clipped_and_offset_region,
Packit 98cdb6
                     private->abs_x, private->abs_y);
Packit 98cdb6
Packit 98cdb6
  if (impl->begin_paint_count == 0)
Packit 98cdb6
    {
Packit 98cdb6
      impl->paint_clip_region = clipped_and_offset_region;
Packit 98cdb6
      free_clipped_and_offset_region = FALSE;
Packit 98cdb6
    }
Packit 98cdb6
  else
Packit 98cdb6
    gdk_region_union (impl->paint_clip_region, clipped_and_offset_region);
Packit 98cdb6
Packit 98cdb6
  impl->begin_paint_count++;
Packit 98cdb6
Packit 98cdb6
  if (bg_pixmap == GDK_NO_BG)
Packit 98cdb6
    goto done;
Packit 98cdb6
Packit 98cdb6
  gdk_region_get_rectangles (clipped_and_offset_region, &rects, &n_rects);
Packit 98cdb6
Packit 98cdb6
  if (n_rects == 0)
Packit 98cdb6
    goto done;
Packit 98cdb6
Packit 98cdb6
  if (bg_pixmap == NULL)
Packit 98cdb6
    {
Packit 98cdb6
      CGContextRef cg_context;
Packit 98cdb6
      CGColorRef color;
Packit 98cdb6
      gint i;
Packit 98cdb6
Packit 98cdb6
      cg_context = gdk_quartz_drawable_get_context (GDK_DRAWABLE (impl), FALSE);
Packit 98cdb6
      color = _gdk_quartz_colormap_get_cgcolor_from_pixel (window,
Packit 98cdb6
                                                           private->bg_color.pixel);
Packit 98cdb6
      CGContextSetFillColorWithColor (cg_context, color);
Packit 98cdb6
      CGColorRelease (color);
Packit 98cdb6
 
Packit 98cdb6
      for (i = 0; i < n_rects; i++)
Packit 98cdb6
        {
Packit 98cdb6
          CGContextFillRect (cg_context,
Packit 98cdb6
                             CGRectMake (rects[i].x, rects[i].y,
Packit 98cdb6
                                         rects[i].width, rects[i].height));
Packit 98cdb6
        }
Packit 98cdb6
Packit 98cdb6
      gdk_quartz_drawable_release_context (GDK_DRAWABLE (impl), cg_context);
Packit 98cdb6
    }
Packit 98cdb6
  else
Packit 98cdb6
    {
Packit 98cdb6
      int x, y;
Packit 98cdb6
      int x_offset, y_offset;
Packit 98cdb6
      int width, height;
Packit 98cdb6
      GdkGC *gc;
Packit 98cdb6
Packit 98cdb6
      x_offset = y_offset = 0;
Packit 98cdb6
Packit 98cdb6
      while (window && bg_pixmap == GDK_PARENT_RELATIVE_BG)
Packit 98cdb6
        {
Packit 98cdb6
          /* If this window should have the same background as the parent,
Packit 98cdb6
           * fetch the parent. (And if the same goes for the parent, fetch
Packit 98cdb6
           * the grandparent, etc.)
Packit 98cdb6
           */
Packit 98cdb6
          x_offset += ((GdkWindowObject *) window)->x;
Packit 98cdb6
          y_offset += ((GdkWindowObject *) window)->y;
Packit 98cdb6
          window = GDK_WINDOW (((GdkWindowObject *) window)->parent);
Packit 98cdb6
          bg_pixmap = ((GdkWindowObject *) window)->bg_pixmap;
Packit 98cdb6
        }
Packit 98cdb6
Packit 98cdb6
      if (bg_pixmap == NULL || bg_pixmap == GDK_NO_BG || bg_pixmap == GDK_PARENT_RELATIVE_BG)
Packit 98cdb6
        {
Packit 98cdb6
          /* Parent relative background but the parent doesn't have a
Packit 98cdb6
           * pixmap.
Packit 98cdb6
           */ 
Packit 98cdb6
          goto done;
Packit 98cdb6
        }
Packit 98cdb6
Packit 98cdb6
      /* Note: There should be a CG API to draw tiled images, we might
Packit 98cdb6
       * want to look into that for this. 
Packit 98cdb6
       */
Packit 98cdb6
      gc = gdk_gc_new (GDK_DRAWABLE (impl));
Packit 98cdb6
Packit 98cdb6
      gdk_drawable_get_size (GDK_DRAWABLE (bg_pixmap), &width, &height);
Packit 98cdb6
Packit 98cdb6
      x = -x_offset;
Packit 98cdb6
      while (x < (rects[0].x + rects[0].width))
Packit 98cdb6
        {
Packit 98cdb6
          if (x + width >= rects[0].x)
Packit 98cdb6
	    {
Packit 98cdb6
              y = -y_offset;
Packit 98cdb6
              while (y < (rects[0].y + rects[0].height))
Packit 98cdb6
                {
Packit 98cdb6
                  if (y + height >= rects[0].y)
Packit 98cdb6
                    gdk_draw_drawable (GDK_DRAWABLE (impl), gc, bg_pixmap, 0, 0, x, y, width, height);
Packit 98cdb6
		  
Packit 98cdb6
                  y += height;
Packit 98cdb6
                }
Packit 98cdb6
            }
Packit 98cdb6
          x += width;
Packit 98cdb6
        }
Packit 98cdb6
Packit 98cdb6
      g_object_unref (gc);
Packit 98cdb6
    }
Packit 98cdb6
Packit 98cdb6
 done:
Packit 98cdb6
  if (free_clipped_and_offset_region)
Packit 98cdb6
    gdk_region_destroy (clipped_and_offset_region);
Packit 98cdb6
  g_free (rects);
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static void
Packit 98cdb6
gdk_window_impl_quartz_end_paint (GdkPaintable *paintable)
Packit 98cdb6
{
Packit 98cdb6
  GdkWindowImplQuartz *impl = GDK_WINDOW_IMPL_QUARTZ (paintable);
Packit 98cdb6
Packit 98cdb6
  impl->begin_paint_count--;
Packit 98cdb6
Packit 98cdb6
  if (impl->begin_paint_count == 0)
Packit 98cdb6
    {
Packit 98cdb6
      gdk_region_destroy (impl->paint_clip_region);
Packit 98cdb6
      impl->paint_clip_region = NULL;
Packit 98cdb6
    }
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
void
Packit 98cdb6
_gdk_quartz_window_set_needs_display_in_rect (GdkWindow    *window,
Packit 98cdb6
                                              GdkRectangle *rect)
Packit 98cdb6
{
Packit 98cdb6
  GdkWindowObject *private;
Packit 98cdb6
  GdkWindowImplQuartz *impl;
Packit 98cdb6
Packit 98cdb6
  private = GDK_WINDOW_OBJECT (window);
Packit 98cdb6
  impl = GDK_WINDOW_IMPL_QUARTZ (private->impl);
Packit 98cdb6
Packit 98cdb6
  if (!impl->needs_display_region)
Packit 98cdb6
    impl->needs_display_region = gdk_region_new ();
Packit 98cdb6
Packit 98cdb6
  gdk_region_union_with_rect (impl->needs_display_region, rect);
Packit 98cdb6
Packit 98cdb6
  [impl->view setNeedsDisplayInRect:NSMakeRect (rect->x, rect->y,
Packit 98cdb6
                                                rect->width, rect->height)];
Packit 98cdb6
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
void
Packit 98cdb6
_gdk_quartz_window_set_needs_display_in_region (GdkWindow    *window,
Packit 98cdb6
                                                GdkRegion    *region)
Packit 98cdb6
{
Packit 98cdb6
  GdkWindowObject *private;
Packit 98cdb6
  GdkWindowImplQuartz *impl;
Packit 98cdb6
  int i, n_rects;
Packit 98cdb6
  GdkRectangle *rects;
Packit 98cdb6
Packit 98cdb6
  private = GDK_WINDOW_OBJECT (window);
Packit 98cdb6
  impl = GDK_WINDOW_IMPL_QUARTZ (private->impl);
Packit 98cdb6
Packit 98cdb6
  if (!impl->needs_display_region)
Packit 98cdb6
    impl->needs_display_region = gdk_region_new ();
Packit 98cdb6
Packit 98cdb6
  gdk_region_union (impl->needs_display_region, region);
Packit 98cdb6
Packit 98cdb6
  gdk_region_get_rectangles (region, &rects, &n_rects);
Packit 98cdb6
Packit 98cdb6
  for (i = 0; i < n_rects; i++)
Packit 98cdb6
    [impl->view setNeedsDisplayInRect:NSMakeRect (rects[i].x, rects[i].y,
Packit 98cdb6
                                                  rects[i].width,
Packit 98cdb6
                                                  rects[i].height)];
Packit 98cdb6
Packit 98cdb6
  g_free (rects);
Packit 98cdb6
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
void
Packit 98cdb6
_gdk_windowing_window_process_updates_recurse (GdkWindow *window,
Packit 98cdb6
                                               GdkRegion *region)
Packit 98cdb6
{
Packit 98cdb6
  /* Make sure to only flush each toplevel at most once if we're called
Packit 98cdb6
   * from process_all_updates.
Packit 98cdb6
   */
Packit 98cdb6
  if (in_process_all_updates)
Packit 98cdb6
    {
Packit 98cdb6
      GdkWindow *toplevel;
Packit 98cdb6
Packit 98cdb6
      toplevel = gdk_window_get_effective_toplevel (window);
Packit 98cdb6
      if (toplevel && WINDOW_IS_TOPLEVEL (toplevel))
Packit 98cdb6
        {
Packit 98cdb6
          GdkWindowObject *toplevel_private;
Packit 98cdb6
          GdkWindowImplQuartz *toplevel_impl;
Packit 98cdb6
          NSWindow *nswindow;
Packit 98cdb6
Packit 98cdb6
          toplevel_private = (GdkWindowObject *)toplevel;
Packit 98cdb6
          toplevel_impl = (GdkWindowImplQuartz *)toplevel_private->impl;
Packit 98cdb6
          nswindow = toplevel_impl->toplevel;
Packit 98cdb6
Packit 98cdb6
          /* In theory, we could skip the flush disabling, since we only
Packit 98cdb6
           * have one NSView.
Packit 98cdb6
           */
Packit 98cdb6
          if (nswindow && ![nswindow isFlushWindowDisabled]) 
Packit 98cdb6
            {
Packit 98cdb6
              [nswindow retain];
Packit 98cdb6
              [nswindow disableFlushWindow];
Packit 98cdb6
              update_nswindows = g_slist_prepend (update_nswindows, nswindow);
Packit 98cdb6
            }
Packit 98cdb6
        }
Packit 98cdb6
    }
Packit 98cdb6
Packit 98cdb6
  if (WINDOW_IS_TOPLEVEL (window))
Packit 98cdb6
    _gdk_quartz_window_set_needs_display_in_region (window, region);
Packit 98cdb6
  else
Packit 98cdb6
    _gdk_window_process_updates_recurse (window, region);
Packit 98cdb6
Packit 98cdb6
  /* NOTE: I'm not sure if we should displayIfNeeded here. It slows down a
Packit 98cdb6
   * lot (since it triggers the beam syncing) and things seem to work
Packit 98cdb6
   * without it.
Packit 98cdb6
   */
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
void
Packit 98cdb6
_gdk_windowing_before_process_all_updates (void)
Packit 98cdb6
{
Packit 98cdb6
  in_process_all_updates = TRUE;
Packit 98cdb6
Packit 98cdb6
  NSDisableScreenUpdates ();
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
void
Packit 98cdb6
_gdk_windowing_after_process_all_updates (void)
Packit 98cdb6
{
Packit 98cdb6
  GSList *old_update_nswindows = update_nswindows;
Packit 98cdb6
  GSList *tmp_list = update_nswindows;
Packit 98cdb6
Packit 98cdb6
  update_nswindows = NULL;
Packit 98cdb6
Packit 98cdb6
  while (tmp_list)
Packit 98cdb6
    {
Packit 98cdb6
      NSWindow *nswindow = tmp_list->data;
Packit 98cdb6
Packit 98cdb6
      [[nswindow contentView] displayIfNeeded];
Packit 98cdb6
Packit 98cdb6
      _gdk_quartz_drawable_flush (NULL);
Packit 98cdb6
Packit 98cdb6
      [nswindow enableFlushWindow];
Packit 98cdb6
      [nswindow flushWindow];
Packit 98cdb6
      [nswindow release];
Packit 98cdb6
Packit 98cdb6
      tmp_list = tmp_list->next;
Packit 98cdb6
    }
Packit 98cdb6
Packit 98cdb6
  g_slist_free (old_update_nswindows);
Packit 98cdb6
Packit 98cdb6
  in_process_all_updates = FALSE;
Packit 98cdb6
Packit 98cdb6
  NSEnableScreenUpdates ();
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static void
Packit 98cdb6
gdk_window_impl_quartz_paintable_init (GdkPaintableIface *iface)
Packit 98cdb6
{
Packit 98cdb6
  iface->begin_paint_region = gdk_window_impl_quartz_begin_paint_region;
Packit 98cdb6
  iface->end_paint = gdk_window_impl_quartz_end_paint;
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
GType
Packit 98cdb6
_gdk_window_impl_quartz_get_type (void)
Packit 98cdb6
{
Packit 98cdb6
  static GType object_type = 0;
Packit 98cdb6
Packit 98cdb6
  if (!object_type)
Packit 98cdb6
    {
Packit 98cdb6
      const GTypeInfo object_info =
Packit 98cdb6
	{
Packit 98cdb6
	  sizeof (GdkWindowImplQuartzClass),
Packit 98cdb6
	  (GBaseInitFunc) NULL,
Packit 98cdb6
	  (GBaseFinalizeFunc) NULL,
Packit 98cdb6
	  (GClassInitFunc) gdk_window_impl_quartz_class_init,
Packit 98cdb6
	  NULL,           /* class_finalize */
Packit 98cdb6
	  NULL,           /* class_data */
Packit 98cdb6
	  sizeof (GdkWindowImplQuartz),
Packit 98cdb6
	  0,              /* n_preallocs */
Packit 98cdb6
	  (GInstanceInitFunc) gdk_window_impl_quartz_init,
Packit 98cdb6
	};
Packit 98cdb6
Packit 98cdb6
      const GInterfaceInfo paintable_info = 
Packit 98cdb6
	{
Packit 98cdb6
	  (GInterfaceInitFunc) gdk_window_impl_quartz_paintable_init,
Packit 98cdb6
	  NULL,
Packit 98cdb6
	  NULL
Packit 98cdb6
	};
Packit 98cdb6
Packit 98cdb6
      const GInterfaceInfo window_impl_info = 
Packit 98cdb6
	{
Packit 98cdb6
	  (GInterfaceInitFunc) gdk_window_impl_iface_init,
Packit 98cdb6
	  NULL,
Packit 98cdb6
	  NULL
Packit 98cdb6
	};
Packit 98cdb6
Packit 98cdb6
      object_type = g_type_register_static (GDK_TYPE_DRAWABLE_IMPL_QUARTZ,
Packit 98cdb6
                                            "GdkWindowImplQuartz",
Packit 98cdb6
                                            &object_info, 0);
Packit 98cdb6
      g_type_add_interface_static (object_type,
Packit 98cdb6
				   GDK_TYPE_PAINTABLE,
Packit 98cdb6
				   &paintable_info);
Packit 98cdb6
      g_type_add_interface_static (object_type,
Packit 98cdb6
				   GDK_TYPE_WINDOW_IMPL,
Packit 98cdb6
				   &window_impl_info);
Packit 98cdb6
    }
Packit 98cdb6
Packit 98cdb6
  return object_type;
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
GType
Packit 98cdb6
_gdk_window_impl_get_type (void)
Packit 98cdb6
{
Packit 98cdb6
  return _gdk_window_impl_quartz_get_type ();
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static const gchar *
Packit 98cdb6
get_default_title (void)
Packit 98cdb6
{
Packit 98cdb6
  const char *title;
Packit 98cdb6
Packit 98cdb6
  title = g_get_application_name ();
Packit 98cdb6
  if (!title)
Packit 98cdb6
    title = g_get_prgname ();
Packit 98cdb6
Packit 98cdb6
  return title;
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static void
Packit 98cdb6
get_ancestor_coordinates_from_child (GdkWindow *child_window,
Packit 98cdb6
				     gint       child_x,
Packit 98cdb6
				     gint       child_y,
Packit 98cdb6
				     GdkWindow *ancestor_window, 
Packit 98cdb6
				     gint      *ancestor_x, 
Packit 98cdb6
				     gint      *ancestor_y)
Packit 98cdb6
{
Packit 98cdb6
  GdkWindowObject *child_private = GDK_WINDOW_OBJECT (child_window);
Packit 98cdb6
  GdkWindowObject *ancestor_private = GDK_WINDOW_OBJECT (ancestor_window);
Packit 98cdb6
Packit 98cdb6
  while (child_private != ancestor_private)
Packit 98cdb6
    {
Packit 98cdb6
      child_x += child_private->x;
Packit 98cdb6
      child_y += child_private->y;
Packit 98cdb6
Packit 98cdb6
      child_private = child_private->parent;
Packit 98cdb6
    }
Packit 98cdb6
Packit 98cdb6
  *ancestor_x = child_x;
Packit 98cdb6
  *ancestor_y = child_y;
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
void
Packit 98cdb6
_gdk_quartz_window_debug_highlight (GdkWindow *window, gint number)
Packit 98cdb6
{
Packit 98cdb6
  GdkWindowObject *private = GDK_WINDOW_OBJECT (window);
Packit 98cdb6
  gint x, y;
Packit 98cdb6
  gint gx, gy;
Packit 98cdb6
  GdkWindow *toplevel;
Packit 98cdb6
  gint tx, ty;
Packit 98cdb6
  static NSWindow *debug_window[10];
Packit 98cdb6
  static NSRect old_rect[10];
Packit 98cdb6
  NSRect rect;
Packit 98cdb6
  NSColor *color;
Packit 98cdb6
Packit 98cdb6
  g_return_if_fail (number >= 0 && number <= 9);
Packit 98cdb6
Packit 98cdb6
  if (window == _gdk_root)
Packit 98cdb6
    return;
Packit 98cdb6
Packit 98cdb6
  if (window == NULL)
Packit 98cdb6
    {
Packit 98cdb6
      if (debug_window[number])
Packit 98cdb6
        [debug_window[number] close];
Packit 98cdb6
      debug_window[number] = NULL;
Packit 98cdb6
Packit 98cdb6
      return;
Packit 98cdb6
    }
Packit 98cdb6
Packit 98cdb6
  toplevel = gdk_window_get_effective_toplevel (window);
Packit 98cdb6
  get_ancestor_coordinates_from_child (window, 0, 0, toplevel, &x, &y);
Packit 98cdb6
Packit 98cdb6
  gdk_window_get_origin (toplevel, &tx, &ty;;
Packit 98cdb6
  x += tx;
Packit 98cdb6
  y += ty;
Packit 98cdb6
Packit 98cdb6
  _gdk_quartz_window_gdk_xy_to_xy (x, y + private->height,
Packit 98cdb6
                                   &gx, &gy;;
Packit 98cdb6
Packit 98cdb6
  rect = NSMakeRect (gx, gy, private->width, private->height);
Packit 98cdb6
Packit 98cdb6
  if (debug_window[number] && NSEqualRects (rect, old_rect[number]))
Packit 98cdb6
    return;
Packit 98cdb6
Packit 98cdb6
  old_rect[number] = rect;
Packit 98cdb6
Packit 98cdb6
  if (debug_window[number])
Packit 98cdb6
    [debug_window[number] close];
Packit 98cdb6
Packit 98cdb6
  debug_window[number] = [[NSWindow alloc] initWithContentRect:rect
Packit 98cdb6
                                                     styleMask:NSBorderlessWindowMask
Packit 98cdb6
			                               backing:NSBackingStoreBuffered
Packit 98cdb6
			                                 defer:NO];
Packit 98cdb6
Packit 98cdb6
  switch (number)
Packit 98cdb6
    {
Packit 98cdb6
    case 0:
Packit 98cdb6
      color = [NSColor redColor];
Packit 98cdb6
      break;
Packit 98cdb6
    case 1:
Packit 98cdb6
      color = [NSColor blueColor];
Packit 98cdb6
      break;
Packit 98cdb6
    case 2:
Packit 98cdb6
      color = [NSColor greenColor];
Packit 98cdb6
      break;
Packit 98cdb6
    case 3:
Packit 98cdb6
      color = [NSColor yellowColor];
Packit 98cdb6
      break;
Packit 98cdb6
    case 4:
Packit 98cdb6
      color = [NSColor brownColor];
Packit 98cdb6
      break;
Packit 98cdb6
    case 5:
Packit 98cdb6
      color = [NSColor purpleColor];
Packit 98cdb6
      break;
Packit 98cdb6
    default:
Packit 98cdb6
      color = [NSColor blackColor];
Packit 98cdb6
      break;
Packit 98cdb6
    }
Packit 98cdb6
Packit 98cdb6
  [debug_window[number] setBackgroundColor:color];
Packit 98cdb6
  [debug_window[number] setAlphaValue:0.4];
Packit 98cdb6
  [debug_window[number] setOpaque:NO];
Packit 98cdb6
  [debug_window[number] setReleasedWhenClosed:YES];
Packit 98cdb6
  [debug_window[number] setIgnoresMouseEvents:YES];
Packit 98cdb6
  [debug_window[number] setLevel:NSFloatingWindowLevel];
Packit 98cdb6
Packit 98cdb6
  [debug_window[number] orderFront:nil];
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
gboolean
Packit 98cdb6
_gdk_quartz_window_is_ancestor (GdkWindow *ancestor,
Packit 98cdb6
                                GdkWindow *window)
Packit 98cdb6
{
Packit 98cdb6
  if (ancestor == NULL || window == NULL)
Packit 98cdb6
    return FALSE;
Packit 98cdb6
Packit 98cdb6
  return (gdk_window_get_parent (window) == ancestor ||
Packit 98cdb6
          _gdk_quartz_window_is_ancestor (ancestor, 
Packit 98cdb6
                                          gdk_window_get_parent (window)));
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
Packit 98cdb6
/* See notes on top of gdkscreen-quartz.c */
Packit 98cdb6
void
Packit 98cdb6
_gdk_quartz_window_gdk_xy_to_xy (gint  gdk_x,
Packit 98cdb6
                                 gint  gdk_y,
Packit 98cdb6
                                 gint *ns_x,
Packit 98cdb6
                                 gint *ns_y)
Packit 98cdb6
{
Packit 98cdb6
  GdkScreenQuartz *screen_quartz = GDK_SCREEN_QUARTZ (_gdk_screen);
Packit 98cdb6
Packit 98cdb6
  if (ns_y)
Packit 98cdb6
    *ns_y = screen_quartz->height - gdk_y + screen_quartz->min_y;
Packit 98cdb6
Packit 98cdb6
  if (ns_x)
Packit 98cdb6
    *ns_x = gdk_x + screen_quartz->min_x;
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
void
Packit 98cdb6
_gdk_quartz_window_xy_to_gdk_xy (gint  ns_x,
Packit 98cdb6
                                 gint  ns_y,
Packit 98cdb6
                                 gint *gdk_x,
Packit 98cdb6
                                 gint *gdk_y)
Packit 98cdb6
{
Packit 98cdb6
  GdkScreenQuartz *screen_quartz = GDK_SCREEN_QUARTZ (_gdk_screen);
Packit 98cdb6
Packit 98cdb6
  if (gdk_y)
Packit 98cdb6
    *gdk_y = screen_quartz->height - ns_y + screen_quartz->min_y;
Packit 98cdb6
Packit 98cdb6
  if (gdk_x)
Packit 98cdb6
    *gdk_x = ns_x - screen_quartz->min_x;
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
void
Packit 98cdb6
_gdk_quartz_window_nspoint_to_gdk_xy (NSPoint  point,
Packit 98cdb6
                                      gint    *x,
Packit 98cdb6
                                      gint    *y)
Packit 98cdb6
{
Packit 98cdb6
  _gdk_quartz_window_xy_to_gdk_xy (point.x, point.y,
Packit 98cdb6
                                   x, y);
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static GdkWindow *
Packit 98cdb6
find_child_window_helper (GdkWindow *window,
Packit 98cdb6
			  gint       x,
Packit 98cdb6
			  gint       y,
Packit 98cdb6
			  gint       x_offset,
Packit 98cdb6
			  gint       y_offset)
Packit 98cdb6
{
Packit 98cdb6
  GdkWindowImplQuartz *impl;
Packit 98cdb6
  GList *l;
Packit 98cdb6
Packit 98cdb6
  impl = GDK_WINDOW_IMPL_QUARTZ (GDK_WINDOW_OBJECT (window)->impl);
Packit 98cdb6
Packit 98cdb6
  if (window == _gdk_root)
Packit 98cdb6
    update_toplevel_order ();
Packit 98cdb6
Packit 98cdb6
  for (l = impl->sorted_children; l; l = l->next)
Packit 98cdb6
    {
Packit 98cdb6
      GdkWindowObject *child_private = l->data;
Packit 98cdb6
      GdkWindowImplQuartz *child_impl = GDK_WINDOW_IMPL_QUARTZ (child_private->impl);
Packit 98cdb6
      int temp_x, temp_y;
Packit 98cdb6
Packit 98cdb6
      if (!GDK_WINDOW_IS_MAPPED (child_private))
Packit 98cdb6
	continue;
Packit 98cdb6
Packit 98cdb6
      temp_x = x_offset + child_private->x;
Packit 98cdb6
      temp_y = y_offset + child_private->y;
Packit 98cdb6
Packit 98cdb6
      /* Special-case the root window. We have to include the title
Packit 98cdb6
       * bar in the checks, otherwise the window below the title bar
Packit 98cdb6
       * will be found i.e. events punch through. (If we can find a
Packit 98cdb6
       * better way to deal with the events in gdkevents-quartz, this
Packit 98cdb6
       * might not be needed.)
Packit 98cdb6
       */
Packit 98cdb6
      if (window == _gdk_root)
Packit 98cdb6
        {
Packit 98cdb6
          NSRect frame = NSMakeRect (0, 0, 100, 100);
Packit 98cdb6
          NSRect content;
Packit 98cdb6
          NSUInteger mask;
Packit 98cdb6
          int titlebar_height;
Packit 98cdb6
Packit 98cdb6
          mask = [child_impl->toplevel styleMask];
Packit 98cdb6
Packit 98cdb6
          /* Get the title bar height. */
Packit 98cdb6
          content = [NSWindow contentRectForFrameRect:frame
Packit 98cdb6
                                            styleMask:mask];
Packit 98cdb6
          titlebar_height = frame.size.height - content.size.height;
Packit 98cdb6
Packit 98cdb6
          if (titlebar_height > 0 &&
Packit 98cdb6
              x >= temp_x && y >= temp_y - titlebar_height &&
Packit 98cdb6
              x < temp_x + child_private->width && y < temp_y)
Packit 98cdb6
            {
Packit 98cdb6
              /* The root means "unknown" i.e. a window not managed by
Packit 98cdb6
               * GDK.
Packit 98cdb6
               */
Packit 98cdb6
              return (GdkWindow *)_gdk_root;
Packit 98cdb6
            }
Packit 98cdb6
        }
Packit 98cdb6
Packit 98cdb6
      if (x >= temp_x && y >= temp_y &&
Packit 98cdb6
	  x < temp_x + child_private->width && y < temp_y + child_private->height)
Packit 98cdb6
	{
Packit 98cdb6
	  /* Look for child windows. */
Packit 98cdb6
	  return find_child_window_helper (l->data,
Packit 98cdb6
					   x, y,
Packit 98cdb6
					   temp_x, temp_y);
Packit 98cdb6
	}
Packit 98cdb6
    }
Packit 98cdb6
  
Packit 98cdb6
  return window;
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
/* Given a GdkWindow and coordinates relative to it, returns the
Packit 98cdb6
 * innermost subwindow that contains the point. If the coordinates are
Packit 98cdb6
 * outside the passed in window, NULL is returned.
Packit 98cdb6
 */
Packit 98cdb6
GdkWindow *
Packit 98cdb6
_gdk_quartz_window_find_child (GdkWindow *window,
Packit 98cdb6
			       gint       x,
Packit 98cdb6
			       gint       y)
Packit 98cdb6
{
Packit 98cdb6
  GdkWindowObject *private = GDK_WINDOW_OBJECT (window);
Packit 98cdb6
Packit 98cdb6
  if (x >= 0 && y >= 0 && x < private->width && y < private->height)
Packit 98cdb6
    return find_child_window_helper (window, x, y, 0, 0);
Packit 98cdb6
Packit 98cdb6
  return NULL;
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
Packit 98cdb6
void
Packit 98cdb6
_gdk_quartz_window_did_become_main (GdkWindow *window)
Packit 98cdb6
{
Packit 98cdb6
  main_window_stack = g_slist_remove (main_window_stack, window);
Packit 98cdb6
Packit 98cdb6
  if (GDK_WINDOW_OBJECT (window)->window_type != GDK_WINDOW_TEMP)
Packit 98cdb6
    main_window_stack = g_slist_prepend (main_window_stack, window);
Packit 98cdb6
Packit 98cdb6
  clear_toplevel_order ();
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
void
Packit 98cdb6
_gdk_quartz_window_did_resign_main (GdkWindow *window)
Packit 98cdb6
{
Packit 98cdb6
  GdkWindow *new_window = NULL;
Packit 98cdb6
Packit 98cdb6
  if (main_window_stack)
Packit 98cdb6
    new_window = main_window_stack->data;
Packit 98cdb6
  else
Packit 98cdb6
    {
Packit 98cdb6
      GList *toplevels;
Packit 98cdb6
Packit 98cdb6
      toplevels = gdk_window_get_toplevels ();
Packit 98cdb6
      if (toplevels)
Packit 98cdb6
        new_window = toplevels->data;
Packit 98cdb6
      g_list_free (toplevels);
Packit 98cdb6
    }
Packit 98cdb6
Packit 98cdb6
  if (new_window &&
Packit 98cdb6
      new_window != window &&
Packit 98cdb6
      GDK_WINDOW_IS_MAPPED (new_window) &&
Packit 98cdb6
      WINDOW_IS_TOPLEVEL (new_window))
Packit 98cdb6
    {
Packit 98cdb6
      GdkWindowObject *private = (GdkWindowObject *) new_window;
Packit 98cdb6
      GdkWindowImplQuartz *impl = GDK_WINDOW_IMPL_QUARTZ (private->impl);
Packit 98cdb6
Packit 98cdb6
      [impl->toplevel makeKeyAndOrderFront:impl->toplevel];
Packit 98cdb6
    }
Packit 98cdb6
Packit 98cdb6
  clear_toplevel_order ();
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static NSScreen *
Packit 98cdb6
get_nsscreen_for_point (gint x, gint y)
Packit 98cdb6
{
Packit 98cdb6
  int i;
Packit 98cdb6
  NSArray *screens;
Packit 98cdb6
  NSScreen *screen = NULL;
Packit 98cdb6
Packit 98cdb6
  GDK_QUARTZ_ALLOC_POOL;
Packit 98cdb6
Packit 98cdb6
  screens = [NSScreen screens];
Packit 98cdb6
Packit 98cdb6
  for (i = 0; i < [screens count]; i++)
Packit 98cdb6
    {
Packit 98cdb6
      NSRect rect = [[screens objectAtIndex:i] frame];
Packit 98cdb6
Packit 98cdb6
      if (x >= rect.origin.x && x <= rect.origin.x + rect.size.width &&
Packit 98cdb6
          y >= rect.origin.y && y <= rect.origin.y + rect.size.height)
Packit 98cdb6
        {
Packit 98cdb6
          screen = [screens objectAtIndex:i];
Packit 98cdb6
          break;
Packit 98cdb6
        }
Packit 98cdb6
    }
Packit 98cdb6
Packit 98cdb6
  GDK_QUARTZ_RELEASE_POOL;
Packit 98cdb6
Packit 98cdb6
  return screen;
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
void
Packit 98cdb6
_gdk_window_impl_new (GdkWindow     *window,
Packit 98cdb6
		      GdkWindow     *real_parent,
Packit 98cdb6
		      GdkScreen     *screen,
Packit 98cdb6
		      GdkVisual     *visual,
Packit 98cdb6
		      GdkEventMask   event_mask,
Packit 98cdb6
		      GdkWindowAttr *attributes,
Packit 98cdb6
		      gint           attributes_mask)
Packit 98cdb6
{
Packit 98cdb6
  GdkWindowObject *private;
Packit 98cdb6
  GdkWindowImplQuartz *impl;
Packit 98cdb6
  GdkDrawableImplQuartz *draw_impl;
Packit 98cdb6
  GdkWindowImplQuartz *parent_impl;
Packit 98cdb6
Packit 98cdb6
  GDK_QUARTZ_ALLOC_POOL;
Packit 98cdb6
Packit 98cdb6
  private = (GdkWindowObject *)window;
Packit 98cdb6
Packit 98cdb6
  impl = g_object_new (_gdk_window_impl_get_type (), NULL);
Packit 98cdb6
  private->impl = (GdkDrawable *)impl;
Packit 98cdb6
  draw_impl = GDK_DRAWABLE_IMPL_QUARTZ (impl);
Packit 98cdb6
  draw_impl->wrapper = GDK_DRAWABLE (window);
Packit 98cdb6
Packit 98cdb6
  parent_impl = GDK_WINDOW_IMPL_QUARTZ (private->parent->impl);
Packit 98cdb6
Packit 98cdb6
  switch (private->window_type)
Packit 98cdb6
    {
Packit 98cdb6
    case GDK_WINDOW_TOPLEVEL:
Packit 98cdb6
    case GDK_WINDOW_DIALOG:
Packit 98cdb6
    case GDK_WINDOW_TEMP:
Packit 98cdb6
      if (GDK_WINDOW_TYPE (private->parent) != GDK_WINDOW_ROOT)
Packit 98cdb6
	{
Packit 98cdb6
	  /* The common code warns for this case */
Packit 98cdb6
          parent_impl = GDK_WINDOW_IMPL_QUARTZ (GDK_WINDOW_OBJECT (_gdk_root)->impl);
Packit 98cdb6
	}
Packit 98cdb6
    }
Packit 98cdb6
Packit 98cdb6
  if (!private->input_only)
Packit 98cdb6
    {
Packit 98cdb6
      if (attributes_mask & GDK_WA_COLORMAP)
Packit 98cdb6
	{
Packit 98cdb6
	  draw_impl->colormap = attributes->colormap;
Packit 98cdb6
	  g_object_ref (attributes->colormap);
Packit 98cdb6
	}
Packit 98cdb6
      else
Packit 98cdb6
	{
Packit 98cdb6
	  if (visual == gdk_screen_get_system_visual (_gdk_screen))
Packit 98cdb6
	    {
Packit 98cdb6
	      draw_impl->colormap = gdk_screen_get_system_colormap (_gdk_screen);
Packit 98cdb6
	      g_object_ref (draw_impl->colormap);
Packit 98cdb6
	    }
Packit 98cdb6
	  else if (visual == gdk_screen_get_rgba_visual (_gdk_screen))
Packit 98cdb6
	    {
Packit 98cdb6
	      draw_impl->colormap = gdk_screen_get_rgba_colormap (_gdk_screen);
Packit 98cdb6
	      g_object_ref (draw_impl->colormap);
Packit 98cdb6
	    }
Packit 98cdb6
	  else
Packit 98cdb6
	    {
Packit 98cdb6
	      draw_impl->colormap = gdk_colormap_new (visual, FALSE);
Packit 98cdb6
	    }
Packit 98cdb6
	}
Packit 98cdb6
    }
Packit 98cdb6
  else
Packit 98cdb6
    {
Packit 98cdb6
      draw_impl->colormap = gdk_screen_get_system_colormap (_gdk_screen);
Packit 98cdb6
      g_object_ref (draw_impl->colormap);
Packit 98cdb6
    }
Packit 98cdb6
Packit 98cdb6
  /* Maintain the z-ordered list of children. */
Packit 98cdb6
  if (private->parent != (GdkWindowObject *)_gdk_root)
Packit 98cdb6
    parent_impl->sorted_children = g_list_prepend (parent_impl->sorted_children, window);
Packit 98cdb6
  else
Packit 98cdb6
    clear_toplevel_order ();
Packit 98cdb6
Packit 98cdb6
  gdk_window_set_cursor (window, ((attributes_mask & GDK_WA_CURSOR) ?
Packit 98cdb6
				  (attributes->cursor) :
Packit 98cdb6
				  NULL));
Packit 98cdb6
Packit 98cdb6
  switch (attributes->window_type) 
Packit 98cdb6
    {
Packit 98cdb6
    case GDK_WINDOW_TOPLEVEL:
Packit 98cdb6
    case GDK_WINDOW_DIALOG:
Packit 98cdb6
    case GDK_WINDOW_TEMP:
Packit 98cdb6
      {
Packit 98cdb6
        NSScreen *screen;
Packit 98cdb6
        NSRect screen_rect;
Packit 98cdb6
        NSRect content_rect;
Packit 98cdb6
        NSUInteger style_mask;
Packit 98cdb6
        int nx, ny;
Packit 98cdb6
        const char *title;
Packit 98cdb6
Packit 98cdb6
        /* initWithContentRect will place on the mainScreen by default.
Packit 98cdb6
         * We want to select the screen to place on ourselves.  We need
Packit 98cdb6
         * to find the screen the window will be on and correct the
Packit 98cdb6
         * content_rect coordinates to be relative to that screen.
Packit 98cdb6
         */
Packit 98cdb6
        _gdk_quartz_window_gdk_xy_to_xy (private->x, private->y, &nx, &ny;;
Packit 98cdb6
Packit 98cdb6
        screen = get_nsscreen_for_point (nx, ny);
Packit 98cdb6
        screen_rect = [screen frame];
Packit 98cdb6
        nx -= screen_rect.origin.x;
Packit 98cdb6
        ny -= screen_rect.origin.y;
Packit 98cdb6
Packit 98cdb6
        content_rect = NSMakeRect (nx, ny - private->height,
Packit 98cdb6
                                   private->width,
Packit 98cdb6
                                   private->height);
Packit 98cdb6
Packit 98cdb6
        if (attributes->window_type == GDK_WINDOW_TEMP ||
Packit 98cdb6
            attributes->type_hint == GDK_WINDOW_TYPE_HINT_SPLASHSCREEN)
Packit 98cdb6
          {
Packit 98cdb6
            style_mask = NSBorderlessWindowMask;
Packit 98cdb6
          }
Packit 98cdb6
        else
Packit 98cdb6
          {
Packit 98cdb6
            style_mask = (NSTitledWindowMask |
Packit 98cdb6
                          NSClosableWindowMask |
Packit 98cdb6
                          NSMiniaturizableWindowMask |
Packit 98cdb6
                          NSResizableWindowMask);
Packit 98cdb6
          }
Packit 98cdb6
Packit 98cdb6
	impl->toplevel = [[GdkQuartzWindow alloc] initWithContentRect:content_rect 
Packit 98cdb6
			                                    styleMask:style_mask
Packit 98cdb6
			                                      backing:NSBackingStoreBuffered
Packit 98cdb6
			                                        defer:NO
Packit 98cdb6
                                                                screen:screen];
Packit 98cdb6
Packit 98cdb6
	if (attributes_mask & GDK_WA_TITLE)
Packit 98cdb6
	  title = attributes->title;
Packit 98cdb6
	else
Packit 98cdb6
	  title = get_default_title ();
Packit 98cdb6
Packit 98cdb6
	gdk_window_set_title (window, title);
Packit 98cdb6
  
Packit 98cdb6
	if (draw_impl->colormap == gdk_screen_get_rgba_colormap (_gdk_screen))
Packit 98cdb6
	  {
Packit 98cdb6
	    [impl->toplevel setOpaque:NO];
Packit 98cdb6
	    [impl->toplevel setBackgroundColor:[NSColor clearColor]];
Packit 98cdb6
	  }
Packit 98cdb6
Packit 98cdb6
        content_rect.origin.x = 0;
Packit 98cdb6
        content_rect.origin.y = 0;
Packit 98cdb6
Packit 98cdb6
	impl->view = [[GdkQuartzView alloc] initWithFrame:content_rect];
Packit 98cdb6
	[impl->view setGdkWindow:window];
Packit 98cdb6
	[impl->toplevel setContentView:impl->view];
Packit 98cdb6
	[impl->view release];
Packit 98cdb6
      }
Packit 98cdb6
      break;
Packit 98cdb6
Packit 98cdb6
    case GDK_WINDOW_CHILD:
Packit 98cdb6
      {
Packit 98cdb6
	GdkWindowImplQuartz *parent_impl = GDK_WINDOW_IMPL_QUARTZ (GDK_WINDOW_OBJECT (private->parent)->impl);
Packit 98cdb6
Packit 98cdb6
	if (!private->input_only)
Packit 98cdb6
	  {
Packit 98cdb6
	    NSRect frame_rect = NSMakeRect (private->x + private->parent->abs_x,
Packit 98cdb6
                                            private->y + private->parent->abs_y,
Packit 98cdb6
                                            private->width,
Packit 98cdb6
                                            private->height);
Packit 98cdb6
	
Packit 98cdb6
	    impl->view = [[GdkQuartzView alloc] initWithFrame:frame_rect];
Packit 98cdb6
	    
Packit 98cdb6
	    [impl->view setGdkWindow:window];
Packit 98cdb6
Packit 98cdb6
	    /* GdkWindows should be hidden by default */
Packit 98cdb6
	    [impl->view setHidden:YES];
Packit 98cdb6
	    [parent_impl->view addSubview:impl->view];
Packit 98cdb6
	    [impl->view release];
Packit 98cdb6
	  }
Packit 98cdb6
      }
Packit 98cdb6
      break;
Packit 98cdb6
Packit 98cdb6
    default:
Packit 98cdb6
      g_assert_not_reached ();
Packit 98cdb6
    }
Packit 98cdb6
Packit 98cdb6
  GDK_QUARTZ_RELEASE_POOL;
Packit 98cdb6
Packit 98cdb6
  if (attributes_mask & GDK_WA_TYPE_HINT)
Packit 98cdb6
    gdk_window_set_type_hint (window, attributes->type_hint);
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
void
Packit 98cdb6
_gdk_quartz_window_update_position (GdkWindow *window)
Packit 98cdb6
{
Packit 98cdb6
  NSRect frame_rect;
Packit 98cdb6
  NSRect content_rect;
Packit 98cdb6
  GdkWindowObject *private = (GdkWindowObject *)window;
Packit 98cdb6
  GdkWindowImplQuartz *impl = GDK_WINDOW_IMPL_QUARTZ (private->impl);
Packit 98cdb6
Packit 98cdb6
  GDK_QUARTZ_ALLOC_POOL;
Packit 98cdb6
Packit 98cdb6
  frame_rect = [impl->toplevel frame];
Packit 98cdb6
  content_rect = [impl->toplevel contentRectForFrameRect:frame_rect];
Packit 98cdb6
Packit 98cdb6
  _gdk_quartz_window_xy_to_gdk_xy (content_rect.origin.x,
Packit 98cdb6
                                   content_rect.origin.y + content_rect.size.height,
Packit 98cdb6
                                   &private->x, &private->y);
Packit 98cdb6
Packit 98cdb6
Packit 98cdb6
  GDK_QUARTZ_RELEASE_POOL;
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
void
Packit 98cdb6
_gdk_windowing_update_window_sizes (GdkScreen *screen)
Packit 98cdb6
{
Packit 98cdb6
  GList *windows, *list;
Packit 98cdb6
  GdkWindowObject *private = (GdkWindowObject *)_gdk_root;
Packit 98cdb6
Packit 98cdb6
  /* The size of the root window is so that it can contain all
Packit 98cdb6
   * monitors attached to this machine.  The monitors are laid out
Packit 98cdb6
   * within this root window.  We calculate the size of the root window
Packit 98cdb6
   * and the positions of the different monitors in gdkscreen-quartz.c.
Packit 98cdb6
   *
Packit 98cdb6
   * This data is updated when the monitor configuration is changed.
Packit 98cdb6
   */
Packit 98cdb6
  private->x = 0;
Packit 98cdb6
  private->y = 0;
Packit 98cdb6
  private->abs_x = 0;
Packit 98cdb6
  private->abs_y = 0;
Packit 98cdb6
  private->width = gdk_screen_get_width (screen);
Packit 98cdb6
  private->height = gdk_screen_get_height (screen);
Packit 98cdb6
Packit 98cdb6
  windows = gdk_screen_get_toplevel_windows (screen);
Packit 98cdb6
Packit 98cdb6
  for (list = windows; list; list = list->next)
Packit 98cdb6
    _gdk_quartz_window_update_position (list->data);
Packit 98cdb6
Packit 98cdb6
  g_list_free (windows);
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
void
Packit 98cdb6
_gdk_windowing_window_init (void)
Packit 98cdb6
{
Packit 98cdb6
  GdkWindowObject *private;
Packit 98cdb6
  GdkWindowImplQuartz *impl;
Packit 98cdb6
  GdkDrawableImplQuartz *drawable_impl;
Packit 98cdb6
Packit 98cdb6
  g_assert (_gdk_root == NULL);
Packit 98cdb6
Packit 98cdb6
  _gdk_root = g_object_new (GDK_TYPE_WINDOW, NULL);
Packit 98cdb6
Packit 98cdb6
  private = (GdkWindowObject *)_gdk_root;
Packit 98cdb6
  private->impl = g_object_new (_gdk_window_impl_get_type (), NULL);
Packit 98cdb6
  private->impl_window = private;
Packit 98cdb6
Packit 98cdb6
  impl = GDK_WINDOW_IMPL_QUARTZ (GDK_WINDOW_OBJECT (_gdk_root)->impl);
Packit 98cdb6
Packit 98cdb6
  _gdk_windowing_update_window_sizes (_gdk_screen);
Packit 98cdb6
Packit 98cdb6
  private->state = 0; /* We don't want GDK_WINDOW_STATE_WITHDRAWN here */
Packit 98cdb6
  private->window_type = GDK_WINDOW_ROOT;
Packit 98cdb6
  private->depth = 24;
Packit 98cdb6
  private->viewable = TRUE;
Packit 98cdb6
Packit 98cdb6
  drawable_impl = GDK_DRAWABLE_IMPL_QUARTZ (private->impl);
Packit 98cdb6
  
Packit 98cdb6
  drawable_impl->wrapper = GDK_DRAWABLE (private);
Packit 98cdb6
  drawable_impl->colormap = gdk_screen_get_system_colormap (_gdk_screen);
Packit 98cdb6
  g_object_ref (drawable_impl->colormap);
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static void
Packit 98cdb6
_gdk_quartz_window_destroy (GdkWindow *window,
Packit 98cdb6
                            gboolean   recursing,
Packit 98cdb6
                            gboolean   foreign_destroy)
Packit 98cdb6
{
Packit 98cdb6
  GdkWindowObject *private;
Packit 98cdb6
  GdkWindowImplQuartz *impl;
Packit 98cdb6
  GdkWindowObject *parent;
Packit 98cdb6
Packit 98cdb6
  private = GDK_WINDOW_OBJECT (window);
Packit 98cdb6
  impl = GDK_WINDOW_IMPL_QUARTZ (private->impl);
Packit 98cdb6
Packit 98cdb6
  main_window_stack = g_slist_remove (main_window_stack, window);
Packit 98cdb6
Packit 98cdb6
  g_list_free (impl->sorted_children);
Packit 98cdb6
  impl->sorted_children = NULL;
Packit 98cdb6
Packit 98cdb6
  parent = private->parent;
Packit 98cdb6
  if (parent)
Packit 98cdb6
    {
Packit 98cdb6
      GdkWindowImplQuartz *parent_impl = GDK_WINDOW_IMPL_QUARTZ (parent->impl);
Packit 98cdb6
Packit 98cdb6
      parent_impl->sorted_children = g_list_remove (parent_impl->sorted_children, window);
Packit 98cdb6
    }
Packit 98cdb6
Packit 98cdb6
  _gdk_quartz_drawable_finish (GDK_DRAWABLE (impl));
Packit 98cdb6
Packit 98cdb6
  if (!recursing && !foreign_destroy)
Packit 98cdb6
    {
Packit 98cdb6
      GDK_QUARTZ_ALLOC_POOL;
Packit 98cdb6
Packit 98cdb6
      if (impl->toplevel)
Packit 98cdb6
	[impl->toplevel close];
Packit 98cdb6
      else if (impl->view)
Packit 98cdb6
	[impl->view removeFromSuperview];
Packit 98cdb6
Packit 98cdb6
      GDK_QUARTZ_RELEASE_POOL;
Packit 98cdb6
    }
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
void
Packit 98cdb6
_gdk_windowing_window_destroy_foreign (GdkWindow *window)
Packit 98cdb6
{
Packit 98cdb6
  /* Foreign windows aren't supported in OSX. */
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
/* FIXME: This might be possible to simplify with client-side windows. Also
Packit 98cdb6
 * note that already_mapped is not used yet, see the x11 backend.
Packit 98cdb6
*/
Packit 98cdb6
static void
Packit 98cdb6
gdk_window_quartz_show (GdkWindow *window, gboolean already_mapped)
Packit 98cdb6
{
Packit 98cdb6
  GdkWindowObject *private = (GdkWindowObject *)window;
Packit 98cdb6
  GdkWindowImplQuartz *impl = GDK_WINDOW_IMPL_QUARTZ (private->impl);
Packit 98cdb6
  gboolean focus_on_map;
Packit 98cdb6
Packit 98cdb6
  GDK_QUARTZ_ALLOC_POOL;
Packit 98cdb6
Packit 98cdb6
  if (!GDK_WINDOW_IS_MAPPED (window))
Packit 98cdb6
    focus_on_map = private->focus_on_map;
Packit 98cdb6
  else
Packit 98cdb6
    focus_on_map = TRUE;
Packit 98cdb6
Packit 98cdb6
  if (impl->toplevel && WINDOW_IS_TOPLEVEL (window))
Packit 98cdb6
    {
Packit 98cdb6
      gboolean make_key;
Packit 98cdb6
Packit 98cdb6
      make_key = (private->accept_focus && focus_on_map &&
Packit 98cdb6
                  private->window_type != GDK_WINDOW_TEMP);
Packit 98cdb6
Packit 98cdb6
      [(GdkQuartzWindow*)impl->toplevel showAndMakeKey:make_key];
Packit 98cdb6
      clear_toplevel_order ();
Packit 98cdb6
Packit 98cdb6
      _gdk_quartz_events_send_map_event (window);
Packit 98cdb6
    }
Packit 98cdb6
  else
Packit 98cdb6
    {
Packit 98cdb6
      [impl->view setHidden:NO];
Packit 98cdb6
    }
Packit 98cdb6
Packit 98cdb6
  [impl->view setNeedsDisplay:YES];
Packit 98cdb6
Packit 98cdb6
  gdk_synthesize_window_state (window, GDK_WINDOW_STATE_WITHDRAWN, 0);
Packit 98cdb6
Packit 98cdb6
  if (private->state & GDK_WINDOW_STATE_MAXIMIZED)
Packit 98cdb6
    gdk_window_maximize (window);
Packit 98cdb6
Packit 98cdb6
  if (private->state & GDK_WINDOW_STATE_ICONIFIED)
Packit 98cdb6
    gdk_window_iconify (window);
Packit 98cdb6
Packit 98cdb6
  if (impl->transient_for && !GDK_WINDOW_DESTROYED (impl->transient_for))
Packit 98cdb6
    _gdk_quartz_window_attach_to_parent (window);
Packit 98cdb6
Packit 98cdb6
  GDK_QUARTZ_RELEASE_POOL;
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
/* Temporarily unsets the parent window, if the window is a
Packit 98cdb6
 * transient. 
Packit 98cdb6
 */
Packit 98cdb6
void
Packit 98cdb6
_gdk_quartz_window_detach_from_parent (GdkWindow *window)
Packit 98cdb6
{
Packit 98cdb6
  GdkWindowImplQuartz *impl;
Packit 98cdb6
Packit 98cdb6
  g_return_if_fail (GDK_IS_WINDOW (window));
Packit 98cdb6
Packit 98cdb6
  impl = GDK_WINDOW_IMPL_QUARTZ (GDK_WINDOW_OBJECT (window)->impl);
Packit 98cdb6
  
Packit 98cdb6
  g_return_if_fail (impl->toplevel != NULL);
Packit 98cdb6
Packit 98cdb6
  if (impl->transient_for && !GDK_WINDOW_DESTROYED (impl->transient_for))
Packit 98cdb6
    {
Packit 98cdb6
      GdkWindowImplQuartz *parent_impl;
Packit 98cdb6
Packit 98cdb6
      parent_impl = GDK_WINDOW_IMPL_QUARTZ (GDK_WINDOW_OBJECT (impl->transient_for)->impl);
Packit 98cdb6
      [parent_impl->toplevel removeChildWindow:impl->toplevel];
Packit 98cdb6
      clear_toplevel_order ();
Packit 98cdb6
    }
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
/* Re-sets the parent window, if the window is a transient. */
Packit 98cdb6
void
Packit 98cdb6
_gdk_quartz_window_attach_to_parent (GdkWindow *window)
Packit 98cdb6
{
Packit 98cdb6
  GdkWindowImplQuartz *impl;
Packit 98cdb6
Packit 98cdb6
  g_return_if_fail (GDK_IS_WINDOW (window));
Packit 98cdb6
Packit 98cdb6
  impl = GDK_WINDOW_IMPL_QUARTZ (GDK_WINDOW_OBJECT (window)->impl);
Packit 98cdb6
  
Packit 98cdb6
  g_return_if_fail (impl->toplevel != NULL);
Packit 98cdb6
Packit 98cdb6
  if (impl->transient_for && !GDK_WINDOW_DESTROYED (impl->transient_for))
Packit 98cdb6
    {
Packit 98cdb6
      GdkWindowImplQuartz *parent_impl;
Packit 98cdb6
Packit 98cdb6
      parent_impl = GDK_WINDOW_IMPL_QUARTZ (GDK_WINDOW_OBJECT (impl->transient_for)->impl);
Packit 98cdb6
      [parent_impl->toplevel addChildWindow:impl->toplevel ordered:NSWindowAbove];
Packit 98cdb6
      clear_toplevel_order ();
Packit 98cdb6
    }
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
void
Packit 98cdb6
gdk_window_quartz_hide (GdkWindow *window)
Packit 98cdb6
{
Packit 98cdb6
  GdkWindowObject *private = (GdkWindowObject *)window;
Packit 98cdb6
  GdkWindowImplQuartz *impl;
Packit 98cdb6
Packit 98cdb6
  /* Make sure we're not stuck in fullscreen mode. */
Packit 98cdb6
  if (get_fullscreen_geometry (window))
Packit 98cdb6
    SetSystemUIMode (kUIModeNormal, 0);
Packit 98cdb6
Packit 98cdb6
  check_grab_unmap (window);
Packit 98cdb6
Packit 98cdb6
  _gdk_window_clear_update_area (window);
Packit 98cdb6
Packit 98cdb6
  impl = GDK_WINDOW_IMPL_QUARTZ (private->impl);
Packit 98cdb6
Packit 98cdb6
  if (window && WINDOW_IS_TOPLEVEL (window))
Packit 98cdb6
    {
Packit 98cdb6
     /* Update main window. */
Packit 98cdb6
      main_window_stack = g_slist_remove (main_window_stack, window);
Packit 98cdb6
      if ([NSApp mainWindow] == impl->toplevel)
Packit 98cdb6
        _gdk_quartz_window_did_resign_main (window);
Packit 98cdb6
Packit 98cdb6
      if (impl->transient_for)
Packit 98cdb6
        _gdk_quartz_window_detach_from_parent (window);
Packit 98cdb6
Packit 98cdb6
      [(GdkQuartzWindow*)impl->toplevel hide];
Packit 98cdb6
    }
Packit 98cdb6
  else if (impl->view)
Packit 98cdb6
    {
Packit 98cdb6
      [impl->view setHidden:YES];
Packit 98cdb6
    }
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
void
Packit 98cdb6
gdk_window_quartz_withdraw (GdkWindow *window)
Packit 98cdb6
{
Packit 98cdb6
  gdk_window_hide (window);
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static void
Packit 98cdb6
move_resize_window_internal (GdkWindow *window,
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
  GdkWindowImplQuartz *impl;
Packit 98cdb6
  GdkRectangle old_visible;
Packit 98cdb6
  GdkRectangle new_visible;
Packit 98cdb6
  GdkRectangle scroll_rect;
Packit 98cdb6
  GdkRegion *old_region;
Packit 98cdb6
  GdkRegion *expose_region;
Packit 98cdb6
  NSSize delta;
Packit 98cdb6
Packit 98cdb6
  if (GDK_WINDOW_DESTROYED (window))
Packit 98cdb6
    return;
Packit 98cdb6
Packit 98cdb6
  impl = GDK_WINDOW_IMPL_QUARTZ (private->impl);
Packit 98cdb6
Packit 98cdb6
  if ((x == -1 || (x == private->x)) &&
Packit 98cdb6
      (y == -1 || (y == private->y)) &&
Packit 98cdb6
      (width == -1 || (width == private->width)) &&
Packit 98cdb6
      (height == -1 || (height == private->height)))
Packit 98cdb6
    {
Packit 98cdb6
      return;
Packit 98cdb6
    }
Packit 98cdb6
Packit 98cdb6
  if (!impl->toplevel)
Packit 98cdb6
    {
Packit 98cdb6
      /* The previously visible area of this window in a coordinate
Packit 98cdb6
       * system rooted at the origin of this window.
Packit 98cdb6
       */
Packit 98cdb6
      old_visible.x = -private->x;
Packit 98cdb6
      old_visible.y = -private->y;
Packit 98cdb6
Packit 98cdb6
      gdk_window_get_size (GDK_DRAWABLE (private->parent), 
Packit 98cdb6
                           &old_visible.width, 
Packit 98cdb6
                           &old_visible.height);
Packit 98cdb6
    }
Packit 98cdb6
Packit 98cdb6
  if (x != -1)
Packit 98cdb6
    {
Packit 98cdb6
      delta.width = x - private->x;
Packit 98cdb6
      private->x = x;
Packit 98cdb6
    }
Packit 98cdb6
  else
Packit 98cdb6
    {
Packit 98cdb6
      delta.width = 0;
Packit 98cdb6
    }
Packit 98cdb6
Packit 98cdb6
  if (y != -1)
Packit 98cdb6
    {
Packit 98cdb6
      delta.height = y - private->y;
Packit 98cdb6
      private->y = y;
Packit 98cdb6
    }
Packit 98cdb6
  else
Packit 98cdb6
    {
Packit 98cdb6
      delta.height = 0;
Packit 98cdb6
    }
Packit 98cdb6
Packit 98cdb6
  if (width != -1)
Packit 98cdb6
    private->width = width;
Packit 98cdb6
Packit 98cdb6
  if (height != -1)
Packit 98cdb6
    private->height = height;
Packit 98cdb6
Packit 98cdb6
  GDK_QUARTZ_ALLOC_POOL;
Packit 98cdb6
Packit 98cdb6
  if (impl->toplevel)
Packit 98cdb6
    {
Packit 98cdb6
      NSRect content_rect;
Packit 98cdb6
      NSRect frame_rect;
Packit 98cdb6
      gint gx, gy;
Packit 98cdb6
Packit 98cdb6
      _gdk_quartz_window_gdk_xy_to_xy (private->x, private->y + private->height,
Packit 98cdb6
                                       &gx, &gy;;
Packit 98cdb6
Packit 98cdb6
      content_rect = NSMakeRect (gx, gy, private->width, private->height);
Packit 98cdb6
Packit 98cdb6
      frame_rect = [impl->toplevel frameRectForContentRect:content_rect];
Packit 98cdb6
      [impl->toplevel setFrame:frame_rect display:YES];
Packit 98cdb6
    }
Packit 98cdb6
  else 
Packit 98cdb6
    {
Packit 98cdb6
      if (!private->input_only)
Packit 98cdb6
        {
Packit 98cdb6
          NSRect nsrect;
Packit 98cdb6
Packit 98cdb6
          nsrect = NSMakeRect (private->x, private->y, private->width, private->height);
Packit 98cdb6
Packit 98cdb6
          /* The newly visible area of this window in a coordinate
Packit 98cdb6
           * system rooted at the origin of this window.
Packit 98cdb6
           */
Packit 98cdb6
          new_visible.x = -private->x;
Packit 98cdb6
          new_visible.y = -private->y;
Packit 98cdb6
          new_visible.width = old_visible.width;   /* parent has not changed size */
Packit 98cdb6
          new_visible.height = old_visible.height; /* parent has not changed size */
Packit 98cdb6
Packit 98cdb6
          expose_region = gdk_region_rectangle (&new_visible);
Packit 98cdb6
          old_region = gdk_region_rectangle (&old_visible);
Packit 98cdb6
          gdk_region_subtract (expose_region, old_region);
Packit 98cdb6
Packit 98cdb6
          /* Determine what (if any) part of the previously visible
Packit 98cdb6
           * part of the window can be copied without a redraw
Packit 98cdb6
           */
Packit 98cdb6
          scroll_rect = old_visible;
Packit 98cdb6
          scroll_rect.x -= delta.width;
Packit 98cdb6
          scroll_rect.y -= delta.height;
Packit 98cdb6
          gdk_rectangle_intersect (&scroll_rect, &old_visible, &scroll_rect);
Packit 98cdb6
Packit 98cdb6
          if (!gdk_region_empty (expose_region))
Packit 98cdb6
            {
Packit 98cdb6
              GdkRectangle* rects;
Packit 98cdb6
              gint n_rects;
Packit 98cdb6
              gint n;
Packit 98cdb6
Packit 98cdb6
              if (scroll_rect.width != 0 && scroll_rect.height != 0)
Packit 98cdb6
                {
Packit 98cdb6
                  [impl->view scrollRect:NSMakeRect (scroll_rect.x,
Packit 98cdb6
                                                     scroll_rect.y,
Packit 98cdb6
                                                     scroll_rect.width,
Packit 98cdb6
                                                     scroll_rect.height)
Packit 98cdb6
			              by:delta];
Packit 98cdb6
                }
Packit 98cdb6
Packit 98cdb6
              [impl->view setFrame:nsrect];
Packit 98cdb6
Packit 98cdb6
              gdk_region_get_rectangles (expose_region, &rects, &n_rects);
Packit 98cdb6
Packit 98cdb6
              for (n = 0; n < n_rects; ++n)
Packit 98cdb6
                _gdk_quartz_window_set_needs_display_in_rect (window, &rects[n]);
Packit 98cdb6
Packit 98cdb6
              g_free (rects);
Packit 98cdb6
            }
Packit 98cdb6
          else
Packit 98cdb6
            {
Packit 98cdb6
              [impl->view setFrame:nsrect];
Packit 98cdb6
              [impl->view setNeedsDisplay:YES];
Packit 98cdb6
            }
Packit 98cdb6
Packit 98cdb6
          gdk_region_destroy (expose_region);
Packit 98cdb6
          gdk_region_destroy (old_region);
Packit 98cdb6
        }
Packit 98cdb6
    }
Packit 98cdb6
Packit 98cdb6
  GDK_QUARTZ_RELEASE_POOL;
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static inline void
Packit 98cdb6
window_quartz_move (GdkWindow *window,
Packit 98cdb6
                    gint       x,
Packit 98cdb6
                    gint       y)
Packit 98cdb6
{
Packit 98cdb6
  g_return_if_fail (GDK_IS_WINDOW (window));
Packit 98cdb6
Packit 98cdb6
  if (((GdkWindowObject *)window)->state & GDK_WINDOW_STATE_FULLSCREEN)
Packit 98cdb6
    return;
Packit 98cdb6
Packit 98cdb6
  move_resize_window_internal (window, x, y, -1, -1);
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static inline void
Packit 98cdb6
window_quartz_resize (GdkWindow *window,
Packit 98cdb6
                      gint       width,
Packit 98cdb6
                      gint       height)
Packit 98cdb6
{
Packit 98cdb6
  g_return_if_fail (GDK_IS_WINDOW (window));
Packit 98cdb6
Packit 98cdb6
  if (((GdkWindowObject *)window)->state & GDK_WINDOW_STATE_FULLSCREEN)
Packit 98cdb6
    return;
Packit 98cdb6
Packit 98cdb6
  if (width < 1)
Packit 98cdb6
    width = 1;
Packit 98cdb6
  if (height < 1)
Packit 98cdb6
    height = 1;
Packit 98cdb6
Packit 98cdb6
  move_resize_window_internal (window, -1, -1, width, height);
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static inline void
Packit 98cdb6
window_quartz_move_resize (GdkWindow *window,
Packit 98cdb6
                           gint       x,
Packit 98cdb6
                           gint       y,
Packit 98cdb6
                           gint       width,
Packit 98cdb6
                           gint       height)
Packit 98cdb6
{
Packit 98cdb6
  if (width < 1)
Packit 98cdb6
    width = 1;
Packit 98cdb6
  if (height < 1)
Packit 98cdb6
    height = 1;
Packit 98cdb6
Packit 98cdb6
  move_resize_window_internal (window, x, y, width, height);
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static void
Packit 98cdb6
gdk_window_quartz_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
  if (with_move && (width < 0 && height < 0))
Packit 98cdb6
    window_quartz_move (window, x, y);
Packit 98cdb6
  else
Packit 98cdb6
    {
Packit 98cdb6
      if (with_move)
Packit 98cdb6
        window_quartz_move_resize (window, x, y, width, height);
Packit 98cdb6
      else
Packit 98cdb6
        window_quartz_resize (window, width, height);
Packit 98cdb6
    }
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
/* FIXME: This might need fixing (reparenting didn't work before client-side
Packit 98cdb6
 * windows either).
Packit 98cdb6
 */
Packit 98cdb6
static gboolean
Packit 98cdb6
gdk_window_quartz_reparent (GdkWindow *window,
Packit 98cdb6
                            GdkWindow *new_parent,
Packit 98cdb6
                            gint       x,
Packit 98cdb6
                            gint       y)
Packit 98cdb6
{
Packit 98cdb6
  GdkWindowObject *private, *old_parent_private, *new_parent_private;
Packit 98cdb6
  GdkWindowImplQuartz *impl, *old_parent_impl, *new_parent_impl;
Packit 98cdb6
  NSView *view, *new_parent_view;
Packit 98cdb6
Packit 98cdb6
  if (new_parent == _gdk_root)
Packit 98cdb6
    {
Packit 98cdb6
      /* Could be added, just needs implementing. */
Packit 98cdb6
      g_warning ("Reparenting to root window is not supported yet in the Mac OS X backend");
Packit 98cdb6
      return FALSE;
Packit 98cdb6
    }
Packit 98cdb6
Packit 98cdb6
  private = GDK_WINDOW_OBJECT (window);
Packit 98cdb6
  impl = GDK_WINDOW_IMPL_QUARTZ (private->impl);
Packit 98cdb6
  view = impl->view;
Packit 98cdb6
Packit 98cdb6
  new_parent_private = GDK_WINDOW_OBJECT (new_parent);
Packit 98cdb6
  new_parent_impl = GDK_WINDOW_IMPL_QUARTZ (new_parent_private->impl);
Packit 98cdb6
  new_parent_view = new_parent_impl->view;
Packit 98cdb6
Packit 98cdb6
  old_parent_private = GDK_WINDOW_OBJECT (private->parent);
Packit 98cdb6
  old_parent_impl = GDK_WINDOW_IMPL_QUARTZ (old_parent_private->impl);
Packit 98cdb6
Packit 98cdb6
  [view retain];
Packit 98cdb6
Packit 98cdb6
  [view removeFromSuperview];
Packit 98cdb6
  [new_parent_view addSubview:view];
Packit 98cdb6
Packit 98cdb6
  [view release];
Packit 98cdb6
Packit 98cdb6
  private->parent = new_parent_private;
Packit 98cdb6
Packit 98cdb6
  if (old_parent_private)
Packit 98cdb6
    {
Packit 98cdb6
      old_parent_impl->sorted_children = g_list_remove (old_parent_impl->sorted_children, window);
Packit 98cdb6
    }
Packit 98cdb6
Packit 98cdb6
  new_parent_impl->sorted_children = g_list_prepend (new_parent_impl->sorted_children, window);
Packit 98cdb6
Packit 98cdb6
  return FALSE;
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
/* Get the toplevel ordering from NSApp and update our own list. We do
Packit 98cdb6
 * this on demand since the NSApp's list is not up to date directly
Packit 98cdb6
 * after we get windowDidBecomeMain.
Packit 98cdb6
 */
Packit 98cdb6
static void
Packit 98cdb6
update_toplevel_order (void)
Packit 98cdb6
{
Packit 98cdb6
  GdkWindowObject *root;
Packit 98cdb6
  GdkWindowImplQuartz *root_impl;
Packit 98cdb6
  NSEnumerator *enumerator;
Packit 98cdb6
  id nswindow;
Packit 98cdb6
  GList *toplevels = NULL;
Packit 98cdb6
Packit 98cdb6
  root = GDK_WINDOW_OBJECT (_gdk_root);
Packit 98cdb6
  root_impl = GDK_WINDOW_IMPL_QUARTZ (root->impl);
Packit 98cdb6
Packit 98cdb6
  if (root_impl->sorted_children)
Packit 98cdb6
    return;
Packit 98cdb6
Packit 98cdb6
  GDK_QUARTZ_ALLOC_POOL;
Packit 98cdb6
Packit 98cdb6
  enumerator = [[NSApp orderedWindows] objectEnumerator];
Packit 98cdb6
  while ((nswindow = [enumerator nextObject]))
Packit 98cdb6
    {
Packit 98cdb6
      GdkWindow *window;
Packit 98cdb6
Packit 98cdb6
      if (![[nswindow contentView] isKindOfClass:[GdkQuartzView class]])
Packit 98cdb6
        continue;
Packit 98cdb6
Packit 98cdb6
      window = [(GdkQuartzView *)[nswindow contentView] gdkWindow];
Packit 98cdb6
      toplevels = g_list_prepend (toplevels, window);
Packit 98cdb6
    }
Packit 98cdb6
Packit 98cdb6
  GDK_QUARTZ_RELEASE_POOL;
Packit 98cdb6
Packit 98cdb6
  root_impl->sorted_children = g_list_reverse (toplevels);
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static void
Packit 98cdb6
clear_toplevel_order (void)
Packit 98cdb6
{
Packit 98cdb6
  GdkWindowObject *root;
Packit 98cdb6
  GdkWindowImplQuartz *root_impl;
Packit 98cdb6
Packit 98cdb6
  root = GDK_WINDOW_OBJECT (_gdk_root);
Packit 98cdb6
  root_impl = GDK_WINDOW_IMPL_QUARTZ (root->impl);
Packit 98cdb6
Packit 98cdb6
  g_list_free (root_impl->sorted_children);
Packit 98cdb6
  root_impl->sorted_children = NULL;
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static void
Packit 98cdb6
gdk_window_quartz_raise (GdkWindow *window)
Packit 98cdb6
{
Packit 98cdb6
  if (GDK_WINDOW_DESTROYED (window))
Packit 98cdb6
    return;
Packit 98cdb6
Packit 98cdb6
  if (WINDOW_IS_TOPLEVEL (window))
Packit 98cdb6
    {
Packit 98cdb6
      GdkWindowImplQuartz *impl;
Packit 98cdb6
Packit 98cdb6
      impl = GDK_WINDOW_IMPL_QUARTZ (GDK_WINDOW_OBJECT (window)->impl);
Packit 98cdb6
      [impl->toplevel orderFront:impl->toplevel];
Packit 98cdb6
Packit 98cdb6
      clear_toplevel_order ();
Packit 98cdb6
    }
Packit 98cdb6
  else
Packit 98cdb6
    {
Packit 98cdb6
      GdkWindowObject *parent = GDK_WINDOW_OBJECT (window)->parent;
Packit 98cdb6
Packit 98cdb6
      if (parent)
Packit 98cdb6
        {
Packit 98cdb6
          GdkWindowImplQuartz *impl;
Packit 98cdb6
Packit 98cdb6
          impl = (GdkWindowImplQuartz *)parent->impl;
Packit 98cdb6
Packit 98cdb6
          impl->sorted_children = g_list_remove (impl->sorted_children, window);
Packit 98cdb6
          impl->sorted_children = g_list_prepend (impl->sorted_children, window);
Packit 98cdb6
        }
Packit 98cdb6
    }
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static void
Packit 98cdb6
gdk_window_quartz_lower (GdkWindow *window)
Packit 98cdb6
{
Packit 98cdb6
  if (GDK_WINDOW_DESTROYED (window))
Packit 98cdb6
    return;
Packit 98cdb6
Packit 98cdb6
  if (WINDOW_IS_TOPLEVEL (window))
Packit 98cdb6
    {
Packit 98cdb6
      GdkWindowImplQuartz *impl;
Packit 98cdb6
Packit 98cdb6
      impl = GDK_WINDOW_IMPL_QUARTZ (GDK_WINDOW_OBJECT (window)->impl);
Packit 98cdb6
      [impl->toplevel orderBack:impl->toplevel];
Packit 98cdb6
Packit 98cdb6
      clear_toplevel_order ();
Packit 98cdb6
    }
Packit 98cdb6
  else
Packit 98cdb6
    {
Packit 98cdb6
      GdkWindowObject *parent = GDK_WINDOW_OBJECT (window)->parent;
Packit 98cdb6
Packit 98cdb6
      if (parent)
Packit 98cdb6
        {
Packit 98cdb6
          GdkWindowImplQuartz *impl;
Packit 98cdb6
Packit 98cdb6
          impl = (GdkWindowImplQuartz *)parent->impl;
Packit 98cdb6
Packit 98cdb6
          impl->sorted_children = g_list_remove (impl->sorted_children, window);
Packit 98cdb6
          impl->sorted_children = g_list_append (impl->sorted_children, window);
Packit 98cdb6
        }
Packit 98cdb6
    }
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static void
Packit 98cdb6
gdk_window_quartz_restack_toplevel (GdkWindow *window,
Packit 98cdb6
				    GdkWindow *sibling,
Packit 98cdb6
				    gboolean   above)
Packit 98cdb6
{
Packit 98cdb6
  GdkWindowImplQuartz *impl;
Packit 98cdb6
  gint sibling_num;
Packit 98cdb6
Packit 98cdb6
  impl = GDK_WINDOW_IMPL_QUARTZ (((GdkWindowObject *)sibling)->impl);
Packit 98cdb6
  sibling_num = [impl->toplevel windowNumber];
Packit 98cdb6
Packit 98cdb6
  impl = GDK_WINDOW_IMPL_QUARTZ (((GdkWindowObject *)window)->impl);
Packit 98cdb6
Packit 98cdb6
  if (above)
Packit 98cdb6
    [impl->toplevel orderWindow:NSWindowAbove relativeTo:sibling_num];
Packit 98cdb6
  else
Packit 98cdb6
    [impl->toplevel orderWindow:NSWindowBelow relativeTo:sibling_num];
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static void
Packit 98cdb6
gdk_window_quartz_set_background (GdkWindow      *window,
Packit 98cdb6
                                  const GdkColor *color)
Packit 98cdb6
{
Packit 98cdb6
  /* FIXME: We could theoretically set the background color for toplevels
Packit 98cdb6
   * here. (Currently we draw the background before emitting expose events)
Packit 98cdb6
   */
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static void
Packit 98cdb6
gdk_window_quartz_set_back_pixmap (GdkWindow *window,
Packit 98cdb6
                                   GdkPixmap *pixmap)
Packit 98cdb6
{
Packit 98cdb6
  /* FIXME: Could theoretically set some background image here. (Currently
Packit 98cdb6
   * the back pixmap is drawn before emitting expose events.
Packit 98cdb6
   */
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static void
Packit 98cdb6
gdk_window_quartz_set_cursor (GdkWindow *window,
Packit 98cdb6
                              GdkCursor *cursor)
Packit 98cdb6
{
Packit 98cdb6
  GdkCursorPrivate *cursor_private;
Packit 98cdb6
  NSCursor *nscursor;
Packit 98cdb6
Packit 98cdb6
  cursor_private = (GdkCursorPrivate *)cursor;
Packit 98cdb6
Packit 98cdb6
  if (GDK_WINDOW_DESTROYED (window))
Packit 98cdb6
    return;
Packit 98cdb6
Packit 98cdb6
  if (!cursor)
Packit 98cdb6
    nscursor = [NSCursor arrowCursor];
Packit 98cdb6
  else 
Packit 98cdb6
    nscursor = cursor_private->nscursor;
Packit 98cdb6
Packit 98cdb6
  [nscursor set];
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static void
Packit 98cdb6
gdk_window_quartz_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
  GdkWindowImplQuartz *impl;
Packit 98cdb6
  GdkWindowObject *private;
Packit 98cdb6
  NSRect ns_rect;
Packit 98cdb6
Packit 98cdb6
  if (GDK_WINDOW_DESTROYED (window))
Packit 98cdb6
    return;
Packit 98cdb6
Packit 98cdb6
  impl = GDK_WINDOW_IMPL_QUARTZ (GDK_WINDOW_OBJECT (window)->impl);
Packit 98cdb6
  private = GDK_WINDOW_OBJECT (window);
Packit 98cdb6
  if (window == _gdk_root)
Packit 98cdb6
    {
Packit 98cdb6
      if (x) 
Packit 98cdb6
        *x = 0;
Packit 98cdb6
      if (y) 
Packit 98cdb6
        *y = 0;
Packit 98cdb6
Packit 98cdb6
      if (width) 
Packit 98cdb6
        *width = private->width;
Packit 98cdb6
      if (height)
Packit 98cdb6
        *height = private->height;
Packit 98cdb6
    }
Packit 98cdb6
  else if (WINDOW_IS_TOPLEVEL (window))
Packit 98cdb6
    {
Packit 98cdb6
      ns_rect = [impl->toplevel contentRectForFrameRect:[impl->toplevel frame]];
Packit 98cdb6
Packit 98cdb6
      /* This doesn't work exactly as in X. There doesn't seem to be a
Packit 98cdb6
       * way to get the coords relative to the parent window (usually
Packit 98cdb6
       * the window frame), but that seems useless except for
Packit 98cdb6
       * borderless windows where it's relative to the root window. So
Packit 98cdb6
       * we return (0, 0) (should be something like (0, 22)) for
Packit 98cdb6
       * windows with borders and the root relative coordinates
Packit 98cdb6
       * otherwise.
Packit 98cdb6
       */
Packit 98cdb6
      if ([impl->toplevel styleMask] == NSBorderlessWindowMask)
Packit 98cdb6
        {
Packit 98cdb6
          _gdk_quartz_window_xy_to_gdk_xy (ns_rect.origin.x,
Packit 98cdb6
                                           ns_rect.origin.y + ns_rect.size.height,
Packit 98cdb6
                                           x, y);
Packit 98cdb6
        }
Packit 98cdb6
      else 
Packit 98cdb6
        {
Packit 98cdb6
          if (x)
Packit 98cdb6
            *x = 0;
Packit 98cdb6
          if (y)
Packit 98cdb6
            *y = 0;
Packit 98cdb6
        }
Packit 98cdb6
Packit 98cdb6
      if (width)
Packit 98cdb6
        *width = ns_rect.size.width;
Packit 98cdb6
      if (height)
Packit 98cdb6
        *height = ns_rect.size.height;
Packit 98cdb6
    }
Packit 98cdb6
  else
Packit 98cdb6
    {
Packit 98cdb6
      ns_rect = [impl->view frame];
Packit 98cdb6
      
Packit 98cdb6
      if (x)
Packit 98cdb6
        *x = ns_rect.origin.x;
Packit 98cdb6
      if (y)
Packit 98cdb6
        *y = ns_rect.origin.y;
Packit 98cdb6
      if (width)
Packit 98cdb6
        *width  = ns_rect.size.width;
Packit 98cdb6
      if (height)
Packit 98cdb6
        *height = ns_rect.size.height;
Packit 98cdb6
    }
Packit 98cdb6
    
Packit 98cdb6
  if (depth)
Packit 98cdb6
      *depth = gdk_drawable_get_depth (window);
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static gint
Packit 98cdb6
gdk_window_quartz_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;
Packit 98cdb6
  int tmp_x = 0, tmp_y = 0;
Packit 98cdb6
  GdkWindow *toplevel;
Packit 98cdb6
  NSRect content_rect;
Packit 98cdb6
  GdkWindowImplQuartz *impl;
Packit 98cdb6
Packit 98cdb6
  if (GDK_WINDOW_DESTROYED (window)) 
Packit 98cdb6
    {
Packit 98cdb6
      if (root_x)
Packit 98cdb6
	*root_x = 0;
Packit 98cdb6
      if (root_y)
Packit 98cdb6
	*root_y = 0;
Packit 98cdb6
      
Packit 98cdb6
      return 0;
Packit 98cdb6
    }
Packit 98cdb6
Packit 98cdb6
  if (window == _gdk_root)
Packit 98cdb6
    {
Packit 98cdb6
      if (root_x)
Packit 98cdb6
        *root_x = x;
Packit 98cdb6
      if (root_y)
Packit 98cdb6
        *root_y = y;
Packit 98cdb6
Packit 98cdb6
      return 1;
Packit 98cdb6
    }
Packit 98cdb6
  
Packit 98cdb6
  private = GDK_WINDOW_OBJECT (window);
Packit 98cdb6
Packit 98cdb6
  toplevel = gdk_window_get_toplevel (window);
Packit 98cdb6
  impl = GDK_WINDOW_IMPL_QUARTZ (GDK_WINDOW_OBJECT (toplevel)->impl);
Packit 98cdb6
Packit 98cdb6
  content_rect = [impl->toplevel contentRectForFrameRect:[impl->toplevel frame]];
Packit 98cdb6
Packit 98cdb6
  _gdk_quartz_window_xy_to_gdk_xy (content_rect.origin.x,
Packit 98cdb6
                                   content_rect.origin.y + content_rect.size.height,
Packit 98cdb6
                                   &tmp_x, &tmp_y);
Packit 98cdb6
Packit 98cdb6
  tmp_x += x;
Packit 98cdb6
  tmp_y += y;
Packit 98cdb6
Packit 98cdb6
  while (private != GDK_WINDOW_OBJECT (toplevel))
Packit 98cdb6
    {
Packit 98cdb6
      if (_gdk_window_has_impl ((GdkWindow *)private))
Packit 98cdb6
        {
Packit 98cdb6
          tmp_x += private->x;
Packit 98cdb6
          tmp_y += private->y;
Packit 98cdb6
        }
Packit 98cdb6
Packit 98cdb6
      private = private->parent;
Packit 98cdb6
    }
Packit 98cdb6
Packit 98cdb6
  if (root_x)
Packit 98cdb6
    *root_x = tmp_x;
Packit 98cdb6
  if (root_y)
Packit 98cdb6
    *root_y = tmp_y;
Packit 98cdb6
Packit 98cdb6
  return TRUE;
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static gboolean
Packit 98cdb6
gdk_window_quartz_get_deskrelative_origin (GdkWindow *window,
Packit 98cdb6
                                           gint      *x,
Packit 98cdb6
                                           gint      *y)
Packit 98cdb6
{
Packit 98cdb6
  return gdk_window_get_origin (window, x, y);
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
void
Packit 98cdb6
gdk_window_get_root_origin (GdkWindow *window,
Packit 98cdb6
			    gint      *x,
Packit 98cdb6
			    gint      *y)
Packit 98cdb6
{
Packit 98cdb6
  GdkRectangle rect;
Packit 98cdb6
Packit 98cdb6
  rect.x = 0;
Packit 98cdb6
  rect.y = 0;
Packit 98cdb6
  
Packit 98cdb6
  gdk_window_get_frame_extents (window, &rect);
Packit 98cdb6
Packit 98cdb6
  if (x)
Packit 98cdb6
    *x = rect.x;
Packit 98cdb6
Packit 98cdb6
  if (y)
Packit 98cdb6
    *y = rect.y;
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
/* Returns coordinates relative to the passed in window. */
Packit 98cdb6
static GdkWindow *
Packit 98cdb6
gdk_window_quartz_get_pointer_helper (GdkWindow       *window,
Packit 98cdb6
                                      gint            *x,
Packit 98cdb6
                                      gint            *y,
Packit 98cdb6
                                      GdkModifierType *mask)
Packit 98cdb6
{
Packit 98cdb6
  GdkWindowObject *toplevel;
Packit 98cdb6
  GdkWindowObject *private;
Packit 98cdb6
  NSPoint point;
Packit 98cdb6
  gint x_tmp, y_tmp;
Packit 98cdb6
  GdkWindow *found_window;
Packit 98cdb6
Packit 98cdb6
  g_return_val_if_fail (window == NULL || GDK_IS_WINDOW (window), NULL);
Packit 98cdb6
Packit 98cdb6
  if (GDK_WINDOW_DESTROYED (window))
Packit 98cdb6
    {
Packit 98cdb6
      *x = 0;
Packit 98cdb6
      *y = 0;
Packit 98cdb6
      *mask = 0;
Packit 98cdb6
      return NULL;
Packit 98cdb6
    }
Packit 98cdb6
  
Packit 98cdb6
  toplevel = GDK_WINDOW_OBJECT (gdk_window_get_effective_toplevel (window));
Packit 98cdb6
Packit 98cdb6
  *mask = _gdk_quartz_events_get_current_keyboard_modifiers ()
Packit 98cdb6
	| _gdk_quartz_events_get_current_mouse_modifiers ();
Packit 98cdb6
Packit 98cdb6
  /* Get the y coordinate, needs to be flipped. */
Packit 98cdb6
  if (window == _gdk_root)
Packit 98cdb6
    {
Packit 98cdb6
      point = [NSEvent mouseLocation];
Packit 98cdb6
      _gdk_quartz_window_nspoint_to_gdk_xy (point, &x_tmp, &y_tmp);
Packit 98cdb6
    }
Packit 98cdb6
  else
Packit 98cdb6
    {
Packit 98cdb6
      GdkWindowImplQuartz *impl;
Packit 98cdb6
      NSWindow *nswindow;
Packit 98cdb6
Packit 98cdb6
      impl = GDK_WINDOW_IMPL_QUARTZ (toplevel->impl);
Packit 98cdb6
      private = GDK_WINDOW_OBJECT (toplevel);
Packit 98cdb6
      nswindow = impl->toplevel;
Packit 98cdb6
Packit 98cdb6
      point = [nswindow mouseLocationOutsideOfEventStream];
Packit 98cdb6
Packit 98cdb6
      x_tmp = point.x;
Packit 98cdb6
      y_tmp = private->height - point.y;
Packit 98cdb6
Packit 98cdb6
      window = (GdkWindow *)toplevel;
Packit 98cdb6
    }
Packit 98cdb6
Packit 98cdb6
  found_window = _gdk_quartz_window_find_child (window, x_tmp, y_tmp);
Packit 98cdb6
Packit 98cdb6
  /* We never return the root window. */
Packit 98cdb6
  if (found_window == _gdk_root)
Packit 98cdb6
    found_window = NULL;
Packit 98cdb6
Packit 98cdb6
  *x = x_tmp;
Packit 98cdb6
  *y = y_tmp;
Packit 98cdb6
Packit 98cdb6
  return found_window;
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static gboolean
Packit 98cdb6
gdk_window_quartz_get_pointer (GdkWindow       *window,
Packit 98cdb6
                               gint            *x,
Packit 98cdb6
                               gint            *y,
Packit 98cdb6
                               GdkModifierType *mask)
Packit 98cdb6
{
Packit 98cdb6
  return gdk_window_quartz_get_pointer_helper (window, x, y, mask) != NULL;
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
/* Returns coordinates relative to the root. */
Packit 98cdb6
void
Packit 98cdb6
_gdk_windowing_get_pointer (GdkDisplay       *display,
Packit 98cdb6
                            GdkScreen       **screen,
Packit 98cdb6
                            gint             *x,
Packit 98cdb6
                            gint             *y,
Packit 98cdb6
                            GdkModifierType  *mask)
Packit 98cdb6
{
Packit 98cdb6
  g_return_if_fail (display == _gdk_display);
Packit 98cdb6
  
Packit 98cdb6
  *screen = _gdk_screen;
Packit 98cdb6
  gdk_window_quartz_get_pointer_helper (_gdk_root, x, y, mask);
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
void
Packit 98cdb6
gdk_display_warp_pointer (GdkDisplay *display,
Packit 98cdb6
			  GdkScreen  *screen,
Packit 98cdb6
			  gint        x,
Packit 98cdb6
			  gint        y)
Packit 98cdb6
{
Packit 98cdb6
  CGDisplayMoveCursorToPoint (CGMainDisplayID (), CGPointMake (x, y));
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
/* Returns coordinates relative to the found window. */
Packit 98cdb6
GdkWindow *
Packit 98cdb6
_gdk_windowing_window_at_pointer (GdkDisplay      *display,
Packit 98cdb6
				  gint            *win_x,
Packit 98cdb6
				  gint            *win_y,
Packit 98cdb6
                                  GdkModifierType *mask,
Packit 98cdb6
				  gboolean         get_toplevel)
Packit 98cdb6
{
Packit 98cdb6
  GdkWindow *found_window;
Packit 98cdb6
  gint x, y;
Packit 98cdb6
  GdkModifierType tmp_mask = 0;
Packit 98cdb6
Packit 98cdb6
  found_window = gdk_window_quartz_get_pointer_helper (_gdk_root,
Packit 98cdb6
                                                       &x, &y,
Packit 98cdb6
                                                       &tmp_mask);
Packit 98cdb6
  if (found_window)
Packit 98cdb6
    {
Packit 98cdb6
      GdkWindowObject *private;
Packit 98cdb6
Packit 98cdb6
      /* The coordinates returned above are relative the root, we want
Packit 98cdb6
       * coordinates relative the window here. 
Packit 98cdb6
       */
Packit 98cdb6
      private = GDK_WINDOW_OBJECT (found_window);
Packit 98cdb6
      while (private != GDK_WINDOW_OBJECT (_gdk_root))
Packit 98cdb6
	{
Packit 98cdb6
	  x -= private->x;
Packit 98cdb6
	  y -= private->y;
Packit 98cdb6
	  
Packit 98cdb6
	  private = private->parent;
Packit 98cdb6
	}
Packit 98cdb6
Packit 98cdb6
      *win_x = x;
Packit 98cdb6
      *win_y = y;
Packit 98cdb6
    }
Packit 98cdb6
  else
Packit 98cdb6
    {
Packit 98cdb6
      /* Mimic the X backend here, -1,-1 for unknown windows. */
Packit 98cdb6
      *win_x = -1;
Packit 98cdb6
      *win_y = -1;
Packit 98cdb6
    }
Packit 98cdb6
Packit 98cdb6
  if (mask)
Packit 98cdb6
    *mask = tmp_mask;
Packit 98cdb6
Packit 98cdb6
  if (get_toplevel)
Packit 98cdb6
    {
Packit 98cdb6
      GdkWindowObject *w = (GdkWindowObject *)found_window;
Packit 98cdb6
      /* Requested toplevel, find it. */
Packit 98cdb6
      /* TODO: This can be implemented more efficient by never
Packit 98cdb6
	 recursing into children in the first place */
Packit 98cdb6
      if (w)
Packit 98cdb6
	{
Packit 98cdb6
	  /* Convert to toplevel */
Packit 98cdb6
	  while (w->parent != NULL &&
Packit 98cdb6
		 w->parent->window_type != GDK_WINDOW_ROOT)
Packit 98cdb6
	    {
Packit 98cdb6
	      *win_x += w->x;
Packit 98cdb6
	      *win_y += w->y;
Packit 98cdb6
	      w = w->parent;
Packit 98cdb6
	    }
Packit 98cdb6
	  found_window = (GdkWindow *)w;
Packit 98cdb6
	}
Packit 98cdb6
    }
Packit 98cdb6
Packit 98cdb6
  return found_window;
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static GdkEventMask  
Packit 98cdb6
gdk_window_quartz_get_events (GdkWindow *window)
Packit 98cdb6
{
Packit 98cdb6
  if (GDK_WINDOW_DESTROYED (window))
Packit 98cdb6
    return 0;
Packit 98cdb6
  else
Packit 98cdb6
    return GDK_WINDOW_OBJECT (window)->event_mask;
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static void
Packit 98cdb6
gdk_window_quartz_set_events (GdkWindow       *window,
Packit 98cdb6
                              GdkEventMask     event_mask)
Packit 98cdb6
{
Packit 98cdb6
  /* The mask is set in the common code. */
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
void
Packit 98cdb6
gdk_window_set_urgency_hint (GdkWindow *window,
Packit 98cdb6
			     gboolean   urgent)
Packit 98cdb6
{
Packit 98cdb6
  if (GDK_WINDOW_DESTROYED (window) ||
Packit 98cdb6
      !WINDOW_IS_TOPLEVEL (window))
Packit 98cdb6
    return;
Packit 98cdb6
Packit 98cdb6
  /* FIXME: Implement */
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
void 
Packit 98cdb6
gdk_window_set_geometry_hints (GdkWindow         *window,
Packit 98cdb6
			       const GdkGeometry *geometry,
Packit 98cdb6
			       GdkWindowHints     geom_mask)
Packit 98cdb6
{
Packit 98cdb6
  GdkWindowImplQuartz *impl;
Packit 98cdb6
Packit 98cdb6
  g_return_if_fail (geometry != NULL);
Packit 98cdb6
Packit 98cdb6
  if (GDK_WINDOW_DESTROYED (window) ||
Packit 98cdb6
      !WINDOW_IS_TOPLEVEL (window))
Packit 98cdb6
    return;
Packit 98cdb6
  
Packit 98cdb6
  impl = GDK_WINDOW_IMPL_QUARTZ (((GdkWindowObject *) window)->impl);
Packit 98cdb6
  if (!impl->toplevel)
Packit 98cdb6
    return;
Packit 98cdb6
Packit 98cdb6
  if (geom_mask & GDK_HINT_POS)
Packit 98cdb6
    {
Packit 98cdb6
      /* FIXME: Implement */
Packit 98cdb6
    }
Packit 98cdb6
Packit 98cdb6
  if (geom_mask & GDK_HINT_USER_POS)
Packit 98cdb6
    {
Packit 98cdb6
      /* FIXME: Implement */
Packit 98cdb6
    }
Packit 98cdb6
Packit 98cdb6
  if (geom_mask & GDK_HINT_USER_SIZE)
Packit 98cdb6
    {
Packit 98cdb6
      /* FIXME: Implement */
Packit 98cdb6
    }
Packit 98cdb6
  
Packit 98cdb6
  if (geom_mask & GDK_HINT_MIN_SIZE)
Packit 98cdb6
    {
Packit 98cdb6
      NSSize size;
Packit 98cdb6
Packit 98cdb6
      size.width = geometry->min_width;
Packit 98cdb6
      size.height = geometry->min_height;
Packit 98cdb6
Packit 98cdb6
      [impl->toplevel setContentMinSize:size];
Packit 98cdb6
    }
Packit 98cdb6
  
Packit 98cdb6
  if (geom_mask & GDK_HINT_MAX_SIZE)
Packit 98cdb6
    {
Packit 98cdb6
      NSSize size;
Packit 98cdb6
Packit 98cdb6
      size.width = geometry->max_width;
Packit 98cdb6
      size.height = geometry->max_height;
Packit 98cdb6
Packit 98cdb6
      [impl->toplevel setContentMaxSize:size];
Packit 98cdb6
    }
Packit 98cdb6
  
Packit 98cdb6
  if (geom_mask & GDK_HINT_BASE_SIZE)
Packit 98cdb6
    {
Packit 98cdb6
      /* FIXME: Implement */
Packit 98cdb6
    }
Packit 98cdb6
  
Packit 98cdb6
  if (geom_mask & GDK_HINT_RESIZE_INC)
Packit 98cdb6
    {
Packit 98cdb6
      NSSize size;
Packit 98cdb6
Packit 98cdb6
      size.width = geometry->width_inc;
Packit 98cdb6
      size.height = geometry->height_inc;
Packit 98cdb6
Packit 98cdb6
      [impl->toplevel setContentResizeIncrements:size];
Packit 98cdb6
    }
Packit 98cdb6
  
Packit 98cdb6
  if (geom_mask & GDK_HINT_ASPECT)
Packit 98cdb6
    {
Packit 98cdb6
      NSSize size;
Packit 98cdb6
Packit 98cdb6
      if (geometry->min_aspect != geometry->max_aspect)
Packit 98cdb6
        {
Packit 98cdb6
          g_warning ("Only equal minimum and maximum aspect ratios are supported on Mac OS. Using minimum aspect ratio...");
Packit 98cdb6
        }
Packit 98cdb6
Packit 98cdb6
      size.width = geometry->min_aspect;
Packit 98cdb6
      size.height = 1.0;
Packit 98cdb6
Packit 98cdb6
      [impl->toplevel setContentAspectRatio:size];
Packit 98cdb6
    }
Packit 98cdb6
Packit 98cdb6
  if (geom_mask & GDK_HINT_WIN_GRAVITY)
Packit 98cdb6
    {
Packit 98cdb6
      /* FIXME: Implement */
Packit 98cdb6
    }
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
void
Packit 98cdb6
gdk_window_set_title (GdkWindow   *window,
Packit 98cdb6
		      const gchar *title)
Packit 98cdb6
{
Packit 98cdb6
  GdkWindowImplQuartz *impl;
Packit 98cdb6
Packit 98cdb6
  g_return_if_fail (title != NULL);
Packit 98cdb6
Packit 98cdb6
  if (GDK_WINDOW_DESTROYED (window) ||
Packit 98cdb6
      !WINDOW_IS_TOPLEVEL (window))
Packit 98cdb6
    return;
Packit 98cdb6
Packit 98cdb6
  impl = GDK_WINDOW_IMPL_QUARTZ (((GdkWindowObject *)window)->impl);
Packit 98cdb6
Packit 98cdb6
  if (impl->toplevel)
Packit 98cdb6
    {
Packit 98cdb6
      GDK_QUARTZ_ALLOC_POOL;
Packit 98cdb6
      [impl->toplevel setTitle:[NSString stringWithUTF8String:title]];
Packit 98cdb6
      GDK_QUARTZ_RELEASE_POOL;
Packit 98cdb6
    }
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
void          
Packit 98cdb6
gdk_window_set_role (GdkWindow   *window,
Packit 98cdb6
		     const gchar *role)
Packit 98cdb6
{
Packit 98cdb6
  if (GDK_WINDOW_DESTROYED (window) ||
Packit 98cdb6
      WINDOW_IS_TOPLEVEL (window))
Packit 98cdb6
    return;
Packit 98cdb6
Packit 98cdb6
  /* FIXME: Implement */
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
void
Packit 98cdb6
gdk_window_set_transient_for (GdkWindow *window, 
Packit 98cdb6
			      GdkWindow *parent)
Packit 98cdb6
{
Packit 98cdb6
  GdkWindowImplQuartz *window_impl;
Packit 98cdb6
  GdkWindowImplQuartz *parent_impl;
Packit 98cdb6
Packit 98cdb6
  if (GDK_WINDOW_DESTROYED (window)  || GDK_WINDOW_DESTROYED (parent) ||
Packit 98cdb6
      !WINDOW_IS_TOPLEVEL (window))
Packit 98cdb6
    return;
Packit 98cdb6
Packit 98cdb6
  window_impl = GDK_WINDOW_IMPL_QUARTZ (GDK_WINDOW_OBJECT (window)->impl);
Packit 98cdb6
  if (!window_impl->toplevel)
Packit 98cdb6
    return;
Packit 98cdb6
Packit 98cdb6
  GDK_QUARTZ_ALLOC_POOL;
Packit 98cdb6
Packit 98cdb6
  if (window_impl->transient_for)
Packit 98cdb6
    {
Packit 98cdb6
      _gdk_quartz_window_detach_from_parent (window);
Packit 98cdb6
Packit 98cdb6
      g_object_unref (window_impl->transient_for);
Packit 98cdb6
      window_impl->transient_for = NULL;
Packit 98cdb6
    }
Packit 98cdb6
Packit 98cdb6
  parent_impl = GDK_WINDOW_IMPL_QUARTZ (GDK_WINDOW_OBJECT (parent)->impl);
Packit 98cdb6
  if (parent_impl->toplevel)
Packit 98cdb6
    {
Packit 98cdb6
      /* We save the parent because it needs to be unset/reset when
Packit 98cdb6
       * hiding and showing the window. 
Packit 98cdb6
       */
Packit 98cdb6
Packit 98cdb6
      /* We don't set transients for tooltips, they are already
Packit 98cdb6
       * handled by the window level being the top one. If we do, then
Packit 98cdb6
       * the parent window will be brought to the top just because the
Packit 98cdb6
       * tooltip is, which is not what we want.
Packit 98cdb6
       */
Packit 98cdb6
      if (gdk_window_get_type_hint (window) != GDK_WINDOW_TYPE_HINT_TOOLTIP)
Packit 98cdb6
        {
Packit 98cdb6
          window_impl->transient_for = g_object_ref (parent);
Packit 98cdb6
Packit 98cdb6
          /* We only add the window if it is shown, otherwise it will
Packit 98cdb6
           * be shown unconditionally here. If it is not shown, the
Packit 98cdb6
           * window will be added in show() instead.
Packit 98cdb6
           */
Packit 98cdb6
          if (!(GDK_WINDOW_OBJECT (window)->state & GDK_WINDOW_STATE_WITHDRAWN))
Packit 98cdb6
            _gdk_quartz_window_attach_to_parent (window);
Packit 98cdb6
        }
Packit 98cdb6
    }
Packit 98cdb6
  
Packit 98cdb6
  GDK_QUARTZ_RELEASE_POOL;
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static void
Packit 98cdb6
gdk_window_quartz_shape_combine_region (GdkWindow       *window,
Packit 98cdb6
                                        const GdkRegion *shape,
Packit 98cdb6
                                        gint             x,
Packit 98cdb6
                                        gint             y)
Packit 98cdb6
{
Packit 98cdb6
  /* FIXME: Implement */
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static void
Packit 98cdb6
gdk_window_quartz_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
  /* FIXME: Implement */
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
void
Packit 98cdb6
gdk_window_set_override_redirect (GdkWindow *window,
Packit 98cdb6
				  gboolean override_redirect)
Packit 98cdb6
{
Packit 98cdb6
  /* FIXME: Implement */
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
void
Packit 98cdb6
gdk_window_set_accept_focus (GdkWindow *window,
Packit 98cdb6
			     gboolean accept_focus)
Packit 98cdb6
{
Packit 98cdb6
  GdkWindowObject *private;
Packit 98cdb6
Packit 98cdb6
  private = (GdkWindowObject *)window;  
Packit 98cdb6
Packit 98cdb6
  private->accept_focus = accept_focus != FALSE;
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static gboolean 
Packit 98cdb6
gdk_window_quartz_set_static_gravities (GdkWindow *window,
Packit 98cdb6
                                        gboolean   use_static)
Packit 98cdb6
{
Packit 98cdb6
  if (GDK_WINDOW_DESTROYED (window) ||
Packit 98cdb6
      !WINDOW_IS_TOPLEVEL (window))
Packit 98cdb6
    return FALSE;
Packit 98cdb6
Packit 98cdb6
  /* FIXME: Implement */
Packit 98cdb6
  return FALSE;
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
void
Packit 98cdb6
gdk_window_set_focus_on_map (GdkWindow *window,
Packit 98cdb6
			     gboolean focus_on_map)
Packit 98cdb6
{
Packit 98cdb6
  GdkWindowObject *private;
Packit 98cdb6
Packit 98cdb6
  private = (GdkWindowObject *)window;  
Packit 98cdb6
  
Packit 98cdb6
  private->focus_on_map = focus_on_map != FALSE;
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
void          
Packit 98cdb6
gdk_window_set_icon (GdkWindow *window, 
Packit 98cdb6
		     GdkWindow *icon_window,
Packit 98cdb6
		     GdkPixmap *pixmap,
Packit 98cdb6
		     GdkBitmap *mask)
Packit 98cdb6
{
Packit 98cdb6
  /* FIXME: Implement */
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
void          
Packit 98cdb6
gdk_window_set_icon_name (GdkWindow   *window, 
Packit 98cdb6
			  const gchar *name)
Packit 98cdb6
{
Packit 98cdb6
  /* FIXME: Implement */
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
void
Packit 98cdb6
gdk_window_focus (GdkWindow *window,
Packit 98cdb6
                  guint32    timestamp)
Packit 98cdb6
{
Packit 98cdb6
  GdkWindowObject *private;
Packit 98cdb6
  GdkWindowImplQuartz *impl;
Packit 98cdb6
	
Packit 98cdb6
  private = (GdkWindowObject*) window;
Packit 98cdb6
  impl = GDK_WINDOW_IMPL_QUARTZ (private->impl);
Packit 98cdb6
Packit 98cdb6
  if (GDK_WINDOW_DESTROYED (window) ||
Packit 98cdb6
      !WINDOW_IS_TOPLEVEL (window))
Packit 98cdb6
    return;
Packit 98cdb6
Packit 98cdb6
  if (private->accept_focus && private->window_type != GDK_WINDOW_TEMP)
Packit 98cdb6
    {
Packit 98cdb6
      GDK_QUARTZ_ALLOC_POOL;
Packit 98cdb6
      [impl->toplevel makeKeyAndOrderFront:impl->toplevel];
Packit 98cdb6
      clear_toplevel_order ();
Packit 98cdb6
      GDK_QUARTZ_RELEASE_POOL;
Packit 98cdb6
    }
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
void
Packit 98cdb6
gdk_window_set_hints (GdkWindow *window,
Packit 98cdb6
		      gint       x,
Packit 98cdb6
		      gint       y,
Packit 98cdb6
		      gint       min_width,
Packit 98cdb6
		      gint       min_height,
Packit 98cdb6
		      gint       max_width,
Packit 98cdb6
		      gint       max_height,
Packit 98cdb6
		      gint       flags)
Packit 98cdb6
{
Packit 98cdb6
  /* FIXME: Implement */
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static gint
Packit 98cdb6
window_type_hint_to_level (GdkWindowTypeHint hint)
Packit 98cdb6
{
Packit 98cdb6
  /*  the order in this switch statement corresponds to the actual
Packit 98cdb6
   *  stacking order: the first group is top, the last group is bottom
Packit 98cdb6
   */
Packit 98cdb6
  switch (hint)
Packit 98cdb6
    {
Packit 98cdb6
    case GDK_WINDOW_TYPE_HINT_POPUP_MENU:
Packit 98cdb6
    case GDK_WINDOW_TYPE_HINT_COMBO:
Packit 98cdb6
    case GDK_WINDOW_TYPE_HINT_DND:
Packit 98cdb6
    case GDK_WINDOW_TYPE_HINT_TOOLTIP:
Packit 98cdb6
      return NSPopUpMenuWindowLevel;
Packit 98cdb6
Packit 98cdb6
    case GDK_WINDOW_TYPE_HINT_NOTIFICATION:
Packit 98cdb6
    case GDK_WINDOW_TYPE_HINT_SPLASHSCREEN:
Packit 98cdb6
      return NSStatusWindowLevel;
Packit 98cdb6
Packit 98cdb6
    case GDK_WINDOW_TYPE_HINT_MENU: /* Torn-off menu */
Packit 98cdb6
    case GDK_WINDOW_TYPE_HINT_DROPDOWN_MENU: /* Menu from menubar */
Packit 98cdb6
      return NSTornOffMenuWindowLevel;
Packit 98cdb6
Packit 98cdb6
    case GDK_WINDOW_TYPE_HINT_DOCK:
Packit 98cdb6
      return NSFloatingWindowLevel; /* NSDockWindowLevel is deprecated, and not replaced */
Packit 98cdb6
Packit 98cdb6
    case GDK_WINDOW_TYPE_HINT_UTILITY:
Packit 98cdb6
    case GDK_WINDOW_TYPE_HINT_DIALOG:  /* Dialog window */
Packit 98cdb6
    case GDK_WINDOW_TYPE_HINT_NORMAL:  /* Normal toplevel window */
Packit 98cdb6
    case GDK_WINDOW_TYPE_HINT_TOOLBAR: /* Window used to implement toolbars */
Packit 98cdb6
      return NSNormalWindowLevel;
Packit 98cdb6
Packit 98cdb6
    case GDK_WINDOW_TYPE_HINT_DESKTOP:
Packit 98cdb6
      return kCGDesktopWindowLevelKey; /* doesn't map to any real Cocoa model */
Packit 98cdb6
Packit 98cdb6
    default:
Packit 98cdb6
      break;
Packit 98cdb6
    }
Packit 98cdb6
Packit 98cdb6
  return NSNormalWindowLevel;
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static gboolean
Packit 98cdb6
window_type_hint_to_shadow (GdkWindowTypeHint hint)
Packit 98cdb6
{
Packit 98cdb6
  switch (hint)
Packit 98cdb6
    {
Packit 98cdb6
    case GDK_WINDOW_TYPE_HINT_NORMAL:  /* Normal toplevel window */
Packit 98cdb6
    case GDK_WINDOW_TYPE_HINT_DIALOG:  /* Dialog window */
Packit 98cdb6
    case GDK_WINDOW_TYPE_HINT_DOCK:
Packit 98cdb6
    case GDK_WINDOW_TYPE_HINT_UTILITY:
Packit 98cdb6
    case GDK_WINDOW_TYPE_HINT_MENU: /* Torn-off menu */
Packit 98cdb6
    case GDK_WINDOW_TYPE_HINT_DROPDOWN_MENU: /* Menu from menubar */
Packit 98cdb6
    case GDK_WINDOW_TYPE_HINT_SPLASHSCREEN:
Packit 98cdb6
    case GDK_WINDOW_TYPE_HINT_POPUP_MENU:
Packit 98cdb6
    case GDK_WINDOW_TYPE_HINT_COMBO:
Packit 98cdb6
    case GDK_WINDOW_TYPE_HINT_NOTIFICATION:
Packit 98cdb6
    case GDK_WINDOW_TYPE_HINT_TOOLTIP:
Packit 98cdb6
      return TRUE;
Packit 98cdb6
Packit 98cdb6
    case GDK_WINDOW_TYPE_HINT_TOOLBAR: /* Window used to implement toolbars */
Packit 98cdb6
    case GDK_WINDOW_TYPE_HINT_DESKTOP: /* N/A */
Packit 98cdb6
    case GDK_WINDOW_TYPE_HINT_DND:
Packit 98cdb6
      break;
Packit 98cdb6
Packit 98cdb6
    default:
Packit 98cdb6
      break;
Packit 98cdb6
    }
Packit 98cdb6
Packit 98cdb6
  return FALSE;
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static gboolean
Packit 98cdb6
window_type_hint_to_hides_on_deactivate (GdkWindowTypeHint hint)
Packit 98cdb6
{
Packit 98cdb6
  switch (hint)
Packit 98cdb6
    {
Packit 98cdb6
    case GDK_WINDOW_TYPE_HINT_UTILITY:
Packit 98cdb6
    case GDK_WINDOW_TYPE_HINT_MENU: /* Torn-off menu */
Packit 98cdb6
    case GDK_WINDOW_TYPE_HINT_SPLASHSCREEN:
Packit 98cdb6
    case GDK_WINDOW_TYPE_HINT_NOTIFICATION:
Packit 98cdb6
    case GDK_WINDOW_TYPE_HINT_TOOLTIP:
Packit 98cdb6
      return TRUE;
Packit 98cdb6
Packit 98cdb6
    default:
Packit 98cdb6
      break;
Packit 98cdb6
    }
Packit 98cdb6
Packit 98cdb6
  return FALSE;
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
void
Packit 98cdb6
gdk_window_set_type_hint (GdkWindow        *window,
Packit 98cdb6
			  GdkWindowTypeHint hint)
Packit 98cdb6
{
Packit 98cdb6
  GdkWindowImplQuartz *impl;
Packit 98cdb6
Packit 98cdb6
  if (GDK_WINDOW_DESTROYED (window) ||
Packit 98cdb6
      !WINDOW_IS_TOPLEVEL (window))
Packit 98cdb6
    return;
Packit 98cdb6
Packit 98cdb6
  impl = GDK_WINDOW_IMPL_QUARTZ (((GdkWindowObject *) window)->impl);
Packit 98cdb6
Packit 98cdb6
  impl->type_hint = hint;
Packit 98cdb6
Packit 98cdb6
  /* Match the documentation, only do something if we're not mapped yet. */
Packit 98cdb6
  if (GDK_WINDOW_IS_MAPPED (window))
Packit 98cdb6
    return;
Packit 98cdb6
Packit 98cdb6
  [impl->toplevel setHasShadow: window_type_hint_to_shadow (hint)];
Packit 98cdb6
  [impl->toplevel setLevel: window_type_hint_to_level (hint)];
Packit 98cdb6
  [impl->toplevel setHidesOnDeactivate: window_type_hint_to_hides_on_deactivate (hint)];
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
GdkWindowTypeHint
Packit 98cdb6
gdk_window_get_type_hint (GdkWindow *window)
Packit 98cdb6
{
Packit 98cdb6
  if (GDK_WINDOW_DESTROYED (window) ||
Packit 98cdb6
      !WINDOW_IS_TOPLEVEL (window))
Packit 98cdb6
    return GDK_WINDOW_TYPE_HINT_NORMAL;
Packit 98cdb6
  
Packit 98cdb6
  return GDK_WINDOW_IMPL_QUARTZ (((GdkWindowObject *) window)->impl)->type_hint;
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
void
Packit 98cdb6
gdk_window_set_modal_hint (GdkWindow *window,
Packit 98cdb6
			   gboolean   modal)
Packit 98cdb6
{
Packit 98cdb6
  if (GDK_WINDOW_DESTROYED (window) ||
Packit 98cdb6
      !WINDOW_IS_TOPLEVEL (window))
Packit 98cdb6
    return;
Packit 98cdb6
Packit 98cdb6
  /* FIXME: Implement */
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
void
Packit 98cdb6
gdk_window_set_skip_taskbar_hint (GdkWindow *window,
Packit 98cdb6
				  gboolean   skips_taskbar)
Packit 98cdb6
{
Packit 98cdb6
  if (GDK_WINDOW_DESTROYED (window) ||
Packit 98cdb6
      !WINDOW_IS_TOPLEVEL (window))
Packit 98cdb6
    return;
Packit 98cdb6
Packit 98cdb6
  /* FIXME: Implement */
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
void
Packit 98cdb6
gdk_window_set_skip_pager_hint (GdkWindow *window,
Packit 98cdb6
				gboolean   skips_pager)
Packit 98cdb6
{
Packit 98cdb6
  if (GDK_WINDOW_DESTROYED (window) ||
Packit 98cdb6
      !WINDOW_IS_TOPLEVEL (window))
Packit 98cdb6
    return;
Packit 98cdb6
Packit 98cdb6
  /* FIXME: Implement */
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
void
Packit 98cdb6
gdk_window_begin_resize_drag (GdkWindow     *window,
Packit 98cdb6
                              GdkWindowEdge  edge,
Packit 98cdb6
                              gint           button,
Packit 98cdb6
                              gint           root_x,
Packit 98cdb6
                              gint           root_y,
Packit 98cdb6
                              guint32        timestamp)
Packit 98cdb6
{
Packit 98cdb6
  GdkWindowObject *private;
Packit 98cdb6
  GdkWindowImplQuartz *impl;
Packit 98cdb6
Packit 98cdb6
  g_return_if_fail (GDK_IS_WINDOW (window));
Packit 98cdb6
Packit 98cdb6
  if (edge != GDK_WINDOW_EDGE_SOUTH_EAST)
Packit 98cdb6
    {
Packit 98cdb6
      g_warning ("Resizing is only implemented for GDK_WINDOW_EDGE_SOUTH_EAST on Mac OS");
Packit 98cdb6
      return;
Packit 98cdb6
    }
Packit 98cdb6
Packit 98cdb6
  if (GDK_WINDOW_DESTROYED (window))
Packit 98cdb6
    return;
Packit 98cdb6
Packit 98cdb6
  private = GDK_WINDOW_OBJECT (window);
Packit 98cdb6
  impl = GDK_WINDOW_IMPL_QUARTZ (private->impl);
Packit 98cdb6
Packit 98cdb6
  if (!impl->toplevel)
Packit 98cdb6
    {
Packit 98cdb6
      g_warning ("Can't call gdk_window_begin_resize_drag on non-toplevel window");
Packit 98cdb6
      return;
Packit 98cdb6
    }
Packit 98cdb6
Packit 98cdb6
  [(GdkQuartzWindow *)impl->toplevel beginManualResize];
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
void
Packit 98cdb6
gdk_window_begin_move_drag (GdkWindow *window,
Packit 98cdb6
                            gint       button,
Packit 98cdb6
                            gint       root_x,
Packit 98cdb6
                            gint       root_y,
Packit 98cdb6
                            guint32    timestamp)
Packit 98cdb6
{
Packit 98cdb6
  GdkWindowObject *private;
Packit 98cdb6
  GdkWindowImplQuartz *impl;
Packit 98cdb6
Packit 98cdb6
  if (GDK_WINDOW_DESTROYED (window) ||
Packit 98cdb6
      !WINDOW_IS_TOPLEVEL (window))
Packit 98cdb6
    return;
Packit 98cdb6
Packit 98cdb6
  private = GDK_WINDOW_OBJECT (window);
Packit 98cdb6
  impl = GDK_WINDOW_IMPL_QUARTZ (private->impl);
Packit 98cdb6
Packit 98cdb6
  if (!impl->toplevel)
Packit 98cdb6
    {
Packit 98cdb6
      g_warning ("Can't call gdk_window_begin_move_drag on non-toplevel window");
Packit 98cdb6
      return;
Packit 98cdb6
    }
Packit 98cdb6
Packit 98cdb6
  [(GdkQuartzWindow *)impl->toplevel beginManualMove];
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
void
Packit 98cdb6
gdk_window_set_icon_list (GdkWindow *window,
Packit 98cdb6
			  GList     *pixbufs)
Packit 98cdb6
{
Packit 98cdb6
  /* FIXME: Implement */
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
void
Packit 98cdb6
gdk_window_get_frame_extents (GdkWindow    *window,
Packit 98cdb6
                              GdkRectangle *rect)
Packit 98cdb6
{
Packit 98cdb6
  GdkWindowObject *private;
Packit 98cdb6
  GdkWindow *toplevel;
Packit 98cdb6
  GdkWindowImplQuartz *impl;
Packit 98cdb6
  NSRect ns_rect;
Packit 98cdb6
Packit 98cdb6
  g_return_if_fail (rect != NULL);
Packit 98cdb6
Packit 98cdb6
  private = GDK_WINDOW_OBJECT (window);
Packit 98cdb6
Packit 98cdb6
  rect->x = 0;
Packit 98cdb6
  rect->y = 0;
Packit 98cdb6
  rect->width = 1;
Packit 98cdb6
  rect->height = 1;
Packit 98cdb6
  
Packit 98cdb6
  toplevel = gdk_window_get_effective_toplevel (window);
Packit 98cdb6
  impl = GDK_WINDOW_IMPL_QUARTZ (GDK_WINDOW_OBJECT (toplevel)->impl);
Packit 98cdb6
Packit 98cdb6
  ns_rect = [impl->toplevel frame];
Packit 98cdb6
Packit 98cdb6
  _gdk_quartz_window_xy_to_gdk_xy (ns_rect.origin.x,
Packit 98cdb6
                                   ns_rect.origin.y + ns_rect.size.height,
Packit 98cdb6
                                   &rect->x, &rect->y);
Packit 98cdb6
Packit 98cdb6
  rect->width = ns_rect.size.width;
Packit 98cdb6
  rect->height = ns_rect.size.height;
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
/* Fake protocol to make gcc think that it's OK to call setStyleMask
Packit 98cdb6
   even if it isn't. We check to make sure before actually calling
Packit 98cdb6
   it. */
Packit 98cdb6
Packit 98cdb6
@protocol CanSetStyleMask
Packit 98cdb6
- (void)setStyleMask:(int)mask;
Packit 98cdb6
@end
Packit 98cdb6
Packit 98cdb6
void
Packit 98cdb6
gdk_window_set_decorations (GdkWindow       *window,
Packit 98cdb6
			    GdkWMDecoration  decorations)
Packit 98cdb6
{
Packit 98cdb6
  GdkWindowImplQuartz *impl;
Packit 98cdb6
  NSUInteger old_mask, new_mask;
Packit 98cdb6
  NSView *old_view;
Packit 98cdb6
Packit 98cdb6
  if (GDK_WINDOW_DESTROYED (window) ||
Packit 98cdb6
      !WINDOW_IS_TOPLEVEL (window))
Packit 98cdb6
    return;
Packit 98cdb6
Packit 98cdb6
  impl = GDK_WINDOW_IMPL_QUARTZ (GDK_WINDOW_OBJECT (window)->impl);
Packit 98cdb6
Packit 98cdb6
  if (decorations == 0 || GDK_WINDOW_TYPE (window) == GDK_WINDOW_TEMP ||
Packit 98cdb6
      impl->type_hint == GDK_WINDOW_TYPE_HINT_SPLASHSCREEN )
Packit 98cdb6
    {
Packit 98cdb6
      new_mask = NSBorderlessWindowMask;
Packit 98cdb6
    }
Packit 98cdb6
  else
Packit 98cdb6
    {
Packit 98cdb6
      /* FIXME: Honor other GDK_DECOR_* flags. */
Packit 98cdb6
      new_mask = (NSTitledWindowMask | NSClosableWindowMask |
Packit 98cdb6
                    NSMiniaturizableWindowMask | NSResizableWindowMask);
Packit 98cdb6
    }
Packit 98cdb6
Packit 98cdb6
  GDK_QUARTZ_ALLOC_POOL;
Packit 98cdb6
Packit 98cdb6
  old_mask = [impl->toplevel styleMask];
Packit 98cdb6
Packit 98cdb6
  if (old_mask != new_mask)
Packit 98cdb6
    {
Packit 98cdb6
      NSRect rect;
Packit 98cdb6
Packit 98cdb6
      old_view = [[impl->toplevel contentView] retain];
Packit 98cdb6
Packit 98cdb6
      rect = [impl->toplevel frame];
Packit 98cdb6
Packit 98cdb6
      /* Properly update the size of the window when the titlebar is
Packit 98cdb6
       * added or removed.
Packit 98cdb6
       */
Packit 98cdb6
      if (old_mask == NSBorderlessWindowMask &&
Packit 98cdb6
          new_mask != NSBorderlessWindowMask)
Packit 98cdb6
        {
Packit 98cdb6
          rect = [NSWindow frameRectForContentRect:rect styleMask:new_mask];
Packit 98cdb6
Packit 98cdb6
        }
Packit 98cdb6
      else if (old_mask != NSBorderlessWindowMask &&
Packit 98cdb6
               new_mask == NSBorderlessWindowMask)
Packit 98cdb6
        {
Packit 98cdb6
          rect = [NSWindow contentRectForFrameRect:rect styleMask:old_mask];
Packit 98cdb6
        }
Packit 98cdb6
Packit 98cdb6
      /* Note, before OS 10.6 there doesn't seem to be a way to change this
Packit 98cdb6
       * without recreating the toplevel. From 10.6 onward, a simple call to
Packit 98cdb6
       * setStyleMask takes care of most of this, except for ensuring that the
Packit 98cdb6
       * title is set.
Packit 98cdb6
       */
Packit 98cdb6
      if ([impl->toplevel respondsToSelector:@selector(setStyleMask:)])
Packit 98cdb6
        {
Packit 98cdb6
          NSString *title = [impl->toplevel title];
Packit 98cdb6
Packit 98cdb6
          [(id<CanSetStyleMask>)impl->toplevel setStyleMask:new_mask];
Packit 98cdb6
Packit 98cdb6
          /* It appears that unsetting and then resetting NSTitledWindowMask
Packit 98cdb6
           * does not reset the title in the title bar as might be expected.
Packit 98cdb6
           *
Packit 98cdb6
           * In theory we only need to set this if new_mask includes
Packit 98cdb6
           * NSTitledWindowMask. This behaved extremely oddly when
Packit 98cdb6
           * conditionalized upon that and since it has no side effects (i.e.
Packit 98cdb6
           * if NSTitledWindowMask is not requested, the title will not be
Packit 98cdb6
           * displayed) just do it unconditionally. We also must null check
Packit 98cdb6
           * 'title' before setting it to avoid crashing.
Packit 98cdb6
           */
Packit 98cdb6
          if (title)
Packit 98cdb6
            [impl->toplevel setTitle:title];
Packit 98cdb6
        }
Packit 98cdb6
      else
Packit 98cdb6
        {
Packit 98cdb6
          NSString *title = [impl->toplevel title];
Packit 98cdb6
          NSColor *bg = [impl->toplevel backgroundColor];
Packit 98cdb6
          NSScreen *screen = [impl->toplevel screen];
Packit 98cdb6
Packit 98cdb6
          /* Make sure the old window is closed, recall that releasedWhenClosed
Packit 98cdb6
           * is set on GdkQuartzWindows.
Packit 98cdb6
           */
Packit 98cdb6
          [impl->toplevel close];
Packit 98cdb6
Packit 98cdb6
          impl->toplevel = [[GdkQuartzWindow alloc] initWithContentRect:rect
Packit 98cdb6
                                                              styleMask:new_mask
Packit 98cdb6
                                                                backing:NSBackingStoreBuffered
Packit 98cdb6
                                                                  defer:NO
Packit 98cdb6
                                                                 screen:screen];
Packit 98cdb6
          [impl->toplevel setHasShadow: window_type_hint_to_shadow (impl->type_hint)];
Packit 98cdb6
          [impl->toplevel setLevel: window_type_hint_to_level (impl->type_hint)];
Packit 98cdb6
          if (title)
Packit 98cdb6
            [impl->toplevel setTitle:title];
Packit 98cdb6
          [impl->toplevel setBackgroundColor:bg];
Packit 98cdb6
          [impl->toplevel setHidesOnDeactivate: window_type_hint_to_hides_on_deactivate (impl->type_hint)];
Packit 98cdb6
          [impl->toplevel setContentView:old_view];
Packit 98cdb6
        }
Packit 98cdb6
Packit 98cdb6
      if (new_mask == NSBorderlessWindowMask)
Packit 98cdb6
        [impl->toplevel setContentSize:rect.size];
Packit 98cdb6
      else
Packit 98cdb6
        [impl->toplevel setFrame:rect display:YES];
Packit 98cdb6
Packit 98cdb6
      /* Invalidate the window shadow for non-opaque views that have shadow
Packit 98cdb6
       * enabled, to get the shadow shape updated.
Packit 98cdb6
       */
Packit 98cdb6
      if (![old_view isOpaque] && [impl->toplevel hasShadow])
Packit 98cdb6
        [(GdkQuartzView*)old_view setNeedsInvalidateShadow:YES];
Packit 98cdb6
Packit 98cdb6
      [old_view release];
Packit 98cdb6
    }
Packit 98cdb6
Packit 98cdb6
  GDK_QUARTZ_RELEASE_POOL;
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
gboolean
Packit 98cdb6
gdk_window_get_decorations (GdkWindow       *window,
Packit 98cdb6
			    GdkWMDecoration *decorations)
Packit 98cdb6
{
Packit 98cdb6
  GdkWindowImplQuartz *impl;
Packit 98cdb6
Packit 98cdb6
  if (GDK_WINDOW_DESTROYED (window) ||
Packit 98cdb6
      !WINDOW_IS_TOPLEVEL (window))
Packit 98cdb6
    return FALSE;
Packit 98cdb6
Packit 98cdb6
  impl = GDK_WINDOW_IMPL_QUARTZ (GDK_WINDOW_OBJECT (window)->impl);
Packit 98cdb6
Packit 98cdb6
  if (decorations)
Packit 98cdb6
    {
Packit 98cdb6
      /* Borderless is 0, so we can't check it as a bit being set. */
Packit 98cdb6
      if ([impl->toplevel styleMask] == NSBorderlessWindowMask)
Packit 98cdb6
        {
Packit 98cdb6
          *decorations = 0;
Packit 98cdb6
        }
Packit 98cdb6
      else
Packit 98cdb6
        {
Packit 98cdb6
          /* FIXME: Honor the other GDK_DECOR_* flags. */
Packit 98cdb6
          *decorations = GDK_DECOR_ALL;
Packit 98cdb6
        }
Packit 98cdb6
    }
Packit 98cdb6
Packit 98cdb6
  return TRUE;
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
void
Packit 98cdb6
gdk_window_set_functions (GdkWindow    *window,
Packit 98cdb6
			  GdkWMFunction functions)
Packit 98cdb6
{
Packit 98cdb6
  g_return_if_fail (GDK_IS_WINDOW (window));
Packit 98cdb6
Packit 98cdb6
  /* FIXME: Implement */
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
gboolean
Packit 98cdb6
_gdk_windowing_window_queue_antiexpose (GdkWindow  *window,
Packit 98cdb6
					GdkRegion  *area)
Packit 98cdb6
{
Packit 98cdb6
  return FALSE;
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
void
Packit 98cdb6
gdk_window_stick (GdkWindow *window)
Packit 98cdb6
{
Packit 98cdb6
  if (GDK_WINDOW_DESTROYED (window) ||
Packit 98cdb6
      !WINDOW_IS_TOPLEVEL (window))
Packit 98cdb6
    return;
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
void
Packit 98cdb6
gdk_window_unstick (GdkWindow *window)
Packit 98cdb6
{
Packit 98cdb6
  if (GDK_WINDOW_DESTROYED (window) ||
Packit 98cdb6
      !WINDOW_IS_TOPLEVEL (window))
Packit 98cdb6
    return;
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
void
Packit 98cdb6
gdk_window_maximize (GdkWindow *window)
Packit 98cdb6
{
Packit 98cdb6
  GdkWindowImplQuartz *impl;
Packit 98cdb6
Packit 98cdb6
  if (GDK_WINDOW_DESTROYED (window) ||
Packit 98cdb6
      !WINDOW_IS_TOPLEVEL (window))
Packit 98cdb6
    return;
Packit 98cdb6
Packit 98cdb6
  impl = GDK_WINDOW_IMPL_QUARTZ (GDK_WINDOW_OBJECT (window)->impl);
Packit 98cdb6
Packit 98cdb6
  if (GDK_WINDOW_IS_MAPPED (window))
Packit 98cdb6
    {
Packit 98cdb6
      GDK_QUARTZ_ALLOC_POOL;
Packit 98cdb6
Packit 98cdb6
      if (impl->toplevel && ![impl->toplevel isZoomed])
Packit 98cdb6
	[impl->toplevel zoom:nil];
Packit 98cdb6
Packit 98cdb6
      GDK_QUARTZ_RELEASE_POOL;
Packit 98cdb6
    }
Packit 98cdb6
  else
Packit 98cdb6
    {
Packit 98cdb6
      gdk_synthesize_window_state (window,
Packit 98cdb6
				   0,
Packit 98cdb6
				   GDK_WINDOW_STATE_MAXIMIZED);
Packit 98cdb6
    }
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
void
Packit 98cdb6
gdk_window_unmaximize (GdkWindow *window)
Packit 98cdb6
{
Packit 98cdb6
  GdkWindowImplQuartz *impl;
Packit 98cdb6
Packit 98cdb6
  if (GDK_WINDOW_DESTROYED (window) ||
Packit 98cdb6
      !WINDOW_IS_TOPLEVEL (window))
Packit 98cdb6
    return;
Packit 98cdb6
Packit 98cdb6
  impl = GDK_WINDOW_IMPL_QUARTZ (GDK_WINDOW_OBJECT (window)->impl);
Packit 98cdb6
Packit 98cdb6
  if (GDK_WINDOW_IS_MAPPED (window))
Packit 98cdb6
    {
Packit 98cdb6
      GDK_QUARTZ_ALLOC_POOL;
Packit 98cdb6
Packit 98cdb6
      if (impl->toplevel && [impl->toplevel isZoomed])
Packit 98cdb6
	[impl->toplevel zoom:nil];
Packit 98cdb6
Packit 98cdb6
      GDK_QUARTZ_RELEASE_POOL;
Packit 98cdb6
    }
Packit 98cdb6
  else
Packit 98cdb6
    {
Packit 98cdb6
      gdk_synthesize_window_state (window,
Packit 98cdb6
				   GDK_WINDOW_STATE_MAXIMIZED,
Packit 98cdb6
				   0);
Packit 98cdb6
    }
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
void
Packit 98cdb6
gdk_window_iconify (GdkWindow *window)
Packit 98cdb6
{
Packit 98cdb6
  GdkWindowImplQuartz *impl;
Packit 98cdb6
Packit 98cdb6
  if (GDK_WINDOW_DESTROYED (window) ||
Packit 98cdb6
      !WINDOW_IS_TOPLEVEL (window))
Packit 98cdb6
    return;
Packit 98cdb6
Packit 98cdb6
  impl = GDK_WINDOW_IMPL_QUARTZ (GDK_WINDOW_OBJECT (window)->impl);
Packit 98cdb6
Packit 98cdb6
  if (GDK_WINDOW_IS_MAPPED (window))
Packit 98cdb6
    {
Packit 98cdb6
      GDK_QUARTZ_ALLOC_POOL;
Packit 98cdb6
Packit 98cdb6
      if (impl->toplevel)
Packit 98cdb6
	[impl->toplevel miniaturize:nil];
Packit 98cdb6
Packit 98cdb6
      GDK_QUARTZ_RELEASE_POOL;
Packit 98cdb6
    }
Packit 98cdb6
  else
Packit 98cdb6
    {
Packit 98cdb6
      gdk_synthesize_window_state (window,
Packit 98cdb6
				   0,
Packit 98cdb6
				   GDK_WINDOW_STATE_ICONIFIED);
Packit 98cdb6
    }
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
void
Packit 98cdb6
gdk_window_deiconify (GdkWindow *window)
Packit 98cdb6
{
Packit 98cdb6
  GdkWindowImplQuartz *impl;
Packit 98cdb6
Packit 98cdb6
  if (GDK_WINDOW_DESTROYED (window) ||
Packit 98cdb6
      !WINDOW_IS_TOPLEVEL (window))
Packit 98cdb6
    return;
Packit 98cdb6
Packit 98cdb6
  impl = GDK_WINDOW_IMPL_QUARTZ (GDK_WINDOW_OBJECT (window)->impl);
Packit 98cdb6
Packit 98cdb6
  if (GDK_WINDOW_IS_MAPPED (window))
Packit 98cdb6
    {
Packit 98cdb6
      GDK_QUARTZ_ALLOC_POOL;
Packit 98cdb6
Packit 98cdb6
      if (impl->toplevel)
Packit 98cdb6
	[impl->toplevel deminiaturize:nil];
Packit 98cdb6
Packit 98cdb6
      GDK_QUARTZ_RELEASE_POOL;
Packit 98cdb6
    }
Packit 98cdb6
  else
Packit 98cdb6
    {
Packit 98cdb6
      gdk_synthesize_window_state (window,
Packit 98cdb6
				   GDK_WINDOW_STATE_ICONIFIED,
Packit 98cdb6
				   0);
Packit 98cdb6
    }
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static FullscreenSavedGeometry *
Packit 98cdb6
get_fullscreen_geometry (GdkWindow *window)
Packit 98cdb6
{
Packit 98cdb6
  return g_object_get_data (G_OBJECT (window), FULLSCREEN_DATA);
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
void
Packit 98cdb6
gdk_window_fullscreen (GdkWindow *window)
Packit 98cdb6
{
Packit 98cdb6
  FullscreenSavedGeometry *geometry;
Packit 98cdb6
  GdkWindowObject *private = (GdkWindowObject *) window;
Packit 98cdb6
  GdkWindowImplQuartz *impl = GDK_WINDOW_IMPL_QUARTZ (private->impl);
Packit 98cdb6
  NSRect frame;
Packit 98cdb6
Packit 98cdb6
  if (GDK_WINDOW_DESTROYED (window) ||
Packit 98cdb6
      !WINDOW_IS_TOPLEVEL (window))
Packit 98cdb6
    return;
Packit 98cdb6
Packit 98cdb6
  geometry = get_fullscreen_geometry (window);
Packit 98cdb6
  if (!geometry)
Packit 98cdb6
    {
Packit 98cdb6
      geometry = g_new (FullscreenSavedGeometry, 1);
Packit 98cdb6
Packit 98cdb6
      geometry->x = private->x;
Packit 98cdb6
      geometry->y = private->y;
Packit 98cdb6
      geometry->width = private->width;
Packit 98cdb6
      geometry->height = private->height;
Packit 98cdb6
Packit 98cdb6
      if (!gdk_window_get_decorations (window, &geometry->decor))
Packit 98cdb6
        geometry->decor = GDK_DECOR_ALL;
Packit 98cdb6
Packit 98cdb6
      g_object_set_data_full (G_OBJECT (window),
Packit 98cdb6
                              FULLSCREEN_DATA, geometry, 
Packit 98cdb6
                              g_free);
Packit 98cdb6
Packit 98cdb6
      gdk_window_set_decorations (window, 0);
Packit 98cdb6
Packit 98cdb6
      frame = [[impl->toplevel screen] frame];
Packit 98cdb6
      move_resize_window_internal (window,
Packit 98cdb6
                                   0, 0, 
Packit 98cdb6
                                   frame.size.width, frame.size.height);
Packit 98cdb6
      [impl->toplevel setContentSize:frame.size];
Packit 98cdb6
      [impl->toplevel makeKeyAndOrderFront:impl->toplevel];
Packit 98cdb6
Packit 98cdb6
      clear_toplevel_order ();
Packit 98cdb6
    }
Packit 98cdb6
Packit 98cdb6
  if ([NSWindow respondsToSelector:@selector(toggleFullScreen:)])
Packit 98cdb6
    {
Packit 98cdb6
       [impl->toplevel toggleFullScreen:nil];
Packit 98cdb6
    }
Packit 98cdb6
  else
Packit 98cdb6
    {
Packit 98cdb6
      SetSystemUIMode (kUIModeAllHidden, kUIOptionAutoShowMenuBar);
Packit 98cdb6
    }
Packit 98cdb6
Packit 98cdb6
  gdk_synthesize_window_state (window, 0, GDK_WINDOW_STATE_FULLSCREEN);
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
void
Packit 98cdb6
gdk_window_unfullscreen (GdkWindow *window)
Packit 98cdb6
{
Packit 98cdb6
  GdkWindowObject *private = (GdkWindowObject *) window;
Packit 98cdb6
  GdkWindowImplQuartz *impl = GDK_WINDOW_IMPL_QUARTZ (private->impl);
Packit 98cdb6
  FullscreenSavedGeometry *geometry;
Packit 98cdb6
Packit 98cdb6
  if (GDK_WINDOW_DESTROYED (window) ||
Packit 98cdb6
      !WINDOW_IS_TOPLEVEL (window))
Packit 98cdb6
    return;
Packit 98cdb6
Packit 98cdb6
  geometry = get_fullscreen_geometry (window);
Packit 98cdb6
  if (geometry)
Packit 98cdb6
    {
Packit 98cdb6
      if ([NSWindow respondsToSelector:@selector(toggleFullScreen:)])
Packit 98cdb6
        {
Packit 98cdb6
          [impl->toplevel toggleFullScreen:nil];
Packit 98cdb6
        }
Packit 98cdb6
      else
Packit 98cdb6
        {
Packit 98cdb6
	  SetSystemUIMode (kUIModeNormal, 0);
Packit 98cdb6
	}
Packit 98cdb6
Packit 98cdb6
      move_resize_window_internal (window,
Packit 98cdb6
                                   geometry->x,
Packit 98cdb6
                                   geometry->y,
Packit 98cdb6
                                   geometry->width,
Packit 98cdb6
                                   geometry->height);
Packit 98cdb6
Packit 98cdb6
      gdk_window_set_decorations (window, geometry->decor);
Packit 98cdb6
Packit 98cdb6
      g_object_set_data (G_OBJECT (window), FULLSCREEN_DATA, NULL);
Packit 98cdb6
Packit 98cdb6
      [impl->toplevel makeKeyAndOrderFront:impl->toplevel];
Packit 98cdb6
      clear_toplevel_order ();
Packit 98cdb6
Packit 98cdb6
      gdk_synthesize_window_state (window, GDK_WINDOW_STATE_FULLSCREEN, 0);
Packit 98cdb6
    }
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
void
Packit 98cdb6
gdk_window_set_keep_above (GdkWindow *window, gboolean setting)
Packit 98cdb6
{
Packit 98cdb6
  GdkWindowObject *private = (GdkWindowObject *) window;
Packit 98cdb6
  GdkWindowImplQuartz *impl = GDK_WINDOW_IMPL_QUARTZ (private->impl);
Packit 98cdb6
  gint level;
Packit 98cdb6
Packit 98cdb6
  g_return_if_fail (GDK_IS_WINDOW (window));
Packit 98cdb6
Packit 98cdb6
  if (GDK_WINDOW_DESTROYED (window) ||
Packit 98cdb6
      !WINDOW_IS_TOPLEVEL (window))
Packit 98cdb6
    return;
Packit 98cdb6
Packit 98cdb6
  level = window_type_hint_to_level (gdk_window_get_type_hint (window));
Packit 98cdb6
  
Packit 98cdb6
  /* Adjust normal window level by one if necessary. */
Packit 98cdb6
  [impl->toplevel setLevel: level + (setting ? 1 : 0)];
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
void
Packit 98cdb6
gdk_window_set_keep_below (GdkWindow *window, gboolean setting)
Packit 98cdb6
{
Packit 98cdb6
  GdkWindowObject *private = (GdkWindowObject *) window;
Packit 98cdb6
  GdkWindowImplQuartz *impl = GDK_WINDOW_IMPL_QUARTZ (private->impl);
Packit 98cdb6
  gint level;
Packit 98cdb6
Packit 98cdb6
  g_return_if_fail (GDK_IS_WINDOW (window));
Packit 98cdb6
Packit 98cdb6
  if (GDK_WINDOW_DESTROYED (window) ||
Packit 98cdb6
      !WINDOW_IS_TOPLEVEL (window))
Packit 98cdb6
    return;
Packit 98cdb6
  
Packit 98cdb6
  level = window_type_hint_to_level (gdk_window_get_type_hint (window));
Packit 98cdb6
  
Packit 98cdb6
  /* Adjust normal window level by one if necessary. */
Packit 98cdb6
  [impl->toplevel setLevel: level - (setting ? 1 : 0)];
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
GdkWindow *
Packit 98cdb6
gdk_window_get_group (GdkWindow *window)
Packit 98cdb6
{
Packit 98cdb6
  g_return_val_if_fail (GDK_WINDOW_TYPE (window) != GDK_WINDOW_CHILD, NULL);
Packit 98cdb6
Packit 98cdb6
  if (GDK_WINDOW_DESTROYED (window) ||
Packit 98cdb6
      !WINDOW_IS_TOPLEVEL (window))
Packit 98cdb6
    return NULL;
Packit 98cdb6
Packit 98cdb6
  /* FIXME: Implement */
Packit 98cdb6
Packit 98cdb6
  return NULL;
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
void          
Packit 98cdb6
gdk_window_set_group (GdkWindow *window, 
Packit 98cdb6
		      GdkWindow *leader)
Packit 98cdb6
{
Packit 98cdb6
  /* FIXME: Implement */	
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
GdkWindow*
Packit 98cdb6
gdk_window_foreign_new_for_display (GdkDisplay      *display,
Packit 98cdb6
				    GdkNativeWindow  anid)
Packit 98cdb6
{
Packit 98cdb6
  /* Foreign windows aren't supported in Mac OS X */
Packit 98cdb6
  return NULL;
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
GdkWindow*
Packit 98cdb6
gdk_window_lookup (GdkNativeWindow anid)
Packit 98cdb6
{
Packit 98cdb6
  /* Foreign windows aren't supported in Mac OS X */
Packit 98cdb6
  return NULL;
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
GdkWindow *
Packit 98cdb6
gdk_window_lookup_for_display (GdkDisplay *display, GdkNativeWindow anid)
Packit 98cdb6
{
Packit 98cdb6
  /* Foreign windows aren't supported in Mac OS X */
Packit 98cdb6
  return NULL;
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
void
Packit 98cdb6
gdk_window_enable_synchronized_configure (GdkWindow *window)
Packit 98cdb6
{
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
void
Packit 98cdb6
gdk_window_configure_finished (GdkWindow *window)
Packit 98cdb6
{
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
void
Packit 98cdb6
gdk_window_destroy_notify (GdkWindow *window)
Packit 98cdb6
{
Packit 98cdb6
  check_grab_destroy (window);
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
void 
Packit 98cdb6
_gdk_windowing_window_beep (GdkWindow *window)
Packit 98cdb6
{
Packit 98cdb6
  g_return_if_fail (GDK_IS_WINDOW (window));
Packit 98cdb6
Packit 98cdb6
  gdk_display_beep (_gdk_display);
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
void
Packit 98cdb6
gdk_window_set_opacity (GdkWindow *window,
Packit 98cdb6
			gdouble    opacity)
Packit 98cdb6
{
Packit 98cdb6
  GdkWindowObject *private = (GdkWindowObject *) window;
Packit 98cdb6
  GdkWindowImplQuartz *impl = GDK_WINDOW_IMPL_QUARTZ (private->impl);
Packit 98cdb6
Packit 98cdb6
  g_return_if_fail (GDK_IS_WINDOW (window));
Packit 98cdb6
  g_return_if_fail (WINDOW_IS_TOPLEVEL (window));
Packit 98cdb6
Packit 98cdb6
  if (GDK_WINDOW_DESTROYED (window) ||
Packit 98cdb6
      !WINDOW_IS_TOPLEVEL (window))
Packit 98cdb6
    return;
Packit 98cdb6
Packit 98cdb6
  if (opacity < 0)
Packit 98cdb6
    opacity = 0;
Packit 98cdb6
  else if (opacity > 1)
Packit 98cdb6
    opacity = 1;
Packit 98cdb6
Packit 98cdb6
  [impl->toplevel setAlphaValue: opacity];
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
void
Packit 98cdb6
_gdk_windowing_window_set_composited (GdkWindow *window, gboolean composited)
Packit 98cdb6
{
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
GdkRegion *
Packit 98cdb6
_gdk_windowing_get_shape_for_mask (GdkBitmap *mask)
Packit 98cdb6
{
Packit 98cdb6
  /* FIXME: implement */
Packit 98cdb6
  return NULL;
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
GdkRegion *
Packit 98cdb6
_gdk_windowing_window_get_shape (GdkWindow *window)
Packit 98cdb6
{
Packit 98cdb6
  /* FIXME: implement */
Packit 98cdb6
  return NULL;
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
GdkRegion *
Packit 98cdb6
_gdk_windowing_window_get_input_shape (GdkWindow *window)
Packit 98cdb6
{
Packit 98cdb6
  /* FIXME: implement */
Packit 98cdb6
  return NULL;
Packit 98cdb6
}
Packit 98cdb6
Packit 98cdb6
static void
Packit 98cdb6
gdk_window_impl_iface_init (GdkWindowImplIface *iface)
Packit 98cdb6
{
Packit 98cdb6
  iface->show = gdk_window_quartz_show;
Packit 98cdb6
  iface->hide = gdk_window_quartz_hide;
Packit 98cdb6
  iface->withdraw = gdk_window_quartz_withdraw;
Packit 98cdb6
  iface->set_events = gdk_window_quartz_set_events;
Packit 98cdb6
  iface->get_events = gdk_window_quartz_get_events;
Packit 98cdb6
  iface->raise = gdk_window_quartz_raise;
Packit 98cdb6
  iface->lower = gdk_window_quartz_lower;
Packit 98cdb6
  iface->restack_toplevel = gdk_window_quartz_restack_toplevel;
Packit 98cdb6
  iface->move_resize = gdk_window_quartz_move_resize;
Packit 98cdb6
  iface->set_background = gdk_window_quartz_set_background;
Packit 98cdb6
  iface->set_back_pixmap = gdk_window_quartz_set_back_pixmap;
Packit 98cdb6
  iface->reparent = gdk_window_quartz_reparent;
Packit 98cdb6
  iface->set_cursor = gdk_window_quartz_set_cursor;
Packit 98cdb6
  iface->get_geometry = gdk_window_quartz_get_geometry;
Packit 98cdb6
  iface->get_root_coords = gdk_window_quartz_get_root_coords;
Packit 98cdb6
  iface->get_pointer = gdk_window_quartz_get_pointer;
Packit 98cdb6
  iface->get_deskrelative_origin = gdk_window_quartz_get_deskrelative_origin;
Packit 98cdb6
  iface->shape_combine_region = gdk_window_quartz_shape_combine_region;
Packit 98cdb6
  iface->input_shape_combine_region = gdk_window_quartz_input_shape_combine_region;
Packit 98cdb6
  iface->set_static_gravities = gdk_window_quartz_set_static_gravities;
Packit 98cdb6
  iface->queue_antiexpose = _gdk_quartz_window_queue_antiexpose;
Packit 98cdb6
  iface->queue_translation = _gdk_quartz_window_queue_translation;
Packit 98cdb6
  iface->destroy = _gdk_quartz_window_destroy;
Packit 98cdb6
  iface->input_window_destroy = _gdk_input_window_destroy;
Packit 98cdb6
  iface->input_window_crossing = _gdk_input_window_crossing;
Packit 98cdb6
}