]> Pileus Git - ~andy/gtk/commitdiff
Start implementing display/screen closing scheme; keep a flag for whether
authorOwen Taylor <otaylor@redhat.com>
Thu, 1 Aug 2002 15:28:40 +0000 (15:28 +0000)
committerOwen Taylor <otaylor@src.gnome.org>
Thu, 1 Aug 2002 15:28:40 +0000 (15:28 +0000)
Thu Aug  1 11:26:03 2002  Owen Taylor  <otaylor@redhat.com>

* gdk/gdkdisplay.[ch] gdk/gdkscreen.[ch] gdkinternals.h:
Start implementing display/screen closing scheme; keep a
flag for whether displays and screens are closed,
call g_object_run_dispose(). Remove public gdk_screen_close().

* gdk/x11/gdkdisplay-x11.c gdk/x11/gdkscreen-x11.c: Add
dispose() methods; move appropriate parts of the finalize
there.

* gdk/x11/gdkcolor-x11.c gdk/x11/gdkimage-x11.c
gdk/x11/gdkmain-x11.c gdk/x11/gdkpango-x11.c
gdk/x11/gdkpixmap-x11.c gdk/x11/gdkproperty-x11.c
gdk/x11/gdkselection-x11.c gdk/x11/gdkwindow-x11.c:
Start of making everything correctly ignore operations
when a display has been closed.

* gdk/x11/gdkwindow-x11.c (gdk_window_get_decorations):
Handle decorations == NULL.

* gdk/x11/gdkcolor-x11.c (gdk_colormap_remove):
Remove unnecessary hash table creation.

* gdk/x11/gdkinput.c gdk/x11/gdkinput-x11.c gdk/win32/gdkinput.c
Fix up gdk_device_get_history - handle events, n_events == NULL,
etc.

* gdk/x11/gdkproperty-x11.c (gdk_property_get):
Handle failure better.

* gdk/x11/gdkselection-x11.c (gdk_selection_property_get):
Handle failure better, handle data == NULL, move docs
here, remove an excess round trip by asking for
all selection data at once.

* gdk/gdkselection.c gdk/win32/{x11,win32}/gdkselection-{x11,win32}.c
  gdk/{x11,win32}/gdkmain-{x11,win32}.c gdk/gdkdisplay.c: Move
gdk_text_property_to_text_list(), gdk_string_to_compound_text(),
gdk_display_set_sm_client_id() to display-independent part of GDK.

* gdk/Makefile.am (gdk_c_sources): Sort gdkdisplay/screen.[ch]
into the right place.

32 files changed:
ChangeLog
ChangeLog.pre-2-10
ChangeLog.pre-2-2
ChangeLog.pre-2-4
ChangeLog.pre-2-6
ChangeLog.pre-2-8
docs/reference/gdk/tmpl/selections.sgml
gdk/Makefile.am
gdk/gdkdisplay.c
gdk/gdkdisplay.h
gdk/gdkinternals.h
gdk/gdkscreen.c
gdk/gdkscreen.h
gdk/gdkselection.c
gdk/win32/gdkinput.c
gdk/win32/gdkmain-win32.c
gdk/win32/gdkselection-win32.c
gdk/x11/gdkcolor-x11.c
gdk/x11/gdkcursor-x11.c
gdk/x11/gdkdisplay-x11.c
gdk/x11/gdkimage-x11.c
gdk/x11/gdkinput-x11.c
gdk/x11/gdkinput-xfree.c
gdk/x11/gdkinput.c
gdk/x11/gdkmain-x11.c
gdk/x11/gdkpango-x11.c
gdk/x11/gdkpixmap-x11.c
gdk/x11/gdkproperty-x11.c
gdk/x11/gdkscreen-x11.c
gdk/x11/gdkscreen-x11.h
gdk/x11/gdkselection-x11.c
gdk/x11/gdkwindow-x11.c

index 6396eece8bbc92aa21f244b52b4c2cf38cb22293..88a2375ed9bf8ff1a78c17b86a889e0e48c8cab1 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,47 @@
+Thu Aug  1 11:26:03 2002  Owen Taylor  <otaylor@redhat.com>
+
+       * gdk/gdkdisplay.[ch] gdk/gdkscreen.[ch] gdkinternals.h:
+       Start implementing display/screen closing scheme; keep a
+       flag for whether displays and screens are closed,
+       call g_object_run_dispose(). Remove public gdk_screen_close().
+
+       * gdk/x11/gdkdisplay-x11.c gdk/x11/gdkscreen-x11.c: Add 
+       dispose() methods; move appropriate parts of the finalize
+       there.
+
+       * gdk/x11/gdkcolor-x11.c gdk/x11/gdkimage-x11.c
+       gdk/x11/gdkmain-x11.c gdk/x11/gdkpango-x11.c 
+       gdk/x11/gdkpixmap-x11.c gdk/x11/gdkproperty-x11.c
+       gdk/x11/gdkselection-x11.c gdk/x11/gdkwindow-x11.c:
+       Start of making everything correctly ignore operations
+       when a display has been closed.
+
+       * gdk/x11/gdkwindow-x11.c (gdk_window_get_decorations):
+       Handle decorations == NULL.
+
+       * gdk/x11/gdkcolor-x11.c (gdk_colormap_remove): 
+       Remove unnecessary hash table creation.
+
+       * gdk/x11/gdkinput.c gdk/x11/gdkinput-x11.c gdk/win32/gdkinput.c
+       Fix up gdk_device_get_history - handle events, n_events == NULL,
+       etc.
+
+       * gdk/x11/gdkproperty-x11.c (gdk_property_get):
+       Handle failure better.
+       
+       * gdk/x11/gdkselection-x11.c (gdk_selection_property_get):
+       Handle failure better, handle data == NULL, move docs
+       here, remove an excess round trip by asking for
+       all selection data at once.
+       
+       * gdk/gdkselection.c gdk/win32/{x11,win32}/gdkselection-{x11,win32}.c
+         gdk/{x11,win32}/gdkmain-{x11,win32}.c gdk/gdkdisplay.c: Move
+       gdk_text_property_to_text_list(), gdk_string_to_compound_text(),
+       gdk_display_set_sm_client_id() to display-independent part of GDK.
+
+       * gdk/Makefile.am (gdk_c_sources): Sort gdkdisplay/screen.[ch]
+       into the right place.
+
 2002-07-31  jacob berkman  <jacob@ximian.com>
 
        * gtk/queryimmodules.c (print_escaped): escape_string() only takes
index 6396eece8bbc92aa21f244b52b4c2cf38cb22293..88a2375ed9bf8ff1a78c17b86a889e0e48c8cab1 100644 (file)
@@ -1,3 +1,47 @@
+Thu Aug  1 11:26:03 2002  Owen Taylor  <otaylor@redhat.com>
+
+       * gdk/gdkdisplay.[ch] gdk/gdkscreen.[ch] gdkinternals.h:
+       Start implementing display/screen closing scheme; keep a
+       flag for whether displays and screens are closed,
+       call g_object_run_dispose(). Remove public gdk_screen_close().
+
+       * gdk/x11/gdkdisplay-x11.c gdk/x11/gdkscreen-x11.c: Add 
+       dispose() methods; move appropriate parts of the finalize
+       there.
+
+       * gdk/x11/gdkcolor-x11.c gdk/x11/gdkimage-x11.c
+       gdk/x11/gdkmain-x11.c gdk/x11/gdkpango-x11.c 
+       gdk/x11/gdkpixmap-x11.c gdk/x11/gdkproperty-x11.c
+       gdk/x11/gdkselection-x11.c gdk/x11/gdkwindow-x11.c:
+       Start of making everything correctly ignore operations
+       when a display has been closed.
+
+       * gdk/x11/gdkwindow-x11.c (gdk_window_get_decorations):
+       Handle decorations == NULL.
+
+       * gdk/x11/gdkcolor-x11.c (gdk_colormap_remove): 
+       Remove unnecessary hash table creation.
+
+       * gdk/x11/gdkinput.c gdk/x11/gdkinput-x11.c gdk/win32/gdkinput.c
+       Fix up gdk_device_get_history - handle events, n_events == NULL,
+       etc.
+
+       * gdk/x11/gdkproperty-x11.c (gdk_property_get):
+       Handle failure better.
+       
+       * gdk/x11/gdkselection-x11.c (gdk_selection_property_get):
+       Handle failure better, handle data == NULL, move docs
+       here, remove an excess round trip by asking for
+       all selection data at once.
+       
+       * gdk/gdkselection.c gdk/win32/{x11,win32}/gdkselection-{x11,win32}.c
+         gdk/{x11,win32}/gdkmain-{x11,win32}.c gdk/gdkdisplay.c: Move
+       gdk_text_property_to_text_list(), gdk_string_to_compound_text(),
+       gdk_display_set_sm_client_id() to display-independent part of GDK.
+
+       * gdk/Makefile.am (gdk_c_sources): Sort gdkdisplay/screen.[ch]
+       into the right place.
+
 2002-07-31  jacob berkman  <jacob@ximian.com>
 
        * gtk/queryimmodules.c (print_escaped): escape_string() only takes
