summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRichard Hult <richard@imendio.com>2007-06-04 20:02:58 +0000
committerRichard Hult <rhult@src.gnome.org>2007-06-04 20:02:58 +0000
commit05e560661f076941ff107f00a34fa7d897cf7f8b (patch)
tree1c2814ffae062b51c262bab5c37ebfa41b9af7c2
parent1e36a6bf798b817442a23b381dcfc69f03f25cf3 (diff)
downloadgdk-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--ChangeLog6
-rw-r--r--gdk/quartz/gdkwindow-quartz.c63
-rw-r--r--gdk/quartz/gdkwindow-quartz.h2
3 files changed, 69 insertions, 2 deletions
diff --git a/ChangeLog b/ChangeLog
index 2e2055a7b..926e7ba19 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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