diff -NurpP --minimal vte-0.32.0.orig/src/vte-private.h vte-0.32.0/src/vte-private.h --- vte-0.32.0.orig/src/vte-private.h 2012-03-10 15:55:12.000000000 +0000 +++ vte-0.32.0/src/vte-private.h 2012-04-06 01:28:13.000000000 +0000 @@ -281,6 +281,9 @@ struct _VteTerminalPrivate { gboolean scroll_on_keystroke; long scrollback_lines; + /* Scaling options */ + gboolean scale_background; + /* Cursor shape */ VteTerminalCursorShape cursor_shape; float cursor_aspect_ratio; diff -NurpP --minimal vte-0.32.0.orig/src/vte.c vte-0.32.0/src/vte.c --- vte-0.32.0.orig/src/vte.c 2012-03-10 15:55:12.000000000 +0000 +++ vte-0.32.0/src/vte.c 2012-04-06 01:28:13.000000000 +0000 @@ -188,7 +188,8 @@ enum { PROP_SCROLL_ON_OUTPUT, PROP_WINDOW_TITLE, PROP_WORD_CHARS, - PROP_VISIBLE_BELL + PROP_VISIBLE_BELL, + PROP_SCALE_BACKGROUND }; /* these static variables are guarded by the GDK mutex */ @@ -11198,6 +11199,10 @@ vte_terminal_paint(GtkWidget *widget, Gd 0, terminal->pvt->screen->scroll_delta * terminal->char_height); + } else if (terminal->pvt->scale_background) { + _vte_draw_set_background_scale(terminal->pvt->draw, + terminal->char_width * terminal->column_count, + terminal->char_height * terminal->row_count); } else { _vte_draw_set_background_scroll(terminal->pvt->draw, 0, 0); } @@ -11604,6 +11609,9 @@ vte_terminal_get_property (GObject *obje case PROP_SCROLL_BACKGROUND: g_value_set_boolean (value, pvt->scroll_background); break; + case PROP_SCALE_BACKGROUND: + g_value_set_boolean (value, pvt->scale_background); + break; case PROP_SCROLLBACK_LINES: g_value_set_uint (value, pvt->scrollback_lines); break; @@ -11710,6 +11718,9 @@ vte_terminal_set_property (GObject *obje case PROP_PTY_OBJECT: vte_terminal_set_pty_object (terminal, g_value_get_object (value)); break; + case PROP_SCALE_BACKGROUND: + vte_terminal_set_scale_background (terminal, g_value_get_boolean (value)); + break; case PROP_SCROLL_BACKGROUND: vte_terminal_set_scroll_background (terminal, g_value_get_boolean (value)); break; @@ -12727,6 +12738,19 @@ vte_terminal_class_init(VteTerminalClass G_PARAM_STATIC_STRINGS)); /** + * VteTerminal:scale-background: + * + * Controls whether or not the terminal will scale the background image + * (if one is set) + */ + g_object_class_install_property + (gobject_class, + PROP_SCALE_BACKGROUND, + g_param_spec_boolean ("scale-background", NULL, NULL, + FALSE, + G_PARAM_READWRITE | STATIC_PARAMS)); + + /** * VteTerminal:scroll-background: * * Controls whether or not the terminal will scroll the background image (if @@ -13021,6 +13045,36 @@ vte_terminal_get_allow_bold(VteTerminal } /** + * vte_terminal_set_scale_background: + * @terminal: a #VteTerminal + * @scale: whether the terminal should scale the background + * + * Controls whether or not the terminal will scale the background image (if + * one is set) to the widget size. + * + * Since: 0.21 + */ +void +vte_terminal_set_scale_background(VteTerminal *terminal, gboolean scale) +{ + VteTerminalPrivate *pvt; + + g_return_if_fail(VTE_IS_TERMINAL(terminal)); + + pvt = terminal->pvt; + + scale = scale != FALSE; + if (scale == pvt->scale_background) + return; + + pvt->scale_background = scale; + + g_object_notify (G_OBJECT (terminal), "scale-background"); + + vte_terminal_queue_background_update(terminal); +} + +/** * vte_terminal_set_scroll_background: * @terminal: a #VteTerminal * @scroll: whether the terminal should scroll the background image along with diff -NurpP --minimal vte-0.32.0.orig/src/vte.c.orig vte-0.32.0/src/vte.c.orig diff -NurpP --minimal vte-0.32.0.orig/src/vte.h vte-0.32.0/src/vte.h --- vte-0.32.0.orig/src/vte.h 2012-03-10 15:55:12.000000000 +0000 +++ vte-0.32.0/src/vte.h 2012-04-06 01:28:13.000000000 +0000 @@ -306,6 +306,7 @@ void vte_terminal_set_audible_bell(VteTe gboolean vte_terminal_get_audible_bell(VteTerminal *terminal); void vte_terminal_set_visible_bell(VteTerminal *terminal, gboolean is_visible); gboolean vte_terminal_get_visible_bell(VteTerminal *terminal); +void vte_terminal_set_scale_background(VteTerminal *terminal, gboolean scale); void vte_terminal_set_scroll_background(VteTerminal *terminal, gboolean scroll); void vte_terminal_set_scroll_on_output(VteTerminal *terminal, gboolean scroll); void vte_terminal_set_scroll_on_keystroke(VteTerminal *terminal, diff -NurpP --minimal vte-0.32.0.orig/src/vteapp.c vte-0.32.0/src/vteapp.c --- vte-0.32.0.orig/src/vteapp.c 2012-03-10 15:55:12.000000000 +0000 +++ vte-0.32.0/src/vteapp.c 2012-04-06 01:28:13.000000000 +0000 @@ -553,7 +553,7 @@ main(int argc, char **argv) const char *background = NULL; gboolean transparent = FALSE, audible = TRUE, debug = FALSE, dingus = FALSE, dbuffer = TRUE, - console = FALSE, scroll = FALSE, keep = FALSE, + console = FALSE, scroll = FALSE, scale = FALSE, keep = FALSE, icon_title = FALSE, shell = TRUE, highlight_set = FALSE, cursor_set = FALSE, reverse = FALSE, use_geometry_hints = TRUE, antialias = TRUE, use_scrolled_window = FALSE, @@ -669,6 +669,11 @@ main(int argc, char **argv) "Set cursor shape (block|underline|ibeam)", NULL }, { + "scale-background", 'z', 0, + G_OPTION_ARG_NONE, &scale, + "Enable a scaling background", NULL + }, + { "scroll-background", 's', 0, G_OPTION_ARG_NONE, &scroll, "Enable a scrolling background", NULL @@ -891,6 +896,7 @@ main(int argc, char **argv) vte_terminal_set_audible_bell(terminal, audible); vte_terminal_set_visible_bell(terminal, !audible); vte_terminal_set_cursor_blink_mode(terminal, cursor_blink_mode); + vte_terminal_set_scale_background(terminal, scale); vte_terminal_set_scroll_background(terminal, scroll); vte_terminal_set_scroll_on_output(terminal, FALSE); vte_terminal_set_scroll_on_keystroke(terminal, TRUE); diff -NurpP --minimal vte-0.32.0.orig/src/vtebg.c vte-0.32.0/src/vtebg.c --- vte-0.32.0.orig/src/vtebg.c 2012-03-10 15:55:12.000000000 +0000 +++ vte-0.32.0/src/vtebg.c 2012-04-06 01:28:13.000000000 +0000 @@ -56,6 +56,8 @@ typedef struct { PangoColor tint_color; double saturation; cairo_surface_t *surface; + int width; + int height; } VteBgCacheItem; static void vte_bg_cache_item_free(VteBgCacheItem *item); @@ -322,6 +324,8 @@ static void item_surface_destroy_func(vo "VteBgCacheItem %p surface destroyed\n", item); item->surface = NULL; + item->width = 1; + item->height = 1; } /* @@ -365,7 +369,9 @@ vte_bg_cache_search(VteBg *bg, const GdkPixbuf *source_pixbuf, const char *source_file, const PangoColor *tint, - double saturation) + double saturation, + int *surface_width, + int *surface_height) { GList *i; @@ -393,6 +399,11 @@ vte_bg_cache_search(VteBg *bg, break; } + if (surface_width) + *surface_width = item->width; + if (surface_height) + *surface_height = item->height; + return cairo_surface_reference(item->surface); } } @@ -408,6 +419,8 @@ vte_bg_cache_search(VteBg *bg, * @tint: a #PangoColor to use as tint color * @saturation: the saturation as a value between 0.0 and 1.0 * @other: a #cairo_surface_t + * @surface_width: pointer to store the surface width + * @surface_height: pointer to store the surface height * * Returns: a reference to a #cairo_surface_t, or %NULL on failure */ @@ -418,7 +431,9 @@ vte_bg_get_surface(VteBg *bg, const char *source_file, const PangoColor *tint, double saturation, - cairo_surface_t *other) + cairo_surface_t *other, + int *surface_width, + int *surface_height) { VteBgPrivate *pvt; VteBgCacheItem *item; @@ -441,7 +456,8 @@ vte_bg_get_surface(VteBg *bg, cached = vte_bg_cache_search(bg, source_type, source_pixbuf, source_file, - tint, saturation); + tint, saturation, + surface_width, surface_height); if (cached != NULL) { return cached; } @@ -495,6 +511,13 @@ vte_bg_get_surface(VteBg *bg, else goto out; + if (surface_width) + *surface_width = width; + if (surface_height) + *surface_height = height; + + item->width = width; + item->height = height; item->surface = cairo_surface_create_similar(other, CAIRO_CONTENT_COLOR_ALPHA, width, height); diff -NurpP --minimal vte-0.32.0.orig/src/vtebg.c.orig vte-0.32.0/src/vtebg.c.orig diff -NurpP --minimal vte-0.32.0.orig/src/vtebg.h vte-0.32.0/src/vtebg.h --- vte-0.32.0.orig/src/vtebg.h 2012-03-10 15:55:12.000000000 +0000 +++ vte-0.32.0/src/vtebg.h 2012-04-06 01:28:13.000000000 +0000 @@ -63,7 +63,9 @@ vte_bg_get_surface(VteBg *bg, const char *source_file, const PangoColor *tint, double saturation, - cairo_surface_t *other); + cairo_surface_t *other, + int *surface_width, + int *surface_height); G_END_DECLS diff -NurpP --minimal vte-0.32.0.orig/src/vtedraw.c vte-0.32.0/src/vtedraw.c --- vte-0.32.0.orig/src/vtedraw.c 2012-03-10 15:55:12.000000000 +0000 +++ vte-0.32.0/src/vtedraw.c 2012-04-06 01:28:13.000000000 +0000 @@ -752,6 +752,7 @@ struct _vte_draw { struct font_info *font; struct font_info *font_bold; cairo_pattern_t *bg_pattern; + gint bg_width, bg_height; cairo_t *cr; }; @@ -839,6 +840,8 @@ _vte_draw_set_background_solid(struct _v green, blue, opacity); + draw->bg_width = 1; + draw->bg_height = 1; } void @@ -850,6 +853,7 @@ _vte_draw_set_background_image (struct _ double saturation) { cairo_surface_t *surface; + int surface_width, surface_height; /* Need a valid draw->cr for cairo_get_target () */ _vte_draw_start (draw); @@ -857,7 +861,8 @@ _vte_draw_set_background_image (struct _ surface = vte_bg_get_surface (vte_bg_get_for_screen (gtk_widget_get_screen (draw->widget)), type, pixbuf, filename, color, saturation, - cairo_get_target(draw->cr)); + cairo_get_target(draw->cr), + &surface_width, &surface_height); _vte_draw_end (draw); @@ -868,6 +873,8 @@ _vte_draw_set_background_image (struct _ cairo_pattern_destroy (draw->bg_pattern); draw->bg_pattern = cairo_pattern_create_for_surface (surface); + draw->bg_width = surface_width; + draw->bg_height = surface_height; cairo_surface_destroy (surface); cairo_pattern_set_extend (draw->bg_pattern, CAIRO_EXTEND_REPEAT); } @@ -888,6 +895,24 @@ _vte_draw_set_background_scroll (struct cairo_pattern_set_matrix (draw->bg_pattern, &matrix); } +void +_vte_draw_set_background_scale (struct _vte_draw *draw, + gint sx, gint sy) +{ + cairo_matrix_t matrix; + + _vte_debug_print (VTE_DEBUG_DRAW, + "draw_set_scale (%d, %d)\n", + sx, sy); + + g_return_if_fail (draw->bg_pattern != NULL); + + cairo_matrix_init_scale (&matrix, + (1.0 * draw->bg_width) / sx, + (1.0 * draw->bg_height) / sy); + cairo_pattern_set_matrix (draw->bg_pattern, &matrix); +} + void _vte_draw_clip (struct _vte_draw *draw, GdkRegion *region) { diff -NurpP --minimal vte-0.32.0.orig/src/vtedraw.h vte-0.32.0/src/vtedraw.h --- vte-0.32.0.orig/src/vtedraw.h 2012-03-10 15:55:12.000000000 +0000 +++ vte-0.32.0/src/vtedraw.h 2012-04-06 01:28:13.000000000 +0000 @@ -82,6 +82,8 @@ void _vte_draw_set_background_image(stru double saturation); void _vte_draw_set_background_scroll(struct _vte_draw *draw, gint x, gint y); +void _vte_draw_set_background_scale(struct _vte_draw *draw, + gint sx, gint sy); void _vte_draw_clip(struct _vte_draw *draw, GdkRegion *region); void _vte_draw_clear(struct _vte_draw *draw,