index 6396eece8bbc92aa21f244b52b4c2cf38cb22293..88a2375ed9bf8ff1a78c17b86a889e0e48c8cab1 100644 (file)
@@ -1,3 +1,47 @@
+Thu Aug  1 11:26:03 2002  Owen Taylor  <otaylor@redhat.com>
+
+       * gdk/gdkdisplay.[ch] gdk/gdkscreen.[ch] gdkinternals.h:
+       Start implementing display/screen closing scheme; keep a
+       flag for whether displays and screens are closed,
+       call g_object_run_dispose(). Remove public gdk_screen_close().
+
+       * gdk/x11/gdkdisplay-x11.c gdk/x11/gdkscreen-x11.c: Add 
+       dispose() methods; move appropriate parts of the finalize
+       there.
+
+       * gdk/x11/gdkcolor-x11.c gdk/x11/gdkimage-x11.c
+       gdk/x11/gdkmain-x11.c gdk/x11/gdkpango-x11.c 
+       gdk/x11/gdkpixmap-x11.c gdk/x11/gdkproperty-x11.c
+       gdk/x11/gdkselection-x11.c gdk/x11/gdkwindow-x11.c:
+       Start of making everything correctly ignore operations
+       when a display has been closed.
+
+       * gdk/x11/gdkwindow-x11.c (gdk_window_get_decorations):
+       Handle decorations == NULL.
+
+       * gdk/x11/gdkcolor-x11.c (gdk_colormap_remove): 
+       Remove unnecessary hash table creation.
+
+       * gdk/x11/gdkinput.c gdk/x11/gdkinput-x11.c gdk/win32/gdkinput.c
+       Fix up gdk_device_get_history - handle events, n_events == NULL,
+       etc.
+
+       * gdk/x11/gdkproperty-x11.c (gdk_property_get):
+       Handle failure better.
+       
+       * gdk/x11/gdkselection-x11.c (gdk_selection_property_get):
+       Handle failure better, handle data == NULL, move docs
+       here, remove an excess round trip by asking for
+       all selection data at once.
+       
+       * gdk/gdkselection.c gdk/win32/{x11,win32}/gdkselection-{x11,win32}.c
+         gdk/{x11,win32}/gdkmain-{x11,win32}.c gdk/gdkdisplay.c: Move
+       gdk_text_property_to_text_list(), gdk_string_to_compound_text(),
+       gdk_display_set_sm_client_id() to display-independent part of GDK.
+
+       * gdk/Makefile.am (gdk_c_sources): Sort gdkdisplay/screen.[ch]
+       into the right place.
+
 2002-07-31  jacob berkman  <jacob@ximian.com>
 
        * gtk/queryimmodules.c (print_escaped): escape_string() only takes
index 6396eece8bbc92aa21f244b52b4c2cf38cb22293..88a2375ed9bf8ff1a78c17b86a889e0e48c8cab1 100644 (file)
@@ -1,3 +1,47 @@
+Thu Aug  1 11:26:03 2002  Owen Taylor  <otaylor@redhat.com>
+
+       * gdk/gdkdisplay.[ch] gdk/gdkscreen.[ch] gdkinternals.h:
+       Start implementing display/screen closing scheme; keep a
+       flag for whether displays and screens are closed,
+       call g_object_run_dispose(). Remove public gdk_screen_close().
+
+       * gdk/x11/gdkdisplay-x11.c gdk/x11/gdkscreen-x11.c: Add 
+       dispose() methods; move appropriate parts of the finalize
+       there.
+
+       * gdk/x11/gdkcolor-x11.c gdk/x11/gdkimage-x11.c
+       gdk/x11/gdkmain-x11.c gdk/x11/gdkpango-x11.c 
+       gdk/x11/gdkpixmap-x11.c gdk/x11/gdkproperty-x11.c
+       gdk/x11/gdkselection-x11.c gdk/x11/gdkwindow-x11.c:
+       Start of making everything correctly ignore operations
+       when a display has been closed.
+
+       * gdk/x11/gdkwindow-x11.c (gdk_window_get_decorations):
+       Handle decorations == NULL.
+
+       * gdk/x11/gdkcolor-x11.c (gdk_colormap_remove): 
+       Remove unnecessary hash table creation.
+
+       * gdk/x11/gdkinput.c gdk/x11/gdkinput-x11.c gdk/win32/gdkinput.c
+       Fix up gdk_device_get_history - handle events, n_events == NULL,
+       etc.
+
+       * gdk/x11/gdkproperty-x11.c (gdk_property_get):
+       Handle failure better.
+       
+       * gdk/x11/gdkselection-x11.c (gdk_selection_property_get):
+       Handle failure better, handle data == NULL, move docs
+       here, remove an excess round trip by asking for
+       all selection data at once.
+       
+       * gdk/gdkselection.c gdk/win32/{x11,win32}/gdkselection-{x11,win32}.c
+         gdk/{x11,win32}/gdkmain-{x11,win32}.c gdk/gdkdisplay.c: Move
+       gdk_text_property_to_text_list(), gdk_string_to_compound_text(),
+       gdk_display_set_sm_client_id() to display-independent part of GDK.
+
+       * gdk/Makefile.am (gdk_c_sources): Sort gdkdisplay/screen.[ch]
+       into the right place.
+
 2002-07-31  jacob berkman  <jacob@ximian.com>
 
        * gtk/queryimmodules.c (print_escaped): escape_string() only takes
index 6396eece8bbc92aa21f244b52b4c2cf38cb22293..88a2375ed9bf8ff1a78c17b86a889e0e48c8cab1 100644 (file)
@@ -1,3 +1,47 @@
+Thu Aug  1 11:26:03 2002  Owen Taylor  <otaylor@redhat.com>
+
+       * gdk/gdkdisplay.[ch] gdk/gdkscreen.[ch] gdkinternals.h:
+       Start implementing display/screen closing scheme; keep a
+       flag for whether displays and screens are closed,
+       call g_object_run_dispose(). Remove public gdk_screen_close().
+
+       * gdk/x11/gdkdisplay-x11.c gdk/x11/gdkscreen-x11.c: Add 
+       dispose() methods; move appropriate parts of the finalize
+       there.
+
+       * gdk/x11/gdkcolor-x11.c gdk/x11/gdkimage-x11.c
+       gdk/x11/gdkmain-x11.c gdk/x11/gdkpango-x11.c 
+       gdk/x11/gdkpixmap-x11.c gdk/x11/gdkproperty-x11.c
+       gdk/x11/gdkselection-x11.c gdk/x11/gdkwindow-x11.c:
+       Start of making everything correctly ignore operations
+       when a display has been closed.
+
+       * gdk/x11/gdkwindow-x11.c (gdk_window_get_decorations):
+       Handle decorations == NULL.
+
+       * gdk/x11/gdkcolor-x11.c (gdk_colormap_remove): 
+       Remove unnecessary hash table creation.
+
+       * gdk/x11/gdkinput.c gdk/x11/gdkinput-x11.c gdk/win32/gdkinput.c
+       Fix up gdk_device_get_history - handle events, n_events == NULL,
+       etc.
+
+       * gdk/x11/gdkproperty-x11.c (gdk_property_get):
+       Handle failure better.
+       
+       * gdk/x11/gdkselection-x11.c (gdk_selection_property_get):
+       Handle failure better, handle data == NULL, move docs
+       here, remove an excess round trip by asking for
+       all selection data at once.
+       
+       * gdk/gdkselection.c gdk/win32/{x11,win32}/gdkselection-{x11,win32}.c
+         gdk/{x11,win32}/gdkmain-{x11,win32}.c gdk/gdkdisplay.c: Move
+       gdk_text_property_to_text_list(), gdk_string_to_compound_text(),
+       gdk_display_set_sm_client_id() to display-independent part of GDK.
+
+       * gdk/Makefile.am (gdk_c_sources): Sort gdkdisplay/screen.[ch]
+       into the right place.
+
 2002-07-31  jacob berkman  <jacob@ximian.com>
 
        * gtk/queryimmodules.c (print_escaped): escape_string() only takes
index 6396eece8bbc92aa21f244b52b4c2cf38cb22293..88a2375ed9bf8ff1a78c17b86a889e0e48c8cab1 100644 (file)
@@ -1,3 +1,47 @@
+Thu Aug  1 11:26:03 2002  Owen Taylor  <otaylor@redhat.com>
+
+       * gdk/gdkdisplay.[ch] gdk/gdkscreen.[ch] gdkinternals.h:
+       Start implementing display/screen closing scheme; keep a
+       flag for whether displays and screens are closed,
+       call g_object_run_dispose(). Remove public gdk_screen_close().
+
+       * gdk/x11/gdkdisplay-x11.c gdk/x11/gdkscreen-x11.c: Add 
+       dispose() methods; move appropriate parts of the finalize
+       there.
+
+       * gdk/x11/gdkcolor-x11.c gdk/x11/gdkimage-x11.c
+       gdk/x11/gdkmain-x11.c gdk/x11/gdkpango-x11.c 
+       gdk/x11/gdkpixmap-x11.c gdk/x11/gdkproperty-x11.c
+       gdk/x11/gdkselection-x11.c gdk/x11/gdkwindow-x11.c:
+       Start of making everything correctly ignore operations
+       when a display has been closed.
+
+       * gdk/x11/gdkwindow-x11.c (gdk_window_get_decorations):
+       Handle decorations == NULL.
+
+       * gdk/x11/gdkcolor-x11.c (gdk_colormap_remove): 
+       Remove unnecessary hash table creation.
+
+       * gdk/x11/gdkinput.c gdk/x11/gdkinput-x11.c gdk/win32/gdkinput.c
+       Fix up gdk_device_get_history - handle events, n_events == NULL,
+       etc.
+
+       * gdk/x11/gdkproperty-x11.c (gdk_property_get):
+       Handle failure better.
+       
+       * gdk/x11/gdkselection-x11.c (gdk_selection_property_get):
+       Handle failure better, handle data == NULL, move docs
+       here, remove an excess round trip by asking for
+       all selection data at once.
+       
+       * gdk/gdkselection.c gdk/win32/{x11,win32}/gdkselection-{x11,win32}.c
+         gdk/{x11,win32}/gdkmain-{x11,win32}.c gdk/gdkdisplay.c: Move
+       gdk_text_property_to_text_list(), gdk_string_to_compound_text(),
+       gdk_display_set_sm_client_id() to display-independent part of GDK.
+
+       * gdk/Makefile.am (gdk_c_sources): Sort gdkdisplay/screen.[ch]
+       into the right place.
+
 2002-07-31  jacob berkman  <jacob@ximian.com>
 
        * gtk/queryimmodules.c (print_escaped): escape_string() only takes
