Mercurial > pidgin.yaz
view console/libgnt/gntlabel.c @ 14510:1d73e11d8787
[gaim-migrate @ 17230]
Evan, see if this fixes the MSN get info crashes for you. Basically
canceled DNS requests weren't being removed from the queue, then Gaim
would pop them off the queue, but since the request had been canceled
the memory was free'd and is now invalid.
committer: Tailor Script <tailor@pidgin.im>
author | Mark Doliner <mark@kingant.net> |
---|---|
date | Sun, 10 Sep 2006 22:33:28 +0000 |
parents | 3ac156db9cb6 |
children | bfcdd361357e |
line wrap: on
line source
#include "gntlabel.h" #include "gntutils.h" #include <string.h> enum { SIGS = 1, }; static GntWidgetClass *parent_class = NULL; static guint signals[SIGS] = { 0 }; static void gnt_label_destroy(GntWidget *widget) { GntLabel *label = GNT_LABEL(widget); g_free(label->text); } static void gnt_label_draw(GntWidget *widget) { GntLabel *label = GNT_LABEL(widget); chtype flag = gnt_text_format_flag_to_chtype(label->flags); wbkgdset(widget->window, '\0' | flag); mvwprintw(widget->window, 0, 0, label->text); GNTDEBUG; } static void gnt_label_size_request(GntWidget *widget) { GntLabel *label = GNT_LABEL(widget); gnt_util_get_text_bound(label->text, &widget->priv.width, &widget->priv.height); } static void gnt_label_class_init(GntLabelClass *klass) { parent_class = GNT_WIDGET_CLASS(klass); parent_class->destroy = gnt_label_destroy; parent_class->draw = gnt_label_draw; parent_class->map = NULL; parent_class->size_request = gnt_label_size_request; GNTDEBUG; } static void gnt_label_init(GTypeInstance *instance, gpointer class) { GntWidget *widget = GNT_WIDGET(instance); GNT_WIDGET_SET_FLAGS(widget, GNT_WIDGET_GROW_X); widget->priv.minw = 3; widget->priv.minh = 1; GNTDEBUG; } /****************************************************************************** * GntLabel API *****************************************************************************/ GType gnt_label_get_gtype(void) { static GType type = 0; if(type == 0) { static const GTypeInfo info = { sizeof(GntLabelClass), NULL, /* base_init */ NULL, /* base_finalize */ (GClassInitFunc)gnt_label_class_init, NULL, /* class_finalize */ NULL, /* class_data */ sizeof(GntLabel), 0, /* n_preallocs */ gnt_label_init, /* instance_init */ }; type = g_type_register_static(GNT_TYPE_WIDGET, "GntLabel", &info, 0); } return type; } GntWidget *gnt_label_new(const char *text) { return gnt_label_new_with_format(text, 0); } GntWidget *gnt_label_new_with_format(const char *text, GntTextFormatFlags flags) { GntWidget *widget = g_object_new(GNT_TYPE_LABEL, NULL); GntLabel *label = GNT_LABEL(widget); label->text = gnt_util_onscreen_fit_string(text, -1); label->flags = flags; gnt_widget_set_take_focus(widget, FALSE); GNT_WIDGET_SET_FLAGS(widget, GNT_WIDGET_NO_BORDER | GNT_WIDGET_NO_SHADOW); return widget; } void gnt_label_set_text(GntLabel *label, const char *text) { g_free(label->text); label->text = gnt_util_onscreen_fit_string(text, -1); if (GNT_WIDGET(label)->window) { gnt_widget_hide(GNT_WIDGET(label)); gnt_label_size_request(GNT_WIDGET(label)); gnt_widget_draw(GNT_WIDGET(label)); } }