pidgin/purple-plugin-pack

intelligent detection of which backend gtkspell is using. If there are some versions that are using enchant and not setting Libs.private, I'm not exactly interested, unless you can fix it _WITHOUT_ forcing the user to know and then tell configure
#ifndef __XTEXT_H__
#define __XTEXT_H__
#include <gtk/gtkadjustment.h>
#ifdef USE_XFT
#include <X11/Xft/Xft.h>
#endif
#ifdef USE_SHM
#include <X11/Xlib.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <X11/extensions/XShm.h>
#endif
#define GTK_TYPE_XTEXT (gtk_xtext_get_type ())
#define GTK_XTEXT(object) (G_TYPE_CHECK_INSTANCE_CAST ((object), GTK_TYPE_XTEXT, GtkXText))
#define GTK_XTEXT_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GTK_TYPE_XTEXT, GtkXTextClass))
#define GTK_IS_XTEXT(object) (G_TYPE_CHECK_INSTANCE_TYPE ((object), GTK_TYPE_XTEXT))
#define GTK_IS_XTEXT_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GTK_TYPE_XTEXT))
#define GTK_XTEXT_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), GTK_TYPE_XTEXT, GtkXTextClass))
#define ATTR_BOLD '\002'
#define ATTR_COLOR '\003'
#define ATTR_BLINK '\006'
#define ATTR_BEEP '\007'
#define ATTR_ITALICS2 '\011'
#define ATTR_RESET '\017'
#define ATTR_REVERSE '\026'
#define ATTR_ITALICS '\035'
#define ATTR_UNDERLINE '\037'
/* these match palette.h */
#define XTEXT_MIRC_COLS 32
#define XTEXT_COLS 37 /* 32 plus 5 for extra stuff below */
#define XTEXT_MARK_FG 32 /* for marking text */
#define XTEXT_MARK_BG 33
#define XTEXT_FG 34
#define XTEXT_BG 35
#define XTEXT_MARKER 36 /* for marker line */
typedef struct _GtkXText GtkXText;
typedef struct _GtkXTextClass GtkXTextClass;
typedef struct textentry textentry;
typedef struct {
GtkXText *xtext; /* attached to this widget */
gfloat old_value; /* last known adj->value */
textentry *text_first;
textentry *text_last;
guint16 grid_offset[256];
textentry *last_ent_start; /* this basically describes the last rendered */
textentry *last_ent_end; /* selection. */
int last_offset_start;
int last_offset_end;
int last_pixel_pos;
int pagetop_line;
int pagetop_subline;
textentry *pagetop_ent; /* what's at xtext->adj->value */
int num_lines;
int indent; /* position of separator (pixels) from left */
textentry *marker_pos;
int window_width; /* window size when last rendered. */
int window_height;
unsigned int time_stamp:1;
unsigned int scrollbar_down:1;
unsigned int needs_recalc:1;
unsigned int grid_dirty:1;
unsigned int marker_seen:1;
unsigned int reset_marker_pos:1;
} xtext_buffer;
struct _GtkXText
{
GtkWidget widget;
xtext_buffer *buffer;
xtext_buffer *orig_buffer;
xtext_buffer *selection_buffer;
#ifdef USE_SHM
XShmSegmentInfo shminfo;
#endif
GtkAdjustment *adj;
GdkPixmap *pixmap; /* 0 = use palette[19] */
GdkDrawable *draw_buf; /* points to ->window */
GdkCursor *hand_cursor;
GdkCursor *resize_cursor;
int pixel_offset; /* amount of pixels the top line is chopped by */
int last_win_x;
int last_win_y;
int last_win_h;
int last_win_w;
int tint_red;
int tint_green;
int tint_blue;
GdkGC *bgc; /* backing pixmap */
GdkGC *fgc; /* text foreground color */
GdkGC *light_gc; /* sep bar */
GdkGC *dark_gc;
GdkGC *thin_gc;
GdkGC *marker_gc;
gulong palette[XTEXT_COLS];
gint io_tag; /* for delayed refresh events */
gint add_io_tag; /* "" when adding new text */
gint scroll_tag; /* marking-scroll timeout */
gulong vc_signal_tag; /* signal handler for "value_changed" adj */
int select_start_adj; /* the adj->value when the selection started */
int select_start_x;
int select_start_y;
int select_end_x;
int select_end_y;
int max_lines;
int col_fore;
int col_back;
int depth; /* gdk window depth */
char num[8]; /* for parsing mirc color */
int nc; /* offset into xtext->num */
textentry *hilight_ent;
int hilight_start;
int hilight_end;
guint16 fontwidth[128]; /* each char's width, only the ASCII ones */
#ifdef USE_XFT
XftColor color[XTEXT_COLS];
XftColor *xft_fg;
XftColor *xft_bg; /* both point into color[20] */
XftDraw *xftdraw;
XftFont *font;
XftFont *ifont; /* italics */
#else
struct pangofont
{
PangoFontDescription *font;
PangoFontDescription *ifont; /* italics */
int ascent;
int descent;
} *font, pango_font;
PangoLayout *layout;
#endif
int fontsize;
int space_width; /* width (pixels) of the space " " character */
int stamp_width; /* width of "[88:88:88]" */
int max_auto_indent;
unsigned char scratch_buffer[4096];
void (*error_function) (int type);
int (*urlcheck_function) (GtkWidget * xtext, char *word, int len);
int jump_out_offset; /* point at which to stop rendering */
int jump_in_offset; /* "" start rendering */
int ts_x; /* ts origin for ->bgc GC */
int ts_y;
int clip_x; /* clipping (x directions) */
int clip_x2; /* from x to x2 */
int clip_y; /* clipping (y directions) */
int clip_y2; /* from y to y2 */
unsigned int auto_indent:1;
unsigned int moving_separator:1;
unsigned int word_or_line_select:1;
unsigned int color_paste:1;
unsigned int thinline:1;
unsigned int parsing_backcolor:1;
unsigned int parsing_color:1;
unsigned int backcolor:1;
unsigned int button_down:1;
unsigned int hilighting:1;
unsigned int bold:1;
unsigned int underline:1;
unsigned int italics:1;
unsigned int transparent:1;
unsigned int marker:1;
unsigned int separator:1;
unsigned int shaded:1;
unsigned int wordwrap:1;
unsigned int dont_render:1;
unsigned int dont_render2:1;
unsigned int cursor_hand:1;
unsigned int cursor_resize:1;
unsigned int skip_border_fills:1;
unsigned int skip_stamp:1;
unsigned int render_hilights_only:1;
unsigned int in_hilight:1;
unsigned int un_hilight:1;
unsigned int recycle:1;
unsigned int avoid_trans:1;
unsigned int overdraw:1;
unsigned int indent_changed:1;
unsigned int shm:1;
};
struct _GtkXTextClass
{
GtkWidgetClass parent_class;
void (*word_click) (GtkXText * xtext, char *word, GdkEventButton * event);
};
GtkWidget *gtk_xtext_new (GdkColor palette[], int separator);
void gtk_xtext_append (xtext_buffer *buf, unsigned char *text, int len);
void gtk_xtext_append_indent (xtext_buffer *buf,
unsigned char *left_text, int left_len, int left_color,
unsigned char *right_text, int right_len, int right_color);
int gtk_xtext_set_font (GtkXText *xtext, char *name);
void gtk_xtext_set_background (GtkXText * xtext, GdkPixmap * pixmap, gboolean trans);
void gtk_xtext_set_palette (GtkXText * xtext, GdkColor palette[]);
void gtk_xtext_clear (xtext_buffer *buf);
void gtk_xtext_save (GtkXText * xtext, int fh);
void gtk_xtext_refresh (GtkXText * xtext, int do_trans);
textentry *gtk_xtext_search (GtkXText * xtext, const gchar *text, textentry *start, gboolean case_match, gboolean backward);
void gtk_xtext_reset_marker_pos (GtkXText *xtext);
void gtk_xtext_check_marker_visibility(GtkXText *xtext);
gboolean gtk_xtext_is_empty (xtext_buffer *buf);
typedef void (*GtkXTextForeach) (GtkXText *xtext, unsigned char *text, void *data);
void gtk_xtext_foreach (xtext_buffer *buf, GtkXTextForeach func, void *data);
void gtk_xtext_set_error_function (GtkXText *xtext, void (*error_function) (int));
void gtk_xtext_set_indent (GtkXText *xtext, gboolean indent);
void gtk_xtext_set_max_indent (GtkXText *xtext, int max_auto_indent);
void gtk_xtext_set_max_lines (GtkXText *xtext, int max_lines);
void gtk_xtext_set_show_marker (GtkXText *xtext, gboolean show_marker);
void gtk_xtext_set_show_separator (GtkXText *xtext, gboolean show_separator);
void gtk_xtext_set_thin_separator (GtkXText *xtext, gboolean thin_separator);
void gtk_xtext_set_time_stamp (xtext_buffer *buf, gboolean timestamp);
void gtk_xtext_set_tint (GtkXText *xtext, int tint_red, int tint_green, int tint_blue);
void gtk_xtext_set_urlcheck_function (GtkXText *xtext, int (*urlcheck_function) (GtkWidget *, char *, int));
void gtk_xtext_set_wordwrap (GtkXText *xtext, gboolean word_wrap);
xtext_buffer *gtk_xtext_buffer_new (GtkXText *xtext);
void gtk_xtext_buffer_free (xtext_buffer *buf);
void gtk_xtext_buffer_show (GtkXText *xtext, xtext_buffer *buf, int render);
GtkType gtk_xtext_get_type (void);
/**
* Set the foreground color for the widget.
*/
void gtk_xtext_set_foreground_color (GtkXText *xtext, GdkColor *color);
/**
* Set the background color for the widget.
*/
void gtk_xtext_set_background_color (GtkXText *xtext, GdkColor *color);
#endif