summaryrefslogtreecommitdiff
path: root/gdk
diff options
context:
space:
mode:
authorMatthias Clasen <maclas@gmx.de>2003-12-09 23:12:53 +0000
committerMatthias Clasen <matthiasc@src.gnome.org>2003-12-09 23:12:53 +0000
commit3f6441ea3ab67b4deea57e1ab127d27021738895 (patch)
treef041837673e940035edcbed3c7893f3a266f75ee /gdk
parent451c0775785ccd6328235bf42b92e3f1639ca2bc (diff)
downloadgtk+-3f6441ea3ab67b4deea57e1ab127d27021738895.tar.gz
Improve the GDK API for dealing with group leaders (#119375):
Wed Dec 10 00:06:24 2003 Matthias Clasen <maclas@gmx.de> Improve the GDK API for dealing with group leaders (#119375): * gdk/gdkwindow.h: * gdk/x11/gdkwindow-x11.c (gdk_window_get_group): New function to get the group leader of a toplevel window as a GdkWindow. * gdk/gdkdisplay.h: * gdk/x11/gdkdisplay-x11.c (gdk_display_get_default_group): New function to get the default group leader as a GdkWindow. * gdk/x11/gdkdisplay-x11.h (struct _GdkDisplayX11): Add a field for the GdkWindow of the default group leader. * gdk/x11/gdkdisplay-x11.c (gdk_display_open): Construct the GdkWindow for the default group leader.
Diffstat (limited to 'gdk')
-rw-r--r--gdk/gdkdisplay.h2
-rw-r--r--gdk/gdkwindow.h1
-rw-r--r--gdk/x11/gdkdisplay-x11.c36
-rw-r--r--gdk/x11/gdkdisplay-x11.h1
-rw-r--r--gdk/x11/gdkwindow-x11.c41
5 files changed, 72 insertions, 9 deletions
diff --git a/gdk/gdkdisplay.h b/gdk/gdkdisplay.h
index db6df0cd4f..bbf0d7591c 100644
--- a/gdk/gdkdisplay.h
+++ b/gdk/gdkdisplay.h
@@ -157,6 +157,8 @@ void gdk_display_get_maximal_cursor_size (GdkDisplay *display,
guint *width,
guint *height);
+GdkWindow *gdk_display_get_default_group (GdkDisplay *display);
+
G_END_DECLS
#endif /* __GDK_DISPLAY_H__ */
diff --git a/gdk/gdkwindow.h b/gdk/gdkwindow.h
index 0c60f21d2a..1eadf0044d 100644
--- a/gdk/gdkwindow.h
+++ b/gdk/gdkwindow.h
@@ -484,6 +484,7 @@ void gdk_window_set_icon_name (GdkWindow *window,
const gchar *name);
void gdk_window_set_group (GdkWindow *window,
GdkWindow *leader);
+GdkWindow* gdk_window_get_group (GdkWindow *window);
void gdk_window_set_decorations (GdkWindow *window,
GdkWMDecoration decorations);
gboolean gdk_window_get_decorations (GdkWindow *window,
diff --git a/gdk/x11/gdkdisplay-x11.c b/gdk/x11/gdkdisplay-x11.c
index 0de2d587e0..e2e17ca167 100644
--- a/gdk/x11/gdkdisplay-x11.c
+++ b/gdk/x11/gdkdisplay-x11.c
@@ -138,6 +138,7 @@ gdk_display_open (const gchar *display_name)
Display *xdisplay;
GdkDisplay *display;
GdkDisplayX11 *display_x11;
+ GdkWindowAttr attr;
gint argc;
gchar **argv;
const char *sm_client_id;
@@ -174,9 +175,19 @@ gdk_display_open (const gchar *display_name)
/*set the default screen */
display_x11->default_screen = display_x11->screens[DefaultScreen (display_x11->xdisplay)];
- display_x11->leader_window = XCreateSimpleWindow (display_x11->xdisplay,
- GDK_SCREEN_X11 (display_x11->default_screen)->xroot_window,
- 10, 10, 10, 10, 0, 0, 0);
+
+ attr.window_type = GDK_WINDOW_TOPLEVEL;
+ attr.wclass = GDK_INPUT_OUTPUT;
+ attr.x = 10;
+ attr.y = 10;
+ attr.width = 10;
+ attr.height = 10;
+ attr.event_mask = 0;
+
+ display_x11->leader_gdk_window = gdk_window_new (GDK_SCREEN_X11 (display_x11->default_screen)->root_window,
+ &attr, GDK_WA_X | GDK_WA_Y);
+ display_x11->leader_window = GDK_WINDOW_XID (display_x11->leader_gdk_window);
+
display_x11->leader_window_title_set = FALSE;
display_x11->gravity_works = GDK_UNKNOWN;
@@ -558,6 +569,25 @@ gdk_display_flush (GdkDisplay *display)
}
/**
+ * gdk_display_get_default_group:
+ * @display: a #GdkDisplay
+ *
+ * Returns the default group leader window for all toplevel windows
+ * on @display. This window is implicitly created by GDK.
+ * See gdk_window_set_group().
+ *
+ * Return value: The default group leader window for @display
+ *
+ * Since: 2.4
+ **/
+GdkWindow *gdk_display_get_default_group (GdkDisplay *display)
+{
+ g_return_val_if_fail (GDK_IS_DISPLAY (display), NULL);
+
+ return GDK_DISPLAY_X11 (display)->leader_gdk_window;
+}
+
+/**
* gdk_x11_display_grab:
* @display: a #GdkDisplay
*
diff --git a/gdk/x11/gdkdisplay-x11.h b/gdk/x11/gdkdisplay-x11.h
index a455303f89..5c1d4a539e 100644
--- a/gdk/x11/gdkdisplay-x11.h
+++ b/gdk/x11/gdkdisplay-x11.h
@@ -109,6 +109,7 @@ struct _GdkDisplayX11
/* Session Management leader window see ICCCM */
Window leader_window;
+ GdkWindow *leader_gdk_window;
gboolean leader_window_title_set;
/* list of filters for client messages */
diff --git a/gdk/x11/gdkwindow-x11.c b/gdk/x11/gdkwindow-x11.c
index 51bf934823..3683e42075 100644
--- a/gdk/x11/gdkwindow-x11.c
+++ b/gdk/x11/gdkwindow-x11.c
@@ -370,7 +370,7 @@ check_leader_window_title (GdkDisplay *display)
{
GdkDisplayX11 *display_x11 = GDK_DISPLAY_X11 (display);
- if (!display_x11->leader_window_title_set)
+ if (display_x11->leader_window && !display_x11->leader_window_title_set)
{
set_wm_name (display,
display_x11->leader_window,
@@ -3870,9 +3870,36 @@ gdk_window_set_keep_below (GdkWindow *window, gboolean setting)
}
/**
+ * gdk_window_get_group:
+ * @window: a toplevel #GdkWindow
+ *
+ * Returns the group leader window for @window. See gdk_window_set_group().
+ *
+ * Return value: the group leader window for @window
+ *
+ * Since: 2.4
+ **/
+GdkWindow *
+gdk_window_get_group (GdkWindow *window)
+{
+ GdkToplevelX11 *toplevel;
+
+ g_return_val_if_fail (window != NULL, NULL);
+ g_return_val_if_fail (GDK_IS_WINDOW (window), NULL);
+ g_return_val_if_fail (GDK_WINDOW_TYPE (window) != GDK_WINDOW_CHILD, NULL);
+
+ if (GDK_WINDOW_DESTROYED (window))
+ return NULL;
+
+ toplevel = _gdk_x11_window_get_toplevel (window);
+
+ return toplevel->group_leader;
+}
+
+/**
* gdk_window_set_group:
* @window: a toplevel #GdkWindow
- * @leader: group leader window
+ * @leader: group leader window, or %NULL to restore the default group leader window
*
* Sets the group leader window for @window. By default,
* GDK sets the group leader for all toplevel windows
@@ -3894,13 +3921,15 @@ gdk_window_set_group (GdkWindow *window,
g_return_if_fail (window != NULL);
g_return_if_fail (GDK_IS_WINDOW (window));
g_return_if_fail (GDK_WINDOW_TYPE (window) != GDK_WINDOW_CHILD);
- g_return_if_fail (leader != NULL);
- g_return_if_fail (GDK_IS_WINDOW (leader));
+ g_return_if_fail (leader == NULL || GDK_IS_WINDOW (leader));
+
+ if (GDK_WINDOW_DESTROYED (window) || (leader != NULL && GDK_WINDOW_DESTROYED (leader)))
+ return;
toplevel = _gdk_x11_window_get_toplevel (window);
- if (GDK_WINDOW_DESTROYED (window) || GDK_WINDOW_DESTROYED (leader))
- return;
+ if (leader == NULL)
+ leader = gdk_display_get_default_group (gdk_drawable_get_display (window));
if (toplevel->group_leader != leader)
{