GdkGC finished; remaining tasks:

- GdkFont, when Pango is merged
 - GtkStyle
This commit is contained in:
Havoc Pennington
2000-05-18 22:27:57 +00:00
parent c917b4c5fb
commit bd1af45b6b
9 changed files with 305 additions and 200 deletions

View File

@@ -184,13 +184,10 @@ gdk_draw_point (GdkDrawable *drawable,
gint x,
gint y)
{
GdkGCPrivate *gc_private;
GdkPoint point;
g_return_if_fail (GDK_IS_DRAWABLE (drawable));
g_return_if_fail (gc != NULL);
gc_private = (GdkGCPrivate*) gc;
g_return_if_fail (GDK_IS_GC (gc));
point.x = x;
point.y = y;
@@ -206,13 +203,10 @@ gdk_draw_line (GdkDrawable *drawable,
gint x2,
gint y2)
{
GdkGCPrivate *gc_private;
GdkSegment segment;
g_return_if_fail (GDK_IS_DRAWABLE (drawable));
g_return_if_fail (gc != NULL);
gc_private = (GdkGCPrivate*) gc;
g_return_if_fail (GDK_IS_GC (gc));
segment.x1 = x1;
segment.y1 = y1;
@@ -231,7 +225,7 @@ gdk_draw_rectangle (GdkDrawable *drawable,
gint height)
{
g_return_if_fail (GDK_IS_DRAWABLE (drawable));
g_return_if_fail (gc != NULL);
g_return_if_fail (GDK_IS_GC (gc));
if (width < 0 || height < 0)
{
@@ -262,7 +256,7 @@ gdk_draw_arc (GdkDrawable *drawable,
gint angle2)
{
g_return_if_fail (GDK_IS_DRAWABLE (drawable));
g_return_if_fail (gc != NULL);
g_return_if_fail (GDK_IS_GC (gc));
if (width < 0 || height < 0)
{
@@ -289,7 +283,7 @@ gdk_draw_polygon (GdkDrawable *drawable,
gint npoints)
{
g_return_if_fail (GDK_IS_DRAWABLE (drawable));
g_return_if_fail (gc != NULL);
g_return_if_fail (GDK_IS_GC (gc));
GDK_DRAWABLE_GET_CLASS (drawable)->draw_polygon (drawable, gc, filled,
points, npoints);
@@ -329,7 +323,7 @@ gdk_draw_text (GdkDrawable *drawable,
{
g_return_if_fail (GDK_IS_DRAWABLE (drawable));
g_return_if_fail (font != NULL);
g_return_if_fail (gc != NULL);
g_return_if_fail (GDK_IS_GC (gc));
g_return_if_fail (text != NULL);
GDK_DRAWABLE_GET_CLASS (drawable)->draw_text (drawable, font, gc, x, y, text, text_length);
@@ -346,7 +340,7 @@ gdk_draw_text_wc (GdkDrawable *drawable,
{
g_return_if_fail (GDK_IS_DRAWABLE (drawable));
g_return_if_fail (font != NULL);
g_return_if_fail (gc != NULL);
g_return_if_fail (GDK_IS_GC (gc));
g_return_if_fail (text != NULL);
GDK_DRAWABLE_GET_CLASS (drawable)->draw_text_wc (drawable, font, gc, x, y, text, text_length);
@@ -365,7 +359,7 @@ gdk_draw_drawable (GdkDrawable *drawable,
{
g_return_if_fail (GDK_IS_DRAWABLE (drawable));
g_return_if_fail (src != NULL);
g_return_if_fail (gc != NULL);
g_return_if_fail (GDK_IS_GC (gc));
if (width < 0 || height < 0)
{
@@ -398,7 +392,7 @@ gdk_draw_image (GdkDrawable *drawable,
{
g_return_if_fail (GDK_IS_DRAWABLE (drawable));
g_return_if_fail (image != NULL);
g_return_if_fail (gc != NULL);
g_return_if_fail (GDK_IS_GC (gc));
if (width == -1)
width = image->width;
@@ -417,7 +411,7 @@ gdk_draw_points (GdkDrawable *drawable,
{
g_return_if_fail (GDK_IS_DRAWABLE (drawable));
g_return_if_fail ((points != NULL) && (npoints > 0));
g_return_if_fail (gc != NULL);
g_return_if_fail (GDK_IS_GC (gc));
g_return_if_fail (npoints >= 0);
if (npoints == 0)
@@ -438,7 +432,7 @@ gdk_draw_segments (GdkDrawable *drawable,
return;
g_return_if_fail (segs != NULL);
g_return_if_fail (gc != NULL);
g_return_if_fail (GDK_IS_GC (gc));
g_return_if_fail (nsegs >= 0);
GDK_DRAWABLE_GET_CLASS (drawable)->draw_segments (drawable, gc, segs, nsegs);
@@ -453,7 +447,7 @@ gdk_draw_lines (GdkDrawable *drawable,
g_return_if_fail (GDK_IS_DRAWABLE (drawable));
g_return_if_fail (points != NULL);
g_return_if_fail (gc != NULL);
g_return_if_fail (GDK_IS_GC (gc));
g_return_if_fail (npoints >= 0);
if (npoints == 0)

View File

@@ -29,21 +29,62 @@
#include "gdkgc.h"
#include "gdkprivate.h"
GdkGC*
gdk_gc_alloc (void)
static void gdk_gc_init (GdkGC *gc);
static void gdk_gc_class_init (GdkGCClass *klass);
static void gdk_gc_finalize (GObject *object);
static gpointer parent_class = NULL;
GType
gdk_gc_get_type (void)
{
GdkGCPrivate *private;
static GType object_type = 0;
private = g_new (GdkGCPrivate, 1);
private->ref_count = 1;
private->klass = NULL;
private->klass_data = NULL;
private->clip_x_origin = 0;
private->clip_y_origin = 0;
private->ts_x_origin = 0;
private->ts_y_origin = 0;
if (!object_type)
{
static const GTypeInfo object_info =
{
sizeof (GdkGCClass),
(GBaseInitFunc) NULL,
(GBaseFinalizeFunc) NULL,
(GClassInitFunc) gdk_gc_class_init,
NULL, /* class_finalize */
NULL, /* class_data */
sizeof (GdkGC),
0, /* n_preallocs */
(GInstanceInitFunc) gdk_gc_init,
};
object_type = g_type_register_static (G_TYPE_OBJECT,
"GdkGC",
&object_info);
}
return object_type;
}
return (GdkGC *)private;
static void
gdk_gc_init (GdkGC *gc)
{
}
static void
gdk_gc_class_init (GdkGCClass *klass)
{
GObjectClass *object_class = G_OBJECT_CLASS (klass);
parent_class = g_type_class_peek (G_TYPE_OBJECT);
object_class->finalize = gdk_gc_finalize;
}
static void
gdk_gc_finalize (GObject *object)
{
GdkGC *gc = GDK_GC (object);
G_OBJECT_CLASS (parent_class)->finalize (object);
}
GdkGC*
@@ -63,7 +104,6 @@ gdk_gc_new_with_values (GdkDrawable *drawable,
GdkGCValuesMask values_mask)
{
GdkGC *gc;
GdkGCPrivate *private;
g_return_val_if_fail (drawable != NULL, NULL);
@@ -73,16 +113,14 @@ gdk_gc_new_with_values (GdkDrawable *drawable,
gc = GDK_DRAWABLE_GET_CLASS (drawable)->create_gc (drawable,
values,
values_mask);
private = (GdkGCPrivate *)gc;
if (values_mask & GDK_GC_CLIP_X_ORIGIN)
private->clip_x_origin = values->clip_x_origin;
gc->clip_x_origin = values->clip_x_origin;
if (values_mask & GDK_GC_CLIP_Y_ORIGIN)
private->clip_y_origin = values->clip_y_origin;
gc->clip_y_origin = values->clip_y_origin;
if (values_mask & GDK_GC_TS_X_ORIGIN)
private->ts_x_origin = values->ts_x_origin;
gc->ts_x_origin = values->ts_x_origin;
if (values_mask & GDK_GC_TS_Y_ORIGIN)
private->ts_y_origin = values->ts_y_origin;
gc->ts_y_origin = values->ts_y_origin;
return gc;
}
@@ -90,10 +128,7 @@ gdk_gc_new_with_values (GdkDrawable *drawable,
GdkGC *
gdk_gc_ref (GdkGC *gc)
{
GdkGCPrivate *private = (GdkGCPrivate*) gc;
g_return_val_if_fail (gc != NULL, NULL);
private->ref_count += 1;
g_object_ref (G_OBJECT (gc));
return gc;
}
@@ -101,28 +136,17 @@ gdk_gc_ref (GdkGC *gc)
void
gdk_gc_unref (GdkGC *gc)
{
GdkGCPrivate *private = (GdkGCPrivate*) gc;
g_return_if_fail (gc != NULL);
g_return_if_fail (private->ref_count > 0);
private->ref_count--;
if (private->ref_count == 0)
{
private->klass->destroy (gc);
g_free (private);
}
g_object_unref (G_OBJECT (gc));
}
void
gdk_gc_get_values (GdkGC *gc,
GdkGCValues *values)
{
g_return_if_fail (gc != NULL);
g_return_if_fail (GDK_IS_GC (gc));
g_return_if_fail (values != NULL);
((GdkGCPrivate *)gc)->klass->get_values (gc, values);
GDK_GC_GET_CLASS (gc)->get_values (gc, values);
}
void
@@ -130,21 +154,19 @@ gdk_gc_set_values (GdkGC *gc,
GdkGCValues *values,
GdkGCValuesMask values_mask)
{
GdkGCPrivate *private = (GdkGCPrivate *)gc;
g_return_if_fail (gc != NULL);
g_return_if_fail (GDK_IS_GC (gc));
g_return_if_fail (values != NULL);
if (values_mask & GDK_GC_CLIP_X_ORIGIN)
private->clip_x_origin = values->clip_x_origin;
gc->clip_x_origin = values->clip_x_origin;
if (values_mask & GDK_GC_CLIP_Y_ORIGIN)
private->clip_y_origin = values->clip_y_origin;
gc->clip_y_origin = values->clip_y_origin;
if (values_mask & GDK_GC_TS_X_ORIGIN)
private->ts_x_origin = values->ts_x_origin;
gc->ts_x_origin = values->ts_x_origin;
if (values_mask & GDK_GC_TS_Y_ORIGIN)
private->ts_y_origin = values->ts_y_origin;
gc->ts_y_origin = values->ts_y_origin;
private->klass->set_values (gc, values, values_mask);
GDK_GC_GET_CLASS (gc)->set_values (gc, values, values_mask);
}
void
@@ -153,7 +175,7 @@ gdk_gc_set_foreground (GdkGC *gc,
{
GdkGCValues values;
g_return_if_fail (gc != NULL);
g_return_if_fail (GDK_IS_GC (gc));
g_return_if_fail (color != NULL);
values.foreground = *color;
@@ -166,7 +188,7 @@ gdk_gc_set_background (GdkGC *gc,
{
GdkGCValues values;
g_return_if_fail (gc != NULL);
g_return_if_fail (GDK_IS_GC (gc));
g_return_if_fail (color != NULL);
values.background = *color;
@@ -179,7 +201,7 @@ gdk_gc_set_font (GdkGC *gc,
{
GdkGCValues values;
g_return_if_fail (gc != NULL);
g_return_if_fail (GDK_IS_GC (gc));
g_return_if_fail (font != NULL);
values.font = font;
@@ -192,7 +214,7 @@ gdk_gc_set_function (GdkGC *gc,
{
GdkGCValues values;
g_return_if_fail (gc != NULL);
g_return_if_fail (GDK_IS_GC (gc));
values.function = function;
gdk_gc_set_values (gc, &values, GDK_GC_FUNCTION);
@@ -204,7 +226,7 @@ gdk_gc_set_fill (GdkGC *gc,
{
GdkGCValues values;
g_return_if_fail (gc != NULL);
g_return_if_fail (GDK_IS_GC (gc));
values.fill = fill;
gdk_gc_set_values (gc, &values, GDK_GC_FILL);
@@ -216,7 +238,7 @@ gdk_gc_set_tile (GdkGC *gc,
{
GdkGCValues values;
g_return_if_fail (gc != NULL);
g_return_if_fail (GDK_IS_GC (gc));
values.tile = tile;
gdk_gc_set_values (gc, &values, GDK_GC_TILE);
@@ -228,7 +250,7 @@ gdk_gc_set_stipple (GdkGC *gc,
{
GdkGCValues values;
g_return_if_fail (gc != NULL);
g_return_if_fail (GDK_IS_GC (gc));
values.stipple = stipple;
gdk_gc_set_values (gc, &values, GDK_GC_STIPPLE);
@@ -241,7 +263,7 @@ gdk_gc_set_ts_origin (GdkGC *gc,
{
GdkGCValues values;
g_return_if_fail (gc != NULL);
g_return_if_fail (GDK_IS_GC (gc));
values.ts_x_origin = x;
values.ts_y_origin = y;
@@ -257,7 +279,7 @@ gdk_gc_set_clip_origin (GdkGC *gc,
{
GdkGCValues values;
g_return_if_fail (gc != NULL);
g_return_if_fail (GDK_IS_GC (gc));
values.clip_x_origin = x;
values.clip_y_origin = y;
@@ -272,7 +294,7 @@ gdk_gc_set_clip_mask (GdkGC *gc,
{
GdkGCValues values;
g_return_if_fail (gc != NULL);
g_return_if_fail (GDK_IS_GC (gc));
values.clip_mask = mask;
gdk_gc_set_values (gc, &values, GDK_GC_CLIP_MASK);
@@ -285,7 +307,7 @@ gdk_gc_set_subwindow (GdkGC *gc,
{
GdkGCValues values;
g_return_if_fail (gc != NULL);
g_return_if_fail (GDK_IS_GC (gc));
values.subwindow_mode = mode;
gdk_gc_set_values (gc, &values, GDK_GC_SUBWINDOW);
@@ -297,7 +319,7 @@ gdk_gc_set_exposures (GdkGC *gc,
{
GdkGCValues values;
g_return_if_fail (gc != NULL);
g_return_if_fail (GDK_IS_GC (gc));
values.graphics_exposures = exposures;
gdk_gc_set_values (gc, &values, GDK_GC_EXPOSURES);
@@ -330,8 +352,8 @@ gdk_gc_set_dashes (GdkGC *gc,
gint8 dash_list[],
gint n)
{
g_return_if_fail (gc != NULL);
g_return_if_fail (GDK_IS_GC (gc));
g_return_if_fail (dash_list != NULL);
((GdkGCPrivate *)gc)->klass->set_dashes (gc, dash_offset, dash_list, n);
GDK_GC_GET_CLASS (gc)->set_dashes (gc, dash_offset, dash_list, n);
}

View File

@@ -150,14 +150,27 @@ struct _GdkGCValues
GdkJoinStyle join_style;
};
#define GDK_TYPE_GC (gdk_gc_get_type ())
#define GDK_GC(object) (G_TYPE_CHECK_INSTANCE_CAST ((object), GDK_TYPE_GC, GdkGC))
#define GDK_GC_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GDK_TYPE_GC, GdkGCClass))
#define GDK_IS_GC(object) (G_TYPE_CHECK_INSTANCE_TYPE ((object), GDK_TYPE_GC))
#define GDK_IS_GC_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GDK_TYPE_GC))
#define GDK_GC_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GDK_TYPE_GC, GdkGCClass))
struct _GdkGC
{
gint dummy_var;
GObject parent_instance;
gint clip_x_origin;
gint clip_y_origin;
gint ts_x_origin;
gint ts_y_origin;
};
struct _GdkGCClass
{
void (*destroy) (GdkGC *gc);
GObjectClass parent_class;
void (*get_values) (GdkGC *gc,
GdkGCValues *values);
void (*set_values) (GdkGC *gc,
@@ -170,14 +183,11 @@ struct _GdkGCClass
};
GType gdk_gc_get_type (void);
GdkGC *gdk_gc_new (GdkDrawable *drawable);
GdkGC *gdk_gc_alloc (void);
GdkGC *gdk_gc_new_with_values (GdkDrawable *drawable,
GdkGCValues *values,
GdkGCValuesMask values_mask);
void gdk_gc_init (GdkGC *gc,
GdkGCClass *klass);
GdkGC *gdk_gc_ref (GdkGC *gc);
void gdk_gc_unref (GdkGC *gc);
void gdk_gc_get_values (GdkGC *gc,

View File

@@ -51,7 +51,6 @@ extern "C" {
#define gdk_pixmap_lookup(xid) ((GdkPixmap*) gdk_xid_table_lookup (xid))
#define gdk_font_lookup(xid) ((GdkFont*) gdk_xid_table_lookup (xid))
typedef struct _GdkGCPrivate GdkGCPrivate;
typedef struct _GdkColorInfo GdkColorInfo;
typedef struct _GdkFontPrivate GdkFontPrivate;
typedef struct _GdkEventFilter GdkEventFilter;
@@ -63,18 +62,6 @@ struct _GdkFontPrivate
guint ref_count;
};
struct _GdkGCPrivate
{
guint ref_count;
GdkGCClass *klass;
gpointer klass_data;
gint clip_x_origin;
gint clip_y_origin;
gint ts_x_origin;
gint ts_y_origin;
};
typedef enum {
GDK_COLOR_WRITEABLE = 1 << 0
} GdkColorInfoFlags;

View File

@@ -823,10 +823,10 @@ gdk_window_get_offsets (GdkWindow *window,
#define OFFSET_GC(gc) \
gint x_offset, y_offset; \
gint old_clip_x = ((GdkGCPrivate *)gc)->clip_x_origin; \
gint old_clip_y = ((GdkGCPrivate *)gc)->clip_y_origin; \
gint old_ts_x = ((GdkGCPrivate *)gc)->ts_x_origin; \
gint old_ts_y = ((GdkGCPrivate *)gc)->ts_y_origin; \
gint old_clip_x = (gc)->clip_x_origin; \
gint old_clip_y = (gc)->clip_y_origin; \
gint old_ts_x = (gc)->ts_x_origin; \
gint old_ts_y = (gc)->ts_y_origin; \
gdk_window_get_offsets (drawable, &x_offset, &y_offset); \
if (x_offset != 0 || y_offset != 0) \
{ \

View File

@@ -24,6 +24,36 @@
* GTK+ at ftp://ftp.gtk.org/pub/gtk/.
*/
#include <config.h>
/* gcc -ansi -pedantic on GNU/Linux causes warnings and errors
* unless this is defined:
* warning: #warning "Files using this header must be compiled with _SVID_SOURCE or _XOPEN_SOURCE"
*/
#ifndef _XOPEN_SOURCE
# define _XOPEN_SOURCE 1
#endif
#include <stdlib.h>
#include <sys/types.h>
#if defined (HAVE_IPC_H) && defined (HAVE_SHM_H) && defined (HAVE_XSHM_H)
#define USE_SHM
#endif
#ifdef USE_SHM
#include <sys/ipc.h>
#include <sys/shm.h>
#endif /* USE_SHM */
#include <X11/Xlib.h>
#include <X11/Xutil.h>
#ifdef USE_SHM
#include <X11/extensions/XShm.h>
#endif /* USE_SHM */
#include "gdkprivate-x11.h"
#include "gdkdrawable-x11.h"
#include "gdkpixmap-x11.h"

View File

@@ -11,8 +11,7 @@ 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,
@@ -23,12 +22,74 @@ static void gdk_x11_gc_set_dashes (GdkGC *gc,
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
};
static void gdk_windowing_gc_init (GdkWindowingGC *windowing_gc);
static void gdk_windowing_gc_class_init (GdkWindowingGCClass *klass);
static void gdk_windowing_gc_finalize (GObject *object);
static gpointer parent_class = NULL;
GType
gdk_windowing_gc_get_type (void)
{
static GType object_type = 0;
if (!object_type)
{
static const GTypeInfo object_info =
{
sizeof (GdkWindowingGCClass),
(GBaseInitFunc) NULL,
(GBaseFinalizeFunc) NULL,
(GClassInitFunc) gdk_windowing_gc_class_init,
NULL, /* class_finalize */
NULL, /* class_data */
sizeof (GdkWindowingGC),
0, /* n_preallocs */
(GInstanceInitFunc) gdk_windowing_gc_init,
};
object_type = g_type_register_static (GDK_TYPE_GC,
"GdkWindowingGC",
&object_info);
}
return object_type;
}
static void
gdk_windowing_gc_init (GdkWindowingGC *windowing_gc)
{
}
static void
gdk_windowing_gc_class_init (GdkWindowingGCClass *klass)
{
GObjectClass *object_class = G_OBJECT_CLASS (klass);
GdkGCClass *gc_class = GDK_GC_CLASS (klass);
parent_class = g_type_class_peek (GDK_TYPE_GC);
object_class->finalize = gdk_windowing_gc_finalize;
gc_class->get_values = gdk_x11_gc_get_values;
gc_class->set_values = gdk_x11_gc_set_values;
gc_class->set_dashes = gdk_x11_gc_set_dashes;
}
static void
gdk_windowing_gc_finalize (GObject *object)
{
GdkWindowingGC *windowing_gc = GDK_WINDOWING_GC (object);
if (windowing_gc->clip_region)
gdk_region_destroy (windowing_gc->clip_region);
XFreeGC (GDK_GC_XDISPLAY (windowing_gc), GDK_GC_XGC (windowing_gc));
G_OBJECT_CLASS (parent_class)->finalize (object);
}
GdkGC *
_gdk_x11_gc_new (GdkDrawable *drawable,
@@ -36,8 +97,7 @@ _gdk_x11_gc_new (GdkDrawable *drawable,
GdkGCValuesMask values_mask)
{
GdkGC *gc;
GdkGCPrivate *private;
GdkGCXData *data;
GdkWindowingGC *private;
XGCValues xvalues;
unsigned long xvalues_mask;
@@ -47,27 +107,24 @@ _gdk_x11_gc_new (GdkDrawable *drawable,
*/
g_return_val_if_fail (GDK_IS_DRAWABLE_IMPL (drawable), NULL);
gc = gdk_gc_alloc ();
private = (GdkGCPrivate *)gc;
gc = GDK_GC (g_type_create_instance (gdk_windowing_gc_get_type ()));
private = GDK_WINDOWING_GC (gc);
private->klass = &gdk_x11_gc_class;
private->klass_data = data = g_new (GdkGCXData, 1);
data->dirty_mask = 0;
data->clip_region = NULL;
private->dirty_mask = 0;
private->clip_region = NULL;
GDK_GC_XDATA (gc)->xdisplay = GDK_DRAWABLE_IMPL (drawable)->xdisplay;
private->xdisplay = GDK_DRAWABLE_IMPL (drawable)->xdisplay;
if (values_mask & (GDK_GC_CLIP_X_ORIGIN | GDK_GC_CLIP_Y_ORIGIN))
{
values_mask &= ~(GDK_GC_CLIP_X_ORIGIN | GDK_GC_CLIP_Y_ORIGIN);
data->dirty_mask |= GDK_GC_DIRTY_CLIP;
private->dirty_mask |= GDK_GC_DIRTY_CLIP;
}
if (values_mask & (GDK_GC_TS_X_ORIGIN | GDK_GC_TS_Y_ORIGIN))
{
values_mask &= ~(GDK_GC_TS_X_ORIGIN | GDK_GC_TS_Y_ORIGIN);
data->dirty_mask |= GDK_GC_DIRTY_TS;
private->dirty_mask |= GDK_GC_DIRTY_TS;
}
xvalues.function = GXcopy;
@@ -79,62 +136,51 @@ _gdk_x11_gc_new (GdkDrawable *drawable,
gdk_x11_gc_values_to_xvalues (values, values_mask, &xvalues, &xvalues_mask);
data->xgc = XCreateGC (GDK_GC_XDISPLAY (gc),
GDK_DRAWABLE_IMPL (drawable)->xid,
xvalues_mask, &xvalues);
private->xgc = XCreateGC (GDK_GC_XDISPLAY (gc),
GDK_DRAWABLE_IMPL (drawable)->xid,
xvalues_mask, &xvalues);
return gc;
}
static void
gdk_x11_gc_destroy (GdkGC *gc)
{
if (GDK_GC_XDATA (gc)->clip_region)
gdk_region_destroy (GDK_GC_XDATA (gc)->clip_region);
XFreeGC (GDK_GC_XDISPLAY (gc), GDK_GC_XGC (gc));
g_free (GDK_GC_XDATA (gc));
}
GC
_gdk_x11_gc_flush (GdkGC *gc)
{
GdkGCPrivate *private = (GdkGCPrivate *)gc;
GdkGCXData *data = GDK_GC_XDATA (gc);
GdkWindowingGC *private = GDK_WINDOWING_GC (gc);
if (data->dirty_mask & GDK_GC_DIRTY_CLIP)
if (private->dirty_mask & GDK_GC_DIRTY_CLIP)
{
if (!data->clip_region)
if (!private->clip_region)
XSetClipOrigin (GDK_GC_XDISPLAY (gc), GDK_GC_XGC (gc),
private->clip_x_origin, private->clip_y_origin);
gc->clip_x_origin, gc->clip_y_origin);
else
{
XRectangle *rectangles = g_new (XRectangle, data->clip_region->numRects);
GdkRegionBox *boxes = data->clip_region->rects;
XRectangle *rectangles = g_new (XRectangle, private->clip_region->numRects);
GdkRegionBox *boxes = private->clip_region->rects;
int i;
for (i=0; i<data->clip_region->numRects; i++)
for (i=0; i<private->clip_region->numRects; i++)
{
rectangles[i].x = CLAMP (boxes[i].x1 + private->clip_x_origin, G_MINSHORT, G_MAXSHORT);
rectangles[i].y = CLAMP (boxes[i].y1 + private->clip_y_origin, G_MINSHORT, G_MAXSHORT);
rectangles[i].width = CLAMP (boxes[i].x2 + private->clip_x_origin, G_MINSHORT, G_MAXSHORT) - rectangles[i].x;
rectangles[i].height = CLAMP (boxes[i].y2 + private->clip_y_origin, G_MINSHORT, G_MAXSHORT) - rectangles[i].y;
rectangles[i].x = CLAMP (boxes[i].x1 + gc->clip_x_origin, G_MINSHORT, G_MAXSHORT);
rectangles[i].y = CLAMP (boxes[i].y1 + gc->clip_y_origin, G_MINSHORT, G_MAXSHORT);
rectangles[i].width = CLAMP (boxes[i].x2 + gc->clip_x_origin, G_MINSHORT, G_MAXSHORT) - rectangles[i].x;
rectangles[i].height = CLAMP (boxes[i].y2 + gc->clip_y_origin, G_MINSHORT, G_MAXSHORT) - rectangles[i].y;
}
XSetClipRectangles(GDK_GC_XDISPLAY (gc), GDK_GC_XGC (gc), 0, 0, rectangles,
data->clip_region->numRects, YXBanded);
private->clip_region->numRects, YXBanded);
g_free (rectangles);
}
}
if (data->dirty_mask & GDK_GC_DIRTY_TS)
if (private->dirty_mask & GDK_GC_DIRTY_TS)
{
XSetTSOrigin (GDK_GC_XDISPLAY (gc), GDK_GC_XGC (gc),
private->ts_x_origin, private->ts_y_origin);
gc->ts_x_origin, gc->ts_y_origin);
}
data->dirty_mask = 0;
private->dirty_mask = 0;
return GDK_GC_XGC (gc);
}
@@ -287,32 +333,32 @@ gdk_x11_gc_set_values (GdkGC *gc,
GdkGCValues *values,
GdkGCValuesMask values_mask)
{
GdkGCXData *data;
GdkWindowingGC *windowing_gc;
XGCValues xvalues;
unsigned long xvalues_mask = 0;
g_return_if_fail (gc != NULL);
g_return_if_fail (GDK_IS_GC (gc));
data = GDK_GC_XDATA (gc);
windowing_gc = GDK_WINDOWING_GC (gc);
if (values_mask & (GDK_GC_CLIP_X_ORIGIN | GDK_GC_CLIP_Y_ORIGIN))
{
values_mask &= ~(GDK_GC_CLIP_X_ORIGIN | GDK_GC_CLIP_Y_ORIGIN);
data->dirty_mask |= GDK_GC_DIRTY_CLIP;
windowing_gc->dirty_mask |= GDK_GC_DIRTY_CLIP;
}
if (values_mask & (GDK_GC_TS_X_ORIGIN | GDK_GC_TS_Y_ORIGIN))
{
values_mask &= ~(GDK_GC_TS_X_ORIGIN | GDK_GC_TS_Y_ORIGIN);
data->dirty_mask |= GDK_GC_DIRTY_TS;
windowing_gc->dirty_mask |= GDK_GC_DIRTY_TS;
}
if (values_mask & GDK_GC_CLIP_MASK)
{
if (data->clip_region)
if (windowing_gc->clip_region)
{
gdk_region_destroy (data->clip_region);
data->clip_region = NULL;
gdk_region_destroy (windowing_gc->clip_region);
windowing_gc->clip_region = NULL;
}
}
@@ -330,7 +376,7 @@ gdk_x11_gc_set_dashes (GdkGC *gc,
gchar dash_list[],
gint n)
{
g_return_if_fail (gc != NULL);
g_return_if_fail (GDK_IS_GC (gc));
g_return_if_fail (dash_list != NULL);
XSetDashes (GDK_GC_XDISPLAY (gc), GDK_GC_XGC (gc),
@@ -552,64 +598,62 @@ void
gdk_gc_set_clip_rectangle (GdkGC *gc,
GdkRectangle *rectangle)
{
GdkGCPrivate *private = (GdkGCPrivate *)gc;
GdkGCXData *data;
GdkWindowingGC *windowing_gc;
g_return_if_fail (gc != NULL);
g_return_if_fail (GDK_IS_GC (gc));
data = GDK_GC_XDATA (gc);
windowing_gc = GDK_WINDOWING_GC (gc);
if (data->clip_region)
gdk_region_destroy (data->clip_region);
if (windowing_gc->clip_region)
gdk_region_destroy (windowing_gc->clip_region);
if (rectangle)
data->clip_region = gdk_region_rectangle (rectangle);
windowing_gc->clip_region = gdk_region_rectangle (rectangle);
else
{
data->clip_region = NULL;
windowing_gc->clip_region = NULL;
XSetClipMask (GDK_GC_XDISPLAY (gc), GDK_GC_XGC (gc), None);
}
private->clip_x_origin = 0;
private->clip_y_origin = 0;
gc->clip_x_origin = 0;
gc->clip_y_origin = 0;
data->dirty_mask |= GDK_GC_DIRTY_CLIP;
windowing_gc->dirty_mask |= GDK_GC_DIRTY_CLIP;
}
void
gdk_gc_set_clip_region (GdkGC *gc,
GdkRegion *region)
{
GdkGCPrivate *private = (GdkGCPrivate *)gc;
GdkGCXData *data;
GdkWindowingGC *windowing_gc;
g_return_if_fail (gc != NULL);
g_return_if_fail (GDK_IS_GC (gc));
data = GDK_GC_XDATA (gc);
windowing_gc = GDK_WINDOWING_GC (gc);
if (data->clip_region)
gdk_region_destroy (data->clip_region);
if (windowing_gc->clip_region)
gdk_region_destroy (windowing_gc->clip_region);
if (region)
data->clip_region = gdk_region_copy (region);
windowing_gc->clip_region = gdk_region_copy (region);
else
{
data->clip_region = NULL;
windowing_gc->clip_region = NULL;
XSetClipMask (GDK_GC_XDISPLAY (gc), GDK_GC_XGC (gc), None);
}
private->clip_x_origin = 0;
private->clip_y_origin = 0;
gc->clip_x_origin = 0;
gc->clip_y_origin = 0;
data->dirty_mask |= GDK_GC_DIRTY_CLIP;
windowing_gc->dirty_mask |= GDK_GC_DIRTY_CLIP;
}
void
gdk_gc_copy (GdkGC *dst_gc, GdkGC *src_gc)
{
g_return_if_fail (dst_gc != NULL);
g_return_if_fail (src_gc != NULL);
g_return_if_fail (GDK_IS_WINDOWING_GC (dst_gc));
g_return_if_fail (GDK_IS_WINDOWING_GC (src_gc));
XCopyGC (GDK_GC_XDISPLAY (src_gc), GDK_GC_XGC (src_gc), ~((~1) << GCLastBit),
GDK_GC_XGC (dst_gc));

View File

@@ -61,7 +61,7 @@
static GList *image_list = NULL;
static gpointer parent_class = NULL;
static void gdk_image_destroy (GdkImage *image);
static void gdk_x11_image_destroy (GdkImage *image);
static void gdk_image_init (GdkImage *image);
static void gdk_image_class_init (GdkImageClass *klass);
static void gdk_image_finalize (GObject *object);
@@ -118,7 +118,7 @@ gdk_image_finalize (GObject *object)
{
GdkImage *image = GDK_IMAGE (object);
gdk_image_destroy (image);
gdk_x11_image_destroy (image);
G_OBJECT_CLASS (parent_class)->finalize (object);
}
@@ -132,7 +132,7 @@ gdk_image_exit (void)
while (image_list)
{
image = image_list->data;
gdk_image_destroy (image);
gdk_x11_image_destroy (image);
}
}
@@ -439,7 +439,7 @@ gdk_image_put_pixel (GdkImage *image,
}
static void
gdk_image_destroy (GdkImage *image)
gdk_x11_image_destroy (GdkImage *image)
{
GdkImagePrivateData *private;
#ifdef USE_SHM

View File

@@ -47,17 +47,6 @@ typedef struct _GdkVisualPrivate GdkVisualPrivate;
typedef struct _GdkICPrivate GdkICPrivate;
#endif /* USE_XIM */
#define GDK_WINDOW_XDATA(win) ((GdkWindowXData *)(((GdkDrawablePrivate*)(win))->klass_data))
#define GDK_GC_XDATA(gc) ((GdkGCXData *)(((GdkGCPrivate*)(gc))->klass_data))
struct _GdkGCXData
{
GC xgc;
Display *xdisplay;
GdkRegion *clip_region;
guint dirty_mask;
};
struct _GdkCursorPrivate
{
GdkCursor cursor;
@@ -112,6 +101,35 @@ struct _GdkICPrivate
#endif /* USE_XIM */
typedef struct _GdkWindowingGC GdkWindowingGC;
typedef struct _GdkWindowingGCClass GdkWindowingGCClass;
#define GDK_TYPE_WINDOWING_GC (gdk_windowing_gc_get_type ())
#define GDK_WINDOWING_GC(object) (G_TYPE_CHECK_INSTANCE_CAST ((object), GDK_TYPE_WINDOWING_GC, GdkWindowingGC))
#define GDK_WINDOWING_GC_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GDK_TYPE_WINDOWING_GC, GdkWindowingGCClass))
#define GDK_IS_WINDOWING_GC(object) (G_TYPE_CHECK_INSTANCE_TYPE ((object), GDK_TYPE_WINDOWING_GC))
#define GDK_IS_WINDOWING_GC_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GDK_TYPE_WINDOWING_GC))
#define GDK_WINDOWING_GC_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GDK_TYPE_WINDOWING_GC, GdkWindowingGCClass))
struct _GdkWindowingGC
{
GdkGC parent_instance;
GC xgc;
Display *xdisplay;
GdkRegion *clip_region;
guint dirty_mask;
};
struct _GdkWindowingGCClass
{
GdkGCClass parent_class;
};
GType gdk_windowing_gc_get_type (void);
#define GDK_ROOT_WINDOW() gdk_root_window
#define GDK_ROOT_PARENT() ((GdkWindow *)gdk_parent_root)
#define GDK_DISPLAY() gdk_display
@@ -123,15 +141,15 @@ struct _GdkICPrivate
#define GDK_DRAWABLE_XID(win) (GDK_IS_WINDOW (win) ? GDK_WINDOW_XID (win) : GDK_PIXMAP_XID (win))
#define GDK_IMAGE_XDISPLAY(image) (((GdkImagePrivateData*) GDK_IMAGE (image)->windowing_data)->xdisplay)
#define GDK_IMAGE_XIMAGE(image) (((GdkImagePrivateData*) GDK_IMAGE (image)->windowing_data)->ximage)
#define GDK_GC_XDISPLAY(gc) (GDK_GC_XDATA(gc)->xdisplay)
#define GDK_GC_XDISPLAY(gc) (GDK_WINDOWING_GC(gc)->xdisplay)
#define GDK_COLORMAP_XDISPLAY(cmap) (((GdkColormapPrivateData *)GDK_COLORMAP (cmap)->windowing_data)->xdisplay)
#define GDK_COLORMAP_XCOLORMAP(cmap) (((GdkColormapPrivateData *)GDK_COLORMAP (cmap)->windowing_data)->xcolormap)
#define GDK_VISUAL_XVISUAL(vis) (((GdkVisualPrivate*) vis)->xvisual)
#define GDK_FONT_XDISPLAY(font) (((GdkFontPrivate*) font)->xdisplay)
#define GDK_FONT_XFONT(font) (((GdkFontPrivateX *)font)->xfont)
#define GDK_GC_XGC(gc) (GDK_GC_XDATA(gc)->xgc)
#define GDK_GC_GET_XGC(gc) (GDK_GC_XDATA(gc)->dirty_mask ? _gdk_x11_gc_flush (gc) : GDK_GC_XGC (gc))
#define GDK_GC_XGC(gc) (GDK_WINDOWING_GC(gc)->xgc)
#define GDK_GC_GET_XGC(gc) (GDK_WINDOWING_GC(gc)->dirty_mask ? _gdk_x11_gc_flush (gc) : GDK_GC_XGC (gc))
#define GDK_WINDOW_XWINDOW GDK_WINDOW_XID
extern Display *gdk_display;