Mercurial > pidgin
changeset 12:76ab3403bf02
[gaim-migrate @ 21]
These shouldn't be in here
Also, patched up gtkhtml.c and gtkhtml.h to support display of truetype fonts.
committer: Tailor Script <tailor@pidgin.im>
author | Rob Flynn <gaim@robflynn.com> |
---|---|
date | Thu, 23 Mar 2000 07:51:13 +0000 |
parents | aaf703e07212 |
children | 42caca2f964f |
files | src/gtkhtml.c |
diffstat | 1 files changed, 2761 insertions(+), 2148 deletions(-) [+] |
line wrap: on
line diff
--- a/src/gtkhtml.c Thu Mar 23 07:04:38 2000 +0000 +++ b/src/gtkhtml.c Thu Mar 23 07:51:13 2000 +0000 @@ -1,3 +1,4 @@ + /* * gaim * @@ -26,10 +27,12 @@ #include <gdk/gdkprivate.h> #include <gdk/gdkx.h> #include <gdk/gdkkeysyms.h> + +#ifndef _WIN32 #include <X11/Xlib.h> #include <X11/Xatom.h> - -#include "gaim.h" +#endif + #include "gtkhtml.h" #define MAX_SIZE 7 @@ -39,291 +42,273 @@ #define SCROLL_TIME 100 #define SCROLL_PIXELS 5 #define KEY_SCROLL_PIXELS 10 +#define BUF_LONG 2048 int font_sizes[] = { 80, 100, 120, 140, 200, 300, 400 }; +/* GdkFont *fixed_font[] = { NULL, NULL, NULL, NULL, NULL, NULL, NULL }; GdkFont *fixed_bold_font[] = { NULL, NULL, NULL, NULL, NULL, NULL, NULL }; GdkFont *fixed_italic_font[] = { NULL, NULL, NULL, NULL, NULL, NULL, NULL }; -GdkFont *fixed_bold_italic_font[] = { NULL, NULL, NULL, NULL, NULL, NULL, NULL }; +GdkFont *fixed_bold_italic_font[] = + { NULL, NULL, NULL, NULL, NULL, NULL, NULL }; GdkFont *prop_font[] = { NULL, NULL, NULL, NULL, NULL, NULL, NULL }; GdkFont *prop_bold_font[] = { NULL, NULL, NULL, NULL, NULL, NULL, NULL }; GdkFont *prop_italic_font[] = { NULL, NULL, NULL, NULL, NULL, NULL, NULL }; GdkFont *prop_bold_italic_font[] = { NULL, NULL, NULL, NULL, NULL, NULL, NULL }; - -struct font_state { - int size; - int owncolor; - int ownbg; - GdkColor *color; - GdkColor *bgcol; - struct font_state *next; +*/ + +GData * font_cache; +static gboolean cache_init = FALSE; + +struct font_state +{ + int size; + int owncolor; + int ownbg; + gchar font[1024]; + GdkColor *color; + GdkColor *bgcol; + struct font_state *next; }; struct font_state *push_state(struct font_state *current) { - struct font_state *tmp; - tmp = (struct font_state *)g_new0(struct font_state, 1); + struct font_state *tmp; + tmp = (struct font_state *) g_new0(struct font_state, 1); tmp->next = current; tmp->color = current->color; tmp->bgcol = current->bgcol; tmp->size = current->size; tmp->owncolor = 0; tmp->ownbg = 0; + strcpy( tmp->font, current->font ); return tmp; } -enum { - ARG_0, - ARG_HADJUSTMENT, - ARG_VADJUSTMENT, +enum +{ + ARG_0, + ARG_HADJUSTMENT, + ARG_VADJUSTMENT, }; -enum { - TARGET_STRING, - TARGET_TEXT, - TARGET_COMPOUND_TEXT +enum +{ + TARGET_STRING, + TARGET_TEXT, + TARGET_COMPOUND_TEXT }; -static void gtk_html_class_init (GtkHtmlClass *klass); -static void gtk_html_set_arg (GtkObject *object, - GtkArg *arg, - guint arg_id); -static void gtk_html_get_arg (GtkObject *object, - GtkArg *arg, - guint arg_id); -static void gtk_html_init (GtkHtml *html); -static void gtk_html_destroy (GtkObject *object); -static void gtk_html_finalize (GtkObject *object); -static void gtk_html_realize (GtkWidget *widget); -static void gtk_html_unrealize (GtkWidget *widget); -static void gtk_html_style_set (GtkWidget *widget, - GtkStyle *previous_style); -static void gtk_html_draw_focus (GtkWidget *widget); -static void gtk_html_size_request (GtkWidget *widget, - GtkRequisition *requisition); -static void gtk_html_size_allocate (GtkWidget *widget, - GtkAllocation *allocation); -static void gtk_html_adjustment (GtkAdjustment *adjustment, - GtkHtml *html); -static void gtk_html_disconnect (GtkAdjustment *adjustment, - GtkHtml *html); -static void gtk_html_add_seperator (GtkHtml *html); -static void gtk_html_add_pixmap (GtkHtml *html, - GdkPixmap *pm, - gint fit); -static void gtk_html_add_text (GtkHtml *html, - GdkFont *font, - GdkColor *fore, - GdkColor *back, - gchar *chars, - gint length, - gint uline, - gint strike, - gchar *url); -static void gtk_html_draw_bit (GtkHtml *html, - GtkHtmlBit *htmlbit, - gint redraw); -static void gtk_html_selection_get (GtkWidget *widget, - GtkSelectionData *selection_data, - guint sel_info, - guint32 time); -static gint gtk_html_selection_clear (GtkWidget *widget, - GdkEventSelection *event); -static gint gtk_html_visibility_notify (GtkWidget *widget, - GdkEventVisibility *event); +static void gtk_html_class_init(GtkHtmlClass * klass); +static void gtk_html_set_arg(GtkObject * object, GtkArg * arg, guint arg_id); +static void gtk_html_get_arg(GtkObject * object, GtkArg * arg, guint arg_id); +static void gtk_html_init(GtkHtml * html); +static void gtk_html_destroy(GtkObject * object); +static void gtk_html_finalize(GtkObject * object); +static void gtk_html_realize(GtkWidget * widget); +static void gtk_html_unrealize(GtkWidget * widget); +static void gtk_html_style_set(GtkWidget * widget, GtkStyle * previous_style); +static void gtk_html_draw_focus(GtkWidget * widget); +static void gtk_html_size_request(GtkWidget * widget, + GtkRequisition * requisition); +static void gtk_html_size_allocate(GtkWidget * widget, + GtkAllocation * allocation); +static void gtk_html_adjustment(GtkAdjustment * adjustment, GtkHtml * html); +static void gtk_html_disconnect(GtkAdjustment * adjustment, GtkHtml * html); +static void gtk_html_add_seperator(GtkHtml * html); +static void gtk_html_add_pixmap(GtkHtml * html, GdkPixmap * pm, gint fit); +static void gtk_html_add_text(GtkHtml * html, + GdkFont * font, + GdkColor * fore, + GdkColor * back, + gchar * chars, + gint length, + gint uline, gint strike, gchar * url); +static void gtk_html_draw_bit(GtkHtml * html, + GtkHtmlBit * htmlbit, gint redraw); +static void gtk_html_selection_get(GtkWidget * widget, + GtkSelectionData * selection_data, + guint sel_info, guint32 time); +static gint gtk_html_selection_clear(GtkWidget * widget, + GdkEventSelection * event); +static gint gtk_html_visibility_notify(GtkWidget * widget, + GdkEventVisibility * event); /* Event handlers */ -static void gtk_html_draw (GtkWidget *widget, - GdkRectangle *area); -static gint gtk_html_expose (GtkWidget *widget, - GdkEventExpose *event); -static gint gtk_html_button_press (GtkWidget *widget, - GdkEventButton *event); -static gint gtk_html_button_release (GtkWidget *widget, - GdkEventButton *event); -static gint gtk_html_motion_notify (GtkWidget *widget, - GdkEventMotion *event); -static gint gtk_html_key_press (GtkWidget *widget, - GdkEventKey *event); -static gint gtk_html_leave_notify (GtkWidget *widget, - GdkEventCrossing *event); +static void gtk_html_draw(GtkWidget * widget, GdkRectangle * area); +static gint gtk_html_expose(GtkWidget * widget, GdkEventExpose * event); +static gint gtk_html_button_press(GtkWidget * widget, GdkEventButton * event); +static gint gtk_html_button_release(GtkWidget * widget, GdkEventButton * event); +static gint gtk_html_motion_notify(GtkWidget * widget, GdkEventMotion * event); +static gint gtk_html_key_press(GtkWidget * widget, GdkEventKey * event); +static gint gtk_html_leave_notify(GtkWidget * widget, GdkEventCrossing * event); static gint gtk_html_tooltip_timeout(gpointer data); -static void clear_area (GtkHtml *html, - GdkRectangle *area); -static void expose_html (GtkHtml *html, - GdkRectangle *area, - gboolean cursor); -static void scroll_down (GtkHtml *html, - gint diff0); -static void scroll_up (GtkHtml *html, - gint diff0); - -static void adjust_adj (GtkHtml *html, - GtkAdjustment *adj); -static void resize_html (GtkHtml *html); -static gint html_bit_is_onscreen (GtkHtml *html, GtkHtmlBit *hb); -static void draw_cursor (GtkHtml *html); -static void undraw_cursor (GtkHtml *html); +static void clear_area(GtkHtml * html, GdkRectangle * area); +static void expose_html(GtkHtml * html, GdkRectangle * area, gboolean cursor); +static void scroll_down(GtkHtml * html, gint diff0); +static void scroll_up(GtkHtml * html, gint diff0); + +static void adjust_adj(GtkHtml * html, GtkAdjustment * adj); +static void resize_html(GtkHtml * html); +static gint html_bit_is_onscreen(GtkHtml * html, GtkHtmlBit * hb); +static void draw_cursor(GtkHtml * html); +static void undraw_cursor(GtkHtml * html); static GtkWidgetClass *parent_class = NULL; GtkType gtk_html_get_type(void) { - static GtkType html_type = 0; - - if (!html_type) { - static const GtkTypeInfo html_info = { - "GtkHtml", - sizeof(GtkHtml), - sizeof(GtkHtmlClass), - (GtkClassInitFunc) gtk_html_class_init, - (GtkObjectInitFunc) gtk_html_init, - NULL, - NULL, - NULL, - }; - html_type = gtk_type_unique (GTK_TYPE_WIDGET, &html_info); - } - return html_type; + static GtkType html_type = 0; + + if (!html_type) + { + static const GtkTypeInfo html_info = { + "GtkHtml", + sizeof(GtkHtml), + sizeof(GtkHtmlClass), + (GtkClassInitFunc) gtk_html_class_init, + (GtkObjectInitFunc) gtk_html_init, + NULL, + NULL, + NULL, + }; + html_type = gtk_type_unique(GTK_TYPE_WIDGET, &html_info); + } + return html_type; } -static void gtk_html_class_init (GtkHtmlClass *class) +static void gtk_html_class_init(GtkHtmlClass * class) { - GtkObjectClass *object_class; - GtkWidgetClass *widget_class; - - object_class = (GtkObjectClass *) class; - widget_class = (GtkWidgetClass *) class; - parent_class = gtk_type_class (GTK_TYPE_WIDGET); - - - gtk_object_add_arg_type("GtkHtml::hadjustment", - GTK_TYPE_ADJUSTMENT, - GTK_ARG_READWRITE | GTK_ARG_CONSTRUCT, - ARG_HADJUSTMENT); - - gtk_object_add_arg_type("GtkHtml::vadjustment", - GTK_TYPE_ADJUSTMENT, - GTK_ARG_READWRITE | GTK_ARG_CONSTRUCT, - ARG_VADJUSTMENT); - - object_class->set_arg = gtk_html_set_arg; - object_class->get_arg = gtk_html_get_arg; - object_class->destroy = gtk_html_destroy; - object_class->finalize = gtk_html_finalize; - - widget_class->realize = gtk_html_realize; - widget_class->unrealize = gtk_html_unrealize; - widget_class->style_set = gtk_html_style_set; - widget_class->draw_focus = gtk_html_draw_focus; - widget_class->size_request = gtk_html_size_request; - widget_class->size_allocate = gtk_html_size_allocate; - widget_class->draw = gtk_html_draw; - widget_class->expose_event = gtk_html_expose; - widget_class->button_press_event = gtk_html_button_press; - widget_class->button_release_event = gtk_html_button_release; + GtkObjectClass *object_class; + GtkWidgetClass *widget_class; + + object_class = (GtkObjectClass *) class; + widget_class = (GtkWidgetClass *) class; + parent_class = gtk_type_class(GTK_TYPE_WIDGET); + + + gtk_object_add_arg_type("GtkHtml::hadjustment", + GTK_TYPE_ADJUSTMENT, + GTK_ARG_READWRITE | GTK_ARG_CONSTRUCT, + ARG_HADJUSTMENT); + + gtk_object_add_arg_type("GtkHtml::vadjustment", + GTK_TYPE_ADJUSTMENT, + GTK_ARG_READWRITE | GTK_ARG_CONSTRUCT, + ARG_VADJUSTMENT); + + object_class->set_arg = gtk_html_set_arg; + object_class->get_arg = gtk_html_get_arg; + object_class->destroy = gtk_html_destroy; + object_class->finalize = gtk_html_finalize; + + widget_class->realize = gtk_html_realize; + widget_class->unrealize = gtk_html_unrealize; + widget_class->style_set = gtk_html_style_set; + widget_class->draw_focus = gtk_html_draw_focus; + widget_class->size_request = gtk_html_size_request; + widget_class->size_allocate = gtk_html_size_allocate; + widget_class->draw = gtk_html_draw; + widget_class->expose_event = gtk_html_expose; + widget_class->button_press_event = gtk_html_button_press; + widget_class->button_release_event = gtk_html_button_release; widget_class->motion_notify_event = gtk_html_motion_notify; widget_class->leave_notify_event = gtk_html_leave_notify; - widget_class->selection_get = gtk_html_selection_get; + widget_class->selection_get = gtk_html_selection_get; widget_class->selection_clear_event = gtk_html_selection_clear; widget_class->key_press_event = gtk_html_key_press; widget_class->visibility_notify_event = gtk_html_visibility_notify; - - - widget_class->set_scroll_adjustments_signal = - gtk_signal_new ("set_scroll_adjustments", - GTK_RUN_LAST, - object_class->type, - GTK_SIGNAL_OFFSET (GtkHtmlClass, set_scroll_adjustments), - gtk_marshal_NONE__POINTER_POINTER, - GTK_TYPE_NONE, 2, GTK_TYPE_ADJUSTMENT, GTK_TYPE_ADJUSTMENT); - - - class->set_scroll_adjustments = gtk_html_set_adjustments; + + + widget_class->set_scroll_adjustments_signal = + gtk_signal_new("set_scroll_adjustments", + GTK_RUN_LAST, + object_class->type, + GTK_SIGNAL_OFFSET(GtkHtmlClass, set_scroll_adjustments), + gtk_marshal_NONE__POINTER_POINTER, + GTK_TYPE_NONE, 2, GTK_TYPE_ADJUSTMENT, + GTK_TYPE_ADJUSTMENT); + + + class->set_scroll_adjustments = gtk_html_set_adjustments; } -static void gtk_html_set_arg (GtkObject *object, - GtkArg *arg, - guint arg_id) +static void gtk_html_set_arg(GtkObject * object, GtkArg * arg, guint arg_id) { - GtkHtml *html; - - html = GTK_HTML (object); - - switch (arg_id) { - case ARG_HADJUSTMENT: - gtk_html_set_adjustments (html, - GTK_VALUE_POINTER (*arg), - html->vadj); - break; - case ARG_VADJUSTMENT: - gtk_html_set_adjustments (html, - html->hadj, - GTK_VALUE_POINTER (*arg)); - break; - default: - break; - } + GtkHtml *html; + + html = GTK_HTML(object); + + switch (arg_id) + { + case ARG_HADJUSTMENT: + gtk_html_set_adjustments(html, GTK_VALUE_POINTER(*arg), html->vadj); + break; + case ARG_VADJUSTMENT: + gtk_html_set_adjustments(html, html->hadj, GTK_VALUE_POINTER(*arg)); + break; + default: + break; + } } -static void gtk_html_get_arg (GtkObject *object, - GtkArg *arg, - guint arg_id) +static void gtk_html_get_arg(GtkObject * object, GtkArg * arg, guint arg_id) { - GtkHtml *html; - - html = GTK_HTML(object); - - switch (arg_id) { - case ARG_HADJUSTMENT: - GTK_VALUE_POINTER (*arg) = html->hadj; - break; - case ARG_VADJUSTMENT: - GTK_VALUE_POINTER (*arg) = html->vadj; - break; - default: - arg->type = GTK_TYPE_INVALID; - break; - } + GtkHtml *html; + + html = GTK_HTML(object); + + switch (arg_id) + { + case ARG_HADJUSTMENT: + GTK_VALUE_POINTER(*arg) = html->hadj; + break; + case ARG_VADJUSTMENT: + GTK_VALUE_POINTER(*arg) = html->vadj; + break; + default: + arg->type = GTK_TYPE_INVALID; + break; + } } -static void gtk_html_init (GtkHtml *html) +static void gtk_html_init(GtkHtml * html) { - static const GtkTargetEntry targets[] = { - { "STRING", 0, TARGET_STRING }, - { "TEXT", 0, TARGET_TEXT }, - { "COMPOUND_TEXT", 0, TARGET_COMPOUND_TEXT } - }; - - static const gint n_targets = sizeof(targets) / sizeof(targets[0]); - - GTK_WIDGET_SET_FLAGS(html, GTK_CAN_FOCUS); - - html->html_area = NULL; - html->hadj = NULL; - html->vadj = NULL; + static const GtkTargetEntry targets[] = { + {"STRING", 0, TARGET_STRING}, + {"TEXT", 0, TARGET_TEXT}, + {"COMPOUND_TEXT", 0, TARGET_COMPOUND_TEXT} + }; + + static const gint n_targets = sizeof(targets) / sizeof(targets[0]); + + GTK_WIDGET_SET_FLAGS(html, GTK_CAN_FOCUS); + + html->html_area = NULL; + html->hadj = NULL; + html->vadj = NULL; html->current_x = 0; html->current_y = 0; - html->start_sel = html->end_sel = NULL; - html->start_sel_x = html->start_sel_y = -1; - html->num_end = html->num_start = -1; - + html->start_sel = html->end_sel = NULL; + html->start_sel_x = html->start_sel_y = -1; + html->num_end = html->num_start = -1; + html->html_bits = NULL; html->urls = NULL; html->selected_text = NULL; html->tooltip_hb = NULL; html->tooltip_timer = -1; html->tooltip_window = NULL; - html->cursor_hb = NULL; + html->cursor_hb = NULL; html->cursor_pos = 0; html->pm = NULL; @@ -331,155 +316,155 @@ html->editable = 0; html->transparent = 0; - html->frozen = 0; - - gtk_selection_add_targets (GTK_WIDGET (html), GDK_SELECTION_PRIMARY, - targets, n_targets); - - - + html->frozen = 0; + + gtk_selection_add_targets(GTK_WIDGET(html), GDK_SELECTION_PRIMARY, + targets, n_targets); + + + } -GtkWidget *gtk_html_new (GtkAdjustment *hadj, - GtkAdjustment *vadj) +GtkWidget *gtk_html_new(GtkAdjustment * hadj, GtkAdjustment * vadj) { - GtkWidget *html; - - if (hadj) - g_return_val_if_fail (GTK_IS_ADJUSTMENT (hadj), NULL); - if (vadj) - g_return_val_if_fail (GTK_IS_ADJUSTMENT (vadj), NULL); - - html = gtk_widget_new (GTK_TYPE_HTML, - "hadjustment", hadj, - "vadjustment", vadj, - NULL); - - return html; + GtkWidget *html; + if(!cache_init) + { + g_datalist_init(&font_cache); + cache_init = TRUE; + } + + if (hadj) + g_return_val_if_fail(GTK_IS_ADJUSTMENT(hadj), NULL); + if (vadj) + g_return_val_if_fail(GTK_IS_ADJUSTMENT(vadj), NULL); + + html = gtk_widget_new(GTK_TYPE_HTML, + "hadjustment", hadj, "vadjustment", vadj, NULL); + + return html; } -void gtk_html_set_editable (GtkHtml *html, - gboolean is_editable) +void gtk_html_set_editable(GtkHtml * html, gboolean is_editable) { - g_return_if_fail (html != NULL); - g_return_if_fail (GTK_IS_HTML (html)); - - - html->editable = (is_editable != FALSE); - - if (is_editable) - draw_cursor(html); - else - undraw_cursor(html); + g_return_if_fail(html != NULL); + g_return_if_fail(GTK_IS_HTML(html)); + + + html->editable = (is_editable != FALSE); + + if (is_editable) + draw_cursor(html); + else + undraw_cursor(html); } -void gtk_html_set_transparent( GtkHtml *html, - gboolean is_transparent) +void gtk_html_set_transparent(GtkHtml * html, gboolean is_transparent) { - GdkRectangle rect; - gint width, height; - GtkWidget *widget; - - g_return_if_fail (html != NULL); - g_return_if_fail (GTK_IS_HTML (html)); - - - widget = GTK_WIDGET(html); - html->transparent = (is_transparent != FALSE); - - if (!GTK_WIDGET_REALIZED(widget)) - return; - - html->bg_gc = NULL; - gdk_window_get_size (widget->window, &width, &height); - rect.x = 0; - rect.y = 0; - rect.width = width; - rect.height = height; - gdk_window_clear_area (widget->window, rect.x, rect.y, rect.width, rect.height); - - expose_html (html, &rect, FALSE); - gtk_html_draw_focus ( (GtkWidget *) html); + GdkRectangle rect; + gint width, + height; + GtkWidget *widget; + + g_return_if_fail(html != NULL); + g_return_if_fail(GTK_IS_HTML(html)); + + + widget = GTK_WIDGET(html); + html->transparent = (is_transparent != FALSE); + + if (!GTK_WIDGET_REALIZED(widget)) + return; + + html->bg_gc = NULL; + gdk_window_get_size(widget->window, &width, &height); + rect.x = 0; + rect.y = 0; + rect.width = width; + rect.height = height; + gdk_window_clear_area(widget->window, rect.x, rect.y, rect.width, + rect.height); + + expose_html(html, &rect, FALSE); + gtk_html_draw_focus((GtkWidget *) html); } -void gtk_html_set_adjustments (GtkHtml *html, - GtkAdjustment *hadj, - GtkAdjustment *vadj) +void gtk_html_set_adjustments(GtkHtml * html, + GtkAdjustment * hadj, GtkAdjustment * vadj) { - g_return_if_fail (html != NULL); - g_return_if_fail (GTK_IS_HTML (html)); - if (hadj) - g_return_if_fail (GTK_IS_ADJUSTMENT (hadj)); - else - hadj = GTK_ADJUSTMENT (gtk_adjustment_new (0.0, 0.0, 0.0, 0.0, 0.0, 0.0)); - if (vadj) - g_return_if_fail (GTK_IS_ADJUSTMENT (vadj)); - else - vadj = GTK_ADJUSTMENT (gtk_adjustment_new (0.0, 0.0, 0.0, 0.0, 0.0, 0.0)); - - if (html->hadj && (html->hadj != hadj)) { - gtk_signal_disconnect_by_data (GTK_OBJECT (html->hadj), html); - gtk_object_unref (GTK_OBJECT (html->hadj)); - } - - if (html->vadj && (html->vadj != vadj)) { - gtk_signal_disconnect_by_data (GTK_OBJECT (html->vadj), html); - gtk_object_unref (GTK_OBJECT (html->vadj)); - } - - if (html->hadj != hadj) { - html->hadj = hadj; - gtk_object_ref (GTK_OBJECT (html->hadj)); - gtk_object_sink (GTK_OBJECT (html->hadj)); - - gtk_signal_connect (GTK_OBJECT (html->hadj), "changed", - (GtkSignalFunc) gtk_html_adjustment, - html); - gtk_signal_connect (GTK_OBJECT (html->hadj), "value_changed", - (GtkSignalFunc) gtk_html_adjustment, - html); - gtk_signal_connect (GTK_OBJECT (html->hadj), "disconnect", - (GtkSignalFunc) gtk_html_disconnect, - html); - gtk_html_adjustment (hadj, html); - } - - if (html->vadj != vadj) { - html->vadj = vadj; - gtk_object_ref (GTK_OBJECT (html->vadj)); - gtk_object_sink (GTK_OBJECT (html->vadj)); - - gtk_signal_connect (GTK_OBJECT (html->vadj), "changed", - (GtkSignalFunc) gtk_html_adjustment, - html); - gtk_signal_connect (GTK_OBJECT (html->vadj), "value_changed", - (GtkSignalFunc) gtk_html_adjustment, - html); - gtk_signal_connect (GTK_OBJECT (html->vadj), "disconnect", - (GtkSignalFunc) gtk_html_disconnect, - html); - gtk_html_adjustment (vadj, html); - } + g_return_if_fail(html != NULL); + g_return_if_fail(GTK_IS_HTML(html)); + if (hadj) + g_return_if_fail(GTK_IS_ADJUSTMENT(hadj)); + else + hadj = GTK_ADJUSTMENT(gtk_adjustment_new(0.0, 0.0, 0.0, 0.0, 0.0, 0.0)); + if (vadj) + g_return_if_fail(GTK_IS_ADJUSTMENT(vadj)); + else + vadj = GTK_ADJUSTMENT(gtk_adjustment_new(0.0, 0.0, 0.0, 0.0, 0.0, 0.0)); + + if (html->hadj && (html->hadj != hadj)) + { + gtk_signal_disconnect_by_data(GTK_OBJECT(html->hadj), html); + gtk_object_unref(GTK_OBJECT(html->hadj)); + } + + if (html->vadj && (html->vadj != vadj)) + { + gtk_signal_disconnect_by_data(GTK_OBJECT(html->vadj), html); + gtk_object_unref(GTK_OBJECT(html->vadj)); + } + + if (html->hadj != hadj) + { + html->hadj = hadj; + gtk_object_ref(GTK_OBJECT(html->hadj)); + gtk_object_sink(GTK_OBJECT(html->hadj)); + + gtk_signal_connect(GTK_OBJECT(html->hadj), "changed", + (GtkSignalFunc) gtk_html_adjustment, html); + gtk_signal_connect(GTK_OBJECT(html->hadj), "value_changed", + (GtkSignalFunc) gtk_html_adjustment, html); + gtk_signal_connect(GTK_OBJECT(html->hadj), "disconnect", + (GtkSignalFunc) gtk_html_disconnect, html); + gtk_html_adjustment(hadj, html); + } + + if (html->vadj != vadj) + { + html->vadj = vadj; + gtk_object_ref(GTK_OBJECT(html->vadj)); + gtk_object_sink(GTK_OBJECT(html->vadj)); + + gtk_signal_connect(GTK_OBJECT(html->vadj), "changed", + (GtkSignalFunc) gtk_html_adjustment, html); + gtk_signal_connect(GTK_OBJECT(html->vadj), "value_changed", + (GtkSignalFunc) gtk_html_adjustment, html); + gtk_signal_connect(GTK_OBJECT(html->vadj), "disconnect", + (GtkSignalFunc) gtk_html_disconnect, html); + gtk_html_adjustment(vadj, html); + } } -GdkColor *get_color(int colorv, GdkColormap *map) +GdkColor *get_color(int colorv, GdkColormap * map) { GdkColor *color; -#if 0 - fprintf(stdout,"color is %x\n",colorv); -#endif - color = (GdkColor *)g_new0(GdkColor, 1); +#if 0 + fprintf(stdout, "color is %x\n", colorv); +#endif + color = (GdkColor *) g_new0(GdkColor, 1); color->red = ((colorv & 0xff0000) >> 16) * 256; color->green = ((colorv & 0xff00) >> 8) * 256; color->blue = ((colorv & 0xff)) * 256; #if 0 - fprintf(stdout,"Colors are %d, %d, %d\n",color->red, color->green, color->blue); + fprintf(stdout, "Colors are %d, %d, %d\n", color->red, color->green, + color->blue); #endif gdk_color_alloc(map, color); return color; @@ -487,421 +472,494 @@ -GdkFont *font_load(char *fmt, int size) + +GdkFont *getfont(char * font, int bold, int italic, int fixed, int size) { - char buf[256]; - g_snprintf(buf, sizeof(buf), fmt, font_sizes[size]); - sprintf(debug_buff,"loading font %s\n",buf); - debug_print(debug_buff); - return gdk_font_load(buf); -} - - -GdkFont *getfont(int bold, int italic, int fixed, int size) -{ - if (size > MAX_SIZE) size = MAX_SIZE; - if (size < 1) size=1; + gchar font_name[1024] = "-*-"; + GdkFont * my_font; + if (size > MAX_SIZE) + size = MAX_SIZE; + if (size < 1) + size = 1; size--; - if (fixed) { - if (bold) { - if (italic) { - if (!fixed_bold_italic_font[size]) - fixed_bold_italic_font[size] = font_load(FIXED_BOLD_ITALIC_FONT,size); - return fixed_bold_italic_font[size]; - - } else { - if (!fixed_bold_font[size]) - fixed_bold_font[size] = font_load (FIXED_BOLD_FONT,size); - return fixed_bold_font[size]; - } - } else if (italic) { - if (!fixed_italic_font[size]) - fixed_italic_font[size] = font_load(FIXED_ITALIC_FONT,size); - - return fixed_italic_font[size]; - } else { - if (!fixed_font[size]) - fixed_font[size] = font_load(FIXED_FONT,size); - return fixed_font[size]; + + if(strlen(font)) + { + strcat( font_name, font ); + } + else + { + if( fixed ) + { + strcat( font_name, "courier" ); } - } else { - if (bold) { - if (italic) { - if (!prop_bold_italic_font[size]) - prop_bold_italic_font[size] = font_load(PROP_BOLD_ITALIC_FONT,size); - return prop_bold_italic_font[size]; - - } else { - if (!prop_bold_font[size]) - prop_bold_font[size] = font_load (PROP_BOLD_FONT,size); - return prop_bold_font[size]; - } - } else if (italic) { - if (!prop_italic_font[size]) - prop_italic_font[size] = font_load(PROP_ITALIC_FONT,size); - - return prop_italic_font[size]; - } else { - if (!prop_font[size]) - prop_font[size] = font_load(PROP_FONT,size); - return prop_font[size]; + else + { + strcat( font_name, "helvetica" ); } } + strcat( font_name, "-" ); + + if(bold) + { + strcat( font_name, "bold"); + } + else + { + strcat( font_name, "medium"); + } + strcat( font_name, "-" ); + /* + * here is the deal, some fonts have oblique but not italics + * other fonts have italics but not oblique + * so we are going to try both + */ + if( italic == 1 ) + { + strcat( font_name, "i"); + } + else if( italic == 2 ) + { + strcat( font_name, "o" ); + } + else + { + strcat( font_name, "r"); + } + strcat( font_name, "-*-*-*-"); + { + char buff[256]; + sprintf(buff, "%d-*-*-*-*-*-*", font_sizes[size]); + strcat( font_name, buff ); + } + + g_strdown(font_name); + + if( my_font = + g_datalist_id_get_data(&font_cache, g_quark_from_string(font_name)) ) + { + return my_font; + } + my_font = gdk_font_load(font_name); + if( !my_font ) + { + if( italic == 1 ) + { + my_font = getfont(font, bold, 2, fixed, size+1 ); + } + else + { + my_font = getfont("", bold, italic, fixed, size+1 ); + } + } + g_datalist_id_set_data( &font_cache, + g_quark_from_string(font_name), + my_font ); + return my_font; } /* 'Borrowed' from ETerm */ -GdkWindow *get_desktop_window(GtkWidget *widget) +GdkWindow *get_desktop_window(GtkWidget * widget) { - GdkAtom prop, type, prop2; - int format; - gint length; - guchar *data; +#ifndef _WIN32 + GdkAtom prop, + type, + prop2; + int format; + gint length; + guchar *data; GtkWidget *w; - prop = gdk_atom_intern("_XROOTPMAP_ID", 1); - prop2 = gdk_atom_intern("_XROOTCOLOR_PIXEL", 1); - - if (prop == None && prop2 == None) { - return NULL; - } - - - - for (w = widget; w; w = w->parent) { - - if (prop != None) { + prop = gdk_atom_intern("_XROOTPMAP_ID", 1); + prop2 = gdk_atom_intern("_XROOTCOLOR_PIXEL", 1); + + if (prop == None && prop2 == None) + { + return NULL; + } + + + + for (w = widget; w; w = w->parent) + { + + if (prop != None) + { gdk_property_get(w->window, prop, AnyPropertyType, 0L, 1L, 0, - &type, &format, &length, &data); - } else if (prop2 != None) { + &type, &format, &length, &data); + } + else if (prop2 != None) + { gdk_property_get(w->window, prop2, AnyPropertyType, 0L, 1L, 0, - &type, &format, &length, &data); - } else { + &type, &format, &length, &data); + } + else + { continue; } - if (type != None) { + if (type != None) + { return (w->window); } } - +#endif return NULL; } -GdkPixmap *get_desktop_pixmap(GtkWidget *widget) +GdkPixmap *get_desktop_pixmap(GtkWidget * widget) { - GdkPixmap *p; - GdkAtom prop, type, prop2; - int format; - gint length; - guint32 id; - guchar *data; - - prop = gdk_atom_intern("_XROOTPMAP_ID", 1); - prop2 = gdk_atom_intern("_XROOTCOLOR_PIXEL", 1); - - - if (prop == None && prop2 == None) { - return NULL; - } - - if (prop != None) { - gdk_property_get(get_desktop_window(widget), prop, AnyPropertyType, 0L, 1L, 0, - &type, &format, &length, &data); - if (type == XA_PIXMAP) { +#ifndef _WIN32 + GdkPixmap *p; + GdkAtom prop, + type, + prop2; + int format; + gint length; + guint32 id; + guchar *data; + + prop = gdk_atom_intern("_XROOTPMAP_ID", 1); + prop2 = gdk_atom_intern("_XROOTCOLOR_PIXEL", 1); + + + if (prop == None && prop2 == None) + { + return NULL; + } + + if (prop != None) + { + gdk_property_get(get_desktop_window(widget), prop, AnyPropertyType, 0L, + 1L, 0, &type, &format, &length, &data); + if (type == XA_PIXMAP) + { id = data[0]; id += data[1] << 8; id += data[2] << 16; id += data[3] << 24; - p = gdk_pixmap_foreign_new(id); - return p; - } - } - if (prop2 != None) { + p = gdk_pixmap_foreign_new(id); + return p; + } + } + if (prop2 != None) + { + /* XGetWindowProperty(Xdisplay, desktop_window, prop2, 0L, 1L, False, AnyPropertyType, &type, &format, &length, &after, &data);*/ + /* if (type == XA_CARDINAL) {*/ - /* D_PIXMAP((" Solid color not yet supported.\n"));*/ + /* + * D_PIXMAP((" Solid color not yet supported.\n")); + */ + /* return NULL; }*/ - } - /* D_PIXMAP(("No suitable attribute found.\n"));*/ - return NULL; + } + /* + * D_PIXMAP(("No suitable attribute found.\n")); + */ +#endif + return NULL; } -static void clear_focus_area (GtkHtml *html, - gint area_x, - gint area_y, - gint area_width, - gint area_height) +static void clear_focus_area(GtkHtml * html, + gint area_x, + gint area_y, gint area_width, gint area_height) { - GtkWidget *widget = GTK_WIDGET (html); - gint x, y; - - gint ythick = BORDER_WIDTH + widget->style->klass->ythickness; - gint xthick = BORDER_WIDTH + widget->style->klass->xthickness; - - gint width, height; - - if (html->frozen > 0) - return; - - if (html->transparent) { + GtkWidget *widget = GTK_WIDGET(html); + gint x, + y; + + gint ythick = BORDER_WIDTH + widget->style->klass->ythickness; + gint xthick = BORDER_WIDTH + widget->style->klass->xthickness; + + gint width, + height; + + if (html->frozen > 0) + return; + + if (html->transparent) + { if (html->pm == NULL) html->pm = get_desktop_pixmap(widget); - if (html->pm == NULL) - return; - - if (html->bg_gc == NULL) { + if (html->pm == NULL) + return; + + if (html->bg_gc == NULL) + { GdkGCValues values; - values.tile = html->pm; - values.fill = GDK_TILED; - - html->bg_gc = gdk_gc_new_with_values (html->html_area, &values, - GDK_GC_FILL | GDK_GC_TILE); - - } - - gdk_window_get_deskrelative_origin(widget->window, &x, &y); + values.tile = html->pm; + values.fill = GDK_TILED; + + html->bg_gc = gdk_gc_new_with_values(html->html_area, &values, + GDK_GC_FILL | GDK_GC_TILE); + + } + + gdk_window_get_deskrelative_origin(widget->window, &x, &y); gdk_draw_pixmap(widget->window, html->bg_gc, html->pm, - x + area_x, y + area_y, area_x, area_y, area_width, - area_height); - - - } else { - gdk_window_get_size (widget->style->bg_pixmap[GTK_STATE_NORMAL], &width, &height); - - gdk_gc_set_ts_origin (html->bg_gc, - (- html->xoffset + xthick) % width, - (- html->yoffset + ythick) % height); - - gdk_draw_rectangle (widget->window, html->bg_gc, TRUE, - area_x, area_y, area_width, area_height); - } + x + area_x, y + area_y, area_x, area_y, area_width, + area_height); + + + } + else + { + gdk_window_get_size(widget->style->bg_pixmap[GTK_STATE_NORMAL], &width, + &height); + + gdk_gc_set_ts_origin(html->bg_gc, + (-html->xoffset + xthick) % width, + (-html->yoffset + ythick) % height); + + gdk_draw_rectangle(widget->window, html->bg_gc, TRUE, + area_x, area_y, area_width, area_height); + } } -static void gtk_html_draw_focus (GtkWidget *widget) +static void gtk_html_draw_focus(GtkWidget * widget) { - GtkHtml *html; - gint width, height; - gint x, y; - - g_return_if_fail (widget != NULL); - g_return_if_fail (GTK_IS_HTML (widget)); - - html = GTK_HTML (widget); - - if (GTK_WIDGET_DRAWABLE (widget)) { - gint ythick = widget->style->klass->ythickness; - gint xthick = widget->style->klass->xthickness; - gint xextra = BORDER_WIDTH; - gint yextra = BORDER_WIDTH; - - x = 0; - y = 0; - width = widget->allocation.width; - height = widget->allocation.height; - - if (GTK_WIDGET_HAS_FOCUS (widget)) { - x += 1; - y += 1; - width -= 2; - height -= 2; - xextra -= 1; - yextra -= 1; - - gtk_paint_focus (widget->style, widget->window, - NULL, widget, "text", - 0, 0, - widget->allocation.width - 1, - widget->allocation.height - 1); - } - - gtk_paint_shadow (widget->style, widget->window, - GTK_STATE_NORMAL, GTK_SHADOW_IN, - NULL, widget, "text", - x, y, width, height); - - x += xthick; - y += ythick; - width -= 2 * xthick; - height -= 2 * ythick; - - - if (widget->style->bg_pixmap[GTK_STATE_NORMAL] || html->transparent) { - /* top rect */ - clear_focus_area (html, x, y, width, yextra); - /* left rect */ - clear_focus_area (html, x, y + yextra, - xextra, y + height - 2 * yextra); - /* right rect */ - clear_focus_area (html, x + width - xextra, y + yextra, - xextra, height - 2 * ythick); - /* bottom rect */ - clear_focus_area (html, x, x + height - yextra, width, yextra); - } - } -} - -static void gtk_html_size_request (GtkWidget *widget, - GtkRequisition *requisition) -{ - gint xthickness; - gint ythickness; - gint char_height; - gint char_width; - - g_return_if_fail (widget != NULL); - g_return_if_fail (GTK_IS_HTML (widget)); - g_return_if_fail (requisition != NULL); - - xthickness = widget->style->klass->xthickness + BORDER_WIDTH; - ythickness = widget->style->klass->ythickness + BORDER_WIDTH; - - char_height = MIN_HTML_HEIGHT_LINES * (widget->style->font->ascent + - widget->style->font->descent); - - char_width = MIN_HTML_WIDTH_LINES * (gdk_text_width (widget->style->font, - "ABCDEFGHIJKLMNOPQRSTUVWXYZ", - 26) / 26); - - requisition->width = char_width + xthickness * 2; - requisition->height = char_height + ythickness * 2; -} - -static void gtk_html_size_allocate (GtkWidget *widget, - GtkAllocation *allocation) -{ - GtkHtml *html; - - g_return_if_fail (widget != NULL); - g_return_if_fail (GTK_IS_HTML (widget)); - g_return_if_fail (allocation != NULL); + GtkHtml *html; + gint width, + height; + gint x, + y; + + g_return_if_fail(widget != NULL); + g_return_if_fail(GTK_IS_HTML(widget)); html = GTK_HTML(widget); - widget->allocation = *allocation; - if (GTK_WIDGET_REALIZED (widget)) { - gdk_window_move_resize (widget->window, - allocation->x, allocation->y, - allocation->width, allocation->height); - - gdk_window_move_resize (html->html_area, - widget->style->klass->xthickness + BORDER_WIDTH, - widget->style->klass->ythickness + BORDER_WIDTH, - MAX (1, (gint)widget->allocation.width - - (gint)(widget->style->klass->xthickness + - (gint)BORDER_WIDTH) * 2), - MAX (1, (gint)widget->allocation.height - - (gint)(widget->style->klass->ythickness + - (gint)BORDER_WIDTH) * 2)); - - resize_html(html); - } + if (GTK_WIDGET_DRAWABLE(widget)) + { + gint ythick = widget->style->klass->ythickness; + gint xthick = widget->style->klass->xthickness; + gint xextra = BORDER_WIDTH; + gint yextra = BORDER_WIDTH; + + x = 0; + y = 0; + width = widget->allocation.width; + height = widget->allocation.height; + + if (GTK_WIDGET_HAS_FOCUS(widget)) + { + x += 1; + y += 1; + width -= 2; + height -= 2; + xextra -= 1; + yextra -= 1; + + gtk_paint_focus(widget->style, widget->window, + NULL, widget, "text", + 0, 0, + widget->allocation.width - 1, + widget->allocation.height - 1); + } + + gtk_paint_shadow(widget->style, widget->window, + GTK_STATE_NORMAL, GTK_SHADOW_IN, + NULL, widget, "text", x, y, width, height); + + x += xthick; + y += ythick; + width -= 2 * xthick; + height -= 2 * ythick; + + + if (widget->style->bg_pixmap[GTK_STATE_NORMAL] || html->transparent) + { + /* + * top rect + */ + clear_focus_area(html, x, y, width, yextra); + /* + * left rect + */ + clear_focus_area(html, x, y + yextra, + xextra, y + height - 2 * yextra); + /* + * right rect + */ + clear_focus_area(html, x + width - xextra, y + yextra, + xextra, height - 2 * ythick); + /* + * bottom rect + */ + clear_focus_area(html, x, x + height - yextra, width, yextra); + } + } } -static void gtk_html_draw (GtkWidget *widget, - GdkRectangle *area) +static void gtk_html_size_request(GtkWidget * widget, + GtkRequisition * requisition) { - g_return_if_fail (widget != NULL); - g_return_if_fail (GTK_IS_HTML (widget)); - g_return_if_fail (area != NULL); - - if (GTK_WIDGET_DRAWABLE (widget)) - { - expose_html (GTK_HTML(widget), area, TRUE); - gtk_widget_draw_focus (widget); - } + gint xthickness; + gint ythickness; + gint char_height; + gint char_width; + + g_return_if_fail(widget != NULL); + g_return_if_fail(GTK_IS_HTML(widget)); + g_return_if_fail(requisition != NULL); + + xthickness = widget->style->klass->xthickness + BORDER_WIDTH; + ythickness = widget->style->klass->ythickness + BORDER_WIDTH; + + char_height = MIN_HTML_HEIGHT_LINES * (widget->style->font->ascent + + widget->style->font->descent); + + char_width = MIN_HTML_WIDTH_LINES * (gdk_text_width(widget->style->font, + "ABCDEFGHIJKLMNOPQRSTUVWXYZ", + 26) / 26); + + requisition->width = char_width + xthickness * 2; + requisition->height = char_height + ythickness * 2; } - -static gint gtk_html_expose (GtkWidget *widget, - GdkEventExpose *event) +static void gtk_html_size_allocate(GtkWidget * widget, + GtkAllocation * allocation) { - GtkHtml *html; - - g_return_val_if_fail (widget != NULL, FALSE); - g_return_val_if_fail (GTK_IS_HTML (widget), FALSE); - g_return_val_if_fail (event != NULL, FALSE); - - html = GTK_HTML(widget); - - if (event->window == html->html_area) { - expose_html(html, &event->area, TRUE); - } else if (event->count == 0) { - gtk_widget_draw_focus (widget); - } - - return FALSE; + GtkHtml *html; + + g_return_if_fail(widget != NULL); + g_return_if_fail(GTK_IS_HTML(widget)); + g_return_if_fail(allocation != NULL); + + html = GTK_HTML(widget); + + widget->allocation = *allocation; + if (GTK_WIDGET_REALIZED(widget)) + { + gdk_window_move_resize(widget->window, + allocation->x, allocation->y, + allocation->width, allocation->height); + + gdk_window_move_resize(html->html_area, + widget->style->klass->xthickness + BORDER_WIDTH, + widget->style->klass->ythickness + BORDER_WIDTH, + MAX(1, (gint) widget->allocation.width - + (gint) (widget->style->klass->xthickness + + (gint) BORDER_WIDTH) * 2), + MAX(1, (gint) widget->allocation.height - + (gint) (widget->style->klass->ythickness + + (gint) BORDER_WIDTH) * 2)); + + resize_html(html); + } +} + +static void gtk_html_draw(GtkWidget * widget, GdkRectangle * area) +{ + g_return_if_fail(widget != NULL); + g_return_if_fail(GTK_IS_HTML(widget)); + g_return_if_fail(area != NULL); + + if (GTK_WIDGET_DRAWABLE(widget)) + { + expose_html(GTK_HTML(widget), area, TRUE); + gtk_widget_draw_focus(widget); + } +} + + +static gint gtk_html_expose(GtkWidget * widget, GdkEventExpose * event) +{ + GtkHtml *html; + + g_return_val_if_fail(widget != NULL, FALSE); + g_return_val_if_fail(GTK_IS_HTML(widget), FALSE); + g_return_val_if_fail(event != NULL, FALSE); + + html = GTK_HTML(widget); + + if (event->window == html->html_area) + { + expose_html(html, &event->area, TRUE); + } + else if (event->count == 0) + { + gtk_widget_draw_focus(widget); + } + + return FALSE; } -static gint gtk_html_selection_clear (GtkWidget *widget, - GdkEventSelection *event) +static gint gtk_html_selection_clear(GtkWidget * widget, + GdkEventSelection * event) { - GtkHtml *html; - - g_return_val_if_fail (widget != NULL, FALSE); - g_return_val_if_fail (GTK_IS_HTML (widget), FALSE); - g_return_val_if_fail (event != NULL, FALSE); - - /* Let the selection handling code know that the selection - * has been changed, since we've overriden the default handler */ - if (!gtk_selection_clear (widget, event)) - return FALSE; - - html = GTK_HTML (widget); - - if (event->selection == GDK_SELECTION_PRIMARY) { - if (html->selected_text) { - GList *hbits = html->html_bits; - GtkHtmlBit *hb; - + GtkHtml *html; + + g_return_val_if_fail(widget != NULL, FALSE); + g_return_val_if_fail(GTK_IS_HTML(widget), FALSE); + g_return_val_if_fail(event != NULL, FALSE); + + /* + * Let the selection handling code know that the selection + * * has been changed, since we've overriden the default handler + */ + if (!gtk_selection_clear(widget, event)) + return FALSE; + + html = GTK_HTML(widget); + + if (event->selection == GDK_SELECTION_PRIMARY) + { + if (html->selected_text) + { + GList *hbits = html->html_bits; + GtkHtmlBit *hb; + g_free(html->selected_text); html->selected_text = NULL; html->start_sel = NULL; html->end_sel = NULL; html->num_start = 0; html->num_end = 0; - while(hbits) { - hb = (GtkHtmlBit *)hbits->data; + while (hbits) + { + hb = (GtkHtmlBit *) hbits->data; if (hb->was_selected) gtk_html_draw_bit(html, hb, 1); hbits = hbits->prev; } hbits = g_list_last(html->html_bits); } - } - - return TRUE; + } + + return TRUE; } -static void gtk_html_selection_get (GtkWidget *widget, - GtkSelectionData *selection_data, - guint sel_info, - guint32 time) +static void gtk_html_selection_get(GtkWidget * widget, + GtkSelectionData * selection_data, + guint sel_info, guint32 time) { gchar *str; - gint len; - GtkHtml *html; - - g_return_if_fail (widget != NULL); - g_return_if_fail (GTK_IS_HTML (widget)); - - html = GTK_HTML(widget); - - + gint len; + GtkHtml *html; + + g_return_if_fail(widget != NULL); + g_return_if_fail(GTK_IS_HTML(widget)); + + html = GTK_HTML(widget); + + if (selection_data->selection != GDK_SELECTION_PRIMARY) return; @@ -909,130 +967,159 @@ if (!str) return; - + len = strlen(str); - if (sel_info == TARGET_STRING) { + if (sel_info == TARGET_STRING) + { gtk_selection_data_set(selection_data, - GDK_SELECTION_TYPE_STRING, - 8*sizeof(gchar), (guchar *)str, len); - } else if ((sel_info == TARGET_TEXT) || (sel_info == TARGET_COMPOUND_TEXT)) { + GDK_SELECTION_TYPE_STRING, + 8 * sizeof(gchar), (guchar *) str, len); + } + else if ((sel_info == TARGET_TEXT) || (sel_info == TARGET_COMPOUND_TEXT)) + { guchar *text; GdkAtom encoding; gint format; gint new_length; - gdk_string_to_compound_text (str, &encoding, &format, &text, &new_length); - gtk_selection_data_set (selection_data, encoding, format, text, new_length); - gdk_free_compound_text (text); + gdk_string_to_compound_text(str, &encoding, &format, &text, + &new_length); + gtk_selection_data_set(selection_data, encoding, format, text, + new_length); + gdk_free_compound_text(text); } } -static void do_select(GtkHtml *html, - int x, - int y) +static void do_select(GtkHtml * html, int x, int y) { GList *hbits = g_list_last(html->html_bits); - int epos, spos; + int epos, + spos; GtkHtmlBit *hb; - + if (!hbits) return; - - hb = (GtkHtmlBit *)hbits->data; - - while (hbits) { - hb = (GtkHtmlBit *)hbits->data; - if (hb->type == HTML_BIT_TEXT) + + hb = (GtkHtmlBit *) hbits->data; + + while (hbits) + { + hb = (GtkHtmlBit *) hbits->data; + if (hb->type == HTML_BIT_TEXT) break; hbits = hbits->prev; - } - + } + if (!hb) - return; - - - if (y > hb->y) { + return; + + + if (y > hb->y) + { html->num_end = strlen(hb->text) - 1; html->end_sel = hb; - } else if (y < 0) { + } + else if (y < 0) + { html->num_end = 0; - html->end_sel = (GtkHtmlBit *)html->html_bits->data; - } else while(hbits) { - hb = (GtkHtmlBit *)hbits->data; - if ((y < hb->y && y > (hb->y - hb->height)) && - (x > hb->x + hb->width)) { - if (hb->type != HTML_BIT_TEXT) { - html->num_end = 0; + html->end_sel = (GtkHtmlBit *) html->html_bits->data; + } + else + while (hbits) + { + hb = (GtkHtmlBit *) hbits->data; + if ((y < hb->y && y > (hb->y - hb->height)) && + (x > hb->x + hb->width)) + { + if (hb->type != HTML_BIT_TEXT) + { + html->num_end = 0; + html->end_sel = hb; + break; + } + + html->num_end = strlen(hb->text) - 1; html->end_sel = hb; break; } - - html->num_end = strlen(hb->text) - 1; - html->end_sel = hb; - break; - } else if ((x > hb->x && x < (hb->x + hb->width)) && - (y < hb->y && y > (hb->y - hb->height))) { - int i, len; - int w = x - hb->x; - - if (hb->type != HTML_BIT_TEXT) { - html->num_end = 0; - html->end_sel = hb; - break; - } - - len = strlen(hb->text); - - for (i=1; i<=len; i++) { - if (gdk_text_measure(hb->font, hb->text, i) > w) { - html->num_end = i - 1; + else if ((x > hb->x && x < (hb->x + hb->width)) && + (y < hb->y && y > (hb->y - hb->height))) + { + int i, + len; + int w = x - hb->x; + + if (hb->type != HTML_BIT_TEXT) + { + html->num_end = 0; html->end_sel = hb; break; } + + len = strlen(hb->text); + + for (i = 1; i <= len; i++) + { + if (gdk_text_measure(hb->font, hb->text, i) > w) + { + html->num_end = i - 1; + html->end_sel = hb; + break; + } + } + break; } - break; + hbits = hbits->prev; } - hbits = hbits->prev; - } if (html->end_sel == NULL) return; - if (html->start_sel == NULL) { + if (html->start_sel == NULL) + { html->start_sel = html->end_sel; html->num_start = html->num_end; } - + epos = g_list_index(html->html_bits, html->end_sel); spos = g_list_index(html->html_bits, html->start_sel); g_free(html->selected_text); html->selected_text = NULL; - if (epos == spos) { + if (epos == spos) + { char *str; - if (html->start_sel->type != HTML_BIT_TEXT) { + if (html->start_sel->type != HTML_BIT_TEXT) + { html->selected_text = NULL; return; } - if (html->num_end == html->num_start) { + if (html->num_end == html->num_start) + { str = g_malloc(2); - if (strlen(html->start_sel->text)) + if (strlen(html->start_sel->text)) str[0] = html->start_sel->text[html->num_end]; else - str[0] = 0; + str[0] = 0; str[1] = 0; gtk_html_draw_bit(html, html->start_sel, 0); html->selected_text = str; - } else { - int st, en; + } + else + { + int st, + en; char *str; - if (html->num_end > html->num_start) { + if (html->num_end > html->num_start) + { en = html->num_end; st = html->num_start; - } else { + } + else + { en = html->num_start; st = html->num_end; } @@ -1040,87 +1127,109 @@ str = g_malloc(en - st + 2); strncpy(str, html->start_sel->text + st, (en - st + 1)); str[en - st + 1] = 0; - gtk_html_draw_bit(html, html->start_sel, 0); + gtk_html_draw_bit(html, html->start_sel, 0); html->selected_text = str; - + } - } else { - GtkHtmlBit *shb, *ehb; - int en, st; - int len, nlen; + } + else + { + GtkHtmlBit *shb, + *ehb; + int en, + st; + int len, + nlen; char *str; - if (epos > spos) { + if (epos > spos) + { shb = html->start_sel; ehb = html->end_sel; en = html->num_end; st = html->num_start; - } else { + } + else + { shb = html->end_sel; ehb = html->start_sel; en = html->num_start; st = html->num_end; } - + hbits = g_list_find(html->html_bits, shb); if (!hbits) return; - - if (shb->type == HTML_BIT_TEXT) { + + if (shb->type == HTML_BIT_TEXT) + { len = strlen(shb->text) - st + 1; str = g_malloc(len); strcpy(str, shb->text + st); str[len - 1] = 0; gtk_html_draw_bit(html, shb, 0); - if (shb->newline) { - len+= 1; + if (shb->newline) + { + len += 1; str = g_realloc(str, len); str[len - 2] = '\n'; str[len - 1] = 0; } - } else { + } + else + { len = 1; str = g_malloc(1); str[0] = 0; } - if (hbits->next == NULL) { + if (hbits->next == NULL) + { html->selected_text = str; return; } - - hbits = hbits->next; - while(1) { /* Yah I know is dangerous :P */ - hb = (GtkHtmlBit *)hbits->data; - if (hb->type != HTML_BIT_TEXT) { + + hbits = hbits->next; + while (1) + { /* + * Yah I know is dangerous :P + */ + hb = (GtkHtmlBit *) hbits->data; + if (hb->type != HTML_BIT_TEXT) + { if (hb == ehb) break; hbits = hbits->next; continue; } - if (hb != ehb) { + if (hb != ehb) + { nlen = len + strlen(hb->text); str = g_realloc(str, nlen); strcpy(str + (len - 1), hb->text); len = nlen; str[len - 1] = 0; gtk_html_draw_bit(html, hb, 0); - if (hb->newline) { - len+= 1; + if (hb->newline) + { + len += 1; str = g_realloc(str, len); str[len - 2] = '\n'; str[len - 1] = 0; } - } else { + } + else + { nlen = len + en + 1; str = g_realloc(str, nlen); strncpy(str + (len - 1), hb->text, en + 1); len = nlen; str[len - 1] = 0; - + gtk_html_draw_bit(html, hb, 0); - if (hb->newline && en == strlen(hb->text)) { - len+= 1; + if (hb->newline && en == strlen(hb->text)) + { + len += 1; str = g_realloc(str, len); str[len - 2] = '\n'; str[len - 1] = 0; @@ -1134,16 +1243,16 @@ } -static gint -scroll_timeout(GtkHtml *html) +static gint scroll_timeout(GtkHtml * html) { - GdkEventMotion event; - gint x, y; - GdkModifierType mask; + GdkEventMotion event; + gint x, + y; + GdkModifierType mask; html->timer = 0; - gdk_window_get_pointer (html->html_area, &x, &y, &mask); - + gdk_window_get_pointer(html->html_area, &x, &y, &mask); + if (mask & GDK_BUTTON1_MASK) { event.is_hint = 0; @@ -1151,7 +1260,7 @@ event.y = y; event.state = mask; - gtk_html_motion_notify (GTK_WIDGET (html), &event); + gtk_html_motion_notify(GTK_WIDGET(html), &event); } return FALSE; @@ -1159,10 +1268,12 @@ } -static gint gtk_html_tooltip_paint_window(GtkHtml *html) +static gint gtk_html_tooltip_paint_window(GtkHtml * html) { GtkStyle *style; - gint y, baseline_skip, gap; + gint y, + baseline_skip, + gap; style = html->tooltip_window->style; @@ -1175,22 +1286,22 @@ return FALSE; gtk_paint_flat_box(style, html->tooltip_window->window, - GTK_STATE_NORMAL, GTK_SHADOW_OUT, - NULL, GTK_WIDGET(html->tooltip_window), "tooltip", - 0, 0, -1, -1); + GTK_STATE_NORMAL, GTK_SHADOW_OUT, + NULL, GTK_WIDGET(html->tooltip_window), "tooltip", + 0, 0, -1, -1); y = style->font->ascent + 4; - gtk_paint_string (style, html->tooltip_window->window, - GTK_STATE_NORMAL, - NULL, GTK_WIDGET(html->tooltip_window), "tooltip", - 4, y, "HTML Link:"); + gtk_paint_string(style, html->tooltip_window->window, + GTK_STATE_NORMAL, + NULL, GTK_WIDGET(html->tooltip_window), "tooltip", + 4, y, "HTML Link:"); y += baseline_skip; - gtk_paint_string (style, html->tooltip_window->window, - GTK_STATE_NORMAL, - NULL, GTK_WIDGET(html->tooltip_window), "tooltip", - 4, y, html->tooltip_hb->url); - + gtk_paint_string(style, html->tooltip_window->window, + GTK_STATE_NORMAL, + NULL, GTK_WIDGET(html->tooltip_window), "tooltip", + 4, y, html->tooltip_hb->url); + return FALSE; @@ -1198,39 +1309,49 @@ static gint gtk_html_tooltip_timeout(gpointer data) { - GtkHtml *html = (GtkHtml *)data; - - + GtkHtml *html = (GtkHtml *) data; + + GDK_THREADS_ENTER(); - if (html->tooltip_hb && GTK_WIDGET_DRAWABLE(GTK_WIDGET(html))) { + if (html->tooltip_hb && GTK_WIDGET_DRAWABLE(GTK_WIDGET(html))) + { GtkWidget *widget; GtkStyle *style; - gint gap, x, y, w, h, scr_w, scr_h, baseline_skip; + gint gap, + x, + y, + w, + h, + scr_w, + scr_h, + baseline_skip; if (html->tooltip_window) gtk_widget_destroy(html->tooltip_window); - - html->tooltip_window = gtk_window_new (GTK_WINDOW_POPUP); - gtk_widget_set_app_paintable (html->tooltip_window, TRUE); - gtk_window_set_policy (GTK_WINDOW (html->tooltip_window), FALSE, FALSE, TRUE); - gtk_widget_set_name (html->tooltip_window, "gtk-tooltips"); - gtk_signal_connect_object (GTK_OBJECT (html->tooltip_window), - "expose_event", - GTK_SIGNAL_FUNC (gtk_html_tooltip_paint_window), - GTK_OBJECT (html)); - gtk_signal_connect_object (GTK_OBJECT (html->tooltip_window), - "draw", - GTK_SIGNAL_FUNC (gtk_html_tooltip_paint_window), - GTK_OBJECT (html)); - - gtk_widget_ensure_style (html->tooltip_window); + + html->tooltip_window = gtk_window_new(GTK_WINDOW_POPUP); + gtk_widget_set_app_paintable(html->tooltip_window, TRUE); + gtk_window_set_policy(GTK_WINDOW(html->tooltip_window), FALSE, FALSE, + TRUE); + gtk_widget_set_name(html->tooltip_window, "gtk-tooltips"); + gtk_signal_connect_object(GTK_OBJECT(html->tooltip_window), + "expose_event", + GTK_SIGNAL_FUNC + (gtk_html_tooltip_paint_window), + GTK_OBJECT(html)); + gtk_signal_connect_object(GTK_OBJECT(html->tooltip_window), "draw", + GTK_SIGNAL_FUNC + (gtk_html_tooltip_paint_window), + GTK_OBJECT(html)); + + gtk_widget_ensure_style(html->tooltip_window); style = html->tooltip_window->style; - + widget = GTK_WIDGET(html); - scr_w = gdk_screen_width (); - scr_h = gdk_screen_height (); + scr_w = gdk_screen_width(); + scr_h = gdk_screen_height(); gap = (style->font->ascent + style->font->descent) / 4; if (gap < 2) @@ -1238,14 +1359,16 @@ baseline_skip = style->font->ascent + style->font->descent + gap; w = 8 + MAX(gdk_string_width(style->font, "HTML Link:"), - gdk_string_width(style->font, html->tooltip_hb->url)); - ; + gdk_string_width(style->font, html->tooltip_hb->url)); + ; h = 8 - gap; - h += (baseline_skip * 2); - - gdk_window_get_pointer (NULL, &x, &y, NULL); - /*gdk_window_get_origin (widget->window, NULL, &y);*/ - if (GTK_WIDGET_NO_WINDOW (widget)) + h += (baseline_skip * 2); + + gdk_window_get_pointer(NULL, &x, &y, NULL); + /* + * gdk_window_get_origin (widget->window, NULL, &y); + */ + if (GTK_WIDGET_NO_WINDOW(widget)) y += widget->allocation.y; x -= ((w >> 1) + 4); @@ -1256,102 +1379,116 @@ x = 0; if ((y + h + 4) > scr_h) - y = y - html->tooltip_hb->font->ascent + html->tooltip_hb->font->descent; + y = + y - html->tooltip_hb->font->ascent + + html->tooltip_hb->font->descent; else - y = y + html->tooltip_hb->font->ascent + html->tooltip_hb->font->descent; - - gtk_widget_set_usize (html->tooltip_window, w, h); - gtk_widget_popup (html->tooltip_window, x, y); - + y = + y + html->tooltip_hb->font->ascent + + html->tooltip_hb->font->descent; + + gtk_widget_set_usize(html->tooltip_window, w, h); + gtk_widget_popup(html->tooltip_window, x, y); + } html->tooltip_timer = -1; - + GDK_THREADS_LEAVE(); return FALSE; } -static gint gtk_html_leave_notify (GtkWidget *widget, - GdkEventCrossing *event) +static gint gtk_html_leave_notify(GtkWidget * widget, GdkEventCrossing * event) { - GtkHtml *html; - - html = GTK_HTML(widget); - - if (html->tooltip_timer != -1) - gtk_timeout_remove(html->tooltip_timer); - if (html->tooltip_window) { - gtk_widget_destroy(html->tooltip_window); - html->tooltip_window = NULL; - } - - - html->tooltip_hb = NULL; - return TRUE; + GtkHtml *html; + + html = GTK_HTML(widget); + + if (html->tooltip_timer != -1) + gtk_timeout_remove(html->tooltip_timer); + if (html->tooltip_window) + { + gtk_widget_destroy(html->tooltip_window); + html->tooltip_window = NULL; + } + + + html->tooltip_hb = NULL; + return TRUE; } -static gint gtk_html_motion_notify (GtkWidget *widget, - GdkEventMotion *event) +static gint gtk_html_motion_notify(GtkWidget * widget, GdkEventMotion * event) { - int x, y; - gint width, height; - GdkModifierType state; - int realx, realy; - GtkHtml *html = GTK_HTML(widget); - - if (event->is_hint) - gdk_window_get_pointer (event->window, &x, &y, &state); - else - { - x = event->x; - y = event->y; - state = event->state; - } - - gdk_window_get_size(html->html_area, &width, &height); - + int x, + y; + gint width, + height; + GdkModifierType state; + int realx, + realy; + GtkHtml *html = GTK_HTML(widget); + + if (event->is_hint) + gdk_window_get_pointer(event->window, &x, &y, &state); + else + { + x = event->x; + y = event->y; + state = event->state; + } + + gdk_window_get_size(html->html_area, &width, &height); + realx = x; realy = y + html->yoffset; - if (state & GDK_BUTTON1_MASK) { - if (realx != html->start_sel_x || realy != html->start_sel_y) { + if (state & GDK_BUTTON1_MASK) + { + if (realx != html->start_sel_x || realy != html->start_sel_y) + { char *tmp = NULL; - if (y < 0 || y > height) { + if (y < 0 || y > height) + { int diff; - if (html->timer == 0) { + if (html->timer == 0) + { html->timer = gtk_timeout_add(100, - (GtkFunction)scroll_timeout, - html); + (GtkFunction) scroll_timeout, + html); if (y < 0) diff = y / 2; else diff = (y - height) / 2; if (html->vadj->value + diff > - html->vadj->upper - height + 20) + html->vadj->upper - height + 20) gtk_adjustment_set_value(html->vadj, - html->vadj->upper - height + 20); + html->vadj->upper - height + + 20); else gtk_adjustment_set_value(html->vadj, - html->vadj->value + diff); + html->vadj->value + diff); } } - + if (html->selected_text != NULL) tmp = g_strdup(html->selected_text); do_select(html, realx, realy); - if (tmp) { - if (!html->selected_text || strcmp(tmp, html->selected_text)) { + if (tmp) + { + if (!html->selected_text || strcmp(tmp, html->selected_text)) + { GtkHtmlBit *hb; GList *hbits = html->html_bits; - while(hbits) { - hb = (GtkHtmlBit *)hbits->data; + while (hbits) + { + hb = (GtkHtmlBit *) hbits->data; if (hb->was_selected) gtk_html_draw_bit(html, hb, 0); hbits = hbits->next; @@ -1360,39 +1497,49 @@ g_free(tmp); } } - } else { + } + else + { GtkHtmlBit *hb; GList *urls; urls = html->urls; - while(urls) { - hb = (GtkHtmlBit *)urls->data; + while (urls) + { + hb = (GtkHtmlBit *) urls->data; if ((realx > hb->x && realx < (hb->x + hb->width)) && - (realy < hb->y && realy > (hb->y - hb->height))) { - if (html->tooltip_hb != hb) { + (realy < hb->y && realy > (hb->y - hb->height))) + { + if (html->tooltip_hb != hb) + { html->tooltip_hb = hb; if (html->tooltip_timer != -1) gtk_timeout_remove(html->tooltip_timer); - if (html->tooltip_window) { + if (html->tooltip_window) + { gtk_widget_destroy(html->tooltip_window); html->tooltip_window = NULL; } - html->tooltip_timer = gtk_timeout_add(HTML_TOOLTIP_DELAY, gtk_html_tooltip_timeout, html); + html->tooltip_timer = + gtk_timeout_add(HTML_TOOLTIP_DELAY, + gtk_html_tooltip_timeout, html); } - gdk_window_set_cursor(html->html_area, gdk_cursor_new(GDK_HAND2)); + gdk_window_set_cursor(html->html_area, + gdk_cursor_new(GDK_HAND2)); return TRUE; } - urls = urls->next; + urls = urls->next; } if (html->tooltip_timer != -1) gtk_timeout_remove(html->tooltip_timer); - if (html->tooltip_window) { + if (html->tooltip_window) + { gtk_widget_destroy(html->tooltip_window); html->tooltip_window = NULL; } - - - html->tooltip_hb = NULL; + + + html->tooltip_hb = NULL; gdk_window_set_cursor(html->html_area, NULL); @@ -1401,44 +1548,52 @@ return TRUE; } -static gint gtk_html_button_release (GtkWidget *widget, - GdkEventButton *event) +static gint gtk_html_button_release(GtkWidget * widget, GdkEventButton * event) { - GtkHtml *html; - - html = GTK_HTML(widget); - - if (html->frozen > 0) - return TRUE; - - if (event->button == 1) { - int realx, realy; - GtkHtmlBit *hb; - GList *urls = html->urls; - - realx = event->x; - realy = event->y + html->yoffset; - if (realx != html->start_sel_x || realy != html->start_sel_y) { - if (gtk_selection_owner_set (widget, - GDK_SELECTION_PRIMARY, - event->time)) { - } else { - } - } else { - if (gdk_selection_owner_get(GDK_SELECTION_PRIMARY) == widget->window) + GtkHtml *html; + + html = GTK_HTML(widget); + + if (html->frozen > 0) + return TRUE; + + if (event->button == 1) + { + int realx, + realy; + GtkHtmlBit *hb; + GList *urls = html->urls; + + realx = event->x; + realy = event->y + html->yoffset; + if (realx != html->start_sel_x || realy != html->start_sel_y) + { + if (gtk_selection_owner_set(widget, + GDK_SELECTION_PRIMARY, event->time)) + { + } + else + { + } + } + else + { + if (gdk_selection_owner_get(GDK_SELECTION_PRIMARY) == + widget->window) gtk_selection_owner_set(NULL, GDK_SELECTION_PRIMARY, - event->time); - - - while(urls) { - hb = (GtkHtmlBit *)urls->data; + event->time); + + + while (urls) + { + void open_url_nw(GtkWidget * w, char *url); + hb = (GtkHtmlBit *) urls->data; if ((realx > hb->x && realx < (hb->x + hb->width)) && - (realy < hb->y && realy > (hb->y - hb->height))) { - if (web_browser == BROWSER_NETSCAPE && - (general_options & OPT_GEN_BROWSER_POPUP)) - open_url_nw(NULL, hb->url); - else - open_url(NULL, hb->url); + (realy < hb->y && realy > (hb->y - hb->height))) + { + open_url_nw(NULL, hb->url); + // else + // open_url(NULL, hb->url); break; } urls = urls->next; @@ -1450,35 +1605,38 @@ -static gint gtk_html_button_press (GtkWidget *widget, - GdkEventButton *event) +static gint gtk_html_button_press(GtkWidget * widget, GdkEventButton * event) { - GtkHtml *html; - gfloat value; - - - html = GTK_HTML(widget); - value = html->vadj->value; - - if (html->frozen > 0) - return TRUE; - - if (event->button == 4) { + GtkHtml *html; + gfloat value; + + + html = GTK_HTML(widget); + value = html->vadj->value; + + if (html->frozen > 0) + return TRUE; + + if (event->button == 4) + { value -= html->vadj->step_increment; if (value < html->vadj->lower) value = html->vadj->lower; - gtk_adjustment_set_value(html->vadj, - value); - } else if (event->button == 5) { + gtk_adjustment_set_value(html->vadj, value); + } + else if (event->button == 5) + { value += html->vadj->step_increment; if (value > html->vadj->upper) value = html->vadj->upper; - gtk_adjustment_set_value(html->vadj, - value); - - } else if (event->button == 1) { - GList *hbits = g_list_last(html->html_bits); - int realx, realy; + gtk_adjustment_set_value(html->vadj, value); + + } + else if (event->button == 1) + { + GList *hbits = g_list_last(html->html_bits); + int realx, + realy; GtkHtmlBit *hb; realx = event->x; @@ -1490,15 +1648,17 @@ if (!hbits) return TRUE; - if (html->selected_text) { + if (html->selected_text) + { g_free(html->selected_text); html->selected_text = NULL; html->start_sel = NULL; html->end_sel = NULL; html->num_start = 0; html->num_end = 0; - while(hbits) { - hb = (GtkHtmlBit *)hbits->data; + while (hbits) + { + hb = (GtkHtmlBit *) hbits->data; if (hb->was_selected) gtk_html_draw_bit(html, hb, 1); hbits = hbits->prev; @@ -1506,242 +1666,297 @@ hbits = g_list_last(html->html_bits); } - hb = (GtkHtmlBit *)hbits->data; - if (realy > hb->y) { + hb = (GtkHtmlBit *) hbits->data; + if (realy > hb->y) + { if (hb->text) html->num_start = strlen(hb->text) - 1; else - html->num_start = 0; + html->num_start = 0; html->start_sel = hb; - } else while(hbits) { - hb = (GtkHtmlBit *)hbits->data; - if ((realy < hb->y && realy > (hb->y - hb->height)) && - (realx > hb->x + hb->width)) { - if (hb->type != HTML_BIT_TEXT) { - html->num_end = 0; - html->end_sel = hb; + } + else + while (hbits) + { + hb = (GtkHtmlBit *) hbits->data; + if ((realy < hb->y && realy > (hb->y - hb->height)) && + (realx > hb->x + hb->width)) + { + if (hb->type != HTML_BIT_TEXT) + { + html->num_end = 0; + html->end_sel = hb; + break; + } + + if (hb->text) + html->num_start = strlen(hb->text) - 1; + else + html->num_start = 0; + + html->start_sel = hb; break; } - - if (hb->text) - html->num_start = strlen(hb->text) - 1; - else - html->num_start = 0; - - html->start_sel = hb; - break; - } else if ((realx > hb->x && realx < (hb->x + hb->width)) && - (realy < hb->y && realy > (hb->y - hb->height))) { - int i, len; - int w = realx - hb->x; - - if (hb->type != HTML_BIT_TEXT) { - html->num_end = 0; - html->end_sel = hb; + else if ((realx > hb->x && realx < (hb->x + hb->width)) && + (realy < hb->y && realy > (hb->y - hb->height))) + { + int i, + len; + int w = realx - hb->x; + + if (hb->type != HTML_BIT_TEXT) + { + html->num_end = 0; + html->end_sel = hb; + break; + } + + if (hb->text) + len = strlen(hb->text); + else + len = 0; + + for (i = 1; i <= len; i++) + { + if (gdk_text_measure(hb->font, hb->text, i) > w) + { + html->num_start = i - 1; + html->start_sel = hb; + break; + } + } break; } - - if (hb->text) - len = strlen(hb->text); - else - len = 0; - - for (i=1; i<=len; i++) { - if (gdk_text_measure(hb->font, hb->text, i) > w) { - html->num_start = i - 1; - html->start_sel = hb; - break; - } - } - break; + hbits = hbits->prev; } - hbits = hbits->prev; - } - } else if (event->button == 3 && event->type == GDK_BUTTON_PRESS) { + } + else if (event->button == 3 && event->type == GDK_BUTTON_PRESS) + { GtkHtmlBit *hb = NULL; - int realx, realy; - GList *urls; - + int realx, + realy; + GList *urls; + realx = event->x; realy = event->y + html->yoffset; - + urls = html->urls; - while(urls) { - hb = (GtkHtmlBit *)urls->data; + while (urls) + { + hb = (GtkHtmlBit *) urls->data; if ((realx > hb->x && realx < (hb->x + hb->width)) && - (realy < hb->y && realy > (hb->y - hb->height))) { + (realy < hb->y && realy > (hb->y - hb->height))) + { break; } - urls = urls->next; + urls = urls->next; hb = NULL; } - - if (hb != NULL) { - GtkWidget *menu, *button; - - menu = gtk_menu_new(); - - if (web_browser == BROWSER_NETSCAPE) { - - button = gtk_menu_item_new_with_label("Open URL in existing window"); - gtk_signal_connect(GTK_OBJECT(button), "activate", - GTK_SIGNAL_FUNC(open_url), hb->url); - gtk_menu_append(GTK_MENU(menu), button); - gtk_widget_show(button); - - } - - - button = gtk_menu_item_new_with_label("Open URL in new window"); - gtk_signal_connect(GTK_OBJECT(button), "activate", - GTK_SIGNAL_FUNC(open_url_nw), hb->url); - gtk_menu_append(GTK_MENU(menu), button); - gtk_widget_show(button); - - if (web_browser == BROWSER_NETSCAPE) { - - button = gtk_menu_item_new_with_label("Add URL as bookmark"); - gtk_signal_connect(GTK_OBJECT(button), "activate", - GTK_SIGNAL_FUNC(add_bookmark), hb->url); - gtk_menu_append(GTK_MENU(menu), button); - gtk_widget_show(button); - - } - - gtk_menu_popup(GTK_MENU(menu), NULL, NULL, NULL, NULL, - event->button, event->time); - } + + if (hb != NULL) + { + /* + * GtkWidget *menu, *button; + * + * menu = gtk_menu_new(); + * + * if (web_browser == BROWSER_NETSCAPE) { + * + * button = gtk_menu_item_new_with_label("Open URL in existing window"); + * gtk_signal_connect(GTK_OBJECT(button), "activate", + * GTK_SIGNAL_FUNC(open_url), hb->url); + * gtk_menu_append(GTK_MENU(menu), button); + * gtk_widget_show(button); + * + * } + * + * + * button = gtk_menu_item_new_with_label("Open URL in new window"); + * gtk_signal_connect(GTK_OBJECT(button), "activate", + * GTK_SIGNAL_FUNC(open_url_nw), hb->url); + * gtk_menu_append(GTK_MENU(menu), button); + * gtk_widget_show(button); + * + * if (web_browser == BROWSER_NETSCAPE) { + * + * button = gtk_menu_item_new_with_label("Add URL as bookmark"); + * gtk_signal_connect(GTK_OBJECT(button), "activate", + * GTK_SIGNAL_FUNC(add_bookmark), hb->url); + * gtk_menu_append(GTK_MENU(menu), button); + * gtk_widget_show(button); + * + * } + * + * gtk_menu_popup(GTK_MENU(menu), NULL, NULL, NULL, NULL, + * event->button, event->time); + */ + } } - + return TRUE; } -static void gtk_html_draw_bit(GtkHtml *html, - GtkHtmlBit *hb, - int redraw) +static void gtk_html_draw_bit(GtkHtml * html, GtkHtmlBit * hb, int redraw) { - int mypos, epos, spos; - GdkGC *gc = html->gc; + int mypos, + epos, + spos; + GdkGC *gc = html->gc; int shift; - GtkStateType selected_state; - GtkWidget *widget = GTK_WIDGET(html); + GtkStateType selected_state; + GtkWidget *widget = GTK_WIDGET(html); GdkRectangle area; if (html->frozen > 0) return; - if (hb->type == HTML_BIT_TEXT) { + if (hb->type == HTML_BIT_TEXT) + { if (!strlen(hb->text)) return; - + mypos = g_list_index(html->html_bits, hb); epos = g_list_index(html->html_bits, html->end_sel); spos = g_list_index(html->html_bits, html->start_sel); - if (((html->end_sel == NULL) || (html->start_sel == NULL)) || - ((epos < mypos) && (spos < mypos)) || - ((epos > mypos) && (spos > mypos))) { - selected_state = GTK_STATE_NORMAL; - } else { + if (((html->end_sel == NULL) || (html->start_sel == NULL)) || + ((epos < mypos) && (spos < mypos)) || + ((epos > mypos) && (spos > mypos))) + { + selected_state = GTK_STATE_NORMAL; + } + else + { selected_state = GTK_STATE_SELECTED; } gdk_text_extents(hb->font, hb->text, 1, &shift, NULL, NULL, NULL, NULL); - if (selected_state == GTK_STATE_SELECTED) { - int schar = 0, echar = 0; - int startx = 0, xwidth = 0; - - if (epos > spos || - (epos == spos && html->num_end >= html->num_start)) { - if (mypos == epos) { + if (selected_state == GTK_STATE_SELECTED) + { + int schar = 0, + echar = 0; + int startx = 0, + xwidth = 0; + + if (epos > spos || + (epos == spos && html->num_end >= html->num_start)) + { + if (mypos == epos) + { echar = html->num_end; - xwidth = gdk_text_measure(hb->font, hb->text, html->num_end + 1); - } else { + xwidth = + gdk_text_width(hb->font, hb->text, html->num_end + 1); + } + else + { echar = strlen(hb->text); xwidth = hb->width; } - if (mypos == spos) { + if (mypos == spos) + { schar = html->num_start; - startx = gdk_text_measure(hb->font, hb->text, html->num_start); + startx = + gdk_text_width(hb->font, hb->text, html->num_start); xwidth -= startx; } - } else { - if (mypos == spos) { + } + else + { + if (mypos == spos) + { echar = html->num_start; - xwidth = gdk_text_measure(hb->font, hb->text, html->num_start + 1); - } else { + xwidth = + gdk_text_width(hb->font, hb->text, + html->num_start + 1); + } + else + { echar = strlen(hb->text); xwidth = hb->width; } - if (mypos == epos) { + if (mypos == epos) + { schar = html->num_end; - startx = gdk_text_measure(hb->font, hb->text, html->num_end); + startx = + gdk_text_width(hb->font, hb->text, html->num_end); xwidth -= startx; } } if (!redraw && echar == hb->sel_e && schar == hb->sel_s) return; - + hb->sel_e = echar; hb->sel_s = schar; - + startx += hb->x; - area.x = hb->x - html->xoffset; - area.y = hb->y - hb->height + 3 - html->yoffset; - area.width = hb->width+2; - area.height = hb->height; - clear_area (html, &area); - - gtk_paint_flat_box (widget->style, html->html_area, - selected_state, GTK_SHADOW_NONE, - NULL, widget, "text", - startx, - hb->y - hb->height + 3 - html->yoffset, - xwidth+2, hb->height); - hb->was_selected = 1; - } else if (hb->was_selected) { - area.x = hb->x - html->xoffset; - area.y = hb->y - hb->height + 3 - html->yoffset; - area.width = hb->width+2; - area.height = hb->height; - clear_area (html, &area); - - hb->sel_e = -1; - hb->sel_s = -1; - + area.x = hb->x - html->xoffset; + area.y = hb->y - hb->height + 3 - html->yoffset; + area.width = hb->width + 2; + area.height = hb->height; + clear_area(html, &area); + + gtk_paint_flat_box(widget->style, html->html_area, + selected_state, GTK_SHADOW_NONE, + NULL, widget, "text", + startx, + hb->y - hb->height + 3 - html->yoffset, + xwidth + 2, hb->height); + hb->was_selected = 1; + } + else if (hb->was_selected) + { + area.x = hb->x - html->xoffset; + area.y = hb->y - hb->height + 3 - html->yoffset; + area.width = hb->width + 2; + area.height = hb->height; + clear_area(html, &area); + + hb->sel_e = -1; + hb->sel_s = -1; + hb->was_selected = 0; } - - - - - if (selected_state == GTK_STATE_SELECTED && (mypos == epos - || mypos == spos)) { + + + + + if (selected_state == GTK_STATE_SELECTED && (mypos == epos + || mypos == spos)) + { char *s = hb->text; - int num = 0, width = 0, fsel = 0, esel = strlen(hb->text); - int lbearing, rbearing, w; - - if (epos > spos || - (epos == spos && html->num_end >= html->num_start)) { + int num = 0, + width = 0, + fsel = 0, + esel = strlen(hb->text); + int lbearing, + rbearing, + w; + + if (epos > spos || + (epos == spos && html->num_end >= html->num_start)) + { if (mypos == epos) esel = html->num_end; if (mypos == spos) fsel = html->num_start; - } else { + } + else + { if (mypos == spos) esel = html->num_start; - if (mypos == epos) - fsel = html->num_end; + if (mypos == epos) + fsel = html->num_end; } - while(*s) { + while (*s) + { if (num < fsel || num > esel) selected_state = GTK_STATE_NORMAL; @@ -1750,38 +1965,64 @@ if (hb->fore != NULL) gdk_gc_set_foreground(gc, hb->fore); else - gdk_gc_set_foreground(gc, &widget->style->text[selected_state]); + gdk_gc_set_foreground(gc, + &widget->style->fg[selected_state]); if (hb->back != NULL) gdk_gc_set_background(gc, hb->back); else - gdk_gc_set_background(gc, &widget->style->bg[selected_state]); + gdk_gc_set_background(gc, + &widget->style->bg[selected_state]); gdk_gc_set_font(gc, hb->font); - gdk_text_extents(hb->font, s, 1, &lbearing, &rbearing, &w, NULL, NULL); - - gdk_draw_text(html->html_area, hb->font, gc, shift + hb->x + width, hb->y - html->yoffset, s, 1); - - if (hb->uline) - gdk_draw_line(html->html_area, gc, shift + hb->x + width, hb->y - html->yoffset, shift + hb->x + width + w, hb->y - html->yoffset); + gdk_text_extents(hb->font, s, 1, &lbearing, &rbearing, &w, NULL, + NULL); + + gdk_draw_text(html->html_area, hb->font, gc, + shift + hb->x + width, hb->y - html->yoffset, s, + 1); + + if (hb->uline) + gdk_draw_line(html->html_area, gc, shift + hb->x + width, + hb->y - html->yoffset, + shift + hb->x + width + w, + hb->y - html->yoffset); if (hb->strike) - gdk_draw_line(html->html_area, gc, shift + hb->x + width, hb->y - html->yoffset - (hb->height / 3), shift + hb->x + width + w, hb->y - html->yoffset - (hb->height / 3)); + gdk_draw_line(html->html_area, gc, shift + hb->x + width, + hb->y - html->yoffset - (hb->height / 3), + shift + hb->x + width + w, + hb->y - html->yoffset - (hb->height / 3)); width += w; - + s++; num++; } - } else { + } + else + { + /*my stuff here*/ + + if(!hb->was_selected) + { + area.x = hb->x - html->xoffset; + area.y = hb->y - hb->height + 3 - html->yoffset; + area.width = hb->width + 2; + area.height = hb->height; + clear_area(html, &area); + } + + /*end my stuff*/ + if (hb->fore != NULL) gdk_gc_set_foreground(gc, hb->fore); else - gdk_gc_set_foreground(gc, &widget->style->text[selected_state]); + gdk_gc_set_foreground(gc, &widget->style->fg[selected_state]); if (hb->back != NULL) gdk_gc_set_background(gc, hb->back); else @@ -1790,135 +2031,176 @@ gdk_gc_set_font(gc, hb->font); - gdk_draw_string(html->html_area, hb->font, gc, shift + hb->x , hb->y - html->yoffset, hb->text); + + gdk_draw_string(html->html_area, hb->font, gc, shift + hb->x, + hb->y - html->yoffset, hb->text); if (hb->uline) - gdk_draw_line(html->html_area, gc, shift + hb->x , hb->y - html->yoffset, hb->x + gdk_string_measure(hb->font, hb->text), hb->y - html->yoffset); + gdk_draw_line(html->html_area, gc, shift + hb->x, + hb->y - html->yoffset, + hb->x + gdk_string_measure(hb->font, hb->text), + hb->y - html->yoffset); if (hb->strike) - gdk_draw_line(html->html_area, gc, shift + hb->x , hb->y - html->yoffset - (hb->height / 3), hb->x + gdk_string_measure(hb->font, hb->text), hb->y - html->yoffset - (hb->height / 3)); + gdk_draw_line(html->html_area, gc, shift + hb->x, + hb->y - html->yoffset - (hb->height / 3), + hb->x + gdk_string_measure(hb->font, hb->text), + hb->y - html->yoffset - (hb->height / 3)); } - } else if (hb->type == HTML_BIT_SEP) { - - gdk_draw_line(html->html_area, gc, hb->x + 2 , hb->y - html->yoffset - (hb->height / 2 - 1), hb->x + hb->width, hb->y - html->yoffset - (hb->height / 2 - 1)); - - } else if (hb->type == HTML_BIT_PIXMAP) { + } + else if (hb->type == HTML_BIT_SEP) + { + + gdk_draw_line(html->html_area, gc, hb->x + 2, + hb->y - html->yoffset - (hb->height / 2 - 1), + hb->x + hb->width, + hb->y - html->yoffset - (hb->height / 2 - 1)); + + } + else if (hb->type == HTML_BIT_PIXMAP) + { gdk_gc_set_background(gc, &widget->style->base[GTK_STATE_NORMAL]); - gdk_draw_pixmap(html->html_area, gc, hb->pm, 0, 0, hb->x , hb->y - html->yoffset - (hb->height) + 4, hb->width, hb->height - 2); + gdk_draw_pixmap(html->html_area, gc, hb->pm, 0, 0, hb->x, + hb->y - html->yoffset - (hb->height) + 4, hb->width, + hb->height - 2); } } -gint compare_types(GtkHtmlBit *hb, GtkHtmlBit *hb2) +gint compare_types(GtkHtmlBit * hb, GtkHtmlBit * hb2) { - /* In this function, it's OK to accidently return a - * 0, but will cause problems on an accidental 1 */ + /* + * In this function, it's OK to accidently return a + * * 0, but will cause problems on an accidental 1 + */ if (!hb || !hb2) return 0; - - + + if (hb->uline != hb2->uline) return 0; if (hb->strike != hb2->strike) - return 0; - if (hb->font && hb2->font) { + return 0; + if (hb->font && hb2->font) + { if (!gdk_font_equal(hb->font, hb2->font)) return 0; - } else if (hb->font && !hb2->font) { + } + else if (hb->font && !hb2->font) + { return 0; - } else if (!hb->font && hb2->font) { + } + else if (!hb->font && hb2->font) + { return 0; } if (hb->type != hb2->type) return 0; - - if (hb->fore && hb2->fore) { + + if (hb->fore && hb2->fore) + { if (!gdk_color_equal(hb->fore, hb2->fore)) return 0; - } else if (hb->fore && !hb2->fore) { + } + else if (hb->fore && !hb2->fore) + { return 0; - } else if (!hb->fore && hb2->fore) { + } + else if (!hb->fore && hb2->fore) + { return 0; } - if (hb->back && hb2->back) { + if (hb->back && hb2->back) + { if (!gdk_color_equal(hb->back, hb2->back)) return 0; - } else if (hb->back && !hb2->back) { + } + else if (hb->back && !hb2->back) + { return 0; - } else if (!hb->back && hb2->back) { + } + else if (!hb->back && hb2->back) + { return 0; } if ((hb->url != NULL && hb2->url == NULL) || - (hb->url == NULL && hb2->url != NULL)) + (hb->url == NULL && hb2->url != NULL)) return 0; - - if (hb->url != NULL && hb2->url != NULL) + + if (hb->url != NULL && hb2->url != NULL) if (strcasecmp(hb->url, hb2->url)) return 0; - + return 1; } -static gint html_bit_is_onscreen(GtkHtml *html, GtkHtmlBit *hb) +static gint html_bit_is_onscreen(GtkHtml * html, GtkHtmlBit * hb) { - gint width, height; + gint width, + height; gdk_window_get_size(html->html_area, &width, &height); - - if (hb->y < html->yoffset) { + + if (hb->y < html->yoffset) + { return 0; } - if ((hb->y - hb->height) > (html->yoffset + height)) { + if ((hb->y - hb->height) > (html->yoffset + height)) + { return 0; } return 1; } -static void draw_cursor(GtkHtml *html) +static void draw_cursor(GtkHtml * html) { - if ( - html->editable && - html->cursor_hb && - GTK_WIDGET_DRAWABLE(html) && - html_bit_is_onscreen(html, html->cursor_hb)) { - gint x, y; + if (html->editable && + html->cursor_hb && + GTK_WIDGET_DRAWABLE(html) && + html_bit_is_onscreen(html, html->cursor_hb)) + { + gint x, + y; gint width; GdkFont *font = html->cursor_hb->font; - gdk_text_extents(font, html->cursor_hb->text, html->cursor_pos, NULL, NULL, &width, NULL, NULL); - - gdk_gc_set_foreground(html->gc, >K_WIDGET(html)->style->text[GTK_STATE_NORMAL]); + gdk_text_extents(font, html->cursor_hb->text, html->cursor_pos, NULL, + NULL, &width, NULL, NULL); + + gdk_gc_set_foreground(html->gc, + >K_WIDGET(html)->style->text[GTK_STATE_NORMAL]); y = html->cursor_hb->y - html->yoffset; x = html->cursor_hb->x + width; - gdk_draw_line (html->html_area, html->gc, x, - y, x, y - font->ascent); + gdk_draw_line(html->html_area, html->gc, x, y, x, y - font->ascent); } } -static void undraw_cursor(GtkHtml *html) +static void undraw_cursor(GtkHtml * html) { - if ( - html->editable && - html->cursor_hb && - GTK_WIDGET_DRAWABLE(html) && - html_bit_is_onscreen(html, html->cursor_hb)) { - gint x, y; + if (html->editable && + html->cursor_hb && + GTK_WIDGET_DRAWABLE(html) && + html_bit_is_onscreen(html, html->cursor_hb)) + { + gint x, + y; gint width; - GdkRectangle area; - + GdkRectangle area; + GdkFont *font = html->cursor_hb->font; - gdk_text_extents(font, html->cursor_hb->text, html->cursor_pos, NULL, NULL, &width, NULL, NULL); + gdk_text_extents(font, html->cursor_hb->text, html->cursor_pos, NULL, + NULL, &width, NULL, NULL); y = html->cursor_hb->y - html->yoffset; x = html->cursor_hb->x + width; @@ -1929,74 +2211,77 @@ area.width = 1; - clear_area (html, &area); + clear_area(html, &area); gtk_html_draw_bit(html, html->cursor_hb, 1); - - - } + + + } } -static void expose_html(GtkHtml *html, - GdkRectangle *area, - gboolean cursor) +static void expose_html(GtkHtml * html, GdkRectangle * area, gboolean cursor) { - GList *hbits; - GtkHtmlBit *hb; - gint width, height; - gint realy; - - - if (html->frozen > 0) - return; - - - hbits = html->html_bits; + GList *hbits; + GtkHtmlBit *hb; + gint width, + height; + gint realy; + + + if (html->frozen > 0) + return; + + + hbits = html->html_bits; gdk_window_get_size(html->html_area, &width, &height); - realy = area->y + html->yoffset; - - clear_area (html, area); - - while(hbits) { - - hb = (GtkHtmlBit *)hbits->data; + realy = area->y + html->yoffset; + + clear_area(html, area); + + while (hbits) + { + + hb = (GtkHtmlBit *) hbits->data; if (html_bit_is_onscreen(html, hb)) - gtk_html_draw_bit(html, hb, 1); - - - hbits = hbits->next; - } + gtk_html_draw_bit(html, hb, 1); + + + hbits = hbits->next; + } } -static void resize_html(GtkHtml *html) +static void resize_html(GtkHtml * html) { GList *hbits = html->html_bits; GList *html_bits = html->html_bits; - GtkHtmlBit *hb, *hb2; + GtkHtmlBit *hb, + *hb2; char *str; gint height; - if(!hbits) - return; - - - html->html_bits = NULL; - - html->current_x = 0; + if (!hbits) + return; + + + html->html_bits = NULL; + + html->current_x = 0; html->current_y = 0; - html->vadj->upper = 0; - - gtk_html_freeze(html); - - while(hbits) { - hb = (GtkHtmlBit *)hbits->data; - if (hb->type == HTML_BIT_SEP) { - + html->vadj->upper = 0; + + gtk_html_freeze(html); + + while (hbits) + { + hb = (GtkHtmlBit *) hbits->data; + if (hb->type == HTML_BIT_SEP) + { + gtk_html_add_seperator(html); g_free(hb); @@ -2004,7 +2289,8 @@ hbits = hbits->next; continue; } - if (hb->type == HTML_BIT_PIXMAP) { + if (hb->type == HTML_BIT_PIXMAP) + { gtk_html_add_pixmap(html, hb->pm, hb->fit); @@ -2013,42 +2299,54 @@ hbits = hbits->next; continue; } - - if (hb->newline) { + + if (hb->newline) + { int i; - if (!hb->text) { + if (!hb->text) + { hb->text = g_malloc(1); hb->text[0] = 0; } - for (i=0; i<hb->newline; i++) { - str = hb->text; + for (i = 0; i < hb->newline; i++) + { + str = hb->text; hb->text = g_strconcat(str, "\n", NULL); g_free(str); } } - if (hbits->next) { - hb2 = (GtkHtmlBit *)hbits->next->data; - } else { - hb2 = NULL; - } - - - - if (!hb->newline && compare_types(hb, hb2)) { + if (hbits->next) + { + hb2 = (GtkHtmlBit *) hbits->next->data; + } + else + { + hb2 = NULL; + } + + + + if (!hb->newline && compare_types(hb, hb2)) + { str = hb2->text; hb2->text = g_strconcat(hb->text, hb2->text, NULL); g_free(str); hb2 = NULL; - } else if (hb->text) { + } + else if (hb->text) + { gtk_html_add_text(html, hb->font, hb->fore, hb->back, - hb->text, strlen(hb->text), hb->uline, hb->strike, hb->url); + hb->text, strlen(hb->text), hb->uline, hb->strike, + hb->url); } - - - /* Font stays, so do colors (segfaults if I free) */ + + + /* + * Font stays, so do colors (segfaults if I free) + */ if (hb->fore) gdk_color_free(hb->fore); if (hb->back) @@ -2058,299 +2356,318 @@ if (hb->url) g_free(hb->url); - g_free(hb); + g_free(hb); hbits = hbits->next; } - g_list_free(html_bits); - - - gtk_html_thaw(html); - + g_list_free(html_bits); + + + gtk_html_thaw(html); + gdk_window_get_size(html->html_area, NULL, &height); - gtk_adjustment_set_value(html->vadj, html->vadj->upper - height); + gtk_adjustment_set_value(html->vadj, html->vadj->upper - height); } -static GdkGC *create_bg_gc (GtkHtml *html) +static GdkGC *create_bg_gc(GtkHtml * html) { - GdkGCValues values; - - values.tile = GTK_WIDGET (html)->style->bg_pixmap[GTK_STATE_NORMAL]; - values.fill = GDK_TILED; - - return gdk_gc_new_with_values (html->html_area, &values, - GDK_GC_FILL | GDK_GC_TILE); + GdkGCValues values; + + values.tile = GTK_WIDGET(html)->style->bg_pixmap[GTK_STATE_NORMAL]; + values.fill = GDK_TILED; + + return gdk_gc_new_with_values(html->html_area, &values, + GDK_GC_FILL | GDK_GC_TILE); } -static void clear_area (GtkHtml *html, - GdkRectangle *area) +static void clear_area(GtkHtml * html, GdkRectangle * area) { - GtkWidget *widget = GTK_WIDGET (html); - gint x, y; - - - if (html->transparent) { + GtkWidget *widget = GTK_WIDGET(html); + gint x, + y; + + + if (html->transparent) + { if (html->pm == NULL) html->pm = get_desktop_pixmap(widget); - if (html->pm == NULL) - return; - - if (html->bg_gc == NULL) { - GdkGCValues values; - - values.tile = html->pm; - values.fill = GDK_TILED; - - html->bg_gc = gdk_gc_new_with_values (html->html_area, &values, - GDK_GC_FILL | GDK_GC_TILE); - - } - + if (html->pm == NULL) + return; + + if (html->bg_gc == NULL) + { + GdkGCValues values; + + values.tile = html->pm; + values.fill = GDK_TILED; + + html->bg_gc = gdk_gc_new_with_values(html->html_area, &values, + GDK_GC_FILL | GDK_GC_TILE); + + } + gdk_window_get_deskrelative_origin(html->html_area, &x, &y); - gdk_draw_pixmap(html->html_area, html->bg_gc, html->pm, - x + area->x, y + area->y, area->x, area->y, area->width, - area->height); + gdk_draw_pixmap(html->html_area, html->bg_gc, html->pm, + x + area->x, y + area->y, area->x, area->y, area->width, + area->height); return; } - if (html->bg_gc) { - - gint width, height; - - gdk_window_get_size (widget->style->bg_pixmap[GTK_STATE_NORMAL], &width, &height); - - gdk_gc_set_ts_origin (html->bg_gc, - (- html->xoffset) % width, - (- html->yoffset) % height); - - gdk_draw_rectangle (html->html_area, html->bg_gc, TRUE, - area->x, area->y, area->width, area->height); - } - else - gdk_window_clear_area (html->html_area, area->x, area->y, area->width, area->height); + if (html->bg_gc) + { + + gint width, + height; + + gdk_window_get_size(widget->style->bg_pixmap[GTK_STATE_NORMAL], &width, + &height); + + gdk_gc_set_ts_origin(html->bg_gc, + (-html->xoffset) % width, + (-html->yoffset) % height); + + gdk_draw_rectangle(html->html_area, html->bg_gc, TRUE, + area->x, area->y, area->width, area->height); + } + else + gdk_window_clear_area(html->html_area, area->x, area->y, area->width, + area->height); } -static void gtk_html_destroy (GtkObject *object) +static void gtk_html_destroy(GtkObject * object) { - GtkHtml *html; - - g_return_if_fail(object != NULL); - g_return_if_fail(GTK_IS_HTML (object)); - - html = (GtkHtml *)object; - - - gtk_signal_disconnect_by_data (GTK_OBJECT (html->hadj), html); - gtk_signal_disconnect_by_data (GTK_OBJECT (html->vadj), html); - - if (html->timer) { - gtk_timeout_remove (html->timer); - html->timer = 0; + GtkHtml *html; + + g_return_if_fail(object != NULL); + g_return_if_fail(GTK_IS_HTML(object)); + + html = (GtkHtml *) object; + + + gtk_signal_disconnect_by_data(GTK_OBJECT(html->hadj), html); + gtk_signal_disconnect_by_data(GTK_OBJECT(html->vadj), html); + + if (html->timer) + { + gtk_timeout_remove(html->timer); + html->timer = 0; } - if (html->tooltip_timer) { - gtk_timeout_remove (html->tooltip_timer); + if (html->tooltip_timer) + { + gtk_timeout_remove(html->tooltip_timer); html->tooltip_timer = -1; } - - GTK_OBJECT_CLASS(parent_class)->destroy(object); - + + GTK_OBJECT_CLASS(parent_class)->destroy(object); + } -static void gtk_html_finalize (GtkObject *object) +static void gtk_html_finalize(GtkObject * object) { - GList *hbits; - GtkHtml *html; + GList *hbits; + GtkHtml *html; GtkHtmlBit *hb; - g_return_if_fail (object != NULL); - g_return_if_fail (GTK_IS_HTML (object)); - - html = (GtkHtml *)object; - - gtk_object_unref (GTK_OBJECT (html->hadj)); - gtk_object_unref (GTK_OBJECT (html->vadj)); - - hbits = html->html_bits; - - while (hbits) { - hb = (GtkHtmlBit *)hbits->data; - if (hb->fore) - gdk_color_free(hb->fore); - if (hb->back) - gdk_color_free(hb->back); - if (hb->text) - g_free(hb->text); - if (hb->url) - g_free(hb->url); - if (hb->pm) - gdk_pixmap_unref(hb->pm); - - g_free(hb); - hbits = hbits->next; - } - if (html->html_bits) - g_list_free(html->html_bits); - - if (html->urls) - g_list_free(html->urls); - - if (html->selected_text) - g_free(html->selected_text); - - if (html->gc) - gdk_gc_destroy(html->gc); - - if (html->bg_gc) - gdk_gc_destroy(html->bg_gc); + g_return_if_fail(object != NULL); + g_return_if_fail(GTK_IS_HTML(object)); + + html = (GtkHtml *) object; + + gtk_object_unref(GTK_OBJECT(html->hadj)); + gtk_object_unref(GTK_OBJECT(html->vadj)); + + hbits = html->html_bits; + + while (hbits) + { + hb = (GtkHtmlBit *) hbits->data; + if (hb->fore) + gdk_color_free(hb->fore); + if (hb->back) + gdk_color_free(hb->back); + if (hb->text) + g_free(hb->text); + if (hb->url) + g_free(hb->url); + if (hb->pm) + gdk_pixmap_unref(hb->pm); + + g_free(hb); + hbits = hbits->next; + } + if (html->html_bits) + g_list_free(html->html_bits); + + if (html->urls) + g_list_free(html->urls); + + if (html->selected_text) + g_free(html->selected_text); + + if (html->gc) + gdk_gc_destroy(html->gc); + + if (html->bg_gc) + gdk_gc_destroy(html->bg_gc); if (html->tooltip_window) gtk_widget_destroy(html->tooltip_window); - - GTK_OBJECT_CLASS(parent_class)->finalize (object); + + GTK_OBJECT_CLASS(parent_class)->finalize(object); } -static void gtk_html_realize (GtkWidget *widget) +static void gtk_html_realize(GtkWidget * widget) { - GtkHtml *html; - GdkWindowAttr attributes; - gint attributes_mask; - - g_return_if_fail (widget != NULL); - g_return_if_fail (GTK_IS_HTML (widget)); - - html = GTK_HTML (widget); - GTK_WIDGET_SET_FLAGS (html, GTK_REALIZED); - - attributes.window_type = GDK_WINDOW_CHILD; - attributes.x = widget->allocation.x; - attributes.y = widget->allocation.y; - attributes.width = widget->allocation.width; - attributes.height = widget->allocation.height; - attributes.wclass = GDK_INPUT_OUTPUT; - attributes.visual = gtk_widget_get_visual (widget); - attributes.colormap = gtk_widget_get_colormap (widget); - attributes.event_mask = gtk_widget_get_events (widget); - attributes.event_mask |= (GDK_EXPOSURE_MASK | - GDK_BUTTON_PRESS_MASK | - GDK_BUTTON_RELEASE_MASK | - GDK_BUTTON_MOTION_MASK | - GDK_ENTER_NOTIFY_MASK | - GDK_LEAVE_NOTIFY_MASK | - GDK_POINTER_MOTION_MASK | - GDK_POINTER_MOTION_HINT_MASK | - GDK_VISIBILITY_NOTIFY_MASK | - GDK_KEY_PRESS_MASK); - - attributes_mask = GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL | GDK_WA_COLORMAP; - - widget->window = gdk_window_new (gtk_widget_get_parent_window (widget), &attributes, attributes_mask); - gdk_window_set_user_data (widget->window, html); - - attributes.x = (widget->style->klass->xthickness + BORDER_WIDTH); - attributes.y = (widget->style->klass->ythickness + BORDER_WIDTH); - attributes.width = MAX (1, (gint)widget->allocation.width - (gint)attributes.x * 2); - attributes.height = MAX (1, (gint)widget->allocation.height - (gint)attributes.y * 2); - - html->html_area = gdk_window_new (widget->window, &attributes, attributes_mask); - gdk_window_set_user_data (html->html_area, html); - - widget->style = gtk_style_attach (widget->style, widget->window); - - /* Can't call gtk_style_set_background here because it's handled specially */ - gdk_window_set_background (widget->window, &widget->style->base[GTK_STATE_NORMAL]); - gdk_window_set_background (html->html_area, &widget->style->base[GTK_STATE_NORMAL]); - - if (widget->style->bg_pixmap[GTK_STATE_NORMAL]) - html->bg_gc = create_bg_gc(html); - - html->gc = gdk_gc_new (html->html_area); - gdk_gc_set_exposures (html->gc, TRUE); - gdk_gc_set_foreground (html->gc, &widget->style->text[GTK_STATE_NORMAL]); - - gdk_window_show(html->html_area); + GtkHtml *html; + GdkWindowAttr attributes; + gint attributes_mask; + + g_return_if_fail(widget != NULL); + g_return_if_fail(GTK_IS_HTML(widget)); + + html = GTK_HTML(widget); + GTK_WIDGET_SET_FLAGS(html, GTK_REALIZED); + + attributes.window_type = GDK_WINDOW_CHILD; + attributes.x = widget->allocation.x; + attributes.y = widget->allocation.y; + attributes.width = widget->allocation.width; + attributes.height = widget->allocation.height; + attributes.wclass = GDK_INPUT_OUTPUT; + attributes.visual = gtk_widget_get_visual(widget); + attributes.colormap = gtk_widget_get_colormap(widget); + attributes.event_mask = gtk_widget_get_events(widget); + attributes.event_mask |= (GDK_EXPOSURE_MASK | + GDK_BUTTON_PRESS_MASK | + GDK_BUTTON_RELEASE_MASK | + GDK_BUTTON_MOTION_MASK | + GDK_ENTER_NOTIFY_MASK | + GDK_LEAVE_NOTIFY_MASK | + GDK_POINTER_MOTION_MASK | + GDK_POINTER_MOTION_HINT_MASK | + GDK_VISIBILITY_NOTIFY_MASK | GDK_KEY_PRESS_MASK); + + attributes_mask = GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL | GDK_WA_COLORMAP; + + widget->window = + gdk_window_new(gtk_widget_get_parent_window(widget), &attributes, + attributes_mask); + gdk_window_set_user_data(widget->window, html); + + attributes.x = (widget->style->klass->xthickness + BORDER_WIDTH); + attributes.y = (widget->style->klass->ythickness + BORDER_WIDTH); + attributes.width = + MAX(1, (gint) widget->allocation.width - (gint) attributes.x * 2); + attributes.height = + MAX(1, (gint) widget->allocation.height - (gint) attributes.y * 2); + + html->html_area = + gdk_window_new(widget->window, &attributes, attributes_mask); + gdk_window_set_user_data(html->html_area, html); + + widget->style = gtk_style_attach(widget->style, widget->window); + + /* + * Can't call gtk_style_set_background here because it's handled specially + */ + gdk_window_set_background(widget->window, + &widget->style->base[GTK_STATE_NORMAL]); + gdk_window_set_background(html->html_area, + &widget->style->base[GTK_STATE_NORMAL]); + + if (widget->style->bg_pixmap[GTK_STATE_NORMAL]) + html->bg_gc = create_bg_gc(html); + + html->gc = gdk_gc_new(html->html_area); + gdk_gc_set_exposures(html->gc, TRUE); + gdk_gc_set_foreground(html->gc, &widget->style->text[GTK_STATE_NORMAL]); + + gdk_window_show(html->html_area); } -static void gtk_html_style_set(GtkWidget *widget, - GtkStyle *previous_style) +static void gtk_html_style_set(GtkWidget * widget, GtkStyle * previous_style) { - GtkHtml *html; - - g_return_if_fail (widget != NULL); - g_return_if_fail (GTK_IS_HTML (widget)); - - html = GTK_HTML (widget); - if (GTK_WIDGET_REALIZED (widget)) { - gdk_window_set_background (widget->window, &widget->style->base[GTK_STATE_NORMAL]); - gdk_window_set_background (html->html_area, &widget->style->base[GTK_STATE_NORMAL]); - - if (html->bg_gc) { - gdk_gc_destroy (html->bg_gc); - html->bg_gc = NULL; - } - - if (widget->style->bg_pixmap[GTK_STATE_NORMAL]) { - html->bg_gc = create_bg_gc(html); - } - - } + GtkHtml *html; + + g_return_if_fail(widget != NULL); + g_return_if_fail(GTK_IS_HTML(widget)); + + html = GTK_HTML(widget); + if (GTK_WIDGET_REALIZED(widget)) + { + gdk_window_set_background(widget->window, + &widget->style->base[GTK_STATE_NORMAL]); + gdk_window_set_background(html->html_area, + &widget->style->base[GTK_STATE_NORMAL]); + + if (html->bg_gc) + { + gdk_gc_destroy(html->bg_gc); + html->bg_gc = NULL; + } + + if (widget->style->bg_pixmap[GTK_STATE_NORMAL]) + { + html->bg_gc = create_bg_gc(html); + } + + } } -static void gtk_html_unrealize (GtkWidget *widget) +static void gtk_html_unrealize(GtkWidget * widget) { - GtkHtml *html; - - g_return_if_fail (widget != NULL); - g_return_if_fail (GTK_IS_HTML (widget)); - - html = GTK_HTML (widget); - - gdk_window_set_user_data (html->html_area, NULL); - gdk_window_destroy (html->html_area); - html->html_area = NULL; - - gdk_gc_destroy (html->gc); - html->gc = NULL; - - if (html->bg_gc) - { - gdk_gc_destroy (html->bg_gc); - html->bg_gc = NULL; - } - - if (GTK_WIDGET_CLASS (parent_class)->unrealize) - (* GTK_WIDGET_CLASS (parent_class)->unrealize) (widget); + GtkHtml *html; + + g_return_if_fail(widget != NULL); + g_return_if_fail(GTK_IS_HTML(widget)); + + html = GTK_HTML(widget); + + gdk_window_set_user_data(html->html_area, NULL); + gdk_window_destroy(html->html_area); + html->html_area = NULL; + + gdk_gc_destroy(html->gc); + html->gc = NULL; + + if (html->bg_gc) + { + gdk_gc_destroy(html->bg_gc); + html->bg_gc = NULL; + } + + if (GTK_WIDGET_CLASS(parent_class)->unrealize) + (*GTK_WIDGET_CLASS(parent_class)->unrealize) (widget); } -static void gtk_html_add_pixmap(GtkHtml *html, - GdkPixmap *pm, - int fit) +static void gtk_html_add_pixmap(GtkHtml * html, GdkPixmap * pm, int fit) { - GtkHtmlBit *last_hb; - GtkHtmlBit *hb = g_new0(GtkHtmlBit, 1); - GdkWindowPrivate *private = (GdkWindowPrivate *)pm; - - last_hb = (GtkHtmlBit *)g_list_last(html->html_bits)->data; + GtkHtmlBit *last_hb; + GtkHtmlBit *hb = g_new0(GtkHtmlBit, 1); + GdkWindowPrivate *private = (GdkWindowPrivate *) pm; + + last_hb = (GtkHtmlBit *) g_list_last(html->html_bits)->data; hb->fit = fit; hb->x = html->current_x; hb->y = html->current_y; - if (fit) + if (fit) hb->height = last_hb->height; else hb->height = private->height; @@ -2361,20 +2678,21 @@ hb->fore = NULL; hb->back = NULL; hb->font = NULL; - hb->uline = 0; - hb->strike = 0; + hb->uline = 0; + hb->strike = 0; hb->was_selected = 0; - hb->newline = 0; - hb->pm = pm; - - if (html->current_x == BORDER_WIDTH) { + hb->newline = 0; + hb->pm = pm; + + if (html->current_x == BORDER_WIDTH) + { html->current_y += hb->height; hb->y += hb->height; } - html->current_x += hb->width; - + html->current_x += hb->width; + gtk_html_draw_bit(html, hb, 1); html->html_bits = g_list_append(html->html_bits, hb); @@ -2382,31 +2700,35 @@ } -static void gtk_html_add_seperator(GtkHtml *html) +static void gtk_html_add_seperator(GtkHtml * html) { - GtkHtmlBit *hb = g_new0(GtkHtmlBit, 1); - gint width, height; - + GtkHtmlBit *hb = g_new0(GtkHtmlBit, 1); + gint width, + height; + html->current_x = 0; html->current_y += 5; - gdk_window_get_size(html->html_area, &width, &height); - + gdk_window_get_size(html->html_area, &width, &height); + hb->x = html->current_x; hb->y = html->current_y; hb->height = 5; hb->type = HTML_BIT_SEP; - hb->width = width - GTK_SCROLLED_WINDOW(GTK_WIDGET(html)->parent)->vscrollbar->allocation.width - 10; + hb->width = + width - + GTK_SCROLLED_WINDOW(GTK_WIDGET(html)->parent)->vscrollbar->allocation. + width - 10; hb->text = NULL; hb->url = NULL; hb->fore = NULL; hb->back = NULL; hb->font = NULL; - hb->uline = 0; - hb->strike = 0; + hb->uline = 0; + hb->strike = 0; hb->was_selected = 0; - hb->newline = 0; - hb->pm = NULL; + hb->newline = 0; + hb->pm = NULL; gtk_html_draw_bit(html, hb, 1); @@ -2415,147 +2737,178 @@ } -static void gtk_html_add_text (GtkHtml *html, - GdkFont *cfont, - GdkColor *fore, - GdkColor *back, - char *chars, - gint length, - gint uline, - gint strike, - char *url) +static void gtk_html_add_text(GtkHtml * html, + GdkFont * cfont, + GdkColor * fore, + GdkColor * back, + char *chars, + gint length, gint uline, gint strike, char *url) { - char *nextline = NULL, *c, *text, *tmp; - GdkGC *gc; - int nl = 0, nl2 = 0; - int maxwidth; - gint lb; - GList *hbits; - int num = 0, i, height; - GtkHtmlBit *hb; - gint hwidth, hheight; - - if (length == 1 && chars[0] == '\n') { - GtkHtmlBit *h; - hbits = g_list_last(html->html_bits); - if (!hbits) - return; - /* I realize this loses a \n sometimes - * if it's the first thing in the widget. - * so fucking what. */ - - h = (GtkHtmlBit *)hbits->data; - h->newline++; - if (html->current_x > 0) - html->current_x = 0; - else - html->current_y += gdk_string_height(cfont, "yG") + 2; - return; - } - - - - c = text = g_malloc(length + 2); - strncpy(text, chars, length); - text[length] = 0; - - - gc = html->gc; - - if (gc == NULL) - gc = html->gc = gdk_gc_new(html->html_area); - - gdk_gc_set_font(gc, cfont); - - - while(*c) { - if (*c == '\n') { - if (*(c+1) == '\0') { - nl = 1; - length--; - c[0] = '\0'; - break; - } - if (*c) { - gtk_html_add_text(html, cfont, fore, back, text, num + 1, uline, strike, url); - tmp = text; - length -= (num+1); - text = g_malloc(length+2); - strncpy(text, (c+1), length); - text[length] = 0; - c = text; - num = 0; - g_free(tmp); + char *nextline = NULL, + *c, + *text, + *tmp; + GdkGC *gc; + int nl = 0, + nl2 = 0; + int maxwidth; + gint lb; + GList *hbits; + int num = 0, + i, + height; + GtkHtmlBit *hb; + gint hwidth, + hheight; + + if (length == 1 && chars[0] == '\n') + { + GtkHtmlBit *h; + hbits = g_list_last(html->html_bits); + if (!hbits) + return; + /* + * I realize this loses a \n sometimes + * * if it's the first thing in the widget. + * * so fucking what. + */ + + h = (GtkHtmlBit *) hbits->data; + h->newline++; + if (html->current_x > 0) + html->current_x = 0; + else + html->current_y += cfont->ascent + cfont->descent + 2; + return; + } + + + + c = text = g_malloc(length + 2); + strncpy(text, chars, length); + text[length] = 0; + + + gc = html->gc; + + if (gc == NULL) + gc = html->gc = gdk_gc_new(html->html_area); + + gdk_gc_set_font(gc, cfont); + + + while (*c) + { + if (*c == '\n') + { + if (*(c + 1) == '\0') + { + nl = 1; + length--; + c[0] = '\0'; + break; + } + if (*c) + { + gtk_html_add_text(html, cfont, fore, back, text, num + 1, uline, + strike, url); + tmp = text; + length -= (num + 1); + text = g_malloc(length + 2); + strncpy(text, (c + 1), length); + text[length] = 0; + c = text; + num = 0; + g_free(tmp); continue; - } - } - - num++; - c++; - } - - /* Note, yG is chosen because G is damn high, and y is damn low, */ - /* it should be just fine. :) */ - - gdk_window_get_size(html->html_area, &hwidth, &hheight); - - num = strlen(text); - - while(GTK_WIDGET(html)->allocation.width < 20) { - while(gtk_events_pending()) + } + } + + num++; + c++; + } + + /* + * Note, yG is chosen because G is damn high, and y is damn low, + */ + /* + * it should be just fine. :) + */ + + gdk_window_get_size(html->html_area, &hwidth, &hheight); + + num = strlen(text); + + while (GTK_WIDGET(html)->allocation.width < 20) + { + while (gtk_events_pending()) gtk_main_iteration(); } - maxwidth = (hwidth - html->current_x - 8); - /*HTK_SCROLLED_WINDOW(GTK_WIDGET(layout)->parent)->vscrollbar->allocation.width) - 8; */ - - while(gdk_text_measure(cfont, text, num) > maxwidth) { - if (num > 1) - num--; - else { - - html->current_x = 0; - if (nl) { + maxwidth = (hwidth - html->current_x - 8); + /* + * HTK_SCROLLED_WINDOW(GTK_WIDGET(layout)->parent)->vscrollbar->allocation.width) - 8; + */ + + while (gdk_text_measure(cfont, text, num) > maxwidth) + { + if (num > 1) + num--; + else + { + + html->current_x = 0; + if (nl) + { text[length] = '\n'; - length++; + length++; } - gtk_html_add_text(html, cfont, fore, back, text, length, uline, strike, url); + gtk_html_add_text(html, cfont, fore, back, text, length, uline, + strike, url); g_free(text); return; } } - height = gdk_string_height(cfont, "yG") + 2; - - - if ((int)(html->vadj->upper - html->current_y) < (int)(height * 2)) { - int val; - val = (height * 2) + html->current_y; - html->vadj->upper = val; - adjust_adj(html, html->vadj); + height = cfont->ascent + cfont->descent + 2; + + + if ((int) (html->vadj->upper - html->current_y) < (int) (height * 2)) + { + int val; + val = (height * 2) + html->current_y; + html->vadj->upper = val; + adjust_adj(html, html->vadj); } - - if (html->current_x == 0) { - html->current_y += height; - gdk_text_extents(cfont, text, 1, &lb, NULL, NULL, NULL, NULL); - html->current_x += (2 - lb); - } else if ((hbits = g_list_last(html->html_bits)) != NULL) { - int diff, y; - hb = (GtkHtmlBit *)hbits->data; - if (height > hb->height) { + + if (html->current_x == 0) + { + html->current_y += height; + gdk_text_extents(cfont, text, 1, &lb, NULL, NULL, NULL, NULL); + html->current_x += (2 - lb); + } + else if ((hbits = g_list_last(html->html_bits)) != NULL) + { + int diff, + y; + hb = (GtkHtmlBit *) hbits->data; + if (height > hb->height) + { diff = height - hb->height; y = hb->y; html->current_y += diff; - while(hbits) { - hb = (GtkHtmlBit *)hbits->data; + while (hbits) + { + hb = (GtkHtmlBit *) hbits->data; if (hb->y != y) - break; - hb->height = height; - hb->y += diff; - - hbits = hbits->prev; + break; + hb->height = height; + hb->y += diff; ////////////my thing here ///////////////// + gtk_html_draw_bit(html, hb, FALSE); + + hbits = hbits->prev; } } } @@ -2563,25 +2916,34 @@ - if (num != strlen(text)) { - /* This is kinda cheesy but it may make things - * much better lookin */ - for (i=2; i<15; i++) { - if ((num - i) < 0) { + if (num != strlen(text)) + { + /* + * This is kinda cheesy but it may make things + * * much better lookin + */ + for (i = 2; i < 15; i++) + { + if ((num - i) < 0) + { html->current_x = 0; - gtk_html_add_text(html, cfont, fore, back, text, strlen(text), uline, strike, url); - return; - } else if (text[num - i] == ' ') { - num = num - (i-1); + gtk_html_add_text(html, cfont, fore, back, text, strlen(text), + uline, strike, url); + return; + } + else if (text[num - i] == ' ') + { + num = num - (i - 1); nl2 = 1; break; } } nextline = g_malloc(length - num + 2); - strncpy(nextline, (char *)(text + num), length - num); + strncpy(nextline, (char *) (text + num), length - num); nextline[length - num] = 0; - if (nl) { + if (nl) + { nextline[length - num] = '\n'; nextline[length - num + 1] = 0; nl = 0; @@ -2600,7 +2962,7 @@ hb->text = g_strdup(text); - if (fore) + if (fore) hb->fore = gdk_color_copy(fore); else hb->fore = NULL; @@ -2616,92 +2978,164 @@ gdk_text_extents(cfont, text, num, &lb, NULL, &hb->width, NULL, NULL); hb->x = html->current_x; hb->y = html->current_y; - hb->type = HTML_BIT_TEXT; - hb->pm = NULL; - if (url != NULL) { + hb->type = HTML_BIT_TEXT; + hb->pm = NULL; + if (url != NULL) + { uline = 1; hb->uline = 1; hb->url = g_strdup(url); - } else { + } + else + { hb->url = NULL; } html->current_x += hb->width; html->html_bits = g_list_append(html->html_bits, hb); - if (url != NULL) { - html->urls = g_list_append(html->urls, hb); - } - - - - gtk_html_draw_bit(html, hb, 1); - - if (nl || nl2) { - if (nl) - hb->newline = 1; - html->current_x = 0; - } else - hb->newline = 0; - - - if (nextline != NULL) { - gtk_html_add_text(html, cfont, fore, back, nextline, strlen(nextline), uline, strike, url); - g_free(nextline); - } - - g_free(text); + if (url != NULL) + { + html->urls = g_list_append(html->urls, hb); + } + + + + gtk_html_draw_bit(html, hb, 1); + + if (nl || nl2) + { + if (nl) + hb->newline = 1; + html->current_x = 0; + } + else + hb->newline = 0; + + + if (nextline != NULL) + { + gtk_html_add_text(html, cfont, fore, back, nextline, strlen(nextline), + uline, strike, url); + g_free(nextline); + } + + g_free(text); } - -void gtk_html_append_text (GtkHtml *html, - char *text, - gint options) +static char * html_strtok( char * input, char delim ) { - GdkColormap *map; + static char * end; + static char * curr_offset; + int i; + int num_quotes=0; + + if( input != NULL) + { + curr_offset = input; + end = input+strlen(input); + } + else + { + if( curr_offset + strlen(curr_offset) < end ) + { + curr_offset += strlen(curr_offset) + 1; + } + else + { + return NULL; + } + } + for( i=0; curr_offset+i < end && + (curr_offset[i] != delim || num_quotes != 0) + ; i++ ) + { + if( curr_offset[i] == '\"' ) + { + num_quotes = (num_quotes+1)%2; + } + } + curr_offset[i] = '\0'; + return curr_offset; +} + + +void gtk_html_append_text(GtkHtml * html, char *text, gint options) +{ + GdkColormap *map; GdkFont *cfont; - GdkRectangle area; - char ws[BUF_LONG], tag[BUF_LONG], *c, *url = NULL; - gint intag=0,wpos=0, tpos=0, colorv, bold=0, italic=0, fixed=0, uline=0, strike=0, title=0; - gint height; - struct font_state *current, *tmp; - struct font_state def_state = { 3, 0, 0, NULL, NULL, NULL }; - - current = &def_state; - map = gdk_window_get_colormap(html->html_area); - cfont = getfont(bold, italic, fixed, current->size); + GdkRectangle area; + char ws[BUF_LONG], + tag[BUF_LONG], + *c, + *url = NULL; + gint intag = 0, + wpos = 0, + tpos = 0, + colorv, + bold = 0, + italic = 0, + fixed = 0, + uline = 0, + strike = 0, + title = 0; + gint height; + struct font_state *current, + *tmp; + struct font_state def_state = { 3, 0, 0, "", NULL, NULL, NULL }; + + current = &def_state; + map = gdk_window_get_colormap(html->html_area); + cfont = getfont(current->font, bold, italic, fixed, current->size); c = text; - while(*c) { - if (*c == '<') { - if (!intag) { - ws[wpos]=0; - if (wpos) { - if (title) { - if (html->title) - g_free(html->title); - html->title = g_strdup(ws); - } else - gtk_html_add_text(html, cfont, current->color, current->bgcol, ws, strlen(ws), uline, strike, url); - } - wpos=0; - intag=1; - } else { - /* Assuming you NEVER have nested tags - * (and I mean <tag <tag>> by this, not - * <tag><tag2></tag2><tag>..*/ - tag[tpos] = 0; - gtk_html_add_text(html, cfont, current->color, current->bgcol, "<", 1, 0, 0, NULL); - gtk_html_add_text(html, cfont, current->color, current->bgcol, tag, strlen(tag), 0, 0, NULL); + while (*c) + { + if (*c == '<') + { + if (!intag) + { + ws[wpos] = 0; + if (wpos) + { + if (title) + { + if (html->title) + g_free(html->title); + html->title = g_strdup(ws); + } + else + gtk_html_add_text(html, cfont, current->color, + current->bgcol, ws, strlen(ws), uline, + strike, url); + } + wpos = 0; + intag = 1; + } + else + { + /* + * Assuming you NEVER have nested tags + * * (and I mean <tag <tag>> by this, not + * * <tag><tag2></tag2><tag>.. + */ + tag[tpos] = 0; + gtk_html_add_text(html, cfont, current->color, current->bgcol, + "<", 1, 0, 0, NULL); + gtk_html_add_text(html, cfont, current->color, current->bgcol, + tag, strlen(tag), 0, 0, NULL); tpos = 0; - - tag[0]=*c; + + tag[0] = *c; } - } else if (*c == '>') { - if (intag) { - tag[tpos]=0; + } + else if (*c == '>') + { + if (intag) + { + tag[tpos] = 0; if (!strcasecmp(tag, "B")) bold = 1; else if (!strcasecmp(tag, "STRIKE")) @@ -2728,179 +3162,297 @@ title = 1; else if (!strcasecmp(tag, "/TITLE")) title = 0; - else if (!strncasecmp(tag, "IMG", 3)) { - - } else if (!strcasecmp(tag, "H3")) { + else if (!strncasecmp(tag, "IMG", 3)) + { + + } + else if (!strcasecmp(tag, "H3")) + { current = push_state(current); current->size = 4; - } else if (!strcasecmp(tag, "/H3")) { - gtk_html_add_text(html, cfont, current->color, current->bgcol, "\n", 1, 0, 0, NULL); - - if (current->next) { + } + else if (!strcasecmp(tag, "/H3")) + { + gtk_html_add_text(html, cfont, current->color, + current->bgcol, "\n", 1, 0, 0, NULL); + + if (current->next) + { if (current->ownbg) g_free(current->bgcol); if (current->owncolor) g_free(current->color); - tmp=current; - current=current->next; - g_free(tmp); + tmp = current; + current = current->next; + g_free(tmp); } - } else if (!strcasecmp(tag, "TABLE")) { - } else if (!strcasecmp(tag, "/TABLE")) { - } else if (!strcasecmp(tag, "TR")) { - } else if (!strcasecmp(tag, "/TR")) { - } else if (!strcasecmp(tag, "/TD")) { - } else if (!strcasecmp(tag, "TD")){ - gtk_html_add_text(html, cfont, current->color, current->bgcol, " ", 2, 0, 0, NULL); - } else if (!strncasecmp(tag, "A ", 2)) { + } + else if (!strcasecmp(tag, "TABLE")) + { + } + else if (!strcasecmp(tag, "/TABLE")) + { + } + else if (!strcasecmp(tag, "TR")) + { + } + else if (!strcasecmp(tag, "/TR")) + { + } + else if (!strcasecmp(tag, "/TD")) + { + } + else if (!strcasecmp(tag, "TD")) + { + gtk_html_add_text(html, cfont, current->color, + current->bgcol, " ", 2, 0, 0, NULL); + } + else if (!strncasecmp(tag, "A ", 2)) + { char *d; char *temp = d = g_strdup(tag); int flag = 0; - strtok(tag," "); - while((d=strtok(NULL," "))) { + strtok(tag, " "); + while ((d = strtok(NULL, " "))) + { if (strlen(d) < 7) break; - if (!strncasecmp(d, "HREF=\"", strlen("HREF=\""))) { - d+= strlen("HREF=\""); + if (!strncasecmp(d, "HREF=\"", strlen("HREF=\""))) + { + d += strlen("HREF=\""); d[strlen(d) - 1] = 0; url = g_malloc(strlen(d) + 1); strcpy(url, d); flag = 1; - } - } + } + } g_free(temp); - if (!flag) { - gtk_html_add_text(html, cfont, current->color, current->bgcol, "<", 1, 0, 0, NULL); - gtk_html_add_text(html, cfont, current->color, current->bgcol, tag, strlen(tag), 0, 0, NULL); - gtk_html_add_text(html, cfont, current->color, current->bgcol, ">", 1, 0, 0, NULL); + if (!flag) + { + gtk_html_add_text(html, cfont, current->color, + current->bgcol, "<", 1, 0, 0, NULL); + gtk_html_add_text(html, cfont, current->color, + current->bgcol, tag, strlen(tag), 0, + 0, NULL); + gtk_html_add_text(html, cfont, current->color, + current->bgcol, ">", 1, 0, 0, NULL); } - } else if (!strcasecmp(tag, "/A")) { - if (url) { + } + else if (!strcasecmp(tag, "/A")) + { + if (url) + { g_free(url); url = NULL; } - } else if (!strncasecmp(tag,"FONT", strlen("FONT"))) { - char *d; - /* Push a new state onto the stack, based on the old state */ - current = push_state(current); - strtok(tag," "); - while((d=strtok(NULL," "))) { - if (!strncasecmp(d,"COLOR=",strlen("COLOR="))) { - d+=strlen("COLOR="); - if (*d == '\"') d++; - if (*d == '#') d++; - if (d[strlen(d) - 1] == '\"') - d[strlen(d) - 1] = 0; - if (sscanf(d, "%x", &colorv) && !(options & HTML_OPTION_NO_COLOURS)) { + } + else if (!strncasecmp(tag, "FONT", strlen("FONT"))) + { + char *d; + /* + * Push a new state onto the stack, based on the old state + */ + current = push_state(current); + html_strtok(tag, ' '); + while ((d = html_strtok(NULL, ' '))) + { + if (!strncasecmp(d, "COLOR=", strlen("COLOR="))) + { + d += strlen("COLOR="); + if (*d == '\"') + { + d++; + } + if (*d == '#') + d++; + if (d[strlen(d) - 1] == '\"') + d[strlen(d) - 1] = 0; + if (sscanf(d, "%x", &colorv) + && !(options & HTML_OPTION_NO_COLOURS)) + { current->color = get_color(colorv, map); current->owncolor = 1; - } else { - sprintf(debug_buff,"didn't find color in '%s'\n",d); - debug_print(debug_buff); + } + else + { } - } else - if (!strncasecmp(d,"BACK=",strlen("BACK="))) { - d+=strlen("BACK="); - if (*d == '\"') d++; - if (*d == '#') d++; + } + if (!strncasecmp(d, "FACE=", strlen("FACE="))) + { + d += strlen("FACE="); + if (*d == '\"') + { + d++; + } if (d[strlen(d) - 1] == '\"') d[strlen(d) - 1] = 0; - if (sscanf(d, "%x", &colorv) && !(options & HTML_OPTION_NO_COLOURS)) { + strcpy(current->font, d); + } + else if (!strncasecmp(d, "BACK=", strlen("BACK="))) + { + d += strlen("BACK="); + if (*d == '\"') + d++; + if (*d == '#') + d++; + if (d[strlen(d) - 1] == '\"') + d[strlen(d) - 1] = 0; + if (sscanf(d, "%x", &colorv) + && !(options & HTML_OPTION_NO_COLOURS)) + { current->bgcol = get_color(colorv, map); current->ownbg = 1; - } else { - sprintf(debug_buff,"didn't find color in '%s'\n",d); - debug_print(debug_buff); + } + else + { + } + } + else if (!strncasecmp(d, "SIZE=", strlen("SIZE="))) + { + d += strlen("SIZE="); + if (*d == '\"') + d++; + if (*d == '+') + d++; + if (sscanf(d, "%d", &colorv)) + { + current->size = colorv; + } + else + { } - } else if (!strncasecmp(d,"SIZE=",strlen("SIZE="))) { - d+=strlen("SIZE="); - if (*d == '\"') d++; - if (*d == '+') d++; - if (sscanf(d, "%d", &colorv)) { - current->size = colorv; - } else { - sprintf(debug_buff,"didn't find size in '%s'\n",d); - debug_print(debug_buff); - } - } else if (strncasecmp(d,"PTSIZE=", strlen("PTSIZE="))) { - } - } - } else if (!strncasecmp(tag,"BODY BGCOLOR", strlen("BODY BGCOLOR"))) { - - /* Ditch trailing \" */ - tag[strlen(tag)-1]=0; - if (sscanf(tag + strlen("BODY BGCOLOR=\"#"), "%x", &colorv) && !(options & HTML_OPTION_NO_COLOURS)) { - current->bgcol = get_color(colorv, map); - current->ownbg = 1; - } - } else if (!strncasecmp(tag, "/FONT", strlen("/FONT"))) { - /* Pop a font state off the list if possible, freeing - any resources it used */ - if (current->next) { - if (current->ownbg) - g_free(current->bgcol); - if (current->owncolor) - g_free(current->color); - tmp=current; - current=current->next; - g_free(tmp); + } + else if (strncasecmp(d, "PTSIZE=", strlen("PTSIZE="))) + { + } } - - } else if (!strcasecmp(tag, "/BODY")) { - if (current->next) { + } + else + if (!strncasecmp + (tag, "BODY BGCOLOR", strlen("BODY BGCOLOR"))) + { + + /* + * Ditch trailing \" + */ + tag[strlen(tag) - 1] = 0; + if (sscanf(tag + strlen("BODY BGCOLOR=\"#"), "%x", &colorv) + && !(options & HTML_OPTION_NO_COLOURS)) + { + current->bgcol = get_color(colorv, map); + current->ownbg = 1; + } + } + else if (!strncasecmp(tag, "/FONT", strlen("/FONT"))) + { + /* + * Pop a font state off the list if possible, freeing + * any resources it used + */ + if (current->next) + { if (current->ownbg) g_free(current->bgcol); if (current->owncolor) g_free(current->color); - tmp=current; - current=current->next; + tmp = current; + current = current->next; + g_free(tmp); + } + + } + else if (!strcasecmp(tag, "/BODY")) + { + if (current->next) + { + if (current->ownbg) + g_free(current->bgcol); + if (current->owncolor) + g_free(current->color); + tmp = current; + current = current->next; g_free(tmp); - } /* tags we ignore below */ - } else if (!strncasecmp(tag, "BR", 2)) { - gtk_html_add_text(html, cfont, current->color, current->bgcol, "\n", 1, 0, 0, NULL); - } else if (strncasecmp(tag, "HTML", 4) && strncasecmp(tag, "/HTML", 5) && - strncasecmp(tag, "BODY", 4) && strncasecmp(tag, "/BODY", 5) && - strncasecmp(tag, "P", 1) && strncasecmp(tag, "/P", 2) && - strncasecmp(tag, "HEAD", 4) && strncasecmp(tag, "/HEAD", 5)) { - if (tpos) { - gtk_html_add_text(html, cfont, current->color, current->bgcol, "<", 1, 0, 0, NULL); - gtk_html_add_text(html, cfont, current->color, current->bgcol, tag, strlen(tag), 0, 0, NULL); - gtk_html_add_text(html, cfont, current->color, current->bgcol, ">", 1, 0, 0, NULL); + } /* + * tags we ignore below + */ + } + else if (!strncasecmp(tag, "BR", 2)) + { + gtk_html_add_text(html, cfont, current->color, + current->bgcol, "\n", 1, 0, 0, NULL); + } + else if (strncasecmp(tag, "HTML", 4) + && strncasecmp(tag, "/HTML", 5) + && strncasecmp(tag, "BODY", 4) + && strncasecmp(tag, "/BODY", 5) + && strncasecmp(tag, "P", 1) + && strncasecmp(tag, "/P", 2) + && strncasecmp(tag, "HEAD", 4) + && strncasecmp(tag, "/HEAD", 5)) + { + if (tpos) + { + gtk_html_add_text(html, cfont, current->color, + current->bgcol, "<", 1, 0, 0, NULL); + gtk_html_add_text(html, cfont, current->color, + current->bgcol, tag, strlen(tag), 0, + 0, NULL); + gtk_html_add_text(html, cfont, current->color, + current->bgcol, ">", 1, 0, 0, NULL); } } - cfont = getfont(bold,italic,fixed,current->size); - tpos=0; + cfont = getfont(current->font, bold, italic, fixed, current->size); + tpos = 0; intag = 0; - } else { - ws[wpos++]=*c; } - } else if (!intag && *c == '&') { - if (!strncasecmp(c, "&", 5)) { - ws[wpos++] = '&'; - c+=4; - } else if (!strncasecmp(c, "<", 4)) { - ws[wpos++] = '<'; - c+=3; - } else if (!strncasecmp(c, ">", 4)) { - ws[wpos++] = '>'; - c+=3; - } else if (!strncasecmp(c, " ", 6)) { - ws[wpos++] = ' '; - c+=5; - } else { + else + { ws[wpos++] = *c; } - } else { - if (intag) { - tag[tpos++]=*c; - } else { - ws[wpos++]=*c; + } + else if (!intag && *c == '&') + { + if (!strncasecmp(c, "&", 5)) + { + ws[wpos++] = '&'; + c += 4; + } + else if (!strncasecmp(c, "<", 4)) + { + ws[wpos++] = '<'; + c += 3; + } + else if (!strncasecmp(c, ">", 4)) + { + ws[wpos++] = '>'; + c += 3; + } + else if (!strncasecmp(c, " ", 6)) + { + ws[wpos++] = ' '; + c += 5; + } + else + { + ws[wpos++] = *c; + } + } + else + { + if (intag) + { + tag[tpos++] = *c; + } + else + { + ws[wpos++] = *c; } } c++; } - while(current->next) { + while (current->next) + { if (current->ownbg) g_free(current->bgcol); if (current->owncolor) @@ -2909,270 +3461,298 @@ current = current->next; g_free(tmp); } - ws[wpos]=0; - tag[tpos]=0; - if (wpos) { - gtk_html_add_text(html, cfont, current->color, current->bgcol, ws, strlen(ws), uline, strike, url); - } - if (tpos) { - gtk_html_add_text(html, cfont, current->color, current->bgcol, "<", 1, 0, 0, NULL); - gtk_html_add_text(html, cfont, current->color, current->bgcol, tag, strlen(tag), 0, 0, NULL); - gtk_html_add_text(html, cfont, current->color, current->bgcol, ">", 1, 0, 0, NULL); + ws[wpos] = 0; + tag[tpos] = 0; + if (wpos) + { + gtk_html_add_text(html, cfont, current->color, current->bgcol, ws, + strlen(ws), uline, strike, url); } - - - - gdk_window_get_size(html->html_area, NULL, &height); - area.height = height; + if (tpos) + { + gtk_html_add_text(html, cfont, current->color, current->bgcol, "<", 1, + 0, 0, NULL); + gtk_html_add_text(html, cfont, current->color, current->bgcol, tag, + strlen(tag), 0, 0, NULL); + gtk_html_add_text(html, cfont, current->color, current->bgcol, ">", 1, + 0, 0, NULL); + } + + + + gdk_window_get_size(html->html_area, NULL, &height); + area.height = height; gtk_adjustment_set_value(html->vadj, html->vadj->upper - area.height); - return; + return; } -static void adjust_adj (GtkHtml *html, - GtkAdjustment *adj) +static void adjust_adj(GtkHtml * html, GtkAdjustment * adj) { - gint height; - - gdk_window_get_size (html->html_area, NULL, &height); - - adj->step_increment = MIN (adj->upper, (float) SCROLL_PIXELS); - adj->page_increment = MIN (adj->upper, height - (float) KEY_SCROLL_PIXELS); - adj->page_size = MIN (adj->upper, height); - adj->value = MIN (adj->value, adj->upper - adj->page_size); - adj->value = MAX (adj->value, 0.0); - - gtk_signal_emit_by_name (GTK_OBJECT (adj), "changed"); + gint height; + + gdk_window_get_size(html->html_area, NULL, &height); + + adj->step_increment = MIN(adj->upper, (float) SCROLL_PIXELS); + adj->page_increment = MIN(adj->upper, height - (float) KEY_SCROLL_PIXELS); + adj->page_size = MIN(adj->upper, height); + adj->value = MIN(adj->value, adj->upper - adj->page_size); + adj->value = MAX(adj->value, 0.0); + + gtk_signal_emit_by_name(GTK_OBJECT(adj), "changed"); } -static void scroll_down (GtkHtml* html, - gint diff0) +static void scroll_down(GtkHtml * html, gint diff0) { - GdkRectangle rect; - gint width, height; - - html->yoffset += diff0; - - gdk_window_get_size (html->html_area, &width, &height); - - if (html->transparent) { + GdkRectangle rect; + gint width, + height; + + html->yoffset += diff0; + + gdk_window_get_size(html->html_area, &width, &height); + + if (html->transparent) + { rect.x = 0; rect.y = 0; rect.width = width; rect.height = height; - } else { - + } + else + { + if (height > diff0 && !html->transparent) - gdk_draw_pixmap (html->html_area, - html->gc, - html->html_area, - 0, - diff0, - 0, - 0, - width, - height - diff0); - - rect.x = 0; - rect.y = MAX (0, height - diff0); - rect.width = width; - rect.height = MIN (height, diff0); + gdk_draw_pixmap(html->html_area, + html->gc, + html->html_area, + 0, diff0, 0, 0, width, height - diff0); + + rect.x = 0; + rect.y = MAX(0, height - diff0); + rect.width = width; + rect.height = MIN(height, diff0); } - - expose_html (html, &rect, FALSE); - gtk_html_draw_focus ( (GtkWidget *) html); + + expose_html(html, &rect, FALSE); + gtk_html_draw_focus((GtkWidget *) html); } -static void scroll_up (GtkHtml* html, - gint diff0) +static void scroll_up(GtkHtml * html, gint diff0) { - GdkRectangle rect; - gint width, height; - + GdkRectangle rect; + gint width, + height; + html->yoffset -= diff0; - gdk_window_get_size (html->html_area, &width, &height); - - if (html->transparent) { + gdk_window_get_size(html->html_area, &width, &height); + + if (html->transparent) + { rect.x = 0; rect.y = 0; rect.width = width; rect.height = height; - } else { - + } + else + { + if (height > diff0) - gdk_draw_pixmap (html->html_area, - html->gc, - html->html_area, - 0, - 0, - 0, - diff0, - width, - height - diff0); - - rect.x = 0; - rect.y = 0; - rect.width = width; - rect.height = MIN (height, diff0); + gdk_draw_pixmap(html->html_area, + html->gc, + html->html_area, + 0, 0, 0, diff0, width, height - diff0); + + rect.x = 0; + rect.y = 0; + rect.width = width; + rect.height = MIN(height, diff0); } - expose_html (html, &rect, FALSE); - gtk_html_draw_focus ( (GtkWidget *) html); + expose_html(html, &rect, FALSE); + gtk_html_draw_focus((GtkWidget *) html); } -static void gtk_html_adjustment (GtkAdjustment *adjustment, - GtkHtml *html) +static void gtk_html_adjustment(GtkAdjustment * adjustment, GtkHtml * html) { - g_return_if_fail (adjustment != NULL); - g_return_if_fail (GTK_IS_ADJUSTMENT (adjustment)); - g_return_if_fail (html != NULL); - g_return_if_fail (GTK_IS_HTML (html)); - - /* Just ignore it if we haven't been size-allocated and realized yet */ - if (html->html_area == NULL) - return; - - if (adjustment == html->hadj) { - g_warning ("horizontal scrolling not implemented"); - } else { - gint diff = ((gint)adjustment->value) - html->last_ver_value; - - if (diff != 0) { - /*undraw_cursor (text, FALSE);*/ - - if (diff > 0) { - scroll_down (html, diff); - } else {/* if (diff < 0) */ - scroll_up (html, -diff); - } - /*draw_cursor (text, FALSE); */ - - html->last_ver_value = adjustment->value; - } - } + g_return_if_fail(adjustment != NULL); + g_return_if_fail(GTK_IS_ADJUSTMENT(adjustment)); + g_return_if_fail(html != NULL); + g_return_if_fail(GTK_IS_HTML(html)); + + /* + * Just ignore it if we haven't been size-allocated and realized yet + */ + if (html->html_area == NULL) + return; + + if (adjustment == html->hadj) + { + g_warning("horizontal scrolling not implemented"); + } + else + { + gint diff = ((gint) adjustment->value) - html->last_ver_value; + + if (diff != 0) + { + /* + * undraw_cursor (text, FALSE); + */ + + if (diff > 0) + { + scroll_down(html, diff); + } + else + { /* + * if (diff < 0) + */ + scroll_up(html, -diff); + } + /* + * draw_cursor (text, FALSE); + */ + + html->last_ver_value = adjustment->value; + } + } } - -static gint gtk_html_visibility_notify (GtkWidget *widget, - GdkEventVisibility *event) + +static gint gtk_html_visibility_notify(GtkWidget * widget, + GdkEventVisibility * event) { GtkHtml *html; GdkRectangle rect; - gint width, height; - - g_return_val_if_fail (widget != NULL, FALSE); - g_return_val_if_fail (GTK_IS_HTML (widget), FALSE); - - html = GTK_HTML(widget); - - if (GTK_WIDGET_REALIZED (widget) && html->transparent) { - gdk_window_get_size (html->html_area, &width, &height); - rect.x = 0; - rect.y = 0; - rect.width = width; - rect.height = height; - expose_html (html, &rect, FALSE); - gtk_html_draw_focus ( (GtkWidget *) html); - } else { + gint width, + height; + + g_return_val_if_fail(widget != NULL, FALSE); + g_return_val_if_fail(GTK_IS_HTML(widget), FALSE); + + html = GTK_HTML(widget); + + if (GTK_WIDGET_REALIZED(widget) && html->transparent) + { + gdk_window_get_size(html->html_area, &width, &height); + rect.x = 0; + rect.y = 0; + rect.width = width; + rect.height = height; + expose_html(html, &rect, FALSE); + gtk_html_draw_focus((GtkWidget *) html); + } + else + { } - return FALSE; + return FALSE; } -static void gtk_html_disconnect (GtkAdjustment *adjustment, - GtkHtml *html) +static void gtk_html_disconnect(GtkAdjustment * adjustment, GtkHtml * html) { - g_return_if_fail (adjustment != NULL); - g_return_if_fail (GTK_IS_ADJUSTMENT (adjustment)); - g_return_if_fail (html != NULL); - g_return_if_fail (GTK_IS_HTML (html)); - - if (adjustment == html->hadj) - gtk_html_set_adjustments (html, NULL, html->vadj); - if (adjustment == html->vadj) - gtk_html_set_adjustments (html, html->hadj, NULL); + g_return_if_fail(adjustment != NULL); + g_return_if_fail(GTK_IS_ADJUSTMENT(adjustment)); + g_return_if_fail(html != NULL); + g_return_if_fail(GTK_IS_HTML(html)); + + if (adjustment == html->hadj) + gtk_html_set_adjustments(html, NULL, html->vadj); + if (adjustment == html->vadj) + gtk_html_set_adjustments(html, html->hadj, NULL); } -static void move_cursor_ver(GtkHtml *html, int count) +static void move_cursor_ver(GtkHtml * html, int count) { GList *hbits = g_list_find(html->html_bits, html->cursor_hb); - GtkHtmlBit *hb = NULL, *hb2 = NULL; + GtkHtmlBit *hb = NULL, + *hb2 = NULL; gint y; - gint len, len2 = 0; - + gint len, + len2 = 0; + undraw_cursor(html); if (!html->html_bits) return; - + if (!html->cursor_hb) - html->cursor_hb = (GtkHtmlBit *)html->html_bits->data; + html->cursor_hb = (GtkHtmlBit *) html->html_bits->data; hb = html->cursor_hb; len = html->cursor_pos; hbits = hbits->prev; - while(hbits) { - hb2 = (GtkHtmlBit *)hbits->data; + while (hbits) + { + hb2 = (GtkHtmlBit *) hbits->data; if (hb2->y != hb->y) break; - len += strlen(hb2->text); - + len += strlen(hb2->text); + hbits = hbits->prev; } - hbits = g_list_find(html->html_bits, html->cursor_hb); - - if (count < 0) { - while(hbits) { - hb2 = (GtkHtmlBit *)hbits->data; + hbits = g_list_find(html->html_bits, html->cursor_hb); + + if (count < 0) + { + while (hbits) + { + hb2 = (GtkHtmlBit *) hbits->data; if (hb2->y != hb->y) break; - + hbits = hbits->prev; } - if (!hbits) { + if (!hbits) + { draw_cursor(html); return; } y = hb2->y; hb = hb2; - while(hbits) { - hb2 = (GtkHtmlBit *)hbits->data; + while (hbits) + { + hb2 = (GtkHtmlBit *) hbits->data; if (hb2->y != y) break; hb = hb2; - + hbits = hbits->prev; } hbits = g_list_find(html->html_bits, hb); - while(hbits) { - hb2 = (GtkHtmlBit *)hbits->data; - - if (hb->y != hb2->y) { + while (hbits) + { + hb2 = (GtkHtmlBit *) hbits->data; + + if (hb->y != hb2->y) + { html->cursor_hb = hb; html->cursor_pos = strlen(hb->text); - break; + break; } - if (len < len2 + strlen(hb2->text)) { + if (len < len2 + strlen(hb2->text)) + { html->cursor_hb = hb2; html->cursor_pos = len - len2; break; @@ -3182,33 +3762,40 @@ hb = hb2; - hbits = hbits->next; + hbits = hbits->next; } - } else { - while(hbits) { - hb2 = (GtkHtmlBit *)hbits->data; + } + else + { + while (hbits) + { + hb2 = (GtkHtmlBit *) hbits->data; if (hb2->y != hb->y) break; - + hbits = hbits->next; } - if (!hbits) { + if (!hbits) + { draw_cursor(html); return; } hb = hb2; - while(hbits) { - hb2 = (GtkHtmlBit *)hbits->data; - - if (hb->y != hb2->y) { + while (hbits) + { + hb2 = (GtkHtmlBit *) hbits->data; + + if (hb->y != hb2->y) + { html->cursor_hb = hb; html->cursor_pos = strlen(hb->text); - break; + break; } - if (len < len2 + strlen(hb2->text)) { + if (len < len2 + strlen(hb2->text)) + { html->cursor_hb = hb2; html->cursor_pos = len - len2; break; @@ -3218,7 +3805,7 @@ hb = hb2; - hbits = hbits->next; + hbits = hbits->next; } } @@ -3226,48 +3813,58 @@ } -static void move_cursor_hor(GtkHtml *html, int count) +static void move_cursor_hor(GtkHtml * html, int count) { GList *hbits = g_list_find(html->html_bits, html->cursor_hb); - GtkHtmlBit *hb, *hb2; + GtkHtmlBit *hb, + *hb2; undraw_cursor(html); if (!html->html_bits) return; - + if (!html->cursor_hb) - html->cursor_hb = (GtkHtmlBit *)html->html_bits->data; - - html->cursor_pos+=count; - - if (html->cursor_pos < 0) { - if (hbits->prev) { + html->cursor_hb = (GtkHtmlBit *) html->html_bits->data; + + html->cursor_pos += count; + + if (html->cursor_pos < 0) + { + if (hbits->prev) + { gint diff; hb = html->cursor_hb; - hb2 = (GtkHtmlBit *)hbits->prev->data; + hb2 = (GtkHtmlBit *) hbits->prev->data; diff = html->cursor_pos + strlen(hb2->text) + 1; if (hb->y == hb2->y) --diff; - + html->cursor_pos = diff; - - html->cursor_hb = (GtkHtmlBit *)hbits->prev->data; - } else { + + html->cursor_hb = (GtkHtmlBit *) hbits->prev->data; + } + else + { html->cursor_pos = 0; } - } else if (html->cursor_pos > strlen(html->cursor_hb->text)) { - if (hbits->next) { + } + else if (html->cursor_pos > strlen(html->cursor_hb->text)) + { + if (hbits->next) + { gint diff; hb = html->cursor_hb; - hb2 = (GtkHtmlBit *)hbits->next->data; + hb2 = (GtkHtmlBit *) hbits->next->data; diff = html->cursor_pos - strlen(html->cursor_hb->text) - 1; if (hb->y == hb2->y) - ++diff; + ++diff; html->cursor_pos = diff; - html->cursor_hb = (GtkHtmlBit *)hbits->next->data; - } else { + html->cursor_hb = (GtkHtmlBit *) hbits->next->data; + } + else + { html->cursor_pos = strlen(html->cursor_hb->text); } @@ -3276,34 +3873,36 @@ draw_cursor(html); } -static void move_beginning_of_line(GtkHtml *html) +static void move_beginning_of_line(GtkHtml * html) { GList *hbits = g_list_find(html->html_bits, html->cursor_hb); GtkHtmlBit *hb = NULL; - gint y; - + gint y; + undraw_cursor(html); if (!html->html_bits) return; if (!html->cursor_hb) - html->cursor_hb = (GtkHtmlBit *)html->html_bits->data; + html->cursor_hb = (GtkHtmlBit *) html->html_bits->data; y = html->cursor_hb->y; - - while(hbits) { - hb = (GtkHtmlBit *)hbits->data; - - if (y != hb->y) { - hb = (GtkHtmlBit *)hbits->next->data; + + while (hbits) + { + hb = (GtkHtmlBit *) hbits->data; + + if (y != hb->y) + { + hb = (GtkHtmlBit *) hbits->next->data; break; } - + hbits = hbits->prev; } if (!hbits) - html->cursor_hb = (GtkHtmlBit*)html->html_bits->data; + html->cursor_hb = (GtkHtmlBit *) html->html_bits->data; else html->cursor_hb = hb; @@ -3315,34 +3914,36 @@ } -static void move_end_of_line(GtkHtml *html) +static void move_end_of_line(GtkHtml * html) { GList *hbits = g_list_find(html->html_bits, html->cursor_hb); GtkHtmlBit *hb = NULL; - gint y; - + gint y; + undraw_cursor(html); if (!html->html_bits) return; if (!html->cursor_hb) - html->cursor_hb = (GtkHtmlBit *)html->html_bits->data; + html->cursor_hb = (GtkHtmlBit *) html->html_bits->data; y = html->cursor_hb->y; - - while(hbits) { - hb = (GtkHtmlBit *)hbits->data; - - if (y != hb->y) { - hb = (GtkHtmlBit *)hbits->prev->data; + + while (hbits) + { + hb = (GtkHtmlBit *) hbits->data; + + if (y != hb->y) + { + hb = (GtkHtmlBit *) hbits->prev->data; break; } - + hbits = hbits->next; } if (!hbits) - html->cursor_hb = (GtkHtmlBit*)g_list_last(html->html_bits)->data; + html->cursor_hb = (GtkHtmlBit *) g_list_last(html->html_bits)->data; else html->cursor_hb = hb; @@ -3356,136 +3957,145 @@ -static gint -gtk_html_key_press (GtkWidget *widget, - GdkEventKey *event) +static gint gtk_html_key_press(GtkWidget * widget, GdkEventKey * event) { GtkHtml *html; gchar key; gint return_val; - - g_return_val_if_fail (widget != NULL, FALSE); - g_return_val_if_fail (GTK_IS_HTML (widget), FALSE); - g_return_val_if_fail (event != NULL, FALSE); - + + g_return_val_if_fail(widget != NULL, FALSE); + g_return_val_if_fail(GTK_IS_HTML(widget), FALSE); + g_return_val_if_fail(event != NULL, FALSE); + return_val = FALSE; - - html = GTK_HTML (widget); - + + html = GTK_HTML(widget); + key = event->keyval; return_val = TRUE; - if (html->editable == FALSE) { - /* - switch (event->keyval) { + if (html->editable == FALSE) + { + /* + * switch (event->keyval) { + * case GDK_Home: + * if (event->state & GDK_CONTROL_MASK) + * scroll_int (text, -text->vadj->value); + * else + * return_val = FALSE; + * break; + * case GDK_End: + * if (event->state & GDK_CONTROL_MASK) + * scroll_int (text, +text->vadj->upper); + * else + * return_val = FALSE; + * break; + * case GDK_Page_Up: scroll_int (text, -text->vadj->page_increment); break; + * case GDK_Page_Down: scroll_int (text, +text->vadj->page_increment); break; + * case GDK_Up: scroll_int (text, -KEY_SCROLL_PIXELS); break; + * case GDK_Down: scroll_int (text, +KEY_SCROLL_PIXELS); break; + * case GDK_Return: + * if (event->state & GDK_CONTROL_MASK) + * gtk_signal_emit_by_name (GTK_OBJECT (text), "activate"); + * else + * return_val = FALSE; + * break; + * default: + * return_val = FALSE; + * break; + * } + */ + } + else + { + + switch (event->keyval) + { case GDK_Home: - if (event->state & GDK_CONTROL_MASK) - scroll_int (text, -text->vadj->value); - else - return_val = FALSE; + move_beginning_of_line(html); break; case GDK_End: - if (event->state & GDK_CONTROL_MASK) - scroll_int (text, +text->vadj->upper); - else - return_val = FALSE; - break; - case GDK_Page_Up: scroll_int (text, -text->vadj->page_increment); break; - case GDK_Page_Down: scroll_int (text, +text->vadj->page_increment); break; - case GDK_Up: scroll_int (text, -KEY_SCROLL_PIXELS); break; - case GDK_Down: scroll_int (text, +KEY_SCROLL_PIXELS); break; - case GDK_Return: - if (event->state & GDK_CONTROL_MASK) - gtk_signal_emit_by_name (GTK_OBJECT (text), "activate"); - else - return_val = FALSE; - break; - default: - return_val = FALSE; - break; - } - */ - } else { - - switch (event->keyval) { - case GDK_Home: - move_beginning_of_line (html); - break; - case GDK_End: - move_end_of_line (html); + move_end_of_line(html); break; /* - case GDK_Page_Up: - move_cursor_page_ver (html, -1); - break; - case GDK_Page_Down: - move_cursor_page_ver (html, +1); - break;*/ - /* CUA has Ctrl-Up/Ctrl-Down as paragraph up down */ + * case GDK_Page_Up: + * move_cursor_page_ver (html, -1); + * break; + * case GDK_Page_Down: + * move_cursor_page_ver (html, +1); + * break; + */ + /* + * CUA has Ctrl-Up/Ctrl-Down as paragraph up down + */ case GDK_Up: - move_cursor_ver (html, -1); + move_cursor_ver(html, -1); break; case GDK_Down: - move_cursor_ver (html, +1); + move_cursor_ver(html, +1); break; case GDK_Left: - move_cursor_hor (html, -1); + move_cursor_hor(html, -1); break; case GDK_Right: - move_cursor_hor (html, +1); + move_cursor_hor(html, +1); break; #if 0 case GDK_BackSpace: if (event->state & GDK_CONTROL_MASK) - gtk_text_delete_backward_word (text); + gtk_text_delete_backward_word(text); else - gtk_text_delete_backward_character (text); + gtk_text_delete_backward_character(text); break; case GDK_Clear: - gtk_text_delete_line (text); + gtk_text_delete_line(text); break; case GDK_Insert: if (event->state & GDK_SHIFT_MASK) { extend_selection = FALSE; - gtk_editable_paste_clipboard (editable); + gtk_editable_paste_clipboard(editable); } else if (event->state & GDK_CONTROL_MASK) { - gtk_editable_copy_clipboard (editable); + gtk_editable_copy_clipboard(editable); } else { - /* gtk_toggle_insert(text) -- IMPLEMENT */ + /* + * gtk_toggle_insert(text) -- IMPLEMENT + */ } break; case GDK_Delete: if (event->state & GDK_CONTROL_MASK) - gtk_text_delete_forward_word (text); + gtk_text_delete_forward_word(text); else if (event->state & GDK_SHIFT_MASK) { extend_selection = FALSE; - gtk_editable_cut_clipboard (editable); + gtk_editable_cut_clipboard(editable); } else - gtk_text_delete_forward_character (text); + gtk_text_delete_forward_character(text); break; case GDK_Tab: position = text->point.index; - gtk_editable_insert_text (editable, "\t", 1, &position); + gtk_editable_insert_text(editable, "\t", 1, &position); break; case GDK_Return: if (event->state & GDK_CONTROL_MASK) - gtk_signal_emit_by_name (GTK_OBJECT (text), "activate"); + gtk_signal_emit_by_name(GTK_OBJECT(text), "activate"); else { position = text->point.index; - gtk_editable_insert_text (editable, "\n", 1, &position); + gtk_editable_insert_text(editable, "\n", 1, &position); } break; case GDK_Escape: - /* Don't insert literally */ + /* + * Don't insert literally + */ return_val = FALSE; break; #endif @@ -3493,13 +4103,15 @@ return_val = FALSE; #if 0 - if (event->state & GDK_CONTROL_MASK) { + if (event->state & GDK_CONTROL_MASK) + { if ((key >= 'A') && (key <= 'Z')) key -= 'A' - 'a'; - if ((key >= 'a') && (key <= 'z') && control_keys[(int) (key - 'a')]) + if ((key >= 'a') && (key <= 'z') + && control_keys[(int) (key - 'a')]) { - (* control_keys[(int) (key - 'a')]) (editable, event->time); + (*control_keys[(int) (key - 'a')]) (editable, event->time); return_val = TRUE; } @@ -3512,62 +4124,63 @@ if ((key >= 'a') && (key <= 'z') && alt_keys[(int) (key - 'a')]) { - (* alt_keys[(int) (key - 'a')]) (editable, event->time); + (*alt_keys[(int) (key - 'a')]) (editable, event->time); return_val = TRUE; } break; } #endif /* - if (event->length > 0) { - html->cursor_pos++; - gtk_editable_insert_text (editable, event->string, event->length, &position); - - return_val = TRUE; - } - else - return_val = FALSE; - */ + * if (event->length > 0) { + * html->cursor_pos++; + * gtk_editable_insert_text (editable, event->string, event->length, &position); + * + * return_val = TRUE; + * } + * else + * return_val = FALSE; + */ } } return return_val; } - -void -gtk_html_freeze (GtkHtml *html) + +void gtk_html_freeze(GtkHtml * html) { - g_return_if_fail (html != NULL); - g_return_if_fail (GTK_IS_HTML (html)); + g_return_if_fail(html != NULL); + g_return_if_fail(GTK_IS_HTML(html)); html->frozen++; } -void -gtk_html_thaw (GtkHtml *html) +void gtk_html_thaw(GtkHtml * html) { GdkRectangle area; - - g_return_if_fail (html != NULL); - g_return_if_fail (GTK_IS_HTML (html)); + + g_return_if_fail(html != NULL); + g_return_if_fail(GTK_IS_HTML(html)); html->frozen--; if (html->frozen < 0) - html->frozen = 0; - - if (html->frozen == 0) { - if (html->html_area) { - gint width, height; + html->frozen = 0; + + if (html->frozen == 0) + { + if (html->html_area) + { + gint width, + height; area.x = 0; area.y = 0; gdk_window_get_size(html->html_area, &width, &height); - area.width = width; - area.height = height; - + area.width = width; + area.height = height; + expose_html(html, &area, TRUE); } }