3 * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
4 * Copyright (C) 2005 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.
25 #include "gdkprivate-quartz.h"
27 static gpointer parent_class;
29 static GSList *update_windows = NULL;
30 static guint update_idle = 0;
34 gdk_quartz_window_get_nsview (GdkWindow *window)
36 GdkWindowObject *private = (GdkWindowObject *)window;
38 return ((GdkWindowImplQuartz *)private->impl)->view;
42 gdk_window_impl_quartz_get_size (GdkDrawable *drawable,
46 g_return_if_fail (GDK_IS_WINDOW_IMPL_QUARTZ (drawable));
49 *width = GDK_WINDOW_IMPL_QUARTZ (drawable)->width;
51 *height = GDK_WINDOW_IMPL_QUARTZ (drawable)->height;
55 gdk_window_impl_quartz_get_visible_region (GdkDrawable *drawable)
57 GdkWindowObject *private = GDK_WINDOW_OBJECT (GDK_DRAWABLE_IMPL_QUARTZ (drawable)->wrapper);
59 GdkWindowImplQuartz *impl;
60 GList *windows = NULL, *l;
62 /* FIXME: The clip rectangle should really be cached
63 * and recalculated when the window rectangle changes.
67 windows = g_list_prepend (windows, private);
69 if (private->parent == GDK_WINDOW_OBJECT (_gdk_root))
72 private = private->parent;
75 /* Get rectangle for toplevel window */
76 private = GDK_WINDOW_OBJECT (windows->data);
77 impl = GDK_WINDOW_IMPL_QUARTZ (private->impl);
81 rect.width = impl->width;
82 rect.height = impl->height;
84 /* Skip toplevel window since we have its rect */
85 for (l = windows->next; l; l = l->next)
87 private = GDK_WINDOW_OBJECT (l->data);
88 impl = GDK_WINDOW_IMPL_QUARTZ (private->impl);
89 GdkRectangle tmp_rect;
91 tmp_rect.x = -MIN (0, private->x - rect.x);
92 tmp_rect.y = -MIN (0, private->y - rect.y);
93 tmp_rect.width = MIN (rect.width, impl->width + private->x - rect.x) - MAX (0, private->x - rect.x);
94 tmp_rect.height = MIN (rect.height, impl->height + private->y - rect.y) - MAX (0, private->y - rect.y);
99 g_list_free (windows);
101 return gdk_region_rectangle (&rect);
105 gdk_window_impl_quartz_finalize (GObject *object)
107 GdkWindowImplQuartz *impl = GDK_WINDOW_IMPL_QUARTZ (object);
110 [impl->nscursor release];
112 if (impl->paint_clip_region)
113 gdk_region_destroy (impl->paint_clip_region);
115 G_OBJECT_CLASS (parent_class)->finalize (object);
119 gdk_window_impl_quartz_class_init (GdkWindowImplQuartzClass *klass)
121 GdkDrawableClass *drawable_class = GDK_DRAWABLE_CLASS (klass);
122 GObjectClass *object_class = G_OBJECT_CLASS (klass);
124 parent_class = g_type_class_peek_parent (klass);
126 object_class->finalize = gdk_window_impl_quartz_finalize;
128 drawable_class->get_size = gdk_window_impl_quartz_get_size;
130 /* Visible and clip regions are the same */
131 drawable_class->get_clip_region = gdk_window_impl_quartz_get_visible_region;
132 drawable_class->get_visible_region = gdk_window_impl_quartz_get_visible_region;
136 gdk_window_impl_quartz_init (GdkWindowImplQuartz *impl)
140 impl->type_hint = GDK_WINDOW_TYPE_HINT_NORMAL;
144 gdk_window_impl_quartz_begin_paint_region (GdkPaintable *paintable,
147 GdkWindowImplQuartz *impl = GDK_WINDOW_IMPL_QUARTZ (paintable);
150 GdkPixmap *bg_pixmap;
153 bg_pixmap = GDK_WINDOW_OBJECT (GDK_DRAWABLE_IMPL_QUARTZ (impl)->wrapper)->bg_pixmap;
155 if (impl->begin_paint_count == 0)
156 impl->paint_clip_region = gdk_region_copy (region);
158 gdk_region_union (impl->paint_clip_region, region);
160 impl->begin_paint_count ++;
162 if (bg_pixmap == GDK_NO_BG)
165 gdk_region_get_rectangles (region, &rects, &n_rects);
167 if (bg_pixmap == NULL)
169 CGContextRef context = gdk_quartz_drawable_get_context (GDK_DRAWABLE (impl), FALSE);
172 for (i = 0; i < n_rects; i++)
174 gdk_quartz_set_context_fill_color_from_pixel
175 (context, gdk_drawable_get_colormap (GDK_DRAWABLE_IMPL_QUARTZ (impl)->wrapper),
176 GDK_WINDOW_OBJECT (GDK_DRAWABLE_IMPL_QUARTZ (impl)->wrapper)->bg_color.pixel);
178 CGContextFillRect (context, CGRectMake (rects[i].x, rects[i].y, rects[i].width, rects[i].height));
181 gdk_quartz_drawable_release_context (GDK_DRAWABLE (impl), context);
186 int x_offset, y_offset;
190 x_offset = y_offset = 0;
192 window = GDK_WINDOW (GDK_DRAWABLE_IMPL_QUARTZ (impl));
193 while (window && ((GdkWindowObject *) window)->bg_pixmap == GDK_PARENT_RELATIVE_BG)
195 /* If this window should have the same background as the parent,
196 * fetch the parent. (And if the same goes for the parent, fetch
197 * the grandparent, etc.)
199 x_offset += ((GdkWindowObject *) window)->x;
200 y_offset += ((GdkWindowObject *) window)->y;
201 window = GDK_WINDOW (((GdkWindowObject *) window)->parent);
204 /* Note: There should be a CG API to draw tiled images, we might
205 * want to look into that for this.
207 gc = gdk_gc_new (GDK_DRAWABLE (impl));
209 gdk_drawable_get_size (GDK_DRAWABLE (bg_pixmap), &width, &height);
212 while (x < (rects[0].x + rects[0].width))
214 if (x + width >= rects[0].x)
217 while (y < (rects[0].y + rects[0].height))
219 if (y + height >= rects[0].y)
220 gdk_draw_drawable (GDK_DRAWABLE (impl), gc, bg_pixmap, 0, 0, x, y, width, height);
228 g_object_unref (G_OBJECT (gc));
235 gdk_window_impl_quartz_end_paint (GdkPaintable *paintable)
237 GdkWindowImplQuartz *impl = GDK_WINDOW_IMPL_QUARTZ (paintable);
239 impl->begin_paint_count --;
241 if (impl->begin_paint_count == 0)
243 gdk_region_destroy (impl->paint_clip_region);
244 impl->paint_clip_region = NULL;
249 gdk_window_quartz_process_all_updates (void)
251 GSList *old_update_windows = update_windows;
252 GSList *tmp_list = update_windows;
255 update_windows = NULL;
257 g_slist_foreach (old_update_windows, (GFunc) g_object_ref, NULL);
261 GdkWindowObject *private = tmp_list->data;
262 GdkWindowImplQuartz *impl = (GdkWindowImplQuartz *) private->impl;
266 if (private->update_area)
268 gdk_region_get_rectangles (private->update_area, &rects, &n_rects);
270 gdk_region_destroy (private->update_area);
271 private->update_area = NULL;
273 for (i = 0; i < n_rects; i++)
275 [impl->view setNeedsDisplayInRect:NSMakeRect (rects[i].x, rects[i].y,
276 rects[i].width, rects[i].height)];
279 [impl->view displayIfNeeded];
284 g_object_unref (tmp_list->data);
285 tmp_list = tmp_list->next;
288 g_slist_free (old_update_windows);
292 gdk_window_quartz_update_idle (gpointer data)
294 GDK_THREADS_ENTER ();
295 gdk_window_quartz_process_all_updates ();
296 GDK_THREADS_LEAVE ();
302 gdk_window_impl_quartz_invalidate_maybe_recurse (GdkPaintable *paintable,
304 gboolean (*child_func) (GdkWindow *, gpointer),
307 GdkWindowImplQuartz *window_impl = GDK_WINDOW_IMPL_QUARTZ (paintable);
308 GdkDrawableImplQuartz *drawable_impl = (GdkDrawableImplQuartz *) window_impl;
309 GdkWindow *window = (GdkWindow *) drawable_impl->wrapper;
310 GdkWindowObject *private = (GdkWindowObject *) window;
311 GdkRegion *visible_region;
313 visible_region = gdk_drawable_get_visible_region (window);
314 gdk_region_intersect (visible_region, region);
316 if (private->update_area)
318 gdk_region_union (private->update_area, visible_region);
319 gdk_region_destroy (visible_region);
323 update_windows = g_slist_prepend (update_windows, window);
324 private->update_area = visible_region;
326 if (update_idle == 0)
327 update_idle = g_idle_add_full (GDK_PRIORITY_REDRAW,
328 gdk_window_quartz_update_idle, NULL, NULL);
333 gdk_window_impl_quartz_process_updates (GdkPaintable *paintable,
334 gboolean update_children)
336 GdkWindowImplQuartz *impl = GDK_WINDOW_IMPL_QUARTZ (paintable);
337 GdkDrawableImplQuartz *drawable_impl = (GdkDrawableImplQuartz *) impl;
338 GdkWindowObject *private = (GdkWindowObject *) drawable_impl->wrapper;
340 if (private->update_area)
342 gdk_region_destroy (private->update_area);
343 private->update_area = NULL;
346 [impl->view setNeedsDisplay: YES];
347 update_windows = g_slist_remove (update_windows, private);
351 gdk_window_impl_quartz_paintable_init (GdkPaintableIface *iface)
353 iface->begin_paint_region = gdk_window_impl_quartz_begin_paint_region;
354 iface->end_paint = gdk_window_impl_quartz_end_paint;
356 iface->invalidate_maybe_recurse = gdk_window_impl_quartz_invalidate_maybe_recurse;
357 iface->process_updates = gdk_window_impl_quartz_process_updates;
361 _gdk_window_impl_quartz_get_type (void)
363 static GType object_type = 0;
367 static const GTypeInfo object_info =
369 sizeof (GdkWindowImplQuartzClass),
370 (GBaseInitFunc) NULL,
371 (GBaseFinalizeFunc) NULL,
372 (GClassInitFunc) gdk_window_impl_quartz_class_init,
373 NULL, /* class_finalize */
374 NULL, /* class_data */
375 sizeof (GdkWindowImplQuartz),
377 (GInstanceInitFunc) gdk_window_impl_quartz_init,
380 static const GInterfaceInfo paintable_info =
382 (GInterfaceInitFunc) gdk_window_impl_quartz_paintable_init,
387 object_type = g_type_register_static (GDK_TYPE_DRAWABLE_IMPL_QUARTZ,
388 "GdkWindowImplQuartz",
390 g_type_add_interface_static (object_type,
399 _gdk_window_impl_get_type (void)
401 return _gdk_window_impl_quartz_get_type ();
405 get_default_title (void)
409 title = g_get_application_name ();
411 title = g_get_prgname ();
417 _gdk_quartz_get_inverted_screen_y (gint y)
419 NSRect rect = [[NSScreen mainScreen] frame];
421 return rect.size.height - y;
425 find_child_window_by_point_helper (GdkWindow *window,
435 for (l = GDK_WINDOW_OBJECT (window)->children; l; l = l->next)
437 GdkWindowObject *private = GDK_WINDOW_OBJECT (l->data);
438 GdkWindowImplQuartz *impl = GDK_WINDOW_IMPL_QUARTZ (private->impl);
441 if (!GDK_WINDOW_IS_MAPPED (private))
444 temp_x = x_offset + private->x;
445 temp_y = y_offset + private->y;
447 /* FIXME: Are there off by one errors here? */
448 if (x >= temp_x && y >= temp_y &&
449 x < temp_x + impl->width && y < temp_y + impl->height)
451 *x_ret = x - x_offset - private->x;
452 *y_ret = y - y_offset - private->y;
454 /* Look for child windows */
455 return find_child_window_by_point_helper (GDK_WINDOW (l->data),
465 /* Given a toplevel window and coordinates, returns the window
466 * in which the point is. Note that x and y should be non-flipped
467 * (and relative the toplevel), while the returned positions are
471 _gdk_quartz_find_child_window_by_point (GdkWindow *toplevel,
477 GdkWindowObject *private = (GdkWindowObject *)toplevel;
478 GdkWindowImplQuartz *impl = GDK_WINDOW_IMPL_QUARTZ (private->impl);
480 /* If the point is in the title bar, ignore it */
481 if (y > impl->height)
484 /* First flip the y coordinate */
485 y = impl->height - y;
487 return find_child_window_by_point_helper (toplevel, x, y, 0, 0, x_ret, y_ret);
491 gdk_window_new (GdkWindow *parent,
492 GdkWindowAttr *attributes,
493 gint attributes_mask)
496 GdkWindowObject *private;
497 GdkWindowImplQuartz *impl;
498 GdkDrawableImplQuartz *draw_impl;
501 if (parent && GDK_WINDOW_DESTROYED (parent))
504 GDK_QUARTZ_ALLOC_POOL;
509 window = g_object_new (GDK_TYPE_WINDOW, NULL);
510 private = (GdkWindowObject *)window;
511 impl = GDK_WINDOW_IMPL_QUARTZ (private->impl);
512 draw_impl = GDK_DRAWABLE_IMPL_QUARTZ (private->impl);
513 draw_impl->wrapper = GDK_DRAWABLE (window);
515 private->parent = (GdkWindowObject *)parent;
517 if (attributes_mask & GDK_WA_X)
518 private->x = attributes->x;
522 if (attributes_mask & GDK_WA_Y)
523 private->y = attributes->y;
524 else if (attributes_mask & GDK_WA_X)
529 private->event_mask = attributes->event_mask;
531 impl->width = attributes->width > 1 ? attributes->width : 1;
532 impl->height = attributes->height > 1 ? attributes->height : 1;
534 if (attributes_mask & GDK_WA_VISUAL)
535 visual = attributes->visual;
537 visual = gdk_screen_get_system_visual (_gdk_screen);
539 if (attributes->wclass == GDK_INPUT_ONLY)
541 /* Backwards compatiblity - we've always ignored
542 * attributes->window_type for input-only windows
545 if (parent == _gdk_root)
546 private->window_type = GDK_WINDOW_TEMP;
548 private->window_type = GDK_WINDOW_CHILD;
551 private->window_type = attributes->window_type;
554 switch (private->window_type)
556 case GDK_WINDOW_TOPLEVEL:
557 case GDK_WINDOW_DIALOG:
558 case GDK_WINDOW_TEMP:
559 if (GDK_WINDOW_TYPE (parent) != GDK_WINDOW_ROOT)
561 g_warning (G_STRLOC "Toplevel windows must be created as children of\n"
562 "of a window of type GDK_WINDOW_ROOT or GDK_WINDOW_FOREIGN");
564 case GDK_WINDOW_CHILD:
567 g_warning (G_STRLOC "cannot make windows of type %d", private->window_type);
568 GDK_QUARTZ_RELEASE_POOL;
572 if (attributes->wclass == GDK_INPUT_OUTPUT)
574 private->input_only = FALSE;
575 private->depth = visual->depth;
577 if (attributes_mask & GDK_WA_COLORMAP)
579 draw_impl->colormap = attributes->colormap;
580 g_object_ref (attributes->colormap);
584 if (visual == gdk_screen_get_system_visual (_gdk_screen))
586 draw_impl->colormap = gdk_screen_get_system_colormap (_gdk_screen);
587 g_object_ref (draw_impl->colormap);
589 else if (visual == gdk_screen_get_rgba_visual (_gdk_screen))
591 draw_impl->colormap = gdk_screen_get_rgba_colormap (_gdk_screen);
592 g_object_ref (draw_impl->colormap);
596 draw_impl->colormap = gdk_colormap_new (visual, FALSE);
600 private->bg_color.pixel = 0;
601 private->bg_color.red = private->bg_color.green = private->bg_color.blue = 0;
606 private->input_only = TRUE;
607 draw_impl->colormap = gdk_screen_get_system_colormap (_gdk_screen);
608 g_object_ref (draw_impl->colormap);
612 private->parent->children = g_list_prepend (private->parent->children, window);
614 gdk_window_set_cursor (window, ((attributes_mask & GDK_WA_CURSOR) ?
615 (attributes->cursor) :
618 switch (attributes->window_type)
620 case GDK_WINDOW_TOPLEVEL:
621 case GDK_WINDOW_DIALOG:
622 case GDK_WINDOW_TEMP:
624 NSRect content_rect = NSMakeRect (private->x,
625 _gdk_quartz_get_inverted_screen_y (private->y) - impl->height,
626 impl->width, impl->height);
630 switch (attributes->window_type) {
631 case GDK_WINDOW_TEMP:
632 style_mask = NSBorderlessWindowMask;
635 style_mask = (NSTitledWindowMask |
636 NSClosableWindowMask |
637 NSMiniaturizableWindowMask |
638 NSResizableWindowMask);
641 impl->toplevel = [[GdkQuartzWindow alloc] initWithContentRect:content_rect
643 backing:NSBackingStoreBuffered
646 if (attributes_mask & GDK_WA_TITLE)
647 title = attributes->title;
649 title = get_default_title ();
651 gdk_window_set_title (window, title);
653 if (draw_impl->colormap == gdk_screen_get_rgba_colormap (_gdk_screen))
655 [impl->toplevel setOpaque:NO];
656 [impl->toplevel setBackgroundColor:[NSColor clearColor]];
659 impl->view = [[GdkQuartzView alloc] initWithFrame:content_rect];
660 [impl->view setGdkWindow:window];
661 [impl->toplevel setContentView:impl->view];
663 /* Add a tracking rect */
664 impl->tracking_rect = [impl->view addTrackingRect:NSMakeRect(0, 0, impl->width, impl->height)
670 case GDK_WINDOW_CHILD:
672 GdkWindowImplQuartz *parent_impl = GDK_WINDOW_IMPL_QUARTZ (GDK_WINDOW_OBJECT (parent)->impl);
674 if (attributes->wclass == GDK_INPUT_OUTPUT)
676 NSRect frame_rect = NSMakeRect (private->x, private->y, impl->width, impl->height);
678 impl->view = [[GdkQuartzView alloc] initWithFrame:frame_rect];
680 [impl->view setGdkWindow:window];
682 /* GdkWindows should be hidden by default */
683 [impl->view setHidden:YES];
684 [parent_impl->view addSubview:impl->view];
689 g_assert_not_reached ();
692 GDK_QUARTZ_RELEASE_POOL;
698 _gdk_windowing_window_init (void)
700 GdkWindowObject *private;
702 g_assert (_gdk_root == NULL);
704 _gdk_root = g_object_new (GDK_TYPE_WINDOW, NULL);
706 private = (GdkWindowObject *)_gdk_root;
708 private->state = 0; /* We don't want GDK_WINDOW_STATE_WITHDRAWN here */
709 private->window_type = GDK_WINDOW_ROOT;
714 _gdk_windowing_window_destroy (GdkWindow *window,
716 gboolean foreign_destroy)
718 update_windows = g_slist_remove (update_windows, window);
720 if (!recursing && !foreign_destroy)
722 GdkWindowImplQuartz *impl = GDK_WINDOW_IMPL_QUARTZ (GDK_WINDOW_OBJECT (window)->impl);
724 if (window == _gdk_quartz_get_mouse_window ())
726 _gdk_quartz_update_mouse_window (_gdk_root);
730 [impl->toplevel close];
732 [impl->view release];
737 _gdk_windowing_window_destroy_foreign (GdkWindow *window)
739 /* Foreign windows aren't supported in OSX. */
743 all_parents_shown (GdkWindowObject *private)
745 while (GDK_WINDOW_IS_MAPPED (private))
748 private = (GdkWindowObject *)private->parent;
757 show_window_internal (GdkWindow *window,
760 GdkWindowObject *private;
761 GdkWindowImplQuartz *impl;
763 if (GDK_WINDOW_DESTROYED (window))
766 GDK_QUARTZ_ALLOC_POOL;
768 private = (GdkWindowObject *)window;
769 impl = GDK_WINDOW_IMPL_QUARTZ (private->impl);
773 [impl->toplevel orderFront:nil];
774 [impl->view setNeedsDisplay:YES];
778 [impl->view setHidden:NO];
779 [impl->view setNeedsDisplay:YES];
782 if (all_parents_shown (private->parent))
783 _gdk_quartz_send_map_events (window);
785 gdk_synthesize_window_state (window, GDK_WINDOW_STATE_WITHDRAWN, 0);
787 if (private->state & GDK_WINDOW_STATE_MAXIMIZED)
788 gdk_window_maximize (window);
790 if (private->state & GDK_WINDOW_STATE_ICONIFIED)
791 gdk_window_iconify (window);
793 GDK_QUARTZ_RELEASE_POOL;
797 gdk_window_show_unraised (GdkWindow *window)
799 g_return_if_fail (GDK_IS_WINDOW (window));
801 show_window_internal (window, FALSE);
805 gdk_window_show (GdkWindow *window)
807 g_return_if_fail (GDK_IS_WINDOW (window));
809 show_window_internal (window, TRUE);
813 gdk_window_hide (GdkWindow *window)
815 GdkWindowObject *private = (GdkWindowObject *)window;
816 GdkWindowImplQuartz *impl;
818 g_return_if_fail (GDK_IS_WINDOW (window));
820 if (GDK_WINDOW_DESTROYED (window))
823 if (GDK_WINDOW_IS_MAPPED (window))
824 gdk_synthesize_window_state (window,
826 GDK_WINDOW_STATE_WITHDRAWN);
828 _gdk_window_clear_update_area (window);
830 impl = GDK_WINDOW_IMPL_QUARTZ (private->impl);
834 [impl->toplevel orderOut:nil];
838 [impl->view setHidden:YES];
841 if (window == _gdk_quartz_pointer_grab_window)
842 gdk_pointer_ungrab (0);
844 if (window == _gdk_quartz_keyboard_grab_window)
845 gdk_keyboard_ungrab (0);
849 gdk_window_withdraw (GdkWindow *window)
851 gdk_window_hide (window);
855 move_resize_window_internal (GdkWindow *window,
861 GdkWindowObject *private = (GdkWindowObject *)window;
862 GdkWindowImplQuartz *impl;
864 if (GDK_WINDOW_DESTROYED (window))
867 impl = GDK_WINDOW_IMPL_QUARTZ (private->impl);
879 impl->height = height;
881 GDK_QUARTZ_ALLOC_POOL;
885 NSRect content_rect = NSMakeRect (private->x,
886 _gdk_quartz_get_inverted_screen_y (private->y) ,
887 impl->width, impl->height);
888 NSRect frame_rect = [impl->toplevel frameRectForContentRect:content_rect];
890 frame_rect.origin.y -= frame_rect.size.height;
892 [impl->toplevel setFrame:frame_rect display:YES];
896 if (!private->input_only)
898 [impl->view setFrame:NSMakeRect (private->x, private->y,
899 impl->width, impl->height)];
901 /* FIXME: Maybe we should use setNeedsDisplayInRect instead */
902 [impl->view setNeedsDisplay:YES];
906 GDK_QUARTZ_RELEASE_POOL;
910 gdk_window_move (GdkWindow *window,
914 g_return_if_fail (GDK_IS_WINDOW (window));
916 move_resize_window_internal (window, x, y, -1, -1);
920 gdk_window_resize (GdkWindow *window,
924 g_return_if_fail (GDK_IS_WINDOW (window));
931 move_resize_window_internal (window, -1, -1, width, height);
935 gdk_window_move_resize (GdkWindow *window,
946 move_resize_window_internal (window, x, y, width, height);
950 gdk_window_reparent (GdkWindow *window,
951 GdkWindow *new_parent,
955 g_warning ("gdk_window_reparent: %p %p (%d, %d)",
956 window, new_parent, x, y);
958 /* FIXME: Implement */
962 _gdk_windowing_window_clear_area (GdkWindow *window,
968 /* FIXME: Implement */
972 _gdk_windowing_window_clear_area_e (GdkWindow *window,
978 /* FIXME: Implement */
982 gdk_window_raise (GdkWindow *window)
984 g_return_if_fail (GDK_IS_WINDOW (window));
986 /* FIXME: Implement */
990 gdk_window_lower (GdkWindow *window)
992 g_return_if_fail (GDK_IS_WINDOW (window));
994 /* FIXME: Implement */
998 gdk_window_set_background (GdkWindow *window,
999 const GdkColor *color)
1001 GdkWindowObject *private = (GdkWindowObject *)window;
1002 GdkWindowImplQuartz *impl;
1004 g_return_if_fail (GDK_IS_WINDOW (window));
1006 if (GDK_WINDOW_DESTROYED (window))
1009 impl = GDK_WINDOW_IMPL_QUARTZ (private->impl);
1011 private->bg_color = *color;
1013 if (private->bg_pixmap &&
1014 private->bg_pixmap != GDK_PARENT_RELATIVE_BG &&
1015 private->bg_pixmap != GDK_NO_BG)
1016 g_object_unref (private->bg_pixmap);
1018 private->bg_pixmap = NULL;
1022 gdk_window_set_back_pixmap (GdkWindow *window,
1024 gboolean parent_relative)
1026 GdkWindowObject *private = (GdkWindowObject *)window;
1028 g_return_if_fail (GDK_IS_WINDOW (window));
1029 g_return_if_fail (pixmap == NULL || !parent_relative);
1030 g_return_if_fail (pixmap == NULL || gdk_drawable_get_depth (window) == gdk_drawable_get_depth (pixmap));
1032 if (GDK_WINDOW_DESTROYED (window))
1035 if (private->bg_pixmap &&
1036 private->bg_pixmap != GDK_PARENT_RELATIVE_BG &&
1037 private->bg_pixmap != GDK_NO_BG)
1038 g_object_unref (private->bg_pixmap);
1040 if (parent_relative)
1042 private->bg_pixmap = GDK_PARENT_RELATIVE_BG;
1043 GDK_NOTE (MISC, g_print (G_STRLOC ": setting background pixmap to parent_relative\n"));
1049 g_object_ref (pixmap);
1050 private->bg_pixmap = pixmap;
1054 private->bg_pixmap = GDK_NO_BG;
1060 gdk_window_set_cursor (GdkWindow *window,
1063 GdkWindowImplQuartz *impl;
1064 GdkCursorPrivate *cursor_private;
1067 g_return_if_fail (GDK_IS_WINDOW (window));
1069 impl = GDK_WINDOW_IMPL_QUARTZ (GDK_WINDOW_OBJECT (window)->impl);
1070 cursor_private = (GdkCursorPrivate *)cursor;
1072 if (GDK_WINDOW_DESTROYED (window))
1078 nscursor = [cursor_private->nscursor retain];
1081 [impl->nscursor release];
1083 impl->nscursor = nscursor;
1085 _gdk_quartz_update_cursor (_gdk_quartz_get_mouse_window ());
1089 gdk_window_get_geometry (GdkWindow *window,
1096 g_return_if_fail (GDK_IS_WINDOW (window));
1098 /* FIXME: Implement */
1102 gdk_window_get_origin (GdkWindow *window,
1106 GdkWindowObject *private;
1107 int tmp_x = 0, tmp_y = 0;
1108 GdkWindow *toplevel;
1109 NSRect content_rect;
1110 GdkWindowImplQuartz *impl;
1112 g_return_val_if_fail (GDK_IS_WINDOW (window), FALSE);
1114 if (GDK_WINDOW_DESTROYED (window))
1124 private = GDK_WINDOW_OBJECT (window);
1126 toplevel = gdk_window_get_toplevel (window);
1127 impl = GDK_WINDOW_IMPL_QUARTZ (GDK_WINDOW_OBJECT (toplevel)->impl);
1129 content_rect = [impl->toplevel contentRectForFrameRect:[impl->toplevel frame]];
1131 tmp_x = content_rect.origin.x;
1132 tmp_y = _gdk_quartz_get_inverted_screen_y (content_rect.origin.y + content_rect.size.height);
1134 while (private != GDK_WINDOW_OBJECT (toplevel))
1136 tmp_x += private->x;
1137 tmp_y += private->y;
1139 private = private->parent;
1151 gdk_window_get_deskrelative_origin (GdkWindow *window,
1155 g_return_val_if_fail (GDK_IS_WINDOW (window), FALSE);
1157 return gdk_window_get_origin (window, x, y);
1161 gdk_window_get_root_origin (GdkWindow *window,
1167 g_return_if_fail (GDK_IS_WINDOW (window));
1172 gdk_window_get_frame_extents (window, &rect);
1182 _gdk_windowing_get_pointer (GdkDisplay *display,
1186 GdkModifierType *mask)
1188 g_return_if_fail (display == _gdk_display);
1190 *screen = _gdk_screen;
1191 _gdk_windowing_window_get_pointer (_gdk_display, _gdk_root, x, y, mask);
1194 /* Returns coordinates relative to the upper left corner of window. */
1196 _gdk_windowing_window_get_pointer (GdkDisplay *display,
1200 GdkModifierType *mask)
1202 GdkWindow *toplevel;
1203 GdkWindowImplQuartz *impl;
1204 GdkWindowObject *private;
1208 if (GDK_WINDOW_DESTROYED (window))
1216 toplevel = gdk_window_get_toplevel (window);
1217 impl = GDK_WINDOW_IMPL_QUARTZ (GDK_WINDOW_OBJECT (toplevel)->impl);
1218 private = GDK_WINDOW_OBJECT (window);
1220 /* Must flip the y coordinate. */
1221 if (window == _gdk_root)
1223 point = [NSEvent mouseLocation];
1224 y_tmp = _gdk_quartz_get_inverted_screen_y (point.y);
1225 *mask = _gdk_quartz_get_current_event_mask ();
1229 NSWindow *nswindow = impl->toplevel;
1230 point = [nswindow mouseLocationOutsideOfEventStream];
1231 y_tmp = impl->height - point.y;
1232 *mask = _gdk_quartz_get_current_event_mask ();
1236 while (private != GDK_WINDOW_OBJECT (toplevel))
1238 x_tmp -= private->x;
1239 y_tmp -= private->y;
1241 private = private->parent;
1247 return _gdk_quartz_find_child_window_by_point (window,
1253 gdk_display_warp_pointer (GdkDisplay *display,
1258 CGDisplayMoveCursorToPoint (CGMainDisplayID (), CGPointMake (x, y));
1262 _gdk_windowing_window_at_pointer (GdkDisplay *display,
1266 GdkModifierType mask;
1268 return _gdk_windowing_window_get_pointer (display,
1275 gdk_window_get_events (GdkWindow *window)
1277 g_return_val_if_fail (GDK_IS_WINDOW (window), 0);
1279 if (GDK_WINDOW_DESTROYED (window))
1282 return GDK_WINDOW_OBJECT (window)->event_mask;
1286 gdk_window_set_events (GdkWindow *window,
1287 GdkEventMask event_mask)
1289 g_return_if_fail (GDK_IS_WINDOW (window));
1291 if (!GDK_WINDOW_DESTROYED (window))
1293 GDK_WINDOW_OBJECT (window)->event_mask = event_mask;
1298 gdk_window_set_urgency_hint (GdkWindow *window,
1301 /* FIXME: Implement */
1305 gdk_window_set_geometry_hints (GdkWindow *window,
1306 GdkGeometry *geometry,
1307 GdkWindowHints geom_mask)
1309 GdkWindowImplQuartz *impl;
1311 g_return_if_fail (GDK_IS_WINDOW (window));
1312 g_return_if_fail (geometry != NULL);
1314 if (GDK_WINDOW_DESTROYED (window))
1317 impl = GDK_WINDOW_IMPL_QUARTZ (((GdkWindowObject *) window)->impl);
1318 if (!impl->toplevel)
1321 if (geom_mask & GDK_HINT_POS)
1323 /* FIXME: Implement */
1326 if (geom_mask & GDK_HINT_USER_POS)
1328 /* FIXME: Implement */
1331 if (geom_mask & GDK_HINT_USER_SIZE)
1333 /* FIXME: Implement */
1336 if (geom_mask & GDK_HINT_MIN_SIZE)
1340 size.width = geometry->min_width;
1341 size.height = geometry->min_height;
1343 [impl->toplevel setContentMinSize:size];
1346 if (geom_mask & GDK_HINT_MAX_SIZE)
1350 size.width = geometry->max_width;
1351 size.height = geometry->max_height;
1353 [impl->toplevel setContentMaxSize:size];
1356 if (geom_mask & GDK_HINT_BASE_SIZE)
1358 /* FIXME: Implement */
1361 if (geom_mask & GDK_HINT_RESIZE_INC)
1365 size.width = geometry->width_inc;
1366 size.height = geometry->height_inc;
1368 [impl->toplevel setContentResizeIncrements:size];
1371 if (geom_mask & GDK_HINT_ASPECT)
1373 /* FIXME: Implement */
1376 if (geom_mask & GDK_HINT_WIN_GRAVITY)
1378 /* FIXME: Implement */
1383 gdk_window_set_title (GdkWindow *window,
1386 GdkWindowImplQuartz *impl;
1388 g_return_if_fail (GDK_IS_WINDOW (window));
1389 g_return_if_fail (title != NULL);
1391 if (GDK_WINDOW_DESTROYED (window))
1394 impl = GDK_WINDOW_IMPL_QUARTZ (((GdkWindowObject *)window)->impl);
1398 GDK_QUARTZ_ALLOC_POOL;
1399 [impl->toplevel setTitle:[NSString stringWithUTF8String:title]];
1400 GDK_QUARTZ_RELEASE_POOL;
1405 gdk_window_set_role (GdkWindow *window,
1408 /* FIXME: Implement */
1412 gdk_window_set_transient_for (GdkWindow *window,
1415 /* FIXME: Implement */
1419 gdk_window_shape_combine_region (GdkWindow *window,
1424 g_return_if_fail (GDK_IS_WINDOW (window));
1426 /* FIXME: Implement */
1430 gdk_window_shape_combine_mask (GdkWindow *window,
1434 /* FIXME: Implement */
1438 gdk_window_input_shape_combine_mask (GdkWindow *window,
1443 /* FIXME: Implement */
1447 gdk_window_input_shape_combine_region (GdkWindow *window,
1448 GdkRegion *shape_region,
1452 /* FIXME: Implement */
1456 gdk_window_set_child_input_shapes (GdkWindow *window)
1458 /* FIXME: IMplement */
1462 gdk_window_set_override_redirect (GdkWindow *window,
1463 gboolean override_redirect)
1465 /* FIXME: Implement */
1469 gdk_window_set_accept_focus (GdkWindow *window,
1470 gboolean accept_focus)
1472 /* FIXME: Implement */
1476 gdk_window_set_child_shapes (GdkWindow *window)
1478 g_return_if_fail (GDK_IS_WINDOW (window));
1480 /* FIXME: Implement */
1484 gdk_window_merge_child_shapes (GdkWindow *window)
1486 g_return_if_fail (GDK_IS_WINDOW (window));
1488 /* FIXME: Implement */
1492 gdk_window_merge_child_input_shapes (GdkWindow *window)
1494 /* FIXME: Implement */
1498 gdk_window_set_static_gravities (GdkWindow *window,
1499 gboolean use_static)
1501 /* FIXME: Implement */
1506 gdk_window_set_focus_on_map (GdkWindow *window,
1507 gboolean focus_on_map)
1509 /* FIXME: Implement */
1513 gdk_window_set_icon (GdkWindow *window,
1514 GdkWindow *icon_window,
1518 g_return_if_fail (GDK_IS_WINDOW (window));
1520 /* FIXME: Implement */
1524 gdk_window_set_icon_name (GdkWindow *window,
1527 g_return_if_fail (GDK_IS_WINDOW (window));
1529 /* FIXME: Implement */
1533 gdk_window_focus (GdkWindow *window,
1536 g_return_if_fail (GDK_IS_WINDOW (window));
1538 /* FIXME: Implement */
1542 gdk_window_set_hints (GdkWindow *window,
1551 /* FIXME: Implement */
1555 gdk_window_set_type_hint (GdkWindow *window,
1556 GdkWindowTypeHint hint)
1558 GdkWindowImplQuartz *impl;
1562 g_return_if_fail (GDK_IS_WINDOW (window));
1564 if (GDK_WINDOW_DESTROYED (window))
1567 impl = GDK_WINDOW_IMPL_QUARTZ (((GdkWindowObject *) window)->impl);
1569 impl->type_hint = hint;
1571 /* Match the documentation, only do something if we're not mapped yet. */
1572 if (GDK_WINDOW_IS_MAPPED (window))
1577 case GDK_WINDOW_TYPE_HINT_NORMAL: /* Normal toplevel window */
1578 case GDK_WINDOW_TYPE_HINT_DIALOG: /* Dialog window */
1579 level = NSNormalWindowLevel;
1583 case GDK_WINDOW_TYPE_HINT_TOOLBAR: /* Window used to implement toolbars */
1584 case GDK_WINDOW_TYPE_HINT_DESKTOP: /* N/A */
1585 level = NSNormalWindowLevel;
1589 case GDK_WINDOW_TYPE_HINT_DOCK:
1590 case GDK_WINDOW_TYPE_HINT_UTILITY:
1591 level = NSFloatingWindowLevel;
1595 case GDK_WINDOW_TYPE_HINT_MENU: /* Torn-off menu */
1596 level = NSTornOffMenuWindowLevel;
1600 case GDK_WINDOW_TYPE_HINT_DROPDOWN_MENU: /* Menu from menubar */
1601 level = NSTornOffMenuWindowLevel;
1605 case GDK_WINDOW_TYPE_HINT_SPLASHSCREEN:
1606 level = NSPopUpMenuWindowLevel;
1610 case GDK_WINDOW_TYPE_HINT_POPUP_MENU:
1611 case GDK_WINDOW_TYPE_HINT_COMBO:
1612 level = NSPopUpMenuWindowLevel;
1616 case GDK_WINDOW_TYPE_HINT_NOTIFICATION:
1617 case GDK_WINDOW_TYPE_HINT_TOOLTIP:
1618 level = NSStatusWindowLevel;
1622 case GDK_WINDOW_TYPE_HINT_DND:
1623 level = NSPopUpMenuWindowLevel;
1628 level = NSNormalWindowLevel;
1633 [impl->toplevel setHasShadow:shadow];
1634 [impl->toplevel setLevel:level];
1638 gdk_window_get_type_hint (GdkWindow *window)
1640 if (GDK_WINDOW_DESTROYED (window))
1641 return GDK_WINDOW_TYPE_HINT_NORMAL;
1643 return GDK_WINDOW_IMPL_QUARTZ (((GdkWindowObject *) window)->impl)->type_hint;
1647 gdk_window_set_modal_hint (GdkWindow *window,
1650 g_return_if_fail (GDK_IS_WINDOW (window));
1652 /* FIXME: Implement */
1656 gdk_window_set_skip_taskbar_hint (GdkWindow *window,
1657 gboolean skips_taskbar)
1659 g_return_if_fail (GDK_IS_WINDOW (window));
1661 /* FIXME: Implement */
1665 gdk_window_set_skip_pager_hint (GdkWindow *window,
1666 gboolean skips_pager)
1668 g_return_if_fail (GDK_IS_WINDOW (window));
1670 /* FIXME: Implement */
1674 gdk_window_begin_resize_drag (GdkWindow *window,
1681 g_return_if_fail (GDK_IS_WINDOW (window));
1683 /* FIXME: Implement */
1687 gdk_window_begin_move_drag (GdkWindow *window,
1693 g_return_if_fail (GDK_IS_WINDOW (window));
1695 /* FIXME: Implement */
1699 gdk_window_set_icon_list (GdkWindow *window,
1702 /* FIXME: Implement */
1706 gdk_window_get_frame_extents (GdkWindow *window,
1709 GdkWindowObject *private;
1710 GdkWindow *toplevel;
1711 GdkWindowImplQuartz *impl;
1714 g_return_if_fail (GDK_IS_WINDOW (window));
1715 g_return_if_fail (rect != NULL);
1717 private = GDK_WINDOW_OBJECT (window);
1724 if (GDK_WINDOW_DESTROYED (window))
1727 toplevel = gdk_window_get_toplevel (window);
1728 impl = GDK_WINDOW_IMPL_QUARTZ (GDK_WINDOW_OBJECT (toplevel)->impl);
1730 ns_rect = [impl->toplevel frame];
1732 rect->x = ns_rect.origin.x;
1733 rect->y = _gdk_quartz_get_inverted_screen_y (ns_rect.origin.y + ns_rect.size.height);
1734 rect->width = ns_rect.size.width;
1735 rect->height = ns_rect.size.height;
1739 gdk_window_set_decorations (GdkWindow *window,
1740 GdkWMDecoration decorations)
1742 g_return_if_fail (GDK_IS_WINDOW (window));
1744 /* FIXME: Implement */
1748 gdk_window_get_decorations (GdkWindow *window,
1749 GdkWMDecoration *decorations)
1751 /* FIXME: Implement */
1756 gdk_window_set_functions (GdkWindow *window,
1757 GdkWMFunction functions)
1759 g_return_if_fail (GDK_IS_WINDOW (window));
1761 /* FIXME: Implement */
1765 _gdk_windowing_window_get_offsets (GdkWindow *window,
1769 *x_offset = *y_offset = 0;
1773 _gdk_windowing_window_queue_antiexpose (GdkWindow *window,
1780 gdk_window_stick (GdkWindow *window)
1782 g_return_if_fail (GDK_IS_WINDOW (window));
1786 gdk_window_unstick (GdkWindow *window)
1788 g_return_if_fail (GDK_IS_WINDOW (window));
1792 gdk_window_maximize (GdkWindow *window)
1794 GdkWindowImplQuartz *impl;
1796 g_return_if_fail (GDK_IS_WINDOW (window));
1798 if (GDK_WINDOW_DESTROYED (window))
1801 impl = GDK_WINDOW_IMPL_QUARTZ (GDK_WINDOW_OBJECT (window)->impl);
1803 if (GDK_WINDOW_IS_MAPPED (window))
1805 GDK_QUARTZ_ALLOC_POOL;
1807 if (impl->toplevel && ![impl->toplevel isZoomed])
1808 [impl->toplevel zoom:nil];
1810 GDK_QUARTZ_RELEASE_POOL;
1814 gdk_synthesize_window_state (window,
1816 GDK_WINDOW_STATE_MAXIMIZED);
1821 gdk_window_unmaximize (GdkWindow *window)
1823 GdkWindowImplQuartz *impl;
1825 g_return_if_fail (GDK_IS_WINDOW (window));
1827 if (GDK_WINDOW_DESTROYED (window))
1830 impl = GDK_WINDOW_IMPL_QUARTZ (GDK_WINDOW_OBJECT (window)->impl);
1832 if (GDK_WINDOW_IS_MAPPED (window))
1834 GDK_QUARTZ_ALLOC_POOL;
1836 if (impl->toplevel && [impl->toplevel isZoomed])
1837 [impl->toplevel zoom:nil];
1839 GDK_QUARTZ_RELEASE_POOL;
1843 gdk_synthesize_window_state (window,
1844 GDK_WINDOW_STATE_MAXIMIZED,
1850 gdk_window_iconify (GdkWindow *window)
1852 GdkWindowImplQuartz *impl;
1854 g_return_if_fail (GDK_IS_WINDOW (window));
1856 if (GDK_WINDOW_DESTROYED (window))
1859 impl = GDK_WINDOW_IMPL_QUARTZ (GDK_WINDOW_OBJECT (window)->impl);
1861 if (GDK_WINDOW_IS_MAPPED (window))
1863 GDK_QUARTZ_ALLOC_POOL;
1866 [impl->toplevel miniaturize:nil];
1868 GDK_QUARTZ_RELEASE_POOL;
1872 gdk_synthesize_window_state (window,
1874 GDK_WINDOW_STATE_ICONIFIED);
1879 gdk_window_deiconify (GdkWindow *window)
1881 GdkWindowImplQuartz *impl;
1883 g_return_if_fail (GDK_IS_WINDOW (window));
1885 if (GDK_WINDOW_DESTROYED (window))
1888 impl = GDK_WINDOW_IMPL_QUARTZ (GDK_WINDOW_OBJECT (window)->impl);
1890 if (GDK_WINDOW_IS_MAPPED (window))
1892 GDK_QUARTZ_ALLOC_POOL;
1895 [impl->toplevel deminiaturize:nil];
1897 GDK_QUARTZ_RELEASE_POOL;
1901 gdk_synthesize_window_state (window,
1902 GDK_WINDOW_STATE_ICONIFIED,
1908 gdk_window_fullscreen (GdkWindow *window)
1910 g_return_if_fail (GDK_IS_WINDOW (window));
1912 /* FIXME: Implement */
1916 gdk_window_unfullscreen (GdkWindow *window)
1918 g_return_if_fail (GDK_IS_WINDOW (window));
1920 /* FIXME: Implement */
1924 gdk_window_set_keep_above (GdkWindow *window, gboolean setting)
1926 g_return_if_fail (GDK_IS_WINDOW (window));
1928 /* FIXME: Implement */
1932 gdk_window_set_keep_below (GdkWindow *window, gboolean setting)
1934 g_return_if_fail (GDK_IS_WINDOW (window));
1936 /* FIXME: Implement */
1940 gdk_window_get_group (GdkWindow *window)
1942 g_return_val_if_fail (GDK_IS_WINDOW (window), NULL);
1943 g_return_val_if_fail (GDK_WINDOW_TYPE (window) != GDK_WINDOW_CHILD, NULL);
1945 /* FIXME: Implement */
1951 gdk_window_set_group (GdkWindow *window,
1954 /* FIXME: Implement */
1958 gdk_window_foreign_new_for_display (GdkDisplay *display,
1959 GdkNativeWindow anid)
1961 /* Foreign windows aren't supported in Mac OS X */
1966 gdk_window_lookup (GdkNativeWindow anid)
1968 /* Foreign windows aren't supported in Mac OS X */
1973 gdk_window_lookup_for_display (GdkDisplay *display, GdkNativeWindow anid)
1975 /* Foreign windows aren't supported in Mac OS X */
1980 gdk_window_enable_synchronized_configure (GdkWindow *window)
1985 gdk_window_configure_finished (GdkWindow *window)
1990 gdk_window_destroy_notify (GdkWindow *window)
1992 /* FIXME: Implement. We should call this from -[GdkQuartzWindow dealloc] or
1993 * -[GdkQuartzView dealloc], although I suspect that currently they leak