diff --git a/gdk/gdkdraw.c b/gdk/gdkdraw.c index 7885ab5211..3305e49ca8 100644 --- a/gdk/gdkdraw.c +++ b/gdk/gdkdraw.c @@ -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) diff --git a/gdk/gdkgc.c b/gdk/gdkgc.c index a5f77884ec..5e4b963242 100644 --- a/gdk/gdkgc.c +++ b/gdk/gdkgc.c @@ -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); } diff --git a/gdk/gdkgc.h b/gdk/gdkgc.h index 072ddfe74e..86dfa53148 100644 --- a/gdk/gdkgc.h +++ b/gdk/gdkgc.h @@ -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, diff --git a/gdk/gdkprivate.h b/gdk/gdkprivate.h index 8fad56cbfc..3df7bbbf6d 100644 --- a/gdk/gdkprivate.h +++ b/gdk/gdkprivate.h @@ -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; diff --git a/gdk/gdkwindow.c b/gdk/gdkwindow.c index 3720f53cc4..13896dd0b8 100644 --- a/gdk/gdkwindow.c +++ b/gdk/gdkwindow.c @@ -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) \ { \ diff --git a/gdk/x11/gdkdrawable-x11.c b/gdk/x11/gdkdrawable-x11.c index d542bc0013..cb7a31edcf 100644 --- a/gdk/x11/gdkdrawable-x11.c +++ b/gdk/x11/gdkdrawable-x11.c @@ -24,6 +24,36 @@ * GTK+ at ftp://ftp.gtk.org/pub/gtk/. */ + +#include + +/* 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 +#include + +#if defined (HAVE_IPC_H) && defined (HAVE_SHM_H) && defined (HAVE_XSHM_H) +#define USE_SHM +#endif + +#ifdef USE_SHM +#include +#include +#endif /* USE_SHM */ + +#include +#include + +#ifdef USE_SHM +#include +#endif /* USE_SHM */ + #include "gdkprivate-x11.h" #include "gdkdrawable-x11.h" #include "gdkpixmap-x11.h" diff --git a/gdk/x11/gdkgc-x11.c b/gdk/x11/gdkgc-x11.c index 5da2cbf901..b0ed62d47a 100644 --- a/gdk/x11/gdkgc-x11.c +++ b/gdk/x11/gdkgc-x11.c @@ -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; iclip_region->numRects; i++) + for (i=0; iclip_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)); diff --git a/gdk/x11/gdkimage-x11.c b/gdk/x11/gdkimage-x11.c index 9e64332586..7bb42f4032 100644 --- a/gdk/x11/gdkimage-x11.c +++ b/gdk/x11/gdkimage-x11.c @@ -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 diff --git a/gdk/x11/gdkx.h b/gdk/x11/gdkx.h index c41bd261c7..a0ec02d7a1 100644 --- a/gdk/x11/gdkx.h +++ b/gdk/x11/gdkx.h @@ -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;