qulogic/talkatu

Add some additional tags for rendering more complex documents in pidgin
/*
* talkatu
* Copyright (C) 2017-2018 Gary Kramlich <grim@reaperworld.com>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, see <http://www.gnu.org/licenses/>.
*/
#include <stdarg.h>
#include <gtk/gtk.h>
#include <pango/pango.h>
#include <talkatu/talkatutag.h>
#include <talkatu/talkatutagtable.h>
/**
* SECTION:talkatutagtable
* @Title: TagTable
* @Short_description: A simple formatting tag_table
*
* Talkatu provides a simple formatting tag_table that gives the user the ability
* to format any #TalkatuBuffer via the formatting actions.
*/
G_DEFINE_TYPE(TalkatuTagTable, talkatu_tag_table, GTK_TYPE_TEXT_TAG_TABLE)
/******************************************************************************
* Helpers
*****************************************************************************/
static void
talkatu_tag_table_add_tag(TalkatuTagTable *table,
const gchar *name,
const gchar *first_property,
...)
{
GtkTextTag *tag = gtk_text_tag_new(name);
va_list vargs;
g_return_if_fail(first_property != NULL);
va_start(vargs, first_property);
g_object_set_valist(G_OBJECT(tag), first_property, vargs);
va_end(vargs);
gtk_text_tag_table_add(GTK_TEXT_TAG_TABLE(table), tag);
}
/******************************************************************************
* GObject Stuff
*****************************************************************************/
static void
talkatu_tag_table_init(TalkatuTagTable *table) {
GdkRGBA color = {0.0, 0.0, 0.0, 0.0};
talkatu_tag_table_add_tag(
table, TALKATU_TAG_BOLD,
"weight", PANGO_WEIGHT_BOLD,
NULL
);
talkatu_tag_table_add_tag(
table, TALKATU_TAG_ITALIC,
"style", PANGO_STYLE_ITALIC,
NULL
);
talkatu_tag_table_add_tag(
table, TALKATU_TAG_UNDERLINE,
"underline", PANGO_UNDERLINE_SINGLE,
NULL
);
talkatu_tag_table_add_tag(
table, TALKATU_TAG_STRIKETHROUGH,
"strikethrough", TRUE,
NULL
);
talkatu_tag_table_add_tag(
table, TALKATU_TAG_SUBSCRIPT,
"rise", -5000,
NULL
);
talkatu_tag_table_add_tag(
table, TALKATU_TAG_SUPERSCRIPT,
"rise", 5000,
NULL
);
talkatu_tag_table_add_tag(
table, TALKATU_TAG_PRE,
"family", "Monospace",
NULL
);
gdk_rgba_parse(&color, "#C0C0C0FF");
talkatu_tag_table_add_tag(
table, TALKATU_TAG_CODE,
"family", "Monospace",
"background-rgba", &color,
NULL
);
gdk_rgba_parse(&color, "#22FF00FF");
talkatu_tag_table_add_tag(
table, TALKATU_TAG_SEARCH,
"background-rgba", &color,
"weight", PANGO_WEIGHT_BOLD,
NULL
);
talkatu_tag_table_add_tag(
table, TALKATU_TAG_H1,
"weight", PANGO_WEIGHT_BOLD,
"pixels-above-lines", 11,
"pixels-below-lines", 11,
"scale", 2.0,
NULL
);
talkatu_tag_table_add_tag(
table, TALKATU_TAG_H2,
"weight", PANGO_WEIGHT_BOLD,
"scale", 1.5,
NULL
);
talkatu_tag_table_add_tag(
table, TALKATU_TAG_H3,
"weight", PANGO_WEIGHT_BOLD,
"scale", 1.1699,
NULL
);
talkatu_tag_table_add_tag(
table, TALKATU_TAG_H4,
"weight", PANGO_WEIGHT_BOLD,
NULL
);
talkatu_tag_table_add_tag(
table, TALKATU_TAG_H5,
"weight", PANGO_WEIGHT_BOLD,
"scale", 0.8299,
NULL
);
talkatu_tag_table_add_tag(
table, TALKATU_TAG_H6,
"weight", PANGO_WEIGHT_BOLD,
"scale", 0.67,
NULL
);
gdk_rgba_parse(&color, "#0000FFFF");
talkatu_tag_table_add_tag(
table, TALKATU_TAG_ANCHOR,
"foreground-rgba", &color,
"underline", PANGO_UNDERLINE_SINGLE,
"underline-rgba", &color,
NULL
);
talkatu_tag_table_add_tag(
table, TALKATU_TAG_DL,
"pixels-above-lines", 16, /* needs to be dynamic */
"pixels-below-lines", 16, /* needs to be dynamic */
NULL
);
talkatu_tag_table_add_tag(
table, TALKATU_TAG_DT,
"pixels-above-lines", 16, /* needs to be dynamic */
"pixels-below-lines", 16, /* needs to be dynamic */
NULL
);
talkatu_tag_table_add_tag(
table, TALKATU_TAG_DD,
"left-margin", 40,
NULL
);
}
static void
talkatu_tag_table_class_init(TalkatuTagTableClass *klass) {
}
/******************************************************************************
* Public API
*****************************************************************************/
/**
* talkatu_tag_table_new:
*
* Creates a new #TalkatuTagTable that provides the user with an interface to
* control the formatting of a #TalkatuBuffer.
*
* Returns: (transfer full): The new #TalkatuTagTable instance.
*/
GtkTextTagTable *talkatu_tag_table_new(void) {
return GTK_TEXT_TAG_TABLE(g_object_new(
TALKATU_TYPE_TAG_TABLE,
NULL
));
}