diff options
author | Owen Taylor <otaylor@redhat.com> | 1999-11-08 20:14:59 +0000 |
---|---|---|
committer | Owen Taylor <otaylor@src.gnome.org> | 1999-11-08 20:14:59 +0000 |
commit | e9b6bfcc01c0d76c2e5392a0d332bd0d00544ae7 (patch) | |
tree | f2f741cf95b0b49eabf3a756a404413724c5d248 /gdk/x11 | |
parent | cd02981bf22833edfca5c5af03278f5701246411 (diff) | |
download | gtk+-e9b6bfcc01c0d76c2e5392a0d332bd0d00544ae7.tar.gz |
Move all X specific code into the x11/ directory. Aside from shuffling
Mon Nov 8 14:47:04 1999 Owen Taylor <otaylor@redhat.com>
Move all X specific code into the x11/ directory.
Aside from shuffling things around, did the following:
* gdk/gdkprivate.h gdk/gdk.h gdk/x11/gdkmain-x11.h: Add
gdk_arg_context_* - a simple argument parsing system
in the style of popt.
* gdk/gdkdrawable.[ch] gdk/gdkprivate.h gdk/gdkwindow.[ch]
gdk/x11/gdkprivate-x11.h:
Remove X specific stuff from GdkDrawable and GdkWindowPrivate -
add ->klass and ->klass_data fields. The klass_data
field points to an auxilliary structure that is
windowing system dependent.
* gdk/gdkfont.c: Make most of the measurement functions
simply wrappers around gdk_text_extents().
* gdk/gdkfont.c gdk/gdkprivate.h gdk/x11/gdkfont-x11.c: Add a
_gdk_font_strlen() function that hides the weird
behavior in gtk+-1.[02] where a string is interpreted
differently for 8-bit and 16-bit fonts.
* gdk/gdkevents.c: Add a new function gdk_event_button_generate()
to store common code for synthesizing double/triple
press events.
* gdk/gdkgc.[ch]: Virtualize in the same way as gdkdrawable.h.
Make all the function that modify an existing GC
simply wrappers around gdk_gc_set_values().
* gdk/gdkcc.[ch]: Moved into x11/ directory in preparation
for throwing out later.
* gdk/gdkfont.c gdk/gdkimage.c gdk/gdkcolor.c: Change GdkFontPrivate,
GdkImagePrivate and GdkColormapPrivate to have a
windowing system dependent part (GdkFontPrivateX etc.)
that "derives" from the system-independent part.
* configure.in gdk/x11/Makefile.in gdk/x11/gdkinput*.c:
Got rid of the included-source-files for XInput in
favor of automake conditionals. (Which didn't exist
when XInput support was originally added.)
* gdk/gdkrgb.c: Remove the visual id from the debugging
statements since that is X11 specific; print out
type/depth info instead.
Diffstat (limited to 'gdk/x11')
-rw-r--r-- | gdk/x11/Makefile.am | 49 | ||||
-rw-r--r-- | gdk/x11/gdkcc-x11.c | 1 | ||||
-rw-r--r-- | gdk/x11/gdkcolor-x11.c | 314 | ||||
-rw-r--r-- | gdk/x11/gdkcursor-x11.c | 2 | ||||
-rw-r--r-- | gdk/x11/gdkdnd-x11.c | 128 | ||||
-rw-r--r-- | gdk/x11/gdkdrawable-x11.c | 409 | ||||
-rw-r--r-- | gdk/x11/gdkevents-x11.c | 584 | ||||
-rw-r--r-- | gdk/x11/gdkfont-x11.c | 415 | ||||
-rw-r--r-- | gdk/x11/gdkgc-x11.c | 505 | ||||
-rw-r--r-- | gdk/x11/gdkglobals-x11.c | 40 | ||||
-rw-r--r-- | gdk/x11/gdkimage-x11.c | 117 | ||||
-rw-r--r-- | gdk/x11/gdkinput-gxi.c | 4 | ||||
-rw-r--r-- | gdk/x11/gdkinput-none.c | 4 | ||||
-rw-r--r-- | gdk/x11/gdkinput-x11.c | 77 | ||||
-rw-r--r-- | gdk/x11/gdkinput-xfree.c | 15 | ||||
-rw-r--r-- | gdk/x11/gdkinput.c | 33 | ||||
-rw-r--r-- | gdk/x11/gdkinputprivate.h | 65 | ||||
-rw-r--r-- | gdk/x11/gdkmain-x11.c | 680 | ||||
-rw-r--r-- | gdk/x11/gdkpixmap-x11.c | 165 | ||||
-rw-r--r-- | gdk/x11/gdkprivate-x11.h | 158 | ||||
-rw-r--r-- | gdk/x11/gdkproperty-x11.c | 23 | ||||
-rw-r--r-- | gdk/x11/gdkregion-x11.c | 6 | ||||
-rw-r--r-- | gdk/x11/gdkvisual-x11.c | 2 | ||||
-rw-r--r-- | gdk/x11/gdkwindow-x11.c | 703 | ||||
-rw-r--r-- | gdk/x11/gdkx.h | 27 | ||||
-rw-r--r-- | gdk/x11/gdkxid.c | 2 |
26 files changed, 1906 insertions, 2622 deletions
diff --git a/gdk/x11/Makefile.am b/gdk/x11/Makefile.am index 1da1965a55..6f9c12e429 100644 --- a/gdk/x11/Makefile.am +++ b/gdk/x11/Makefile.am @@ -3,6 +3,7 @@ INCLUDES = @STRIP_BEGIN@ \ -DG_LOG_DOMAIN=\"Gdk\" \ -I$(top_srcdir) \ + -I$(top_srcdir)/gdk \ @GTK_DEBUG_FLAGS@ \ @GTK_XIM_FLAGS@ \ @GTK_LOCALE_FLAGS@ \ @@ -19,10 +20,47 @@ LDADDS = @STRIP_BEGIN@ \ noinst_LTLIBRARIES = libgdk-x11.la -libgdk_x11_la_SOURCES = \ - gxid_lib.c \ - gxid_lib.h \ - gxid_proto.h +if XINPUT_GXI +xinput_sources = \ + gdkinput-x11.c \ + gdkinput-gxi.c +else +if XINPUT_XFREE +xinput_sources = \ + gdkinput-x11.c \ + gdkinput-xfree.c +else +xinput_sources = + gdkinput-none.c +endif +endif + +libgdk_x11_la_SOURCES = \ + MwmUtil.h \ + gdkcc-x11.c \ + gdkcolor-x11.c \ + gdkcursor-x11.c \ + gdkdnd-x11.c \ + gdkdrawable-x11.c \ + gdkevents-x11.c \ + gdkfont-x11.c \ + gdkgc-x11.c \ + gdkglobals-x11.c \ + gdkim-x11.c \ + gdkimage-x11.c \ + gdkinput.c \ + gdkmain-x11.c \ + gdkpixmap-x11.c \ + gdkproperty-x11.c \ + gdkregion-x11.c \ + gdkselection-x11.c \ + gdkvisual-x11.c \ + gdkwindow-x11.c \ + gdkxid.c \ + gxid_lib.c \ + gxid_lib.h \ + gxid_proto.h \ + $(xinput_sources) EXTRA_PROGRAMS = gxid bin_PROGRAMS = @xinput_progs@ @@ -30,7 +68,4 @@ bin_PROGRAMS = @xinput_progs@ gxid_SOURCES = gxid.c gxid_LDADD = $(LDADDS) -#EXTRA_DIST = \ -# MwmUtil.h \ - diff --git a/gdk/x11/gdkcc-x11.c b/gdk/x11/gdkcc-x11.c index f592fa8e54..91e873453b 100644 --- a/gdk/x11/gdkcc-x11.c +++ b/gdk/x11/gdkcc-x11.c @@ -61,6 +61,7 @@ */ #include <X11/Xlib.h> +#include <X11/Xutil.h> #include <stdlib.h> #include <string.h> diff --git a/gdk/x11/gdkcolor-x11.c b/gdk/x11/gdkcolor-x11.c index 03222cc3d6..26994cbe8b 100644 --- a/gdk/x11/gdkcolor-x11.c +++ b/gdk/x11/gdkcolor-x11.c @@ -25,11 +25,9 @@ */ #include <time.h> -#include <X11/Xlib.h> #include "gdkcolor.h" -#include "gdkprivate.h" - +#include "gdkx.h" static gint gdk_colormap_match_color (GdkColormap *cmap, GdkColor *color, @@ -39,7 +37,6 @@ static void gdk_colormap_remove (GdkColormap *cmap); static guint gdk_colormap_hash (Colormap *cmap); static gint gdk_colormap_cmp (Colormap *a, Colormap *b); -static void gdk_colormap_real_destroy (GdkColormap *colormap); static GHashTable *colormap_hash = NULL; @@ -49,19 +46,19 @@ gdk_colormap_new (GdkVisual *visual, gint private_cmap) { GdkColormap *colormap; - GdkColormapPrivate *private; + GdkColormapPrivateX *private; Visual *xvisual; int size; int i; g_return_val_if_fail (visual != NULL, NULL); - private = g_new (GdkColormapPrivate, 1); + private = g_new (GdkColormapPrivateX, 1); colormap = (GdkColormap*) private; private->xdisplay = gdk_display; - private->visual = visual; - private->ref_count = 1; + private->base.visual = visual; + private->base.ref_count = 1; private->hash = NULL; private->last_sync_time = 0; @@ -148,13 +145,10 @@ gdk_colormap_new (GdkVisual *visual, return colormap; } -static void -gdk_colormap_real_destroy (GdkColormap *colormap) +void +_gdk_colormap_real_destroy (GdkColormap *colormap) { - GdkColormapPrivate *private = (GdkColormapPrivate*) colormap; - - g_return_if_fail (colormap != NULL); - g_return_if_fail (private->ref_count == 0); + GdkColormapPrivateX *private = (GdkColormapPrivateX*) colormap; gdk_colormap_remove (colormap); XFreeColormap (private->xdisplay, private->xcolormap); @@ -167,42 +161,6 @@ gdk_colormap_real_destroy (GdkColormap *colormap) g_free (colormap); } -GdkColormap* -gdk_colormap_ref (GdkColormap *cmap) -{ - GdkColormapPrivate *private = (GdkColormapPrivate *)cmap; - - g_return_val_if_fail (cmap != NULL, NULL); - - private->ref_count += 1; - return cmap; -} - -void -gdk_colormap_unref (GdkColormap *cmap) -{ - GdkColormapPrivate *private = (GdkColormapPrivate *)cmap; - - g_return_if_fail (cmap != NULL); - g_return_if_fail (private->ref_count > 0); - - private->ref_count -= 1; - if (private->ref_count == 0) - gdk_colormap_real_destroy (cmap); -} - -GdkVisual * -gdk_colormap_get_visual (GdkColormap *colormap) -{ - GdkColormapPrivate *private; - - g_return_val_if_fail (colormap != NULL, NULL); - - private = (GdkColormapPrivate *)colormap; - - return private->visual; -} - #define MIN_SYNC_TIME 2 void @@ -210,7 +168,7 @@ gdk_colormap_sync (GdkColormap *colormap, gboolean force) { time_t current_time; - GdkColormapPrivate *private = (GdkColormapPrivate *)colormap; + GdkColormapPrivateX *private = (GdkColormapPrivateX *)colormap; XColor *xpalette; gint nlookup; gint i; @@ -257,28 +215,28 @@ GdkColormap* gdk_colormap_get_system (void) { static GdkColormap *colormap = NULL; - GdkColormapPrivate *private; + GdkColormapPrivateX *private; if (!colormap) { - private = g_new (GdkColormapPrivate, 1); + private = g_new (GdkColormapPrivateX, 1); colormap = (GdkColormap*) private; private->xdisplay = gdk_display; private->xcolormap = DefaultColormap (gdk_display, gdk_screen); - private->visual = gdk_visual_get_system (); + private->base.visual = gdk_visual_get_system (); private->private_val = FALSE; - private->ref_count = 1; + private->base.ref_count = 1; private->hash = NULL; private->last_sync_time = 0; private->info = NULL; colormap->colors = NULL; - colormap->size = private->visual->colormap_size; + colormap->size = private->base.visual->colormap_size; - if ((private->visual->type == GDK_VISUAL_GRAYSCALE) || - (private->visual->type == GDK_VISUAL_PSEUDO_COLOR)) + if ((private->base.visual->type == GDK_VISUAL_GRAYSCALE) || + (private->base.visual->type == GDK_VISUAL_PSEUDO_COLOR)) { private->info = g_new0 (GdkColorInfo, colormap->size); colormap->colors = g_new (GdkColor, colormap->size); @@ -305,7 +263,7 @@ void gdk_colormap_change (GdkColormap *colormap, gint ncolors) { - GdkColormapPrivate *private; + GdkColormapPrivateX *private; GdkVisual *visual; XColor *palette; gint shift; @@ -317,8 +275,8 @@ gdk_colormap_change (GdkColormap *colormap, palette = g_new (XColor, ncolors); - private = (GdkColormapPrivate*) colormap; - switch (private->visual->type) + private = (GdkColormapPrivateX*) colormap; + switch (private->base.visual->type) { case GDK_VISUAL_GRAYSCALE: case GDK_VISUAL_PSEUDO_COLOR: @@ -335,7 +293,7 @@ gdk_colormap_change (GdkColormap *colormap, break; case GDK_VISUAL_DIRECT_COLOR: - visual = private->visual; + visual = private->base.visual; shift = visual->red_shift; max_colors = 1 << visual->red_prec; @@ -384,24 +342,6 @@ gdk_colormap_change (GdkColormap *colormap, g_free (palette); } -void -gdk_colors_store (GdkColormap *colormap, - GdkColor *colors, - gint ncolors) -{ - gint i; - - for (i = 0; i < ncolors; i++) - { - colormap->colors[i].pixel = colors[i].pixel; - colormap->colors[i].red = colors[i].red; - colormap->colors[i].green = colors[i].green; - colormap->colors[i].blue = colors[i].blue; - } - - gdk_colormap_change (colormap, ncolors); -} - gboolean gdk_colors_alloc (GdkColormap *colormap, gint contiguous, @@ -410,13 +350,13 @@ gdk_colors_alloc (GdkColormap *colormap, gulong *pixels, gint npixels) { - GdkColormapPrivate *private; + GdkColormapPrivateX *private; gint return_val; gint i; g_return_val_if_fail (colormap != NULL, 0); - private = (GdkColormapPrivate*) colormap; + private = (GdkColormapPrivateX*) colormap; return_val = XAllocColorCells (private->xdisplay, private->xcolormap, contiguous, planes, nplanes, pixels, npixels); @@ -433,108 +373,6 @@ gdk_colors_alloc (GdkColormap *colormap, return return_val != 0; } -/* - *-------------------------------------------------------------- - * gdk_color_copy - * - * Copy a color structure into new storage. - * - * Arguments: - * "color" is the color struct to copy. - * - * Results: - * A new color structure. Free it with gdk_color_free. - * - *-------------------------------------------------------------- - */ - -static GMemChunk *color_chunk; - -GdkColor* -gdk_color_copy (GdkColor *color) -{ - GdkColor *new_color; - - g_return_val_if_fail (color != NULL, NULL); - - if (color_chunk == NULL) - color_chunk = g_mem_chunk_new ("colors", - sizeof (GdkColor), - 4096, - G_ALLOC_AND_FREE); - - new_color = g_chunk_new (GdkColor, color_chunk); - *new_color = *color; - return new_color; -} - -/* - *-------------------------------------------------------------- - * gdk_color_free - * - * Free a color structure obtained from gdk_color_copy. Do not use - * with other color structures. - * - * Arguments: - * "color" is the color struct to free. - * - *-------------------------------------------------------------- */ - -void -gdk_color_free (GdkColor *color) -{ - g_assert (color_chunk != NULL); - g_return_if_fail (color != NULL); - - g_mem_chunk_free (color_chunk, color); -} - -gboolean -gdk_color_white (GdkColormap *colormap, - GdkColor *color) -{ - gint return_val; - - g_return_val_if_fail (colormap != NULL, FALSE); - - if (color) - { - color->pixel = WhitePixel (gdk_display, gdk_screen); - color->red = 65535; - color->green = 65535; - color->blue = 65535; - - return_val = gdk_color_alloc (colormap, color); - } - else - return_val = FALSE; - - return return_val; -} - -gboolean -gdk_color_black (GdkColormap *colormap, - GdkColor *color) -{ - gint return_val; - - g_return_val_if_fail (colormap != NULL, FALSE); - - if (color) - { - color->pixel = BlackPixel (gdk_display, gdk_screen); - color->red = 0; - color->green = 0; - color->blue = 0; - - return_val = gdk_color_alloc (colormap, color); - } - else - return_val = FALSE; - - return return_val; -} - gboolean gdk_color_parse (const gchar *spec, GdkColor *color) @@ -570,7 +408,7 @@ gdk_colors_free (GdkColormap *colormap, gint in_npixels, gulong planes) { - GdkColormapPrivate *private; + GdkColormapPrivateX *private; gulong *pixels; gint npixels = 0; gint i; @@ -578,10 +416,10 @@ gdk_colors_free (GdkColormap *colormap, g_return_if_fail (colormap != NULL); g_return_if_fail (in_pixels != NULL); - private = (GdkColormapPrivate*) colormap; + private = (GdkColormapPrivateX*) colormap; - if ((private->visual->type != GDK_VISUAL_PSEUDO_COLOR) && - (private->visual->type != GDK_VISUAL_GRAYSCALE)) + if ((private->base.visual->type != GDK_VISUAL_PSEUDO_COLOR) && + (private->base.visual->type != GDK_VISUAL_GRAYSCALE)) return; pixels = g_new (gulong, in_npixels); @@ -618,7 +456,7 @@ gdk_colormap_free_colors (GdkColormap *colormap, GdkColor *colors, gint ncolors) { - GdkColormapPrivate *private; + GdkColormapPrivateX *private; gulong *pixels; gint npixels = 0; gint i; @@ -626,10 +464,10 @@ gdk_colormap_free_colors (GdkColormap *colormap, g_return_if_fail (colormap != NULL); g_return_if_fail (colors != NULL); - private = (GdkColormapPrivate*) colormap; + private = (GdkColormapPrivateX*) colormap; - if ((private->visual->type != GDK_VISUAL_PSEUDO_COLOR) && - (private->visual->type != GDK_VISUAL_GRAYSCALE)) + if ((private->base.visual->type != GDK_VISUAL_PSEUDO_COLOR) && + (private->base.visual->type != GDK_VISUAL_GRAYSCALE)) return; pixels = g_new (gulong, ncolors); @@ -671,10 +509,10 @@ gdk_colormap_alloc1 (GdkColormap *colormap, GdkColor *color, GdkColor *ret) { - GdkColormapPrivate *private; + GdkColormapPrivateX *private; XColor xcolor; - private = (GdkColormapPrivate*) colormap; + private = (GdkColormapPrivateX*) colormap; xcolor.red = color->red; xcolor.green = color->green; @@ -723,12 +561,12 @@ gdk_colormap_alloc_colors_writeable (GdkColormap *colormap, gboolean best_match, gboolean *success) { - GdkColormapPrivate *private; + GdkColormapPrivateX *private; gulong *pixels; Status status; gint i, index; - private = (GdkColormapPrivate*) colormap; + private = (GdkColormapPrivateX*) colormap; if (private->private_val) { @@ -781,13 +619,13 @@ gdk_colormap_alloc_colors_private (GdkColormap *colormap, gboolean best_match, gboolean *success) { - GdkColormapPrivate *private; + GdkColormapPrivateX *private; gint i, index; XColor *store = g_new (XColor, ncolors); gint nstore = 0; gint nremaining = 0; - private = (GdkColormapPrivate*) colormap; + private = (GdkColormapPrivateX*) colormap; index = -1; /* First, store the colors we have room for */ @@ -860,12 +698,12 @@ gdk_colormap_alloc_colors_shared (GdkColormap *colormap, gboolean best_match, gboolean *success) { - GdkColormapPrivate *private; + GdkColormapPrivateX *private; gint i, index; gint nremaining = 0; gint nfailed = 0; - private = (GdkColormapPrivate*) colormap; + private = (GdkColormapPrivateX*) colormap; index = -1; for (i=0; i<ncolors; i++) @@ -952,12 +790,12 @@ gdk_colormap_alloc_colors_pseudocolor (GdkColormap *colormap, gboolean best_match, gboolean *success) { - GdkColormapPrivate *private; + GdkColormapPrivateX *private; GdkColor *lookup_color; gint i; gint nremaining = 0; - private = (GdkColormapPrivate*) colormap; + private = (GdkColormapPrivateX*) colormap; /* Check for an exact match among previously allocated colors */ @@ -999,7 +837,7 @@ gdk_colormap_alloc_colors (GdkColormap *colormap, gboolean best_match, gboolean *success) { - GdkColormapPrivate *private; + GdkColormapPrivateX *private; GdkVisual *visual; gint i; gint nremaining = 0; @@ -1008,14 +846,14 @@ gdk_colormap_alloc_colors (GdkColormap *colormap, g_return_val_if_fail (colormap != NULL, FALSE); g_return_val_if_fail (colors != NULL, FALSE); - private = (GdkColormapPrivate*) colormap; + private = (GdkColormapPrivateX*) colormap; for (i=0; i<ncolors; i++) { success[i] = FALSE; } - switch (private->visual->type) + switch (private->base.visual->type) { case GDK_VISUAL_PSEUDO_COLOR: case GDK_VISUAL_GRAYSCALE: @@ -1029,7 +867,7 @@ gdk_colormap_alloc_colors (GdkColormap *colormap, case GDK_VISUAL_DIRECT_COLOR: case GDK_VISUAL_TRUE_COLOR: - visual = private->visual; + visual = private->base.visual; for (i=0; i<ncolors; i++) { @@ -1064,35 +902,10 @@ gdk_colormap_alloc_colors (GdkColormap *colormap, } gboolean -gdk_colormap_alloc_color (GdkColormap *colormap, - GdkColor *color, - gboolean writeable, - gboolean best_match) -{ - gboolean success; - - gdk_colormap_alloc_colors (colormap, color, 1, writeable, best_match, - &success); - - return success; -} - -gboolean -gdk_color_alloc (GdkColormap *colormap, - GdkColor *color) -{ - gboolean success; - - gdk_colormap_alloc_colors (colormap, color, 1, FALSE, TRUE, &success); - - return success; -} - -gboolean gdk_color_change (GdkColormap *colormap, GdkColor *color) { - GdkColormapPrivate *private; + GdkColormapPrivateX *private; XColor xcolor; g_return_val_if_fail (colormap != NULL, FALSE); @@ -1104,33 +917,12 @@ gdk_color_change (GdkColormap *colormap, xcolor.blue = color->blue; xcolor.flags = DoRed | DoGreen | DoBlue; - private = (GdkColormapPrivate*) colormap; + private = (GdkColormapPrivateX*) colormap; XStoreColor (private->xdisplay, private->xcolormap, &xcolor); return TRUE; } -guint -gdk_color_hash (const GdkColor *colora) -{ - return ((colora->red) + - (colora->green << 11) + - (colora->blue << 22) + - (colora->blue >> 6)); -} - -gint -gdk_color_equal (const GdkColor *colora, - const GdkColor *colorb) -{ - g_return_val_if_fail (colora != NULL, FALSE); - g_return_val_if_fail (colorb != NULL, FALSE); - - return ((colora->red == colorb->red) && - (colora->green == colorb->green) && - (colora->blue == colorb->blue)); -} - /* XXX: Do not use this function until it is fixed. An X Colormap * is useless unless we also have the visual. */ @@ -1138,7 +930,7 @@ GdkColormap* gdkx_colormap_get (Colormap xcolormap) { GdkColormap *colormap; - GdkColormapPrivate *private; + GdkColormapPrivateX *private; colormap = gdk_colormap_lookup (xcolormap); if (colormap) @@ -1147,12 +939,12 @@ gdkx_colormap_get (Colormap xcolormap) if (xcolormap == DefaultColormap (gdk_display, gdk_screen)) return gdk_colormap_get_system (); - private = g_new (GdkColormapPrivate, 1); + private = g_new (GdkColormapPrivateX, 1); colormap = (GdkColormap*) private; private->xdisplay = gdk_display; private->xcolormap = xcolormap; - private->visual = NULL; + private->base.visual = NULL; private->private_val = TRUE; /* To do the following safely, we would have to have some way of finding @@ -1243,13 +1035,13 @@ gdk_colormap_lookup (Colormap xcolormap) static void gdk_colormap_add (GdkColormap *cmap) { - GdkColormapPrivate *private; + GdkColormapPrivateX *private; if (!colormap_hash) colormap_hash = g_hash_table_new ((GHashFunc) gdk_colormap_hash, (GCompareFunc) gdk_colormap_cmp); - private = (GdkColormapPrivate*) cmap; + private = (GdkColormapPrivateX*)cmap; g_hash_table_insert (colormap_hash, &private->xcolormap, cmap); } @@ -1257,13 +1049,13 @@ gdk_colormap_add (GdkColormap *cmap) static void gdk_colormap_remove (GdkColormap *cmap) { - GdkColormapPrivate *private; + GdkColormapPrivateX *private; if (!colormap_hash) colormap_hash = g_hash_table_new ((GHashFunc) gdk_colormap_hash, (GCompareFunc) gdk_colormap_cmp); - private = (GdkColormapPrivate*) cmap; + private = (GdkColormapPrivateX *)cmap; g_hash_table_remove (colormap_hash, &private->xcolormap); } diff --git a/gdk/x11/gdkcursor-x11.c b/gdk/x11/gdkcursor-x11.c index 04260a2cde..66d0f34ddc 100644 --- a/gdk/x11/gdkcursor-x11.c +++ b/gdk/x11/gdkcursor-x11.c @@ -29,8 +29,6 @@ #include "gdkx.h" #include "gdkcursor.h" -#include "gdkprivate.h" - GdkCursor* gdk_cursor_new (GdkCursorType cursor_type) diff --git a/gdk/x11/gdkdnd-x11.c b/gdk/x11/gdkdnd-x11.c index a58da225b1..653f2086d4 100644 --- a/gdk/x11/gdkdnd-x11.c +++ b/gdk/x11/gdkdnd-x11.c @@ -201,12 +201,12 @@ gdk_drag_context_find (gboolean is_source, context_dest_xid = context->dest_window ? (private->drop_xid ? private->drop_xid : - GDK_WINDOW_XWINDOW (context->dest_window)) : + GDK_DRAWABLE_XID (context->dest_window)) : None; if ((!context->is_source == !is_source) && ((source_xid == None) || (context->source_window && - (GDK_WINDOW_XWINDOW (context->source_window) == source_xid))) && + (GDK_DRAWABLE_XID (context->source_window) == source_xid))) && ((dest_xid == None) || (context_dest_xid == dest_xid))) return context; @@ -372,7 +372,7 @@ gdk_window_cache_new (void) result->old_event_mask = xwa.your_event_mask; XSelectInput (gdk_display, gdk_root_window, result->old_event_mask | SubstructureNotifyMask); - gdk_window_add_filter ((GdkWindow *)&gdk_root_parent, + gdk_window_add_filter (gdk_parent_root, gdk_window_cache_filter, result); gdk_error_code = 0; @@ -411,7 +411,7 @@ static void gdk_window_cache_destroy (GdkWindowCache *cache) { XSelectInput (gdk_display, gdk_root_window, cache->old_event_mask); - gdk_window_remove_filter ((GdkWindow *)&gdk_root_parent, + gdk_window_remove_filter (gdk_parent_root, gdk_window_cache_filter, cache); g_list_foreach (cache->children, (GFunc)g_free, NULL); @@ -1273,8 +1273,8 @@ motif_set_targets (GdkDragContext *context) info.selection_atom = private->motif_selection; - XChangeProperty (GDK_WINDOW_XDISPLAY (context->source_window), - GDK_WINDOW_XWINDOW (context->source_window), + XChangeProperty (GDK_DRAWABLE_XDISPLAY (context->source_window), + GDK_DRAWABLE_XID (context->source_window), private->motif_selection, motif_drag_initiator_info, 8, PropModeReplace, (guchar *)&info, sizeof (info)); @@ -1333,24 +1333,24 @@ motif_send_enter (GdkDragContext *context, xev.xclient.type = ClientMessage; xev.xclient.message_type = gdk_atom_intern ("_MOTIF_DRAG_AND_DROP_MESSAGE", FALSE); xev.xclient.format = 8; - xev.xclient.window = GDK_WINDOW_XWINDOW (context->dest_window); + xev.xclient.window = GDK_DRAWABLE_XID (context->dest_window); MOTIF_XCLIENT_BYTE (&xev, 0) = XmTOP_LEVEL_ENTER; MOTIF_XCLIENT_BYTE (&xev, 1) = local_byte_order; MOTIF_XCLIENT_SHORT (&xev, 1) = 0; MOTIF_XCLIENT_LONG (&xev, 1) = time; - MOTIF_XCLIENT_LONG (&xev, 2) = GDK_WINDOW_XWINDOW (context->source_window); + MOTIF_XCLIENT_LONG (&xev, 2) = GDK_DRAWABLE_XID (context->source_window); if (!private->motif_targets_set) motif_set_targets (context); MOTIF_XCLIENT_LONG (&xev, 3) = private->motif_selection; - if (!gdk_send_xevent (GDK_WINDOW_XWINDOW (context->dest_window), + if (!gdk_send_xevent (GDK_DRAWABLE_XID (context->dest_window), FALSE, 0, &xev)) GDK_NOTE (DND, g_message ("Send event to %lx failed", - GDK_WINDOW_XWINDOW (context->dest_window))); + GDK_DRAWABLE_XID (context->dest_window))); } static void @@ -1362,20 +1362,20 @@ motif_send_leave (GdkDragContext *context, xev.xclient.type = ClientMessage; xev.xclient.message_type = gdk_atom_intern ("_MOTIF_DRAG_AND_DROP_MESSAGE", FALSE); xev.xclient.format = 8; - xev.xclient.window = GDK_WINDOW_XWINDOW (context->dest_window); + xev.xclient.window = GDK_DRAWABLE_XID (context->dest_window); MOTIF_XCLIENT_BYTE (&xev, 0) = XmTOP_LEVEL_LEAVE; MOTIF_XCLIENT_BYTE (&xev, 1) = local_byte_order; MOTIF_XCLIENT_SHORT (&xev, 1) = 0; MOTIF_XCLIENT_LONG (&xev, 1) = time; - MOTIF_XCLIENT_LONG (&xev, 2) = GDK_WINDOW_XWINDOW (context->source_window); + MOTIF_XCLIENT_LONG (&xev, 2) = GDK_DRAWABLE_XID (context->source_window); MOTIF_XCLIENT_LONG (&xev, 3) = 0; - if (!gdk_send_xevent (GDK_WINDOW_XWINDOW (context->dest_window), + if (!gdk_send_xevent (GDK_DRAWABLE_XID (context->dest_window), FALSE, 0, &xev)) GDK_NOTE (DND, g_message ("Send event to %lx failed", - GDK_WINDOW_XWINDOW (context->dest_window))); + GDK_DRAWABLE_XID (context->dest_window))); } static gboolean @@ -1392,7 +1392,7 @@ motif_send_motion (GdkDragContext *context, xev.xclient.type = ClientMessage; xev.xclient.message_type = gdk_atom_intern ("_MOTIF_DRAG_AND_DROP_MESSAGE", FALSE); xev.xclient.format = 8; - xev.xclient.window = GDK_WINDOW_XWINDOW (context->dest_window); + xev.xclient.window = GDK_DRAWABLE_XID (context->dest_window); MOTIF_XCLIENT_BYTE (&xev, 1) = local_byte_order; MOTIF_XCLIENT_SHORT (&xev, 1) = motif_dnd_get_flags (context); @@ -1417,11 +1417,11 @@ motif_send_motion (GdkDragContext *context, retval = FALSE; } - if (!gdk_send_xevent (GDK_WINDOW_XWINDOW (context->dest_window), + if (!gdk_send_xevent (GDK_DRAWABLE_XID (context->dest_window), FALSE, 0, &xev)) GDK_NOTE (DND, g_message ("Send event to %lx failed", - GDK_WINDOW_XWINDOW (context->dest_window))); + GDK_DRAWABLE_XID (context->dest_window))); return retval; } @@ -1435,7 +1435,7 @@ motif_send_drop (GdkDragContext *context, guint32 time) xev.xclient.type = ClientMessage; xev.xclient.message_type = gdk_atom_intern ("_MOTIF_DRAG_AND_DROP_MESSAGE", FALSE); xev.xclient.format = 8; - xev.xclient.window = GDK_WINDOW_XWINDOW (context->dest_window); + xev.xclient.window = GDK_DRAWABLE_XID (context->dest_window); MOTIF_XCLIENT_BYTE (&xev, 0) = XmDROP_START; MOTIF_XCLIENT_BYTE (&xev, 1) = local_byte_order; @@ -1446,13 +1446,13 @@ motif_send_drop (GdkDragContext *context, guint32 time) MOTIF_XCLIENT_SHORT (&xev, 5) = private->last_y; MOTIF_XCLIENT_LONG (&xev, 3) = private->motif_selection; - MOTIF_XCLIENT_LONG (&xev, 4) = GDK_WINDOW_XWINDOW (context->source_window); + MOTIF_XCLIENT_LONG (&xev, 4) = GDK_DRAWABLE_XID (context->source_window); - if (!gdk_send_xevent (GDK_WINDOW_XWINDOW (context->dest_window), + if (!gdk_send_xevent (GDK_DRAWABLE_XID (context->dest_window), FALSE, 0, &xev)) GDK_NOTE (DND, g_message ("Send event to %lx failed", - GDK_WINDOW_XWINDOW (context->dest_window))); + GDK_DRAWABLE_XID (context->dest_window))); } /* Target Side */ @@ -1756,7 +1756,7 @@ motif_drag_status (GdkEvent *event, g_message ("Motif status message: flags %x", flags)); context = gdk_drag_context_find (TRUE, - GDK_WINDOW_XWINDOW (event->any.window), + GDK_DRAWABLE_XID (event->any.window), None); if (context) @@ -2028,8 +2028,8 @@ xdnd_set_targets (GdkDragContext *context) i++; } - XChangeProperty (GDK_WINDOW_XDISPLAY (context->source_window), - GDK_WINDOW_XWINDOW (context->source_window), + XChangeProperty (GDK_DRAWABLE_XDISPLAY (context->source_window), + GDK_DRAWABLE_XID (context->source_window), gdk_atom_intern ("XdndTypeList", FALSE), XA_ATOM, 32, PropModeReplace, (guchar *)atomlist, n_atoms); @@ -2076,8 +2076,8 @@ xdnd_set_actions (GdkDragContext *context) } } - XChangeProperty (GDK_WINDOW_XDISPLAY (context->source_window), - GDK_WINDOW_XWINDOW (context->source_window), + XChangeProperty (GDK_DRAWABLE_XDISPLAY (context->source_window), + GDK_DRAWABLE_XID (context->source_window), gdk_atom_intern ("XdndActionList", FALSE), XA_ATOM, 32, PropModeReplace, (guchar *)atomlist, n_atoms); @@ -2119,8 +2119,8 @@ xdnd_send_enter (GdkDragContext *context) xev.xclient.format = 32; xev.xclient.window = private->drop_xid ? private->drop_xid : - GDK_WINDOW_XWINDOW (context->dest_window); - xev.xclient.data.l[0] = GDK_WINDOW_XWINDOW (context->source_window); + GDK_DRAWABLE_XID (context->dest_window); + xev.xclient.data.l[0] = GDK_DRAWABLE_XID (context->source_window); xev.xclient.data.l[1] = (3 << 24); /* version */ xev.xclient.data.l[2] = 0; xev.xclient.data.l[3] = 0; @@ -2148,12 +2148,12 @@ xdnd_send_enter (GdkDragContext *context) } } - if (!xdnd_send_xevent (GDK_WINDOW_XWINDOW (context->dest_window), + if (!xdnd_send_xevent (GDK_DRAWABLE_XID (context->dest_window), FALSE, &xev)) { GDK_NOTE (DND, g_message ("Send event to %lx failed", - GDK_WINDOW_XWINDOW (context->dest_window))); + GDK_DRAWABLE_XID (context->dest_window))); gdk_window_unref (context->dest_window); context->dest_window = NULL; } @@ -2171,19 +2171,19 @@ xdnd_send_leave (GdkDragContext *context) xev.xclient.format = 32; xev.xclient.window = private->drop_xid ? private->drop_xid : - GDK_WINDOW_XWINDOW (context->dest_window); - xev.xclient.data.l[0] = GDK_WINDOW_XWINDOW (context->source_window); + GDK_DRAWABLE_XID (context->dest_window); + xev.xclient.data.l[0] = GDK_DRAWABLE_XID (context->source_window); xev.xclient.data.l[1] = 0; xev.xclient.data.l[2] = 0; xev.xclient.data.l[3] = 0; xev.xclient.data.l[4] = 0; - if (!xdnd_send_xevent (GDK_WINDOW_XWINDOW (context->dest_window), + if (!xdnd_send_xevent (GDK_DRAWABLE_XID (context->dest_window), FALSE, &xev)) { GDK_NOTE (DND, g_message ("Send event to %lx failed", - GDK_WINDOW_XWINDOW (context->dest_window))); + GDK_DRAWABLE_XID (context->dest_window))); gdk_window_unref (context->dest_window); context->dest_window = NULL; } @@ -2200,19 +2200,19 @@ xdnd_send_drop (GdkDragContext *context, guint32 time) xev.xclient.format = 32; xev.xclient.window = private->drop_xid ? private->drop_xid : - GDK_WINDOW_XWINDOW (context->dest_window); - xev.xclient.data.l[0] = GDK_WINDOW_XWINDOW (context->source_window); + GDK_DRAWABLE_XID (context->dest_window); + xev.xclient.data.l[0] = GDK_DRAWABLE_XID (context->source_window); xev.xclient.data.l[1] = 0; xev.xclient.data.l[2] = time; xev.xclient.data.l[3] = 0; xev.xclient.data.l[4] = 0; - if (!xdnd_send_xevent (GDK_WINDOW_XWINDOW (context->dest_window), + if (!xdnd_send_xevent (GDK_DRAWABLE_XID (context->dest_window), FALSE, &xev)) { GDK_NOTE (DND, g_message ("Send event to %lx failed", - GDK_WINDOW_XWINDOW (context->dest_window))); + GDK_DRAWABLE_XID (context->dest_window))); gdk_window_unref (context->dest_window); context->dest_window = NULL; } @@ -2233,19 +2233,19 @@ xdnd_send_motion (GdkDragContext *context, xev.xclient.format = 32; xev.xclient.window = private->drop_xid ? private->drop_xid : - GDK_WINDOW_XWINDOW (context->dest_window); - xev.xclient.data.l[0] = GDK_WINDOW_XWINDOW (context->source_window); + GDK_DRAWABLE_XID (context->dest_window); + xev.xclient.data.l[0] = GDK_DRAWABLE_XID (context->source_window); xev.xclient.data.l[1] = 0; xev.xclient.data.l[2] = (x_root << 16) | y_root; xev.xclient.data.l[3] = time; xev.xclient.data.l[4] = xdnd_action_to_atom (action); - if (!xdnd_send_xevent (GDK_WINDOW_XWINDOW (context->dest_window), + if (!xdnd_send_xevent (GDK_DRAWABLE_XID (context->dest_window), FALSE, &xev)) { GDK_NOTE (DND, g_message ("Send event to %lx failed", - GDK_WINDOW_XWINDOW (context->dest_window))); + GDK_DRAWABLE_XID (context->dest_window))); gdk_window_unref (context->dest_window); context->dest_window = NULL; } @@ -2345,8 +2345,8 @@ xdnd_read_actions (GdkDragContext *context) /* Get the XdndActionList, if set */ - XGetWindowProperty (GDK_WINDOW_XDISPLAY (context->source_window), - GDK_WINDOW_XWINDOW (context->source_window), + XGetWindowProperty (GDK_DRAWABLE_XDISPLAY (context->source_window), + GDK_DRAWABLE_XID (context->source_window), gdk_atom_intern ("XdndActionList", FALSE), 0, 65536, False, XA_ATOM, &type, &format, &nitems, &after, (guchar **)&data); @@ -2511,7 +2511,7 @@ xdnd_enter_filter (GdkXEvent *xev, new_context->targets = NULL; if (get_types) { - XGetWindowProperty (GDK_WINDOW_XDISPLAY (event->any.window), + XGetWindowProperty (GDK_DRAWABLE_XDISPLAY (event->any.window), source_window, gdk_atom_intern ("XdndTypeList", FALSE), 0, 65536, False, XA_ATOM, &type, &format, &nitems, @@ -2570,7 +2570,7 @@ xdnd_leave_filter (GdkXEvent *xev, if ((current_dest_drag != NULL) && (current_dest_drag->protocol == GDK_DRAG_PROTO_XDND) && - (GDK_WINDOW_XWINDOW (current_dest_drag->source_window) == source_window)) + (GDK_DRAWABLE_XID (current_dest_drag->source_window) == source_window)) { event->dnd.type = GDK_DRAG_LEAVE; /* Pass ownership of context to the event */ @@ -2603,7 +2603,7 @@ xdnd_position_filter (GdkXEvent *xev, if ((current_dest_drag != NULL) && (current_dest_drag->protocol == GDK_DRAG_PROTO_XDND) && - (GDK_WINDOW_XWINDOW (current_dest_drag->source_window) == source_window)) + (GDK_DRAWABLE_XID (current_dest_drag->source_window) == source_window)) { event->dnd.type = GDK_DRAG_MOTION; event->dnd.context = current_dest_drag; @@ -2642,7 +2642,7 @@ xdnd_drop_filter (GdkXEvent *xev, if ((current_dest_drag != NULL) && (current_dest_drag->protocol == GDK_DRAG_PROTO_XDND) && - (GDK_WINDOW_XWINDOW (current_dest_drag->source_window) == source_window)) + (GDK_DRAWABLE_XID (current_dest_drag->source_window) == source_window)) { GdkDragContextPrivate *private; private = (GdkDragContextPrivate *)current_dest_drag; @@ -2843,7 +2843,7 @@ gdk_drag_find_window (GdkDragContext *context, dest = get_client_window_at_coords (private->window_cache, drag_window ? - GDK_WINDOW_XWINDOW (drag_window) : GDK_NONE, + GDK_DRAWABLE_XID (drag_window) : GDK_NONE, x_root, y_root); if (private->dest_xid != dest) @@ -3077,7 +3077,7 @@ gdk_drag_status (GdkDragContext *context, xev.xclient.type = ClientMessage; xev.xclient.message_type = gdk_atom_intern ("_MOTIF_DRAG_AND_DROP_MESSAGE", FALSE); xev.xclient.format = 8; - xev.xclient.window = GDK_WINDOW_XWINDOW (context->source_window); + xev.xclient.window = GDK_DRAWABLE_XID (context->source_window); if (private->drag_status == GDK_DRAG_STATUS_ACTION_WAIT) { @@ -3123,30 +3123,30 @@ gdk_drag_status (GdkDragContext *context, MOTIF_XCLIENT_SHORT (&xev, 4) = private->last_x; MOTIF_XCLIENT_SHORT (&xev, 5) = private->last_y; - if (!gdk_send_xevent (GDK_WINDOW_XWINDOW (context->source_window), + if (!gdk_send_xevent (GDK_DRAWABLE_XID (context->source_window), FALSE, 0, &xev)) GDK_NOTE (DND, g_message ("Send event to %lx failed", - GDK_WINDOW_XWINDOW (context->source_window))); + GDK_DRAWABLE_XID (context->source_window))); } else if (context->protocol == GDK_DRAG_PROTO_XDND) { xev.xclient.type = ClientMessage; xev.xclient.message_type = gdk_atom_intern ("XdndStatus", FALSE); xev.xclient.format = 32; - xev.xclient.window = GDK_WINDOW_XWINDOW (context->source_window); + xev.xclient.window = GDK_DRAWABLE_XID (context->source_window); - xev.xclient.data.l[0] = GDK_WINDOW_XWINDOW (context->dest_window); + xev.xclient.data.l[0] = GDK_DRAWABLE_XID (context->dest_window); xev.xclient.data.l[1] = (action != 0) ? (2 | 1) : 0; xev.xclient.data.l[2] = 0; xev.xclient.data.l[3] = 0; xev.xclient.data.l[4] = xdnd_action_to_atom (action); - if (!xdnd_send_xevent (GDK_WINDOW_XWINDOW (context->source_window), + if (!xdnd_send_xevent (GDK_DRAWABLE_XID (context->source_window), FALSE, &xev)) GDK_NOTE (DND, g_message ("Send event to %lx failed", - GDK_WINDOW_XWINDOW (context->source_window))); + GDK_DRAWABLE_XID (context->source_window))); } private->old_action = action; @@ -3186,7 +3186,7 @@ gdk_drop_reply (GdkDragContext *context, MOTIF_XCLIENT_SHORT (&xev, 2) = private->last_x; MOTIF_XCLIENT_SHORT (&xev, 3) = private->last_y; - gdk_send_xevent (GDK_WINDOW_XWINDOW (context->source_window), + gdk_send_xevent (GDK_DRAWABLE_XID (context->source_window), FALSE, 0, &xev); } } @@ -3205,19 +3205,19 @@ gdk_drop_finish (GdkDragContext *context, xev.xclient.type = ClientMessage; xev.xclient.message_type = gdk_atom_intern ("XdndFinished", FALSE); xev.xclient.format = 32; - xev.xclient.window = GDK_WINDOW_XWINDOW (context->source_window); + xev.xclient.window = GDK_DRAWABLE_XID (context->source_window); - xev.xclient.data.l[0] = GDK_WINDOW_XWINDOW (context->dest_window); + xev.xclient.data.l[0] = GDK_DRAWABLE_XID (context->dest_window); xev.xclient.data.l[1] = 0; xev.xclient.data.l[2] = 0; xev.xclient.data.l[3] = 0; xev.xclient.data.l[4] = 0; - if (!xdnd_send_xevent (GDK_WINDOW_XWINDOW (context->source_window), + if (!xdnd_send_xevent (GDK_DRAWABLE_XID (context->source_window), FALSE, &xev)) GDK_NOTE (DND, g_message ("Send event to %lx failed", - GDK_WINDOW_XWINDOW (context->source_window))); + GDK_DRAWABLE_XID (context->source_window))); } } @@ -3242,7 +3242,7 @@ gdk_window_register_dnd (GdkWindow *window) info.num_drop_sites = 0; info.total_size = sizeof(info); - XChangeProperty (gdk_display, GDK_WINDOW_XWINDOW (window), + XChangeProperty (gdk_display, GDK_DRAWABLE_XID (window), motif_drag_receiver_info_atom, motif_drag_receiver_info_atom, 8, PropModeReplace, @@ -3255,8 +3255,8 @@ gdk_window_register_dnd (GdkWindow *window) xdnd_aware_atom = gdk_atom_intern ("XdndAware", FALSE); /* The property needs to be of type XA_ATOM, not XA_INTEGER. Blech */ - XChangeProperty (GDK_WINDOW_XDISPLAY (window), - GDK_WINDOW_XWINDOW (window), + XChangeProperty (GDK_DRAWABLE_XDISPLAY (window), + GDK_DRAWABLE_XID (window), xdnd_aware_atom, XA_ATOM, 32, PropModeReplace, (guchar *)&xdnd_version, 1); diff --git a/gdk/x11/gdkdrawable-x11.c b/gdk/x11/gdkdrawable-x11.c new file mode 100644 index 0000000000..c99de5bc23 --- /dev/null +++ b/gdk/x11/gdkdrawable-x11.c @@ -0,0 +1,409 @@ +#include "gdkx.h" + +static void gdk_x11_drawable_destroy (GdkDrawable *drawable); + +static void gdk_x11_draw_rectangle (GdkDrawable *drawable, + GdkGC *gc, + gint filled, + gint x, + gint y, + gint width, + gint height); +static void gdk_x11_draw_arc (GdkDrawable *drawable, + GdkGC *gc, + gint filled, + gint x, + gint y, + gint width, + gint height, + gint angle1, + gint angle2); +static void gdk_x11_draw_polygon (GdkDrawable *drawable, + GdkGC *gc, + gint filled, + GdkPoint *points, + gint npoints); +static void gdk_x11_draw_text (GdkDrawable *drawable, + GdkFont *font, + GdkGC *gc, + gint x, + gint y, + const gchar *text, + gint text_length); +static void gdk_x11_draw_text_wc (GdkDrawable *drawable, + GdkFont *font, + GdkGC *gc, + gint x, + gint y, + const GdkWChar *text, + gint text_length); +static void gdk_x11_draw_drawable (GdkDrawable *drawable, + GdkGC *gc, + GdkPixmap *src, + gint xsrc, + gint ysrc, + gint xdest, + gint ydest, + gint width, + gint height); +static void gdk_x11_draw_points (GdkDrawable *drawable, + GdkGC *gc, + GdkPoint *points, + gint npoints); +static void gdk_x11_draw_segments (GdkDrawable *drawable, + GdkGC *gc, + GdkSegment *segs, + gint nsegs); +static void gdk_x11_draw_lines (GdkDrawable *drawable, + GdkGC *gc, + GdkPoint *points, + gint npoints); + + +GdkDrawableClass _gdk_x11_drawable_class = { + gdk_x11_drawable_destroy, + _gdk_x11_gc_new, + gdk_x11_draw_rectangle, + gdk_x11_draw_arc, + gdk_x11_draw_polygon, + gdk_x11_draw_text, + gdk_x11_draw_text_wc, + gdk_x11_draw_drawable, + gdk_x11_draw_points, + gdk_x11_draw_segments, + gdk_x11_draw_lines +}; + +/***************************************************** + * X11 specific implementations of generic functions * + *****************************************************/ + +GdkColormap* +gdk_drawable_get_colormap (GdkDrawable *drawable) +{ + GdkDrawablePrivate *drawable_private; + XWindowAttributes window_attributes; + + g_return_val_if_fail (drawable != NULL, NULL); + drawable_private = (GdkDrawablePrivate*) drawable; + + if (!GDK_DRAWABLE_DESTROYED (drawable)) + { + if (drawable_private->colormap == NULL && + GDK_IS_WINDOW (drawable)) + { + XGetWindowAttributes (GDK_DRAWABLE_XDISPLAY (drawable), + GDK_DRAWABLE_XID (drawable), + &window_attributes); + drawable_private->colormap = gdk_colormap_lookup (window_attributes.colormap); + } + + return drawable_private->colormap; + } + + return NULL; +} + +void +gdk_drawable_set_colormap (GdkDrawable *drawable, + GdkColormap *colormap) +{ + GdkDrawablePrivate *drawable_private; + GdkColormapPrivateX *colormap_private; + + g_return_if_fail (drawable != NULL); + g_return_if_fail (colormap != NULL); + + drawable_private = (GdkDrawablePrivate *)drawable; + colormap_private = (GdkColormapPrivateX *)colormap; + + if (!GDK_DRAWABLE_DESTROYED (drawable)) + { + if (GDK_IS_WINDOW (drawable)) + { + g_return_if_fail (colormap_private->base.visual != + ((GdkColormapPrivate *)(drawable_private->colormap))->visual); + + XSetWindowColormap (GDK_DRAWABLE_XDISPLAY (drawable), + GDK_DRAWABLE_XID (drawable), + colormap_private->xcolormap); + } + + if (drawable_private->colormap) + gdk_colormap_unref (drawable_private->colormap); + drawable_private->colormap = colormap; + gdk_colormap_ref (drawable_private->colormap); + + if (GDK_IS_WINDOW (drawable) && + drawable_private->window_type != GDK_WINDOW_TOPLEVEL) + gdk_window_add_colormap_windows (drawable); + } +} + +/* Drawing + */ +static void +gdk_x11_drawable_destroy (GdkDrawable *drawable) +{ + +} + +static void +gdk_x11_draw_rectangle (GdkDrawable *drawable, + GdkGC *gc, + gint filled, + gint x, + gint y, + gint width, + gint height) +{ + if (filled) + XFillRectangle (GDK_DRAWABLE_XDISPLAY (drawable), GDK_DRAWABLE_XID (drawable), + GDK_GC_XGC (gc), x, y, width, height); + else + XDrawRectangle (GDK_DRAWABLE_XDISPLAY (drawable), GDK_DRAWABLE_XID (drawable), + GDK_GC_XGC (gc), x, y, width, height); +} + +static void +gdk_x11_draw_arc (GdkDrawable *drawable, + GdkGC *gc, + gint filled, + gint x, + gint y, + gint width, + gint height, + gint angle1, + gint angle2) +{ + if (filled) + XFillArc (GDK_DRAWABLE_XDISPLAY (drawable), GDK_DRAWABLE_XID (drawable), + GDK_GC_XGC (gc), x, y, width, height, angle1, angle2); + else + XDrawArc (GDK_DRAWABLE_XDISPLAY (drawable), GDK_DRAWABLE_XID (drawable), + GDK_GC_XGC (gc), x, y, width, height, angle1, angle2); +} + +static void +gdk_x11_draw_polygon (GdkDrawable *drawable, + GdkGC *gc, + gint filled, + GdkPoint *points, + gint npoints) +{ + if (filled) + { + XFillPolygon (GDK_DRAWABLE_XDISPLAY (drawable), GDK_DRAWABLE_XID (drawable), + GDK_GC_XGC (gc), (XPoint*) points, npoints, Complex, CoordModeOrigin); + } + else + { + GdkPoint *local_points = points; + gint local_npoints = npoints; + gint local_alloc = 0; + + if ((points[0].x != points[npoints-1].x) || + (points[0].y != points[npoints-1].y)) + { + local_alloc = 1; + ++local_npoints; + local_points = (GdkPoint*) g_malloc (local_npoints * sizeof(GdkPoint)); + memcpy (local_points, points, npoints * sizeof(GdkPoint)); + local_points[npoints].x = points[0].x; + local_points[npoints].y = points[0].y; + } + + XDrawLines (GDK_DRAWABLE_XDISPLAY (drawable), GDK_DRAWABLE_XID (drawable), + GDK_GC_XGC (gc), + (XPoint*) local_points, local_npoints, + CoordModeOrigin); + + if (local_alloc) + g_free (local_points); + } +} + +/* gdk_x11_draw_text + * + * Modified by Li-Da Lho to draw 16 bits and Multibyte strings + * + * Interface changed: add "GdkFont *font" to specify font or fontset explicitely + */ +static void +gdk_x11_draw_text (GdkDrawable *drawable, + GdkFont *font, + GdkGC *gc, + gint x, + gint y, + const gchar *text, + gint text_length) +{ + if (font->type == GDK_FONT_FONT) + { + XFontStruct *xfont = (XFontStruct *) GDK_FONT_XFONT (font); + XSetFont(GDK_DRAWABLE_XDISPLAY (drawable), GDK_GC_XGC (gc), xfont->fid); + if ((xfont->min_byte1 == 0) && (xfont->max_byte1 == 0)) + { + XDrawString (GDK_DRAWABLE_XDISPLAY (drawable), GDK_DRAWABLE_XID (drawable), + GDK_GC_XGC (gc), x, y, text, text_length); + } + else + { + XDrawString16 (GDK_DRAWABLE_XDISPLAY (drawable), GDK_DRAWABLE_XID (drawable), + GDK_GC_XGC (gc), x, y, (XChar2b *) text, text_length / 2); + } + } + else if (font->type == GDK_FONT_FONTSET) + { + XFontSet fontset = (XFontSet) GDK_FONT_XFONT (font); + XmbDrawString (GDK_DRAWABLE_XDISPLAY (drawable), GDK_DRAWABLE_XID (drawable), + fontset, GDK_GC_XGC (gc), x, y, text, text_length); + } + else + g_error("undefined font type\n"); +} + +static void +gdk_x11_draw_text_wc (GdkDrawable *drawable, + GdkFont *font, + GdkGC *gc, + gint x, + gint y, + const GdkWChar *text, + gint text_length) +{ + if (font->type == GDK_FONT_FONT) + { + XFontStruct *xfont = (XFontStruct *) GDK_FONT_XFONT (font); + gchar *text_8bit; + gint i; + XSetFont(GDK_DRAWABLE_XDISPLAY (drawable), GDK_GC_XGC (gc), xfont->fid); + text_8bit = g_new (gchar, text_length); + for (i=0; i<text_length; i++) text_8bit[i] = text[i]; + XDrawString (GDK_DRAWABLE_XDISPLAY (drawable), GDK_DRAWABLE_XID (drawable), + GDK_GC_XGC (gc), x, y, text_8bit, text_length); + g_free (text_8bit); + } + else if (font->type == GDK_FONT_FONTSET) + { + if (sizeof(GdkWChar) == sizeof(wchar_t)) + { + XwcDrawString (GDK_DRAWABLE_XDISPLAY (drawable), GDK_DRAWABLE_XID (drawable), + (XFontSet) GDK_FONT_XFONT (font), + GDK_GC_XGC (gc), x, y, (wchar_t *)text, text_length); + } + else + { + wchar_t *text_wchar; + gint i; + text_wchar = g_new (wchar_t, text_length); + for (i=0; i<text_length; i++) text_wchar[i] = text[i]; + XwcDrawString (GDK_DRAWABLE_XDISPLAY (drawable), GDK_DRAWABLE_XID (drawable), + (XFontSet) GDK_FONT_XFONT (font), + GDK_GC_XGC (gc), x, y, text_wchar, text_length); + g_free (text_wchar); + } + } + else + g_error("undefined font type\n"); +} + +static void +gdk_x11_draw_drawable (GdkDrawable *drawable, + GdkGC *gc, + GdkPixmap *src, + gint xsrc, + gint ysrc, + gint xdest, + gint ydest, + gint width, + gint height) +{ + /* FIXME: this doesn't work because bitmaps don't have visuals */ + if (gdk_drawable_get_visual (src)->depth == 1) + { + XCopyArea (GDK_DRAWABLE_XDISPLAY (drawable), + GDK_DRAWABLE_XID (src), + GDK_DRAWABLE_XID (drawable), + GDK_GC_XGC (gc), + xsrc, ysrc, + width, height, + xdest, ydest); + } + else + { + XCopyArea (GDK_DRAWABLE_XDISPLAY (drawable), + GDK_DRAWABLE_XID (src), + GDK_DRAWABLE_XID (drawable), + GDK_GC_XGC (gc), + xsrc, ysrc, + width, height, + xdest, ydest); + } +} + +static void +gdk_x11_draw_points (GdkDrawable *drawable, + GdkGC *gc, + GdkPoint *points, + gint npoints) +{ + /* We special-case npoints == 1, because X will merge multiple + * consecutive XDrawPoint requests into a PolyPoint request + */ + if (npoints == 1) + { + XDrawPoint (GDK_DRAWABLE_XDISPLAY (drawable), + GDK_DRAWABLE_XID (drawable), + GDK_GC_XGC (gc), + points[0].x, points[0].y); + } + else + { + XDrawPoints (GDK_DRAWABLE_XDISPLAY (drawable), + GDK_DRAWABLE_XID (drawable), + GDK_GC_XGC (gc), + (XPoint *) points, + npoints, + CoordModeOrigin); + } +} + +static void +gdk_x11_draw_segments (GdkDrawable *drawable, + GdkGC *gc, + GdkSegment *segs, + gint nsegs) +{ + /* We special-case nsegs == 1, because X will merge multiple + * consecutive XDrawLine requests into a PolySegment request + */ + if (nsegs == 1) + { + XDrawLine (GDK_DRAWABLE_XDISPLAY (drawable), GDK_DRAWABLE_XID (drawable), + GDK_GC_XGC (gc), segs[0].x1, segs[0].y1, + segs[0].x2, segs[0].y2); + } + else + { + XDrawSegments (GDK_DRAWABLE_XDISPLAY (drawable), + GDK_DRAWABLE_XID (drawable), + GDK_GC_XGC (gc), + (XSegment *) segs, + nsegs); + } +} + +static void +gdk_x11_draw_lines (GdkDrawable *drawable, + GdkGC *gc, + GdkPoint *points, + gint npoints) +{ + XDrawLines (GDK_DRAWABLE_XDISPLAY (drawable), + GDK_DRAWABLE_XID (drawable), + GDK_GC_XGC (gc), + (XPoint *) points, + npoints, + CoordModeOrigin); +} diff --git a/gdk/x11/gdkevents-x11.c b/gdk/x11/gdkevents-x11.c index 1738a0dbbe..c15fe8ce2b 100644 --- a/gdk/x11/gdkevents-x11.c +++ b/gdk/x11/gdkevents-x11.c @@ -73,7 +73,6 @@ struct _GdkEventPrivate * Private function declarations */ -static GdkEvent *gdk_event_new (void); static gint gdk_event_apply_filters (XEvent *xevent, GdkEvent *event, GList *filters); @@ -84,8 +83,6 @@ static Bool gdk_event_get_type (Display *display, XEvent *xevent, XPointer arg); #endif -static void gdk_events_queue (void); -static GdkEvent* gdk_event_unqueue (void); static gboolean gdk_event_prepare (gpointer source_data, GTimeVal *current_time, @@ -98,9 +95,6 @@ static gboolean gdk_event_dispatch (gpointer source_data, GTimeVal *current_time, gpointer user_data); -static void gdk_synthesize_click (GdkEvent *event, - gint nclicks); - GdkFilterReturn gdk_wm_protocols_filter (GdkXEvent *xev, GdkEvent *event, gpointer data); @@ -114,28 +108,8 @@ static int connection_number = 0; /* The file descriptor number of our * when events are pending by using * the "select" system call. */ -static guint32 button_click_time[2]; /* The last 2 button click times. Used - * to determine if the latest button click - * is part of a double or triple click. - */ -static GdkWindow *button_window[2]; /* The last 2 windows to receive button presses. - * Also used to determine if the latest button - * click is part of a double or triple click. - */ -static guint button_number[2]; /* The last 2 buttons to be pressed. - */ -static GdkEventFunc event_func = NULL; /* Callback for events */ -static gpointer event_data = NULL; -static GDestroyNotify event_notify = NULL; - static GList *client_filters; /* Filters for client messages */ -/* FIFO's for event queue, and for events put back using - * gdk_event_put(). - */ -static GList *queued_events = NULL; -static GList *queued_tail = NULL; - static GSourceFuncs event_funcs = { gdk_event_prepare, gdk_event_check, @@ -149,75 +123,6 @@ GPollFD event_poll_fd; * Functions for maintaining the event queue * *********************************************/ -/************************************************************* - * gdk_event_queue_find_first: - * Find the first event on the queue that is not still - * being filled in. - * arguments: - * - * results: - * Pointer to the list node for that event, or NULL - *************************************************************/ - -static GList* -gdk_event_queue_find_first (void) -{ - GList *tmp_list = queued_events; - - while (tmp_list) - { - GdkEventPrivate *event = tmp_list->data; - if (!(event->flags & GDK_EVENT_PENDING)) - return tmp_list; - - tmp_list = g_list_next (tmp_list); - } - - return NULL; -} - -/************************************************************* - * gdk_event_queue_remove_link: - * Remove a specified list node from the event queue. - * arguments: - * node: Node to remove. - * results: - *************************************************************/ - -static void -gdk_event_queue_remove_link (GList *node) -{ - if (node->prev) - node->prev->next = node->next; - else - queued_events = node->next; - - if (node->next) - node->next->prev = node->prev; - else - queued_tail = node->prev; - -} - -/************************************************************* - * gdk_event_queue_append: - * Append an event onto the tail of the event queue. - * arguments: - * event: Event to append. - * results: - *************************************************************/ - -static void -gdk_event_queue_append (GdkEvent *event) -{ - queued_tail = g_list_append (queued_tail, event); - - if (!queued_events) - queued_events = queued_tail; - else - queued_tail = queued_tail->next; -} - void gdk_events_init (void) { @@ -232,13 +137,6 @@ gdk_events_init (void) g_main_add_poll (&event_poll_fd, GDK_PRIORITY_EVENTS); - button_click_time[0] = 0; - button_click_time[1] = 0; - button_window[0] = NULL; - button_window[1] = NULL; - button_number[0] = -1; - button_number[1] = -1; - gdk_add_client_message_filter (gdk_wm_protocols, gdk_wm_protocols_filter, NULL); } @@ -525,410 +423,6 @@ gdk_compress_exposures (XEvent *xevent, xevent->xexpose.height = rect1.height; } -/************************************************************* - * gdk_event_handler_set: - * - * arguments: - * func: Callback function to be called for each event. - * data: Data supplied to the function - * notify: function called when function is no longer needed - * - * results: - *************************************************************/ - -void -gdk_event_handler_set (GdkEventFunc func, - gpointer data, - GDestroyNotify notify) -{ - if (event_notify) - (*event_notify) (event_data); - - event_func = func; - event_data = data; - event_notify = notify; -} - -/* - *-------------------------------------------------------------- - * gdk_event_get - * - * Gets the next event. - * - * Arguments: - * - * Results: - * If an event is waiting that we care about, returns - * a pointer to that event, to be freed with gdk_event_free. - * Otherwise, returns NULL. - * - * Side effects: - * - *-------------------------------------------------------------- - */ - -GdkEvent* -gdk_event_get (void) -{ - gdk_events_queue (); - - return gdk_event_unqueue (); -} - -/* - *-------------------------------------------------------------- - * gdk_event_peek - * - * Gets the next event. - * - * Arguments: - * - * Results: - * If an event is waiting that we care about, returns - * a copy of that event, but does not remove it from - * the queue. The pointer is to be freed with gdk_event_free. - * Otherwise, returns NULL. - * - * Side effects: - * - *-------------------------------------------------------------- - */ - -GdkEvent* -gdk_event_peek (void) -{ - GList *tmp_list; - - tmp_list = gdk_event_queue_find_first (); - - if (tmp_list) - return gdk_event_copy (tmp_list->data); - else - return NULL; -} - -void -gdk_event_put (GdkEvent *event) -{ - GdkEvent *new_event; - - g_return_if_fail (event != NULL); - - new_event = gdk_event_copy (event); - - gdk_event_queue_append (new_event); -} - -/* - *-------------------------------------------------------------- - * gdk_event_copy - * - * Copy a event structure into new storage. - * - * Arguments: - * "event" is the event struct to copy. - * - * Results: - * A new event structure. Free it with gdk_event_free. - * - * Side effects: - * The reference count of the window in the event is increased. - * - *-------------------------------------------------------------- - */ - -static GMemChunk *event_chunk = NULL; - -static GdkEvent* -gdk_event_new (void) -{ - GdkEventPrivate *new_event; - - if (event_chunk == NULL) - event_chunk = g_mem_chunk_new ("events", - sizeof (GdkEventPrivate), - 4096, - G_ALLOC_AND_FREE); - - new_event = g_chunk_new (GdkEventPrivate, event_chunk); - new_event->flags = 0; - - return (GdkEvent*) new_event; -} - -GdkEvent* -gdk_event_copy (GdkEvent *event) -{ - GdkEvent *new_event; - - g_return_val_if_fail (event != NULL, NULL); - - new_event = gdk_event_new (); - - *new_event = *event; - gdk_window_ref (new_event->any.window); - - switch (event->any.type) - { - case GDK_KEY_PRESS: - case GDK_KEY_RELEASE: - new_event->key.string = g_strdup (event->key.string); - break; - - case GDK_ENTER_NOTIFY: - case GDK_LEAVE_NOTIFY: - if (event->crossing.subwindow != NULL) - gdk_window_ref (event->crossing.subwindow); - break; - - case GDK_DRAG_ENTER: - case GDK_DRAG_LEAVE: - case GDK_DRAG_MOTION: - case GDK_DRAG_STATUS: - case GDK_DROP_START: - case GDK_DROP_FINISHED: - gdk_drag_context_ref (event->dnd.context); - break; - - default: - break; - } - - return new_event; -} - -/* - *-------------------------------------------------------------- - * gdk_event_free - * - * Free a event structure obtained from gdk_event_copy. Do not use - * with other event structures. - * - * Arguments: - * "event" is the event struct to free. - * - * Results: - * - * Side effects: - * The reference count of the window in the event is decreased and - * might be freed, too. - * - *-------------------------------------------------------------- */ - -void -gdk_event_free (GdkEvent *event) -{ - g_return_if_fail (event != NULL); - - g_assert (event_chunk != NULL); /* paranoid */ - - if (event->any.window) - gdk_window_unref (event->any.window); - - switch (event->any.type) - { - case GDK_KEY_PRESS: - case GDK_KEY_RELEASE: - g_free (event->key.string); - break; - - case GDK_ENTER_NOTIFY: - case GDK_LEAVE_NOTIFY: - if (event->crossing.subwindow != NULL) - gdk_window_unref (event->crossing.subwindow); - break; - - case GDK_DRAG_ENTER: - case GDK_DRAG_LEAVE: - case GDK_DRAG_MOTION: - case GDK_DRAG_STATUS: - case GDK_DROP_START: - case GDK_DROP_FINISHED: - gdk_drag_context_unref (event->dnd.context); - break; - - default: - break; - } - - g_mem_chunk_free (event_chunk, event); -} - -/* - *-------------------------------------------------------------- - * gdk_event_get_time: - * Get the timestamp from an event. - * arguments: - * event: - * results: - * The event's time stamp, if it has one, otherwise - * GDK_CURRENT_TIME. - *-------------------------------------------------------------- - */ - -guint32 -gdk_event_get_time (GdkEvent *event) -{ - if (event) - switch (event->type) - { - case GDK_MOTION_NOTIFY: - return event->motion.time; - case GDK_BUTTON_PRESS: - case GDK_2BUTTON_PRESS: - case GDK_3BUTTON_PRESS: - case GDK_BUTTON_RELEASE: - return event->button.time; - case GDK_KEY_PRESS: - case GDK_KEY_RELEASE: - return event->key.time; - case GDK_ENTER_NOTIFY: - case GDK_LEAVE_NOTIFY: - return event->crossing.time; - case GDK_PROPERTY_NOTIFY: - return event->property.time; - case GDK_SELECTION_CLEAR: - case GDK_SELECTION_REQUEST: - case GDK_SELECTION_NOTIFY: - return event->selection.time; - case GDK_PROXIMITY_IN: - case GDK_PROXIMITY_OUT: - return event->proximity.time; - case GDK_DRAG_ENTER: - case GDK_DRAG_LEAVE: - case GDK_DRAG_MOTION: - case GDK_DRAG_STATUS: - case GDK_DROP_START: - case GDK_DROP_FINISHED: - return event->dnd.time; - default: /* use current time */ - break; - } - - return GDK_CURRENT_TIME; -} - -/* - *-------------------------------------------------------------- - * gdk_set_show_events - * - * Turns on/off the showing of events. - * - * Arguments: - * "show_events" is a boolean describing whether or - * not to show the events gdk receives. - * - * Results: - * - * Side effects: - * When "show_events" is TRUE, calls to "gdk_event_get" - * will output debugging informatin regarding the event - * received to stdout. - * - *-------------------------------------------------------------- - */ - -void -gdk_set_show_events (gint show_events) -{ - if (show_events) - gdk_debug_flags |= GDK_DEBUG_EVENTS; - else - gdk_debug_flags &= ~GDK_DEBUG_EVENTS; -} - -gint -gdk_get_show_events (void) -{ - return gdk_debug_flags & GDK_DEBUG_EVENTS; -} - -static void -gdk_io_destroy (gpointer data) -{ - GdkIOClosure *closure = data; - - if (closure->notify) - closure->notify (closure->data); - - g_free (closure); -} - -/* What do we do with G_IO_NVAL? - */ -#define READ_CONDITION (G_IO_IN | G_IO_HUP | G_IO_ERR) -#define WRITE_CONDITION (G_IO_OUT | G_IO_ERR) -#define EXCEPTION_CONDITION (G_IO_PRI) - -static gboolean -gdk_io_invoke (GIOChannel *source, - GIOCondition condition, - gpointer data) -{ - GdkIOClosure *closure = data; - GdkInputCondition gdk_cond = 0; - - if (condition & READ_CONDITION) - gdk_cond |= GDK_INPUT_READ; - if (condition & WRITE_CONDITION) - gdk_cond |= GDK_INPUT_WRITE; - if (condition & EXCEPTION_CONDITION) - gdk_cond |= GDK_INPUT_EXCEPTION; - - if (closure->condition & gdk_cond) - closure->function (closure->data, g_io_channel_unix_get_fd (source), gdk_cond); - - return TRUE; -} - -gint -gdk_input_add_full (gint source, - GdkInputCondition condition, - GdkInputFunction function, - gpointer data, - GdkDestroyNotify destroy) -{ - guint result; - GdkIOClosure *closure = g_new (GdkIOClosure, 1); - GIOChannel *channel; - GIOCondition cond = 0; - - closure->function = function; - closure->condition = condition; - closure->notify = destroy; - closure->data = data; - - if (condition & GDK_INPUT_READ) - cond |= READ_CONDITION; - if (condition & GDK_INPUT_WRITE) - cond |= WRITE_CONDITION; - if (condition & GDK_INPUT_EXCEPTION) - cond |= EXCEPTION_CONDITION; - - channel = g_io_channel_unix_new (source); - result = g_io_add_watch_full (channel, G_PRIORITY_DEFAULT, cond, - gdk_io_invoke, - closure, gdk_io_destroy); - g_io_channel_unref (channel); - - return result; -} - -gint -gdk_input_add (gint source, - GdkInputCondition condition, - GdkInputFunction function, - gpointer data) -{ - return gdk_input_add_full (source, condition, function, data, NULL); -} - -void -gdk_input_remove (gint tag) -{ - g_source_remove (tag); -} - static gint gdk_event_apply_filters (XEvent *xevent, GdkEvent *event, @@ -1220,43 +714,9 @@ gdk_event_translate (GdkEvent *event, event->button.button = xevent->xbutton.button; event->button.source = GDK_SOURCE_MOUSE; event->button.deviceid = GDK_CORE_POINTER; - - if ((event->button.time < (button_click_time[1] + TRIPLE_CLICK_TIME)) && - (event->button.window == button_window[1]) && - (event->button.button == button_number[1])) - { - gdk_synthesize_click (event, 3); - - button_click_time[1] = 0; - button_click_time[0] = 0; - button_window[1] = NULL; - button_window[0] = 0; - button_number[1] = -1; - button_number[0] = -1; - } - else if ((event->button.time < (button_click_time[0] + DOUBLE_CLICK_TIME)) && - (event->button.window == button_window[0]) && - (event->button.button == button_number[0])) - { - gdk_synthesize_click (event, 2); - - button_click_time[1] = button_click_time[0]; - button_click_time[0] = event->button.time; - button_window[1] = button_window[0]; - button_window[0] = event->button.window; - button_number[1] = button_number[0]; - button_number[0] = event->button.button; - } - else - { - button_click_time[1] = 0; - button_click_time[0] = event->button.time; - button_window[1] = NULL; - button_window[0] = event->button.window; - button_number[1] = -1; - button_number[0] = event->button.button; - } + gdk_event_button_generate (event); + break; case ButtonRelease: @@ -1972,7 +1432,7 @@ gdk_event_get_type (Display *display, } #endif -static void +void gdk_events_queue (void) { GList *node; @@ -2011,7 +1471,7 @@ gdk_events_queue (void) ((GdkEventPrivate *)event)->flags |= GDK_EVENT_PENDING; gdk_event_queue_append (event); - node = queued_tail; + node = gdk_queued_tail; if (gdk_event_translate (event, &xevent)) { @@ -2064,24 +1524,6 @@ gdk_event_check (gpointer source_data, return retval; } -static GdkEvent* -gdk_event_unqueue (void) -{ - GdkEvent *event = NULL; - GList *tmp_list; - - tmp_list = gdk_event_queue_find_first (); - - if (tmp_list) - { - event = tmp_list->data; - gdk_event_queue_remove_link (tmp_list); - g_list_free_1 (tmp_list); - } - - return event; -} - static gboolean gdk_event_dispatch (gpointer source_data, GTimeVal *current_time, @@ -2096,8 +1538,8 @@ gdk_event_dispatch (gpointer source_data, if (event) { - if (event_func) - (*event_func) (event, event_data); + if (gdk_event_func) + (*gdk_event_func) (event, gdk_event_data); gdk_event_free (event); } @@ -2107,20 +1549,6 @@ gdk_event_dispatch (gpointer source_data, return TRUE; } -static void -gdk_synthesize_click (GdkEvent *event, - gint nclicks) -{ - GdkEvent temp_event; - - g_return_if_fail (event != NULL); - - temp_event = *event; - temp_event.type = (nclicks == 2) ? GDK_2BUTTON_PRESS : GDK_3BUTTON_PRESS; - - gdk_event_put (&temp_event); -} - /* Sends a ClientMessage to all toplevel client windows */ gboolean gdk_event_send_client_message (GdkEvent *event, guint32 xid) diff --git a/gdk/x11/gdkfont-x11.c b/gdk/x11/gdkfont-x11.c index a3a3502fba..55b4524fce 100644 --- a/gdk/x11/gdkfont-x11.c +++ b/gdk/x11/gdkfont-x11.c @@ -27,7 +27,7 @@ #include <X11/Xlib.h> #include <X11/Xos.h> #include "gdkfont.h" -#include "gdkprivate.h" +#include "gdkx.h" static GHashTable *font_name_hash = NULL; static GHashTable *fontset_name_hash = NULL; @@ -35,7 +35,7 @@ static GHashTable *fontset_name_hash = NULL; static void gdk_font_hash_insert (GdkFontType type, GdkFont *font, const gchar *font_name) { - GdkFontPrivate *private = (GdkFontPrivate *)font; + GdkFontPrivateX *private = (GdkFontPrivateX *)font; GHashTable **hashp = (type == GDK_FONT_FONT) ? &font_name_hash : &fontset_name_hash; @@ -49,7 +49,7 @@ gdk_font_hash_insert (GdkFontType type, GdkFont *font, const gchar *font_name) static void gdk_font_hash_remove (GdkFontType type, GdkFont *font) { - GdkFontPrivate *private = (GdkFontPrivate *)font; + GdkFontPrivateX *private = (GdkFontPrivateX *)font; GSList *tmp_list; GHashTable *hash = (type == GDK_FONT_FONT) ? font_name_hash : fontset_name_hash; @@ -90,7 +90,7 @@ GdkFont* gdk_font_load (const gchar *font_name) { GdkFont *font; - GdkFontPrivate *private; + GdkFontPrivateX *private; XFontStruct *xfont; g_return_val_if_fail (font_name != NULL, NULL); @@ -106,7 +106,7 @@ gdk_font_load (const gchar *font_name) font = gdk_font_lookup (xfont->fid); if (font != NULL) { - private = (GdkFontPrivate *) font; + private = (GdkFontPrivateX *) font; if (xfont != private->xfont) XFreeFont (gdk_display, xfont); @@ -114,10 +114,10 @@ gdk_font_load (const gchar *font_name) } else { - private = g_new (GdkFontPrivate, 1); + private = g_new (GdkFontPrivateX, 1); private->xdisplay = gdk_display; private->xfont = xfont; - private->ref_count = 1; + private->base.ref_count = 1; private->names = NULL; font = (GdkFont*) private; @@ -137,7 +137,7 @@ GdkFont* gdk_fontset_load (gchar *fontset_name) { GdkFont *font; - GdkFontPrivate *private; + GdkFontPrivateX *private; XFontSet fontset; gint missing_charset_count; gchar **missing_charset_list; @@ -147,7 +147,7 @@ gdk_fontset_load (gchar *fontset_name) if (font) return font; - private = g_new (GdkFontPrivate, 1); + private = g_new (GdkFontPrivateX, 1); font = (GdkFont*) private; private->xdisplay = gdk_display; @@ -164,7 +164,7 @@ gdk_fontset_load (gchar *fontset_name) XFreeStringList (missing_charset_list); } - private->ref_count = 1; + private->base.ref_count = 1; if (!fontset) { @@ -197,57 +197,74 @@ gdk_fontset_load (gchar *fontset_name) } } -GdkFont* -gdk_font_ref (GdkFont *font) +void +_gdk_font_destroy (GdkFont *font) { - GdkFontPrivate *private; - - g_return_val_if_fail (font != NULL, NULL); - - private = (GdkFontPrivate*) font; - private->ref_count += 1; - return font; + GdkFontPrivateX *private = (GdkFontPrivateX *)font; + + gdk_font_hash_remove (font->type, font); + + switch (font->type) + { + case GDK_FONT_FONT: + gdk_xid_table_remove (((XFontStruct *) private->xfont)->fid); + XFreeFont (private->xdisplay, (XFontStruct *) private->xfont); + break; + case GDK_FONT_FONTSET: + XFreeFontSet (private->xdisplay, (XFontSet) private->xfont); + break; + default: + g_error ("unknown font type."); + break; + } + g_free (font); } -void -gdk_font_unref (GdkFont *font) +gint +_gdk_font_strlen (GdkFont *font, + const gchar *str) { - GdkFontPrivate *private; - private = (GdkFontPrivate*) font; + GdkFontPrivateX *font_private; + gint length = 0; - g_return_if_fail (font != NULL); - g_return_if_fail (private->ref_count > 0); + g_return_val_if_fail (font != NULL, -1); + g_return_val_if_fail (str != NULL, -1); - private->ref_count -= 1; - if (private->ref_count == 0) + font_private = (GdkFontPrivateX*) font; + + if (font->type == GDK_FONT_FONT) { - gdk_font_hash_remove (font->type, font); - - switch (font->type) + XFontStruct *xfont = (XFontStruct *) font_private->xfont; + if ((xfont->min_byte1 == 0) && (xfont->max_byte1 == 0)) { - case GDK_FONT_FONT: - gdk_xid_table_remove (((XFontStruct *) private->xfont)->fid); - XFreeFont (private->xdisplay, (XFontStruct *) private->xfont); - break; - case GDK_FONT_FONTSET: - XFreeFontSet (private->xdisplay, (XFontSet) private->xfont); - break; - default: - g_error ("unknown font type."); - break; + length = strlen (str); } - g_free (font); + else + { + guint16 *string_2b = (guint16 *)str; + + while (*(string_2b++)) + length++; + } + } + else if (font->type == GDK_FONT_FONTSET) + { + length = strlen (str); } + else + g_error("undefined font type\n"); + + return length; } gint gdk_font_id (const GdkFont *font) { - const GdkFontPrivate *font_private; + const GdkFontPrivateX *font_private; g_return_val_if_fail (font != NULL, 0); - font_private = (const GdkFontPrivate*) font; + font_private = (const GdkFontPrivateX*) font; if (font->type == GDK_FONT_FONT) { @@ -263,14 +280,14 @@ gint gdk_font_equal (const GdkFont *fonta, const GdkFont *fontb) { - const GdkFontPrivate *privatea; - const GdkFontPrivate *privateb; + const GdkFontPrivateX *privatea; + const GdkFontPrivateX *privateb; g_return_val_if_fail (fonta != NULL, FALSE); g_return_val_if_fail (fontb != NULL, FALSE); - privatea = (const GdkFontPrivate*) fonta; - privateb = (const GdkFontPrivate*) fontb; + privatea = (const GdkFontPrivateX*) fonta; + privateb = (const GdkFontPrivateX*) fontb; if (fonta->type == GDK_FONT_FONT && fontb->type == GDK_FONT_FONT) { @@ -292,49 +309,11 @@ gdk_font_equal (const GdkFont *fonta, } gint -gdk_string_width (GdkFont *font, - const gchar *string) -{ - GdkFontPrivate *font_private; - gint width; - XFontStruct *xfont; - XFontSet fontset; - - g_return_val_if_fail (font != NULL, -1); - g_return_val_if_fail (string != NULL, -1); - - font_private = (GdkFontPrivate*) font; - - switch (font->type) - { - case GDK_FONT_FONT: - xfont = (XFontStruct *) font_private->xfont; - if ((xfont->min_byte1 == 0) && (xfont->max_byte1 == 0)) - { - width = XTextWidth (xfont, string, strlen (string)); - } - else - { - width = XTextWidth16 (xfont, (XChar2b *) string, strlen (string) / 2); - } - break; - case GDK_FONT_FONTSET: - fontset = (XFontSet) font_private->xfont; - width = XmbTextEscapement (fontset, string, strlen(string)); - break; - default: - width = 0; - } - - return width; -} - -gint gdk_text_width (GdkFont *font, const gchar *text, gint text_length) { - GdkFontPrivate *private; + GdkFontPrivateX *private; gint width; XFontStruct *xfont; XFontSet fontset; @@ -342,7 +321,7 @@ gdk_text_width (GdkFont *font, g_return_val_if_fail (font != NULL, -1); g_return_val_if_fail (text != NULL, -1); - private = (GdkFontPrivate*) font; + private = (GdkFontPrivateX*) font; switch (font->type) { @@ -372,7 +351,7 @@ gdk_text_width_wc (GdkFont *font, const GdkWChar *text, gint text_length) { - GdkFontPrivate *private; + GdkFontPrivateX *private; gint width; XFontStruct *xfont; XFontSet fontset; @@ -380,7 +359,7 @@ gdk_text_width_wc (GdkFont *font, g_return_val_if_fail (font != NULL, -1); g_return_val_if_fail (text != NULL, -1); - private = (GdkFontPrivate*) font; + private = (GdkFontPrivateX*) font; switch (font->type) { @@ -423,113 +402,6 @@ gdk_text_width_wc (GdkFont *font, return width; } -/* Problem: What if a character is a 16 bits character ?? */ -gint -gdk_char_width (GdkFont *font, - gchar character) -{ - GdkFontPrivate *private; - XCharStruct *chars; - gint width; - guint ch = character & 0xff; /* get rid of sign-extension */ - XFontStruct *xfont; - XFontSet fontset; - - g_return_val_if_fail (font != NULL, -1); - - private = (GdkFontPrivate*) font; - - switch (font->type) - { - case GDK_FONT_FONT: - /* only 8 bits characters are considered here */ - xfont = (XFontStruct *) private->xfont; - if ((xfont->min_byte1 == 0) && - (xfont->max_byte1 == 0) && - (ch >= xfont->min_char_or_byte2) && - (ch <= xfont->max_char_or_byte2)) - { - chars = xfont->per_char; - if (chars) - width = chars[ch - xfont->min_char_or_byte2].width; - else - width = xfont->min_bounds.width; - } - else - { - width = XTextWidth (xfont, &character, 1); - } - break; - case GDK_FONT_FONTSET: - fontset = (XFontSet) private->xfont; - width = XmbTextEscapement (fontset, &character, 1) ; - break; - default: - width = 0; - } - return width; -} - -gint -gdk_char_width_wc (GdkFont *font, - GdkWChar character) -{ - GdkFontPrivate *private; - XCharStruct *chars; - gint width; - guint ch = character & 0xff; /* get rid of sign-extension */ - XFontStruct *xfont; - XFontSet fontset; - - g_return_val_if_fail (font != NULL, -1); - - private = (GdkFontPrivate*) font; - - switch (font->type) - { - case GDK_FONT_FONT: - /* only 8 bits characters are considered here */ - xfont = (XFontStruct *) private->xfont; - if ((xfont->min_byte1 == 0) && - (xfont->max_byte1 == 0) && - (ch >= xfont->min_char_or_byte2) && - (ch <= xfont->max_char_or_byte2)) - { - chars = xfont->per_char; - if (chars) - width = chars[ch - xfont->min_char_or_byte2].width; - else - width = xfont->min_bounds.width; - } - else - { - char ch2 = character; - width = XTextWidth (xfont, &ch2, 1); - } - break; - case GDK_FONT_FONTSET: - fontset = (XFontSet) private->xfont; - { - wchar_t char_wc = character; - width = XwcTextEscapement (fontset, &char_wc, 1) ; - } - break; - default: - width = 0; - } - return width; -} - -gint -gdk_string_measure (GdkFont *font, - const gchar *string) -{ - g_return_val_if_fail (font != NULL, -1); - g_return_val_if_fail (string != NULL, -1); - - return gdk_text_measure (font, string, strlen (string)); -} - void gdk_text_extents (GdkFont *font, const gchar *text, @@ -540,7 +412,7 @@ gdk_text_extents (GdkFont *font, gint *ascent, gint *descent) { - GdkFontPrivate *private; + GdkFontPrivateX *private; XCharStruct overall; XFontStruct *xfont; XFontSet fontset; @@ -552,7 +424,7 @@ gdk_text_extents (GdkFont *font, g_return_if_fail (font != NULL); g_return_if_fail (text != NULL); - private = (GdkFontPrivate*) font; + private = (GdkFontPrivateX*) font; switch (font->type) { @@ -609,7 +481,7 @@ gdk_text_extents_wc (GdkFont *font, gint *ascent, gint *descent) { - GdkFontPrivate *private; + GdkFontPrivateX *private; XCharStruct overall; XFontStruct *xfont; XFontSet fontset; @@ -621,7 +493,7 @@ gdk_text_extents_wc (GdkFont *font, g_return_if_fail (font != NULL); g_return_if_fail (text != NULL); - private = (GdkFontPrivate*) font; + private = (GdkFontPrivateX*) font; switch (font->type) { @@ -684,146 +556,3 @@ gdk_text_extents_wc (GdkFont *font, } } - -void -gdk_string_extents (GdkFont *font, - const gchar *string, - gint *lbearing, - gint *rbearing, - gint *width, - gint *ascent, - gint *descent) -{ - g_return_if_fail (font != NULL); - g_return_if_fail (string != NULL); - - gdk_text_extents (font, string, strlen (string), - lbearing, rbearing, width, ascent, descent); -} - - -gint -gdk_text_measure (GdkFont *font, - const gchar *text, - gint text_length) -{ - GdkFontPrivate *private; - XCharStruct overall; - XFontStruct *xfont; - XFontSet fontset; - XRectangle ink, log; - int direction; - int font_ascent; - int font_descent; - gint width; - - g_return_val_if_fail (font != NULL, -1); - g_return_val_if_fail (text != NULL, -1); - - private = (GdkFontPrivate*) font; - - switch (font->type) - { - case GDK_FONT_FONT: - xfont = (XFontStruct *) private->xfont; - if ((xfont->min_byte1 == 0) && (xfont->max_byte1 == 0)) - { - XTextExtents (xfont, text, text_length, - &direction, &font_ascent, &font_descent, - &overall); - } - else - { - XTextExtents16 (xfont, (XChar2b *) text, text_length / 2, - &direction, &font_ascent, &font_descent, - &overall); - } - width = overall.rbearing; - break; - case GDK_FONT_FONTSET: - fontset = (XFontSet) private->xfont; - XmbTextExtents (fontset, text, text_length, &ink, &log); - width = ink.x + ink.width; - break; - default: - width = 0; - } - return width; -} - -gint -gdk_char_measure (GdkFont *font, - gchar character) -{ - g_return_val_if_fail (font != NULL, -1); - - return gdk_text_measure (font, &character, 1); -} - -gint -gdk_string_height (GdkFont *font, - const gchar *string) -{ - g_return_val_if_fail (font != NULL, -1); - g_return_val_if_fail (string != NULL, -1); - - return gdk_text_height (font, string, strlen (string)); -} - -gint -gdk_text_height (GdkFont *font, - const gchar *text, - gint text_length) -{ - GdkFontPrivate *private; - XCharStruct overall; - XFontStruct *xfont; - XFontSet fontset; - XRectangle ink, log; - int direction; - int font_ascent; - int font_descent; - gint height; - - g_return_val_if_fail (font != NULL, -1); - g_return_val_if_fail (text != NULL, -1); - - private = (GdkFontPrivate*) font; - - switch (font->type) - { - case GDK_FONT_FONT: - xfont = (XFontStruct *) private->xfont; - if ((xfont->min_byte1 == 0) && (xfont->max_byte1 == 0)) - { - XTextExtents (xfont, text, text_length, - &direction, &font_ascent, &font_descent, - &overall); - } - else - { - XTextExtents16 (xfont, (XChar2b *) text, text_length / 2, - &direction, &font_ascent, &font_descent, - &overall); - } - height = overall.ascent + overall.descent; - break; - case GDK_FONT_FONTSET: - fontset = (XFontSet) private->xfont; - XmbTextExtents (fontset, text, text_length, &ink, &log); - height = log.height; - break; - default: - height = 0; - } - return height; -} - -gint -gdk_char_height (GdkFont *font, - gchar character) -{ - g_return_val_if_fail (font != NULL, -1); - - return gdk_text_height (font, &character, 1); -} diff --git a/gdk/x11/gdkgc-x11.c b/gdk/x11/gdkgc-x11.c new file mode 100644 index 0000000000..bf3ff6617d --- /dev/null +++ b/gdk/x11/gdkgc-x11.c @@ -0,0 +1,505 @@ +#include "gdkgc.h" +#include "gdkx.h" + +static void gdk_x11_gc_values_to_xvalues (GdkGCValues *values, + GdkGCValuesMask mask, + XGCValues *xvalues, + unsigned long *xvalues_mask); + +static void gdk_x11_gc_destroy (GdkGC *gc); +static void gdk_x11_gc_get_values (GdkGC *gc, + GdkGCValues *values); +static void gdk_x11_gc_set_values (GdkGC *gc, + GdkGCValues *values, + GdkGCValuesMask values_mask); +static void gdk_x11_gc_set_dashes (GdkGC *gc, + gint dash_offset, + gchar dash_list[], + gint n); + +static GdkGCClass gdk_x11_gc_class = { + gdk_x11_gc_destroy, + gdk_x11_gc_get_values, + gdk_x11_gc_set_values, + gdk_x11_gc_set_dashes +}; + +GdkGC * +_gdk_x11_gc_new (GdkDrawable *drawable, + GdkGCValues *values, + GdkGCValuesMask values_mask) +{ + GdkGC *gc; + GdkGCPrivate *private; + + XGCValues xvalues; + unsigned long xvalues_mask; + + gc = gdk_gc_alloc (); + private = (GdkGCPrivate *)gc; + + private->klass = &gdk_x11_gc_class; + private->klass_data = g_new (GdkGCXData, 1); + + GDK_GC_XDATA (gc)->xdisplay = GDK_DRAWABLE_XDISPLAY (drawable); + + xvalues.function = GXcopy; + xvalues.fill_style = FillSolid; + xvalues.arc_mode = ArcPieSlice; + xvalues.subwindow_mode = ClipByChildren; + xvalues.graphics_exposures = True; + xvalues_mask = GCFunction | GCFillStyle | GCArcMode | GCSubwindowMode | GCGraphicsExposures; + + gdk_x11_gc_values_to_xvalues (values, values_mask, &xvalues, &xvalues_mask); + + GDK_GC_XDATA (gc)->xgc = XCreateGC (GDK_GC_XDISPLAY (gc), + GDK_DRAWABLE_XID (drawable), + xvalues_mask, &xvalues); + + return gc; +} + +static void +gdk_x11_gc_destroy (GdkGC *gc) +{ + XFreeGC (GDK_GC_XDISPLAY (gc), GDK_GC_XGC (gc)); + g_free (GDK_GC_XDATA (gc)); +} + +static void +gdk_x11_gc_get_values (GdkGC *gc, + GdkGCValues *values) +{ + XGCValues xvalues; + + if (XGetGCValues (GDK_GC_XDISPLAY (gc), GDK_GC_XGC (gc), + GCForeground | GCBackground | GCFont | + GCFunction | GCTile | GCStipple | /* GCClipMask | */ + GCSubwindowMode | GCGraphicsExposures | + GCTileStipXOrigin | GCTileStipYOrigin | + GCClipXOrigin | GCClipYOrigin | + GCLineWidth | GCLineStyle | GCCapStyle | + GCFillStyle | GCJoinStyle, &xvalues)) + { + values->foreground.pixel = xvalues.foreground; + values->background.pixel = xvalues.background; + values->font = gdk_font_lookup (xvalues.font); + + switch (xvalues.function) + { + case GXcopy: + values->function = GDK_COPY; + break; + case GXinvert: + values->function = GDK_INVERT; + break; + case GXxor: + values->function = GDK_XOR; + break; + case GXclear: + values->function = GDK_CLEAR; + break; + case GXand: + values->function = GDK_AND; + break; + case GXandReverse: + values->function = GDK_AND_REVERSE; + break; + case GXandInverted: + values->function = GDK_AND_INVERT; + break; + case GXnoop: + values->function = GDK_NOOP; + break; + case GXor: + values->function = GDK_OR; + break; + case GXequiv: + values->function = GDK_EQUIV; + break; + case GXorReverse: + values->function = GDK_OR_REVERSE; + break; + case GXcopyInverted: + values->function =GDK_COPY_INVERT; + break; + case GXorInverted: + values->function = GDK_OR_INVERT; + break; + case GXnand: + values->function = GDK_NAND; + break; + case GXset: + values->function = GDK_SET; + break; + } + + switch (xvalues.fill_style) + { + case FillSolid: + values->fill = GDK_SOLID; + break; + case FillTiled: + values->fill = GDK_TILED; + break; + case FillStippled: + values->fill = GDK_STIPPLED; + break; + case FillOpaqueStippled: + values->fill = GDK_OPAQUE_STIPPLED; + break; + } + + values->tile = gdk_pixmap_lookup (xvalues.tile); + values->stipple = gdk_pixmap_lookup (xvalues.stipple); + values->clip_mask = NULL; + values->subwindow_mode = xvalues.subwindow_mode; + values->ts_x_origin = xvalues.ts_x_origin; + values->ts_y_origin = xvalues.ts_y_origin; + values->clip_x_origin = xvalues.clip_x_origin; + values->clip_y_origin = xvalues.clip_y_origin; + values->graphics_exposures = xvalues.graphics_exposures; + values->line_width = xvalues.line_width; + + switch (xvalues.line_style) + { + case LineSolid: + values->line_style = GDK_LINE_SOLID; + break; + case LineOnOffDash: + values->line_style = GDK_LINE_ON_OFF_DASH; + break; + case LineDoubleDash: + values->line_style = GDK_LINE_DOUBLE_DASH; + break; + } + + switch (xvalues.cap_style) + { + case CapNotLast: + values->cap_style = GDK_CAP_NOT_LAST; + break; + case CapButt: + values->cap_style = GDK_CAP_BUTT; + break; + case CapRound: + values->cap_style = GDK_CAP_ROUND; + break; + case CapProjecting: + values->cap_style = GDK_CAP_PROJECTING; + break; + } + + switch (xvalues.join_style) + { + case JoinMiter: + values->join_style = GDK_JOIN_MITER; + break; + case JoinRound: + values->join_style = GDK_JOIN_ROUND; + break; + case JoinBevel: + values->join_style = GDK_JOIN_BEVEL; + break; + } + } + else + { + memset (values, 0, sizeof (GdkGCValues)); + } +} + + +static void +gdk_x11_gc_set_values (GdkGC *gc, + GdkGCValues *values, + GdkGCValuesMask values_mask) +{ + XGCValues xvalues; + unsigned long xvalues_mask = 0; + + gdk_x11_gc_values_to_xvalues (values, values_mask, &xvalues, &xvalues_mask); + + XChangeGC (GDK_GC_XDISPLAY (gc), + GDK_GC_XGC (gc), + xvalues_mask, + &xvalues); +} + +static void +gdk_x11_gc_set_dashes (GdkGC *gc, + gint dash_offset, + gchar dash_list[], + gint n) +{ + g_return_if_fail (gc != NULL); + g_return_if_fail (dash_list != NULL); + + XSetDashes (GDK_GC_XDISPLAY (gc), GDK_GC_XGC (gc), + dash_offset, dash_list, n); +} + +static void +gdk_x11_gc_values_to_xvalues (GdkGCValues *values, + GdkGCValuesMask mask, + XGCValues *xvalues, + unsigned long *xvalues_mask) +{ + if (mask & GDK_GC_FOREGROUND) + { + xvalues->foreground = values->foreground.pixel; + *xvalues_mask |= GCForeground; + } + if (mask & GDK_GC_BACKGROUND) + { + xvalues->background = values->background.pixel; + *xvalues_mask |= GCBackground; + } + if ((mask & GDK_GC_FONT) && (values->font->type == GDK_FONT_FONT)) + { + xvalues->font = ((XFontStruct *) (GDK_FONT_XFONT (values->font)))->fid; + *xvalues_mask |= GCFont; + } + if (mask & GDK_GC_FUNCTION) + { + switch (values->function) + { + case GDK_COPY: + xvalues->function = GXcopy; + break; + case GDK_INVERT: + xvalues->function = GXinvert; + break; + case GDK_XOR: + xvalues->function = GXxor; + break; + case GDK_CLEAR: + xvalues->function = GXclear; + break; + case GDK_AND: + xvalues->function = GXand; + break; + case GDK_AND_REVERSE: + xvalues->function = GXandReverse; + break; + case GDK_AND_INVERT: + xvalues->function = GXandInverted; + break; + case GDK_NOOP: + xvalues->function = GXnoop; + break; + case GDK_OR: + xvalues->function = GXor; + break; + case GDK_EQUIV: + xvalues->function = GXequiv; + break; + case GDK_OR_REVERSE: + xvalues->function = GXorReverse; + break; + case GDK_COPY_INVERT: + xvalues->function = GXcopyInverted; + break; + case GDK_OR_INVERT: + xvalues->function = GXorInverted; + break; + case GDK_NAND: + xvalues->function = GXnand; + break; + case GDK_SET: + xvalues->function = GXset; + break; + } + *xvalues_mask |= GCFunction; + } + if (mask & GDK_GC_FILL) + { + switch (values->fill) + { + case GDK_SOLID: + xvalues->fill_style = FillSolid; + break; + case GDK_TILED: + xvalues->fill_style = FillTiled; + break; + case GDK_STIPPLED: + xvalues->fill_style = FillStippled; + break; + case GDK_OPAQUE_STIPPLED: + xvalues->fill_style = FillOpaqueStippled; + break; + } + *xvalues_mask |= GCFillStyle; + } + if (mask & GDK_GC_TILE) + { + if (values->tile) + xvalues->tile = GDK_DRAWABLE_XID (values->tile); + else + xvalues->tile = None; + + *xvalues_mask |= GCTile; + } + if (mask & GDK_GC_STIPPLE) + { + if (values->stipple) + xvalues->stipple = GDK_DRAWABLE_XID (values->stipple); + else + xvalues->stipple = None; + + *xvalues_mask |= GCStipple; + } + if (mask & GDK_GC_CLIP_MASK) + { + if (values->clip_mask) + xvalues->clip_mask = GDK_DRAWABLE_XID (values->clip_mask); + else + xvalues->clip_mask = None; + + *xvalues_mask |= GCClipMask; + + } + if (mask & GDK_GC_SUBWINDOW) + { + xvalues->subwindow_mode = values->subwindow_mode; + *xvalues_mask |= GCSubwindowMode; + } + if (mask & GDK_GC_TS_X_ORIGIN) + { + xvalues->ts_x_origin = values->ts_x_origin; + *xvalues_mask |= GCTileStipXOrigin; + } + if (mask & GDK_GC_TS_Y_ORIGIN) + { + xvalues->ts_y_origin = values->ts_y_origin; + *xvalues_mask |= GCTileStipYOrigin; + } + if (mask & GDK_GC_CLIP_X_ORIGIN) + { + xvalues->clip_x_origin = values->clip_x_origin; + *xvalues_mask |= GCClipXOrigin; + } + if (mask & GDK_GC_CLIP_Y_ORIGIN) + { + xvalues->clip_y_origin = values->clip_y_origin; + *xvalues_mask |= GCClipYOrigin; + } + + if (mask & GDK_GC_EXPOSURES) + xvalues->graphics_exposures = values->graphics_exposures; + else + xvalues->graphics_exposures = False; + *xvalues_mask |= GCGraphicsExposures; + + if (mask & GDK_GC_LINE_WIDTH) + { + xvalues->line_width = values->line_width; + *xvalues_mask |= GCLineWidth; + } + if (mask & GDK_GC_LINE_STYLE) + { + switch (values->line_style) + { + case GDK_LINE_SOLID: + xvalues->line_style = LineSolid; + break; + case GDK_LINE_ON_OFF_DASH: + xvalues->line_style = LineOnOffDash; + break; + case GDK_LINE_DOUBLE_DASH: + xvalues->line_style = LineDoubleDash; + break; + } + *xvalues_mask |= GCLineStyle; + } + if (mask & GDK_GC_CAP_STYLE) + { + switch (values->cap_style) + { + case GDK_CAP_NOT_LAST: + xvalues->cap_style = CapNotLast; + break; + case GDK_CAP_BUTT: + xvalues->cap_style = CapButt; + break; + case GDK_CAP_ROUND: + xvalues->cap_style = CapRound; + break; + case GDK_CAP_PROJECTING: + xvalues->cap_style = CapProjecting; + break; + } + *xvalues_mask |= GCCapStyle; + } + if (mask & GDK_GC_JOIN_STYLE) + { + switch (values->join_style) + { + case GDK_JOIN_MITER: + xvalues->join_style = JoinMiter; + break; + case GDK_JOIN_ROUND: + xvalues->join_style = JoinRound; + break; + case GDK_JOIN_BEVEL: + xvalues->join_style = JoinBevel; + break; + } + *xvalues_mask |= GCJoinStyle; + } + +} + +void +gdk_gc_set_clip_rectangle (GdkGC *gc, + GdkRectangle *rectangle) +{ + XRectangle xrectangle; + + g_return_if_fail (gc != NULL); + + if (rectangle) + { + xrectangle.x = rectangle->x; + xrectangle.y = rectangle->y; + xrectangle.width = rectangle->width; + xrectangle.height = rectangle->height; + + XSetClipRectangles (GDK_GC_XDISPLAY (gc), GDK_GC_XGC (gc), 0, 0, + &xrectangle, 1, Unsorted); + } + else + XSetClipMask (GDK_GC_XDISPLAY (gc), GDK_GC_XGC (gc), None); +} + +void +gdk_gc_set_clip_region (GdkGC *gc, + GdkRegion *region) +{ + GdkGCPrivate *private; + + g_return_if_fail (gc != NULL); + + private = (GdkGCPrivate*) gc; + + if (region) + { + GdkRegionPrivate *region_private; + + region_private = (GdkRegionPrivate*) region; + XSetRegion (GDK_GC_XDISPLAY (gc), GDK_GC_XGC (gc), region_private->xregion); + } + else + XSetClipMask (GDK_GC_XDISPLAY (gc), GDK_GC_XGC (gc), None); +} + + +void +gdk_gc_copy (GdkGC *dst_gc, GdkGC *src_gc) +{ + g_return_if_fail (dst_gc != NULL); + g_return_if_fail (src_gc != NULL); + + XCopyGC (GDK_GC_XDISPLAY (src_gc), GDK_GC_XGC (src_gc), ~((~1) << GCLastBit), + GDK_GC_XGC (dst_gc)); +} diff --git a/gdk/x11/gdkglobals-x11.c b/gdk/x11/gdkglobals-x11.c index ae6c066f96..9a3d6c5f95 100644 --- a/gdk/x11/gdkglobals-x11.c +++ b/gdk/x11/gdkglobals-x11.c @@ -25,57 +25,31 @@ */ #include <stdio.h> -#include <X11/Xlib.h> + #include "gdktypes.h" -#include "gdkprivate.h" +#include "gdkprivate-x11.h" #include "config.h" -guint gdk_debug_flags = 0; -gint gdk_use_xshm = TRUE; +gboolean gdk_use_xshm = TRUE; gchar *gdk_display_name = NULL; Display *gdk_display = NULL; gint gdk_screen; Window gdk_root_window; Window gdk_leader_window; -GdkWindowPrivate gdk_root_parent = { { NULL, }, NULL, }; Atom gdk_wm_delete_window; Atom gdk_wm_take_focus; Atom gdk_wm_protocols; Atom gdk_wm_window_protocols[2]; Atom gdk_selection_property; -GdkDndCursorInfo gdk_dnd_cursorinfo = {None, None, NULL, NULL, - {0,0}, {0,0}, NULL}; -GdkDndGlobals gdk_dnd = {None,None,None, - None,None,None, - None, - &gdk_dnd_cursorinfo, - NULL, - 0, - FALSE, FALSE, FALSE, - None, - {0,0}, - {0,0}, {0,0}, - {0,0,0,0}, NULL, None, 0}; gchar *gdk_progclass = NULL; -gint gdk_error_code = 0; -gint gdk_error_warnings = TRUE; -gint gdk_null_window_warnings = TRUE; -GList *gdk_default_filters = NULL; +gboolean gdk_null_window_warnings = TRUE; -gboolean gdk_xim_using; /* using XIM Protocol if TRUE */ +gboolean gdk_xim_using; /* using XIM Protocol if TRUE */ #ifdef USE_XIM -GdkICPrivate *gdk_xim_ic; /* currently using IC */ +GdkICPrivate *gdk_xim_ic; /* currently using IC */ #endif /* USE_XIM */ -GdkWindow *gdk_xim_window; /* currently using Widow */ +GdkWindow *gdk_xim_window; /* currently using Widow */ GdkWindowPrivate *gdk_xgrab_window = NULL; /* Window that currently holds the * x pointer grab */ - -GMutex *gdk_threads_mutex = NULL; /* Global GDK lock */ - -#ifdef USE_XIM -GdkICPrivate *gdk_xim_ic; /* currently using IC */ -GdkWindow *gdk_xim_window; /* currently using Window */ -#endif - diff --git a/gdk/x11/gdkimage-x11.c b/gdk/x11/gdkimage-x11.c index 4facec7e75..cee55c7115 100644 --- a/gdk/x11/gdkimage-x11.c +++ b/gdk/x11/gdkimage-x11.c @@ -58,26 +58,35 @@ #include "gdkprivate.h" #include "gdkx.h" - -static void gdk_image_put_normal (GdkDrawable *drawable, - GdkGC *gc, - GdkImage *image, - gint xsrc, - gint ysrc, - gint xdest, - gint ydest, - gint width, - gint height); -static void gdk_image_put_shared (GdkDrawable *drawable, - GdkGC *gc, - GdkImage *image, - gint xsrc, - gint ysrc, - gint xdest, - gint ydest, - gint width, - gint height); - +static void gdk_x11_image_destroy (GdkImage *image); +static void gdk_image_put_normal (GdkImage *image, + GdkDrawable *drawable, + GdkGC *gc, + gint xsrc, + gint ysrc, + gint xdest, + gint ydest, + gint width, + gint height); +static void gdk_image_put_shared (GdkImage *image, + GdkDrawable *drawable, + GdkGC *gc, + gint xsrc, + gint ysrc, + gint xdest, + gint ydest, + gint width, + gint height); + +static GdkImageClass image_class_normal = { + gdk_x11_image_destroy, + gdk_image_put_normal +}; + +static GdkImageClass image_class_shared = { + gdk_x11_image_destroy, + gdk_image_put_shared +}; static GList *image_list = NULL; @@ -90,7 +99,7 @@ gdk_image_exit (void) while (image_list) { image = image_list->data; - gdk_image_destroy (image); + gdk_x11_image_destroy (image); } } @@ -102,11 +111,12 @@ gdk_image_new_bitmap(GdkVisual *visual, gpointer data, gint w, gint h) { Visual *xvisual; GdkImage *image; - GdkImagePrivate *private; - private = g_new(GdkImagePrivate, 1); + GdkImagePrivateX *private; + private = g_new(GdkImagePrivateX, 1); image = (GdkImage *) private; private->xdisplay = gdk_display; - private->image_put = gdk_image_put_normal; + private->base.ref_count = 1; + private->base.klass = &image_class_normal; image->type = GDK_IMAGE_NORMAL; image->visual = visual; image->width = w; @@ -168,7 +178,7 @@ gdk_image_new (GdkImageType type, gint height) { GdkImage *image; - GdkImagePrivate *private; + GdkImagePrivateX *private; #ifdef USE_SHM XShmSegmentInfo *x_shm_info; #endif /* USE_SHM */ @@ -184,11 +194,11 @@ gdk_image_new (GdkImageType type, break; default: - private = g_new (GdkImagePrivate, 1); + private = g_new (GdkImagePrivateX, 1); image = (GdkImage*) private; + private->base.ref_count = 1; private->xdisplay = gdk_display; - private->image_put = NULL; image->type = type; image->visual = visual; @@ -204,7 +214,7 @@ gdk_image_new (GdkImageType type, #ifdef USE_SHM if (gdk_use_xshm) { - private->image_put = gdk_image_put_shared; + private->base.klass = &image_class_shared; private->x_shm_info = g_new (XShmSegmentInfo, 1); x_shm_info = private->x_shm_info; @@ -295,7 +305,7 @@ gdk_image_new (GdkImageType type, return NULL; #endif /* USE_SHM */ case GDK_IMAGE_NORMAL: - private->image_put = gdk_image_put_normal; + private->base.klass = &image_class_normal; private->ximage = XCreateImage (private->xdisplay, xvisual, visual->depth, ZPixmap, 0, 0, width, height, 32, 0); @@ -308,6 +318,7 @@ gdk_image_new (GdkImageType type, break; case GDK_IMAGE_FASTEST: + case GDK_IMAGE_SHARED_PIXMAP: g_assert_not_reached (); } @@ -331,18 +342,19 @@ gdk_image_get (GdkWindow *window, gint height) { GdkImage *image; - GdkImagePrivate *private; + GdkImagePrivateX *private; g_return_val_if_fail (window != NULL, NULL); if (GDK_DRAWABLE_DESTROYED (window)) return NULL; - private = g_new (GdkImagePrivate, 1); + private = g_new (GdkImagePrivateX, 1); image = (GdkImage*) private; + private->base.ref_count = 1; + private->base.klass = &image_class_normal; private->xdisplay = gdk_display; - private->image_put = gdk_image_put_normal; private->ximage = XGetImage (private->xdisplay, GDK_DRAWABLE_XID (window), x, y, width, height, @@ -375,11 +387,11 @@ gdk_image_get_pixel (GdkImage *image, gint y) { guint32 pixel; - GdkImagePrivate *private; + GdkImagePrivateX *private; g_return_val_if_fail (image != NULL, 0); - private = (GdkImagePrivate *) image; + private = (GdkImagePrivateX *) image; pixel = XGetPixel (private->ximage, x, y); @@ -392,26 +404,26 @@ gdk_image_put_pixel (GdkImage *image, gint y, guint32 pixel) { - GdkImagePrivate *private; + GdkImagePrivateX *private; g_return_if_fail (image != NULL); - private = (GdkImagePrivate *) image; + private = (GdkImagePrivateX *) image; pixel = XPutPixel (private->ximage, x, y, pixel); } -void -gdk_image_destroy (GdkImage *image) +static void +gdk_x11_image_destroy (GdkImage *image) { - GdkImagePrivate *private; + GdkImagePrivateX *private; #ifdef USE_SHM XShmSegmentInfo *x_shm_info; #endif /* USE_SHM */ g_return_if_fail (image != NULL); - private = (GdkImagePrivate*) image; + private = (GdkImagePrivateX*) image; switch (image->type) { case GDK_IMAGE_NORMAL: @@ -437,6 +449,7 @@ gdk_image_destroy (GdkImage *image) break; case GDK_IMAGE_FASTEST: + case GDK_IMAGE_SHARED_PIXMAP: g_assert_not_reached (); } @@ -444,9 +457,9 @@ gdk_image_destroy (GdkImage *image) } static void -gdk_image_put_normal (GdkDrawable *drawable, +gdk_image_put_normal (GdkImage *image, + GdkDrawable *drawable, GdkGC *gc, - GdkImage *image, gint xsrc, gint ysrc, gint xdest, @@ -454,8 +467,7 @@ gdk_image_put_normal (GdkDrawable *drawable, gint width, gint height) { - GdkImagePrivate *image_private; - GdkGCPrivate *gc_private; + GdkImagePrivateX *image_private; g_return_if_fail (drawable != NULL); g_return_if_fail (image != NULL); @@ -463,20 +475,19 @@ gdk_image_put_normal (GdkDrawable *drawable, if (GDK_DRAWABLE_DESTROYED (drawable)) return; - image_private = (GdkImagePrivate*) image; - gc_private = (GdkGCPrivate*) gc; + image_private = (GdkImagePrivateX*) image; g_return_if_fail (image->type == GDK_IMAGE_NORMAL); XPutImage (GDK_DRAWABLE_XDISPLAY (drawable), GDK_DRAWABLE_XID (drawable), - gc_private->xgc, image_private->ximage, + GDK_GC_XGC (gc), image_private->ximage, xsrc, ysrc, xdest, ydest, width, height); } static void -gdk_image_put_shared (GdkDrawable *drawable, +gdk_image_put_shared (GdkImage *image, + GdkDrawable *drawable, GdkGC *gc, - GdkImage *image, gint xsrc, gint ysrc, gint xdest, @@ -485,8 +496,7 @@ gdk_image_put_shared (GdkDrawable *drawable, gint height) { #ifdef USE_SHM - GdkImagePrivate *image_private; - GdkGCPrivate *gc_private; + GdkImagePrivateX *image_private; g_return_if_fail (drawable != NULL); g_return_if_fail (image != NULL); @@ -494,13 +504,12 @@ gdk_image_put_shared (GdkDrawable *drawable, if (GDK_DRAWABLE_DESTROYED (drawable)) return; - image_private = (GdkImagePrivate*) image; - gc_private = (GdkGCPrivate*) gc; + image_private = (GdkImagePrivateX*) image; g_return_if_fail (image->type == GDK_IMAGE_SHARED); XShmPutImage (GDK_DRAWABLE_XDISPLAY (drawable), GDK_DRAWABLE_XID (drawable), - gc_private->xgc, image_private->ximage, + GDK_GC_XGC (gc), image_private->ximage, xsrc, ysrc, xdest, ydest, width, height, False); #else /* USE_SHM */ g_error ("trying to draw shared memory image when gdk was compiled without shared memory support"); diff --git a/gdk/x11/gdkinput-gxi.c b/gdk/x11/gdkinput-gxi.c index 773a0436b7..982e85c7c8 100644 --- a/gdk/x11/gdkinput-gxi.c +++ b/gdk/x11/gdkinput-gxi.c @@ -24,8 +24,6 @@ * GTK+ at ftp://ftp.gtk.org/pub/gtk/. */ -#ifdef XINPUT_GXI - /* #define DEBUG_SWITCHING */ #include <gxid_lib.h> @@ -645,5 +643,3 @@ gdk_input_gxi_ungrab_pointer (guint32 time) tmp_list = tmp_list->next; } } - -#endif /* XINPUT_GXI */ diff --git a/gdk/x11/gdkinput-none.c b/gdk/x11/gdkinput-none.c index 7695726bf7..f04ef190ea 100644 --- a/gdk/x11/gdkinput-none.c +++ b/gdk/x11/gdkinput-none.c @@ -24,8 +24,6 @@ * GTK+ at ftp://ftp.gtk.org/pub/gtk/. */ -#ifdef XINPUT_NONE - static void gdk_input_none_get_pointer (GdkWindow *window, guint32 deviceid, gdouble *x, @@ -77,5 +75,3 @@ gdk_input_none_get_pointer (GdkWindow *window, if (xtilt) *xtilt = 0; if (ytilt) *ytilt = 0; } - -#endif /* XINPUT_NONE */ diff --git a/gdk/x11/gdkinput-x11.c b/gdk/x11/gdkinput-x11.c index d9bb835b89..4e395ef0ab 100644 --- a/gdk/x11/gdkinput-x11.c +++ b/gdk/x11/gdkinput-x11.c @@ -24,22 +24,12 @@ * GTK+ at ftp://ftp.gtk.org/pub/gtk/. */ -#if defined(XINPUT_GXI) || defined(XINPUT_XFREE) +#include "gdkinputprivate.h" +#include "gdkx.h" /* Forward declarations */ -static void gdk_input_get_root_relative_geometry (Display *dpy, Window w, - int *x_ret, int *y_ret, - int *width_ret, - int *height_ret); static GdkDevicePrivate *gdk_input_device_new(XDeviceInfo *device, gint include_core); -static void gdk_input_common_find_events(GdkWindow *window, - GdkDevicePrivate *gdkdev, - gint mask, - XEventClass *classes, - int *num_classes); -static void gdk_input_common_select_events(GdkWindow *window, - GdkDevicePrivate *gdkdev); static void gdk_input_translate_coordinates(GdkDevicePrivate *gdkdev, GdkInputWindow *input_window, gint *axis_data, @@ -47,34 +37,21 @@ static void gdk_input_translate_coordinates(GdkDevicePrivate *gdkdev, gdouble *pressure, gdouble *xtilt, gdouble *ytilt); static guint gdk_input_translate_state(guint state, guint device_state); -static gint gdk_input_common_init(gint include_core); -static gint gdk_input_common_other_event (GdkEvent *event, - XEvent *xevent, - GdkInputWindow *input_window, - GdkDevicePrivate *gdkdev); -static void gdk_input_common_set_axes (guint32 deviceid, GdkAxisUse *axes); -static GdkTimeCoord * gdk_input_common_motion_events (GdkWindow *window, - guint32 deviceid, - guint32 start, - guint32 stop, - gint *nevents_return); -static void gdk_input_common_get_pointer (GdkWindow *window, - guint32 deviceid, - gdouble *x, - gdouble *y, - gdouble *pressure, - gdouble *xtilt, - gdouble *ytilt, - GdkModifierType *mask); - -#define GDK_MAX_DEVICE_CLASSES 13 +void gdk_input_common_get_pointer (GdkWindow *window, + guint32 deviceid, + gdouble *x, + gdouble *y, + gdouble *pressure, + gdouble *xtilt, + gdouble *ytilt, + GdkModifierType *mask); /* Global variables */ static gint gdk_input_root_width; static gint gdk_input_root_height; -static void +void gdk_input_get_root_relative_geometry(Display *dpy, Window w, int *x_ret, int *y_ret, int *width_ret, int *height_ret) { @@ -301,7 +278,7 @@ gdk_input_device_new(XDeviceInfo *device, gint include_core) return gdkdev; } -static void +void gdk_input_common_find_events(GdkWindow *window, GdkDevicePrivate *gdkdev, gint mask, @@ -403,7 +380,7 @@ gdk_input_common_find_events(GdkWindow *window, *num_classes = i; } -static void +void gdk_input_common_select_events(GdkWindow *window, GdkDevicePrivate *gdkdev) { @@ -460,7 +437,7 @@ gdk_input_common_init(gint include_core) XFreeDeviceList(devices); } - gdk_input_devices = g_list_append (gdk_input_devices, &gdk_input_core_info); + gdk_input_devices = g_list_append (gdk_input_devices, (gpointer)&gdk_input_core_info); return TRUE; } @@ -581,10 +558,11 @@ gdk_input_translate_state(guint state, guint device_state) return device_state | (state & 0xFF); } -static gint -gdk_input_common_other_event (GdkEvent *event, - XEvent *xevent, - GdkInputWindow *input_window, + +gint +gdk_input_common_other_event (GdkEvent *event, + XEvent *xevent, + GdkInputWindow *input_window, GdkDevicePrivate *gdkdev) { if ((xevent->type == gdkdev->buttonpress_type) || @@ -736,7 +714,7 @@ gdk_input_common_other_event (GdkEvent *event, return -1; /* wasn't one of our event types */ } -static void +void gdk_input_common_set_axes (guint32 deviceid, GdkAxisUse *axes) { int i; @@ -755,10 +733,11 @@ gdk_input_common_set_axes (guint32 deviceid, GdkAxisUse *axes) } } -void gdk_input_common_set_key (guint32 deviceid, - guint index, - guint keyval, - GdkModifierType modifiers) +void +gdk_input_common_set_key (guint32 deviceid, + guint index, + guint keyval, + GdkModifierType modifiers) { GdkDevicePrivate *gdkdev = gdk_input_find_device(deviceid); @@ -770,7 +749,7 @@ void gdk_input_common_set_key (guint32 deviceid, gdkdev->info.keys[index].modifiers = modifiers; } -static GdkTimeCoord * +GdkTimeCoord * gdk_input_common_motion_events (GdkWindow *window, guint32 deviceid, guint32 start, @@ -819,7 +798,7 @@ gdk_input_common_motion_events (GdkWindow *window, return NULL; } -static void +void gdk_input_common_get_pointer (GdkWindow *window, guint32 deviceid, gdouble *x, @@ -888,5 +867,3 @@ gdk_input_common_get_pointer (GdkWindow *window, } } } - -#endif diff --git a/gdk/x11/gdkinput-xfree.c b/gdk/x11/gdkinput-xfree.c index d4020ae163..6cb6d87b6d 100644 --- a/gdk/x11/gdkinput-xfree.c +++ b/gdk/x11/gdkinput-xfree.c @@ -17,6 +17,9 @@ * Boston, MA 02111-1307, USA. */ +#include "gdkinputprivate.h" +#include "gdkx.h" + /* * Modified by the GTK+ Team and others 1997-1999. See the AUTHORS * file for a list of people on the GTK+ Team. See the ChangeLog @@ -24,8 +27,6 @@ * GTK+ at ftp://ftp.gtk.org/pub/gtk/. */ -#ifdef XINPUT_XFREE - /* forward declarations */ static gint gdk_input_xfree_set_mode (guint32 deviceid, GdkInputMode mode); @@ -42,10 +43,10 @@ static gint gdk_input_xfree_enable_window(GdkWindow *window, static gint gdk_input_xfree_disable_window(GdkWindow *window, GdkDevicePrivate *gdkdev); static gint gdk_input_xfree_grab_pointer (GdkWindow * window, - gint owner_events, - GdkEventMask event_mask, - GdkWindow * confine_to, - guint32 time); + gint owner_events, + GdkEventMask event_mask, + GdkWindow * confine_to, + guint32 time); static void gdk_input_xfree_ungrab_pointer (guint32 time); void @@ -370,5 +371,3 @@ gdk_input_xfree_ungrab_pointer (guint32 time) } } } - -#endif /* XINPUT_XFREE */ diff --git a/gdk/x11/gdkinput.c b/gdk/x11/gdkinput.c index 334c3d46d8..348251458d 100644 --- a/gdk/x11/gdkinput.c +++ b/gdk/x11/gdkinput.c @@ -34,21 +34,9 @@ #include "gdkprivate.h" #include "gdkinputprivate.h" -/* Forward declarations */ - -static gint gdk_input_enable_window (GdkWindow *window, - GdkDevicePrivate *gdkdev); -static gint gdk_input_disable_window (GdkWindow *window, - GdkDevicePrivate *gdkdev); -static GdkInputWindow *gdk_input_window_find (GdkWindow *window); -static GdkDevicePrivate *gdk_input_find_device (guint32 id); - - -/* Incorporate the specific routines depending on compilation options */ - static const GdkAxisUse gdk_input_core_axes[] = { GDK_AXIS_X, GDK_AXIS_Y }; -static const GdkDeviceInfo gdk_input_core_info = +const GdkDeviceInfo gdk_input_core_info = { GDK_CORE_POINTER, "Core Pointer", @@ -67,15 +55,8 @@ gchar *gdk_input_gxid_host; gint gdk_input_gxid_port; gint gdk_input_ignore_core; -/* Local variables */ - -static GList *gdk_input_devices; -static GList *gdk_input_windows; - -#include "gdkinputnone.h" -#include "gdkinputcommon.h" -#include "gdkinputxfree.h" -#include "gdkinputgxi.h" +GList *gdk_input_devices; +GList *gdk_input_windows; GList * gdk_input_list_devices (void) @@ -178,7 +159,7 @@ gdk_input_motion_events (GdkWindow *window, } } -static gint +gint gdk_input_enable_window (GdkWindow *window, GdkDevicePrivate *gdkdev) { if (gdk_input_vtable.enable_window) @@ -187,7 +168,7 @@ gdk_input_enable_window (GdkWindow *window, GdkDevicePrivate *gdkdev) return TRUE; } -static gint +gint gdk_input_disable_window (GdkWindow *window, GdkDevicePrivate *gdkdev) { if (gdk_input_vtable.disable_window) @@ -197,7 +178,7 @@ gdk_input_disable_window (GdkWindow *window, GdkDevicePrivate *gdkdev) } -static GdkInputWindow * +GdkInputWindow * gdk_input_window_find(GdkWindow *window) { GList *tmp_list; @@ -324,7 +305,7 @@ gdk_input_exit (void) g_list_free(gdk_input_windows); } -static GdkDevicePrivate * +GdkDevicePrivate * gdk_input_find_device(guint32 id) { GList *tmp_list = gdk_input_devices; diff --git a/gdk/x11/gdkinputprivate.h b/gdk/x11/gdkinputprivate.h index 0f41c462b4..d1f8a66d14 100644 --- a/gdk/x11/gdkinputprivate.h +++ b/gdk/x11/gdkinputprivate.h @@ -27,6 +27,10 @@ #ifndef __GDK_INPUTPRIVATE_H__ #define __GDK_INPUTPRIVATE_H__ +#include "config.h" +#include "gdkinput.h" +#include "gdkevents.h" + #ifndef XINPUT_NONE #include <X11/extensions/XInput.h> #endif @@ -147,6 +151,10 @@ struct _GdkInputWindow /* Global data */ +extern const GdkDeviceInfo gdk_input_core_info; +extern GList *gdk_input_devices; +extern GList *gdk_input_windows; + extern GdkInputVTable gdk_input_vtable; /* information about network port and host for gxid daemon */ extern gchar *gdk_input_gxid_host; @@ -155,8 +163,63 @@ extern gint gdk_input_ignore_core; /* Function declarations */ +GdkDevicePrivate * gdk_input_find_device (guint32 id); +GdkInputWindow * gdk_input_window_find (GdkWindow *window); +void gdk_input_window_destroy (GdkWindow *window); +void gdk_input_init (void); +void gdk_input_exit (void); +gint gdk_input_enable_window (GdkWindow *window, + GdkDevicePrivate *gdkdev); +gint gdk_input_disable_window (GdkWindow *window, + GdkDevicePrivate *gdkdev); + +#ifndef XINPUT_NONE + +#define GDK_MAX_DEVICE_CLASSES 13 + +gint gdk_input_common_init (gint include_core); +void gdk_input_get_root_relative_geometry (Display *dpy, + Window w, + int *x_ret, + int *y_ret, + int *width_ret, + int *height_ret); +void gdk_input_common_find_events (GdkWindow *window, + GdkDevicePrivate *gdkdev, + gint mask, + XEventClass *classes, + int *num_classes); +void gdk_input_common_select_events (GdkWindow *window, + GdkDevicePrivate *gdkdev); +gint gdk_input_common_other_event (GdkEvent *event, + XEvent *xevent, + GdkInputWindow *input_window, + GdkDevicePrivate *gdkdev); +void gdk_input_common_get_pointer (GdkWindow *window, + guint32 deviceid, + gdouble *x, + gdouble *y, + gdouble *pressure, + gdouble *xtilt, + gdouble *ytilt, + GdkModifierType *mask); +void gdk_input_common_set_key (guint32 deviceid, + guint index, + guint keyval, + GdkModifierType modifiers); +void gdk_input_common_set_axes (guint32 deviceid, + GdkAxisUse *axes); +GdkTimeCoord * gdk_input_common_motion_events (GdkWindow *window, + guint32 deviceid, + guint32 start, + guint32 stop, + gint *nevents_return); + +#endif /* !XINPUT_NONE */ + +GdkDevicePrivate *gdk_input_find_device (guint32 id); +GdkInputWindow *gdk_input_window_find (GdkWindow *window); void gdk_input_window_destroy (GdkWindow *window); -void gdk_input_init (void); void gdk_input_exit (void); #endif /* __GDK_INPUTPRIVATE_H__ */ diff --git a/gdk/x11/gdkmain-x11.c b/gdk/x11/gdkmain-x11.c index 4e8b83f803..de696cca98 100644 --- a/gdk/x11/gdkmain-x11.c +++ b/gdk/x11/gdkmain-x11.c @@ -77,15 +77,10 @@ static void gdkx_XConvertCase (KeySym symbol, #define XConvertCase gdkx_XConvertCase #endif -static void gdk_exit_func (void); static int gdk_x_error (Display *display, XErrorEvent *error); static int gdk_x_io_error (Display *display); -GdkFilterReturn gdk_wm_protocols_filter (GdkXEvent *xev, - GdkEvent *event, - gpointer data); - /* Private variable declarations */ static int gdk_initialized = 0; /* 1 if the library is initialized, @@ -93,9 +88,7 @@ static int gdk_initialized = 0; /* 1 if the library is initialized, */ static gint autorepeat; - -static GSList *gdk_error_traps = NULL; /* List of error traps */ -static GSList *gdk_error_trap_free_list = NULL; /* Free list */ +static gboolean gdk_synchronize = FALSE; #ifdef G_ENABLE_DEBUG static const GDebugKey gdk_debug_keys[] = { @@ -110,258 +103,60 @@ static const int gdk_ndebug_keys = sizeof(gdk_debug_keys)/sizeof(GDebugKey); #endif /* G_ENABLE_DEBUG */ -/* - *-------------------------------------------------------------- - * gdk_init_heck - * - * Initialize the library for use. - * - * Arguments: - * "argc" is the number of arguments. - * "argv" is an array of strings. - * - * Results: - * "argc" and "argv" are modified to reflect any arguments - * which were not handled. (Such arguments should either - * be handled by the application or dismissed). If initialization - * fails, returns FALSE, otherwise TRUE. - * - * Side effects: - * The library is initialized. - * - *-------------------------------------------------------------- - */ +static void +gdk_arg_xim_preedit_cb (const gchar *arg, const gchar *value, gpointer cb_data) +{ + if (strcmp ("none", value) == 0) + gdk_im_set_best_style (GDK_IM_PREEDIT_NONE); + else if (strcmp ("nothing", value) == 0) + gdk_im_set_best_style (GDK_IM_PREEDIT_NOTHING); + else if (strcmp ("area", value) == 0) + gdk_im_set_best_style (GDK_IM_PREEDIT_AREA); + else if (strcmp ("position", value) == 0) + gdk_im_set_best_style (GDK_IM_PREEDIT_POSITION); + else if (strcmp ("callbacks", value) == 0) + gdk_im_set_best_style (GDK_IM_PREEDIT_CALLBACKS); +} + +static void +gdk_arg_xim_status_cb (const gchar *arg, const gchar *value, gpointer cb_data) +{ + if (strcmp ("none", value) == 0) + gdk_im_set_best_style (GDK_IM_STATUS_NONE); + else if (strcmp ("nothing", value) == 0) + gdk_im_set_best_style (GDK_IM_STATUS_NOTHING); + else if (strcmp ("area", value) == 0) + gdk_im_set_best_style (GDK_IM_STATUS_AREA); + else if (strcmp ("callbacks", value) == 0) + gdk_im_set_best_style (GDK_IM_STATUS_CALLBACKS); +} + +GdkArgDesc _gdk_windowing_args[] = { + { "display", GDK_ARG_STRING, &gdk_display_name, (GdkArgFunc)NULL }, + { "sync", GDK_ARG_BOOL, &gdk_synchronize, (GdkArgFunc)NULL }, + { "no-xshm", GDK_ARG_NOBOOL, &gdk_use_xshm, (GdkArgFunc)NULL }, + { "class", GDK_ARG_STRING, &gdk_progclass, (GdkArgFunc)NULL }, + { "gxid-host", GDK_ARG_STRING, &gdk_input_gxid_host, (GdkArgFunc)NULL }, + { "gxid-port", GDK_ARG_INT, &gdk_input_gxid_port, (GdkArgFunc)NULL }, + { "xim-preedit", GDK_ARG_CALLBACK, NULL, gdk_arg_xim_preedit_cb }, + { "xim-status", GDK_ARG_CALLBACK, NULL, gdk_arg_xim_status_cb }, + { NULL } +}; gboolean -gdk_init_check (int *argc, - char ***argv) +_gdk_windowing_init_check (int argc, char **argv) { XKeyboardState keyboard_state; - gint synchronize; - gint i, j, k; XClassHint *class_hint; - gchar **argv_orig = NULL; - gint argc_orig = 0; - - if (gdk_initialized) - return TRUE; - - if (g_thread_supported ()) - gdk_threads_mutex = g_mutex_new (); - - if (argc && argv) - { - argc_orig = *argc; - - argv_orig = g_malloc ((argc_orig + 1) * sizeof (char*)); - for (i = 0; i < argc_orig; i++) - argv_orig[i] = g_strdup ((*argv)[i]); - argv_orig[argc_orig] = NULL; - } - - gdk_display_name = NULL; XSetErrorHandler (gdk_x_error); XSetIOErrorHandler (gdk_x_io_error); - synchronize = FALSE; - -#ifdef G_ENABLE_DEBUG - { - gchar *debug_string = getenv("GDK_DEBUG"); - if (debug_string != NULL) - gdk_debug_flags = g_parse_debug_string (debug_string, - (GDebugKey *) gdk_debug_keys, - gdk_ndebug_keys); - } -#endif /* G_ENABLE_DEBUG */ - - if (argc && argv) - { - if (*argc > 0) - { - gchar *d; - - d = strrchr((*argv)[0],'/'); - if (d != NULL) - g_set_prgname (d + 1); - else - g_set_prgname ((*argv)[0]); - } - - for (i = 1; i < *argc;) - { -#ifdef G_ENABLE_DEBUG - if ((strcmp ("--gdk-debug", (*argv)[i]) == 0) || - (strncmp ("--gdk-debug=", (*argv)[i], 12) == 0)) - { - gchar *equal_pos = strchr ((*argv)[i], '='); - - if (equal_pos != NULL) - { - gdk_debug_flags |= g_parse_debug_string (equal_pos+1, - (GDebugKey *) gdk_debug_keys, - gdk_ndebug_keys); - } - else if ((i + 1) < *argc && (*argv)[i + 1]) - { - gdk_debug_flags |= g_parse_debug_string ((*argv)[i+1], - (GDebugKey *) gdk_debug_keys, - gdk_ndebug_keys); - (*argv)[i] = NULL; - i += 1; - } - (*argv)[i] = NULL; - } - else if ((strcmp ("--gdk-no-debug", (*argv)[i]) == 0) || - (strncmp ("--gdk-no-debug=", (*argv)[i], 15) == 0)) - { - gchar *equal_pos = strchr ((*argv)[i], '='); - - if (equal_pos != NULL) - { - gdk_debug_flags &= ~g_parse_debug_string (equal_pos+1, - (GDebugKey *) gdk_debug_keys, - gdk_ndebug_keys); - } - else if ((i + 1) < *argc && (*argv)[i + 1]) - { - gdk_debug_flags &= ~g_parse_debug_string ((*argv)[i+1], - (GDebugKey *) gdk_debug_keys, - gdk_ndebug_keys); - (*argv)[i] = NULL; - i += 1; - } - (*argv)[i] = NULL; - } - else -#endif /* G_ENABLE_DEBUG */ - if (strcmp ("--display", (*argv)[i]) == 0) - { - (*argv)[i] = NULL; - - if ((i + 1) < *argc && (*argv)[i + 1]) - { - gdk_display_name = g_strdup ((*argv)[i + 1]); - (*argv)[i + 1] = NULL; - i += 1; - } - } - else if (strcmp ("--sync", (*argv)[i]) == 0) - { - (*argv)[i] = NULL; - synchronize = TRUE; - } - else if (strcmp ("--no-xshm", (*argv)[i]) == 0) - { - (*argv)[i] = NULL; - gdk_use_xshm = FALSE; - } - else if (strcmp ("--name", (*argv)[i]) == 0) - { - if ((i + 1) < *argc && (*argv)[i + 1]) - { - (*argv)[i++] = NULL; - g_set_prgname ((*argv)[i]); - (*argv)[i] = NULL; - } - } - else if (strcmp ("--class", (*argv)[i]) == 0) - { - if ((i + 1) < *argc && (*argv)[i + 1]) - { - (*argv)[i++] = NULL; - gdk_progclass = (*argv)[i]; - (*argv)[i] = NULL; - } - } -#ifdef XINPUT_GXI - else if (strcmp ("--gxid_host", (*argv)[i]) == 0) - { - if ((i + 1) < *argc && (*argv)[i + 1]) - { - (*argv)[i++] = NULL; - gdk_input_gxid_host = ((*argv)[i]); - (*argv)[i] = NULL; - } - } - else if (strcmp ("--gxid_port", (*argv)[i]) == 0) - { - if ((i + 1) < *argc && (*argv)[i + 1]) - { - (*argv)[i++] = NULL; - gdk_input_gxid_port = atoi ((*argv)[i]); - (*argv)[i] = NULL; - } - } -#endif -#ifdef USE_XIM - else if (strcmp ("--xim-preedit", (*argv)[i]) == 0) - { - if ((i + 1) < *argc && (*argv)[i + 1]) - { - (*argv)[i++] = NULL; - if (strcmp ("none", (*argv)[i]) == 0) - gdk_im_set_best_style (GDK_IM_PREEDIT_NONE); - else if (strcmp ("nothing", (*argv)[i]) == 0) - gdk_im_set_best_style (GDK_IM_PREEDIT_NOTHING); - else if (strcmp ("area", (*argv)[i]) == 0) - gdk_im_set_best_style (GDK_IM_PREEDIT_AREA); - else if (strcmp ("position", (*argv)[i]) == 0) - gdk_im_set_best_style (GDK_IM_PREEDIT_POSITION); - else if (strcmp ("callbacks", (*argv)[i]) == 0) - gdk_im_set_best_style (GDK_IM_PREEDIT_CALLBACKS); - (*argv)[i] = NULL; - } - } - else if (strcmp ("--xim-status", (*argv)[i]) == 0) - { - if ((i + 1) < *argc && (*argv)[i + 1]) - { - (*argv)[i++] = NULL; - if (strcmp ("none", (*argv)[i]) == 0) - gdk_im_set_best_style (GDK_IM_STATUS_NONE); - else if (strcmp ("nothing", (*argv)[i]) == 0) - gdk_im_set_best_style (GDK_IM_STATUS_NOTHING); - else if (strcmp ("area", (*argv)[i]) == 0) - gdk_im_set_best_style (GDK_IM_STATUS_AREA); - else if (strcmp ("callbacks", (*argv)[i]) == 0) - gdk_im_set_best_style (GDK_IM_STATUS_CALLBACKS); - (*argv)[i] = NULL; - } - } -#endif - - i += 1; - } - - for (i = 1; i < *argc; i++) - { - for (k = i; k < *argc; k++) - if ((*argv)[k] != NULL) - break; - - if (k > i) - { - k -= i; - for (j = i + k; j < *argc; j++) - (*argv)[j-k] = (*argv)[j]; - *argc -= k; - } - } - } - else - { - g_set_prgname ("<unknown>"); - } - - GDK_NOTE (MISC, g_message ("progname: \"%s\"", g_get_prgname ())); - gdk_display = XOpenDisplay (gdk_display_name); if (!gdk_display) return FALSE; - if (synchronize) + if (gdk_synchronize) XSynchronize (gdk_display, True); gdk_screen = DefaultScreen (gdk_display); @@ -378,14 +173,10 @@ gdk_init_check (int *argc, } class_hint->res_class = gdk_progclass; XmbSetWMProperties (gdk_display, gdk_leader_window, - NULL, NULL, argv_orig, argc_orig, + NULL, NULL, argv, argc, NULL, NULL, class_hint); XFree (class_hint); - for (i = 0; i < argc_orig; i++) - g_free(argv_orig[i]); - g_free(argv_orig); - gdk_wm_delete_window = XInternAtom (gdk_display, "WM_DELETE_WINDOW", False); gdk_wm_take_focus = XInternAtom (gdk_display, "WM_TAKE_FOCUS", False); gdk_wm_protocols = XInternAtom (gdk_display, "WM_PROTOCOLS", False); @@ -396,62 +187,10 @@ gdk_init_check (int *argc, XGetKeyboardControl (gdk_display, &keyboard_state); autorepeat = keyboard_state.global_auto_repeat; - g_atexit (gdk_exit_func); - - gdk_events_init (); - gdk_visual_init (); - gdk_window_init (); - gdk_image_init (); - gdk_input_init (); - gdk_dnd_init (); - -#ifdef USE_XIM - gdk_im_open (); -#endif - - gdk_initialized = 1; - return TRUE; } void -gdk_init (int *argc, char ***argv) -{ - if (!gdk_init_check (argc, argv)) - { - g_warning ("cannot open display: %s", gdk_get_display ()); - exit(1); - } -} - -/* - *-------------------------------------------------------------- - * gdk_exit - * - * Restores the library to an un-itialized state and exits - * the program using the "exit" system call. - * - * Arguments: - * "errorcode" is the error value to pass to "exit". - * - * Results: - * Allocated structures are freed and the program exits - * cleanly. - * - * Side effects: - * - *-------------------------------------------------------------- - */ - -void -gdk_exit (gint errorcode) -{ - /* de-initialisation is done by the gdk_exit_funct(), - no need to do this here (Alex J.) */ - exit (errorcode); -} - -void gdk_set_use_xshm (gint use_xshm) { gdk_use_xshm = use_xshm; @@ -822,50 +561,10 @@ gdk_beep (void) XBell(gdk_display, 0); } -/* - *-------------------------------------------------------------- - * gdk_exit_func - * - * This is the "atexit" function that makes sure the - * library gets a chance to cleanup. - * - * Arguments: - * - * Results: - * - * Side effects: - * The library is un-initialized and the program exits. - * - *-------------------------------------------------------------- - */ - -static void -gdk_exit_func (void) +void +gdk_windowing_exit (void) { - static gboolean in_gdk_exit_func = FALSE; - - /* This is to avoid an infinite loop if a program segfaults in - an atexit() handler (and yes, it does happen, especially if a program - has trounced over memory too badly for even g_message to work) */ - if (in_gdk_exit_func == TRUE) - return; - in_gdk_exit_func = TRUE; - - if (gdk_initialized) - { -#ifdef USE_XIM - /* cleanup IC */ - gdk_ic_cleanup (); - /* close IM */ - gdk_im_close (); -#endif - gdk_image_exit (); - gdk_input_exit (); - gdk_key_repeat_restore (); - - XCloseDisplay (gdk_display); - gdk_initialized = 0; - } + XCloseDisplay (gdk_display); } /* @@ -977,77 +676,6 @@ gdk_get_display (void) return (gchar *)XDisplayName (gdk_display_name); } -/************************************************************* - * gdk_error_trap_push: - * Push an error trap. X errors will be trapped until - * the corresponding gdk_error_pop(), which will return - * the error code, if any. - * arguments: - * - * results: - *************************************************************/ - -void -gdk_error_trap_push (void) -{ - GSList *node; - GdkErrorTrap *trap; - - if (gdk_error_trap_free_list) - { - node = gdk_error_trap_free_list; - gdk_error_trap_free_list = gdk_error_trap_free_list->next; - } - else - { - node = g_slist_alloc (); - node->data = g_new (GdkErrorTrap, 1); - } - - node->next = gdk_error_traps; - gdk_error_traps = node; - - trap = node->data; - trap->error_code = gdk_error_code; - trap->error_warnings = gdk_error_warnings; - - gdk_error_code = 0; - gdk_error_warnings = 0; -} - -/************************************************************* - * gdk_error_trap_pop: - * Pop an error trap added with gdk_error_push() - * arguments: - * - * results: - * 0, if no error occured, otherwise the error code. - *************************************************************/ - -gint -gdk_error_trap_pop (void) -{ - GSList *node; - GdkErrorTrap *trap; - gint result; - - g_return_val_if_fail (gdk_error_traps != NULL, 0); - - node = gdk_error_traps; - gdk_error_traps = gdk_error_traps->next; - - node->next = gdk_error_trap_free_list; - gdk_error_trap_free_list = node; - - result = gdk_error_code; - - trap = node->data; - gdk_error_code = trap->error_code; - gdk_error_warnings = trap->error_warnings; - - return result; -} - gint gdk_send_xevent (Window window, gboolean propagate, glong event_mask, XEvent *event_send) @@ -1065,138 +693,6 @@ gdk_send_xevent (Window window, gboolean propagate, glong event_mask, return result && !gdk_error_code; } -#ifndef HAVE_XCONVERTCASE -/* compatibility function from X11R6.3, since XConvertCase is not - * supplied by X11R5. - */ -static void -gdkx_XConvertCase (KeySym symbol, - KeySym *lower, - KeySym *upper) -{ - register KeySym sym = symbol; - - g_return_if_fail (lower != NULL); - g_return_if_fail (upper != NULL); - - *lower = sym; - *upper = sym; - - switch (sym >> 8) - { -#if defined (GDK_A) && defined (GDK_Ooblique) - case 0: /* Latin 1 */ - if ((sym >= GDK_A) && (sym <= GDK_Z)) - *lower += (GDK_a - GDK_A); - else if ((sym >= GDK_a) && (sym <= GDK_z)) - *upper -= (GDK_a - GDK_A); - else if ((sym >= GDK_Agrave) && (sym <= GDK_Odiaeresis)) - *lower += (GDK_agrave - GDK_Agrave); - else if ((sym >= GDK_agrave) && (sym <= GDK_odiaeresis)) - *upper -= (GDK_agrave - GDK_Agrave); - else if ((sym >= GDK_Ooblique) && (sym <= GDK_Thorn)) - *lower += (GDK_oslash - GDK_Ooblique); - else if ((sym >= GDK_oslash) && (sym <= GDK_thorn)) - *upper -= (GDK_oslash - GDK_Ooblique); - break; -#endif /* LATIN1 */ - -#if defined (GDK_Aogonek) && defined (GDK_tcedilla) - case 1: /* Latin 2 */ - /* Assume the KeySym is a legal value (ignore discontinuities) */ - if (sym == GDK_Aogonek) - *lower = GDK_aogonek; - else if (sym >= GDK_Lstroke && sym <= GDK_Sacute) - *lower += (GDK_lstroke - GDK_Lstroke); - else if (sym >= GDK_Scaron && sym <= GDK_Zacute) - *lower += (GDK_scaron - GDK_Scaron); - else if (sym >= GDK_Zcaron && sym <= GDK_Zabovedot) - *lower += (GDK_zcaron - GDK_Zcaron); - else if (sym == GDK_aogonek) - *upper = GDK_Aogonek; - else if (sym >= GDK_lstroke && sym <= GDK_sacute) - *upper -= (GDK_lstroke - GDK_Lstroke); - else if (sym >= GDK_scaron && sym <= GDK_zacute) - *upper -= (GDK_scaron - GDK_Scaron); - else if (sym >= GDK_zcaron && sym <= GDK_zabovedot) - *upper -= (GDK_zcaron - GDK_Zcaron); - else if (sym >= GDK_Racute && sym <= GDK_Tcedilla) - *lower += (GDK_racute - GDK_Racute); - else if (sym >= GDK_racute && sym <= GDK_tcedilla) - *upper -= (GDK_racute - GDK_Racute); - break; -#endif /* LATIN2 */ - -#if defined (GDK_Hstroke) && defined (GDK_Cabovedot) - case 2: /* Latin 3 */ - /* Assume the KeySym is a legal value (ignore discontinuities) */ - if (sym >= GDK_Hstroke && sym <= GDK_Hcircumflex) - *lower += (GDK_hstroke - GDK_Hstroke); - else if (sym >= GDK_Gbreve && sym <= GDK_Jcircumflex) - *lower += (GDK_gbreve - GDK_Gbreve); - else if (sym >= GDK_hstroke && sym <= GDK_hcircumflex) - *upper -= (GDK_hstroke - GDK_Hstroke); - else if (sym >= GDK_gbreve && sym <= GDK_jcircumflex) - *upper -= (GDK_gbreve - GDK_Gbreve); - else if (sym >= GDK_Cabovedot && sym <= GDK_Scircumflex) - *lower += (GDK_cabovedot - GDK_Cabovedot); - else if (sym >= GDK_cabovedot && sym <= GDK_scircumflex) - *upper -= (GDK_cabovedot - GDK_Cabovedot); - break; -#endif /* LATIN3 */ - -#if defined (GDK_Rcedilla) && defined (GDK_Amacron) - case 3: /* Latin 4 */ - /* Assume the KeySym is a legal value (ignore discontinuities) */ - if (sym >= GDK_Rcedilla && sym <= GDK_Tslash) - *lower += (GDK_rcedilla - GDK_Rcedilla); - else if (sym >= GDK_rcedilla && sym <= GDK_tslash) - *upper -= (GDK_rcedilla - GDK_Rcedilla); - else if (sym == GDK_ENG) - *lower = GDK_eng; - else if (sym == GDK_eng) - *upper = GDK_ENG; - else if (sym >= GDK_Amacron && sym <= GDK_Umacron) - *lower += (GDK_amacron - GDK_Amacron); - else if (sym >= GDK_amacron && sym <= GDK_umacron) - *upper -= (GDK_amacron - GDK_Amacron); - break; -#endif /* LATIN4 */ - -#if defined (GDK_Serbian_DJE) && defined (GDK_Cyrillic_yu) - case 6: /* Cyrillic */ - /* Assume the KeySym is a legal value (ignore discontinuities) */ - if (sym >= GDK_Serbian_DJE && sym <= GDK_Serbian_DZE) - *lower -= (GDK_Serbian_DJE - GDK_Serbian_dje); - else if (sym >= GDK_Serbian_dje && sym <= GDK_Serbian_dze) - *upper += (GDK_Serbian_DJE - GDK_Serbian_dje); - else if (sym >= GDK_Cyrillic_YU && sym <= GDK_Cyrillic_HARDSIGN) - *lower -= (GDK_Cyrillic_YU - GDK_Cyrillic_yu); - else if (sym >= GDK_Cyrillic_yu && sym <= GDK_Cyrillic_hardsign) - *upper += (GDK_Cyrillic_YU - GDK_Cyrillic_yu); - break; -#endif /* CYRILLIC */ - -#if defined (GDK_Greek_ALPHAaccent) && defined (GDK_Greek_finalsmallsigma) - case 7: /* Greek */ - /* Assume the KeySym is a legal value (ignore discontinuities) */ - if (sym >= GDK_Greek_ALPHAaccent && sym <= GDK_Greek_OMEGAaccent) - *lower += (GDK_Greek_alphaaccent - GDK_Greek_ALPHAaccent); - else if (sym >= GDK_Greek_alphaaccent && sym <= GDK_Greek_omegaaccent && - sym != GDK_Greek_iotaaccentdieresis && - sym != GDK_Greek_upsilonaccentdieresis) - *upper -= (GDK_Greek_alphaaccent - GDK_Greek_ALPHAaccent); - else if (sym >= GDK_Greek_ALPHA && sym <= GDK_Greek_OMEGA) - *lower += (GDK_Greek_alpha - GDK_Greek_ALPHA); - else if (sym >= GDK_Greek_alpha && sym <= GDK_Greek_omega && - sym != GDK_Greek_finalsmallsigma) - *upper -= (GDK_Greek_alpha - GDK_Greek_ALPHA); - break; -#endif /* GREEK */ - } -} -#endif - gchar* gdk_keyval_name (guint keyval) { @@ -1211,71 +707,21 @@ gdk_keyval_from_name (const gchar *keyval_name) return XStringToKeysym (keyval_name); } -guint -gdk_keyval_to_upper (guint keyval) -{ - if (keyval) - { - KeySym lower_val = 0; - KeySym upper_val = 0; - - XConvertCase (keyval, &lower_val, &upper_val); - return upper_val; - } - return 0; -} - -guint -gdk_keyval_to_lower (guint keyval) -{ - if (keyval) - { - KeySym lower_val = 0; - KeySym upper_val = 0; - - XConvertCase (keyval, &lower_val, &upper_val); - return lower_val; - } - return 0; -} - -gboolean -gdk_keyval_is_upper (guint keyval) -{ - if (keyval) - { - KeySym lower_val = 0; - KeySym upper_val = 0; - - XConvertCase (keyval, &lower_val, &upper_val); - return upper_val == keyval; - } - return TRUE; -} - -gboolean -gdk_keyval_is_lower (guint keyval) -{ - if (keyval) - { - KeySym lower_val = 0; - KeySym upper_val = 0; - - XConvertCase (keyval, &lower_val, &upper_val); - return lower_val == keyval; - } - return TRUE; -} - -void -gdk_threads_enter () -{ - GDK_THREADS_ENTER (); -} - +#ifdef HAVE_XCONVERTCASE void -gdk_threads_leave () -{ - GDK_THREADS_LEAVE (); -} - +gdk_keyval_convert_case (guint symbol, + guint *lower, + guint *upper) +{ + KeySym xlower = 0; + KeySym xupper = 0; + + if (symbol) + XConvertCase (symbol, &xlower, &xupper); + + if (lower) + *lower = xlower; + if (upper) + *upper = xupper; +} +#endif HAVE_XCONVERTCASE diff --git a/gdk/x11/gdkpixmap-x11.c b/gdk/x11/gdkpixmap-x11.c index 8ee69db9cd..c27517c9a3 100644 --- a/gdk/x11/gdkpixmap-x11.c +++ b/gdk/x11/gdkpixmap-x11.c @@ -50,6 +50,44 @@ typedef struct gulong pixels[1]; } _GdkPixmapInfo; +GdkDrawableClass _gdk_x11_pixmap_class; + +static void +gdk_x11_pixmap_destroy (GdkPixmap *pixmap) +{ + XFreePixmap (GDK_DRAWABLE_XDISPLAY (pixmap), GDK_DRAWABLE_XID (pixmap)); + gdk_xid_table_remove (GDK_DRAWABLE_XID (pixmap)); + + g_free (GDK_DRAWABLE_XDATA (pixmap)); +} + +static GdkDrawable * +gdk_x11_pixmap_alloc (void) +{ + GdkDrawable *drawable; + GdkDrawablePrivate *private; + + static GdkDrawableClass klass; + static gboolean initialized = FALSE; + + if (!initialized) + { + initialized = TRUE; + + klass = _gdk_x11_drawable_class; + klass.destroy = gdk_x11_pixmap_destroy; + } + + drawable = gdk_drawable_alloc (); + private = (GdkDrawablePrivate *)drawable; + + private->klass = &klass; + private->klass_data = g_new (GdkDrawableXData, 1); + private->window_type = GDK_DRAWABLE_PIXMAP; + + return drawable; +} + GdkPixmap* gdk_pixmap_new (GdkWindow *window, gint width, @@ -62,9 +100,9 @@ gdk_pixmap_new (GdkWindow *window, g_return_val_if_fail (window == NULL || GDK_IS_WINDOW (window), NULL); g_return_val_if_fail ((window != NULL) || (depth != -1), NULL); g_return_val_if_fail ((width != 0) && (height != 0), NULL); - + if (!window) - window = (GdkWindow*) &gdk_root_parent; + window = gdk_parent_root; if (GDK_DRAWABLE_DESTROYED (window)) return NULL; @@ -72,21 +110,17 @@ gdk_pixmap_new (GdkWindow *window, if (depth == -1) depth = gdk_drawable_get_visual (window)->depth; - private = g_new0 (GdkDrawablePrivate, 1); - pixmap = (GdkPixmap*) private; + pixmap = gdk_x11_pixmap_alloc (); + private = (GdkDrawablePrivate *)pixmap; - private->xdisplay = GDK_DRAWABLE_XDISPLAY (window); - private->window_type = GDK_DRAWABLE_PIXMAP; - private->xwindow = XCreatePixmap (private->xdisplay, - GDK_DRAWABLE_XID (window), - width, height, depth); - private->colormap = NULL; + GDK_DRAWABLE_XDATA (private)->xdisplay = GDK_DRAWABLE_XDISPLAY (window); + GDK_DRAWABLE_XDATA (private)->xid = XCreatePixmap (GDK_DRAWABLE_XDISPLAY (pixmap), + GDK_DRAWABLE_XID (window), + width, height, depth); private->width = width; private->height = height; - private->ref_count = 1; - private->destroyed = 0; - gdk_xid_table_insert (&private->xwindow, pixmap); + gdk_xid_table_insert (&GDK_DRAWABLE_XID (pixmap), pixmap); return pixmap; } @@ -105,26 +139,23 @@ gdk_bitmap_create_from_data (GdkWindow *window, g_return_val_if_fail (window == NULL || GDK_IS_WINDOW (window), NULL); if (!window) - window = (GdkWindow*) &gdk_root_parent; + window = gdk_parent_root; if (GDK_DRAWABLE_DESTROYED (window)) return NULL; - private = g_new0 (GdkDrawablePrivate, 1); - pixmap = (GdkPixmap*) private; + pixmap = gdk_x11_pixmap_alloc (); + private = (GdkDrawablePrivate *)pixmap; - private->xdisplay = GDK_DRAWABLE_XDISPLAY (window); - private->window_type = GDK_DRAWABLE_PIXMAP; private->width = width; private->height = height; - private->ref_count = 1; - private->destroyed = FALSE; - private->xwindow = XCreateBitmapFromData (private->xdisplay, - GDK_DRAWABLE_XID (window), - (char *)data, width, height); + GDK_DRAWABLE_XDATA (private)->xdisplay = GDK_DRAWABLE_XDISPLAY (window); + GDK_DRAWABLE_XDATA (private)->xid = XCreateBitmapFromData (GDK_DRAWABLE_XDISPLAY (window), + GDK_DRAWABLE_XID (window), + (char *)data, width, height); - gdk_xid_table_insert (&private->xwindow, pixmap); + gdk_xid_table_insert (&GDK_DRAWABLE_XID (pixmap), pixmap); return pixmap; } @@ -149,7 +180,7 @@ gdk_pixmap_create_from_data (GdkWindow *window, g_return_val_if_fail ((width != 0) && (height != 0), NULL); if (!window) - window = (GdkWindow*) &gdk_root_parent; + window = gdk_parent_root; if (GDK_DRAWABLE_DESTROYED (window)) return NULL; @@ -157,22 +188,19 @@ gdk_pixmap_create_from_data (GdkWindow *window, if (depth == -1) depth = gdk_drawable_get_visual (window)->depth; - private = g_new0 (GdkDrawablePrivate, 1); - pixmap = (GdkPixmap*) private; + pixmap = gdk_x11_pixmap_alloc (); + private = (GdkDrawablePrivate *)pixmap; - private->xdisplay = GDK_DRAWABLE_XDISPLAY (window); - private->window_type = GDK_DRAWABLE_PIXMAP; private->width = width; private->height = height; - private->ref_count = 1; - private->destroyed = FALSE; - private->xwindow = XCreatePixmapFromBitmapData (private->xdisplay, - GDK_DRAWABLE_XID (window), - (char *)data, width, height, - fg->pixel, bg->pixel, depth); + GDK_DRAWABLE_XDATA (private)->xdisplay = GDK_DRAWABLE_XDISPLAY (window); + GDK_DRAWABLE_XDATA (private)->xid = XCreatePixmapFromBitmapData (GDK_DRAWABLE_XDISPLAY (window), + GDK_DRAWABLE_XID (window), + (char *)data, width, height, + fg->pixel, bg->pixel, depth); - gdk_xid_table_insert (&private->xwindow, pixmap); + gdk_xid_table_insert (&GDK_DRAWABLE_XID (pixmap), pixmap); return pixmap; } @@ -443,7 +471,7 @@ _gdk_pixmap_create_from_xpm (GdkWindow *window, g_warning ("Creating pixmap from xpm with NULL window and colormap"); if (window == NULL) - window = (GdkWindow *)&gdk_root_parent; + window = gdk_parent_root; if (colormap == NULL) { @@ -588,7 +616,7 @@ _gdk_pixmap_create_from_xpm (GdkWindow *window, error: if (mask) - gdk_gc_destroy (gc); + gdk_gc_unref (gc); if (image != NULL) { @@ -601,8 +629,8 @@ _gdk_pixmap_create_from_xpm (GdkWindow *window, gc = gdk_gc_new (pixmap); gdk_gc_set_foreground (gc, transparent_color); gdk_draw_image (pixmap, gc, image, 0, 0, 0, 0, image->width, image->height); - gdk_gc_destroy (gc); - gdk_image_destroy (image); + gdk_gc_unref (gc); + gdk_image_unref (image); } else if (color_info) gdk_xpm_destroy_notify (color_info); @@ -766,61 +794,16 @@ gdk_pixmap_foreign_new (guint32 anid) &x_ret, &y_ret, &w_ret, &h_ret, &bw_ret, &depth_ret)) return NULL; - /* allocate a new gdk pixmap */ - private = g_new(GdkDrawablePrivate, 1); - pixmap = (GdkPixmap *)private; + pixmap = gdk_x11_pixmap_alloc (); + private = (GdkDrawablePrivate *)pixmap; + + GDK_DRAWABLE_XDATA (private)->xdisplay = GDK_DISPLAY (); + GDK_DRAWABLE_XDATA (private)->xid = xpixmap; - private->xdisplay = GDK_DISPLAY(); - private->window_type = GDK_DRAWABLE_PIXMAP; - private->xwindow = xpixmap; - private->colormap = NULL; private->width = w_ret; private->height = h_ret; - private->ref_count = 1; - private->destroyed = 0; - gdk_xid_table_insert(&private->xwindow, pixmap); + gdk_xid_table_insert(&GDK_DRAWABLE_XID (pixmap), pixmap); return pixmap; } - -GdkPixmap* -gdk_pixmap_ref (GdkPixmap *pixmap) -{ - GdkDrawablePrivate *private = (GdkDrawablePrivate *)pixmap; - g_return_val_if_fail (pixmap != NULL, NULL); - g_return_val_if_fail (GDK_IS_PIXMAP (private), NULL); - - private->ref_count += 1; - return pixmap; -} - -void -gdk_pixmap_unref (GdkPixmap *pixmap) -{ - GdkDrawablePrivate *private = (GdkDrawablePrivate *)pixmap; - g_return_if_fail (pixmap != NULL); - g_return_if_fail (GDK_IS_PIXMAP (private)); - g_return_if_fail (private->ref_count > 0); - - private->ref_count -= 1; - if (private->ref_count == 0) - { - XFreePixmap (private->xdisplay, private->xwindow); - gdk_xid_table_remove (private->xwindow); - g_dataset_destroy (private); - g_free (private); - } -} - -GdkBitmap * -gdk_bitmap_ref (GdkBitmap *bitmap) -{ - return (GdkBitmap *)gdk_pixmap_ref ((GdkPixmap *)bitmap); -} - -void -gdk_bitmap_unref (GdkBitmap *bitmap) -{ - gdk_pixmap_unref ((GdkPixmap *)bitmap); -} diff --git a/gdk/x11/gdkprivate-x11.h b/gdk/x11/gdkprivate-x11.h new file mode 100644 index 0000000000..27d3451dec --- /dev/null +++ b/gdk/x11/gdkprivate-x11.h @@ -0,0 +1,158 @@ +#ifndef __GDK_PRIVATE_X11_H__ +#define __GDK_PRIVATE_X11_H__ + +#include <X11/Xlib.h> +#include <X11/Xutil.h> + +#include <gdk/gdkfont.h> +#include <gdk/gdkprivate.h> +#include <gdk/gdkcursor.h> + +typedef struct _GdkGCXData GdkGCXData; +typedef struct _GdkDrawableXData GdkDrawableXData; +typedef struct _GdkColormapPrivateX GdkColormapPrivateX; +typedef struct _GdkCursorPrivate GdkCursorPrivate; +typedef struct _GdkFontPrivateX GdkFontPrivateX; +typedef struct _GdkImagePrivateX GdkImagePrivateX; +typedef struct _GdkVisualPrivate GdkVisualPrivate; +typedef struct _GdkRegionPrivate GdkRegionPrivate; + +#ifdef USE_XIM +typedef struct _GdkICPrivate GdkICPrivate; +#endif /* USE_XIM */ + +#define GDK_DRAWABLE_XDATA(win) ((GdkDrawableXData *)(((GdkDrawablePrivate*)(win))->klass_data)) +#define GDK_GC_XDATA(gc) ((GdkGCXData *)(((GdkGCPrivate*)(gc))->klass_data)) + +struct _GdkGCXData +{ + GC xgc; + Display *xdisplay; +}; + +struct _GdkDrawableXData +{ + Window xid; + Display *xdisplay; +}; + +struct _GdkCursorPrivate +{ + GdkCursor cursor; + Cursor xcursor; + Display *xdisplay; +}; + +struct _GdkFontPrivateX +{ + GdkFontPrivate base; + /* XFontStruct *xfont; */ + /* generic pointer point to XFontStruct or XFontSet */ + gpointer xfont; + Display *xdisplay; + + GSList *names; +}; + +struct _GdkVisualPrivate +{ + GdkVisual visual; + Visual *xvisual; +}; + +struct _GdkColormapPrivateX +{ + GdkColormapPrivate base; + + Colormap xcolormap; + Display *xdisplay; + gint private_val; + + GHashTable *hash; + GdkColorInfo *info; + time_t last_sync_time; +}; + +struct _GdkImagePrivateX +{ + GdkImagePrivate base; + + XImage *ximage; + Display *xdisplay; + gpointer x_shm_info; +}; + +struct _GdkRegionPrivate +{ + GdkRegion region; + Region xregion; +}; + + +#ifdef USE_XIM + +struct _GdkICPrivate +{ + XIC xic; + GdkICAttr *attr; + GdkICAttributesType mask; +}; + +#endif /* USE_XIM */ + +void gdk_xid_table_insert (XID *xid, + gpointer data); +void gdk_xid_table_remove (XID xid); +gpointer gdk_xid_table_lookup (XID xid); +gint gdk_send_xevent (Window window, + gboolean propagate, + glong event_mask, + XEvent *event_send); +GdkGC * _gdk_x11_gc_new (GdkDrawable *drawable, + GdkGCValues *values, + GdkGCValuesMask values_mask); +GdkColormap * gdk_colormap_lookup (Colormap xcolormap); +GdkVisual * gdk_visual_lookup (Visual *xvisual); + +/* Please see gdkwindow.c for comments on how to use */ +Window gdk_window_xid_at (Window base, + gint bx, + gint by, + gint x, + gint y, + GList *excludes, + gboolean excl_child); +Window gdk_window_xid_at_coords (gint x, + gint y, + GList *excludes, + gboolean excl_child); + +extern GdkDrawableClass _gdk_x11_drawable_class; +extern gboolean gdk_use_xshm; +extern gchar *gdk_display_name; +extern Display *gdk_display; +extern Window gdk_root_window; +extern Window gdk_leader_window; +extern Atom gdk_wm_delete_window; +extern Atom gdk_wm_take_focus; +extern Atom gdk_wm_protocols; +extern Atom gdk_wm_window_protocols[]; +extern Atom gdk_selection_property; +extern GdkWindow *selection_owner[]; +extern gchar *gdk_progclass; +extern gboolean gdk_null_window_warnings; +extern const int gdk_nevent_masks; +extern const int gdk_event_mask_table[]; + +extern GdkWindowPrivate *gdk_xgrab_window; /* Window that currently holds the + * x pointer grab + */ + +#ifdef USE_XIM +extern GdkICPrivate *gdk_xim_ic; /* currently using IC */ +extern GdkWindow *gdk_xim_window; /* currently using Window */ +#endif /* USE_XIM */ + + +#endif /* __GDK_PRIVATE_X11_H__ */ + diff --git a/gdk/x11/gdkproperty-x11.c b/gdk/x11/gdkproperty-x11.c index b91b787d1b..ee270b1e74 100644 --- a/gdk/x11/gdkproperty-x11.c +++ b/gdk/x11/gdkproperty-x11.c @@ -39,6 +39,8 @@ gdk_atom_intern (const gchar *atom_name, GdkAtom retval; static GHashTable *atom_hash = NULL; + g_return_val_if_fail (atom_name != NULL, GDK_NONE); + if (!atom_hash) atom_hash = g_hash_table_new (g_str_hash, g_str_equal); @@ -110,13 +112,16 @@ gdk_property_get (GdkWindow *window, gulong ret_length; guchar *ret_data; + g_return_val_if_fail (window != NULL, FALSE); + g_return_val_if_fail (!GDK_IS_WINDOW (window), FALSE); + if (window) { if (GDK_DRAWABLE_DESTROYED (window)) return FALSE; - xdisplay = GDK_WINDOW_XDISPLAY (window); - xwindow = GDK_WINDOW_XWINDOW (window); + xdisplay = GDK_DRAWABLE_XDISPLAY (window); + xwindow = GDK_DRAWABLE_XID (window); } else { @@ -196,13 +201,16 @@ gdk_property_change (GdkWindow *window, Display *xdisplay; Window xwindow; + g_return_if_fail (window != NULL); + g_return_if_fail (!GDK_IS_WINDOW (window)); + if (window) { if (GDK_DRAWABLE_DESTROYED (window)) return; - xdisplay = GDK_WINDOW_XDISPLAY (window); - xwindow = GDK_WINDOW_XWINDOW (window); + xdisplay = GDK_DRAWABLE_XDISPLAY (window); + xwindow = GDK_DRAWABLE_XID (window); } else { @@ -221,13 +229,16 @@ gdk_property_delete (GdkWindow *window, Display *xdisplay; Window xwindow; + g_return_if_fail (window != NULL); + g_return_if_fail (!GDK_IS_WINDOW (window)); + if (window) { if (GDK_DRAWABLE_DESTROYED (window)) return; - xdisplay = GDK_WINDOW_XDISPLAY (window); - xwindow = GDK_WINDOW_XWINDOW (window); + xdisplay = GDK_DRAWABLE_XDISPLAY (window); + xwindow = GDK_DRAWABLE_XID (window); } else { diff --git a/gdk/x11/gdkregion-x11.c b/gdk/x11/gdkregion-x11.c index d09f38865d..b21aba8938 100644 --- a/gdk/x11/gdkregion-x11.c +++ b/gdk/x11/gdkregion-x11.c @@ -26,11 +26,7 @@ #include <X11/Xlib.h> #include <X11/Xutil.h> -#include "gdk.h" -#include "gdkprivate.h" - - - +#include "gdkprivate-x11.h" GdkRegion* gdk_region_new (void) diff --git a/gdk/x11/gdkvisual-x11.c b/gdk/x11/gdkvisual-x11.c index 072ff456e5..bb007d4a9b 100644 --- a/gdk/x11/gdkvisual-x11.c +++ b/gdk/x11/gdkvisual-x11.c @@ -28,7 +28,7 @@ #include <X11/Xutil.h> #include "gdkvisual.h" -#include "gdkprivate.h" +#include "gdkprivate-x11.h" static void gdk_visual_add (GdkVisual *visual); static void gdk_visual_decompose_mask (gulong mask, diff --git a/gdk/x11/gdkwindow-x11.c b/gdk/x11/gdkwindow-x11.c index 16bdb37d7c..74cf7d953d 100644 --- a/gdk/x11/gdkwindow-x11.c +++ b/gdk/x11/gdkwindow-x11.c @@ -33,7 +33,7 @@ #include "gdkwindow.h" #include "gdkinputprivate.h" -#include "gdkprivate.h" +#include "gdkprivate-x11.h" #include "gdkx.h" #include "MwmUtil.h" @@ -77,144 +77,50 @@ static void gdk_window_set_static_win_gravity (GdkWindow *window, gboolean on); static gboolean gdk_window_have_shape_ext (void); -/* internal function created for and used by gdk_window_xid_at_coords */ -Window -gdk_window_xid_at (Window base, - gint bx, - gint by, - gint x, - gint y, - GList *excludes, - gboolean excl_child) +static void +gdk_x11_window_destroy (GdkDrawable *drawable) { - GdkWindow *window; - GdkDrawablePrivate *private; - Display *disp; - Window *list = NULL; - Window child = 0, parent_win = 0, root_win = 0; - int i; - unsigned int ww, wh, wb, wd, num; - int wx, wy; - - window = (GdkWindow*) &gdk_root_parent; - private = (GdkDrawablePrivate*) window; - disp = private->xdisplay; - if (!XGetGeometry (disp, base, &root_win, &wx, &wy, &ww, &wh, &wb, &wd)) - return 0; - wx += bx; - wy += by; - - if (!((x >= wx) && - (y >= wy) && - (x < (int) (wx + ww)) && - (y < (int) (wy + wh)))) - return 0; - - if (!XQueryTree (disp, base, &root_win, &parent_win, &list, &num)) - return base; - - if (list) + if (!GDK_DRAWABLE_DESTROYED (drawable)) { - for (i = num - 1; ; i--) - { - if ((!excl_child) || (!g_list_find (excludes, (gpointer *) list[i]))) - { - if ((child = gdk_window_xid_at (list[i], wx, wy, x, y, excludes, excl_child)) != 0) - { - XFree (list); - return child; - } - } - if (!i) - break; - } - XFree (list); + if (GDK_DRAWABLE_TYPE (drawable) == GDK_WINDOW_FOREIGN) + gdk_xid_table_remove (GDK_DRAWABLE_XID (drawable)); + else + g_warning ("losing last reference to undestroyed window\n"); } - return base; + + g_free (GDK_DRAWABLE_XDATA (drawable)); } -/* - * The following fucntion by The Rasterman <raster@redhat.com> - * This function returns the X Window ID in which the x y location is in - * (x and y being relative to the root window), excluding any windows listed - * in the GList excludes (this is a list of X Window ID's - gpointer being - * the Window ID). - * - * This is primarily designed for internal gdk use - for DND for example - * when using a shaped icon window as the drag object - you exclude the - * X Window ID of the "icon" (perhaps more if excludes may be needed) and - * You can get back an X Window ID as to what X Window ID is infact under - * those X,Y co-ordinates. - */ -Window -gdk_window_xid_at_coords (gint x, - gint y, - GList *excludes, - gboolean excl_child) +static GdkWindow * +gdk_x11_window_alloc (void) { GdkWindow *window; - GdkDrawablePrivate *private; - Display *disp; - Window *list = NULL; - Window root, child = 0, parent_win = 0, root_win = 0; - unsigned int num; - int i; - - window = (GdkWindow*) &gdk_root_parent; - private = (GdkDrawablePrivate*) window; - disp = private->xdisplay; - root = private->xwindow; - num = g_list_length (excludes); + GdkWindowPrivate *private; - XGrabServer (disp); - if (!XQueryTree (disp, root, &root_win, &parent_win, &list, &num)) - { - XUngrabServer (disp); - return root; - } - if (list) + static GdkDrawableClass klass; + static gboolean initialized = FALSE; + + if (!initialized) { - i = num - 1; - do - { - XWindowAttributes xwa; - - XGetWindowAttributes (disp, list [i], &xwa); - - if (xwa.map_state != IsViewable) - continue; - - if (excl_child && g_list_find (excludes, (gpointer *) list[i])) - continue; - - if ((child = gdk_window_xid_at (list[i], 0, 0, x, y, excludes, excl_child)) == 0) - continue; - - if (excludes) - { - if (!g_list_find (excludes, (gpointer *) child)) - { - XFree (list); - XUngrabServer (disp); - return child; - } - } - else - { - XFree (list); - XUngrabServer (disp); - return child; - } - } while (--i > 0); - XFree (list); + initialized = TRUE; + + klass = _gdk_x11_drawable_class; + klass.destroy = gdk_x11_window_destroy; } - XUngrabServer (disp); - return root; + + window = _gdk_window_alloc (); + private = (GdkWindowPrivate *)window; + + private->drawable.klass = &klass; + private->drawable.klass_data = g_new (GdkDrawableXData, 1); + + return window; } void gdk_window_init (void) { + GdkWindowPrivate *private; XWindowAttributes xattributes; unsigned int width; unsigned int height; @@ -225,18 +131,18 @@ gdk_window_init (void) XGetGeometry (gdk_display, gdk_root_window, &gdk_root_window, &x, &y, &width, &height, &border_width, &depth); XGetWindowAttributes (gdk_display, gdk_root_window, &xattributes); + + gdk_parent_root = gdk_x11_window_alloc (); + private = (GdkWindowPrivate *)gdk_parent_root; + + GDK_DRAWABLE_XDATA (gdk_parent_root)->xdisplay = gdk_display; + GDK_DRAWABLE_XDATA (gdk_parent_root)->xid = gdk_root_window; + + private->drawable.window_type = GDK_WINDOW_ROOT; + private->drawable.width = width; + private->drawable.height = height; - gdk_root_parent.drawable.xwindow = gdk_root_window; - gdk_root_parent.drawable.xdisplay = gdk_display; - gdk_root_parent.drawable.window_type = GDK_WINDOW_ROOT; - gdk_root_parent.drawable.drawable.user_data = NULL; - gdk_root_parent.drawable.width = width; - gdk_root_parent.drawable.height = height; - gdk_root_parent.children = NULL; - gdk_root_parent.drawable.colormap = NULL; - gdk_root_parent.drawable.ref_count = 1; - - gdk_xid_table_insert (&gdk_root_window, &gdk_root_parent); + gdk_xid_table_insert (&gdk_root_window, gdk_parent_root); } static GdkAtom wm_client_leader_atom = GDK_NONE; @@ -249,16 +155,18 @@ gdk_window_new (GdkWindow *parent, GdkWindow *window; GdkWindowPrivate *private; GdkWindowPrivate *parent_private; + GdkVisual *visual; - Display *parent_display; Window xparent; Visual *xvisual; + XSetWindowAttributes xattributes; long xattributes_mask; XSizeHints size_hints; XWMHints wm_hints; XClassHint *class_hint; int x, y, depth; + unsigned int class; char *title; int i; @@ -266,26 +174,21 @@ gdk_window_new (GdkWindow *parent, g_return_val_if_fail (attributes != NULL, NULL); if (!parent) - parent = (GdkWindow*) &gdk_root_parent; + parent = gdk_parent_root; parent_private = (GdkWindowPrivate*) parent; if (GDK_DRAWABLE_DESTROYED (parent)) return NULL; - xparent = parent_private->drawable.xwindow; - parent_display = parent_private->drawable.xdisplay; + xparent = GDK_DRAWABLE_XID (parent); - private = g_new (GdkWindowPrivate, 1); - window = (GdkWindow*) private; + window = gdk_x11_window_alloc (); + private = (GdkWindowPrivate *)window; + + GDK_DRAWABLE_XDATA (window)->xdisplay = GDK_DRAWABLE_XDISPLAY (parent); private->parent = parent; - - private->drawable.xdisplay = parent_display; - private->drawable.destroyed = FALSE; - private->mapped = FALSE; - private->guffaw_gravity = FALSE; - private->resize_count = 0; - private->drawable.ref_count = 1; + xattributes_mask = 0; if (attributes_mask & GDK_WA_X) @@ -303,12 +206,6 @@ gdk_window_new (GdkWindow *parent, private->drawable.width = (attributes->width > 1) ? (attributes->width) : (1); private->drawable.height = (attributes->height > 1) ? (attributes->height) : (1); private->drawable.window_type = attributes->window_type; - private->extension_events = FALSE; - - private->filters = NULL; - private->children = NULL; - - window->user_data = NULL; if (attributes_mask & GDK_WA_VISUAL) visual = attributes->visual; @@ -363,26 +260,26 @@ gdk_window_new (GdkWindow *parent, switch (private->drawable.window_type) { case GDK_WINDOW_TOPLEVEL: - xattributes.colormap = ((GdkColormapPrivate*) private->drawable.colormap)->xcolormap; + xattributes.colormap = GDK_COLORMAP_XCOLORMAP (private->drawable.colormap); xattributes_mask |= CWColormap; xparent = gdk_root_window; break; case GDK_WINDOW_CHILD: - xattributes.colormap = ((GdkColormapPrivate*) private->drawable.colormap)->xcolormap; + xattributes.colormap = GDK_COLORMAP_XCOLORMAP (private->drawable.colormap); xattributes_mask |= CWColormap; break; case GDK_WINDOW_DIALOG: - xattributes.colormap = ((GdkColormapPrivate*) private->drawable.colormap)->xcolormap; + xattributes.colormap = GDK_COLORMAP_XCOLORMAP (private->drawable.colormap); xattributes_mask |= CWColormap; xparent = gdk_root_window; break; case GDK_WINDOW_TEMP: - xattributes.colormap = ((GdkColormapPrivate*) private->drawable.colormap)->xcolormap; + xattributes.colormap = GDK_COLORMAP_XCOLORMAP (private->drawable.colormap); xattributes_mask |= CWColormap; xparent = gdk_root_window; @@ -406,13 +303,14 @@ gdk_window_new (GdkWindow *parent, class = InputOnly; private->drawable.colormap = NULL; } - - private->drawable.xwindow = XCreateWindow (private->drawable.xdisplay, xparent, - x, y, private->drawable.width, private->drawable.height, - 0, depth, class, xvisual, - xattributes_mask, &xattributes); - gdk_window_ref (window); - gdk_xid_table_insert (&private->drawable.xwindow, window); + + GDK_DRAWABLE_XDATA (private)->xid = XCreateWindow (GDK_DRAWABLE_XDISPLAY (parent), + xparent, + x, y, private->drawable.width, private->drawable.height, + 0, depth, class, xvisual, + xattributes_mask, &xattributes); + gdk_drawable_ref (window); + gdk_xid_table_insert (&GDK_DRAWABLE_XID (window), window); if (private->drawable.colormap) gdk_colormap_ref (private->drawable.colormap); @@ -427,10 +325,14 @@ gdk_window_new (GdkWindow *parent, switch (private->drawable.window_type) { case GDK_WINDOW_DIALOG: - XSetTransientForHint (private->drawable.xdisplay, private->drawable.xwindow, xparent); + XSetTransientForHint (GDK_DRAWABLE_XDISPLAY (window), + GDK_DRAWABLE_XID (window), + xparent); case GDK_WINDOW_TOPLEVEL: case GDK_WINDOW_TEMP: - XSetWMProtocols (private->drawable.xdisplay, private->drawable.xwindow, gdk_wm_window_protocols, 2); + XSetWMProtocols (GDK_DRAWABLE_XDISPLAY (window), + GDK_DRAWABLE_XID (window), + gdk_wm_window_protocols, 2); break; case GDK_WINDOW_CHILD: if ((attributes->wclass == GDK_INPUT_OUTPUT) && @@ -460,14 +362,19 @@ gdk_window_new (GdkWindow *parent, * attention to PSize, and even if they do, is this the * correct value??? */ - XSetWMNormalHints (private->drawable.xdisplay, private->drawable.xwindow, &size_hints); + XSetWMNormalHints (GDK_DRAWABLE_XDISPLAY (window), + GDK_DRAWABLE_XID (window), + &size_hints); - XSetWMHints (private->drawable.xdisplay, private->drawable.xwindow, &wm_hints); + XSetWMHints (GDK_DRAWABLE_XDISPLAY (window), + GDK_DRAWABLE_XID (window), + &wm_hints); if (!wm_client_leader_atom) wm_client_leader_atom = gdk_atom_intern ("WM_CLIENT_LEADER", FALSE); - XChangeProperty (private->drawable.xdisplay, private->drawable.xwindow, + XChangeProperty (GDK_DRAWABLE_XDISPLAY (window), + GDK_DRAWABLE_XID (window), wm_client_leader_atom, XA_WINDOW, 32, PropModeReplace, (guchar*) &gdk_leader_window, 1); @@ -477,7 +384,8 @@ gdk_window_new (GdkWindow *parent, else title = g_get_prgname (); - XmbSetWMProperties (private->drawable.xdisplay, private->drawable.xwindow, + XmbSetWMProperties (GDK_DRAWABLE_XDISPLAY (window), + GDK_DRAWABLE_XID (window), title, title, NULL, 0, NULL, NULL, NULL); @@ -487,11 +395,12 @@ gdk_window_new (GdkWindow *parent, class_hint = XAllocClassHint (); class_hint->res_name = attributes->wmclass_name; class_hint->res_class = attributes->wmclass_class; - XSetClassHint (private->drawable.xdisplay, private->drawable.xwindow, class_hint); + XSetClassHint (GDK_DRAWABLE_XDISPLAY (window), + GDK_DRAWABLE_XID (window), + class_hint); XFree (class_hint); } - return window; } @@ -518,12 +427,13 @@ gdk_window_foreign_new (guint32 anid) result = XQueryTree (gdk_display, anid, &root, &parent, &children, &nchildren); if (gdk_error_trap_pop () || !result) return NULL; - - private = g_new (GdkWindowPrivate, 1); - window = (GdkWindow*) private; - + if (children) XFree (children); + + window = gdk_x11_window_alloc (); + private = (GdkWindowPrivate *)window; + private->parent = gdk_xid_table_lookup (parent); parent_private = (GdkWindowPrivate *)private->parent; @@ -531,29 +441,19 @@ gdk_window_foreign_new (guint32 anid) if (parent_private) parent_private->children = g_list_prepend (parent_private->children, window); - private->drawable.xwindow = anid; - private->drawable.xdisplay = gdk_display; + GDK_DRAWABLE_XDATA (window)->xid = anid; + GDK_DRAWABLE_XDATA (window)->xdisplay = GDK_DRAWABLE_XDISPLAY (parent); + private->x = attrs.x; private->y = attrs.y; private->drawable.width = attrs.width; private->drawable.height = attrs.height; - private->resize_count = 0; - private->drawable.ref_count = 1; private->drawable.window_type = GDK_WINDOW_FOREIGN; private->drawable.destroyed = FALSE; private->mapped = (attrs.map_state != IsUnmapped); - private->guffaw_gravity = FALSE; - private->extension_events = 0; - - private->drawable.colormap = NULL; - private->filters = NULL; - private->children = NULL; - - window->user_data = NULL; - - gdk_window_ref (window); - gdk_xid_table_insert (&private->drawable.xwindow, window); + gdk_drawable_ref (window); + gdk_xid_table_insert (&GDK_DRAWABLE_XID (window), window); return window; } @@ -646,20 +546,22 @@ gdk_window_internal_destroy (GdkWindow *window, gdk_window_reparent (window, NULL, 0, 0); xevent.type = ClientMessage; - xevent.window = private->drawable.xwindow; + xevent.window = GDK_DRAWABLE_XID (window); xevent.message_type = gdk_wm_protocols; xevent.format = 32; xevent.data.l[0] = gdk_wm_delete_window; xevent.data.l[1] = CurrentTime; - XSendEvent (private->drawable.xdisplay, private->drawable.xwindow, + XSendEvent (GDK_DRAWABLE_XDISPLAY (window), + GDK_DRAWABLE_XID (window), False, 0, (XEvent *)&xevent); gdk_flush (); gdk_error_trap_pop (); } } else if (xdestroy) - XDestroyWindow (private->drawable.xdisplay, private->drawable.xwindow); + XDestroyWindow (GDK_DRAWABLE_XDISPLAY (window), + GDK_DRAWABLE_XID (window)); if (private->drawable.colormap) gdk_colormap_unref (private->drawable.colormap); @@ -686,7 +588,7 @@ void gdk_window_destroy (GdkWindow *window) { gdk_window_internal_destroy (window, TRUE, TRUE); - gdk_window_unref (window); + gdk_drawable_unref (window); } /* This function is called when the XWindow is really gone. */ @@ -705,38 +607,7 @@ gdk_window_destroy_notify (GdkWindow *window) } gdk_xid_table_remove (GDK_DRAWABLE_XID (window)); - gdk_window_unref (window); -} - -GdkWindow* -gdk_window_ref (GdkWindow *window) -{ - GdkWindowPrivate *private = (GdkWindowPrivate *)window; - g_return_val_if_fail (window != NULL, NULL); - - private->drawable.ref_count += 1; - return window; -} - -void -gdk_window_unref (GdkWindow *window) -{ - GdkWindowPrivate *private = (GdkWindowPrivate *)window; - g_return_if_fail (window != NULL); - - private->drawable.ref_count -= 1; - if (private->drawable.ref_count == 0) - { - if (!private->drawable.destroyed) - { - if (private->drawable.window_type == GDK_WINDOW_FOREIGN) - gdk_xid_table_remove (private->drawable.xwindow); - else - g_warning ("losing last reference to undestroyed window\n"); - } - g_dataset_destroy (window); - g_free (window); - } + gdk_drawable_unref (window); } void @@ -750,8 +621,10 @@ gdk_window_show (GdkWindow *window) if (!private->drawable.destroyed) { private->mapped = TRUE; - XRaiseWindow (private->drawable.xdisplay, private->drawable.xwindow); - XMapWindow (private->drawable.xdisplay, private->drawable.xwindow); + XRaiseWindow (GDK_DRAWABLE_XDISPLAY (window), + GDK_DRAWABLE_XID (window)); + XMapWindow (GDK_DRAWABLE_XDISPLAY (window), + GDK_DRAWABLE_XID (window)); } } @@ -766,7 +639,8 @@ gdk_window_hide (GdkWindow *window) if (!private->drawable.destroyed) { private->mapped = FALSE; - XUnmapWindow (private->drawable.xdisplay, private->drawable.xwindow); + XUnmapWindow (GDK_DRAWABLE_XDISPLAY (window), + GDK_DRAWABLE_XID (window)); } } @@ -779,7 +653,8 @@ gdk_window_withdraw (GdkWindow *window) private = (GdkWindowPrivate*) window; if (!private->drawable.destroyed) - XWithdrawWindow (private->drawable.xdisplay, private->drawable.xwindow, 0); + XWithdrawWindow (GDK_DRAWABLE_XDISPLAY (window), + GDK_DRAWABLE_XID (window), 0); } void @@ -794,7 +669,9 @@ gdk_window_move (GdkWindow *window, private = (GdkWindowPrivate*) window; if (!private->drawable.destroyed) { - XMoveWindow (private->drawable.xdisplay, private->drawable.xwindow, x, y); + XMoveWindow (GDK_DRAWABLE_XDISPLAY (window), + GDK_DRAWABLE_XID (window), + x, y); if (private->drawable.window_type == GDK_WINDOW_CHILD) { @@ -904,7 +781,7 @@ gdk_window_reparent (GdkWindow *window, g_return_if_fail (GDK_IS_WINDOW (new_parent)); if (!new_parent) - new_parent = (GdkWindow*) &gdk_root_parent; + new_parent = gdk_parent_root; window_private = (GdkWindowPrivate*) window; old_parent_private = (GdkWindowPrivate*)window_private->parent; @@ -990,15 +867,6 @@ gdk_window_lower (GdkWindow *window) } void -gdk_window_set_user_data (GdkWindow *window, - gpointer user_data) -{ - g_return_if_fail (window != NULL); - - window->user_data = user_data; -} - -void gdk_window_set_hints (GdkWindow *window, gint x, gint y, @@ -1244,15 +1112,6 @@ gdk_window_set_cursor (GdkWindow *window, } void -gdk_window_get_user_data (GdkWindow *window, - gpointer *data) -{ - g_return_if_fail (window != NULL); - - *data = window->user_data; -} - -void gdk_window_get_geometry (GdkWindow *window, gint *x, gint *y, @@ -1271,7 +1130,7 @@ gdk_window_get_geometry (GdkWindow *window, g_return_if_fail (window == NULL || GDK_IS_WINDOW (window)); if (!window) - window = (GdkWindow *) &gdk_root_parent; + window = gdk_parent_root; if (!GDK_DRAWABLE_DESTROYED (window)) { @@ -1292,24 +1151,6 @@ gdk_window_get_geometry (GdkWindow *window, } } -void -gdk_window_get_position (GdkWindow *window, - gint *x, - gint *y) -{ - GdkWindowPrivate *window_private; - - g_return_if_fail (window != NULL); - g_return_if_fail (GDK_IS_WINDOW (window)); - - window_private = (GdkWindowPrivate*) window; - - if (x) - *x = window_private->x; - if (y) - *y = window_private->y; -} - gint gdk_window_get_origin (GdkWindow *window, gint *x, @@ -1481,7 +1322,7 @@ gdk_window_get_pointer (GdkWindow *window, g_return_val_if_fail (window == NULL || GDK_IS_WINDOW (window), NULL); if (!window) - window = (GdkWindow*) &gdk_root_parent; + window = gdk_parent_root; return_val = NULL; if (!GDK_DRAWABLE_DESTROYED (window) && @@ -1507,31 +1348,29 @@ GdkWindow* gdk_window_at_pointer (gint *win_x, gint *win_y) { - GdkWindowPrivate *private; GdkWindow *window; Window root; Window xwindow; Window xwindow_last = 0; + Display *xdisplay; int rootx = -1, rooty = -1; int winx, winy; unsigned int xmask; - private = &gdk_root_parent; + xwindow = GDK_ROOT_WINDOW (); + xdisplay = GDK_DISPLAY (); - xwindow = private->drawable.xwindow; - - XGrabServer (private->drawable.xdisplay); + XGrabServer (xdisplay); while (xwindow) { xwindow_last = xwindow; - XQueryPointer (private->drawable.xdisplay, - xwindow, + XQueryPointer (xdisplay, xwindow, &root, &xwindow, &rootx, &rooty, &winx, &winy, &xmask); } - XUngrabServer (private->drawable.xdisplay); + XUngrabServer (xdisplay); window = gdk_window_lookup (xwindow_last); @@ -1543,30 +1382,6 @@ gdk_window_at_pointer (gint *win_x, return window; } -GdkWindow* -gdk_window_get_parent (GdkWindow *window) -{ - g_return_val_if_fail (window != NULL, NULL); - g_return_val_if_fail (GDK_IS_WINDOW (window), NULL); - - return ((GdkWindowPrivate*) window)->parent; -} - -GdkWindow* -gdk_window_get_toplevel (GdkWindow *window) -{ - GdkWindowPrivate *private; - - g_return_val_if_fail (window != NULL, NULL); - g_return_val_if_fail (GDK_IS_WINDOW (window), NULL); - - private = (GdkWindowPrivate *)window; - while (GDK_DRAWABLE_TYPE (private) == GDK_WINDOW_CHILD) - private = (GdkWindowPrivate *)private->parent; - - return (GdkWindow *)window; -} - GList* gdk_window_get_children (GdkWindow *window) { @@ -1765,84 +1580,6 @@ gdk_window_shape_combine_mask (GdkWindow *window, #endif /* HAVE_SHAPE_EXT */ } -void -gdk_window_add_filter (GdkWindow *window, - GdkFilterFunc function, - gpointer data) -{ - GdkWindowPrivate *private; - GList *tmp_list; - GdkEventFilter *filter; - - g_return_if_fail (window != NULL); - g_return_if_fail (GDK_IS_WINDOW (window)); - - private = (GdkWindowPrivate*) window; - if (private && GDK_DRAWABLE_DESTROYED (window)) - return; - - if (private) - tmp_list = private->filters; - else - tmp_list = gdk_default_filters; - - while (tmp_list) - { - filter = (GdkEventFilter *)tmp_list->data; - if ((filter->function == function) && (filter->data == data)) - return; - tmp_list = tmp_list->next; - } - - filter = g_new (GdkEventFilter, 1); - filter->function = function; - filter->data = data; - - if (private) - private->filters = g_list_append (private->filters, filter); - else - gdk_default_filters = g_list_append (gdk_default_filters, filter); -} - -void -gdk_window_remove_filter (GdkWindow *window, - GdkFilterFunc function, - gpointer data) -{ - GdkWindowPrivate *private; - GList *tmp_list, *node; - GdkEventFilter *filter; - - g_return_if_fail (window != NULL); - g_return_if_fail (GDK_IS_WINDOW (window)); - - private = (GdkWindowPrivate*) window; - - if (private) - tmp_list = private->filters; - else - tmp_list = gdk_default_filters; - - while (tmp_list) - { - filter = (GdkEventFilter *)tmp_list->data; - node = tmp_list; - tmp_list = tmp_list->next; - - if ((filter->function == function) && (filter->data == data)) - { - if (private) - private->filters = g_list_remove_link (private->filters, node); - else - gdk_default_filters = g_list_remove_link (gdk_default_filters, node); - g_list_free_1 (node); - g_free (filter); - - return; - } - } -} - void gdk_window_set_override_redirect (GdkWindow *window, gboolean override_redirect) @@ -2038,29 +1775,12 @@ gdk_window_set_functions (GdkWindow *window, gdk_window_set_mwm_hints (window, &hints); } -GList * -gdk_window_get_toplevels (void) -{ - GList *new_list = NULL; - GList *tmp_list; - - tmp_list = gdk_root_parent.children; - while (tmp_list) - { - new_list = g_list_prepend (new_list, tmp_list->data); - tmp_list = tmp_list->next; - } - - return new_list; -} - /* * propagate the shapes from all child windows of a GDK window to the parent * window. Shamelessly ripped from Enlightenment's code * * - Raster */ - struct _gdk_span { gint start; @@ -2395,59 +2115,6 @@ gdk_window_merge_child_shapes (GdkWindow *window) #endif } -/************************************************************* - * gdk_window_is_visible: - * Check if the given window is mapped. - * arguments: - * window: - * results: - * is the window mapped - *************************************************************/ - -gboolean -gdk_window_is_visible (GdkWindow *window) -{ - GdkWindowPrivate *private = (GdkWindowPrivate *)window; - - g_return_val_if_fail (window != NULL, FALSE); - g_return_val_if_fail (GDK_IS_WINDOW (window), FALSE); - - return private->mapped; -} - -/************************************************************* - * gdk_window_is_viewable: - * Check if the window and all ancestors of the window - * are mapped. (This is not necessarily "viewable" in - * the X sense, since we only check as far as we have - * GDK window parents, not to the root window) - * arguments: - * window: - * results: - * is the window viewable - *************************************************************/ - -gboolean -gdk_window_is_viewable (GdkWindow *window) -{ - GdkWindowPrivate *private = (GdkWindowPrivate *)window; - - g_return_val_if_fail (window != NULL, FALSE); - g_return_val_if_fail (GDK_IS_WINDOW (window), FALSE); - - while (private && - (private != &gdk_root_parent) && - (private->drawable.window_type != GDK_WINDOW_FOREIGN)) - { - if (!private->mapped) - return FALSE; - - private = (GdkWindowPrivate *)private->parent; - } - - return TRUE; -} - /* Support for windows that can be guffaw-scrolled * (See http://www.gtk.org/~otaylor/whitepapers/guffaw-scrolling.txt) */ @@ -2581,3 +2248,135 @@ gdk_window_set_static_gravities (GdkWindow *window, return TRUE; } + +/* internal function created for and used by gdk_window_xid_at_coords */ +Window +gdk_window_xid_at (Window base, + gint bx, + gint by, + gint x, + gint y, + GList *excludes, + gboolean excl_child) +{ + Display *xdisplay; + Window *list = NULL; + Window child = 0, parent_win = 0, root_win = 0; + int i; + unsigned int ww, wh, wb, wd, num; + int wx, wy; + + xdisplay = GDK_DISPLAY (); + if (!XGetGeometry (xdisplay, base, &root_win, &wx, &wy, &ww, &wh, &wb, &wd)) + return 0; + wx += bx; + wy += by; + + if (!((x >= wx) && + (y >= wy) && + (x < (int) (wx + ww)) && + (y < (int) (wy + wh)))) + return 0; + + if (!XQueryTree (xdisplay, base, &root_win, &parent_win, &list, &num)) + return base; + + if (list) + { + for (i = num - 1; ; i--) + { + if ((!excl_child) || (!g_list_find (excludes, (gpointer *) list[i]))) + { + if ((child = gdk_window_xid_at (list[i], wx, wy, x, y, excludes, excl_child)) != 0) + { + XFree (list); + return child; + } + } + if (!i) + break; + } + XFree (list); + } + return base; +} + +/* + * The following fucntion by The Rasterman <raster@redhat.com> + * This function returns the X Window ID in which the x y location is in + * (x and y being relative to the root window), excluding any windows listed + * in the GList excludes (this is a list of X Window ID's - gpointer being + * the Window ID). + * + * This is primarily designed for internal gdk use - for DND for example + * when using a shaped icon window as the drag object - you exclude the + * X Window ID of the "icon" (perhaps more if excludes may be needed) and + * You can get back an X Window ID as to what X Window ID is infact under + * those X,Y co-ordinates. + */ +Window +gdk_window_xid_at_coords (gint x, + gint y, + GList *excludes, + gboolean excl_child) +{ + GdkWindow *window; + GdkDrawablePrivate *private; + Display *xdisplay; + Window *list = NULL; + Window root, child = 0, parent_win = 0, root_win = 0; + unsigned int num; + int i; + + window = gdk_parent_root; + private = (GdkDrawablePrivate*) window; + xdisplay = GDK_DRAWABLE_XDISPLAY (private); + root = GDK_DRAWABLE_XID (private); + num = g_list_length (excludes); + + XGrabServer (xdisplay); + if (!XQueryTree (xdisplay, root, &root_win, &parent_win, &list, &num)) + { + XUngrabServer (xdisplay); + return root; + } + if (list) + { + i = num - 1; + do + { + XWindowAttributes xwa; + + XGetWindowAttributes (xdisplay, list [i], &xwa); + + if (xwa.map_state != IsViewable) + continue; + + if (excl_child && g_list_find (excludes, (gpointer *) list[i])) + continue; + + if ((child = gdk_window_xid_at (list[i], 0, 0, x, y, excludes, excl_child)) == 0) + continue; + + if (excludes) + { + if (!g_list_find (excludes, (gpointer *) child)) + { + XFree (list); + XUngrabServer (xdisplay); + return child; + } + } + else + { + XFree (list); + XUngrabServer (xdisplay); + return child; + } + } while (--i > 0); + XFree (list); + } + XUngrabServer (xdisplay); + return root; +} + diff --git a/gdk/x11/gdkx.h b/gdk/x11/gdkx.h index 4f142bd1ef..dcbd26b803 100644 --- a/gdk/x11/gdkx.h +++ b/gdk/x11/gdkx.h @@ -27,26 +27,25 @@ #ifndef __GDK_X_H__ #define __GDK_X_H__ -#include <gdk/gdkprivate.h> - +#include <gdk/x11/gdkprivate-x11.h> #define GDK_ROOT_WINDOW() gdk_root_window -#define GDK_ROOT_PARENT() ((GdkWindow *)&gdk_root_parent) +#define GDK_ROOT_PARENT() ((GdkWindow *)&gdk_parent_root) #define GDK_DISPLAY() gdk_display -#define GDK_DRAWABLE_XDISPLAY(win) (((GdkDrawablePrivate*) win)->xdisplay) -#define GDK_DRAWABLE_XID(win) (((GdkDrawablePrivate*) win)->xwindow) -#define GDK_WINDOW_XDISPLAY GDK_DRAWABLE_XDISPLAY -#define GDK_WINDOW_XWINDOW GDK_DRAWABLE_XID +#define GDK_DRAWABLE_XDISPLAY(win) (GDK_DRAWABLE_XDATA(win)->xdisplay) +#define GDK_DRAWABLE_XID(win) (GDK_DRAWABLE_XDATA(win)->xid) #define GDK_IMAGE_XDISPLAY(image) (((GdkImagePrivate*) image)->xdisplay) #define GDK_IMAGE_XIMAGE(image) (((GdkImagePrivate*) image)->ximage) -#define GDK_GC_XDISPLAY(gc) (((GdkGCPrivate*) gc)->xdisplay) -#define GDK_GC_XGC(gc) (((GdkGCPrivate*) gc)->xgc) -#define GDK_COLORMAP_XDISPLAY(cmap) (((GdkColormapPrivate*) cmap)->xdisplay) -#define GDK_COLORMAP_XCOLORMAP(cmap) (((GdkColormapPrivate*) cmap)->xcolormap) +#define GDK_GC_XDISPLAY(gc) (GDK_GC_XDATA(gc)->xdisplay) +#define GDK_GC_XGC(gc) (GDK_GC_XDATA(gc)->xgc) +#define GDK_COLORMAP_XDISPLAY(cmap) (((GdkColormapPrivateX *)cmap)->xdisplay) +#define GDK_COLORMAP_XCOLORMAP(cmap) (((GdkColormapPrivateX *)cmap)->xcolormap) #define GDK_VISUAL_XVISUAL(vis) (((GdkVisualPrivate*) vis)->xvisual) #define GDK_FONT_XDISPLAY(font) (((GdkFontPrivate*) font)->xdisplay) -#define GDK_FONT_XFONT(font) (((GdkFontPrivate*) font)->xfont) +#define GDK_FONT_XFONT(font) (((GdkFontPrivateX *)font)->xfont) +#define GDK_WINDOW_XWINDOW GDK_DRAWABLE_XID +#define GDK_WINDOW_XDISPLAY GDK_DRAWABLE_XDISPLAY GdkVisual* gdkx_visual_get (VisualID xvisualid); /* XXX: Do not use this function until it is fixed. An X Colormap @@ -58,7 +57,7 @@ Window gdk_get_client_window (Display *dpy, Window win); /* Functions to create pixmaps and windows from their X equivalents */ -GdkPixmap *gdk_pixmap_foreign_new (guint32 anid); -GdkWindow *gdk_window_foreign_new (guint32 anid); +GdkPixmap *gdk_pixmap_foreign_new (guint32 anid); +GdkWindow *gdk_window_foreign_new (guint32 anid); #endif /* __GDK_X_H__ */ diff --git a/gdk/x11/gdkxid.c b/gdk/x11/gdkxid.c index 7067386732..2c5a9c7410 100644 --- a/gdk/x11/gdkxid.c +++ b/gdk/x11/gdkxid.c @@ -24,7 +24,7 @@ * GTK+ at ftp://ftp.gtk.org/pub/gtk/. */ -#include "gdkprivate.h" +#include "gdkprivate-x11.h" #include <stdio.h> static guint gdk_xid_hash (XID *xid); |