summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Wilson <chris@chris-wilson.co.uk>2007-02-23 13:21:02 +0000
committerChris Wilson <cpwilson@src.gnome.org>2007-02-23 13:21:02 +0000
commit713bb7322e8e012deccabe331b21a5b9a60864ba (patch)
treefe22bc9c731c74840f5ec04bfefffdfb28d8ed59
parent2b0e46223ad2952192f3aa7d2e18b0f636f843f4 (diff)
downloadvte-713bb7322e8e012deccabe331b21a5b9a60864ba.tar.gz
Add a new debug flag to monitor draw operations. Don't issue individual
2007-02-23 Chris Wilson <chris@chris-wilson.co.uk> Add a new debug flag to monitor draw operations. Don't issue individual glyphs for is_local_graphic() in the middle of a run. * src/debug.c: (_vte_debug_parse_string): * src/debug.h: * src/vte.c: (vte_terminal_unichar_is_local_graphic), (vte_terminal_draw_rows), (vte_terminal_paint): * src/vtedraw.c: (_vte_draw_init_user), (_vte_draw_init_default), (_vte_draw_new), (_vte_draw_free), (_vte_draw_get_visual), (_vte_draw_get_colormap), (_vte_draw_start), (_vte_draw_end), (_vte_draw_set_background_color), (_vte_draw_set_background_image), (_vte_draw_requires_repaint), (_vte_draw_clip), (_vte_draw_clear), (_vte_draw_set_text_font), (_vte_draw_get_text_width), (_vte_draw_get_text_height), (_vte_draw_get_text_ascent), (_vte_draw_get_char_width), (_vte_draw_get_using_fontconfig), (_vte_draw_text), (_vte_draw_char), (_vte_draw_has_char), (_vte_draw_fill_rectangle), (_vte_draw_draw_rectangle), (_vte_draw_set_scroll): * src/vtedraw.h: * src/vteft2.c: (_vte_ft2_draw_has_char): * src/vtegl.c: (_vte_gl_draw_has_char): * src/vtepango.c: (_vte_pango_draw_has_char): * src/vtepangox.c: (_vte_pango_x_draw_has_char): * src/vteskel.c: (_vte_skel_draw_has_char): * src/vtexft.c: (_vte_xft_draw_has_char): svn path=/trunk/; revision=1729
-rw-r--r--ChangeLog29
-rw-r--r--src/debug.c3
-rw-r--r--src/debug.h3
-rw-r--r--src/vte.c46
-rw-r--r--src/vtedraw.c252
-rw-r--r--src/vtedraw.h2
-rw-r--r--src/vteft2.c16
-rw-r--r--src/vtegl.c16
-rw-r--r--src/vtepango.c7
-rw-r--r--src/vtepangox.c8
-rw-r--r--src/vteskel.c7
-rw-r--r--src/vtexft.c16
12 files changed, 281 insertions, 124 deletions
diff --git a/ChangeLog b/ChangeLog
index 91d7adc0..077b0b12 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,34 @@
2007-02-23 Chris Wilson <chris@chris-wilson.co.uk>
+ Add a new debug flag to monitor draw operations.
+ Don't issue individual glyphs for is_local_graphic() in the middle of
+ a run.
+
+ * src/debug.c: (_vte_debug_parse_string):
+ * src/debug.h:
+ * src/vte.c: (vte_terminal_unichar_is_local_graphic),
+ (vte_terminal_draw_rows), (vte_terminal_paint):
+ * src/vtedraw.c: (_vte_draw_init_user), (_vte_draw_init_default),
+ (_vte_draw_new), (_vte_draw_free), (_vte_draw_get_visual),
+ (_vte_draw_get_colormap), (_vte_draw_start), (_vte_draw_end),
+ (_vte_draw_set_background_color), (_vte_draw_set_background_image),
+ (_vte_draw_requires_repaint), (_vte_draw_clip), (_vte_draw_clear),
+ (_vte_draw_set_text_font), (_vte_draw_get_text_width),
+ (_vte_draw_get_text_height), (_vte_draw_get_text_ascent),
+ (_vte_draw_get_char_width), (_vte_draw_get_using_fontconfig),
+ (_vte_draw_text), (_vte_draw_char), (_vte_draw_has_char),
+ (_vte_draw_fill_rectangle), (_vte_draw_draw_rectangle),
+ (_vte_draw_set_scroll):
+ * src/vtedraw.h:
+ * src/vteft2.c: (_vte_ft2_draw_has_char):
+ * src/vtegl.c: (_vte_gl_draw_has_char):
+ * src/vtepango.c: (_vte_pango_draw_has_char):
+ * src/vtepangox.c: (_vte_pango_x_draw_has_char):
+ * src/vteskel.c: (_vte_skel_draw_has_char):
+ * src/vtexft.c: (_vte_xft_draw_has_char):
+
+2007-02-23 Chris Wilson <chris@chris-wilson.co.uk>
+
* src/vte.c: (vte_terminal_draw_rows):
Don't break a glyph run for a graphic, issue the draw
and continue.
diff --git a/src/debug.c b/src/debug.c
index 73984ad9..d73d461d 100644
--- a/src/debug.c
+++ b/src/debug.c
@@ -84,6 +84,9 @@ _vte_debug_parse_string(const char *string)
} else
if (g_ascii_strcasecmp(flags[i], "TIMEOUT") == 0) {
_vte_debug_flags |= VTE_DEBUG_TIMEOUT;
+ } else
+ if (g_ascii_strcasecmp(flags[i], "DRAW") == 0) {
+ _vte_debug_flags |= VTE_DEBUG_DRAW;
}
}
g_strfreev(flags);
diff --git a/src/debug.h b/src/debug.h
index aa7d8492..05ccff47 100644
--- a/src/debug.h
+++ b/src/debug.h
@@ -43,7 +43,8 @@ typedef enum {
VTE_DEBUG_TRIE = 1 << 13,
VTE_DEBUG_WORK = 1 << 14,
VTE_DEBUG_CELLS = 1 << 15,
- VTE_DEBUG_TIMEOUT = 1 << 16
+ VTE_DEBUG_TIMEOUT = 1 << 16,
+ VTE_DEBUG_DRAW = 1 << 17
} VteDebugFlags;
void _vte_debug_parse_string(const char *string);
diff --git a/src/vte.c b/src/vte.c
index 85f7906d..d73a538a 100644
--- a/src/vte.c
+++ b/src/vte.c
@@ -7796,6 +7796,12 @@ vte_unichar_is_local_graphic(gunichar c)
}
return FALSE;
}
+static inline gboolean
+vte_terminal_unichar_is_local_graphic(VteTerminal *terminal, gunichar c)
+{
+ return vte_unichar_is_local_graphic (c) &&
+ !_vte_draw_has_char (terminal->pvt->draw, c);
+}
static void
vte_terminal_fill_rectangle_int(VteTerminal *terminal,
@@ -9188,7 +9194,7 @@ vte_terminal_draw_rows(VteTerminal *terminal,
j = i + items[0].columns;
/* If this is a graphics character, draw it locally. */
- if (vte_unichar_is_local_graphic(cell->c)) {
+ if (vte_terminal_unichar_is_local_graphic(terminal, cell->c)) {
if (vte_terminal_draw_graphic(terminal,
items[0].c,
fore, back,
@@ -9241,7 +9247,7 @@ vte_terminal_draw_rows(VteTerminal *terminal,
FALSE,
&nfore, &nback);
/* Graphic characters must be drawn individually. */
- if (vte_unichar_is_local_graphic(cell->c)) {
+ if (vte_terminal_unichar_is_local_graphic(terminal, cell->c)) {
if (vte_terminal_draw_graphic(terminal,
cell->c,
nfore, nback,
@@ -9603,7 +9609,7 @@ vte_terminal_paint(GtkWidget *widget, GdkRegion *region)
&color,
VTE_DRAW_OPAQUE);
}
- if (!vte_unichar_is_local_graphic(item.c) ||
+ if (!vte_terminal_unichar_is_local_graphic(terminal, item.c) ||
!vte_terminal_draw_graphic(terminal,
item.c,
fore, back,
@@ -9622,16 +9628,18 @@ vte_terminal_paint(GtkWidget *widget, GdkRegion *region)
terminal->pvt->match_end.row,
TRUE);
}
- vte_terminal_draw_cells(terminal,
+ if (cell && cell->c != ' ') {
+ vte_terminal_draw_cells(terminal,
&item, 1,
fore, back, TRUE, FALSE,
- cell && cell->bold,
- cell && cell->underline,
- cell && cell->strikethrough,
+ cell->bold,
+ cell->underline,
+ cell->strikethrough,
hilite,
FALSE,
width,
height);
+ }
}
} else {
GdkColor color;
@@ -9641,7 +9649,7 @@ draw_cursor_outline:
selected,
TRUE,
&fore, &back);
- if (!vte_unichar_is_local_graphic(item.c) ||
+ if (!vte_terminal_unichar_is_local_graphic(terminal, item.c) ||
!vte_terminal_draw_graphic(terminal,
item.c,
fore, back,
@@ -9661,16 +9669,18 @@ draw_cursor_outline:
TRUE);
}
/* Draw it as a hollow rectangle overtop character. */
- vte_terminal_draw_cells(terminal,
- &item, 1,
- fore, back, TRUE, FALSE,
- cell && cell->bold,
- cell && cell->underline,
- cell && cell->strikethrough,
- hilite,
- FALSE,
- width,
- height);
+ if (cell && cell->c != ' ') {
+ vte_terminal_draw_cells(terminal,
+ &item, 1,
+ fore, back, TRUE, FALSE,
+ cell->bold,
+ cell->underline,
+ cell->strikethrough,
+ hilite,
+ FALSE,
+ width,
+ height);
+ }
}
vte_terminal_determine_colors(terminal, cell,
!terminal->pvt->screen->reverse_mode,
diff --git a/src/vtedraw.c b/src/vtedraw.c
index f5c098c3..b3d7a8d9 100644
--- a/src/vtedraw.c
+++ b/src/vtedraw.c
@@ -63,20 +63,20 @@ _vte_draw_init_user (struct _vte_draw *draw)
guint i;
gboolean success = TRUE;
- env = g_getenv("VTE_BACKEND");
+ env = g_getenv ("VTE_BACKEND");
if (!env) {
return FALSE;
}
- strv = g_strsplit(env, ":;, \t", -1);
+ strv = g_strsplit (env, ":;, \t", -1);
for (s = strv; *s; s++) {
- if (g_ascii_strcasecmp(*s, _vte_draw_skel.name) == 0) {
+ if (g_ascii_strcasecmp (*s, _vte_draw_skel.name) == 0) {
draw->impl = &_vte_draw_skel;
goto out;
}
- for (i = 0; i < G_N_ELEMENTS(_vte_draw_impls); i++) {
- if (g_ascii_strcasecmp(*s, _vte_draw_impls[i]->name) == 0) {
- if (_vte_draw_impls[i]->check(draw, draw->widget)) {
+ for (i = 0; i < G_N_ELEMENTS (_vte_draw_impls); i++) {
+ if (g_ascii_strcasecmp (*s, _vte_draw_impls[i]->name) == 0) {
+ if (_vte_draw_impls[i]->check (draw, draw->widget)) {
draw->impl = _vte_draw_impls[i];
goto out;
}
@@ -86,7 +86,7 @@ _vte_draw_init_user (struct _vte_draw *draw)
success = FALSE;
out:
- g_strfreev(strv);
+ g_strfreev (strv);
return success;
}
@@ -96,8 +96,8 @@ _vte_draw_init_default (struct _vte_draw *draw)
{
guint i;
- for (i = 0; i < G_N_ELEMENTS(_vte_draw_impls); i++) {
- if (_vte_draw_impls[i]->check(draw, draw->widget)) {
+ for (i = 0; i < G_N_ELEMENTS (_vte_draw_impls); i++) {
+ if (_vte_draw_impls[i]->check (draw, draw->widget)) {
draw->impl = _vte_draw_impls[i];
return TRUE;
}
@@ -108,13 +108,13 @@ _vte_draw_init_default (struct _vte_draw *draw)
struct _vte_draw *
-_vte_draw_new(GtkWidget *widget)
+_vte_draw_new (GtkWidget *widget)
{
struct _vte_draw *draw;
/* Create the structure. */
- draw = g_slice_new0(struct _vte_draw);
- draw->widget = g_object_ref(widget);
+ draw = g_slice_new0 (struct _vte_draw);
+ draw->widget = g_object_ref (widget);
draw->started = FALSE;
/* Allow the user to specify her preferred backends */
@@ -126,225 +126,267 @@ _vte_draw_new(GtkWidget *widget)
draw->impl = &_vte_draw_skel;
}
- _vte_debug_print(VTE_DEBUG_MISC, "Using %s.\n", draw->impl->name);
+ _vte_debug_print (VTE_DEBUG_DRAW,
+ "draw_new (%s)\n", draw->impl->name);
+ _vte_debug_print (VTE_DEBUG_MISC, "Using %s.\n", draw->impl->name);
- draw->impl->create(draw, draw->widget);
+ draw->impl->create (draw, draw->widget);
return draw;
}
void
-_vte_draw_free(struct _vte_draw *draw)
+_vte_draw_free (struct _vte_draw *draw)
{
- draw->impl->destroy(draw);
+ _vte_debug_print (VTE_DEBUG_DRAW, "draw_free\n");
+ draw->impl->destroy (draw);
if (draw->widget != NULL) {
- g_object_unref(draw->widget);
+ g_object_unref (draw->widget);
}
- g_slice_free(struct _vte_draw, draw);
+ g_slice_free (struct _vte_draw, draw);
}
GdkVisual *
-_vte_draw_get_visual(struct _vte_draw *draw)
+_vte_draw_get_visual (struct _vte_draw *draw)
{
- g_return_val_if_fail(draw->impl != NULL, NULL);
- g_return_val_if_fail(draw->impl->get_visual != NULL, NULL);
- return draw->impl->get_visual(draw);
+ g_return_val_if_fail (draw->impl != NULL, NULL);
+ g_return_val_if_fail (draw->impl->get_visual != NULL, NULL);
+ _vte_debug_print (VTE_DEBUG_DRAW, "draw_get_visual\n");
+ return draw->impl->get_visual (draw);
}
GdkColormap *
-_vte_draw_get_colormap(struct _vte_draw *draw, gboolean maybe_use_default)
+_vte_draw_get_colormap (struct _vte_draw *draw, gboolean maybe_use_default)
{
GdkColormap *colormap;
GdkScreen *screen;
- g_return_val_if_fail(draw->impl != NULL, NULL);
- g_return_val_if_fail(draw->impl->get_colormap != NULL, NULL);
- colormap = draw->impl->get_colormap(draw);
+ g_return_val_if_fail (draw->impl != NULL, NULL);
+ g_return_val_if_fail (draw->impl->get_colormap != NULL, NULL);
+ _vte_debug_print (VTE_DEBUG_DRAW, "draw_get_colormap\n");
+ colormap = draw->impl->get_colormap (draw);
if (colormap) {
return colormap;
}
if (!maybe_use_default) {
return NULL;
}
- screen = gtk_widget_get_screen(draw->widget);
- colormap = gdk_screen_get_default_colormap(screen);
+ screen = gtk_widget_get_screen (draw->widget);
+ colormap = gdk_screen_get_default_colormap (screen);
return colormap;
}
void
-_vte_draw_start(struct _vte_draw *draw)
+_vte_draw_start (struct _vte_draw *draw)
{
- g_return_if_fail(GTK_WIDGET_REALIZED(draw->widget));
- g_return_if_fail(draw->impl != NULL);
- g_return_if_fail(draw->impl->start != NULL);
- g_object_ref(draw->widget->window);
- draw->impl->start(draw);
+ g_return_if_fail (GTK_WIDGET_REALIZED (draw->widget));
+ g_return_if_fail (draw->impl != NULL);
+ g_return_if_fail (draw->impl->start != NULL);
+ _vte_debug_print (VTE_DEBUG_DRAW, "draw_start\n");
+ g_object_ref (draw->widget->window);
+ draw->impl->start (draw);
draw->started = TRUE;
}
void
-_vte_draw_end(struct _vte_draw *draw)
+_vte_draw_end (struct _vte_draw *draw)
{
- g_return_if_fail(draw->started == TRUE);
- g_return_if_fail(draw->impl != NULL);
- g_return_if_fail(draw->impl->end != NULL);
- draw->impl->end(draw);
- g_object_unref(draw->widget->window);
+ g_return_if_fail (draw->started == TRUE);
+ g_return_if_fail (draw->impl != NULL);
+ g_return_if_fail (draw->impl->end != NULL);
+ draw->impl->end (draw);
+ g_object_unref (draw->widget->window);
draw->started = FALSE;
+ _vte_debug_print (VTE_DEBUG_DRAW, "draw_end\n");
}
void
-_vte_draw_set_background_color(struct _vte_draw *draw,
+_vte_draw_set_background_color (struct _vte_draw *draw,
GdkColor *color,
guint16 opacity)
{
- g_return_if_fail(draw->impl != NULL);
- g_return_if_fail(draw->impl->set_background_color != NULL);
- draw->impl->set_background_color(draw, color, opacity);
+ g_return_if_fail (draw->impl != NULL);
+ g_return_if_fail (draw->impl->set_background_color != NULL);
+ draw->impl->set_background_color (draw, color, opacity);
}
void
-_vte_draw_set_background_image(struct _vte_draw *draw,
+_vte_draw_set_background_image (struct _vte_draw *draw,
enum VteBgSourceType type,
GdkPixbuf *pixbuf,
const char *filename,
const GdkColor *color,
double saturation)
{
- g_return_if_fail(draw->impl != NULL);
- g_return_if_fail(draw->impl->set_background_image != NULL);
- draw->impl->set_background_image(draw, type, pixbuf, filename,
+ g_return_if_fail (draw->impl != NULL);
+ g_return_if_fail (draw->impl->set_background_image != NULL);
+ draw->impl->set_background_image (draw, type, pixbuf, filename,
color, saturation);
}
gboolean
-_vte_draw_requires_repaint(struct _vte_draw *draw)
+_vte_draw_requires_repaint (struct _vte_draw *draw)
{
- g_return_val_if_fail(draw->impl != NULL, TRUE);
+ g_return_val_if_fail (draw->impl != NULL, TRUE);
+ _vte_debug_print (VTE_DEBUG_DRAW, "draw_requires_repaint = %d\n",
+ draw->impl->requires_repaint);
return draw->impl->requires_repaint;
}
gboolean
-_vte_draw_clip(struct _vte_draw *draw, GdkRegion *region)
+_vte_draw_clip (struct _vte_draw *draw, GdkRegion *region)
{
- g_return_val_if_fail(draw->impl != NULL, FALSE);
+ g_return_val_if_fail (draw->impl != NULL, FALSE);
+ _vte_debug_print (VTE_DEBUG_DRAW, "draw_clip\n");
if (draw->impl->clip == NULL) {
return FALSE;
}
- draw->impl->clip(draw, region);
+ draw->impl->clip (draw, region);
return TRUE;
}
void
-_vte_draw_clear(struct _vte_draw *draw, gint x, gint y, gint width, gint height)
+_vte_draw_clear (struct _vte_draw *draw, gint x, gint y, gint width, gint height)
{
- g_return_if_fail(draw->impl != NULL);
- g_return_if_fail(draw->impl->clear != NULL);
- draw->impl->clear(draw, x, y, width, height);
+ g_return_if_fail (draw->impl != NULL);
+ g_return_if_fail (draw->impl->clear != NULL);
+ _vte_debug_print (VTE_DEBUG_DRAW, "draw_clear (%d, %d, %d, %d)\n",
+ x,y,width, height);
+ draw->impl->clear (draw, x, y, width, height);
}
void
-_vte_draw_set_text_font(struct _vte_draw *draw,
+_vte_draw_set_text_font (struct _vte_draw *draw,
const PangoFontDescription *fontdesc,
VteTerminalAntiAlias anti_alias)
{
- g_return_if_fail(draw->impl != NULL);
- g_return_if_fail(draw->impl->set_text_font != NULL);
- draw->impl->set_text_font(draw, fontdesc, anti_alias);
+ g_return_if_fail (draw->impl != NULL);
+ g_return_if_fail (draw->impl->set_text_font != NULL);
+ _vte_debug_print (VTE_DEBUG_DRAW, "draw_set_text_font (aa=%d)\n",
+ anti_alias);
+ draw->impl->set_text_font (draw, fontdesc, anti_alias);
}
int
-_vte_draw_get_text_width(struct _vte_draw *draw)
+_vte_draw_get_text_width (struct _vte_draw *draw)
{
- g_return_val_if_fail(draw->impl != NULL, 1);
- g_return_val_if_fail(draw->impl->get_text_width != NULL, 1);
- return draw->impl->get_text_width(draw);
+ g_return_val_if_fail (draw->impl != NULL, 1);
+ g_return_val_if_fail (draw->impl->get_text_width != NULL, 1);
+ return draw->impl->get_text_width (draw);
}
int
-_vte_draw_get_text_height(struct _vte_draw *draw)
+_vte_draw_get_text_height (struct _vte_draw *draw)
{
- g_return_val_if_fail(draw->impl != NULL, 1);
- g_return_val_if_fail(draw->impl->get_text_height != NULL, 1);
- return draw->impl->get_text_height(draw);
+ g_return_val_if_fail (draw->impl != NULL, 1);
+ g_return_val_if_fail (draw->impl->get_text_height != NULL, 1);
+ return draw->impl->get_text_height (draw);
}
int
-_vte_draw_get_text_ascent(struct _vte_draw *draw)
+_vte_draw_get_text_ascent (struct _vte_draw *draw)
{
- g_return_val_if_fail(draw->impl != NULL, 1);
- g_return_val_if_fail(draw->impl->get_text_ascent != NULL, 1);
- return draw->impl->get_text_ascent(draw);
+ g_return_val_if_fail (draw->impl != NULL, 1);
+ g_return_val_if_fail (draw->impl->get_text_ascent != NULL, 1);
+ return draw->impl->get_text_ascent (draw);
}
int
-_vte_draw_get_char_width(struct _vte_draw *draw, gunichar c, int columns)
+_vte_draw_get_char_width (struct _vte_draw *draw, gunichar c, int columns)
{
- g_return_val_if_fail(draw->impl != NULL, 1);
- g_return_val_if_fail(draw->impl->get_char_width != NULL, 1);
- return draw->impl->get_char_width(draw, c, columns);
+ g_return_val_if_fail (draw->impl != NULL, 1);
+ g_return_val_if_fail (draw->impl->get_char_width != NULL, 1);
+ return draw->impl->get_char_width (draw, c, columns);
}
gboolean
-_vte_draw_get_using_fontconfig(struct _vte_draw *draw)
+_vte_draw_get_using_fontconfig (struct _vte_draw *draw)
{
- g_return_val_if_fail(draw->impl != NULL, 1);
- g_return_val_if_fail(draw->impl->get_using_fontconfig != NULL, FALSE);
- return draw->impl->get_using_fontconfig(draw);
+ g_return_val_if_fail (draw->impl != NULL, 1);
+ g_return_val_if_fail (draw->impl->get_using_fontconfig != NULL, FALSE);
+ return draw->impl->get_using_fontconfig (draw);
}
void
-_vte_draw_text(struct _vte_draw *draw,
+_vte_draw_text (struct _vte_draw *draw,
struct _vte_draw_text_request *requests, gsize n_requests,
GdkColor *color, guchar alpha)
{
- g_return_if_fail(draw->started == TRUE);
- g_return_if_fail(draw->impl != NULL);
- g_return_if_fail(draw->impl->draw_text != NULL);
- draw->impl->draw_text(draw, requests, n_requests, color, alpha);
+ g_return_if_fail (draw->started == TRUE);
+ g_return_if_fail (draw->impl != NULL);
+ g_return_if_fail (draw->impl->draw_text != NULL);
+ _vte_debug_print (VTE_DEBUG_DRAW,
+ "draw_text (len=%u, color= (%d,%d,%d,%d))\n",
+ n_requests, color->red, color->green, color->blue,
+ alpha);
+ draw->impl->draw_text (draw, requests, n_requests, color, alpha);
}
gboolean
-_vte_draw_char(struct _vte_draw *draw,
+_vte_draw_char (struct _vte_draw *draw,
struct _vte_draw_text_request *request,
GdkColor *color, guchar alpha)
{
- g_return_val_if_fail(draw->started == TRUE, FALSE);
- g_return_val_if_fail(draw->impl != NULL, FALSE);
+ g_return_val_if_fail (draw->started == TRUE, FALSE);
+ g_return_val_if_fail (draw->impl != NULL, FALSE);
+ _vte_debug_print (VTE_DEBUG_DRAW,
+ "draw_char ('%c', color= (%d,%d,%d,%d))\n",
+ request->c,
+ color->red, color->green, color->blue,
+ alpha);
if (draw->impl->draw_char == NULL) {
- draw->impl->draw_text(draw, request, 1, color, alpha);
+ draw->impl->draw_text (draw, request, 1, color, alpha);
return TRUE;
}
- return draw->impl->draw_char(draw, request, color, alpha);
+ return draw->impl->draw_char (draw, request, color, alpha);
+}
+gboolean
+_vte_draw_has_char (struct _vte_draw *draw, gunichar c)
+{
+ _vte_debug_print (VTE_DEBUG_DRAW, "draw_has_char ('%c')\n", c);
+ return draw->impl->has_char (draw, c);
}
void
-_vte_draw_fill_rectangle(struct _vte_draw *draw,
+_vte_draw_fill_rectangle (struct _vte_draw *draw,
gint x, gint y, gint width, gint height,
GdkColor *color, guchar alpha)
{
- g_return_if_fail(draw->started == TRUE);
- g_return_if_fail(draw->impl != NULL);
- g_return_if_fail(draw->impl->fill_rectangle != NULL);
- draw->impl->fill_rectangle(draw, x, y, width, height, color, alpha);
+ g_return_if_fail (draw->started == TRUE);
+ g_return_if_fail (draw->impl != NULL);
+ g_return_if_fail (draw->impl->fill_rectangle != NULL);
+ _vte_debug_print (VTE_DEBUG_DRAW,
+ "draw_fill_rectangle (%d, %d, %d, %d, color= (%d,%d,%d,%d))\n",
+ x,y,width,height,
+ color->red, color->green, color->blue,
+ alpha);
+ draw->impl->fill_rectangle (draw, x, y, width, height, color, alpha);
}
void
-_vte_draw_draw_rectangle(struct _vte_draw *draw,
+_vte_draw_draw_rectangle (struct _vte_draw *draw,
gint x, gint y, gint width, gint height,
GdkColor *color, guchar alpha)
{
- g_return_if_fail(draw->started == TRUE);
- g_return_if_fail(draw->impl != NULL);
- g_return_if_fail(draw->impl->draw_rectangle != NULL);
- draw->impl->draw_rectangle(draw, x, y, width, height, color, alpha);
+ g_return_if_fail (draw->started == TRUE);
+ g_return_if_fail (draw->impl != NULL);
+ g_return_if_fail (draw->impl->draw_rectangle != NULL);
+ _vte_debug_print (VTE_DEBUG_DRAW,
+ "draw_rectangle (%d, %d, %d, %d, color= (%d,%d,%d,%d))\n",
+ x,y,width,height,
+ color->red, color->green, color->blue,
+ alpha);
+ draw->impl->draw_rectangle (draw, x, y, width, height, color, alpha);
}
void
-_vte_draw_set_scroll(struct _vte_draw *draw, gint x, gint y)
+_vte_draw_set_scroll (struct _vte_draw *draw, gint x, gint y)
{
- g_return_if_fail(draw->impl != NULL);
- g_return_if_fail(draw->impl->set_scroll != NULL);
- draw->impl->set_scroll(draw, x, y);
+ g_return_if_fail (draw->impl != NULL);
+ g_return_if_fail (draw->impl->set_scroll != NULL);
+ _vte_debug_print (VTE_DEBUG_DRAW,
+ "draw_set_scroll (%d, %d)\n",
+ x, y);
+ draw->impl->set_scroll (draw, x, y);
}
diff --git a/src/vtedraw.h b/src/vtedraw.h
index bbff2f9a..91453cc3 100644
--- a/src/vtedraw.h
+++ b/src/vtedraw.h
@@ -86,6 +86,7 @@ struct _vte_draw_impl {
gboolean (*draw_char)(struct _vte_draw *,
struct _vte_draw_text_request *,
GdkColor *, guchar);
+ gboolean (*has_char)(struct _vte_draw *, gunichar);
void (*draw_rectangle)(struct _vte_draw *,
gint, gint, gint, gint,
GdkColor *, guchar);
@@ -153,6 +154,7 @@ void _vte_draw_text(struct _vte_draw *draw,
gboolean _vte_draw_char(struct _vte_draw *draw,
struct _vte_draw_text_request *request,
GdkColor *color, guchar alpha);
+gboolean _vte_draw_has_char(struct _vte_draw *draw, gunichar c);
void _vte_draw_fill_rectangle(struct _vte_draw *draw,
gint x, gint y, gint width, gint height,
GdkColor *color, guchar alpha);
diff --git a/src/vteft2.c b/src/vteft2.c
index ac9716d6..4d9a5ade 100644
--- a/src/vteft2.c
+++ b/src/vteft2.c
@@ -330,6 +330,21 @@ _vte_ft2_draw_char(struct _vte_draw *draw,
return FALSE;
}
+static gboolean
+_vte_ft2_draw_has_char(struct _vte_draw *draw, gunichar c)
+{
+ struct _vte_ft2_data *data;
+
+ data = (struct _vte_ft2_data*) draw->impl_data;
+
+ if (data->cache != NULL) {
+ if (_vte_glyph_get(data->cache, c) != NULL) {
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
+
static void
_vte_ft2_draw_rectangle(struct _vte_draw *draw,
gint x, gint y, gint width, gint height,
@@ -402,6 +417,7 @@ const struct _vte_draw_impl _vte_draw_ft2 = {
_vte_ft2_get_using_fontconfig,
_vte_ft2_draw_text,
_vte_ft2_draw_char,
+ _vte_ft2_draw_has_char,
_vte_ft2_draw_rectangle,
_vte_ft2_fill_rectangle,
_vte_ft2_set_scroll,
diff --git a/src/vtegl.c b/src/vtegl.c
index 30ca2c4d..3d6ef782 100644
--- a/src/vtegl.c
+++ b/src/vtegl.c
@@ -518,6 +518,21 @@ _vte_gl_draw_char(struct _vte_draw *draw,
return FALSE;
}
+static gboolean
+_vte_gl_draw_has_char(struct _vte_draw *draw, gunichar c)
+{
+ struct _vte_gl_data *data;
+
+ data = (struct _vte_gl_data*) draw->impl_data;
+
+ if (data->cache != NULL) {
+ if (_vte_glyph_get(data->cache, c) != NULL) {
+ return TRUE;
+ }
+ }
+ return FALSE;
+}
+
static void
_vte_gl_rectangle(struct _vte_draw *draw,
GLenum type,
@@ -590,6 +605,7 @@ const struct _vte_draw_impl _vte_draw_gl = {
_vte_gl_get_using_fontconfig,
_vte_gl_draw_text,
_vte_gl_draw_char,
+ _vte_gl_draw_has_char,
_vte_gl_draw_rectangle,
_vte_gl_fill_rectangle,
_vte_gl_set_scroll,
diff --git a/src/vtepango.c b/src/vtepango.c
index 7defba01..4b11c9a7 100644
--- a/src/vtepango.c
+++ b/src/vtepango.c
@@ -377,6 +377,12 @@ _vte_pango_draw_char(struct _vte_draw *draw,
return TRUE;
}
+static gboolean
+_vte_pango_draw_has_char(struct _vte_draw *draw, gunichar c)
+{
+ return FALSE;
+}
+
static void
_vte_pango_draw_rectangle(struct _vte_draw *draw,
gint x, gint y, gint width, gint height,
@@ -444,6 +450,7 @@ const struct _vte_draw_impl _vte_draw_pango = {
_vte_pango_get_using_fontconfig,
_vte_pango_draw_text,
_vte_pango_draw_char,
+ _vte_pango_draw_has_char,
_vte_pango_draw_rectangle,
_vte_pango_fill_rectangle,
_vte_pango_set_scroll,
diff --git a/src/vtepangox.c b/src/vtepangox.c
index 58ffedff..baa0c985 100644
--- a/src/vtepangox.c
+++ b/src/vtepangox.c
@@ -419,6 +419,13 @@ _vte_pango_x_draw_char(struct _vte_draw *draw,
return TRUE;
}
+static gboolean
+_vte_pango_x_draw_has_char(struct _vte_draw *draw, gunichar c)
+{
+ return FALSE;
+}
+
+
static void
_vte_pango_x_draw_rectangle(struct _vte_draw *draw,
gint x, gint y, gint width, gint height,
@@ -486,6 +493,7 @@ const struct _vte_draw_impl _vte_draw_pango_x = {
_vte_pango_x_get_using_fontconfig,
_vte_pango_x_draw_text,
_vte_pango_x_draw_char,
+ _vte_pango_x_draw_has_char,
_vte_pango_x_draw_rectangle,
_vte_pango_x_fill_rectangle,
_vte_pango_x_set_scroll,
diff --git a/src/vteskel.c b/src/vteskel.c
index 1bd3f640..1cb7a3fa 100644
--- a/src/vteskel.c
+++ b/src/vteskel.c
@@ -169,6 +169,12 @@ _vte_skel_draw_char(struct _vte_draw *draw,
return FALSE;
}
+static gboolean
+_vte_skel_draw_has_char(struct _vte_draw *draw, gunichar c)
+{
+ return FALSE;
+}
+
static void
_vte_skel_draw_rectangle(struct _vte_draw *draw,
gint x, gint y, gint width, gint height,
@@ -218,6 +224,7 @@ const struct _vte_draw_impl _vte_draw_skel = {
_vte_skel_get_using_fontconfig,
_vte_skel_draw_text,
_vte_skel_draw_char,
+ _vte_skel_draw_has_char,
_vte_skel_draw_rectangle,
_vte_skel_fill_rectangle,
_vte_skel_set_scroll,
diff --git a/src/vtexft.c b/src/vtexft.c
index a5782406..c4c10e43 100644
--- a/src/vtexft.c
+++ b/src/vtexft.c
@@ -862,6 +862,21 @@ _vte_xft_draw_char (struct _vte_draw *draw,
return FALSE;
}
+static gboolean
+_vte_xft_draw_has_char (struct _vte_draw *draw, gunichar c)
+{
+ struct _vte_xft_data *data;
+
+ data = (struct _vte_xft_data*) draw->impl_data;
+ if (data->font != NULL &&
+ _vte_xft_font_for_char (data->font, c,
+ data->locked_fonts[data->cur_locked_fonts&1]) != NULL) {
+
+ return TRUE;
+ }
+ return FALSE;
+}
+
static void
_vte_xft_draw_rectangle (struct _vte_draw *draw,
gint x, gint y, gint width, gint height,
@@ -951,6 +966,7 @@ const struct _vte_draw_impl _vte_draw_xft = {
_vte_xft_get_using_fontconfig,
_vte_xft_draw_text,
_vte_xft_draw_char,
+ _vte_xft_draw_has_char,
_vte_xft_draw_rectangle,
_vte_xft_fill_rectangle,
_vte_xft_set_scroll,