diff options
Diffstat (limited to 'gtk/gtktooltips.c')
-rw-r--r-- | gtk/gtktooltips.c | 168 |
1 files changed, 86 insertions, 82 deletions
diff --git a/gtk/gtktooltips.c b/gtk/gtktooltips.c index 774258036e..272eadc700 100644 --- a/gtk/gtktooltips.c +++ b/gtk/gtktooltips.c @@ -29,6 +29,9 @@ #define DEFAULT_DELAY 500 /* Default delay in ms */ +static void gtk_tooltips_class_init (GtkTooltipsClass *klass); +static void gtk_tooltips_init (GtkTooltips *tooltips); +static void gtk_tooltips_destroy (GtkObject *object); static gint gtk_tooltips_event_handler (GtkWidget *widget, GdkEvent *event); @@ -42,47 +45,61 @@ static gint gtk_tooltips_widget_visible (GtkWidget *widget); static gint gtk_tooltips_timeout (gpointer data); static void gtk_tooltips_create_window (GtkTooltips *tooltips); static void gtk_tooltips_draw_tips (GtkTooltips *tooltips); -static void gtk_tooltips_real_destroy (GtkTooltips *tooltips); -GtkTooltips * -gtk_tooltips_new () -{ - GtkTooltips *tooltips; +static GtkDataClass *parent_class; - tooltips = g_new0 (GtkTooltips, 1); +guint +gtk_tooltips_get_type () +{ + static guint tooltips_type = 0; - if (tooltips != NULL) + if (!tooltips_type) { - tooltips->ref_count = 1; - - tooltips->enabled = TRUE; - tooltips->numwidgets = 0; - tooltips->delay = DEFAULT_DELAY; - tooltips->widget_list = NULL; - tooltips->gc = NULL; - tooltips->foreground = NULL; - tooltips->background = NULL; - tooltips->tip_window = NULL; + GtkTypeInfo tooltips_info = + { + "GtkTooltips", + sizeof (GtkTooltips), + sizeof (GtkTooltipsClass), + (GtkClassInitFunc) gtk_tooltips_class_init, + (GtkObjectInitFunc) gtk_tooltips_init, + (GtkArgSetFunc) NULL, + (GtkArgGetFunc) NULL, + }; + + tooltips_type = gtk_type_unique (gtk_data_get_type (), &tooltips_info); } - return tooltips; + return tooltips_type; } -GtkTooltips* -gtk_tooltips_ref (GtkTooltips *tooltips) +static void +gtk_tooltips_class_init (GtkTooltipsClass *class) { - g_return_val_if_fail (tooltips != NULL, NULL); - tooltips->ref_count += 1; - return tooltips; + GtkObjectClass *object_class; + + object_class = (GtkObjectClass*) class; + parent_class = gtk_type_class (gtk_data_get_type ()); + + object_class->destroy = gtk_tooltips_destroy; } -void -gtk_tooltips_unref (GtkTooltips *tooltips) +static void +gtk_tooltips_init (GtkTooltips *tooltips) { - g_return_if_fail (tooltips != NULL); - tooltips->ref_count -= 1; - if (tooltips->ref_count == 0) - gtk_tooltips_real_destroy (tooltips); + tooltips->enabled = TRUE; + tooltips->numwidgets = 0; + tooltips->delay = DEFAULT_DELAY; + tooltips->widget_list = NULL; + tooltips->gc = NULL; + tooltips->foreground = NULL; + tooltips->background = NULL; + tooltips->tip_window = NULL; +} + +GtkTooltips * +gtk_tooltips_new () +{ + return gtk_type_new (gtk_tooltips_get_type ()); } void @@ -93,21 +110,22 @@ gtk_tooltips_free_string (gpointer data, gpointer user_data) } static void -gtk_tooltips_destroy_data (GtkTooltips *tooltips, - GtkTooltipsData *tooltipsdata) +gtk_tooltips_destroy_data (GtkTooltipsData *tooltipsdata) { g_free (tooltipsdata->tips_text); g_list_foreach (tooltipsdata->row, gtk_tooltips_free_string, 0); if (tooltipsdata->row) g_list_free (tooltipsdata->row); gtk_signal_disconnect_by_data (GTK_OBJECT (tooltipsdata->widget), - (gpointer) tooltips); + (gpointer) tooltipsdata); + gtk_widget_unref (tooltipsdata->widget); g_free (tooltipsdata); } static void -gtk_tooltips_real_destroy (GtkTooltips *tooltips) +gtk_tooltips_destroy (GtkObject *object) { + GtkTooltips *tooltips = GTK_TOOLTIPS (object); GList *current; GtkTooltipsData *tooltipsdata; @@ -125,25 +143,30 @@ gtk_tooltips_real_destroy (GtkTooltips *tooltips) while (current != NULL) { tooltipsdata = (GtkTooltipsData*) current->data; - gtk_tooltips_destroy_data (tooltips, tooltipsdata); current = current->next; + gtk_tooltips_widget_remove (tooltipsdata->widget, tooltipsdata); } - g_list_free (tooltips->widget_list); } if (tooltips->tip_window != NULL) - gtk_widget_destroy (tooltips->tip_window); + { + gtk_widget_destroy (tooltips->tip_window); + gtk_widget_unref (tooltips->tip_window); + tooltips->tip_window = NULL; + } if (tooltips->gc != NULL) - gdk_gc_destroy (tooltips->gc); - - g_free (tooltips); + { + gdk_gc_destroy (tooltips->gc); + tooltips->gc = NULL; + } } static void gtk_tooltips_create_window (GtkTooltips *tooltips) { tooltips->tip_window = gtk_window_new (GTK_WINDOW_POPUP); + gtk_widget_ref (tooltips->tip_window); gtk_window_set_policy (GTK_WINDOW (tooltips->tip_window), FALSE, FALSE, TRUE); gtk_widget_realize (tooltips->tip_window); } @@ -291,18 +314,19 @@ gtk_tooltips_set_tips (GtkTooltips *tooltips, g_return_if_fail (tooltips != NULL); g_return_if_fail (widget != NULL); - if (gtk_object_get_data (GTK_OBJECT (widget), "_GtkTooltips") != NULL) - gtk_tooltips_widget_remove (widget, NULL); + tooltipsdata = (GtkTooltipsData *) + gtk_object_get_data (GTK_OBJECT (widget), "_GtkTooltips"); + if (tooltipsdata) + gtk_tooltips_widget_remove (tooltipsdata->widget, tooltipsdata); - if (gtk_object_get_data (GTK_OBJECT (widget), "_GtkTooltips") != NULL) - gtk_tooltips_widget_remove (widget, NULL); - tooltipsdata = g_new(GtkTooltipsData, 1); if (tooltipsdata != NULL) { memset (tooltipsdata, 0, sizeof (*tooltipsdata)); + tooltipsdata->tooltips = tooltips; tooltipsdata->widget = widget; + gtk_widget_ref (widget); tooltipsdata->tips_text = g_strdup (tips_text); if (!tooltipsdata->tips_text) @@ -318,22 +342,22 @@ gtk_tooltips_set_tips (GtkTooltips *tooltips, gtk_signal_connect_after(GTK_OBJECT (widget), "event", (GtkSignalFunc) gtk_tooltips_event_handler, - (gpointer) tooltips); + (gpointer) tooltipsdata); gtk_object_set_data (GTK_OBJECT (widget), "_GtkTooltips", - (gpointer) tooltips); - - gtk_signal_connect (GTK_OBJECT (widget), "destroy", - (GtkSignalFunc) gtk_tooltips_widget_remove, - (gpointer) tooltips); + (gpointer) tooltipsdata); gtk_signal_connect (GTK_OBJECT (widget), "unmap", (GtkSignalFunc) gtk_tooltips_widget_unmap, - (gpointer) tooltips); + (gpointer) tooltipsdata); gtk_signal_connect (GTK_OBJECT (widget), "unrealize", (GtkSignalFunc) gtk_tooltips_widget_unmap, - (gpointer) tooltips); + (gpointer) tooltipsdata); + + gtk_signal_connect (GTK_OBJECT (widget), "destroy", + (GtkSignalFunc) gtk_tooltips_widget_remove, + (gpointer) tooltipsdata); } } @@ -515,7 +539,9 @@ gtk_tooltips_event_handler (GtkWidget *widget, GtkTooltipsData *old_widget; gint returnval = FALSE; - tooltips = (GtkTooltips*) gtk_object_get_data (GTK_OBJECT (widget),"_GtkTooltips"); + old_widget = (GtkTooltipsData*) + gtk_object_get_data (GTK_OBJECT (widget),"_GtkTooltips"); + tooltips = old_widget->tooltips; if (tooltips->enabled == FALSE) return returnval; @@ -582,9 +608,8 @@ static void gtk_tooltips_widget_unmap (GtkWidget *widget, gpointer data) { - GtkTooltips *tooltips; - - tooltips = (GtkTooltips*) gtk_object_get_data (GTK_OBJECT (widget), "_GtkTooltips"); + GtkTooltipsData *tooltipsdata = (GtkTooltipsData *)data; + GtkTooltips *tooltips = tooltipsdata->tooltips; if (tooltips->active_widget && (tooltips->active_widget->widget == widget)) @@ -599,32 +624,11 @@ static void gtk_tooltips_widget_remove (GtkWidget *widget, gpointer data) { - GtkTooltips *tooltips; - GtkTooltipsData *tooltipsdata; - GList *list; - - tooltips = (GtkTooltips*) gtk_object_get_data (GTK_OBJECT (widget), "_GtkTooltips"); + GtkTooltipsData *tooltipsdata = (GtkTooltipsData *)data; + GtkTooltips *tooltips = tooltipsdata->tooltips; gtk_tooltips_widget_unmap (widget, data); - - list = g_list_first (tooltips->widget_list); - while (list) - { - tooltipsdata = (GtkTooltipsData*) list->data; - - if (tooltipsdata->widget == widget) - break; - - list = list->next; - } - - if (list) - { - tooltipsdata = (GtkTooltipsData*) list->data; - tooltips->widget_list = g_list_remove (tooltips->widget_list, - tooltipsdata); - gtk_tooltips_destroy_data (tooltips, tooltipsdata); - } - - gtk_object_set_data (GTK_OBJECT (widget), "_GtkTooltips", NULL); + tooltips->widget_list = g_list_remove (tooltips->widget_list, + tooltipsdata); + gtk_tooltips_destroy_data (tooltipsdata); } |