/* HexChat
* Copyright (C) 1998-2010 Peter Zelezny.
* Copyright (C) 2009-2013 Berke Viktor.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
*/
#ifndef HEXCHAT_XTEXT_H
#define HEXCHAT_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_HIDDEN '\010'
#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;
GList *search_found; /* list of textentries where search found strings */
gchar *search_text; /* desired text to search for */
gchar *search_nee; /* prepared needle to look in haystack for */
gint search_lnee; /* its length */
gtk_xtext_search_flags search_flags; /* match, bwd, highlight */
GList *cursearch; /* GList whose 'data' pts to current textentry */
GList *curmark; /* current item in ent->marks */
GRegex *search_re; /* Compiled regular expression */
textentry *hintsearch; /* textentry found for last search */
} 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 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 */
/* current text states */
unsigned int bold:1;
unsigned int underline:1;
unsigned int italics:1;
unsigned int hidden:1;
/* text parsing states */
unsigned int parsing_backcolor:1;
unsigned int parsing_color:1;
unsigned int backcolor:1;
/* various state information */
unsigned int moving_separator:1;
unsigned int word_or_line_select:1;
unsigned int button_down:1;
unsigned int hilighting: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 mark_stamp:1; /* Cut&Paste with stamps? */
unsigned int force_stamp:1; /* force redrawing it */
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 force_render:1;
unsigned int shm:1;
unsigned int color_paste:1; /* CTRL was pressed when selection finished */
/* settings/prefs */
unsigned int auto_indent:1;
unsigned int thinline:1;
unsigned int transparent:1;
unsigned int shaded:1;
unsigned int marker:1;
unsigned int separator:1;
unsigned int wordwrap:1;
unsigned int overdraw:1;
unsigned int ignore_hidden:1; /* rawlog uses this */
};
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,
unsigned char *right_text, int right_len,
time_t stamp);
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, int lines);
void gtk_xtext_save (GtkXText * xtext, int fh);
void gtk_xtext_refresh (GtkXText * xtext, int do_trans);
int gtk_xtext_lastlog (xtext_buffer *out, xtext_buffer *search_area);
textentry *gtk_xtext_search (GtkXText * xtext, const gchar *text, gtk_xtext_search_flags flags, GError **err);
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 *));
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);
void gtk_xtext_copy_selection (GtkXText *xtext);
GType gtk_xtext_get_type (void);
#endif