3 * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
4 * Copyright (C) 2005-2007 Imendio AB
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the
18 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
19 * Boston, MA 02111-1307, USA.
23 #include <Carbon/Carbon.h>
26 #include "gdkdeviceprivate.h"
27 #include "gdkwindowimpl.h"
28 #include "gdkprivate-quartz.h"
29 #include "gdkscreen-quartz.h"
30 #include "gdkinputprivate.h"
32 static gpointer parent_class;
34 static GSList *update_nswindows;
35 static gboolean in_process_all_updates = FALSE;
37 static GSList *main_window_stack;
39 #define FULLSCREEN_DATA "fullscreen-data"
45 GdkWMDecoration decor;
46 } FullscreenSavedGeometry;
49 static void update_toplevel_order (void);
50 static void clear_toplevel_order (void);
52 static FullscreenSavedGeometry *get_fullscreen_geometry (GdkWindow *window);
54 #define WINDOW_IS_TOPLEVEL(window) \
55 (GDK_WINDOW_TYPE (window) != GDK_WINDOW_CHILD && \
56 GDK_WINDOW_TYPE (window) != GDK_WINDOW_FOREIGN && \
57 GDK_WINDOW_TYPE (window) != GDK_WINDOW_OFFSCREEN)
59 static void gdk_window_impl_iface_init (GdkWindowImplIface *iface);
62 gdk_quartz_window_get_nsview (GdkWindow *window)
64 GdkWindowObject *private = (GdkWindowObject *)window;
66 if (GDK_WINDOW_DESTROYED (window))
69 return ((GdkWindowImplQuartz *)private->impl)->view;
73 gdk_quartz_window_get_nswindow (GdkWindow *window)
75 GdkWindowObject *private = (GdkWindowObject *)window;
77 if (GDK_WINDOW_DESTROYED (window))
80 return ((GdkWindowImplQuartz *)private->impl)->toplevel;
84 gdk_window_impl_quartz_get_context (GdkDrawable *drawable,
87 GdkDrawableImplQuartz *drawable_impl = GDK_DRAWABLE_IMPL_QUARTZ (drawable);
88 GdkWindowImplQuartz *window_impl = GDK_WINDOW_IMPL_QUARTZ (drawable);
89 CGContextRef cg_context;
91 if (GDK_WINDOW_DESTROYED (drawable_impl->wrapper))
94 /* Lock focus when not called as part of a drawRect call. This
95 * is needed when called from outside "real" expose events, for
96 * example for synthesized expose events when realizing windows
97 * and for widgets that send fake expose events like the arrow
98 * buttons in spinbuttons or the position marker in rulers.
100 if (window_impl->in_paint_rect_count == 0)
102 if (![window_impl->view lockFocusIfCanDraw])
106 cg_context = [[NSGraphicsContext currentContext] graphicsPort];
107 CGContextSaveGState (cg_context);
108 CGContextSetAllowsAntialiasing (cg_context, antialias);
110 /* We'll emulate the clipping caused by double buffering here */
111 if (window_impl->begin_paint_count != 0)
118 gdk_region_get_rectangles (window_impl->paint_clip_region,
124 cg_rects = g_new (CGRect, n_rects);
126 for (i = 0; i < n_rects; i++)
128 cg_rects[i].origin.x = rects[i].x;
129 cg_rects[i].origin.y = rects[i].y;
130 cg_rects[i].size.width = rects[i].width;
131 cg_rects[i].size.height = rects[i].height;
134 CGContextClipToRects (cg_context, cg_rects, n_rects);
137 if (cg_rects != &rect)
145 check_grab_unmap (GdkWindow *window)
148 GdkDisplay *display = gdk_drawable_get_display (window);
149 GdkDeviceManager *device_manager;
151 device_manager = gdk_display_get_device_manager (display);
152 list = gdk_device_manager_list_devices (device_manager,
153 GDK_DEVICE_TYPE_FLOATING);
154 for (l = list; l; l = l->next)
156 _gdk_display_end_device_grab (display, l->data, 0, window, TRUE);
163 check_grab_destroy (GdkWindow *window)
166 GdkDisplay *display = gdk_drawable_get_display (window);
167 GdkDeviceManager *device_manager;
169 /* Make sure there is no lasting grab in this native window */
170 device_manager = gdk_display_get_device_manager (display);
171 list = gdk_device_manager_list_devices (device_manager,
172 GDK_DEVICE_TYPE_MASTER);
174 for (l = list; l; l = l->next)
176 GdkDeviceGrabInfo *grab;
178 grab = _gdk_display_get_last_device_grab (display, l->data);
179 if (grab && grab->native_window == window)
181 /* Serials are always 0 in quartz, but for clarity: */
182 grab->serial_end = grab->serial_start;
183 grab->implicit_ungrab = TRUE;
191 gdk_window_impl_quartz_finalize (GObject *object)
193 GdkWindowImplQuartz *impl = GDK_WINDOW_IMPL_QUARTZ (object);
195 check_grab_destroy (GDK_DRAWABLE_IMPL_QUARTZ (object)->wrapper);
197 if (impl->paint_clip_region)
198 gdk_region_destroy (impl->paint_clip_region);
200 if (impl->transient_for)
201 g_object_unref (impl->transient_for);
203 G_OBJECT_CLASS (parent_class)->finalize (object);
207 gdk_window_impl_quartz_class_init (GdkWindowImplQuartzClass *klass)
209 GObjectClass *object_class = G_OBJECT_CLASS (klass);
210 GdkDrawableImplQuartzClass *drawable_quartz_class = GDK_DRAWABLE_IMPL_QUARTZ_CLASS (klass);
212 parent_class = g_type_class_peek_parent (klass);
214 object_class->finalize = gdk_window_impl_quartz_finalize;
216 drawable_quartz_class->get_context = gdk_window_impl_quartz_get_context;
220 gdk_window_impl_quartz_init (GdkWindowImplQuartz *impl)
222 impl->type_hint = GDK_WINDOW_TYPE_HINT_NORMAL;
226 gdk_window_impl_quartz_begin_paint_region (GdkPaintable *paintable,
228 const GdkRegion *region)
230 GdkWindowImplQuartz *impl = GDK_WINDOW_IMPL_QUARTZ (paintable);
231 GdkWindowObject *private = (GdkWindowObject*)window;
233 GdkRectangle *rects = NULL;
234 GdkPixmap *bg_pixmap;
235 GdkRegion *clipped_and_offset_region;
236 gboolean free_clipped_and_offset_region = TRUE;
238 bg_pixmap = private->bg_pixmap;
240 clipped_and_offset_region = gdk_region_copy (region);
242 gdk_region_intersect (clipped_and_offset_region,
243 private->clip_region_with_children);
244 gdk_region_offset (clipped_and_offset_region,
245 private->abs_x, private->abs_y);
247 if (impl->begin_paint_count == 0)
249 impl->paint_clip_region = clipped_and_offset_region;
250 free_clipped_and_offset_region = FALSE;
253 gdk_region_union (impl->paint_clip_region, clipped_and_offset_region);
255 impl->begin_paint_count++;
257 if (bg_pixmap == GDK_NO_BG)
260 gdk_region_get_rectangles (clipped_and_offset_region, &rects, &n_rects);
262 if (bg_pixmap == NULL)
264 CGContextRef cg_context;
268 cg_context = gdk_quartz_drawable_get_context (GDK_DRAWABLE (impl), FALSE);
269 color = _gdk_quartz_colormap_get_cgcolor_from_pixel (window,
270 private->bg_color.pixel);
271 CGContextSetFillColorWithColor (cg_context, color);
272 CGColorRelease (color);
274 for (i = 0; i < n_rects; i++)
276 CGContextFillRect (cg_context,
277 CGRectMake (rects[i].x, rects[i].y,
278 rects[i].width, rects[i].height));
281 gdk_quartz_drawable_release_context (GDK_DRAWABLE (impl), cg_context);
286 int x_offset, y_offset;
290 x_offset = y_offset = 0;
292 while (window && bg_pixmap == GDK_PARENT_RELATIVE_BG)
294 /* If this window should have the same background as the parent,
295 * fetch the parent. (And if the same goes for the parent, fetch
296 * the grandparent, etc.)
298 x_offset += ((GdkWindowObject *) window)->x;
299 y_offset += ((GdkWindowObject *) window)->y;
300 window = GDK_WINDOW (((GdkWindowObject *) window)->parent);
301 bg_pixmap = ((GdkWindowObject *) window)->bg_pixmap;
304 if (bg_pixmap == NULL || bg_pixmap == GDK_NO_BG || bg_pixmap == GDK_PARENT_RELATIVE_BG)
306 /* Parent relative background but the parent doesn't have a
312 /* Note: There should be a CG API to draw tiled images, we might
313 * want to look into that for this.
315 gc = gdk_gc_new (GDK_DRAWABLE (impl));
317 gdk_drawable_get_size (GDK_DRAWABLE (bg_pixmap), &width, &height);
320 while (x < (rects[0].x + rects[0].width))
322 if (x + width >= rects[0].x)
325 while (y < (rects[0].y + rects[0].height))
327 if (y + height >= rects[0].y)
328 gdk_draw_drawable (GDK_DRAWABLE (impl), gc, bg_pixmap, 0, 0, x, y, width, height);
340 if (free_clipped_and_offset_region)
341 gdk_region_destroy (clipped_and_offset_region);
346 gdk_window_impl_quartz_end_paint (GdkPaintable *paintable)
348 GdkWindowImplQuartz *impl = GDK_WINDOW_IMPL_QUARTZ (paintable);
350 impl->begin_paint_count--;
352 if (impl->begin_paint_count == 0)
354 gdk_region_destroy (impl->paint_clip_region);
355 impl->paint_clip_region = NULL;
360 _gdk_quartz_window_set_needs_display_in_rect (GdkWindow *window,
363 GdkWindowObject *private;
364 GdkWindowImplQuartz *impl;
366 private = GDK_WINDOW_OBJECT (window);
367 impl = GDK_WINDOW_IMPL_QUARTZ (private->impl);
369 if (!impl->needs_display_region)
370 impl->needs_display_region = gdk_region_new ();
372 gdk_region_union_with_rect (impl->needs_display_region, rect);
374 [impl->view setNeedsDisplayInRect:NSMakeRect (rect->x, rect->y,
375 rect->width, rect->height)];
380 _gdk_windowing_window_process_updates_recurse (GdkWindow *window,
386 /* Make sure to only flush each toplevel at most once if we're called
387 * from process_all_updates.
389 if (in_process_all_updates)
393 toplevel = gdk_window_get_toplevel (window);
396 GdkWindowObject *toplevel_private;
397 GdkWindowImplQuartz *toplevel_impl;
400 toplevel_private = (GdkWindowObject *)toplevel;
401 toplevel_impl = (GdkWindowImplQuartz *)toplevel_private->impl;
402 nswindow = toplevel_impl->toplevel;
404 /* In theory, we could skip the flush disabling, since we only
407 if (nswindow && ![nswindow isFlushWindowDisabled])
410 [nswindow disableFlushWindow];
411 update_nswindows = g_slist_prepend (update_nswindows, nswindow);
416 gdk_region_get_rectangles (region, &rects, &n_rects);
418 for (i = 0; i < n_rects; i++)
419 _gdk_quartz_window_set_needs_display_in_rect (window, &rects[i]);
423 /* NOTE: I'm not sure if we should displayIfNeeded here. It slows down a
424 * lot (since it triggers the beam syncing) and things seem to work
430 _gdk_windowing_before_process_all_updates (void)
432 in_process_all_updates = TRUE;
434 NSDisableScreenUpdates ();
438 _gdk_windowing_after_process_all_updates (void)
440 GSList *old_update_nswindows = update_nswindows;
441 GSList *tmp_list = update_nswindows;
443 update_nswindows = NULL;
447 NSWindow *nswindow = tmp_list->data;
449 [[nswindow contentView] displayIfNeeded];
451 _gdk_quartz_drawable_flush (NULL);
453 [nswindow enableFlushWindow];
454 [nswindow flushWindow];
457 tmp_list = tmp_list->next;
460 g_slist_free (old_update_nswindows);
462 in_process_all_updates = FALSE;
464 NSEnableScreenUpdates ();
468 gdk_window_impl_quartz_paintable_init (GdkPaintableIface *iface)
470 iface->begin_paint_region = gdk_window_impl_quartz_begin_paint_region;
471 iface->end_paint = gdk_window_impl_quartz_end_paint;
475 _gdk_window_impl_quartz_get_type (void)
477 static GType object_type = 0;
481 const GTypeInfo object_info =
483 sizeof (GdkWindowImplQuartzClass),
484 (GBaseInitFunc) NULL,
485 (GBaseFinalizeFunc) NULL,
486 (GClassInitFunc) gdk_window_impl_quartz_class_init,
487 NULL, /* class_finalize */
488 NULL, /* class_data */
489 sizeof (GdkWindowImplQuartz),
491 (GInstanceInitFunc) gdk_window_impl_quartz_init,
494 const GInterfaceInfo paintable_info =
496 (GInterfaceInitFunc) gdk_window_impl_quartz_paintable_init,
501 const GInterfaceInfo window_impl_info =
503 (GInterfaceInitFunc) gdk_window_impl_iface_init,
508 object_type = g_type_register_static (GDK_TYPE_DRAWABLE_IMPL_QUARTZ,
509 "GdkWindowImplQuartz",
511 g_type_add_interface_static (object_type,
514 g_type_add_interface_static (object_type,
515 GDK_TYPE_WINDOW_IMPL,
523 _gdk_window_impl_get_type (void)
525 return _gdk_window_impl_quartz_get_type ();
529 get_default_title (void)
533 title = g_get_application_name ();
535 title = g_get_prgname ();
541 get_ancestor_coordinates_from_child (GdkWindow *child_window,
544 GdkWindow *ancestor_window,
548 GdkWindowObject *child_private = GDK_WINDOW_OBJECT (child_window);
549 GdkWindowObject *ancestor_private = GDK_WINDOW_OBJECT (ancestor_window);
551 while (child_private != ancestor_private)
553 child_x += child_private->x;
554 child_y += child_private->y;
556 child_private = child_private->parent;
559 *ancestor_x = child_x;
560 *ancestor_y = child_y;
564 _gdk_quartz_window_debug_highlight (GdkWindow *window, gint number)
566 GdkWindowObject *private = GDK_WINDOW_OBJECT (window);
571 static NSWindow *debug_window[10];
572 static NSRect old_rect[10];
576 g_return_if_fail (number >= 0 && number <= 9);
578 if (window == _gdk_root)
583 if (debug_window[number])
584 [debug_window[number] close];
585 debug_window[number] = NULL;
590 toplevel = gdk_window_get_toplevel (window);
591 get_ancestor_coordinates_from_child (window, 0, 0, toplevel, &x, &y);
593 gdk_window_get_origin (toplevel, &tx, &ty);
597 _gdk_quartz_window_gdk_xy_to_xy (x, y + private->height,
600 rect = NSMakeRect (gx, gy, private->width, private->height);
602 if (debug_window[number] && NSEqualRects (rect, old_rect[number]))
605 old_rect[number] = rect;
607 if (debug_window[number])
608 [debug_window[number] close];
610 debug_window[number] = [[NSWindow alloc] initWithContentRect:rect
611 styleMask:NSBorderlessWindowMask
612 backing:NSBackingStoreBuffered
618 color = [NSColor redColor];
621 color = [NSColor blueColor];
624 color = [NSColor greenColor];
627 color = [NSColor yellowColor];
630 color = [NSColor brownColor];
633 color = [NSColor purpleColor];
636 color = [NSColor blackColor];
640 [debug_window[number] setBackgroundColor:color];
641 [debug_window[number] setAlphaValue:0.4];
642 [debug_window[number] setOpaque:NO];
643 [debug_window[number] setReleasedWhenClosed:YES];
644 [debug_window[number] setIgnoresMouseEvents:YES];
645 [debug_window[number] setLevel:NSFloatingWindowLevel];
647 [debug_window[number] orderFront:nil];
651 _gdk_quartz_window_is_ancestor (GdkWindow *ancestor,
654 if (ancestor == NULL || window == NULL)
657 return (gdk_window_get_parent (window) == ancestor ||
658 _gdk_quartz_window_is_ancestor (ancestor,
659 gdk_window_get_parent (window)));
663 /* See notes on top of gdkscreen-quartz.c */
665 _gdk_quartz_window_gdk_xy_to_xy (gint gdk_x,
670 GdkScreenQuartz *screen_quartz = GDK_SCREEN_QUARTZ (_gdk_screen);
673 *ns_y = screen_quartz->height - gdk_y + screen_quartz->min_y;
676 *ns_x = gdk_x + screen_quartz->min_x;
680 _gdk_quartz_window_xy_to_gdk_xy (gint ns_x,
685 GdkScreenQuartz *screen_quartz = GDK_SCREEN_QUARTZ (_gdk_screen);
688 *gdk_y = screen_quartz->height - ns_y + screen_quartz->min_y;
691 *gdk_x = ns_x - screen_quartz->min_x;
695 _gdk_quartz_window_nspoint_to_gdk_xy (NSPoint point,
699 _gdk_quartz_window_xy_to_gdk_xy (point.x, point.y,
704 find_child_window_helper (GdkWindow *window,
709 gboolean get_toplevel)
711 GdkWindowImplQuartz *impl;
714 impl = GDK_WINDOW_IMPL_QUARTZ (GDK_WINDOW_OBJECT (window)->impl);
716 if (window == _gdk_root)
717 update_toplevel_order ();
719 for (l = impl->sorted_children; l; l = l->next)
721 GdkWindowObject *child_private = l->data;
722 GdkWindowImplQuartz *child_impl = GDK_WINDOW_IMPL_QUARTZ (child_private->impl);
725 if (!GDK_WINDOW_IS_MAPPED (child_private))
728 temp_x = x_offset + child_private->x;
729 temp_y = y_offset + child_private->y;
731 /* Special-case the root window. We have to include the title
732 * bar in the checks, otherwise the window below the title bar
733 * will be found i.e. events punch through. (If we can find a
734 * better way to deal with the events in gdkevents-quartz, this
735 * might not be needed.)
737 if (window == _gdk_root)
739 NSRect frame = NSMakeRect (0, 0, 100, 100);
744 mask = [child_impl->toplevel styleMask];
746 /* Get the title bar height. */
747 content = [NSWindow contentRectForFrameRect:frame
749 titlebar_height = frame.size.height - content.size.height;
751 if (titlebar_height > 0 &&
752 x >= temp_x && y >= temp_y - titlebar_height &&
753 x < temp_x + child_private->width && y < temp_y)
755 /* The root means "unknown" i.e. a window not managed by
758 return (GdkWindow *)_gdk_root;
762 if ((!get_toplevel || (get_toplevel && window == _gdk_root)) &&
763 x >= temp_x && y >= temp_y &&
764 x < temp_x + child_private->width && y < temp_y + child_private->height)
766 /* Look for child windows. */
767 return find_child_window_helper (l->data,
777 /* Given a GdkWindow and coordinates relative to it, returns the
778 * innermost subwindow that contains the point. If the coordinates are
779 * outside the passed in window, NULL is returned.
782 _gdk_quartz_window_find_child (GdkWindow *window,
785 gboolean get_toplevel)
787 GdkWindowObject *private = GDK_WINDOW_OBJECT (window);
789 if (x >= 0 && y >= 0 && x < private->width && y < private->height)
790 return find_child_window_helper (window, x, y, 0, 0, get_toplevel);
797 _gdk_quartz_window_did_become_main (GdkWindow *window)
799 main_window_stack = g_slist_remove (main_window_stack, window);
801 if (GDK_WINDOW_OBJECT (window)->window_type != GDK_WINDOW_TEMP)
802 main_window_stack = g_slist_prepend (main_window_stack, window);
804 clear_toplevel_order ();
808 _gdk_quartz_window_did_resign_main (GdkWindow *window)
810 GdkWindow *new_window = NULL;
812 if (main_window_stack)
813 new_window = main_window_stack->data;
818 toplevels = gdk_screen_get_toplevel_windows (gdk_screen_get_default ());
820 new_window = toplevels->data;
821 g_list_free (toplevels);
825 new_window != window &&
826 GDK_WINDOW_IS_MAPPED (new_window) &&
827 GDK_WINDOW_OBJECT (new_window)->window_type != GDK_WINDOW_TEMP)
829 GdkWindowObject *private = (GdkWindowObject *) new_window;
830 GdkWindowImplQuartz *impl = GDK_WINDOW_IMPL_QUARTZ (private->impl);
832 [impl->toplevel makeKeyAndOrderFront:impl->toplevel];
835 clear_toplevel_order ();
839 get_nsscreen_for_point (gint x, gint y)
843 NSScreen *screen = NULL;
845 GDK_QUARTZ_ALLOC_POOL;
847 screens = [NSScreen screens];
849 for (i = 0; i < [screens count]; i++)
851 NSRect rect = [[screens objectAtIndex:i] frame];
853 if (x >= rect.origin.x && x <= rect.origin.x + rect.size.width &&
854 y >= rect.origin.y && y <= rect.origin.y + rect.size.height)
856 screen = [screens objectAtIndex:i];
861 GDK_QUARTZ_RELEASE_POOL;
867 _gdk_window_impl_new (GdkWindow *window,
868 GdkWindow *real_parent,
871 GdkEventMask event_mask,
872 GdkWindowAttr *attributes,
873 gint attributes_mask)
875 GdkWindowObject *private;
876 GdkWindowImplQuartz *impl;
877 GdkDrawableImplQuartz *draw_impl;
878 GdkWindowImplQuartz *parent_impl;
880 GDK_QUARTZ_ALLOC_POOL;
882 private = (GdkWindowObject *)window;
884 impl = g_object_new (_gdk_window_impl_get_type (), NULL);
885 private->impl = (GdkDrawable *)impl;
886 draw_impl = GDK_DRAWABLE_IMPL_QUARTZ (impl);
887 draw_impl->wrapper = GDK_DRAWABLE (window);
889 parent_impl = GDK_WINDOW_IMPL_QUARTZ (private->parent->impl);
891 switch (private->window_type)
893 case GDK_WINDOW_TOPLEVEL:
894 case GDK_WINDOW_DIALOG:
895 case GDK_WINDOW_TEMP:
896 if (GDK_WINDOW_TYPE (private->parent) != GDK_WINDOW_ROOT)
898 /* The common code warns for this case */
899 parent_impl = GDK_WINDOW_IMPL_QUARTZ (GDK_WINDOW_OBJECT (_gdk_root)->impl);
903 if (!private->input_only)
905 if (attributes_mask & GDK_WA_COLORMAP)
907 draw_impl->colormap = attributes->colormap;
908 g_object_ref (attributes->colormap);
912 if (visual == gdk_screen_get_system_visual (_gdk_screen))
914 draw_impl->colormap = gdk_screen_get_system_colormap (_gdk_screen);
915 g_object_ref (draw_impl->colormap);
917 else if (visual == gdk_screen_get_rgba_visual (_gdk_screen))
919 draw_impl->colormap = gdk_screen_get_rgba_colormap (_gdk_screen);
920 g_object_ref (draw_impl->colormap);
924 draw_impl->colormap = gdk_colormap_new (visual, FALSE);
930 draw_impl->colormap = gdk_screen_get_system_colormap (_gdk_screen);
931 g_object_ref (draw_impl->colormap);
934 /* Maintain the z-ordered list of children. */
935 if (private->parent != (GdkWindowObject *)_gdk_root)
936 parent_impl->sorted_children = g_list_prepend (parent_impl->sorted_children, window);
938 clear_toplevel_order ();
940 gdk_window_set_cursor (window, ((attributes_mask & GDK_WA_CURSOR) ?
941 (attributes->cursor) :
944 switch (attributes->window_type)
946 case GDK_WINDOW_TOPLEVEL:
947 case GDK_WINDOW_DIALOG:
948 case GDK_WINDOW_TEMP:
953 NSUInteger style_mask;
957 /* initWithContentRect will place on the mainScreen by default.
958 * We want to select the screen to place on ourselves. We need
959 * to find the screen the window will be on and correct the
960 * content_rect coordinates to be relative to that screen.
962 _gdk_quartz_window_gdk_xy_to_xy (private->x, private->y, &nx, &ny);
964 screen = get_nsscreen_for_point (nx, ny);
965 screen_rect = [screen frame];
966 nx -= screen_rect.origin.x;
967 ny -= screen_rect.origin.y;
969 content_rect = NSMakeRect (nx, ny - private->height,
973 if (attributes->window_type == GDK_WINDOW_TEMP ||
974 attributes->type_hint == GDK_WINDOW_TYPE_HINT_SPLASHSCREEN)
976 style_mask = NSBorderlessWindowMask;
980 style_mask = (NSTitledWindowMask |
981 NSClosableWindowMask |
982 NSMiniaturizableWindowMask |
983 NSResizableWindowMask);
986 impl->toplevel = [[GdkQuartzWindow alloc] initWithContentRect:content_rect
988 backing:NSBackingStoreBuffered
992 if (attributes_mask & GDK_WA_TITLE)
993 title = attributes->title;
995 title = get_default_title ();
997 gdk_window_set_title (window, title);
999 if (draw_impl->colormap == gdk_screen_get_rgba_colormap (_gdk_screen))
1001 [impl->toplevel setOpaque:NO];
1002 [impl->toplevel setBackgroundColor:[NSColor clearColor]];
1005 content_rect.origin.x = 0;
1006 content_rect.origin.y = 0;
1008 impl->view = [[GdkQuartzView alloc] initWithFrame:content_rect];
1009 [impl->view setGdkWindow:window];
1010 [impl->toplevel setContentView:impl->view];
1011 [impl->view release];
1015 case GDK_WINDOW_CHILD:
1017 GdkWindowImplQuartz *parent_impl = GDK_WINDOW_IMPL_QUARTZ (GDK_WINDOW_OBJECT (private->parent)->impl);
1019 if (!private->input_only)
1021 NSRect frame_rect = NSMakeRect (private->x + private->parent->abs_x,
1022 private->y + private->parent->abs_y,
1026 impl->view = [[GdkQuartzView alloc] initWithFrame:frame_rect];
1028 [impl->view setGdkWindow:window];
1030 /* GdkWindows should be hidden by default */
1031 [impl->view setHidden:YES];
1032 [parent_impl->view addSubview:impl->view];
1033 [impl->view release];
1039 g_assert_not_reached ();
1042 GDK_QUARTZ_RELEASE_POOL;
1044 if (attributes_mask & GDK_WA_TYPE_HINT)
1045 gdk_window_set_type_hint (window, attributes->type_hint);
1049 _gdk_quartz_window_update_position (GdkWindow *window)
1052 NSRect content_rect;
1053 GdkWindowObject *private = (GdkWindowObject *)window;
1054 GdkWindowImplQuartz *impl = GDK_WINDOW_IMPL_QUARTZ (private->impl);
1056 GDK_QUARTZ_ALLOC_POOL;
1058 frame_rect = [impl->toplevel frame];
1059 content_rect = [impl->toplevel contentRectForFrameRect:frame_rect];
1061 _gdk_quartz_window_xy_to_gdk_xy (content_rect.origin.x,
1062 content_rect.origin.y + content_rect.size.height,
1063 &private->x, &private->y);
1066 GDK_QUARTZ_RELEASE_POOL;
1070 _gdk_windowing_update_window_sizes (GdkScreen *screen)
1072 GList *windows, *list;
1073 GdkWindowObject *private = (GdkWindowObject *)_gdk_root;
1075 /* The size of the root window is so that it can contain all
1076 * monitors attached to this machine. The monitors are laid out
1077 * within this root window. We calculate the size of the root window
1078 * and the positions of the different monitors in gdkscreen-quartz.c.
1080 * This data is updated when the monitor configuration is changed.
1086 private->width = gdk_screen_get_width (screen);
1087 private->height = gdk_screen_get_height (screen);
1089 windows = gdk_screen_get_toplevel_windows (screen);
1091 for (list = windows; list; list = list->next)
1092 _gdk_quartz_window_update_position (list->data);
1094 g_list_free (windows);
1098 _gdk_windowing_window_init (void)
1100 GdkWindowObject *private;
1101 GdkWindowImplQuartz *impl;
1102 GdkDrawableImplQuartz *drawable_impl;
1104 g_assert (_gdk_root == NULL);
1106 _gdk_root = g_object_new (GDK_TYPE_WINDOW, NULL);
1108 private = (GdkWindowObject *)_gdk_root;
1109 private->impl = g_object_new (_gdk_window_impl_get_type (), NULL);
1110 private->impl_window = private;
1112 impl = GDK_WINDOW_IMPL_QUARTZ (GDK_WINDOW_OBJECT (_gdk_root)->impl);
1114 _gdk_windowing_update_window_sizes (_gdk_screen);
1116 private->state = 0; /* We don't want GDK_WINDOW_STATE_WITHDRAWN here */
1117 private->window_type = GDK_WINDOW_ROOT;
1118 private->depth = 24;
1119 private->viewable = TRUE;
1121 drawable_impl = GDK_DRAWABLE_IMPL_QUARTZ (private->impl);
1123 drawable_impl->wrapper = GDK_DRAWABLE (private);
1124 drawable_impl->colormap = gdk_screen_get_system_colormap (_gdk_screen);
1125 g_object_ref (drawable_impl->colormap);
1129 _gdk_quartz_window_destroy (GdkWindow *window,
1131 gboolean foreign_destroy)
1133 GdkWindowObject *private;
1134 GdkWindowImplQuartz *impl;
1135 GdkWindowObject *parent;
1137 private = GDK_WINDOW_OBJECT (window);
1138 impl = GDK_WINDOW_IMPL_QUARTZ (private->impl);
1140 main_window_stack = g_slist_remove (main_window_stack, window);
1142 g_list_free (impl->sorted_children);
1143 impl->sorted_children = NULL;
1145 parent = private->parent;
1148 GdkWindowImplQuartz *parent_impl = GDK_WINDOW_IMPL_QUARTZ (parent->impl);
1150 parent_impl->sorted_children = g_list_remove (parent_impl->sorted_children, window);
1153 _gdk_quartz_drawable_finish (GDK_DRAWABLE (impl));
1155 if (!recursing && !foreign_destroy)
1157 GDK_QUARTZ_ALLOC_POOL;
1160 [impl->toplevel close];
1161 else if (impl->view)
1162 [impl->view removeFromSuperview];
1164 GDK_QUARTZ_RELEASE_POOL;
1169 _gdk_windowing_window_destroy_foreign (GdkWindow *window)
1171 /* Foreign windows aren't supported in OSX. */
1174 /* FIXME: This might be possible to simplify with client-side windows. Also
1175 * note that already_mapped is not used yet, see the x11 backend.
1178 gdk_window_quartz_show (GdkWindow *window, gboolean already_mapped)
1180 GdkWindowObject *private = (GdkWindowObject *)window;
1181 GdkWindowImplQuartz *impl = GDK_WINDOW_IMPL_QUARTZ (private->impl);
1182 gboolean focus_on_map;
1184 GDK_QUARTZ_ALLOC_POOL;
1186 if (!GDK_WINDOW_IS_MAPPED (window))
1187 focus_on_map = private->focus_on_map;
1189 focus_on_map = TRUE;
1195 make_key = (private->accept_focus && focus_on_map &&
1196 private->window_type != GDK_WINDOW_TEMP);
1198 [(GdkQuartzWindow*)impl->toplevel showAndMakeKey:make_key];
1199 clear_toplevel_order ();
1201 _gdk_quartz_events_send_map_event (window);
1205 [impl->view setHidden:NO];
1208 [impl->view setNeedsDisplay:YES];
1210 gdk_synthesize_window_state (window, GDK_WINDOW_STATE_WITHDRAWN, 0);
1212 if (private->state & GDK_WINDOW_STATE_MAXIMIZED)
1213 gdk_window_maximize (window);
1215 if (private->state & GDK_WINDOW_STATE_ICONIFIED)
1216 gdk_window_iconify (window);
1218 if (impl->transient_for && !GDK_WINDOW_DESTROYED (impl->transient_for))
1219 _gdk_quartz_window_attach_to_parent (window);
1221 GDK_QUARTZ_RELEASE_POOL;
1224 /* Temporarily unsets the parent window, if the window is a
1228 _gdk_quartz_window_detach_from_parent (GdkWindow *window)
1230 GdkWindowImplQuartz *impl;
1232 g_return_if_fail (GDK_IS_WINDOW (window));
1234 impl = GDK_WINDOW_IMPL_QUARTZ (GDK_WINDOW_OBJECT (window)->impl);
1236 g_return_if_fail (impl->toplevel != NULL);
1238 if (impl->transient_for && !GDK_WINDOW_DESTROYED (impl->transient_for))
1240 GdkWindowImplQuartz *parent_impl;
1242 parent_impl = GDK_WINDOW_IMPL_QUARTZ (GDK_WINDOW_OBJECT (impl->transient_for)->impl);
1243 [parent_impl->toplevel removeChildWindow:impl->toplevel];
1244 clear_toplevel_order ();
1248 /* Re-sets the parent window, if the window is a transient. */
1250 _gdk_quartz_window_attach_to_parent (GdkWindow *window)
1252 GdkWindowImplQuartz *impl;
1254 g_return_if_fail (GDK_IS_WINDOW (window));
1256 impl = GDK_WINDOW_IMPL_QUARTZ (GDK_WINDOW_OBJECT (window)->impl);
1258 g_return_if_fail (impl->toplevel != NULL);
1260 if (impl->transient_for && !GDK_WINDOW_DESTROYED (impl->transient_for))
1262 GdkWindowImplQuartz *parent_impl;
1264 parent_impl = GDK_WINDOW_IMPL_QUARTZ (GDK_WINDOW_OBJECT (impl->transient_for)->impl);
1265 [parent_impl->toplevel addChildWindow:impl->toplevel ordered:NSWindowAbove];
1266 clear_toplevel_order ();
1271 gdk_window_quartz_hide (GdkWindow *window)
1273 GdkWindowObject *private = (GdkWindowObject *)window;
1274 GdkWindowImplQuartz *impl;
1276 /* Make sure we're not stuck in fullscreen mode. */
1277 if (get_fullscreen_geometry (window))
1278 SetSystemUIMode (kUIModeNormal, 0);
1280 check_grab_unmap (window);
1282 _gdk_window_clear_update_area (window);
1284 impl = GDK_WINDOW_IMPL_QUARTZ (private->impl);
1288 /* Update main window. */
1289 main_window_stack = g_slist_remove (main_window_stack, window);
1290 if ([NSApp mainWindow] == impl->toplevel)
1291 _gdk_quartz_window_did_resign_main (window);
1293 if (impl->transient_for)
1294 _gdk_quartz_window_detach_from_parent (window);
1296 [(GdkQuartzWindow*)impl->toplevel hide];
1298 else if (impl->view)
1300 [impl->view setHidden:YES];
1305 gdk_window_quartz_withdraw (GdkWindow *window)
1307 gdk_window_hide (window);
1311 move_resize_window_internal (GdkWindow *window,
1317 GdkWindowObject *private = (GdkWindowObject *)window;
1318 GdkWindowImplQuartz *impl;
1319 GdkRectangle old_visible;
1320 GdkRectangle new_visible;
1321 GdkRectangle scroll_rect;
1322 GdkRegion *old_region;
1323 GdkRegion *expose_region;
1326 if (GDK_WINDOW_DESTROYED (window))
1329 impl = GDK_WINDOW_IMPL_QUARTZ (private->impl);
1331 if ((x == -1 || (x == private->x)) &&
1332 (y == -1 || (y == private->y)) &&
1333 (width == -1 || (width == private->width)) &&
1334 (height == -1 || (height == private->height)))
1339 if (!impl->toplevel)
1341 /* The previously visible area of this window in a coordinate
1342 * system rooted at the origin of this window.
1344 old_visible.x = -private->x;
1345 old_visible.y = -private->y;
1347 gdk_drawable_get_size (GDK_DRAWABLE (private->parent),
1349 &old_visible.height);
1354 delta.width = x - private->x;
1364 delta.height = y - private->y;
1373 private->width = width;
1376 private->height = height;
1378 GDK_QUARTZ_ALLOC_POOL;
1382 NSRect content_rect;
1386 _gdk_quartz_window_gdk_xy_to_xy (private->x, private->y + private->height,
1389 content_rect = NSMakeRect (gx, gy, private->width, private->height);
1391 frame_rect = [impl->toplevel frameRectForContentRect:content_rect];
1392 [impl->toplevel setFrame:frame_rect display:YES];
1396 if (!private->input_only)
1400 nsrect = NSMakeRect (private->x, private->y, private->width, private->height);
1402 /* The newly visible area of this window in a coordinate
1403 * system rooted at the origin of this window.
1405 new_visible.x = -private->x;
1406 new_visible.y = -private->y;
1407 new_visible.width = old_visible.width; /* parent has not changed size */
1408 new_visible.height = old_visible.height; /* parent has not changed size */
1410 expose_region = gdk_region_rectangle (&new_visible);
1411 old_region = gdk_region_rectangle (&old_visible);
1412 gdk_region_subtract (expose_region, old_region);
1414 /* Determine what (if any) part of the previously visible
1415 * part of the window can be copied without a redraw
1417 scroll_rect = old_visible;
1418 scroll_rect.x -= delta.width;
1419 scroll_rect.y -= delta.height;
1420 gdk_rectangle_intersect (&scroll_rect, &old_visible, &scroll_rect);
1422 if (!gdk_region_empty (expose_region))
1424 GdkRectangle* rects;
1428 if (scroll_rect.width != 0 && scroll_rect.height != 0)
1430 [impl->view scrollRect:NSMakeRect (scroll_rect.x,
1437 [impl->view setFrame:nsrect];
1439 gdk_region_get_rectangles (expose_region, &rects, &n_rects);
1441 for (n = 0; n < n_rects; ++n)
1442 _gdk_quartz_window_set_needs_display_in_rect (window, &rects[n]);
1448 [impl->view setFrame:nsrect];
1449 [impl->view setNeedsDisplay:YES];
1452 gdk_region_destroy (expose_region);
1453 gdk_region_destroy (old_region);
1457 GDK_QUARTZ_RELEASE_POOL;
1461 window_quartz_move (GdkWindow *window,
1465 g_return_if_fail (GDK_IS_WINDOW (window));
1467 if (((GdkWindowObject *)window)->state & GDK_WINDOW_STATE_FULLSCREEN)
1470 move_resize_window_internal (window, x, y, -1, -1);
1474 window_quartz_resize (GdkWindow *window,
1478 g_return_if_fail (GDK_IS_WINDOW (window));
1480 if (((GdkWindowObject *)window)->state & GDK_WINDOW_STATE_FULLSCREEN)
1488 move_resize_window_internal (window, -1, -1, width, height);
1492 window_quartz_move_resize (GdkWindow *window,
1503 move_resize_window_internal (window, x, y, width, height);
1507 gdk_window_quartz_move_resize (GdkWindow *window,
1514 if (with_move && (width < 0 && height < 0))
1515 window_quartz_move (window, x, y);
1519 window_quartz_move_resize (window, x, y, width, height);
1521 window_quartz_resize (window, width, height);
1525 /* FIXME: This might need fixing (reparenting didn't work before client-side
1529 gdk_window_quartz_reparent (GdkWindow *window,
1530 GdkWindow *new_parent,
1534 GdkWindowObject *private, *old_parent_private, *new_parent_private;
1535 GdkWindowImplQuartz *impl, *old_parent_impl, *new_parent_impl;
1536 NSView *view, *new_parent_view;
1538 if (new_parent == _gdk_root)
1540 /* Could be added, just needs implementing. */
1541 g_warning ("Reparenting to root window is not supported yet in the Mac OS X backend");
1545 private = GDK_WINDOW_OBJECT (window);
1546 impl = GDK_WINDOW_IMPL_QUARTZ (private->impl);
1549 new_parent_private = GDK_WINDOW_OBJECT (new_parent);
1550 new_parent_impl = GDK_WINDOW_IMPL_QUARTZ (new_parent_private->impl);
1551 new_parent_view = new_parent_impl->view;
1553 old_parent_private = GDK_WINDOW_OBJECT (private->parent);
1554 old_parent_impl = GDK_WINDOW_IMPL_QUARTZ (old_parent_private->impl);
1558 [view removeFromSuperview];
1559 [new_parent_view addSubview:view];
1563 private->parent = new_parent_private;
1565 if (old_parent_private)
1567 old_parent_impl->sorted_children = g_list_remove (old_parent_impl->sorted_children, window);
1570 new_parent_impl->sorted_children = g_list_prepend (new_parent_impl->sorted_children, window);
1575 /* Get the toplevel ordering from NSApp and update our own list. We do
1576 * this on demand since the NSApp's list is not up to date directly
1577 * after we get windowDidBecomeMain.
1580 update_toplevel_order (void)
1582 GdkWindowObject *root;
1583 GdkWindowImplQuartz *root_impl;
1584 NSEnumerator *enumerator;
1586 GList *toplevels = NULL;
1588 root = GDK_WINDOW_OBJECT (_gdk_root);
1589 root_impl = GDK_WINDOW_IMPL_QUARTZ (root->impl);
1591 if (root_impl->sorted_children)
1594 GDK_QUARTZ_ALLOC_POOL;
1596 enumerator = [[NSApp orderedWindows] objectEnumerator];
1597 while ((nswindow = [enumerator nextObject]))
1601 if (![[nswindow contentView] isKindOfClass:[GdkQuartzView class]])
1604 window = [(GdkQuartzView *)[nswindow contentView] gdkWindow];
1605 toplevels = g_list_prepend (toplevels, window);
1608 GDK_QUARTZ_RELEASE_POOL;
1610 root_impl->sorted_children = g_list_reverse (toplevels);
1614 clear_toplevel_order (void)
1616 GdkWindowObject *root;
1617 GdkWindowImplQuartz *root_impl;
1619 root = GDK_WINDOW_OBJECT (_gdk_root);
1620 root_impl = GDK_WINDOW_IMPL_QUARTZ (root->impl);
1622 g_list_free (root_impl->sorted_children);
1623 root_impl->sorted_children = NULL;
1627 gdk_window_quartz_raise (GdkWindow *window)
1629 if (GDK_WINDOW_DESTROYED (window))
1632 if (WINDOW_IS_TOPLEVEL (window))
1634 GdkWindowImplQuartz *impl;
1636 impl = GDK_WINDOW_IMPL_QUARTZ (GDK_WINDOW_OBJECT (window)->impl);
1637 [impl->toplevel orderFront:impl->toplevel];
1639 clear_toplevel_order ();
1643 GdkWindowObject *parent = GDK_WINDOW_OBJECT (window)->parent;
1647 GdkWindowImplQuartz *impl;
1649 impl = (GdkWindowImplQuartz *)parent->impl;
1651 impl->sorted_children = g_list_remove (impl->sorted_children, window);
1652 impl->sorted_children = g_list_prepend (impl->sorted_children, window);
1658 gdk_window_quartz_lower (GdkWindow *window)
1660 if (GDK_WINDOW_DESTROYED (window))
1663 if (WINDOW_IS_TOPLEVEL (window))
1665 GdkWindowImplQuartz *impl;
1667 impl = GDK_WINDOW_IMPL_QUARTZ (GDK_WINDOW_OBJECT (window)->impl);
1668 [impl->toplevel orderBack:impl->toplevel];
1670 clear_toplevel_order ();
1674 GdkWindowObject *parent = GDK_WINDOW_OBJECT (window)->parent;
1678 GdkWindowImplQuartz *impl;
1680 impl = (GdkWindowImplQuartz *)parent->impl;
1682 impl->sorted_children = g_list_remove (impl->sorted_children, window);
1683 impl->sorted_children = g_list_append (impl->sorted_children, window);
1689 gdk_window_quartz_restack_toplevel (GdkWindow *window,
1693 /* FIXME: Implement this */
1697 gdk_window_quartz_set_background (GdkWindow *window,
1698 const GdkColor *color)
1700 /* FIXME: We could theoretically set the background color for toplevels
1701 * here. (Currently we draw the background before emitting expose events)
1706 gdk_window_quartz_set_back_pixmap (GdkWindow *window,
1709 /* FIXME: Could theoretically set some background image here. (Currently
1710 * the back pixmap is drawn before emitting expose events.
1715 gdk_window_quartz_set_device_cursor (GdkWindow *window,
1719 GdkCursorPrivate *cursor_private;
1722 cursor_private = (GdkCursorPrivate *)cursor;
1724 if (GDK_WINDOW_DESTROYED (window))
1728 nscursor = [NSCursor arrowCursor];
1730 nscursor = cursor_private->nscursor;
1736 gdk_window_quartz_get_geometry (GdkWindow *window,
1743 GdkWindowImplQuartz *impl;
1744 GdkWindowObject *private;
1747 if (GDK_WINDOW_DESTROYED (window))
1750 impl = GDK_WINDOW_IMPL_QUARTZ (GDK_WINDOW_OBJECT (window)->impl);
1751 private = GDK_WINDOW_OBJECT (window);
1752 if (window == _gdk_root)
1760 *width = private->width;
1762 *height = private->height;
1764 else if (WINDOW_IS_TOPLEVEL (window))
1766 ns_rect = [impl->toplevel contentRectForFrameRect:[impl->toplevel frame]];
1768 /* This doesn't work exactly as in X. There doesn't seem to be a
1769 * way to get the coords relative to the parent window (usually
1770 * the window frame), but that seems useless except for
1771 * borderless windows where it's relative to the root window. So
1772 * we return (0, 0) (should be something like (0, 22)) for
1773 * windows with borders and the root relative coordinates
1776 if ([impl->toplevel styleMask] == NSBorderlessWindowMask)
1778 _gdk_quartz_window_xy_to_gdk_xy (ns_rect.origin.x,
1779 ns_rect.origin.y + ns_rect.size.height,
1791 *width = ns_rect.size.width;
1793 *height = ns_rect.size.height;
1797 ns_rect = [impl->view frame];
1800 *x = ns_rect.origin.x;
1802 *y = ns_rect.origin.y;
1804 *width = ns_rect.size.width;
1806 *height = ns_rect.size.height;
1810 *depth = gdk_drawable_get_depth (window);
1814 gdk_window_quartz_get_root_coords (GdkWindow *window,
1820 GdkWindowObject *private;
1821 int tmp_x = 0, tmp_y = 0;
1822 GdkWindow *toplevel;
1823 NSRect content_rect;
1824 GdkWindowImplQuartz *impl;
1826 if (GDK_WINDOW_DESTROYED (window))
1836 if (window == _gdk_root)
1846 private = GDK_WINDOW_OBJECT (window);
1848 toplevel = gdk_window_get_toplevel (window);
1849 impl = GDK_WINDOW_IMPL_QUARTZ (GDK_WINDOW_OBJECT (toplevel)->impl);
1851 content_rect = [impl->toplevel contentRectForFrameRect:[impl->toplevel frame]];
1853 _gdk_quartz_window_xy_to_gdk_xy (content_rect.origin.x,
1854 content_rect.origin.y + content_rect.size.height,
1860 while (private != GDK_WINDOW_OBJECT (toplevel))
1862 if (_gdk_window_has_impl ((GdkWindow *)private))
1864 tmp_x += private->x;
1865 tmp_y += private->y;
1868 private = private->parent;
1880 gdk_window_quartz_get_deskrelative_origin (GdkWindow *window,
1884 return gdk_window_get_origin (window, x, y);
1888 gdk_window_get_root_origin (GdkWindow *window,
1897 gdk_window_get_frame_extents (window, &rect);
1906 /* Returns coordinates relative to the passed in window. */
1908 gdk_window_quartz_get_device_state_helper (GdkWindow *window,
1912 GdkModifierType *mask)
1914 GdkWindowObject *toplevel;
1915 GdkWindowObject *private;
1918 GdkWindow *found_window;
1920 g_return_val_if_fail (window == NULL || GDK_IS_WINDOW (window), NULL);
1922 if (GDK_WINDOW_DESTROYED (window))
1930 toplevel = GDK_WINDOW_OBJECT (gdk_window_get_toplevel (window));
1932 *mask = _gdk_quartz_events_get_current_event_mask ();
1934 /* Get the y coordinate, needs to be flipped. */
1935 if (window == _gdk_root)
1937 point = [NSEvent mouseLocation];
1938 _gdk_quartz_window_nspoint_to_gdk_xy (point, &x_tmp, &y_tmp);
1942 GdkWindowImplQuartz *impl;
1945 impl = GDK_WINDOW_IMPL_QUARTZ (toplevel->impl);
1946 private = GDK_WINDOW_OBJECT (toplevel);
1947 nswindow = impl->toplevel;
1949 point = [nswindow mouseLocationOutsideOfEventStream];
1952 y_tmp = private->height - point.y;
1954 window = (GdkWindow *)toplevel;
1957 found_window = _gdk_quartz_window_find_child (window, x_tmp, y_tmp,
1960 /* We never return the root window. */
1961 if (found_window == _gdk_root)
1962 found_window = NULL;
1967 return found_window;
1971 gdk_window_quartz_get_device_state (GdkWindow *window,
1975 GdkModifierType *mask)
1977 return gdk_window_quartz_get_device_state_helper (window,
1979 x, y, mask) != NULL;
1982 /* Returns coordinates relative to the root. */
1984 _gdk_windowing_get_device_state (GdkDisplay *display,
1989 GdkModifierType *mask)
1991 g_return_if_fail (display == _gdk_display);
1993 *screen = _gdk_screen;
1994 gdk_window_quartz_get_device_state_helper (_gdk_root, device, x, y, mask);
1998 gdk_display_warp_pointer (GdkDisplay *display,
2003 CGDisplayMoveCursorToPoint (CGMainDisplayID (), CGPointMake (x, y));
2006 /* Returns coordinates relative to the found window. */
2008 _gdk_windowing_window_at_pointer (GdkDisplay *display,
2011 GdkModifierType *mask,
2012 gboolean get_toplevel)
2014 GdkWindow *found_window;
2016 GdkModifierType tmp_mask = 0;
2018 found_window = gdk_window_quartz_get_device_state_helper (_gdk_root,
2019 display->core_pointer,
2024 GdkWindowObject *private;
2026 /* The coordinates returned above are relative the root, we want
2027 * coordinates relative the window here.
2029 private = GDK_WINDOW_OBJECT (found_window);
2030 while (private != GDK_WINDOW_OBJECT (_gdk_root))
2035 private = private->parent;
2043 /* Mimic the X backend here, -1,-1 for unknown windows. */
2053 GdkWindowObject *w = (GdkWindowObject *)found_window;
2054 /* Requested toplevel, find it. */
2055 /* TODO: This can be implemented more efficient by never
2056 recursing into children in the first place */
2059 /* Convert to toplevel */
2060 while (w->parent != NULL &&
2061 w->parent->window_type != GDK_WINDOW_ROOT)
2067 found_window = (GdkWindow *)w;
2071 return found_window;
2075 _gdk_windowing_window_at_device_position (GdkDisplay *display,
2079 GdkModifierType *mask,
2080 gboolean get_toplevel)
2082 return GDK_DEVICE_GET_CLASS (device)->window_at_position (device,
2090 gdk_window_quartz_get_events (GdkWindow *window)
2092 if (GDK_WINDOW_DESTROYED (window))
2095 return GDK_WINDOW_OBJECT (window)->event_mask;
2099 gdk_window_quartz_set_events (GdkWindow *window,
2100 GdkEventMask event_mask)
2102 /* The mask is set in the common code. */
2106 gdk_window_set_urgency_hint (GdkWindow *window,
2109 if (GDK_WINDOW_DESTROYED (window) ||
2110 !WINDOW_IS_TOPLEVEL (window))
2113 /* FIXME: Implement */
2117 gdk_window_set_geometry_hints (GdkWindow *window,
2118 const GdkGeometry *geometry,
2119 GdkWindowHints geom_mask)
2121 GdkWindowImplQuartz *impl;
2123 g_return_if_fail (geometry != NULL);
2125 if (GDK_WINDOW_DESTROYED (window) ||
2126 !WINDOW_IS_TOPLEVEL (window))
2129 impl = GDK_WINDOW_IMPL_QUARTZ (((GdkWindowObject *) window)->impl);
2130 if (!impl->toplevel)
2133 if (geom_mask & GDK_HINT_POS)
2135 /* FIXME: Implement */
2138 if (geom_mask & GDK_HINT_USER_POS)
2140 /* FIXME: Implement */
2143 if (geom_mask & GDK_HINT_USER_SIZE)
2145 /* FIXME: Implement */
2148 if (geom_mask & GDK_HINT_MIN_SIZE)
2152 size.width = geometry->min_width;
2153 size.height = geometry->min_height;
2155 [impl->toplevel setContentMinSize:size];
2158 if (geom_mask & GDK_HINT_MAX_SIZE)
2162 size.width = geometry->max_width;
2163 size.height = geometry->max_height;
2165 [impl->toplevel setContentMaxSize:size];
2168 if (geom_mask & GDK_HINT_BASE_SIZE)
2170 /* FIXME: Implement */
2173 if (geom_mask & GDK_HINT_RESIZE_INC)
2177 size.width = geometry->width_inc;
2178 size.height = geometry->height_inc;
2180 [impl->toplevel setContentResizeIncrements:size];
2183 if (geom_mask & GDK_HINT_ASPECT)
2185 /* FIXME: Implement */
2188 if (geom_mask & GDK_HINT_WIN_GRAVITY)
2190 /* FIXME: Implement */
2195 gdk_window_set_title (GdkWindow *window,
2198 GdkWindowImplQuartz *impl;
2200 g_return_if_fail (title != NULL);
2202 if (GDK_WINDOW_DESTROYED (window) ||
2203 !WINDOW_IS_TOPLEVEL (window))
2206 impl = GDK_WINDOW_IMPL_QUARTZ (((GdkWindowObject *)window)->impl);
2210 GDK_QUARTZ_ALLOC_POOL;
2211 [impl->toplevel setTitle:[NSString stringWithUTF8String:title]];
2212 GDK_QUARTZ_RELEASE_POOL;
2217 gdk_window_set_role (GdkWindow *window,
2220 if (GDK_WINDOW_DESTROYED (window) ||
2221 WINDOW_IS_TOPLEVEL (window))
2224 /* FIXME: Implement */
2228 gdk_window_set_transient_for (GdkWindow *window,
2231 GdkWindowImplQuartz *window_impl;
2232 GdkWindowImplQuartz *parent_impl;
2234 if (GDK_WINDOW_DESTROYED (window) || GDK_WINDOW_DESTROYED (parent) ||
2235 !WINDOW_IS_TOPLEVEL (window))
2238 window_impl = GDK_WINDOW_IMPL_QUARTZ (GDK_WINDOW_OBJECT (window)->impl);
2239 if (!window_impl->toplevel)
2242 GDK_QUARTZ_ALLOC_POOL;
2244 if (window_impl->transient_for)
2246 _gdk_quartz_window_detach_from_parent (window);
2248 g_object_unref (window_impl->transient_for);
2249 window_impl->transient_for = NULL;
2252 parent_impl = GDK_WINDOW_IMPL_QUARTZ (GDK_WINDOW_OBJECT (parent)->impl);
2253 if (parent_impl->toplevel)
2255 /* We save the parent because it needs to be unset/reset when
2256 * hiding and showing the window.
2259 /* We don't set transients for tooltips, they are already
2260 * handled by the window level being the top one. If we do, then
2261 * the parent window will be brought to the top just because the
2262 * tooltip is, which is not what we want.
2264 if (gdk_window_get_type_hint (window) != GDK_WINDOW_TYPE_HINT_TOOLTIP)
2266 window_impl->transient_for = g_object_ref (parent);
2268 /* We only add the window if it is shown, otherwise it will
2269 * be shown unconditionally here. If it is not shown, the
2270 * window will be added in show() instead.
2272 if (!(GDK_WINDOW_OBJECT (window)->state & GDK_WINDOW_STATE_WITHDRAWN))
2273 _gdk_quartz_window_attach_to_parent (window);
2277 GDK_QUARTZ_RELEASE_POOL;
2281 gdk_window_quartz_shape_combine_region (GdkWindow *window,
2282 const GdkRegion *shape,
2286 /* FIXME: Implement */
2290 gdk_window_quartz_input_shape_combine_region (GdkWindow *window,
2291 const GdkRegion *shape_region,
2295 /* FIXME: Implement */
2299 gdk_window_set_override_redirect (GdkWindow *window,
2300 gboolean override_redirect)
2302 /* FIXME: Implement */
2306 gdk_window_set_accept_focus (GdkWindow *window,
2307 gboolean accept_focus)
2309 GdkWindowObject *private;
2311 private = (GdkWindowObject *)window;
2313 private->accept_focus = accept_focus != FALSE;
2317 gdk_window_quartz_set_static_gravities (GdkWindow *window,
2318 gboolean use_static)
2320 if (GDK_WINDOW_DESTROYED (window) ||
2321 !WINDOW_IS_TOPLEVEL (window))
2324 /* FIXME: Implement */
2329 gdk_window_set_focus_on_map (GdkWindow *window,
2330 gboolean focus_on_map)
2332 GdkWindowObject *private;
2334 private = (GdkWindowObject *)window;
2336 private->focus_on_map = focus_on_map != FALSE;
2340 gdk_window_set_icon (GdkWindow *window,
2341 GdkWindow *icon_window,
2345 /* FIXME: Implement */
2349 gdk_window_set_icon_name (GdkWindow *window,
2352 /* FIXME: Implement */
2356 gdk_window_focus (GdkWindow *window,
2359 GdkWindowObject *private;
2360 GdkWindowImplQuartz *impl;
2362 private = (GdkWindowObject*) window;
2363 impl = GDK_WINDOW_IMPL_QUARTZ (private->impl);
2365 if (GDK_WINDOW_DESTROYED (window) ||
2366 !WINDOW_IS_TOPLEVEL (window))
2369 if (private->accept_focus && private->window_type != GDK_WINDOW_TEMP)
2371 GDK_QUARTZ_ALLOC_POOL;
2372 [impl->toplevel makeKeyAndOrderFront:impl->toplevel];
2373 clear_toplevel_order ();
2374 GDK_QUARTZ_RELEASE_POOL;
2379 gint window_type_hint_to_level (GdkWindowTypeHint hint)
2383 case GDK_WINDOW_TYPE_HINT_DOCK:
2384 case GDK_WINDOW_TYPE_HINT_UTILITY:
2385 return NSFloatingWindowLevel;
2387 case GDK_WINDOW_TYPE_HINT_MENU: /* Torn-off menu */
2388 case GDK_WINDOW_TYPE_HINT_DROPDOWN_MENU: /* Menu from menubar */
2389 return NSTornOffMenuWindowLevel;
2391 case GDK_WINDOW_TYPE_HINT_NOTIFICATION:
2392 case GDK_WINDOW_TYPE_HINT_TOOLTIP:
2393 return NSStatusWindowLevel;
2395 case GDK_WINDOW_TYPE_HINT_SPLASHSCREEN:
2396 case GDK_WINDOW_TYPE_HINT_POPUP_MENU:
2397 case GDK_WINDOW_TYPE_HINT_COMBO:
2398 case GDK_WINDOW_TYPE_HINT_DND:
2399 return NSPopUpMenuWindowLevel;
2401 case GDK_WINDOW_TYPE_HINT_NORMAL: /* Normal toplevel window */
2402 case GDK_WINDOW_TYPE_HINT_DIALOG: /* Dialog window */
2403 case GDK_WINDOW_TYPE_HINT_TOOLBAR: /* Window used to implement toolbars */
2404 case GDK_WINDOW_TYPE_HINT_DESKTOP: /* N/A */
2411 return NSNormalWindowLevel;
2415 window_type_hint_to_shadow (GdkWindowTypeHint hint)
2419 case GDK_WINDOW_TYPE_HINT_NORMAL: /* Normal toplevel window */
2420 case GDK_WINDOW_TYPE_HINT_DIALOG: /* Dialog window */
2421 case GDK_WINDOW_TYPE_HINT_DOCK:
2422 case GDK_WINDOW_TYPE_HINT_UTILITY:
2423 case GDK_WINDOW_TYPE_HINT_MENU: /* Torn-off menu */
2424 case GDK_WINDOW_TYPE_HINT_DROPDOWN_MENU: /* Menu from menubar */
2425 case GDK_WINDOW_TYPE_HINT_SPLASHSCREEN:
2426 case GDK_WINDOW_TYPE_HINT_POPUP_MENU:
2427 case GDK_WINDOW_TYPE_HINT_COMBO:
2428 case GDK_WINDOW_TYPE_HINT_NOTIFICATION:
2429 case GDK_WINDOW_TYPE_HINT_TOOLTIP:
2432 case GDK_WINDOW_TYPE_HINT_TOOLBAR: /* Window used to implement toolbars */
2433 case GDK_WINDOW_TYPE_HINT_DESKTOP: /* N/A */
2434 case GDK_WINDOW_TYPE_HINT_DND:
2446 gdk_window_set_type_hint (GdkWindow *window,
2447 GdkWindowTypeHint hint)
2449 GdkWindowImplQuartz *impl;
2451 if (GDK_WINDOW_DESTROYED (window) ||
2452 !WINDOW_IS_TOPLEVEL (window))
2455 impl = GDK_WINDOW_IMPL_QUARTZ (((GdkWindowObject *) window)->impl);
2457 impl->type_hint = hint;
2459 /* Match the documentation, only do something if we're not mapped yet. */
2460 if (GDK_WINDOW_IS_MAPPED (window))
2463 [impl->toplevel setHasShadow: window_type_hint_to_shadow (hint)];
2464 [impl->toplevel setLevel: window_type_hint_to_level (hint)];
2468 gdk_window_get_type_hint (GdkWindow *window)
2470 if (GDK_WINDOW_DESTROYED (window) ||
2471 !WINDOW_IS_TOPLEVEL (window))
2472 return GDK_WINDOW_TYPE_HINT_NORMAL;
2474 return GDK_WINDOW_IMPL_QUARTZ (((GdkWindowObject *) window)->impl)->type_hint;
2478 gdk_window_set_modal_hint (GdkWindow *window,
2481 if (GDK_WINDOW_DESTROYED (window) ||
2482 !WINDOW_IS_TOPLEVEL (window))
2485 /* FIXME: Implement */
2489 gdk_window_set_skip_taskbar_hint (GdkWindow *window,
2490 gboolean skips_taskbar)
2492 if (GDK_WINDOW_DESTROYED (window) ||
2493 !WINDOW_IS_TOPLEVEL (window))
2496 /* FIXME: Implement */
2500 gdk_window_set_skip_pager_hint (GdkWindow *window,
2501 gboolean skips_pager)
2503 if (GDK_WINDOW_DESTROYED (window) ||
2504 !WINDOW_IS_TOPLEVEL (window))
2507 /* FIXME: Implement */
2511 gdk_window_begin_resize_drag (GdkWindow *window,
2518 GdkWindowObject *private;
2519 GdkWindowImplQuartz *impl;
2521 g_return_if_fail (GDK_IS_WINDOW (window));
2523 if (edge != GDK_WINDOW_EDGE_SOUTH_EAST)
2525 g_warning ("Resizing is only implemented for GDK_WINDOW_EDGE_SOUTH_EAST on Mac OS");
2529 if (GDK_WINDOW_DESTROYED (window))
2532 private = GDK_WINDOW_OBJECT (window);
2533 impl = GDK_WINDOW_IMPL_QUARTZ (private->impl);
2535 if (!impl->toplevel)
2537 g_warning ("Can't call gdk_window_begin_resize_drag on non-toplevel window");
2541 [(GdkQuartzWindow *)impl->toplevel beginManualResize];
2545 gdk_window_begin_move_drag (GdkWindow *window,
2551 GdkWindowObject *private;
2552 GdkWindowImplQuartz *impl;
2554 if (GDK_WINDOW_DESTROYED (window) ||
2555 !WINDOW_IS_TOPLEVEL (window))
2558 private = GDK_WINDOW_OBJECT (window);
2559 impl = GDK_WINDOW_IMPL_QUARTZ (private->impl);
2561 if (!impl->toplevel)
2563 g_warning ("Can't call gdk_window_begin_move_drag on non-toplevel window");
2567 [(GdkQuartzWindow *)impl->toplevel beginManualMove];
2571 gdk_window_set_icon_list (GdkWindow *window,
2574 /* FIXME: Implement */
2578 gdk_window_get_frame_extents (GdkWindow *window,
2581 GdkWindowObject *private;
2582 GdkWindow *toplevel;
2583 GdkWindowImplQuartz *impl;
2586 g_return_if_fail (rect != NULL);
2588 private = GDK_WINDOW_OBJECT (window);
2595 toplevel = gdk_window_get_toplevel (window);
2596 impl = GDK_WINDOW_IMPL_QUARTZ (GDK_WINDOW_OBJECT (toplevel)->impl);
2598 ns_rect = [impl->toplevel frame];
2600 _gdk_quartz_window_xy_to_gdk_xy (ns_rect.origin.x,
2601 ns_rect.origin.y + ns_rect.size.height,
2602 &rect->x, &rect->y);
2604 rect->width = ns_rect.size.width;
2605 rect->height = ns_rect.size.height;
2609 gdk_window_set_decorations (GdkWindow *window,
2610 GdkWMDecoration decorations)
2612 GdkWindowImplQuartz *impl;
2613 NSUInteger old_mask, new_mask;
2616 if (GDK_WINDOW_DESTROYED (window) ||
2617 !WINDOW_IS_TOPLEVEL (window))
2620 impl = GDK_WINDOW_IMPL_QUARTZ (GDK_WINDOW_OBJECT (window)->impl);
2622 if (decorations == 0 || GDK_WINDOW_TYPE (window) == GDK_WINDOW_TEMP ||
2623 impl->type_hint == GDK_WINDOW_TYPE_HINT_SPLASHSCREEN )
2625 new_mask = NSBorderlessWindowMask;
2629 /* FIXME: Honor other GDK_DECOR_* flags. */
2630 new_mask = (NSTitledWindowMask | NSClosableWindowMask |
2631 NSMiniaturizableWindowMask | NSResizableWindowMask);
2634 GDK_QUARTZ_ALLOC_POOL;
2636 old_mask = [impl->toplevel styleMask];
2638 /* Note, there doesn't seem to be a way to change this without
2639 * recreating the toplevel. There might be bad side-effects of doing
2640 * that, but it seems alright.
2642 if (old_mask != new_mask)
2646 old_view = [impl->toplevel contentView];
2648 rect = [impl->toplevel frame];
2650 /* Properly update the size of the window when the titlebar is
2653 if (old_mask == NSBorderlessWindowMask &&
2654 new_mask != NSBorderlessWindowMask)
2656 rect = [NSWindow frameRectForContentRect:rect styleMask:new_mask];
2659 else if (old_mask != NSBorderlessWindowMask &&
2660 new_mask == NSBorderlessWindowMask)
2662 rect = [NSWindow contentRectForFrameRect:rect styleMask:old_mask];
2665 impl->toplevel = [impl->toplevel initWithContentRect:rect
2667 backing:NSBackingStoreBuffered
2670 [impl->toplevel setHasShadow: window_type_hint_to_shadow (impl->type_hint)];
2671 [impl->toplevel setLevel: window_type_hint_to_level (impl->type_hint)];
2673 [impl->toplevel setContentView:old_view];
2674 [impl->toplevel setFrame:rect display:YES];
2676 /* Invalidate the window shadow for non-opaque views that have shadow
2677 * enabled, to get the shadow shape updated.
2679 if (![old_view isOpaque] && [impl->toplevel hasShadow])
2680 [(GdkQuartzView*)old_view setNeedsInvalidateShadow:YES];
2683 GDK_QUARTZ_RELEASE_POOL;
2687 gdk_window_get_decorations (GdkWindow *window,
2688 GdkWMDecoration *decorations)
2690 GdkWindowImplQuartz *impl;
2692 if (GDK_WINDOW_DESTROYED (window) ||
2693 !WINDOW_IS_TOPLEVEL (window))
2696 impl = GDK_WINDOW_IMPL_QUARTZ (GDK_WINDOW_OBJECT (window)->impl);
2700 /* Borderless is 0, so we can't check it as a bit being set. */
2701 if ([impl->toplevel styleMask] == NSBorderlessWindowMask)
2707 /* FIXME: Honor the other GDK_DECOR_* flags. */
2708 *decorations = GDK_DECOR_ALL;
2716 gdk_window_set_functions (GdkWindow *window,
2717 GdkWMFunction functions)
2719 g_return_if_fail (GDK_IS_WINDOW (window));
2721 /* FIXME: Implement */
2725 _gdk_windowing_window_queue_antiexpose (GdkWindow *window,
2732 gdk_window_stick (GdkWindow *window)
2734 if (GDK_WINDOW_DESTROYED (window) ||
2735 !WINDOW_IS_TOPLEVEL (window))
2740 gdk_window_unstick (GdkWindow *window)
2742 if (GDK_WINDOW_DESTROYED (window) ||
2743 !WINDOW_IS_TOPLEVEL (window))
2748 gdk_window_maximize (GdkWindow *window)
2750 GdkWindowImplQuartz *impl;
2752 if (GDK_WINDOW_DESTROYED (window) ||
2753 !WINDOW_IS_TOPLEVEL (window))
2756 impl = GDK_WINDOW_IMPL_QUARTZ (GDK_WINDOW_OBJECT (window)->impl);
2758 if (GDK_WINDOW_IS_MAPPED (window))
2760 GDK_QUARTZ_ALLOC_POOL;
2762 if (impl->toplevel && ![impl->toplevel isZoomed])
2763 [impl->toplevel zoom:nil];
2765 GDK_QUARTZ_RELEASE_POOL;
2769 gdk_synthesize_window_state (window,
2771 GDK_WINDOW_STATE_MAXIMIZED);
2776 gdk_window_unmaximize (GdkWindow *window)
2778 GdkWindowImplQuartz *impl;
2780 if (GDK_WINDOW_DESTROYED (window) ||
2781 !WINDOW_IS_TOPLEVEL (window))
2784 impl = GDK_WINDOW_IMPL_QUARTZ (GDK_WINDOW_OBJECT (window)->impl);
2786 if (GDK_WINDOW_IS_MAPPED (window))
2788 GDK_QUARTZ_ALLOC_POOL;
2790 if (impl->toplevel && [impl->toplevel isZoomed])
2791 [impl->toplevel zoom:nil];
2793 GDK_QUARTZ_RELEASE_POOL;
2797 gdk_synthesize_window_state (window,
2798 GDK_WINDOW_STATE_MAXIMIZED,
2804 gdk_window_iconify (GdkWindow *window)
2806 GdkWindowImplQuartz *impl;
2808 if (GDK_WINDOW_DESTROYED (window) ||
2809 !WINDOW_IS_TOPLEVEL (window))
2812 impl = GDK_WINDOW_IMPL_QUARTZ (GDK_WINDOW_OBJECT (window)->impl);
2814 if (GDK_WINDOW_IS_MAPPED (window))
2816 GDK_QUARTZ_ALLOC_POOL;
2819 [impl->toplevel miniaturize:nil];
2821 GDK_QUARTZ_RELEASE_POOL;
2825 gdk_synthesize_window_state (window,
2827 GDK_WINDOW_STATE_ICONIFIED);
2832 gdk_window_deiconify (GdkWindow *window)
2834 GdkWindowImplQuartz *impl;
2836 if (GDK_WINDOW_DESTROYED (window) ||
2837 !WINDOW_IS_TOPLEVEL (window))
2840 impl = GDK_WINDOW_IMPL_QUARTZ (GDK_WINDOW_OBJECT (window)->impl);
2842 if (GDK_WINDOW_IS_MAPPED (window))
2844 GDK_QUARTZ_ALLOC_POOL;
2847 [impl->toplevel deminiaturize:nil];
2849 GDK_QUARTZ_RELEASE_POOL;
2853 gdk_synthesize_window_state (window,
2854 GDK_WINDOW_STATE_ICONIFIED,
2859 static FullscreenSavedGeometry *
2860 get_fullscreen_geometry (GdkWindow *window)
2862 return g_object_get_data (G_OBJECT (window), FULLSCREEN_DATA);
2866 gdk_window_fullscreen (GdkWindow *window)
2868 FullscreenSavedGeometry *geometry;
2869 GdkWindowObject *private = (GdkWindowObject *) window;
2872 if (GDK_WINDOW_DESTROYED (window) ||
2873 !WINDOW_IS_TOPLEVEL (window))
2876 geometry = get_fullscreen_geometry (window);
2879 geometry = g_new (FullscreenSavedGeometry, 1);
2881 geometry->x = private->x;
2882 geometry->y = private->y;
2883 geometry->width = private->width;
2884 geometry->height = private->height;
2886 if (!gdk_window_get_decorations (window, &geometry->decor))
2887 geometry->decor = GDK_DECOR_ALL;
2889 g_object_set_data_full (G_OBJECT (window),
2890 FULLSCREEN_DATA, geometry,
2893 gdk_window_set_decorations (window, 0);
2895 frame = [[NSScreen mainScreen] frame];
2896 move_resize_window_internal (window,
2898 frame.size.width, frame.size.height);
2901 SetSystemUIMode (kUIModeAllHidden, kUIOptionAutoShowMenuBar);
2903 gdk_synthesize_window_state (window, 0, GDK_WINDOW_STATE_FULLSCREEN);
2907 gdk_window_unfullscreen (GdkWindow *window)
2909 FullscreenSavedGeometry *geometry;
2911 if (GDK_WINDOW_DESTROYED (window) ||
2912 !WINDOW_IS_TOPLEVEL (window))
2915 geometry = get_fullscreen_geometry (window);
2918 SetSystemUIMode (kUIModeNormal, 0);
2920 move_resize_window_internal (window,
2926 gdk_window_set_decorations (window, geometry->decor);
2928 g_object_set_data (G_OBJECT (window), FULLSCREEN_DATA, NULL);
2930 gdk_synthesize_window_state (window, GDK_WINDOW_STATE_FULLSCREEN, 0);
2935 gdk_window_set_keep_above (GdkWindow *window, gboolean setting)
2937 GdkWindowObject *private = (GdkWindowObject *) window;
2938 GdkWindowImplQuartz *impl = GDK_WINDOW_IMPL_QUARTZ (private->impl);
2941 g_return_if_fail (GDK_IS_WINDOW (window));
2943 if (GDK_WINDOW_DESTROYED (window) ||
2944 !WINDOW_IS_TOPLEVEL (window))
2947 level = window_type_hint_to_level (gdk_window_get_type_hint (window));
2949 /* Adjust normal window level by one if necessary. */
2950 [impl->toplevel setLevel: level + (setting ? 1 : 0)];
2954 gdk_window_set_keep_below (GdkWindow *window, gboolean setting)
2956 GdkWindowObject *private = (GdkWindowObject *) window;
2957 GdkWindowImplQuartz *impl = GDK_WINDOW_IMPL_QUARTZ (private->impl);
2960 g_return_if_fail (GDK_IS_WINDOW (window));
2962 if (GDK_WINDOW_DESTROYED (window) ||
2963 !WINDOW_IS_TOPLEVEL (window))
2966 level = window_type_hint_to_level (gdk_window_get_type_hint (window));
2968 /* Adjust normal window level by one if necessary. */
2969 [impl->toplevel setLevel: level - (setting ? 1 : 0)];
2973 gdk_window_get_group (GdkWindow *window)
2975 g_return_val_if_fail (GDK_WINDOW_TYPE (window) != GDK_WINDOW_CHILD, NULL);
2977 if (GDK_WINDOW_DESTROYED (window) ||
2978 !WINDOW_IS_TOPLEVEL (window))
2981 /* FIXME: Implement */
2987 gdk_window_set_group (GdkWindow *window,
2990 /* FIXME: Implement */
2994 gdk_window_foreign_new_for_display (GdkDisplay *display,
2995 GdkNativeWindow anid)
2997 /* Foreign windows aren't supported in Mac OS X */
3002 gdk_window_lookup (GdkNativeWindow anid)
3004 /* Foreign windows aren't supported in Mac OS X */
3009 gdk_window_lookup_for_display (GdkDisplay *display, GdkNativeWindow anid)
3011 /* Foreign windows aren't supported in Mac OS X */
3016 gdk_window_enable_synchronized_configure (GdkWindow *window)
3021 gdk_window_configure_finished (GdkWindow *window)
3026 gdk_window_destroy_notify (GdkWindow *window)
3028 check_grab_destroy (window);
3032 _gdk_windowing_window_beep (GdkWindow *window)
3034 g_return_if_fail (GDK_IS_WINDOW (window));
3036 gdk_display_beep (_gdk_display);
3040 gdk_window_set_opacity (GdkWindow *window,
3043 GdkWindowObject *private = (GdkWindowObject *) window;
3044 GdkWindowImplQuartz *impl = GDK_WINDOW_IMPL_QUARTZ (private->impl);
3046 g_return_if_fail (GDK_IS_WINDOW (window));
3047 g_return_if_fail (WINDOW_IS_TOPLEVEL (window));
3049 if (GDK_WINDOW_DESTROYED (window) ||
3050 !WINDOW_IS_TOPLEVEL (window))
3055 else if (opacity > 1)
3058 [impl->toplevel setAlphaValue: opacity];
3062 _gdk_windowing_window_set_composited (GdkWindow *window, gboolean composited)
3067 _gdk_windowing_get_shape_for_mask (GdkBitmap *mask)
3069 /* FIXME: implement */
3074 _gdk_windowing_window_get_shape (GdkWindow *window)
3076 /* FIXME: implement */
3081 _gdk_windowing_window_get_input_shape (GdkWindow *window)
3083 /* FIXME: implement */
3088 gdk_window_impl_iface_init (GdkWindowImplIface *iface)
3090 iface->show = gdk_window_quartz_show;
3091 iface->hide = gdk_window_quartz_hide;
3092 iface->withdraw = gdk_window_quartz_withdraw;
3093 iface->set_events = gdk_window_quartz_set_events;
3094 iface->get_events = gdk_window_quartz_get_events;
3095 iface->raise = gdk_window_quartz_raise;
3096 iface->lower = gdk_window_quartz_lower;
3097 iface->restack_toplevel = gdk_window_quartz_restack_toplevel;
3098 iface->move_resize = gdk_window_quartz_move_resize;
3099 iface->set_background = gdk_window_quartz_set_background;
3100 iface->set_back_pixmap = gdk_window_quartz_set_back_pixmap;
3101 iface->reparent = gdk_window_quartz_reparent;
3102 iface->set_device_cursor = gdk_window_quartz_set_device_cursor;
3103 iface->get_geometry = gdk_window_quartz_get_geometry;
3104 iface->get_root_coords = gdk_window_quartz_get_root_coords;
3105 iface->get_device_state = gdk_window_quartz_get_device_state;
3106 iface->get_deskrelative_origin = gdk_window_quartz_get_deskrelative_origin;
3107 iface->shape_combine_region = gdk_window_quartz_shape_combine_region;
3108 iface->input_shape_combine_region = gdk_window_quartz_input_shape_combine_region;
3109 iface->set_static_gravities = gdk_window_quartz_set_static_gravities;
3110 iface->queue_antiexpose = _gdk_quartz_window_queue_antiexpose;
3111 iface->queue_translation = _gdk_quartz_window_queue_translation;
3112 iface->destroy = _gdk_quartz_window_destroy;