Skip to content

Commit 4e6e7d6

Browse files
Add "Scale (fit)" background image mode
The current "Scale" mode crops out part of the image if the scaled image is larger than the terminal in any direction. This is useful for most cases, such as wallpapers repurposed as terminal backgrounds. However, this may be surprising to users coming from xfce4-terminal, where the equivalent "Scaled" mode tries to fit the background within the terminal in both dimensions. This new "Scale (fit)" mode is meant to emulate this behaviour.
1 parent 7a36218 commit 4e6e7d6

File tree

5 files changed

+28
-6
lines changed

5 files changed

+28
-6
lines changed

data/gsettings/com.gexperts.Tilix.gschema.xml

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,9 +37,10 @@
3737
<!-- Background Image Options -->
3838
<enum id='com.gexperts.Tilix.Background.Image.Mode'>
3939
<value nick='scale' value='0'/>
40-
<value nick='tile' value='1'/>
41-
<value nick='center' value='2'/>
42-
<value nick='stretch' value='3'/>
40+
<value nick='scale-fit' value='1'/>
41+
<value nick='tile' value='2'/>
42+
<value nick='center' value='3'/>
43+
<value nick='stretch' value='4'/>
4344
</enum>
4445

4546
<!-- Background Image Scaling Options, note these

source/gx/gtk/cairo.d

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,7 @@ Pixbuf getWidgetImage(Widget widget, double factor, int width, int height) {
111111
}
112112
}
113113

114-
enum ImageLayoutMode {SCALE, TILE, CENTER, STRETCH};
114+
enum ImageLayoutMode {SCALE, SCALE_FIT, TILE, CENTER, STRETCH};
115115

116116
ImageSurface renderImage(Pixbuf pb, bool alpha = false) {
117117
cairo_format_t format = alpha?cairo_format_t.ARGB32:cairo_format_t.RGB24;
@@ -172,6 +172,23 @@ void renderImage(Context cr, ImageSurface isSource, int outputWidth, int outputH
172172
cr.getSource().setFilter(scaleMode);
173173
cr.paint();
174174
break;
175+
case ImageLayoutMode.SCALE_FIT:
176+
// Emulate xfce4-terminal's "Scaled" behaviour -- scale the image
177+
// such that it fills the dimension with the shortest length and
178+
// fits both the x and y dimensions.
179+
double xScale = to!double(outputWidth) / to!double(isSource.getWidth());
180+
double yScale = to!double(outputHeight) / to!double(isSource.getHeight());
181+
double scale = min(xScale, yScale);
182+
183+
double xOffset = (outputWidth - (isSource.getWidth() * scale)) / 2.0;
184+
double yOffset = (outputHeight - (isSource.getHeight() * scale)) / 2.0;
185+
186+
cr.translate(xOffset, yOffset);
187+
cr.scale(scale, scale);
188+
cr.setSourceSurface(isSource, 0, 0);
189+
cr.getSource().setFilter(scaleMode);
190+
cr.paint();
191+
break;
175192
case ImageLayoutMode.TILE:
176193
cr.setSourceSurface(isSource, 0, 0);
177194
cr.getSource().setExtend(cairo_extend_t.REPEAT);

source/gx/tilix/appwindow.d

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2034,6 +2034,9 @@ public:
20342034
case SETTINGS_BACKGROUND_IMAGE_MODE_SCALE_VALUE:
20352035
mode = ImageLayoutMode.SCALE;
20362036
break;
2037+
case SETTINGS_BACKGROUND_IMAGE_MODE_SCALE_FIT_VALUE:
2038+
mode = ImageLayoutMode.SCALE_FIT;
2039+
break;
20372040
case SETTINGS_BACKGROUND_IMAGE_MODE_TILE_VALUE:
20382041
mode = ImageLayoutMode.TILE;
20392042
break;

source/gx/tilix/prefeditor/prefdialog.d

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1199,7 +1199,7 @@ class AppearancePreferences: Box {
11991199
gsSettings.reset(SETTINGS_BACKGROUND_IMAGE_KEY);
12001200
});
12011201

1202-
ComboBox cbImageMode = createNameValueCombo([_("Scale"), _("Tile"), _("Center"),_("Stretch")], SETTINGS_BACKGROUND_IMAGE_MODE_VALUES);
1202+
ComboBox cbImageMode = createNameValueCombo([_("Scale"), _("Scale (fit)"), _("Tile"), _("Center"),_("Stretch")], SETTINGS_BACKGROUND_IMAGE_MODE_VALUES);
12031203
bh.bind(SETTINGS_BACKGROUND_IMAGE_MODE_KEY, cbImageMode, "active-id", GSettingsBindFlags.DEFAULT);
12041204

12051205
// Background image settings only enabled if transparency is enabled

source/gx/tilix/preferences.d

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -105,10 +105,11 @@ enum SETTINGS_BACKGROUND_IMAGE_KEY = "background-image";
105105
enum SETTINGS_BACKGROUND_IMAGE_SCALE_KEY = "background-image-scale";
106106
enum SETTINGS_BACKGROUND_IMAGE_MODE_KEY = "background-image-mode";
107107
enum SETTINGS_BACKGROUND_IMAGE_MODE_SCALE_VALUE = "scale";
108+
enum SETTINGS_BACKGROUND_IMAGE_MODE_SCALE_FIT_VALUE = "scale-fit";
108109
enum SETTINGS_BACKGROUND_IMAGE_MODE_TILE_VALUE = "tile";
109110
enum SETTINGS_BACKGROUND_IMAGE_MODE_CENTER_VALUE = "center";
110111
enum SETTINGS_BACKGROUND_IMAGE_MODE_STRETCH_VALUE = "stretch";
111-
immutable string[] SETTINGS_BACKGROUND_IMAGE_MODE_VALUES = [SETTINGS_BACKGROUND_IMAGE_MODE_SCALE_VALUE,SETTINGS_BACKGROUND_IMAGE_MODE_TILE_VALUE,SETTINGS_BACKGROUND_IMAGE_MODE_CENTER_VALUE,SETTINGS_BACKGROUND_IMAGE_MODE_STRETCH_VALUE];
112+
immutable string[] SETTINGS_BACKGROUND_IMAGE_MODE_VALUES = [SETTINGS_BACKGROUND_IMAGE_MODE_SCALE_VALUE,SETTINGS_BACKGROUND_IMAGE_MODE_SCALE_FIT_VALUE,SETTINGS_BACKGROUND_IMAGE_MODE_TILE_VALUE,SETTINGS_BACKGROUND_IMAGE_MODE_CENTER_VALUE,SETTINGS_BACKGROUND_IMAGE_MODE_STRETCH_VALUE];
112113

113114
enum SETTINGS_SIDEBAR_RIGHT = "sidebar-on-right";
114115
enum SETTINGS_RECENT_SESSION_FILES_KEY = "recent-session-files";

0 commit comments

Comments
 (0)