Start implementing display/screen closing scheme; keep a flag for whether

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.
This commit is contained in:
Owen Taylor
2002-08-01 15:28:40 +00:00
committed by Owen Taylor
parent d202b55bc0
commit e5ae081ebe
32 changed files with 710 additions and 262 deletions

View 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

View 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

View 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

View 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

View 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

View 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

View 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 ##### -->

View 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@
#

View 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);
}

View 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

View 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 *

View 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));
}
}
/**

View 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);

View 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

View 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;

View 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");
}

View 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));

View 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;
}
/**

View 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);
}

View 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;
}

View 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++)

View File

@@ -720,12 +720,7 @@ _gdk_device_get_history (GdkDevice *device,
return TRUE;
}
else
{
*events = NULL;
*n_events = 0;
return FALSE;
}
return FALSE;
}
void

View 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);
}

View 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 **

View 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)

View 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));

View 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);
}

View 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);
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 ((ret_prop_type == None) && (ret_format == 0))
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);

View 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);
}

View 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__ */

View 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;
/* 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;
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
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,

View 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;
}