index 11652afcbdaa4324ff72d5e892e303447399063b..d1bade54046decb35b6295cbf0758a66add815fb 100644 (file)
@@ -265,21 +265,13 @@ form.
 
 <!-- ##### FUNCTION gdk_selection_property_get ##### -->
 <para>
-Retrieves selection data that was stored by the selection
-data in response to a call to gdk_selection_convert().
 </para>
 
-@requestor: the window on which the data is stored
-@data: location to store a pointer to the retrieved data.
-       If the retrieval failed, %NULL we be stored here, otherwise, it
-       will be non-%NULL and the returned data should be freed with g_free()
-       when you are finished using it. The length of the
-       allocated memory is one more than the the length
-       of the returned data, and the final byte will always
-       be zero, to ensure nul-termination of strings.
-@prop_type: location to store the type of the property.
-@prop_format: location to store the format of the property.
-@Returns: the length of the retrieved data.
+@requestor: 
+@data: 
+@prop_type: 
+@prop_format: 
+@Returns: 
 
 
 <!-- ##### FUNCTION gdk_selection_send_notify ##### -->
index 8881a31244bd03481db72bf72cfc5bb05cb8ab70..62ae6275bd77bdc6ad689efdd56e285f695ef2e3 100644 (file)
@@ -91,6 +91,7 @@ gdk_public_h_sources = @STRIP_BEGIN@          \
        gdk.h                                   \
        gdkcolor.h                              \
        gdkcursor.h                             \
+       gdkdisplay.h                            \
        gdkdnd.h                                \
        gdkdrawable.h                           \
        gdkevents.h                             \
@@ -108,12 +109,11 @@ gdk_public_h_sources = @STRIP_BEGIN@              \
        gdkproperty.h                           \
        gdkregion.h                             \
        gdkrgb.h                                \
+       gdkscreen.h                             \
        gdkselection.h                          \
        gdktypes.h                              \
        gdkvisual.h                             \
        gdkwindow.h                             \
-       gdkdisplay.h                            \
-       gdkscreen.h                             \
 @STRIP_END@
 
 gdk_headers = @STRIP_BEGIN@       \
@@ -126,6 +126,7 @@ gdk_c_sources = @STRIP_BEGIN@       \
        gdk.c                   \
        gdkcolor.c              \
        gdkcursor.c             \
+       gdkdisplay.c            \
        gdkdraw.c               \
        gdkevents.c             \
        gdkfont.c               \
@@ -147,11 +148,10 @@ gdk_c_sources = @STRIP_BEGIN@     \
        gdkrectangle.c          \
        gdkregion-generic.c     \
        gdkregion-generic.h     \
+       gdkscreen.c             \
        gdkselection.c          \
        gdkvisual.c             \
        gdkwindow.c             \
-       gdkdisplay.c            \
-       gdkscreen.c             \
 @STRIP_END@
 
 #
index 2351d1d54328d0e795b9fd82bd7dfbef930382c5..05c9293893e69c5a066c2de344d514ca95093dea 100644 (file)
@@ -29,6 +29,7 @@
 
 static void gdk_display_class_init (GdkDisplayClass *class);
 static void gdk_display_init       (GdkDisplay      *display);
+static void gdk_display_dispose    (GObject         *object);
 static void gdk_display_finalize   (GObject         *object);
 
 static GObjectClass *parent_class;
@@ -67,6 +68,7 @@ gdk_display_class_init (GdkDisplayClass *class)
   parent_class = g_type_class_peek_parent (class);
 
   object_class->finalize = gdk_display_finalize;
+  object_class->dispose = gdk_display_dispose;
 }
 
 static void
@@ -81,6 +83,12 @@ gdk_display_init (GdkDisplay *display)
   display->double_click_time = 250;
 }
 
+static void
+gdk_display_dispose (GObject *object)
+{
+  GdkDisplay *display = GDK_DISPLAY_OBJECT (object);
+}
+
 static void
 gdk_display_finalize (GObject *object)
 {
@@ -99,13 +107,22 @@ gdk_display_finalize (GObject *object)
  * gdk_display_close:
  * @display: a #GdkDisplay
  *
- * Closes and cleanup the resources used by the @display
+ * Closes the connection windowing system for the given display,
+ * and cleans up associated resources.
  */
 void
 gdk_display_close (GdkDisplay *display)
 {
   g_return_if_fail (GDK_IS_DISPLAY (display));
-  g_object_unref (G_OBJECT (display));
+
+  if (!display->closed)
+    {
+      display->closed = TRUE;
+
+      g_object_run_dispose (G_OBJECT (display));
+      
+      g_object_unref (G_OBJECT (display));
+    }
 }
 
 /**
@@ -294,3 +311,24 @@ gdk_display_get_core_pointer (GdkDisplay *display)
 {
   return display->core_pointer;
 }
+
+/**
+ * gdk_set_sm_client_id:
+ * @sm_client_id: the client id assigned by the session manager when the
+ *    connection was opened, or %NULL to remove the property.
+ * 
+ * Sets the <literal>SM_CLIENT_ID</literal> property on the application's leader window so that
+ * the window manager can save the application's state using the X11R6 ICCCM
+ * session management protocol.
+ *
+ * See the X Session Management Library documentation for more information on
+ * session management and the Inter-Client Communication Conventions Manual
+ * (ICCCM) for information on the <literal>WM_CLIENT_LEADER</literal> property. 
+ * (Both documents are part of the X Window System distribution.)
+ **/
+void
+gdk_set_sm_client_id (const gchar* sm_client_id)
+{
+  gdk_display_set_sm_client_id (gdk_display_get_default (), sm_client_id);
+}
+
index 61419932d464d4bf762a7e057a61172cb85ee0b7..25ed1e301d0021e34e4302bfc3095d55473a11d4 100644 (file)
@@ -55,9 +55,10 @@ struct _GdkDisplay
   GdkWindow *button_window[2];  /* The last 2 windows to receive button presses. */
   guint button_number[2];       /* The last 2 buttons to be pressed. */
 
+  guint double_click_time;     /* Maximum time between clicks in msecs */
   GdkDevice *core_pointer;     /* Core pointer device */
 
-  guint double_click_time;                    /* Maximum time between clicks in msecs */
+  guint closed : 1;            /* Whether this display has been closed */
 };
 
 struct _GdkDisplayClass
