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/gdkdraw.c | |
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/gdkdraw.c')
-rw-r--r-- | gdk/gdkdraw.c | 393 |
1 files changed, 106 insertions, 287 deletions
diff --git a/gdk/gdkdraw.c b/gdk/gdkdraw.c index 6c8963a5b2..c4b6d18890 100644 --- a/gdk/gdkdraw.c +++ b/gdk/gdkdraw.c @@ -24,16 +24,34 @@ * GTK+ at ftp://ftp.gtk.org/pub/gtk/. */ -#include <X11/Xlib.h> -#include <X11/Xos.h> - -#include "gdkx.h" #include "gdkdrawable.h" #include "gdkprivate.h" #include "gdkwindow.h" /* Manipulation of drawables */ +GdkDrawable * +gdk_drawable_alloc (void) +{ + GdkDrawablePrivate *private = g_new (GdkDrawablePrivate, 1); + GdkDrawable *drawable = (GdkDrawable*) private; + + drawable->user_data = NULL; + + private->ref_count = 1; + private->destroyed = FALSE; + private->klass = NULL; + private->klass_data = NULL; + private->window_type = GDK_WINDOW_CHILD; + + private->width = 1; + private->height = 1; + + private->colormap = NULL; + + return drawable; +} + void gdk_drawable_set_data (GdkDrawable *drawable, const gchar *key, @@ -75,68 +93,6 @@ gdk_drawable_get_size (GdkDrawable *drawable, *height = drawable_private->height; } -void -gdk_drawable_set_colormap (GdkDrawable *drawable, - GdkColormap *colormap) -{ - GdkDrawablePrivate *drawable_private; - GdkColormapPrivate *colormap_private; - - g_return_if_fail (drawable != NULL); - g_return_if_fail (colormap != NULL); - - drawable_private = (GdkDrawablePrivate*) drawable; - colormap_private = (GdkColormapPrivate*) colormap; - - if (!GDK_DRAWABLE_DESTROYED (drawable)) - { - if (GDK_IS_WINDOW (drawable)) - { - g_return_if_fail (colormap_private->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); - } -} - -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; -} - GdkVisual* gdk_drawable_get_visual (GdkDrawable *drawable) { @@ -148,6 +104,33 @@ gdk_drawable_get_visual (GdkDrawable *drawable) return colormap ? gdk_colormap_get_visual (colormap) : NULL; } +GdkDrawable* +gdk_drawable_ref (GdkDrawable *drawable) +{ + GdkDrawablePrivate *private = (GdkDrawablePrivate *)drawable; + g_return_val_if_fail (drawable != NULL, NULL); + + private->ref_count += 1; + return drawable; +} + +void +gdk_drawable_unref (GdkDrawable *drawable) +{ + GdkDrawablePrivate *private = (GdkDrawablePrivate *)drawable; + + g_return_if_fail (drawable != NULL); + g_return_if_fail (private->ref_count > 0); + + private->ref_count -= 1; + if (private->ref_count == 0) + { + private->klass->destroy (drawable); + g_dataset_destroy (drawable); + g_free (drawable); + } +} + /* Drawing */ void @@ -157,6 +140,7 @@ gdk_draw_point (GdkDrawable *drawable, gint y) { GdkGCPrivate *gc_private; + GdkPoint point; g_return_if_fail (drawable != NULL); g_return_if_fail (gc != NULL); @@ -165,8 +149,10 @@ gdk_draw_point (GdkDrawable *drawable, return; gc_private = (GdkGCPrivate*) gc; - XDrawPoint (GDK_DRAWABLE_XDISPLAY (drawable), GDK_DRAWABLE_XID (drawable), - gc_private->xgc, x, y); + point.x = x; + point.y = y; + + ((GdkDrawablePrivate *)drawable)->klass->draw_points (drawable, gc, &point, 1); } void @@ -178,6 +164,7 @@ gdk_draw_line (GdkDrawable *drawable, gint y2) { GdkGCPrivate *gc_private; + GdkSegment segment; g_return_if_fail (drawable != NULL); g_return_if_fail (gc != NULL); @@ -186,8 +173,11 @@ gdk_draw_line (GdkDrawable *drawable, return; gc_private = (GdkGCPrivate*) gc; - XDrawLine (GDK_DRAWABLE_XDISPLAY (drawable), GDK_DRAWABLE_XID (drawable), - gc_private->xgc, x1, y1, x2, y2); + segment.x1 = x1; + segment.y1 = y1; + segment.x2 = x2; + segment.y2 = y2; + ((GdkDrawablePrivate *)drawable)->klass->draw_segments (drawable, gc, &segment, 1); } void @@ -200,7 +190,6 @@ gdk_draw_rectangle (GdkDrawable *drawable, gint height) { GdkDrawablePrivate *drawable_private; - GdkGCPrivate *gc_private; g_return_if_fail (drawable != NULL); g_return_if_fail (gc != NULL); @@ -208,19 +197,14 @@ gdk_draw_rectangle (GdkDrawable *drawable, drawable_private = (GdkDrawablePrivate*) drawable; if (GDK_DRAWABLE_DESTROYED (drawable)) return; - gc_private = (GdkGCPrivate*) gc; - if (width == -1) + if (width < 0) width = drawable_private->width; - if (height == -1) + if (height < 0) height = drawable_private->height; - if (filled) - XFillRectangle (GDK_DRAWABLE_XDISPLAY (drawable), GDK_DRAWABLE_XID (drawable), - gc_private->xgc, x, y, width, height); - else - XDrawRectangle (GDK_DRAWABLE_XDISPLAY (drawable), GDK_DRAWABLE_XID (drawable), - gc_private->xgc, x, y, width, height); + ((GdkDrawablePrivate *)drawable)->klass->draw_rectangle (drawable, gc, filled, x, y, + width, height); } void @@ -245,17 +229,13 @@ gdk_draw_arc (GdkDrawable *drawable, return; gc_private = (GdkGCPrivate*) gc; - if (width == -1) + if (width < 0) width = drawable_private->width; - if (height == -1) + if (height < 0) height = drawable_private->height; - if (filled) - XFillArc (GDK_DRAWABLE_XDISPLAY (drawable), GDK_DRAWABLE_XID (drawable), - gc_private->xgc, x, y, width, height, angle1, angle2); - else - XDrawArc (GDK_DRAWABLE_XDISPLAY (drawable), GDK_DRAWABLE_XID (drawable), - gc_private->xgc, x, y, width, height, angle1, angle2); + ((GdkDrawablePrivate *)drawable)->klass->draw_arc (drawable, gc, filled, + x, y, width, height, angle1, angle2); } void @@ -265,44 +245,14 @@ gdk_draw_polygon (GdkDrawable *drawable, GdkPoint *points, gint npoints) { - GdkGCPrivate *gc_private; - GdkPoint *local_points = points; - gint local_npoints = npoints; - gint local_alloc = 0; - g_return_if_fail (drawable != NULL); g_return_if_fail (gc != NULL); if (GDK_DRAWABLE_DESTROYED (drawable)) return; - gc_private = (GdkGCPrivate*) gc; - if (filled) - { - XFillPolygon (GDK_DRAWABLE_XDISPLAY (drawable), GDK_DRAWABLE_XID (drawable), - gc_private->xgc, (XPoint*) points, npoints, Complex, CoordModeOrigin); - } - else - { - 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), - gc_private->xgc, - (XPoint*) local_points, local_npoints, - CoordModeOrigin); - - if (local_alloc) - g_free (local_points); - } + ((GdkDrawablePrivate *)drawable)->klass->draw_polygon (drawable, gc, filled, + points, npoints); } /* gdk_draw_string @@ -319,43 +269,7 @@ gdk_draw_string (GdkDrawable *drawable, gint y, const gchar *string) { - GdkFontPrivate *font_private; - GdkGCPrivate *gc_private; - - g_return_if_fail (drawable != NULL); - g_return_if_fail (font != NULL); - g_return_if_fail (gc != NULL); - g_return_if_fail (string != NULL); - - if (GDK_DRAWABLE_DESTROYED (drawable)) - return; - gc_private = (GdkGCPrivate*) gc; - font_private = (GdkFontPrivate*) font; - - if (font->type == GDK_FONT_FONT) - { - XFontStruct *xfont = (XFontStruct *) font_private->xfont; - XSetFont(GDK_DRAWABLE_XDISPLAY (drawable), gc_private->xgc, xfont->fid); - if ((xfont->min_byte1 == 0) && (xfont->max_byte1 == 0)) - { - XDrawString (GDK_DRAWABLE_XDISPLAY (drawable), GDK_DRAWABLE_XID (drawable), - gc_private->xgc, x, y, string, strlen (string)); - } - else - { - XDrawString16 (GDK_DRAWABLE_XDISPLAY (drawable), GDK_DRAWABLE_XID (drawable), - gc_private->xgc, x, y, (XChar2b *) string, - strlen (string) / 2); - } - } - else if (font->type == GDK_FONT_FONTSET) - { - XFontSet fontset = (XFontSet) font_private->xfont; - XmbDrawString (GDK_DRAWABLE_XDISPLAY (drawable), GDK_DRAWABLE_XID (drawable), - fontset, gc_private->xgc, x, y, string, strlen (string)); - } - else - g_error("undefined font type\n"); + gdk_draw_text (drawable, font, gc, x, y, string, _gdk_font_strlen (font, string)); } /* gdk_draw_text @@ -373,42 +287,12 @@ gdk_draw_text (GdkDrawable *drawable, const gchar *text, gint text_length) { - GdkFontPrivate *font_private; - GdkGCPrivate *gc_private; - g_return_if_fail (drawable != NULL); g_return_if_fail (font != NULL); g_return_if_fail (gc != NULL); g_return_if_fail (text != NULL); - if (GDK_DRAWABLE_DESTROYED (drawable)) - return; - gc_private = (GdkGCPrivate*) gc; - font_private = (GdkFontPrivate*) font; - - if (font->type == GDK_FONT_FONT) - { - XFontStruct *xfont = (XFontStruct *) font_private->xfont; - XSetFont(GDK_DRAWABLE_XDISPLAY (drawable), gc_private->xgc, xfont->fid); - if ((xfont->min_byte1 == 0) && (xfont->max_byte1 == 0)) - { - XDrawString (GDK_DRAWABLE_XDISPLAY (drawable), GDK_DRAWABLE_XID (drawable), - gc_private->xgc, x, y, text, text_length); - } - else - { - XDrawString16 (GDK_DRAWABLE_XDISPLAY (drawable), GDK_DRAWABLE_XID (drawable), - gc_private->xgc, x, y, (XChar2b *) text, text_length / 2); - } - } - else if (font->type == GDK_FONT_FONTSET) - { - XFontSet fontset = (XFontSet) font_private->xfont; - XmbDrawString (GDK_DRAWABLE_XDISPLAY (drawable), GDK_DRAWABLE_XID (drawable), - fontset, gc_private->xgc, x, y, text, text_length); - } - else - g_error("undefined font type\n"); + ((GdkDrawablePrivate *)drawable)->klass->draw_text (drawable, font, gc, x, y, text, text_length); } void @@ -420,88 +304,40 @@ gdk_draw_text_wc (GdkDrawable *drawable, const GdkWChar *text, gint text_length) { - GdkFontPrivate *font_private; - GdkGCPrivate *gc_private; - g_return_if_fail (drawable != NULL); g_return_if_fail (font != NULL); g_return_if_fail (gc != NULL); g_return_if_fail (text != NULL); - if (GDK_DRAWABLE_DESTROYED (drawable)) - return; - gc_private = (GdkGCPrivate*) gc; - font_private = (GdkFontPrivate*) font; - - if (font->type == GDK_FONT_FONT) - { - XFontStruct *xfont = (XFontStruct *) font_private->xfont; - gchar *text_8bit; - gint i; - XSetFont(GDK_DRAWABLE_XDISPLAY (drawable), gc_private->xgc, 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), - gc_private->xgc, 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) font_private->xfont, - gc_private->xgc, 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) font_private->xfont, - gc_private->xgc, x, y, text_wchar, text_length); - g_free (text_wchar); - } - } - else - g_error("undefined font type\n"); + ((GdkDrawablePrivate *)drawable)->klass->draw_text_wc (drawable, font, gc, x, y, text, text_length); } void -gdk_draw_pixmap (GdkDrawable *drawable, - GdkGC *gc, - GdkPixmap *src, - gint xsrc, - gint ysrc, - gint xdest, - gint ydest, - gint width, - gint height) +gdk_draw_drawable (GdkDrawable *drawable, + GdkGC *gc, + GdkDrawable *src, + gint xsrc, + gint ysrc, + gint xdest, + gint ydest, + gint width, + gint height) { - GdkGCPrivate *gc_private; - g_return_if_fail (drawable != NULL); g_return_if_fail (src != NULL); g_return_if_fail (gc != NULL); if (GDK_DRAWABLE_DESTROYED (drawable) || GDK_DRAWABLE_DESTROYED (src)) return; - gc_private = (GdkGCPrivate*) gc; if (width == -1) width = ((GdkDrawablePrivate *)src)->width; if (height == -1) height = ((GdkDrawablePrivate *)src)->height; - XCopyArea (GDK_DRAWABLE_XDISPLAY (drawable), - GDK_DRAWABLE_XID (src), - GDK_DRAWABLE_XID (drawable), - gc_private->xgc, - xsrc, ysrc, - width, height, - xdest, ydest); + ((GdkDrawablePrivate *)drawable)->klass->draw_drawable (drawable, gc, src, + xsrc, ysrc, xdest, ydest, + width, height); } void @@ -523,15 +359,14 @@ gdk_draw_image (GdkDrawable *drawable, image_private = (GdkImagePrivate*) image; - g_return_if_fail (image_private->image_put != NULL); - if (width == -1) width = image->width; if (height == -1) height = image->height; - (* image_private->image_put) (drawable, gc, image, xsrc, ysrc, - xdest, ydest, width, height); + + image_private->klass->image_put (image, drawable, gc, xsrc, ysrc, + xdest, ydest, width, height); } void @@ -540,22 +375,18 @@ gdk_draw_points (GdkDrawable *drawable, GdkPoint *points, gint npoints) { - GdkGCPrivate *gc_private; - g_return_if_fail (drawable != NULL); g_return_if_fail ((points != NULL) && (npoints > 0)); g_return_if_fail (gc != NULL); + g_return_if_fail (npoints >= 0); + + if (npoints == 0) + return; if (GDK_DRAWABLE_DESTROYED (drawable)) return; - gc_private = (GdkGCPrivate*) gc; - XDrawPoints (GDK_DRAWABLE_XDISPLAY (drawable), - GDK_DRAWABLE_XID (drawable), - gc_private->xgc, - (XPoint *) points, - npoints, - CoordModeOrigin); + ((GdkDrawablePrivate *)drawable)->klass->draw_points (drawable, gc, points, npoints); } void @@ -564,49 +395,37 @@ gdk_draw_segments (GdkDrawable *drawable, GdkSegment *segs, gint nsegs) { - GdkGCPrivate *gc_private; - - if (nsegs <= 0) - return; - g_return_if_fail (drawable != NULL); g_return_if_fail (segs != NULL); g_return_if_fail (gc != NULL); + g_return_if_fail (nsegs >= 0); + + if (nsegs == 0) + return; if (GDK_DRAWABLE_DESTROYED (drawable)) return; - gc_private = (GdkGCPrivate*) gc; - XDrawSegments (GDK_DRAWABLE_XDISPLAY (drawable), - GDK_DRAWABLE_XID (drawable), - gc_private->xgc, - (XSegment *) segs, - nsegs); + ((GdkDrawablePrivate *)drawable)->klass->draw_segments (drawable, gc, segs, nsegs); } void gdk_draw_lines (GdkDrawable *drawable, - GdkGC *gc, - GdkPoint *points, - gint npoints) + GdkGC *gc, + GdkPoint *points, + gint npoints) { - GdkGCPrivate *gc_private; - - if (npoints <= 0) - return; g_return_if_fail (drawable != NULL); g_return_if_fail (points != NULL); g_return_if_fail (gc != NULL); + g_return_if_fail (npoints >= 0); + + if (npoints == 0) + return; if (GDK_DRAWABLE_DESTROYED (drawable)) return; - gc_private = (GdkGCPrivate*) gc; - XDrawLines (GDK_DRAWABLE_XDISPLAY (drawable), - GDK_DRAWABLE_XID (drawable), - gc_private->xgc, - (XPoint *) points, - npoints, - CoordModeOrigin); + ((GdkDrawablePrivate *)drawable)->klass->draw_points (drawable, gc, points, npoints); } |