[vte/wip/html: 13/425] Work with VteCellAttr instead of VteCharAttributes
- From: Christian Persch <chpe src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [vte/wip/html: 13/425] Work with VteCellAttr instead of VteCharAttributes
- Date: Fri, 11 Apr 2014 17:49:16 +0000 (UTC)
commit 512330985be3f81bc0143408d16d0e4303c27dc6
Author: Joachim Breitner <mail joachim-breitner de>
Date: Wed Jul 20 23:55:06 2011 +0200
Work with VteCellAttr instead of VteCharAttributes
because VteCellAttr are more semantic. The downside is that some weird
ways to get hold of them are required.
src/vte.c | 52 ++++++++++++++++++++++++++++++++++++++++++----------
1 files changed, 42 insertions(+), 10 deletions(-)
---
diff --git a/src/vte.c b/src/vte.c
index b7f27a2..e0c78ba 100644
--- a/src/vte.c
+++ b/src/vte.c
@@ -6523,14 +6523,41 @@ vte_terminal_get_text_include_trailing_spaces(VteTerminal *terminal,
TRUE);
}
+/*
+ * Compares the visual attributes of a VteCellAttr for equality, but ignores
+ * attributes that tend to change from character to character or are otherwise
+ * strange (in particular: fragment, columns).
+ */
static gboolean
-vte_terminal_attributes_equal(const VteCharAttributes *attr1, const VteCharAttributes *attr2) {
- return (gdk_color_equal(&attr1->fore, &attr2->fore) &&
- gdk_color_equal(&attr1->back, &attr2->back) &&
- attr1->underline == attr2->underline &&
- attr1->strikethrough == attr2->strikethrough);
+vte_terminal_cellattr_equal(const VteCellAttr *attr1, const VteCellAttr *attr2) {
+ return (attr1->bold == attr2->bold &&
+ attr1->fore == attr2->fore &&
+ attr1->back == attr2->back &&
+ attr1->standout == attr2->standout &&
+ attr1->underline == attr2->underline &&
+ attr1->strikethrough == attr2->strikethrough &&
+ attr1->reverse == attr2->reverse &&
+ attr1->blink == attr2->blink &&
+ attr1->half == attr2->half &&
+ attr1->invisible == attr2->invisible);
}
+/*
+ * Similar to vte_terminal_find_charcell, but takes a VteCharAttribute for
+ * indexing and returns the VteCellAttr.
+ */
+static const VteCellAttr *
+vte_terminal_char_to_cell_attr(VteTerminal *terminal, VteCharAttributes *attr)
+{
+ VteCell *cell;
+
+ cell = vte_terminal_find_charcell(terminal, attr->column, attr->row);
+ if (cell)
+ return &cell->attr;
+ return NULL;
+}
+
+
/**
* vte_terminal_attributes_to_html:
* @terminal: a #VteTerminal
@@ -6538,7 +6565,9 @@ vte_terminal_attributes_equal(const VteCharAttributes *attr1, const VteCharAttri
* @attrs: (array) (element-type Vte.CharAttributes): text attributes, as created by vte_terminal_get_*
*
* Marks the given text up according to the given attributes, using HTML <span>
- * commands, and wraps the string in a <pre> element.
+ * commands, and wraps the string in a <pre> element. The attributes have to be
+ * "fresh" in the sense that the terminal must not have changed since they were
+ * obtained using the vte_terminal_get* function.
*
* Returns: (transfer full): a newly allocated text string, or %NULL.
*/
@@ -6546,7 +6575,7 @@ char *
vte_terminal_attributes_to_html(VteTerminal *terminal, const gchar *text, GArray *attrs) {
GString *string;
guint from,to;
- VteCharAttributes attr;
+ VteCellAttr *attr;
char *escaped;
g_assert(strlen(text) == attrs->len);
@@ -6565,10 +6594,13 @@ vte_terminal_attributes_to_html(VteTerminal *terminal, const gchar *text, GArray
g_string_append_c(string, '\n');
from = ++to;
} else {
- attr = g_array_index (attrs, VteCharAttributes, from);
+ attr = vte_terminal_char_to_cell_attr(terminal,
+ &g_array_index(attrs, VteCharAttributes, from));
while (text[to] != '\0' && text[to] != '\n' &&
- vte_terminal_attributes_equal(&attr,
- &g_array_index(attrs, VteCharAttributes, to))) {
+ vte_terminal_cellattr_equal(attr,
+ vte_terminal_char_to_cell_attr(terminal,
+ &g_array_index(attrs, VteCharAttributes, to))))
+ {
to++;
}
escaped = g_markup_escape_text(text + from, to - from);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]