forked from AuroraMiddleware/gtk
e9b6bfcc01
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.
410 lines
11 KiB
C
410 lines
11 KiB
C
#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);
|
|
}
|