index c31dc1615c7b99857160270804e61b1dcc9d4bde..632c13096925a292df303f3e5a067e7c0b256232 100644 (file)
@@ -216,7 +216,8 @@ GdkImage *_gdk_drawable_copy_to_image (GdkDrawable  *drawable,
 void       _gdk_window_destroy           (GdkWindow   *window,
                                          gboolean     foreign_destroy);
 void       _gdk_window_clear_update_area (GdkWindow   *window);
-      
+
+void       _gdk_screen_close             (GdkScreen   *screen);
 
 /*****************************************
  * Interfaces provided by windowing code *
index c28855e2c2476b4b12f8f8567acbff7a5a983fc9..e822d6466fbd351590a61431dd98e5dfc8394889 100644 (file)
@@ -54,20 +54,16 @@ gdk_screen_get_type (void)
   return object_type;
 }
 
-
-/**
- * gdk_screen_close:
- * @screen: a #GdkScreen
- *
- * Closes the @screen connection and cleanup its resources.
- * Note that this function is called automatically by gdk_display_close().
- **/
 void 
-gdk_screen_close (GdkScreen *screen)
+_gdk_screen_close (GdkScreen *screen)
 {
   g_return_if_fail (GDK_IS_SCREEN (screen));
-  
-  g_object_run_dispose (G_OBJECT (screen));
+
+  if (!screen->closed)
+    {
+      screen->closed = TRUE;
+      g_object_run_dispose (G_OBJECT (screen));
+    }
 }
 
 /**
index d4d26dd91d3c4c70cf6baded6150ccd44a2b26f4..6ca97bfc496d51417cc3a8ffbe8c49d248924117 100644 (file)
@@ -41,6 +41,8 @@ typedef struct _GdkScreenClass GdkScreenClass;
 struct _GdkScreen
 {
   GObject parent_instance;
+
+  guint closed : 1;
 };
 
 struct _GdkScreenClass
@@ -67,7 +69,6 @@ gint         gdk_screen_get_width             (GdkScreen   *screen);
 gint         gdk_screen_get_height            (GdkScreen   *screen);
 gint         gdk_screen_get_width_mm          (GdkScreen   *screen);
 gint         gdk_screen_get_height_mm         (GdkScreen   *screen);
-void        gdk_screen_close                 (GdkScreen   *screen);
 
 GList *      gdk_screen_list_visuals          (GdkScreen   *screen);
 GList *      gdk_screen_get_toplevel_windows  (GdkScreen   *screen);
index df501957f0c883dd401b318a2bb4f72ea7e2bb21..4aecef88643e347eed07de618cec4cff8d9ce220 100644 (file)
@@ -32,6 +32,17 @@ gdk_selection_send_notify (guint32  requestor,
                                         target, property, time);
 }
 
+gint
+gdk_text_property_to_text_list (GdkAtom       encoding,
+                               gint          format, 
+                               const guchar *text,
+                               gint          length,
+                               gchar      ***list)
+{
+  return gdk_text_property_to_text_list_for_display (gdk_display_get_default (),
+                                                    encoding, format, text, length, list);
+}
+
 /**
  * gdk_text_property_to_utf8_list:
  * @encoding: an atom representing the encoding of the text
@@ -58,6 +69,18 @@ gdk_text_property_to_utf8_list (GdkAtom        encoding,
                                                     encoding, format, text, length, list);
 }
 
+gint
+gdk_string_to_compound_text (const gchar *str,
+                            GdkAtom     *encoding,
+                            gint        *format,
+                            guchar     **ctext,
+                            gint        *length)
+{
+  return gdk_string_to_compound_text_for_display (gdk_display_get_default (),
+                                                 str, encoding, format, 
+                                                 ctext, length);
+}
+
 /**
  * gdk_utf8_to_compound_text:
  * @str:      a UTF-8 string
index 767ed2b9f56420836a3b2aa58f9dbfe9b0012da5..21bc7f2ee4f80a744c7bbc2bfd09241052391ad0 100644 (file)
@@ -184,8 +184,10 @@ gdk_device_get_history  (GdkDevice         *device,
   g_return_val_if_fail (events != NULL, FALSE);
   g_return_val_if_fail (n_events != NULL, FALSE);
 
-  *n_events = 0;
-  *events = NULL;
+  if (n_events)
+    *n_events = 0;
+  if (events)
+    *events = NULL;
 
   if (GDK_WINDOW_DESTROYED (window))
     return FALSE;
index a762cee78ed27fbd8bd22099fb96eb1331503f7d..40926eddc025313f7b67e7d48ad85a3cdada898d 100644 (file)
@@ -181,7 +181,7 @@ gdk_screen_get_height_mm (GdkScreen *screen)
 }
 
 void
-gdk_set_sm_client_id (const gchar* sm_client_id)
+gdk_display_set_sm_client_id (const gchar* sm_client_id)
 {
   g_warning("gdk_set_sm_client_id %s", sm_client_id ? sm_client_id : "NULL");
 }
index d6b9d82eee28589dce74d884ee2e44c75f9e2fa9..fcbd5cb599272557a5da958f92841f05e186a834 100644 (file)
@@ -560,11 +560,11 @@ gdk_selection_send_notify_for_display (GdkDisplay *display,
 /* Simplistic implementations of text list and compound text functions */
 
 gint
-gdk_text_property_to_text_list (GdkAtom       encoding,
-                               gint          format, 
-                               const guchar *text,
-                               gint          length,
-                               gchar      ***list)
+gdk_text_property_to_text_list_for_display (GdkAtom       encoding,
+                                           gint          format, 
+                                           const guchar *text,
+                                           gint          length,
+                                           gchar      ***list)
 {
   gchar *enc_name;
 
@@ -592,11 +592,11 @@ gdk_free_text_list (gchar **list)
 }
 
 gint
-gdk_string_to_compound_text (const gchar *str,
-                            GdkAtom     *encoding,
-                            gint        *format,
-                            guchar     **ctext,
-                            gint        *length)
+gdk_string_to_compound_text_for_display (const gchar *str,
+                                        GdkAtom     *encoding,
+                                        gint        *format,
+                                        guchar     **ctext,
+                                        gint        *length)
 {
   GDK_NOTE (DND, g_print ("gdk_string_to_compound_text: %.20s\n", str));
 
index 93f39293739f12e8b9cfb623503d99fc7919db38..40be6ef6c079f7273ca25fe2b8ab14713e079f4c 100644 (file)
@@ -131,7 +131,8 @@ gdk_colormap_finalize (GObject *object)
 
   gdk_colormap_remove (colormap);
 
-  XFreeColormap (GDK_SCREEN_XDISPLAY (private->screen), private->xcolormap);
+  if (!private->screen->closed)
+    XFreeColormap (GDK_SCREEN_XDISPLAY (private->screen), private->xcolormap);
 
   if (private->hash)
     g_hash_table_destroy (private->hash);
@@ -278,7 +279,7 @@ gdk_colormap_sync_palette (GdkColormap *colormap)
          nlookup++;
        }
     }
-  
+
   XQueryColors (GDK_SCREEN_XDISPLAY (private->screen),
                private->xcolormap, xpalette, nlookup);
   
