pidgin: 767d9d66: Make some gtkimhtml functions private
markdoliner at pidgin.im
markdoliner at pidgin.im
Thu Sep 1 03:33:42 EDT 2011
----------------------------------------------------------------------
Revision: 767d9d6643d4894d810716fe49cf0b83c3ca12b8
Parent: 0d9c985d91b5de7f20f3443d7edbe22fb7ce80af
Author: markdoliner at pidgin.im
Date: 09/01/11 03:27:16
Branch: im.pidgin.pidgin
URL: http://d.pidgin.im/viewmtn/revision/info/767d9d6643d4894d810716fe49cf0b83c3ca12b8
Changelog:
Make some gtkimhtml functions private
Changes against parent 0d9c985d91b5de7f20f3443d7edbe22fb7ce80af
patched ChangeLog.API
patched pidgin/gtkimhtml.c
patched pidgin/gtkimhtml.h
patched pidgin/plugins/perl/common/GtkIMHtml.xs
-------------- next part --------------
============================================================
--- pidgin/gtkimhtml.c a9a70a96b2f0de5af04fa3e5fb205e37a0d0e46c
+++ pidgin/gtkimhtml.c 2017d0a430a2a8f4351dabfc3ce329bb79657a6d
@@ -3593,127 +3593,40 @@ void gtk_imhtml_page_down (GtkIMHtml *im
gtk_text_view_scroll_to_iter(GTK_TEXT_VIEW(imhtml), &iter, 0, TRUE, 0, 0);
}
-/* GtkIMHtmlScalable, gtk_imhtml_image, gtk_imhtml_hr */
-GtkIMHtmlScalable *gtk_imhtml_image_new(GdkPixbuf *img, const gchar *filename, int id)
+/**
+ * Destroys and frees a GTK+ IM/HTML scalable image.
+ *
+ * @param scale The GTK+ IM/HTML scalable.
+ */
+static void gtk_imhtml_image_free(GtkIMHtmlScalable *scale)
{
- GtkIMHtmlImage *im_image = g_malloc(sizeof(GtkIMHtmlImage));
+ GtkIMHtmlImage *image = (GtkIMHtmlImage *)scale;
- GTK_IMHTML_SCALABLE(im_image)->scale = gtk_imhtml_image_scale;
- GTK_IMHTML_SCALABLE(im_image)->add_to = gtk_imhtml_image_add_to;
- GTK_IMHTML_SCALABLE(im_image)->free = gtk_imhtml_image_free;
-
- im_image->pixbuf = img;
- im_image->image = GTK_IMAGE(gtk_image_new_from_pixbuf(im_image->pixbuf));
- im_image->width = gdk_pixbuf_get_width(img);
- im_image->height = gdk_pixbuf_get_height(img);
- im_image->mark = NULL;
- im_image->filename = g_strdup(filename);
- im_image->id = id;
- im_image->filesel = NULL;
-
- g_object_ref(img);
- return GTK_IMHTML_SCALABLE(im_image);
+ g_object_unref(image->pixbuf);
+ g_free(image->filename);
+ if (image->filesel)
+ gtk_widget_destroy(image->filesel);
+ g_free(scale);
}
-static gboolean
-animate_image_cb(gpointer data)
+/**
+ * Destroys and frees a GTK+ IM/HTML scalable animation.
+ *
+ * @param scale The GTK+ IM/HTML scalable.
+ */
+static void gtk_imhtml_animation_free(GtkIMHtmlScalable *scale)
{
- GtkIMHtmlImage *im_image;
- int width, height;
- int delay;
+ GtkIMHtmlAnimation *animation = (GtkIMHtmlAnimation *)scale;
- im_image = data;
+ if (animation->timer > 0)
+ g_source_remove(animation->timer);
+ if (animation->iter != NULL)
+ g_object_unref(animation->iter);
+ g_object_unref(animation->anim);
- /* Update the pointer to this GdkPixbuf frame of the animation */
- if (gdk_pixbuf_animation_iter_advance(GTK_IMHTML_ANIMATION(im_image)->iter, NULL)) {
- GdkPixbuf *pb = gdk_pixbuf_animation_iter_get_pixbuf(GTK_IMHTML_ANIMATION(im_image)->iter);
- g_object_unref(G_OBJECT(im_image->pixbuf));
- im_image->pixbuf = gdk_pixbuf_copy(pb);
-
- /* Update the displayed GtkImage */
- width = gdk_pixbuf_get_width(gtk_image_get_pixbuf(im_image->image));
- height = gdk_pixbuf_get_height(gtk_image_get_pixbuf(im_image->image));
- if (width > 0 && height > 0)
- {
- /* Need to scale the new frame to the same size as the old frame */
- GdkPixbuf *tmp;
- tmp = gdk_pixbuf_scale_simple(im_image->pixbuf, width, height, GDK_INTERP_BILINEAR);
- gtk_image_set_from_pixbuf(im_image->image, tmp);
- g_object_unref(G_OBJECT(tmp));
- } else {
- /* Display at full-size */
- gtk_image_set_from_pixbuf(im_image->image, im_image->pixbuf);
- }
- }
-
- delay = MIN(gdk_pixbuf_animation_iter_get_delay_time(GTK_IMHTML_ANIMATION(im_image)->iter), 100);
- GTK_IMHTML_ANIMATION(im_image)->timer = g_timeout_add(delay, animate_image_cb, im_image);
-
- return FALSE;
+ gtk_imhtml_image_free(scale);
}
-GtkIMHtmlScalable *gtk_imhtml_animation_new(GdkPixbufAnimation *anim, const gchar *filename, int id)
-{
- GtkIMHtmlImage *im_image = (GtkIMHtmlImage *) g_new0(GtkIMHtmlAnimation, 1);
-
- GTK_IMHTML_SCALABLE(im_image)->scale = gtk_imhtml_image_scale;
- GTK_IMHTML_SCALABLE(im_image)->add_to = gtk_imhtml_image_add_to;
- GTK_IMHTML_SCALABLE(im_image)->free = gtk_imhtml_animation_free;
-
- GTK_IMHTML_ANIMATION(im_image)->anim = anim;
- if (gdk_pixbuf_animation_is_static_image(anim)) {
- im_image->pixbuf = gdk_pixbuf_animation_get_static_image(anim);
- g_object_ref(im_image->pixbuf);
- } else {
- int delay;
- GdkPixbuf *pb;
- GTK_IMHTML_ANIMATION(im_image)->iter = gdk_pixbuf_animation_get_iter(anim, NULL);
- pb = gdk_pixbuf_animation_iter_get_pixbuf(GTK_IMHTML_ANIMATION(im_image)->iter);
- im_image->pixbuf = gdk_pixbuf_copy(pb);
- delay = MIN(gdk_pixbuf_animation_iter_get_delay_time(GTK_IMHTML_ANIMATION(im_image)->iter), 100);
- GTK_IMHTML_ANIMATION(im_image)->timer = g_timeout_add(delay, animate_image_cb, im_image);
- }
- im_image->image = GTK_IMAGE(gtk_image_new_from_pixbuf(im_image->pixbuf));
- im_image->width = gdk_pixbuf_animation_get_width(anim);
- im_image->height = gdk_pixbuf_animation_get_height(anim);
- im_image->filename = g_strdup(filename);
- im_image->id = id;
-
- g_object_ref(anim);
-
- return GTK_IMHTML_SCALABLE(im_image);
-}
-
-void gtk_imhtml_image_scale(GtkIMHtmlScalable *scale, int width, int height)
-{
- GtkIMHtmlImage *im_image = (GtkIMHtmlImage *)scale;
-
- if (im_image->width > width || im_image->height > height) {
- double ratio_w, ratio_h, ratio;
- int new_h, new_w;
- GdkPixbuf *new_image = NULL;
-
- ratio_w = ((double)width - 2) / im_image->width;
- ratio_h = ((double)height - 2) / im_image->height;
-
- ratio = (ratio_w < ratio_h) ? ratio_w : ratio_h;
-
- new_w = (int)(im_image->width * ratio);
- new_h = (int)(im_image->height * ratio);
-
- new_image = gdk_pixbuf_scale_simple(im_image->pixbuf, new_w, new_h, GDK_INTERP_BILINEAR);
- gtk_image_set_from_pixbuf(im_image->image, new_image);
- g_object_unref(G_OBJECT(new_image));
- } else if (gdk_pixbuf_get_width(gtk_image_get_pixbuf(im_image->image)) != im_image->width) {
- /* Enough space to show the full-size of the image. */
- GdkPixbuf *new_image;
-
- new_image = gdk_pixbuf_scale_simple(im_image->pixbuf, im_image->width, im_image->height, GDK_INTERP_BILINEAR);
- gtk_image_set_from_pixbuf(im_image->image, new_image);
- g_object_unref(G_OBJECT(new_image));
- }
-}
-
static void
image_save_yes_cb(GtkIMHtmlImageSave *save, const char *filename)
{
@@ -3918,55 +3831,51 @@ static gboolean gtk_imhtml_image_clicked
}
-static gboolean gtk_imhtml_smiley_clicked(GtkWidget *w, GdkEvent *event, GtkIMHtmlSmiley *smiley)
+/**
+ * Rescales a GTK+ IM/HTML scalable image to a given size.
+ *
+ * @param scale The GTK+ IM/HTML scalable.
+ * @param width The new width.
+ * @param height The new height.
+ */
+static void gtk_imhtml_image_scale(GtkIMHtmlScalable *scale, int width, int height)
{
- GdkPixbufAnimation *anim = NULL;
- GtkIMHtmlImageSave *save = NULL;
- gboolean ret;
+ GtkIMHtmlImage *im_image = (GtkIMHtmlImage *)scale;
- if (event->type != GDK_BUTTON_RELEASE || ((GdkEventButton*)event)->button != 3)
- return FALSE;
+ if (im_image->width > width || im_image->height > height) {
+ double ratio_w, ratio_h, ratio;
+ int new_h, new_w;
+ GdkPixbuf *new_image = NULL;
- anim = gtk_smiley_get_image(smiley);
- if (!anim)
- return FALSE;
+ ratio_w = ((double)width - 2) / im_image->width;
+ ratio_h = ((double)height - 2) / im_image->height;
- save = g_new0(GtkIMHtmlImageSave, 1);
- save->image = (GtkIMHtmlScalable *)gtk_imhtml_animation_new(anim, smiley->smile, 0);
- save->data = smiley->data; /* Do not need to memdup here, since the smiley is not
- destroyed before this GtkIMHtmlImageSave */
- save->datasize = smiley->datasize;
- ret = gtk_imhtml_image_clicked(w, event, save);
- g_object_set_data_full(G_OBJECT(w), "image-data", save->image, (GDestroyNotify)gtk_imhtml_animation_free);
- g_object_set_data_full(G_OBJECT(w), "image-save-data", save, (GDestroyNotify)g_free);
- return ret;
-}
+ ratio = (ratio_w < ratio_h) ? ratio_w : ratio_h;
-void gtk_imhtml_image_free(GtkIMHtmlScalable *scale)
-{
- GtkIMHtmlImage *image = (GtkIMHtmlImage *)scale;
+ new_w = (int)(im_image->width * ratio);
+ new_h = (int)(im_image->height * ratio);
- g_object_unref(image->pixbuf);
- g_free(image->filename);
- if (image->filesel)
- gtk_widget_destroy(image->filesel);
- g_free(scale);
-}
+ new_image = gdk_pixbuf_scale_simple(im_image->pixbuf, new_w, new_h, GDK_INTERP_BILINEAR);
+ gtk_image_set_from_pixbuf(im_image->image, new_image);
+ g_object_unref(G_OBJECT(new_image));
+ } else if (gdk_pixbuf_get_width(gtk_image_get_pixbuf(im_image->image)) != im_image->width) {
+ /* Enough space to show the full-size of the image. */
+ GdkPixbuf *new_image;
-void gtk_imhtml_animation_free(GtkIMHtmlScalable *scale)
-{
- GtkIMHtmlAnimation *animation = (GtkIMHtmlAnimation *)scale;
-
- if (animation->timer > 0)
- g_source_remove(animation->timer);
- if (animation->iter != NULL)
- g_object_unref(animation->iter);
- g_object_unref(animation->anim);
-
- gtk_imhtml_image_free(scale);
+ new_image = gdk_pixbuf_scale_simple(im_image->pixbuf, im_image->width, im_image->height, GDK_INTERP_BILINEAR);
+ gtk_image_set_from_pixbuf(im_image->image, new_image);
+ g_object_unref(G_OBJECT(new_image));
+ }
}
-void gtk_imhtml_image_add_to(GtkIMHtmlScalable *scale, GtkIMHtml *imhtml, GtkTextIter *iter)
+/**
+ * Adds a GTK+ IM/HTML scalable image to a given GTK+ IM/HTML at a given iter.
+ *
+ * @param scale The GTK+ IM/HTML scalable.
+ * @param imhtml The GTK+ IM/HTML.
+ * @param iter The GtkTextIter at which to add the scalable.
+ */
+static void gtk_imhtml_image_add_to(GtkIMHtmlScalable *scale, GtkIMHtml *imhtml, GtkTextIter *iter)
{
GtkIMHtmlImage *image = (GtkIMHtmlImage *)scale;
GtkWidget *box = gtk_event_box_new();
@@ -3994,6 +3903,115 @@ void gtk_imhtml_image_add_to(GtkIMHtmlSc
g_object_set_data_full(G_OBJECT(box), "image-save-data", save, (GDestroyNotify)g_free);
}
+/* GtkIMHtmlScalable, gtk_imhtml_image, gtk_imhtml_hr */
+GtkIMHtmlScalable *gtk_imhtml_image_new(GdkPixbuf *img, const gchar *filename, int id)
+{
+ GtkIMHtmlImage *im_image = g_malloc(sizeof(GtkIMHtmlImage));
+
+ GTK_IMHTML_SCALABLE(im_image)->scale = gtk_imhtml_image_scale;
+ GTK_IMHTML_SCALABLE(im_image)->add_to = gtk_imhtml_image_add_to;
+ GTK_IMHTML_SCALABLE(im_image)->free = gtk_imhtml_image_free;
+
+ im_image->pixbuf = img;
+ im_image->image = GTK_IMAGE(gtk_image_new_from_pixbuf(im_image->pixbuf));
+ im_image->width = gdk_pixbuf_get_width(img);
+ im_image->height = gdk_pixbuf_get_height(img);
+ im_image->mark = NULL;
+ im_image->filename = g_strdup(filename);
+ im_image->id = id;
+ im_image->filesel = NULL;
+
+ g_object_ref(img);
+ return GTK_IMHTML_SCALABLE(im_image);
+}
+
+static gboolean
+animate_image_cb(gpointer data)
+{
+ GtkIMHtmlImage *im_image;
+ int width, height;
+ int delay;
+
+ im_image = data;
+
+ /* Update the pointer to this GdkPixbuf frame of the animation */
+ if (gdk_pixbuf_animation_iter_advance(GTK_IMHTML_ANIMATION(im_image)->iter, NULL)) {
+ GdkPixbuf *pb = gdk_pixbuf_animation_iter_get_pixbuf(GTK_IMHTML_ANIMATION(im_image)->iter);
+ g_object_unref(G_OBJECT(im_image->pixbuf));
+ im_image->pixbuf = gdk_pixbuf_copy(pb);
+
+ /* Update the displayed GtkImage */
+ width = gdk_pixbuf_get_width(gtk_image_get_pixbuf(im_image->image));
+ height = gdk_pixbuf_get_height(gtk_image_get_pixbuf(im_image->image));
+ if (width > 0 && height > 0)
+ {
+ /* Need to scale the new frame to the same size as the old frame */
+ GdkPixbuf *tmp;
+ tmp = gdk_pixbuf_scale_simple(im_image->pixbuf, width, height, GDK_INTERP_BILINEAR);
+ gtk_image_set_from_pixbuf(im_image->image, tmp);
+ g_object_unref(G_OBJECT(tmp));
+ } else {
+ /* Display at full-size */
+ gtk_image_set_from_pixbuf(im_image->image, im_image->pixbuf);
+ }
+ }
+
+ delay = MIN(gdk_pixbuf_animation_iter_get_delay_time(GTK_IMHTML_ANIMATION(im_image)->iter), 100);
+ GTK_IMHTML_ANIMATION(im_image)->timer = g_timeout_add(delay, animate_image_cb, im_image);
+
+ return FALSE;
+}
+
+/**
+ * Creates and returns a new GTK+ IM/HTML scalable object with an
+ * animated image.
+ *
+ * @param img A GdkPixbufAnimation of the image to add.
+ * @param filename The filename to associate with the image.
+ * @param id The id to associate with the image.
+ *
+ * @return A new IM/HTML Scalable object with an image.
+ *
+ * @since 2.1.0
+ */
+/*
+ * TODO: All this animation code could be combined much better with
+ * the image code. It couldn't be done when it was written
+ * because it requires breaking backward compatibility. It
+ * would be good to do it for 3.0.0.
+ */
+static GtkIMHtmlScalable *gtk_imhtml_animation_new(GdkPixbufAnimation *anim, const gchar *filename, int id)
+{
+ GtkIMHtmlImage *im_image = (GtkIMHtmlImage *) g_new0(GtkIMHtmlAnimation, 1);
+
+ GTK_IMHTML_SCALABLE(im_image)->scale = gtk_imhtml_image_scale;
+ GTK_IMHTML_SCALABLE(im_image)->add_to = gtk_imhtml_image_add_to;
+ GTK_IMHTML_SCALABLE(im_image)->free = gtk_imhtml_animation_free;
+
+ GTK_IMHTML_ANIMATION(im_image)->anim = anim;
+ if (gdk_pixbuf_animation_is_static_image(anim)) {
+ im_image->pixbuf = gdk_pixbuf_animation_get_static_image(anim);
+ g_object_ref(im_image->pixbuf);
+ } else {
+ int delay;
+ GdkPixbuf *pb;
+ GTK_IMHTML_ANIMATION(im_image)->iter = gdk_pixbuf_animation_get_iter(anim, NULL);
+ pb = gdk_pixbuf_animation_iter_get_pixbuf(GTK_IMHTML_ANIMATION(im_image)->iter);
+ im_image->pixbuf = gdk_pixbuf_copy(pb);
+ delay = MIN(gdk_pixbuf_animation_iter_get_delay_time(GTK_IMHTML_ANIMATION(im_image)->iter), 100);
+ GTK_IMHTML_ANIMATION(im_image)->timer = g_timeout_add(delay, animate_image_cb, im_image);
+ }
+ im_image->image = GTK_IMAGE(gtk_image_new_from_pixbuf(im_image->pixbuf));
+ im_image->width = gdk_pixbuf_animation_get_width(anim);
+ im_image->height = gdk_pixbuf_animation_get_height(anim);
+ im_image->filename = g_strdup(filename);
+ im_image->id = id;
+
+ g_object_ref(anim);
+
+ return GTK_IMHTML_SCALABLE(im_image);
+}
+
GtkIMHtmlScalable *gtk_imhtml_hr_new()
{
GtkIMHtmlHr *hr = g_malloc(sizeof(GtkIMHtmlHr));
@@ -4918,6 +4936,30 @@ static void animated_smiley_destroy_cb(G
}
}
+static gboolean gtk_imhtml_smiley_clicked(GtkWidget *w, GdkEvent *event, GtkIMHtmlSmiley *smiley)
+{
+ GdkPixbufAnimation *anim = NULL;
+ GtkIMHtmlImageSave *save = NULL;
+ gboolean ret;
+
+ if (event->type != GDK_BUTTON_RELEASE || ((GdkEventButton*)event)->button != 3)
+ return FALSE;
+
+ anim = gtk_smiley_get_image(smiley);
+ if (!anim)
+ return FALSE;
+
+ save = g_new0(GtkIMHtmlImageSave, 1);
+ save->image = (GtkIMHtmlScalable *)gtk_imhtml_animation_new(anim, smiley->smile, 0);
+ save->data = smiley->data; /* Do not need to memdup here, since the smiley is not
+ destroyed before this GtkIMHtmlImageSave */
+ save->datasize = smiley->datasize;
+ ret = gtk_imhtml_image_clicked(w, event, save);
+ g_object_set_data_full(G_OBJECT(w), "image-data", save->image, (GDestroyNotify)gtk_imhtml_animation_free);
+ g_object_set_data_full(G_OBJECT(w), "image-save-data", save, (GDestroyNotify)g_free);
+ return ret;
+}
+
void gtk_imhtml_insert_smiley_at_iter(GtkIMHtml *imhtml, const char *sml, char *smiley, GtkTextIter *iter)
{
GdkPixbuf *pixbuf = NULL;
============================================================
--- pidgin/gtkimhtml.h 23f0ce63b0b64e9b3e63286b32dba83203b5503c
+++ pidgin/gtkimhtml.h d9209faaab008ed27e593bc4f7d3d6a0cfda589b
@@ -427,62 +427,6 @@ GtkIMHtmlScalable *gtk_imhtml_image_new(
GtkIMHtmlScalable *gtk_imhtml_image_new(GdkPixbuf *img, const gchar *filename, int id);
/**
- * Creates and returns a new GTK+ IM/HTML scalable object with an
- * animated image.
- *
- * @param img A GdkPixbufAnimation of the image to add.
- * @param filename The filename to associate with the image.
- * @param id The id to associate with the image.
- *
- * @return A new IM/HTML Scalable object with an image.
- *
- * @since 2.1.0
- */
-/*
- * TODO: All this animation code could be combined much better with
- * the image code. It couldn't be done when it was written
- * because it requires breaking backward compatibility. It
- * would be good to do it for 3.0.0.
- */
-GtkIMHtmlScalable *gtk_imhtml_animation_new(GdkPixbufAnimation *img, const gchar *filename, int id);
-
-/**
- * Destroys and frees a GTK+ IM/HTML scalable image.
- *
- * @param scale The GTK+ IM/HTML scalable.
- */
-/* TODO: Is there any reason this isn't private? */
-void gtk_imhtml_image_free(GtkIMHtmlScalable *scale);
-
-/**
- * Destroys and frees a GTK+ IM/HTML scalable animation.
- *
- * @param scale The GTK+ IM/HTML scalable.
- */
-/* TODO: Is there any reason this isn't private? */
-void gtk_imhtml_animation_free(GtkIMHtmlScalable *scale);
-
-/**
- * Rescales a GTK+ IM/HTML scalable image to a given size.
- *
- * @param scale The GTK+ IM/HTML scalable.
- * @param width The new width.
- * @param height The new height.
- */
-/* TODO: Is there any reason this isn't private? */
-void gtk_imhtml_image_scale(GtkIMHtmlScalable *scale, int width, int height);
-
-/**
- * Adds a GTK+ IM/HTML scalable image to a given GTK+ IM/HTML at a given iter.
- *
- * @param scale The GTK+ IM/HTML scalable.
- * @param imhtml The GTK+ IM/HTML.
- * @param iter The GtkTextIter at which to add the scalable.
- */
-/* TODO: Is there any reason this isn't private? */
-void gtk_imhtml_image_add_to(GtkIMHtmlScalable *scale, GtkIMHtml *imhtml, GtkTextIter *iter);
-
-/**
* Creates and returns an new GTK+ IM/HTML scalable with a horizontal rule.
*
* @return A new IM/HTML Scalable object with an image.
============================================================
--- ChangeLog.API b8f1f69d7318e7f826ab4954327f579ceab9e8c9
+++ ChangeLog.API 034711525ba80c7ba6ab0a56f753e52e6b5aacd1
@@ -83,6 +83,11 @@ version 3.0.0 (??/??/????):
* GtkIMHtml.clipboard_html_string
* GtkIMHtml.clipboard_text_string
* GtkIMHtmlFontDetail
+ * gtk_imhtml_animation_free
+ * gtk_imhtml_animation_new
+ * gtk_imhtml_image_add_to
+ * gtk_imhtml_image_free
+ * gtk_imhtml_image_scale
* pidgin_blist_update_account_error_state
* pidgin_check_if_dir
* PIDGIN_DIALOG
============================================================
--- pidgin/plugins/perl/common/GtkIMHtml.xs 1186d55a37259a4db14f8dd09b7552d88285c016
+++ pidgin/plugins/perl/common/GtkIMHtml.xs 34a3274d396448e628c865274023eac5741b666e
@@ -323,19 +323,6 @@ PPCODE:
}
XPUSHs(sv_2mortal(newRV_noinc((SV *)lines)));
-MODULE = Pidgin::IMHtml PACKAGE = Pidgin::IMHtml::Scalable PREFIX = gtk_imhtml_image_
-PROTOTYPES: ENABLE
-
-void
-gtk_imhtml_image_free(scale)
- Pidgin::IMHtml::Scalable scale
-
-void
-gtk_imhtml_image_scale(scale, width, height)
- Pidgin::IMHtml::Scalable scale
- int width
- int height
-
MODULE = Pidgin::IMHtml PACKAGE = Pidgin::IMHtml::Hr PREFIX = gtk_imhtml_hr_
PROTOTYPES: ENABLE
More information about the Commits
mailing list