]> Pileus Git - ~andy/gtk/commitdiff
Improve the GDK API for dealing with group leaders (#119375):
authorMatthias Clasen <maclas@gmx.de>
Tue, 9 Dec 2003 23:12:53 +0000 (23:12 +0000)
committerMatthias Clasen <matthiasc@src.gnome.org>
Tue, 9 Dec 2003 23:12:53 +0000 (23:12 +0000)
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.

12 files changed:
ChangeLog
ChangeLog.pre-2-10
ChangeLog.pre-2-4
ChangeLog.pre-2-6
ChangeLog.pre-2-8
docs/reference/ChangeLog
docs/reference/gdk/gdk-sections.txt
gdk/gdkdisplay.h
gdk/gdkwindow.h
gdk/x11/gdkdisplay-x11.c
gdk/x11/gdkdisplay-x11.h
gdk/x11/gdkwindow-x11.c

index e56565b42cb1a4e94a252a5b6d9fc9b01785247f..e854fc25a518040c44bc2289bc7ccb93f4da4d76 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,21 @@
+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.
+
 2003-12-09  Noah Levitt  <nlevitt@columbia.edu>
 
        * gdk/gdkkeysyms.h:
index e56565b42cb1a4e94a252a5b6d9fc9b01785247f..e854fc25a518040c44bc2289bc7ccb93f4da4d76 100644 (file)
@@ -1,3 +1,21 @@
+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.
+
 2003-12-09  Noah Levitt  <nlevitt@columbia.edu>
 
        * gdk/gdkkeysyms.h:
index e56565b42cb1a4e94a252a5b6d9fc9b01785247f..e854fc25a518040c44bc2289bc7ccb93f4da4d76 100644 (file)
@@ -1,3 +1,21 @@
+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.
+
 2003-12-09  Noah Levitt  <nlevitt@columbia.edu>
 
        * gdk/gdkkeysyms.h:
index e56565b42cb1a4e94a252a5b6d9fc9b01785247f..e854fc25a518040c44bc2289bc7ccb93f4da4d76 100644 (file)
@@ -1,3 +1,21 @@
+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.
+
 2003-12-09  Noah Levitt  <nlevitt@columbia.edu>
 
        * gdk/gdkkeysyms.h:
index e56565b42cb1a4e94a252a5b6d9fc9b01785247f..e854fc25a518040c44bc2289bc7ccb93f4da4d76 100644 (file)
@@ -1,3 +1,21 @@
+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.
+
 2003-12-09  Noah Levitt  <nlevitt@columbia.edu>
 
        * gdk/gdkkeysyms.h:
index 3b13cc571ffb719db10669e05662943965d8f296..89480292f0a567eaecd8406d208dc3b5cbe3905d 100644 (file)
@@ -1,3 +1,8 @@
+Wed Dec 10 00:09:51 2003  Matthias Clasen  <maclas@gmx.de>
+
+       * gdk/gdk-sections.txt: Add gdk_window_get_group(), 
+       gdk_display_get_default_group().
+
 2003-12-08  Federico Mena Quintero  <federico@ximian.com>
  
        * gtk/migrating-GtkAction.sgml: New chapter about how to migrate
index 8185010263736dcc74c9db18b94e5e6bd089c04b..e0547fe2efa738ad7999e82f1a0938061b3c830c 100644 (file)
@@ -143,6 +143,7 @@ gdk_display_supports_cursor_color
 gdk_display_supports_cursor_alpha
 gdk_display_get_default_cursor_size
 gdk_display_get_maximal_cursor_size
+gdk_display_get_default_group
 
 <SUBSECTION Standard>
 GDK_DISPLAY_OBJECT
@@ -704,6 +705,7 @@ gdk_window_set_icon_name
 gdk_window_set_transient_for
 gdk_window_set_role
 gdk_window_set_group
+gdk_window_get_group
 gdk_window_set_decorations
 gdk_window_get_decorations
 GdkWMDecoration
index db6df0cd4fc99190351f0b3941f06deb1e4721cf..bbf0d7591c946bae664317924eb6f450e3be67df 100644 (file)
@@ -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__ */
index 0c60f21d2aaa00036769dddd6a4c5f670f8c6028..1eadf0044da9c7246bf38cf63b61bde4dc36d4d9 100644 (file)
@@ -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,
index 0de2d587e06718af54a38f0107c039bd3f5ada53..e2e17ca167d8808607b69ce8c27d408aacc87d29 100644 (file)
@@ -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;
@@ -557,6 +568,25 @@ gdk_display_flush (GdkDisplay *display)
     XFlush (GDK_DISPLAY_XDISPLAY (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 
index a455303f8913f978418650bf90eb3ca2ab128a9d..5c1d4a539ea19e3dc7fca9235558d420a4500b35 100644 (file)
@@ -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 */
index 51bf934823017c488d0389b8a378aa4c08034f93..3683e42075c5356e4779088953665e581b09e610 100644 (file)
@@ -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,
@@ -3869,10 +3869,37 @@ gdk_window_set_keep_below (GdkWindow *window, gboolean setting)
                                 setting ? GDK_WINDOW_STATE_BELOW : 0);
 }
 
+/**
+ * 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)
     {