diff options
author | Richard Hult <richard@imendio.com> | 2007-06-04 20:02:58 +0000 |
---|---|---|
committer | Richard Hult <rhult@src.gnome.org> | 2007-06-04 20:02:58 +0000 |
commit | 05e560661f076941ff107f00a34fa7d897cf7f8b (patch) | |
tree | 1c2814ffae062b51c262bab5c37ebfa41b9af7c2 | |
parent | 1e36a6bf798b817442a23b381dcfc69f03f25cf3 (diff) | |
download | gdk-pixbuf-05e560661f076941ff107f00a34fa7d897cf7f8b.tar.gz |
Implement gdk_window_set_transient_for.
2007-06-04 Richard Hult <richard@imendio.com>
* gdk/quartz/gdkwindow-quartz.c:
* gdk/quartz/gdkwindow-quartz.h: Implement
gdk_window_set_transient_for.
svn path=/trunk/; revision=18036
-rw-r--r-- | ChangeLog | 6 | ||||
-rw-r--r-- | gdk/quartz/gdkwindow-quartz.c | 63 | ||||
-rw-r--r-- | gdk/quartz/gdkwindow-quartz.h | 2 |
3 files changed, 69 insertions, 2 deletions
@@ -1,3 +1,9 @@ +2007-06-04 Richard Hult <richard@imendio.com> + + * gdk/quartz/gdkwindow-quartz.c: + * gdk/quartz/gdkwindow-quartz.h: Implement + gdk_window_set_transient_for. + 2007-06-04 Cody Russell <bratsche@gnome.org> * gtk/gtklinkbutton.h diff --git a/gdk/quartz/gdkwindow-quartz.c b/gdk/quartz/gdkwindow-quartz.c index 0188e0beb..702b063f1 100644 --- a/gdk/quartz/gdkwindow-quartz.c +++ b/gdk/quartz/gdkwindow-quartz.c @@ -115,6 +115,9 @@ gdk_window_impl_quartz_finalize (GObject *object) if (impl->paint_clip_region) gdk_region_destroy (impl->paint_clip_region); + if (impl->transient_for) + g_object_unref (impl->transient_for); + G_OBJECT_CLASS (parent_class)->finalize (object); } @@ -815,6 +818,14 @@ show_window_internal (GdkWindow *window, if (private->state & GDK_WINDOW_STATE_ICONIFIED) gdk_window_iconify (window); + if (impl->transient_for && !GDK_WINDOW_DESTROYED (impl->transient_for)) + { + GdkWindowImplQuartz *parent_impl; + + parent_impl = GDK_WINDOW_IMPL_QUARTZ (GDK_WINDOW_OBJECT (impl->transient_for)->impl); + [parent_impl->toplevel addChildWindow:impl->toplevel ordered:NSWindowAbove]; + } + GDK_QUARTZ_RELEASE_POOL; } @@ -856,6 +867,20 @@ gdk_window_hide (GdkWindow *window) if (impl->toplevel) { + /* We must unset the transient while it is hidden, otherwise + * quartz won't hide the window. + */ + if (impl->transient_for) + { + if (!GDK_WINDOW_DESTROYED (impl->transient_for)) + { + GdkWindowImplQuartz *parent_impl; + + parent_impl = GDK_WINDOW_IMPL_QUARTZ (GDK_WINDOW_OBJECT (impl->transient_for)->impl); + [parent_impl->toplevel removeChildWindow:impl->toplevel]; + } + } + [impl->toplevel orderOut:nil]; } else if (impl->view) @@ -1030,7 +1055,7 @@ gdk_window_set_background (GdkWindow *window, g_return_if_fail (GDK_IS_WINDOW (window)); if (GDK_WINDOW_DESTROYED (window)) - return; + return; impl = GDK_WINDOW_IMPL_QUARTZ (private->impl); @@ -1481,7 +1506,41 @@ void gdk_window_set_transient_for (GdkWindow *window, GdkWindow *parent) { - /* FIXME: Implement */ + GdkWindowImplQuartz *window_impl; + GdkWindowImplQuartz *parent_impl; + + if (GDK_WINDOW_DESTROYED (window) || GDK_WINDOW_DESTROYED (parent)) + return; + + window_impl = GDK_WINDOW_IMPL_QUARTZ (GDK_WINDOW_OBJECT (window)->impl); + if (!window_impl->toplevel) + return; + + GDK_QUARTZ_ALLOC_POOL; + + if (window_impl->transient_for) + { + if (!GDK_WINDOW_DESTROYED (window_impl->transient_for)) + { + parent_impl = GDK_WINDOW_IMPL_QUARTZ (GDK_WINDOW_OBJECT (window_impl->transient_for)->impl); + [parent_impl->toplevel removeChildWindow:window_impl->toplevel]; + } + + g_object_unref (window_impl->transient_for); + window_impl->transient_for = NULL; + } + + parent_impl = GDK_WINDOW_IMPL_QUARTZ (GDK_WINDOW_OBJECT (parent)->impl); + if (parent_impl->toplevel) + { + /* We save the parent because it needs to be unset/reset when + * hiding and showing the window. + */ + window_impl->transient_for = g_object_ref (parent); + [parent_impl->toplevel addChildWindow:window_impl->toplevel ordered:NSWindowAbove]; + } + + GDK_QUARTZ_RELEASE_POOL; } void diff --git a/gdk/quartz/gdkwindow-quartz.h b/gdk/quartz/gdkwindow-quartz.h index ccf85bef4..ce5e0ba52 100644 --- a/gdk/quartz/gdkwindow-quartz.h +++ b/gdk/quartz/gdkwindow-quartz.h @@ -64,6 +64,8 @@ struct _GdkWindowImplQuartz GdkRegion *paint_clip_region; gint begin_paint_count; gint in_paint_rect_count; + + GdkWindow *transient_for; }; struct _GdkWindowImplQuartzClass |