Question about crash in gtkhtml



Dear all,

I'm tring to write an instant messenger program. I use gtkhtml to show
received message.
To show the messages, I set the gtkhtml widget to edit mode and non-edit
mode. Then I can append html without reload.
To control the request from protocol in the message receive area, I use
hyper link.
When click on hyper link, I can do something according to the hyper link,
like windows live messenger does.
Besides, I have to clear the message receive area and re-paste history
message to change the request wording.

So I've written a small program to test if what I need works.
The same function works when I click on a extra button, but when I click on
hyperlink, the gtkhtml will crashs in htmlobject.c, html_object_get_engine.
I have no idea about why same function will conduct different result. Please
give me some advice about what to do in this condition.

The followings are some codes of my test program.

Thanks anyway.

MD Tsai

//--Begin of test program
#include <gtkhtml/gtkhtml.h>
#include <gtk/gtk.h>

void

link_clicked (GtkHTML *html, const gchar *url, gpointer user_data)
{
  gtk_html_set_editable (html, TRUE);
  gtk_html_select_all (html);
  gtk_html_cut (html);
  gtk_html_set_editable (html, FALSE);
  gtk_widget_queue_draw (GTK_WIDGET (html));
}

void
clear_button_clicked_cb (GtkButton *button, gpointer user_data)
{
  GtkHTML *html = GTK_HTML (user_data);
  gtk_html_set_editable (html, TRUE);
  gtk_html_select_all (html);
  gtk_html_cut (html);
  gtk_html_set_editable (html, FALSE);
  gtk_widget_queue_draw (GTK_WIDGET (html));
}

void
append_button_clicked_cb (GtkButton *button, gpointer user_data)
{
  GtkHTML *html = GTK_HTML (user_data);
  gtk_html_append_html (html, "<a href=\"accept://\">accept</a>");
  gtk_widget_queue_draw (GTK_WIDGET (html));
}

int
main (int argc, char **argv)
{
  GtkWidget *window;
  GtkWidget *vpaned;
  GtkWidget *sw;
  GtkWidget *html;
  GtkWidget *hbox;
  GtkWidget *button;

  gtk_init (&argc, &argv);

  window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
  g_signal_connect (window, "destroy", gtk_main_quit, NULL);

  vpaned = gtk_vpaned_new ();
  gtk_container_add (GTK_CONTAINER (window), vpaned);

  sw = gtk_scrolled_window_new (NULL, NULL);
  gtk_paned_add1 (GTK_PANED (vpaned), sw);
  html = gtk_html_new ();
  gtk_container_add (GTK_CONTAINER (sw), html);
  gtk_html_load_empty (GTK_HTML (html));
  gtk_html_set_editable (GTK_HTML (html), TRUE);
  gtk_html_set_editable (GTK_HTML (html), FALSE);
  g_signal_connect (G_OBJECT (html), "link_clicked",
   G_CALLBACK (link_clicked), NULL);

  hbox = gtk_hbox_new (FALSE, 0);
  gtk_paned_add2 (GTK_PANED (vpaned), hbox);

  button = gtk_button_new_with_label ("clear");
  gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
  g_signal_connect (G_OBJECT (button), "clicked",
    G_CALLBACK (clear_button_clicked_cb), html);

  button = gtk_button_new_with_label ("append");
  gtk_box_pack_start (GTK_BOX (hbox), button, TRUE, TRUE, 0);
  g_signal_connect (G_OBJECT (button), "clicked",
    G_CALLBACK (append_button_clicked_cb), html);

  gtk_widget_show_all (window);
  gtk_main();
  return 0;
}

//--End of test program

//--Back trace, using gtkhtml-3.13.91
#0  0x000000e8 in ?? ()
#1  0x004e891b in html_object_get_engine (self=0x9bd3548, e=0x99820e8) at
htmlobject.c:1296
#2  0x004eb233 in html_object_engine (o=0x9bd3548, e=0x99820e8) at
htmlobject.c:1303
#3  0x004d9f9a in draw_focus_object (e=0x99820e8, o=0x9bd3548,
offset=163392280) at htmlengine.c:6269
#4  0x004da14d in reset_focus_object_forall (o=0x0, e=0x99820e8) at
htmlengine.c:6283
#5  0x004da18f in html_engine_set_focus_object (e=0x99820e8, o=0x9bd2a20,
offset=5) at htmlengine.c:6301
#6  0x004b225c in button_press_event (widget=0x9944de8, event=0x9934738) at
gtkhtml.c:1826
#7  0x023ec650 in gtk_marshal_BOOLEAN__VOID () from /usr/lib/libgtk-
x11-2.0.so.0
#8  0x0024c589 in g_value_set_static_boxed () from /lib/libgobject-2.0.so.0
#9  0x0024dd9b in g_closure_invoke () from /lib/libgobject-2.0.so.0
#10 0x0025ea83 in g_signal_chain_from_overridden () from /lib/libgobject-
2.0.so.0
#11 0x0025f71f in g_signal_emit_valist () from /lib/libgobject-2.0.so.0
#12 0x0025fb19 in g_signal_emit () from /lib/libgobject-2.0.so.0
#13 0x02501408 in gtk_widget_get_default_style () from /usr/lib/libgtk-
x11-2.0.so.0
#14 0x023e5a13 in gtk_propagate_event () from /usr/lib/libgtk-x11-2.0.so.0
#15 0x023e6c17 in gtk_main_do_event () from /usr/lib/libgtk-x11-2.0.so.0
#16 0x0269a47a in gdk_add_client_message_filter () from /usr/lib/libgdk-
x11-2.0.so.0
#17 0x002af442 in g_main_context_dispatch () from /lib/libglib-2.0.so.0
#18 0x002b241f in g_main_context_check () from /lib/libglib-2.0.so.0
#19 0x002b27c9 in g_main_loop_run () from /lib/libglib-2.0.so.0
#20 0x023e7094 in gtk_main () from /usr/lib/libgtk-x11-2.0.so.0
#21 0x080491d8 in main (argc=40, argv=0x89) at gtkhtml.c:111



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]