[vte] widget: Add font-scale property
- From: Christian Persch <chpe src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [vte] widget: Add font-scale property
- Date: Sun, 6 Apr 2014 13:38:12 +0000 (UTC)
commit c818ee7445189cda4f5fa1dc19f676d91fbab7a7
Author: Christian Persch <chpe gnome org>
Date: Fri May 27 23:49:37 2011 +0200
widget: Add font-scale property
To implement zoom, add font-scale property.
Conflicts:
src/vte-private.h
src/vte.c
src/vteapp.c
doc/reference/vte-sections.txt | 3 +-
src/vte-private.h | 5 ++
src/vte.c | 149 +++++++++++++++++++++++++++++-----------
src/vte.h | 8 ++-
src/vteapp.c | 31 +++-----
5 files changed, 135 insertions(+), 61 deletions(-)
---
diff --git a/doc/reference/vte-sections.txt b/doc/reference/vte-sections.txt
index 4d75db4..de056d7 100644
--- a/doc/reference/vte-sections.txt
+++ b/doc/reference/vte-sections.txt
@@ -18,6 +18,8 @@ vte_terminal_paste_clipboard
vte_terminal_copy_primary
vte_terminal_paste_primary
vte_terminal_set_size
+vte_terminal_set_font_scale
+vte_terminal_get_font_scale
vte_terminal_set_audible_bell
vte_terminal_get_audible_bell
vte_terminal_set_visible_bell
@@ -43,7 +45,6 @@ vte_terminal_get_cursor_blink_mode
vte_terminal_set_cursor_blink_mode
vte_terminal_set_scrollback_lines
vte_terminal_set_font
-vte_terminal_set_font_from_string
vte_terminal_get_font
vte_terminal_get_has_selection
vte_terminal_set_word_chars
diff --git a/src/vte-private.h b/src/vte-private.h
index 045f3c5..831c53a 100644
--- a/src/vte-private.h
+++ b/src/vte-private.h
@@ -111,6 +111,9 @@ G_BEGIN_DECLS
#define VTE_COLOR_SOURCE_ESCAPE 0
#define VTE_COLOR_SOURCE_API 1
+#define VTE_FONT_SCALE_MIN (.25)
+#define VTE_FONT_SCALE_MAX (4.)
+
#define I_(string) (g_intern_static_string(string))
typedef enum {
@@ -351,7 +354,9 @@ struct _VteTerminalPrivate {
/* Data used when rendering the text which does not require server
* resources and which can be kept after unrealizing. */
+ PangoFontDescription *unscaled_font_desc;
PangoFontDescription *fontdesc;
+ gdouble font_scale;
gboolean fontdirty;
glong char_ascent;
glong char_descent;
diff --git a/src/vte.c b/src/vte.c
index d984d16..772e45b 100644
--- a/src/vte.c
+++ b/src/vte.c
@@ -168,7 +168,8 @@ enum {
PROP_SCROLL_ON_OUTPUT,
PROP_WINDOW_TITLE,
PROP_WORD_CHARS,
- PROP_VISIBLE_BELL
+ PROP_VISIBLE_BELL,
+ PROP_FONT_SCALE
};
/* these static variables are guarded by the GDK mutex */
@@ -7512,8 +7513,38 @@ vte_terminal_ensure_font (VteTerminal *terminal)
}
}
-/**
- * vte_terminal_set_font:
+static void
+vte_terminal_update_font(VteTerminal *terminal)
+{
+ VteTerminalPrivate *pvt = terminal->pvt;
+ PangoFontDescription *desc;
+ gdouble size;
+
+ desc = pango_font_description_copy(pvt->unscaled_font_desc);
+
+ size = pango_font_description_get_size(desc);
+ if (pango_font_description_get_size_is_absolute(desc)) {
+ pango_font_description_set_absolute_size(desc, pvt->font_scale * size);
+ } else {
+ pango_font_description_set_size(desc, pvt->font_scale * size);
+ }
+
+ if (pvt->fontdesc) {
+ pango_font_description_free(pvt->fontdesc);
+ }
+ pvt->fontdesc = desc;
+
+ pvt->fontdirty = TRUE;
+ pvt->has_fonts = TRUE;
+
+ /* Set the drawing font. */
+ if (gtk_widget_get_realized (&terminal->widget)) {
+ vte_terminal_ensure_font (terminal);
+ }
+}
+
+/*
+ * _vte_terminal_set_font:
* @terminal: a #VteTerminal
* @font_desc: (allow-none): a #PangoFontDescription for the desired font, or %NULL
*
@@ -7559,72 +7590,82 @@ vte_terminal_set_font(VteTerminal *terminal,
"Using default monospace font.\n");
}
- same_desc = pvt->fontdesc && pango_font_description_equal (pvt->fontdesc, desc);
-
+ same_desc = pvt->unscaled_font_desc &&
+ pango_font_description_equal (pvt->unscaled_font_desc, desc);
+
/* Note that we proceed to recreating the font even if the description
* are the same. This is because maybe screen
* font options were changed, or new fonts installed. Those will be
* detected at font creation time and respected.
*/
- g_object_freeze_notify(object);
-
/* Free the old font description and save the new one. */
- if (terminal->pvt->fontdesc != NULL) {
- pango_font_description_free(terminal->pvt->fontdesc);
+ if (terminal->pvt->unscaled_font_desc != NULL) {
+ pango_font_description_free(terminal->pvt->unscaled_font_desc);
}
- pvt->fontdesc = desc;
- pvt->fontdirty = TRUE;
- pvt->has_fonts = TRUE;
+
+ terminal->pvt->unscaled_font_desc = desc /* adopted */;
+
+ vte_terminal_update_font(terminal);
if (!same_desc)
g_object_notify(object, "font-desc");
+}
- /* Set the drawing font. */
- if (gtk_widget_get_realized (&terminal->widget)) {
- vte_terminal_ensure_font (terminal);
- }
+ /**
+ * vte_terminal_get_font:
+ * @terminal: a #VteTerminal
+ *
+ * Queries the terminal for information about the fonts which will be
+ * used to draw text in the terminal.
+ *
+ * Returns: (transfer none): a #PangoFontDescription describing the font the terminal is
+ * currently using to render text
+ */
+const PangoFontDescription *
+vte_terminal_get_font(VteTerminal *terminal)
+{
+ g_return_val_if_fail(VTE_IS_TERMINAL(terminal), NULL);
- g_object_thaw_notify(object);
+ return terminal->pvt->unscaled_font_desc;
}
/**
- * vte_terminal_set_font_from_string:
+ * vte_terminal_set_font_scale:
* @terminal: a #VteTerminal
- * @name: (type utf8): a pango font description in string form
+ * @scale: the font scale
*
- * A convenience function which converts @name into a #PangoFontDescription and
- * passes it to vte_terminal_set_font().
+ * Sets the terminal's font scale to @scale.
+ *
+ * Since: 0.30
*/
void
-vte_terminal_set_font_from_string(VteTerminal *terminal,
- const char *name)
+vte_terminal_set_font_scale(VteTerminal *terminal,
+ gdouble scale)
{
- PangoFontDescription *font_desc = NULL;
- g_return_if_fail(VTE_IS_TERMINAL(terminal));
- g_return_if_fail(name != NULL);
+ g_return_if_fail(VTE_IS_TERMINAL(terminal));
+ g_return_if_fail(scale >= VTE_FONT_SCALE_MIN && scale <= VTE_FONT_SCALE_MAX);
- if (name)
- font_desc = pango_font_description_from_string(name);
- vte_terminal_set_font(terminal, font_desc);
- pango_font_description_free(font_desc);
+ terminal->pvt->font_scale = CLAMP(scale, VTE_FONT_SCALE_MIN, VTE_FONT_SCALE_MAX);
+ vte_terminal_update_font(terminal);
+
+ g_object_notify(G_OBJECT(terminal), "font-scale");
}
/**
- * vte_terminal_get_font:
+ * vte_terminal_get_font_scale:
* @terminal: a #VteTerminal
*
- * Queries the terminal for information about the fonts which will be
- * used to draw text in the terminal.
+ * Returns: the terminal's font scale
*
- * Returns: (transfer none): a #PangoFontDescription describing the font the terminal is
- * currently using to render text
+ * Since: 0.30
*/
-const PangoFontDescription *
-vte_terminal_get_font(VteTerminal *terminal)
+gdouble
+vte_terminal_get_font_scale(VteTerminal *terminal)
{
- g_return_val_if_fail(VTE_IS_TERMINAL(terminal), NULL);
- return terminal->pvt->fontdesc;
+ g_return_val_if_fail(VTE_IS_TERMINAL(terminal), 1.);
+
+ return terminal->pvt->font_scale;
}
/* Read and refresh our perception of the size of the PTY. */
@@ -8216,6 +8257,8 @@ vte_terminal_init(VteTerminal *terminal)
pvt->background_alpha = 1.;
pvt->selection_block_mode = FALSE;
+ pvt->unscaled_font_desc = pvt->fontdesc = NULL;
+ pvt->font_scale = 1.;
pvt->has_fonts = FALSE;
pvt->alternate_screen_scroll = TRUE;
@@ -8528,6 +8571,7 @@ vte_terminal_finalize(GObject *object)
{
GtkWidget *widget = GTK_WIDGET (object);
VteTerminal *terminal = VTE_TERMINAL (object);
+ VteTerminalPrivate *pvt = terminal->pvt;
GtkClipboard *clipboard;
GtkSettings *settings;
struct vte_match_regex *regex;
@@ -8544,6 +8588,9 @@ vte_terminal_finalize(GObject *object)
_vte_iso2022_state_free(terminal->pvt->iso2022);
/* Free the font description. */
+ if (pvt->unscaled_font_desc != NULL) {
+ pango_font_description_free(pvt->unscaled_font_desc);
+ }
if (terminal->pvt->fontdesc != NULL) {
pango_font_description_free(terminal->pvt->fontdesc);
}
@@ -10761,6 +10808,9 @@ vte_terminal_get_property (GObject *object,
case PROP_VISIBLE_BELL:
g_value_set_boolean (value, vte_terminal_get_visible_bell (terminal));
break;
+ case PROP_FONT_SCALE:
+ g_value_set_double (value, vte_terminal_get_font_scale (terminal));
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
@@ -10847,6 +10897,9 @@ vte_terminal_set_property (GObject *object,
case PROP_VISIBLE_BELL:
vte_terminal_set_visible_bell (terminal, g_value_get_boolean (value));
break;
+ case PROP_FONT_SCALE:
+ vte_terminal_set_font_scale (terminal, g_value_get_double (value));
+ break;
/* Not writable */
case PROP_CURRENT_DIRECTORY_URI:
@@ -11619,7 +11672,23 @@ vte_terminal_class_init(VteTerminalClass *klass)
g_param_spec_string ("emulation", NULL, NULL,
VTE_DEFAULT_EMULATION,
G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
-
+
+ /**
+ * VteTerminal:font-scale:
+ *
+ * The terminal's font scale.
+ *
+ * Since: 0.30
+ */
+ g_object_class_install_property
+ (gobject_class,
+ PROP_AUDIBLE_BELL,
+ g_param_spec_double ("font-scale", NULL, NULL,
+ VTE_FONT_SCALE_MIN,
+ VTE_FONT_SCALE_MAX,
+ 1.,
+ G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
/**
* VteTerminal:encoding:
*
diff --git a/src/vte.h b/src/vte.h
index 9075aa2..7bb4a75 100644
--- a/src/vte.h
+++ b/src/vte.h
@@ -91,6 +91,9 @@ struct _VteTerminalClass {
void (*resize_window)(VteTerminal* terminal, guint width, guint height);
void (*move_window)(VteTerminal* terminal, guint x, guint y);
+ /* FIXMEchpe: should these return gboolean and have defaul thandlers
+ * settings the "scale" property?
+ */
void (*increase_font_size)(VteTerminal* terminal);
void (*decrease_font_size)(VteTerminal* terminal);
@@ -220,6 +223,10 @@ void vte_terminal_select_none(VteTerminal *terminal);
void vte_terminal_set_size(VteTerminal *terminal,
glong columns, glong rows);
+void vte_terminal_set_font_scale(VteTerminal *terminal,
+ gdouble scale);
+gdouble vte_terminal_get_font_scale(VteTerminal *terminal);
+
/* Set various on-off settings. */
void vte_terminal_set_audible_bell(VteTerminal *terminal, gboolean is_audible);
gboolean vte_terminal_get_audible_bell(VteTerminal *terminal);
@@ -270,7 +277,6 @@ void vte_terminal_set_scrollback_lines(VteTerminal *terminal, glong lines);
/* Set or retrieve the current font. */
void vte_terminal_set_font(VteTerminal *terminal,
const PangoFontDescription *font_desc);
-void vte_terminal_set_font_from_string(VteTerminal *terminal, const char *name);
const PangoFontDescription *vte_terminal_get_font(VteTerminal *terminal);
void vte_terminal_set_allow_bold(VteTerminal *terminal, gboolean allow_bold);
gboolean vte_terminal_get_allow_bold(VteTerminal *terminal);
diff --git a/src/vteapp.c b/src/vteapp.c
index f544573..254adfe 100644
--- a/src/vteapp.c
+++ b/src/vteapp.c
@@ -346,12 +346,11 @@ move_window(GtkWidget *widget, guint x, guint y, gpointer data)
}
static void
-adjust_font_size(GtkWidget *widget, gpointer data, gint howmuch)
+adjust_font_size(GtkWidget *widget, gpointer data, gdouble factor)
{
VteTerminal *terminal;
- PangoFontDescription *desired;
+ gdouble scale;
glong char_width, char_height;
- gint newsize;
gint columns, rows, owidth, oheight;
/* Read the screen dimensions in cells. */
@@ -366,16 +365,8 @@ adjust_font_size(GtkWidget *widget, gpointer data, gint howmuch)
owidth -= char_width * columns;
oheight -= char_height * rows;
- /* Calculate the new font size. */
- desired = pango_font_description_copy(vte_terminal_get_font(terminal));
- newsize = pango_font_description_get_size(desired) / PANGO_SCALE;
- newsize += howmuch;
- pango_font_description_set_size(desired,
- CLAMP(newsize, 4, 144) * PANGO_SCALE);
-
- /* Change the font, then resize the window so that we have the same
- * number of rows and columns. */
- vte_terminal_set_font(terminal, desired);
+ scale = vte_terminal_get_font_scale(terminal);
+ vte_terminal_set_font_scale(terminal, scale * factor);
/* This above call will have changed the char size! */
char_width = vte_terminal_get_char_width (terminal);
@@ -384,20 +375,18 @@ adjust_font_size(GtkWidget *widget, gpointer data, gint howmuch)
gtk_window_resize(GTK_WINDOW(data),
columns * char_width + owidth,
rows * char_height + oheight);
-
- pango_font_description_free(desired);
}
static void
increase_font_size(GtkWidget *widget, gpointer data)
{
- adjust_font_size(widget, data, 1);
+ adjust_font_size(widget, data, 1.2);
}
static void
decrease_font_size(GtkWidget *widget, gpointer data)
{
- adjust_font_size(widget, data, -1);
+ adjust_font_size(widget, data, 1. / 1.2);
}
static gboolean
@@ -907,7 +896,7 @@ main(int argc, char **argv)
/* Create the terminal widget and add it to the scrolling shell. */
widget = vteapp_terminal_new();
terminal = VTE_TERMINAL (widget);
- if (!dbuffer) {
+ if (!dbuffer) {
gtk_widget_set_double_buffered(widget, dbuffer);
}
if (show_object_notifications)
@@ -1040,7 +1029,11 @@ main(int argc, char **argv)
/* Set the default font. */
if (font) {
- vte_terminal_set_font_from_string(terminal, font);
+ PangoFontDescription *desc;
+
+ desc = pango_font_description_from_string(font);
+ vte_terminal_set_font(terminal, desc);
+ pango_font_description_free(desc);
}
/* Match "abcdefg". */
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]