@@ -334,9 +335,12 @@ gdk_colormap_sync (GdkColormap *colormap,
 {
   time_t current_time;
   GdkColormapPrivateX11 *private = GDK_COLORMAP_PRIVATE_DATA (colormap);
-  
+
   g_return_if_fail (GDK_IS_COLORMAP (colormap));
 
+  if (private->screen->closed)
+    return;
+
   current_time = time (NULL);
   if (!force && ((current_time - private->last_sync_time) < MIN_SYNC_TIME))
     return;
@@ -434,6 +438,9 @@ gdk_colormap_change (GdkColormap *colormap,
 
   private = GDK_COLORMAP_PRIVATE_DATA (colormap);
 
+  if (private->screen->closed)
+    return;
+
   xdisplay = GDK_SCREEN_XDISPLAY (private->screen);
   palette = g_new (XColor, ncolors);
 
@@ -519,6 +526,9 @@ gdk_colors_alloc (GdkColormap   *colormap,
 
   private = GDK_COLORMAP_PRIVATE_DATA (colormap);
 
+  if (private->screen->closed)
+    return FALSE;
+
   return_val = XAllocColorCells (GDK_SCREEN_XDISPLAY (private->screen),
                                 private->xcolormap,contiguous, planes,
                                 nplanes, pixels, npixels);
@@ -577,7 +587,7 @@ gdk_colors_free (GdkColormap *colormap,
        }
     }
 
-  if (npixels)
+  if (npixels && !private->screen->closed)
     XFreeColors (GDK_SCREEN_XDISPLAY (private->screen), private->xcolormap,
                 pixels, npixels, planes);
   g_free (pixels);
@@ -625,7 +635,7 @@ gdk_colormap_free_colors (GdkColormap *colormap,
        }
     }
 
-  if (npixels)
+  if (npixels && !private->screen->closed)
     XFreeColors (GDK_SCREEN_XDISPLAY (private->screen), private->xcolormap,
                 pixels, npixels, 0);
 
@@ -979,11 +989,14 @@ gdk_colormap_alloc_colors (GdkColormap *colormap,
   gint nremaining = 0;
   XColor xcolor;
 
-  g_return_val_if_fail (GDK_IS_COLORMAP (colormap), FALSE);
-  g_return_val_if_fail (colors != NULL, FALSE);
+  g_return_val_if_fail (GDK_IS_COLORMAP (colormap), ncolors);
+  g_return_val_if_fail (colors != NULL, ncolors);
 
   private = GDK_COLORMAP_PRIVATE_DATA (colormap);
 
+  if (private->screen->closed)
+    return ncolors;
+
   for (i=0; i<ncolors; i++)
     {
       success[i] = FALSE;
@@ -1051,7 +1064,7 @@ gdk_colormap_alloc_colors (GdkColormap *colormap,
  * #GdkImage contains image data in hardware format, a #GdkPixbuf
  * contains image data in a canonical 24-bit RGB format.)
  *
- * This function is rarely useful, it's used for example to
+ * This function is rarely useful; it's used for example to
  * implement the eyedropper feature in #GtkColorSelection.
  * 
  **/
@@ -1083,10 +1096,15 @@ gdk_colormap_query_color (GdkColormap *colormap,
     break;
   case GDK_VISUAL_STATIC_COLOR:
     xcolor.pixel = pixel;
-    XQueryColor (GDK_SCREEN_XDISPLAY (private->screen), private->xcolormap, &xcolor);
-    result->red = xcolor.red;
-    result->green = xcolor.green;
-    result->blue =  xcolor.blue;
+    if (!private->screen->closed)
+      {
+       XQueryColor (GDK_SCREEN_XDISPLAY (private->screen), private->xcolormap, &xcolor);
+       result->red = xcolor.red;
+       result->green = xcolor.green;
+       result->blue =  xcolor.blue;
+      }
+    else
+      result->red = result->green = result->blue = 0;
     break;
   case GDK_VISUAL_PSEUDO_COLOR:
     g_return_if_fail (pixel < colormap->size);
@@ -1117,7 +1135,8 @@ gdk_color_change (GdkColormap *colormap,
   xcolor.flags = DoRed | DoGreen | DoBlue;
 
   private = GDK_COLORMAP_PRIVATE_DATA (colormap);
-  XStoreColor (GDK_SCREEN_XDISPLAY (private->screen), private->xcolormap, &xcolor);
+  if (!private->screen->closed)
+    XStoreColor (GDK_SCREEN_XDISPLAY (private->screen), private->xcolormap, &xcolor);
 
   return TRUE;
 }
@@ -1252,10 +1271,6 @@ gdk_colormap_remove (GdkColormap *cmap)
 {
   GdkColormapPrivateX11 *private;
 
-  if (!colormap_hash)
-    colormap_hash = g_hash_table_new ((GHashFunc) gdk_colormap_hash,
-                                     (GEqualFunc) gdk_colormap_equal);
-
   private = GDK_COLORMAP_PRIVATE_DATA (cmap);
 
   g_hash_table_remove (colormap_hash, &private->xcolormap);
@@ -1295,7 +1310,10 @@ gdk_x11_colormap_get_xcolormap (GdkColormap *colormap)
 
   private = GDK_COLORMAP_PRIVATE_DATA (colormap);
 
-  return private->xcolormap;
+  if (private->screen->closed)
+    return None;
+  else
+    return private->xcolormap;
 }
 
 /**
index 813b9acec95d325cf51a1403b56119ad4aca61a1..f7ce4bf8646c909f97dfd662a397c69f609ba918 100644 (file)
@@ -109,7 +109,11 @@ gdk_cursor_new_for_display (GdkDisplay    *display,
 
   g_return_val_if_fail (GDK_IS_DISPLAY (display), NULL);
 
-  xcursor = XCreateFontCursor (GDK_DISPLAY_XDISPLAY (display), cursor_type);
+  if (display->closed)
+    xcursor = None;
+  else
+    xcursor = XCreateFontCursor (GDK_DISPLAY_XDISPLAY (display), cursor_type);
+  
   private = g_new (GdkCursorPrivate, 1);
   private->display = display;
   private->xcursor = xcursor;
@@ -153,8 +157,11 @@ gdk_cursor_new_from_pixmap (GdkPixmap *source,
   xbg.blue = bg->blue;
   xbg.green = bg->green;
   
-  xcursor = XCreatePixmapCursor (GDK_DISPLAY_XDISPLAY (display),
-                                source_pixmap, mask_pixmap, &xfg, &xbg, x, y);
+  if (display->closed)
+    xcursor = None;
+  else
+    xcursor = XCreatePixmapCursor (GDK_DISPLAY_XDISPLAY (display),
+                                  source_pixmap, mask_pixmap, &xfg, &xbg, x, y);
   private = g_new (GdkCursorPrivate, 1);
   private->display = display;
   private->xcursor = xcursor;
@@ -174,7 +181,8 @@ _gdk_cursor_destroy (GdkCursor *cursor)
   g_return_if_fail (cursor->ref_count == 0);
 
   private = (GdkCursorPrivate *) cursor;
-  XFreeCursor (GDK_DISPLAY_XDISPLAY (private->display), private->xcursor);
+  if (!private->display->closed && private->xcursor)
+    XFreeCursor (GDK_DISPLAY_XDISPLAY (private->display), private->xcursor);
 
   g_free (private);
 }
index 6fa8803c597b88b6ccd5c676919eb60465c13af7..28cea282bff8384ce0bf3c7813ba04392077b738 100644 (file)
@@ -42,6 +42,7 @@
 #endif
 
 static void                 gdk_display_x11_class_init         (GdkDisplayX11Class *class);
+static void                 gdk_display_x11_dispose            (GObject            *object);
 static void                 gdk_display_x11_finalize           (GObject            *object);
 
 static void gdk_internal_connection_watch (Display  *display,
@@ -83,7 +84,10 @@ _gdk_display_x11_get_type (void)
 static void
 gdk_display_x11_class_init (GdkDisplayX11Class * class)
 {
-  G_OBJECT_CLASS (class)->finalize = gdk_display_x11_finalize;
+  GObjectClass *object_class = G_OBJECT_CLASS (class);
+  
+  object_class->dispose = gdk_display_x11_dispose;
+  object_class->finalize = gdk_display_x11_finalize;
   
   parent_class = g_type_class_peek_parent (class);
 }
@@ -478,6 +482,23 @@ gdk_x11_display_ungrab (GdkDisplay * display)
     XUngrabServer (display_x11->xdisplay);
 }
 
+static void
+gdk_display_x11_dispose (GObject *object)
+{
+  GdkDisplayX11 *display_x11;
+  gint i;
+  
+  display_x11 = GDK_DISPLAY_X11 (object);;
+  
+  for (i = 0; i < ScreenCount (display_x11->xdisplay); i++)
+    _gdk_screen_close (display_x11->screens[i]);
+
+  XCloseDisplay (display_x11->xdisplay);
+  display_x11->xdisplay = NULL;
+
+  G_OBJECT_CLASS (parent_class)->dispose (object);
+}
+
 static void
 gdk_display_x11_finalize (GObject *object)
 {
@@ -517,7 +538,6 @@ gdk_display_x11_finalize (GObject *object)
   for (i = 0; i < ScreenCount (display_x11->xdisplay); i++)
     g_object_unref (G_OBJECT (display_x11->screens[i]));
   g_free (display_x11->screens);
-  XCloseDisplay (display_x11->xdisplay);
   G_OBJECT_CLASS (parent_class)->finalize (object);
 }
 
@@ -582,5 +602,3 @@ gdk_x11_display_get_xdisplay (GdkDisplay  *display)
 {
   return GDK_DISPLAY_X11 (display)->xdisplay;
 }
-
-
index 7836c06bd54fc14137ae81a3e11266659dbd0a19..6bbff5fc30b5202e11437e38f8526bbbc417a945 100644 (file)
@@ -142,28 +142,49 @@ _gdk_image_exit (void)
     }
 }
 
+/**
+ * gdk_image_new_bitmap:
+ * @visual: the #GdkVisual to use for the image.
+ * @data: the pixel data. 
+ * @w: the width of the image in pixels. 
+ * @h: the height of the image in pixels. 
+ * 
+ * Creates a new #GdkImage with a depth of 1 from the given data.
+ * <warning><para>THIS FUNCTION IS INCREDIBLY BROKEN. The passed-in data must 
+ * be allocated by malloc() (NOT g_malloc()) and will be freed when the 
+ * image is freed.</para></warning>
+ * 
+ * Return value: a new #GdkImage.
+ **/
 GdkImage *
 gdk_image_new_bitmap(GdkVisual *visual, gpointer data, gint w, gint h)
-/*
- * Desc: create a new bitmap image
- */
 {
   Visual *xvisual;
   GdkImage *image;
+  GdkDisplay *display;
   GdkImagePrivateX11 *private;
+  
   image = g_object_new (gdk_image_get_type (), NULL);
   private = PRIVATE_DATA (image);
   private->screen = gdk_visual_get_screen (visual);
+  display = GDK_SCREEN_DISPLAY (private->screen);
+  
   image->type = GDK_IMAGE_NORMAL;
   image->visual = visual;
   image->width = w;
   image->height = h;
   image->depth = 1;
   image->bits_per_pixel = 1;
-  xvisual = ((GdkVisualPrivate*) visual)->xvisual;
-  private->ximage = XCreateImage (GDK_SCREEN_XDISPLAY (private->screen),
-                                 xvisual, 1, XYBitmap,
-                                 0, 0, w ,h, 8, 0);
+  if (display->closed)
+    private->ximage = NULL;
+  else
+    {
+      xvisual = ((GdkVisualPrivate*) visual)->xvisual;
+      private->ximage = XCreateImage (GDK_SCREEN_XDISPLAY (private->screen),
+                                     xvisual, 1, XYBitmap,
+                                     0, 0, w ,h, 8, 0);
+    }
+  
   private->ximage->data = data;
   private->ximage->bitmap_bit_order = MSBFirst;
   private->ximage->byte_order = MSBFirst;
@@ -174,14 +195,14 @@ gdk_image_new_bitmap(GdkVisual *visual, gpointer data, gint w, gint h)
   return(image);
 } /* gdk_image_new_bitmap() */
 
-static int
-gdk_image_check_xshm(Display *display)
 /* 
  * Desc: query the server for support for the MIT_SHM extension
  * Return:  0 = not available
  *          1 = shared XImage support available
  *          2 = shared Pixmap support available also
  */
+static int
+gdk_image_check_xshm(Display *display)
 {
 #ifdef USE_SHM
   int major, minor, ignore;
@@ -410,6 +431,9 @@ _gdk_x11_image_get_shm_pixmap (GdkImage *image)
   GdkImagePrivateX11 *private = PRIVATE_DATA (image);
   GdkDisplay *display = GDK_SCREEN_DISPLAY (private->screen);
 
+  if (display->closed)
+    return None;
+
 #ifdef USE_SHM  
   /* Future: do we need one of these per-screen per-image? ShmPixmaps
    * are the same for every screen, but can they be shared? Not a concern
@@ -500,7 +524,9 @@ _gdk_x11_copy_to_image (GdkDrawable    *drawable,
   impl = GDK_DRAWABLE_IMPL_X11 (drawable);
   display = gdk_drawable_get_display (drawable);
   xdisplay = gdk_x11_display_get_xdisplay (display);
-  
+
+  if (display->closed)
+    return NULL;
   
   have_grab = FALSE;
 
@@ -674,7 +700,10 @@ gdk_image_get_pixel (GdkImage *image,
 
   private = PRIVATE_DATA (image);
 
-  pixel = XGetPixel (private->ximage, x, y);
+  if (!private->screen->closed)
+    pixel = XGetPixel (private->ximage, x, y);
+  else
+    pixel = 0;
 
   return pixel;
 }
@@ -691,7 +720,8 @@ gdk_image_put_pixel (GdkImage *image,
 
   private = PRIVATE_DATA (image);
 
-  pixel = XPutPixel (private->ximage, x, y, pixel);
+  if (!private->screen->closed)
+    pixel = XPutPixel (private->ximage, x, y, pixel);
 }
 
 static void
@@ -717,20 +747,25 @@ gdk_x11_image_destroy (GdkImage *image)
       switch (image->type)
        {
        case GDK_IMAGE_NORMAL:
-         XDestroyImage (private->ximage);
+         if (!private->screen->closed)
+           XDestroyImage (private->ximage);
          break;
          
        case GDK_IMAGE_SHARED:
 #ifdef USE_SHM
-         gdk_display_sync (GDK_SCREEN_DISPLAY (private->screen));
+         if (!private->screen->closed)
+           {
+             gdk_display_sync (GDK_SCREEN_DISPLAY (private->screen));
 
-         if (private->shm_pixmap)
-           XFreePixmap (GDK_SCREEN_XDISPLAY (private->screen), private->shm_pixmap);
+             if (private->shm_pixmap)
+               XFreePixmap (GDK_SCREEN_XDISPLAY (private->screen), private->shm_pixmap);
                  
-         image_list = g_list_remove (image_list, image);
-         XShmDetach (GDK_SCREEN_XDISPLAY (private->screen), private->x_shm_info);
-         XDestroyImage (private->ximage);
+             XShmDetach (GDK_SCREEN_XDISPLAY (private->screen), private->x_shm_info);
+             XDestroyImage (private->ximage);
+           }
          
+         image_list = g_list_remove (image_list, image);
+
          x_shm_info = private->x_shm_info;
          shmdt (x_shm_info->shmaddr);
          
@@ -772,7 +807,10 @@ gdk_x11_image_get_ximage (GdkImage *image)
 
   private = PRIVATE_DATA (image);
 
-  return private->ximage;
+  if (private->screen->closed)
+    return NULL;
+  else
+    return private->ximage;
 }
 
 gint
@@ -781,7 +819,7 @@ _gdk_windowing_get_bits_for_depth (GdkDisplay *display,
 {
   XPixmapFormatValues *formats;
   gint count, i;
-  
+
   formats = XListPixmapFormats (GDK_DISPLAY_XDISPLAY (display), &count);
   
   for (i = 0; i < count; i++)
index b54ff9d57623f98b5e05081ea7a8ee7b5fae011e..13ffb8edb8e9718cadaeb3dd5330cfc57603a292 100644 (file)
@@ -720,12 +720,7 @@ _gdk_device_get_history (GdkDevice         *device,
       return TRUE;
     }
   else
-    {
-      *events = NULL;
-      *n_events = 0;
-
-      return FALSE;
-    }
+    return FALSE;
 }
 
 void 
index 49922267822fa2de7da6b11264c375f5097b6b8f..a4af774cb6e073bb479dd9b4f8e1e4a73e21e200 100644 (file)
@@ -34,7 +34,7 @@ static void gdk_input_check_proximity (GdkDisplay *display);
 void 
 _gdk_input_init(GdkDisplay *display)
 {
-  _gdk_init_input_core ();
+  _gdk_init_input_core (display);
   GDK_DISPLAY_X11 (display)->input_ignore_core = FALSE;
   gdk_input_common_init (display, FALSE);
 }
index 24c99fe031a9779863d8225ce55b59bebd889720..79edd061218d43104241e329b01fa162ea6558d2 100644 (file)
@@ -171,6 +171,25 @@ gdk_device_set_axis_use (GdkDevice   *device,
     }
 }
 
+/**
+ * gdk_device_get_history:
+ * @device: a #GdkDevice
+ * @window: the window with respect to which which the event coordinates will be reported
+ * @start: starting timestamp for range of events to return
+ * @stop: ending timestamp for the range of events to return
+ * @events: location to store a newly-allocated array of #GdkTimeCoord, or %NULL
+ * @n_events: location to store the length of @events, or %NULL
+ * 
+ * Obtains the motion history for a device; given a starting and
+ * ending timestamp, return all events in the motion history for
+ * the device in the given range of time. Some windowing systems
+ * do not support motion history, in which case, %FALSE will
+ * be returned. (This is not distinguishable from the case where
+ * motion history is supported and no events were found.)
+ * 
+ * Return value: %TRUE if the windowing system supports motion history and
+ *  at least one event was found.
+ **/
 gboolean
 gdk_device_get_history  (GdkDevice         *device,
                         GdkWindow         *window,
@@ -179,31 +198,26 @@ gdk_device_get_history  (GdkDevice         *device,
                         GdkTimeCoord    ***events,
                         gint              *n_events)
 {
-  GdkTimeCoord **coords;
+  GdkTimeCoord **coords = NULL;
+  gboolean result = FALSE;
+  int tmp_n_events = 0;
   int i;
 
-  g_return_val_if_fail (window != NULL, FALSE);
   g_return_val_if_fail (GDK_IS_WINDOW (window), FALSE);
-  g_return_val_if_fail (events != NULL, FALSE);
-  g_return_val_if_fail (n_events != NULL, FALSE);
-
-  *n_events = 0;
-  *events = NULL;
 
   if (GDK_WINDOW_DESTROYED (window))
-    return FALSE;
-    
-  if (GDK_IS_CORE (device))
+    /* Nothing */ ;
+  else if (GDK_IS_CORE (device))
     {
       XTimeCoord *xcoords;
       
       xcoords = XGetMotionEvents (GDK_DRAWABLE_XDISPLAY (window),
                                  GDK_DRAWABLE_XID (window),
-                                 start, stop, n_events);
+                                 start, stop, &tmp_n_events);
       if (xcoords)
        {
-         coords = _gdk_device_allocate_history (device, *n_events);
-         for (i=0; i<*n_events; i++)
+         coords = _gdk_device_allocate_history (device, tmp_n_events);
+         for (i=0; i<tmp_n_events; i++)
            {
              coords[i]->time = xcoords[i].time;
              coords[i]->axes[0] = xcoords[i].x;
@@ -212,14 +226,22 @@ gdk_device_get_history  (GdkDevice         *device,
 
          XFree (xcoords);
 
-         *events = coords;
-         return TRUE;
+         result = TRUE;
        }
       else
-       return FALSE;
+       result = FALSE;
     }
   else
-    return _gdk_device_get_history (device, window, start, stop, events, n_events);
+    result = _gdk_device_get_history (device, window, start, stop, &coords, &tmp_n_events);
+
+  if (n_events)
+    *n_events = tmp_n_events;
+  if (events)
+    *events = coords;
+  else if (coords)
+    gdk_device_free_history (coords, tmp_n_events);
+
+  return result;
 }
 
 GdkTimeCoord ** 
index 36b1d2be2be670d34f61a63271a3149bb2c53b75..e38490c8f28805995b29cf0ba9cadd4d6515dac3 100644 (file)
@@ -449,26 +449,6 @@ _gdk_xgrab_check_destroy (GdkWindow *window)
      display_x11->keyboard_xgrab_window = NULL;
 }
 
-/**
- * gdk_set_sm_client_id:
- * @sm_client_id: the client id assigned by the session manager when the
- *    connection was opened, or %NULL to remove the property.
- * 
- * Sets the <literal>SM_CLIENT_ID</literal> property on the application's leader window so that
- * the window manager can save the application's state using the X11R6 ICCCM
- * session management protocol.
- *
- * See the X Session Management Library documentation for more information on
- * session management and the Inter-Client Communication Conventions Manual
- * (ICCCM) for information on the <literal>WM_CLIENT_LEADER</literal> property. 
- * (Both documents are part of the X Window System distribution.)
- **/
-void
-gdk_set_sm_client_id (const gchar* sm_client_id)
-{
-  gdk_display_set_sm_client_id (gdk_display_get_default (),sm_client_id);
-}
-
 /**
  * gdk_display_set_sm_client_id:
  * @display: a #GdkDisplay
@@ -490,6 +470,9 @@ gdk_display_set_sm_client_id (GdkDisplay  *display,
 {
   GdkDisplayX11 *display_x11 = GDK_DISPLAY_X11 (display);
 
+  if (display->closed)
+    return;
+
   if (sm_client_id && strcmp (sm_client_id, ""))
     {
       XChangeProperty (display_x11->xdisplay, display_x11->leader_window,
@@ -738,6 +721,9 @@ _gdk_send_xevent (GdkDisplay *display,
 {
   gboolean result;
 
+  if (display->closed)
+    return FALSE;
+
   gdk_error_trap_push ();
   result = XSendEvent (GDK_DISPLAY_XDISPLAY (display), window, 
                       propagate, event_mask, event_send);
@@ -787,8 +773,8 @@ gdk_x11_ungrab_server ()
  * Gets the default GTK+ screen number.
  * 
  * Return value: returns the screen number specified by
- *   the --display command line option on the DISPLAY environment
- *   variable gdk_init() calls XOpenDisplay().
+ *   the --display command line option or the DISPLAY environment
+ *   variable when gdk_init() calls XOpenDisplay().
  **/
 gint
 gdk_x11_get_default_screen (void)
index 6432e99fc0886b192f6b46edcdf55b90c7dd6f5e..bcc43e08d9e0b37962773b05f9f21ba6deedace8 100644 (file)
@@ -49,6 +49,9 @@ gdk_pango_context_get_for_screen (GdkScreen *screen)
   GdkDisplayX11 *display_x11;
   
   g_return_val_if_fail (GDK_IS_SCREEN (screen), NULL);
+
+  if (screen->closed)
+    return NULL;
   
   display_x11 = GDK_DISPLAY_X11 (GDK_SCREEN_DISPLAY (screen));
   
index f5f1de7c6a3fd387d08512d49baa754d7f7a840b..7d9c5a016ffbd0cfdeb534ba900be322fd9c35b9 100644 (file)
@@ -125,20 +125,24 @@ gdk_pixmap_impl_x11_finalize (GObject *object)
 {
   GdkPixmapImplX11 *impl = GDK_PIXMAP_IMPL_X11 (object);
   GdkPixmap *wrapper = GDK_PIXMAP (GDK_DRAWABLE_IMPL_X11 (impl)->wrapper);
+  GdkDisplay *display = GDK_PIXMAP_DISPLAY (wrapper);
 
+  if (!display->closed)
+    {
 #ifdef HAVE_XFT  
-  {
-    GdkDrawableImplX11 *draw_impl = GDK_DRAWABLE_IMPL_X11 (impl);
-
-    if (draw_impl->picture)
-      XRenderFreePicture (GDK_PIXMAP_XDISPLAY (wrapper), draw_impl->picture);
-  }
+      {
+       GdkDrawableImplX11 *draw_impl = GDK_DRAWABLE_IMPL_X11 (impl);
+       
+       if (draw_impl->picture)
+         XRenderFreePicture (GDK_DISPLAY_XDISPLAY (display), draw_impl->picture);
+      }
 #endif /* HAVE_XFT */  
 
-  if (!impl->is_foreign)
-    XFreePixmap (GDK_PIXMAP_XDISPLAY (wrapper), GDK_PIXMAP_XID (wrapper));
-  
-  _gdk_xid_table_remove (GDK_PIXMAP_DISPLAY (wrapper), GDK_PIXMAP_XID (wrapper));
+      if (!impl->is_foreign)
+       XFreePixmap (GDK_DISPLAY_XDISPLAY (display), GDK_PIXMAP_XID (wrapper));
+    }
+      
+  _gdk_xid_table_remove (display, GDK_PIXMAP_XID (wrapper));
   
   G_OBJECT_CLASS (parent_class)->finalize (object);
 }
index 2ddde8c649e7f369098f7eeb19f5771943566b28..162d16b557dd14880e21e5ac872f73465592b9d9 100644 (file)
@@ -111,7 +111,7 @@ static gchar *XAtomsStrings[] = {
   "CAP_HEIGHT",
   "WM_CLASS",
   "WM_TRANSIENT_FOR",
-  /* Below here, these our our additions. Increment N_CUSTOM_PREDEFINED
+  /* Below here, these are our additions. Increment N_CUSTOM_PREDEFINED
    * if you add any.
    */
   "CLIPBOARD"                  /* = 69 */
@@ -160,6 +160,9 @@ gdk_x11_atom_to_xatom_for_display (GdkDisplay *display,
   Atom xatom = None;
   
   g_return_val_if_fail (GDK_IS_DISPLAY (display), None);
+
+  if (display->closed)
+    return None;
   
   display_x11 = GDK_DISPLAY_X11 (display); 
   
@@ -216,7 +219,10 @@ gdk_x11_xatom_to_atom_for_display (GdkDisplay *display,
   GdkDisplayX11 *display_x11;
   GdkAtom virtual_atom = GDK_NONE;
   
-  g_return_val_if_fail (GDK_IS_DISPLAY (display), virtual_atom);
+  g_return_val_if_fail (GDK_IS_DISPLAY (display), GDK_NONE);
+
+  if (display->closed)
+    return GDK_NONE;
 
   display_x11 = GDK_DISPLAY_X11 (display);
   
@@ -425,6 +431,7 @@ gdk_property_get (GdkWindow   *window,
   guchar *ret_data;
   Atom xproperty;
   Atom xtype;
+  int res;
 
   g_return_val_if_fail (!window || GDK_IS_WINDOW (window), FALSE);
 
@@ -436,20 +443,23 @@ gdk_property_get (GdkWindow   *window,
       GDK_NOTE (MULTIHEAD, g_message ("gdk_property_get(): window is NULL\n"));
     }
 
+  if (GDK_WINDOW_DESTROYED (window))
+    return FALSE;
+
   display = gdk_drawable_get_display (window);
   xproperty = gdk_x11_atom_to_xatom_for_display (display, property);
   xtype = gdk_x11_atom_to_xatom_for_display (display, type);
 
   ret_data = NULL;
   
-  XGetWindowProperty (GDK_DISPLAY_XDISPLAY (display),
-                     GDK_WINDOW_XWINDOW (window), xproperty,
-                     offset, (length + 3) / 4, pdelete,
-                     xtype, &ret_prop_type, &ret_format,
-                     &ret_nitems, &ret_bytes_after,
-                     &ret_data);
-
-  if ((ret_prop_type == None) && (ret_format == 0))
+  res = XGetWindowProperty (GDK_DISPLAY_XDISPLAY (display),
+                           GDK_WINDOW_XWINDOW (window), xproperty,
+                           offset, (length + 3) / 4, pdelete,
+                           xtype, &ret_prop_type, &ret_format,
+                           &ret_nitems, &ret_bytes_after,
+                           &ret_data);
+
+  if (res != Success || (ret_prop_type == None && ret_format == 0))
     {
       return FALSE;
     }
@@ -549,6 +559,9 @@ gdk_property_change (GdkWindow    *window,
     }
 
 
+  if (GDK_WINDOW_DESTROYED (window))
+    return;
+
   display = gdk_drawable_get_display (window);
   
   xproperty = gdk_x11_atom_to_xatom_for_display (display, property);
index 91b7d6858dd75b34efe2f107c2322870a10b738b..cab6a9ad6c661609613221cf7b779ebb2637c3fc 100644 (file)
@@ -36,6 +36,7 @@
 #endif
 
 static void         gdk_screen_x11_class_init  (GdkScreenX11Class *klass);
+static void         gdk_screen_x11_dispose     (GObject                  *object);
 static void         gdk_screen_x11_finalize    (GObject                  *object);
 static void        init_xinerama_support      (GdkScreen         *screen);
 
@@ -69,9 +70,13 @@ _gdk_screen_x11_get_type ()
 }
 
 void
-gdk_screen_x11_class_init (GdkScreenX11Class * klass)
+gdk_screen_x11_class_init (GdkScreenX11Class *klass)
 {
-  G_OBJECT_CLASS (klass)->finalize = gdk_screen_x11_finalize;
+  GObjectClass *object_class = G_OBJECT_CLASS (klass);
+  
+  object_class->dispose = gdk_screen_x11_dispose;
+  object_class->finalize = gdk_screen_x11_finalize;
+
   parent_class = g_type_class_peek_parent (klass);
 }
 
@@ -222,6 +227,22 @@ gdk_screen_set_default_colormap (GdkScreen   *screen,
   GDK_SCREEN_X11 (screen)->default_colormap = colormap;
 }
 
+static void
+gdk_screen_x11_dispose (GObject *object)
+{
+  GdkScreenX11 *screen_x11 = GDK_SCREEN_X11 (object);
+
+  screen_x11->root_window = NULL;
+
+  screen_x11->xdisplay = NULL;
+  screen_x11->xscreen = NULL;
+  screen_x11->screen_num = -1;
+  screen_x11->xroot_window = None;
+  screen_x11->wmspec_check_window = None;
+
+  G_OBJECT_CLASS (parent_class)->dispose (object);
+}
+
 static void
 gdk_screen_x11_finalize (GObject *object)
 {
@@ -237,6 +258,9 @@ gdk_screen_x11_finalize (GObject *object)
   g_hash_table_destroy (screen_x11->visual_hash);
   /* X settings */
   g_free (screen_x11->xsettings_client);
+
+  g_free (screen_x11->monitors);
+  
   G_OBJECT_CLASS (parent_class)->finalize (object);
 }
 
index 4b6ed33a77cb88ecee3f3c4a3d0b2a8d31ef8236..e96c6c04322f98950e3174ba6437d51df0d50c59 100644 (file)
@@ -85,6 +85,7 @@ struct _GdkScreenX11Class
 GType       _gdk_screen_x11_get_type (void);
 GdkScreen * _gdk_x11_screen_new      (GdkDisplay *display,
                                      gint        screen_number);
+
 G_END_DECLS
 
 #endif /* __GDK_SCREEN_X11_H__ */
index 26400adfbd6915c78cb231b71c4f084d696f7877..5dafa8b818aabe9fc518e70240d01e4afa4a57ec 100644 (file)
@@ -131,6 +131,9 @@ gdk_selection_owner_set_for_display (GdkDisplay *display,
 
   g_return_val_if_fail (GDK_IS_DISPLAY (display), FALSE);
 
+  if (display->closed)
+    return FALSE;
+
   if (owner) 
     {
       if (GDK_WINDOW_DESTROYED (owner))
@@ -198,6 +201,9 @@ gdk_selection_owner_get_for_display (GdkDisplay *display,
   Window xwindow;
   g_return_val_if_fail (GDK_IS_DISPLAY (display), NULL);
 
+  if (display->closed)
+    return NULL;
+  
   xwindow = XGetSelectionOwner (GDK_DISPLAY_XDISPLAY (display),
                                gdk_x11_atom_to_xatom_for_display (display, 
                                                                   selection));
@@ -227,6 +233,26 @@ gdk_selection_convert (GdkWindow *requestor,
                     GDK_WINDOW_XID (requestor), time);
 }
 
+/**
+ * gdk_selection_property_get:
+ * @requestor: the window on which the data is stored
+ * @data: location to store a pointer to the retrieved data.
+       If the retrieval failed, %NULL we be stored here, otherwise, it
+       will be non-%NULL and the returned data should be freed with g_free()
+       when you are finished using it. The length of the
+       allocated memory is one more than the the length
+       of the returned data, and the final byte will always
+       be zero, to ensure nul-termination of strings.
+ * @prop_type: location to store the type of the property.
+ * @prop_format: location to store the format of the property.
+ * 
+ * Retrieves selection data that was stored by the selection
+ * data in response to a call to gdk_selection_convert(). This function
+ * will not be used by applications, who should use the #GtkClipboard
+ * API instead.
+ * 
+ * Return value: the length of the retrieved data.
+ **/
 gint
 gdk_selection_property_get (GdkWindow  *requestor,
                            guchar    **data,
@@ -246,86 +272,75 @@ gdk_selection_property_get (GdkWindow  *requestor,
   
   display = GDK_WINDOW_DISPLAY (requestor);
 
-  /* If retrieved chunks are typically small, (and the ICCCM says the
-     should be) it would be a win to try first with a buffer of
-     moderate length, to avoid two round trips to the server */
-
   if (GDK_WINDOW_DESTROYED (requestor))
-    return 0;
+    goto err;
 
   t = NULL;
-  XGetWindowProperty (GDK_WINDOW_XDISPLAY (requestor),
-                     GDK_WINDOW_XID (requestor),
-                     gdk_x11_atom_to_xatom_for_display (display, _gdk_selection_property),
-                     0, 0, False,
-                     AnyPropertyType, &prop_type, 
-                     &prop_format, &nitems, &nbytes, &t);
-  if (ret_type)
-    *ret_type = gdk_x11_xatom_to_atom_for_display (display, prop_type);
-  if (ret_format)
-    *ret_format = prop_format;
-
-  if (prop_type == None)
-    {
-      *data = NULL;
-      return 0;
-    }
-  
-  if (t)
-    {
-      XFree (t);
-      t = NULL;
-    }
-
-  /* Add on an extra byte to handle null termination.  X guarantees
-     that t will be 1 longer than nbytes and null terminated */
-  length = nbytes + 1;
 
   /* We can't delete the selection here, because it might be the INCR
      protocol, in which case the client has to make sure they'll be
      notified of PropertyChange events _before_ the property is deleted.
      Otherwise there's no guarantee we'll win the race ... */
-  XGetWindowProperty (GDK_DRAWABLE_XDISPLAY (requestor),
-                     GDK_DRAWABLE_XID (requestor),
-                     gdk_x11_atom_to_xatom_for_display (display, _gdk_selection_property),
-                     0, (nbytes + 3) / 4, False,
-                     AnyPropertyType, &prop_type, &prop_format,
-                     &nitems, &nbytes, &t);
-
+  if (XGetWindowProperty (GDK_DRAWABLE_XDISPLAY (requestor),
+                         GDK_DRAWABLE_XID (requestor),
+                         gdk_x11_atom_to_xatom_for_display (display, _gdk_selection_property),
+                         0, 0x1FFFFFFF /* MAXINT32 / 4 */, False, 
+                         AnyPropertyType, &prop_type, &prop_format,
+                         &nitems, &nbytes, &t) != Success)
+    goto err;
+    
   if (prop_type != None)
     {
-      *data = g_new (guchar, length);
+      if (ret_type)
+       *ret_type = gdk_x11_xatom_to_atom_for_display (display, prop_type);
+      if (ret_format)
+       *ret_format = prop_format;
       
-      if (prop_type == XA_ATOM ||
-         prop_type == gdk_x11_get_xatom_by_name_for_display (display, "ATOM_PAIR"))
-       {
-         Atom* atoms = (Atom*) t;
-         GdkAtom* atoms_dest;
-         gint num_atom, i;
-
-         num_atom = (length - 1) / sizeof (Atom);
-         length = sizeof (GdkAtom) * num_atom + 1;
-         *data = g_malloc (length);
-         (*data)[length - 1] = '\0';
-         atoms_dest = (GdkAtom *)(*data);
-         
-         for (i=0; i < num_atom; i++)
-           atoms_dest[i] = gdk_x11_xatom_to_atom_for_display (display, atoms[i]);
-       }
-      else
+      /* Add on an extra byte to handle null termination.  X guarantees
+        that t will be 1 longer than nbytes and null terminated */
+      length = nbytes + 1;
+
+      if (data)
        {
-         *data = g_memdup (t, length);
+         *data = g_new (guchar, length);
+      
+         if (prop_type == XA_ATOM ||
+             prop_type == gdk_x11_get_xatom_by_name_for_display (display, "ATOM_PAIR"))
+           {
+             Atom* atoms = (Atom*) t;
+             GdkAtom* atoms_dest;
+             gint num_atom, i;
+             
+             num_atom = (length - 1) / sizeof (Atom);
+             length = sizeof (GdkAtom) * num_atom + 1;
+             *data = g_malloc (length);
+             (*data)[length - 1] = '\0';
+             atoms_dest = (GdkAtom *)(*data);
+             
+             for (i=0; i < num_atom; i++)
+               atoms_dest[i] = gdk_x11_xatom_to_atom_for_display (display, atoms[i]);
+           }
+         else
+           {
+             *data = g_memdup (t, length);
+           }
        }
       
       if (t)
        XFree (t);
-      return length-1;
-    }
-  else
-    {
-      *data = NULL;
-      return 0;
+      
+      return length - 1;
     }
+
+ err:
+  if (ret_type)
+    *ret_type = GDK_NONE;
+  if (ret_format)
+    *ret_format = 0;
+  if (data)
+    *data = NULL;
+  
+  return 0;
 }
 
 /**
@@ -399,21 +414,20 @@ gdk_text_property_to_text_list_for_display (GdkDisplay   *display,
   gchar **local_list;
   g_return_val_if_fail (GDK_IS_DISPLAY (display), 0);
 
+  if (list)
+    *list = NULL;
+
+  if (display->closed)
+    return 0;
+
   property.value = (guchar *)text;
   property.encoding = gdk_x11_atom_to_xatom_for_display (display, encoding);
   property.format = format;
   property.nitems = length;
   res = XmbTextPropertyToTextList (GDK_DISPLAY_XDISPLAY (display), &property, 
                                   &local_list, &count);
-
-  if (res == XNoMemory || res == XLocaleNotSupported || 
-      res == XConverterNotFound)
-    {
-      if (list)
-       *list = NULL;
-
-      return 0;
-    }
+  if (res == XNoMemory || res == XLocaleNotSupported || res == XConverterNotFound)
+    return 0;
   else
     {
       if (list)
@@ -425,17 +439,6 @@ gdk_text_property_to_text_list_for_display (GdkDisplay   *display,
     }
 }
 
-gint
-gdk_text_property_to_text_list (GdkAtom       encoding,
-                               gint          format, 
-                               const guchar *text,
-                               gint          length,
-                               gchar      ***list)
-{
-  return gdk_text_property_to_text_list_for_display (gdk_display_get_default (),
-                                                    encoding, format, text, length, list);
-}
-
 void
 gdk_free_text_list (gchar **list)
 {
@@ -638,9 +641,12 @@ gdk_string_to_compound_text_for_display (GdkDisplay  *display,
 
   g_return_val_if_fail (GDK_IS_DISPLAY (display), 0);
 
-  res = XmbTextListToTextProperty (GDK_DISPLAY_XDISPLAY (display), 
-                                  (char **)&str, 1, XCompoundTextStyle,
-                                          &property);
+  if (display->closed)
+    res = XLocaleNotSupported;
+  else
+    res = XmbTextListToTextProperty (GDK_DISPLAY_XDISPLAY (display), 
+                                    (char **)&str, 1, XCompoundTextStyle,
+                                    &property);
   if (res != Success)
     {
       property.encoding = None;
@@ -661,18 +667,6 @@ gdk_string_to_compound_text_for_display (GdkDisplay  *display,
   return res;
 }
 
-gint
-gdk_string_to_compound_text (const gchar *str,
-                            GdkAtom     *encoding,
-                            gint        *format,
-                            guchar     **ctext,
-                            gint        *length)
-{
-  return gdk_string_to_compound_text_for_display (gdk_display_get_default (),
-                                                 str, encoding, format, 
-                                                 ctext, length);
-}
-
 /* The specifications for COMPOUND_TEXT and STRING specify that C0 and
  * C1 are not allowed except for \n and \t, however the X conversions
  * routines for COMPOUND_TEXT only enforce this in one direction,
index a93247f2524c35538a1353def69bb4c29f1c8d07..a47c831e85b9939085a66539aefecb8d675b3119 100644 (file)
@@ -220,6 +220,9 @@ gdk_window_impl_x11_set_colormap (GdkDrawable *drawable,
   impl = GDK_WINDOW_IMPL_X11 (drawable);
   draw_impl = GDK_DRAWABLE_IMPL_X11 (drawable);
 
+  if (GDK_WINDOW_DESTROYED (draw_impl->wrapper))
+    return;
+
   /* chain up */
   GDK_DRAWABLE_CLASS (parent_class)->set_colormap (drawable, cmap);
 
@@ -2628,10 +2631,10 @@ gdk_window_add_colormap_windows (GdkWindow *window)
   
   g_return_if_fail (window != NULL);
   g_return_if_fail (GDK_IS_WINDOW (window));
-  
-  toplevel = gdk_window_get_toplevel (window);
-  if (GDK_WINDOW_DESTROYED (toplevel))
+
+  if (GDK_WINDOW_DESTROYED (window))
     return;
+  toplevel = gdk_window_get_toplevel (window);
   
   old_windows = NULL;
   if (!XGetWMColormapWindows (GDK_WINDOW_XDISPLAY (toplevel),
@@ -3513,19 +3516,22 @@ gdk_window_set_decorations (GdkWindow      *window,
  * Returns: TRUE if the window has decorations set, FALSE otherwise.
  **/
 gboolean
-gdk_window_get_decorations(GdkWindow *window,
+gdk_window_get_decorations(GdkWindow       *window,
                           GdkWMDecoration *decorations)
 {
   MotifWmHints *hints;
   gboolean result = FALSE;
 
+  g_return_val_if_fail (GDK_IS_WINDOW (window), FALSE);
+
   hints = gdk_window_get_mwm_hints (window);
   
   if (hints)
     {
       if (hints->flags & MWM_HINTS_DECORATIONS)
        {
-         *decorations = hints->decorations;
+         if (decorations)
+           *decorations = hints->decorations;
          result = TRUE;
        }