[Xfce4-commits] [apps/xfce4-terminal] 01/01: Add ability to zoom in/out by pressing Ctrl +/-
noreply at xfce.org
noreply at xfce.org
Mon Jul 25 16:38:03 CEST 2016
This is an automated email from the git hooks/post-receive script.
f2404 pushed a commit to branch master
in repository apps/xfce4-terminal.
commit 77194638860b9ddfe14e11bcad3fa9b66f840d8f
Author: Igor <f2404 at yandex.ru>
Date: Mon Jul 25 17:37:01 2016 +0300
Add ability to zoom in/out by pressing Ctrl +/-
Patch provided by a Debian user and adopted by Alexander Butenko:
https://bugzilla.xfce.org/show_bug.cgi?id=5605
---
terminal/main.c | 8 +++-
terminal/terminal-app.c | 14 +++++++
terminal/terminal-options.c | 40 +++++++++++++++++++
terminal/terminal-options.h | 19 +++++++++
terminal/terminal-screen.c | 74 +++++++++++++++++++++++++++++++----
terminal/terminal-screen.h | 1 +
terminal/terminal-window-ui.xml | 8 ++++
terminal/terminal-window.c | 87 +++++++++++++++++++++++++++++++++++++++++
terminal/terminal-window.h | 3 ++
9 files changed, 245 insertions(+), 9 deletions(-)
diff --git a/terminal/main.c b/terminal/main.c
index 2bd678a..95b35af 100644
--- a/terminal/main.c
+++ b/terminal/main.c
@@ -131,7 +131,7 @@ usage (void)
" --display=%s; --geometry=%s; --role=%s; --drop-down;\n"
" --startup-id=%s; -I, --icon=%s; --fullscreen; --maximize;\n"
" --show-menubar, --hide-menubar; --show-borders, --hide-borders;\n"
- " --show-toolbar, --hide-toolbar\n\n",
+ " --show-toolbar, --hide-toolbar, --font=%s, --zoom=%s\n\n",
_("Window Options"),
/* parameter of --display */
_("display"),
@@ -142,7 +142,11 @@ usage (void)
/* parameter of --startup-id */
_("string"),
/* parameter of --icon */
- _("icon"));
+ _("icon"),
+ /* parameter of --font */
+ _("font"),
+ /* parameter of --zoom */
+ _("zoom"));
g_print (_("See the %s man page for full explanation of the options above."),
PACKAGE_NAME);
diff --git a/terminal/terminal-app.c b/terminal/terminal-app.c
index 1b940a7..84bd0aa 100644
--- a/terminal/terminal-app.c
+++ b/terminal/terminal-app.c
@@ -377,6 +377,9 @@ terminal_app_new_window (TerminalWindow *window,
win_attr->display = gdk_screen_make_display_name (screen);
tab_attr = win_attr->tabs->data;
tab_attr->directory = g_strdup (working_directory);
+ if (window->font)
+ win_attr->font = g_strdup (window->font);
+ win_attr->zoom = window->zoom;
/* check if we should try to inherit the parent geometry */
g_object_get (G_OBJECT (app->preferences), "misc-inherit-geometry", &inherit_geometry, NULL);
@@ -709,6 +712,17 @@ terminal_app_open_window (TerminalApp *app,
}
}
+ /* font and zoom for new window */
+ if (!reuse_window)
+ {
+ if (attr->font)
+ {
+ g_free (TERMINAL_WINDOW (window)->font);
+ TERMINAL_WINDOW (window)->font = g_strdup (attr->font);
+ }
+ TERMINAL_WINDOW (window)->zoom = attr->zoom;
+ }
+
/* add the tabs */
for (lp = attr->tabs; lp != NULL; lp = lp->next)
{
diff --git a/terminal/terminal-options.c b/terminal/terminal-options.c
index 8c70970..97d96e8 100644
--- a/terminal/terminal-options.c
+++ b/terminal/terminal-options.c
@@ -27,6 +27,9 @@
#ifdef HAVE_STRING_H
#include <string.h>
#endif
+#ifdef HAVE_STDLIB_H
+#include <stdlib.h>
+#endif
#include <libxfce4util/libxfce4util.h>
@@ -193,6 +196,7 @@ terminal_window_attr_parse (gint argc,
GSList *tp, *wp;
GSList *attrs;
gint n;
+ gchar *end_ptr = NULL;
TerminalVisibility visible;
win_attr = terminal_window_attr_new ();
@@ -445,6 +449,40 @@ terminal_window_attr_parse (gint argc,
tab_attr = win_attr->tabs->data;
attrs = g_slist_append (attrs, win_attr);
}
+ else if (terminal_option_cmp ("font", 0, argc, argv, &n, &s))
+ {
+ if (G_UNLIKELY (s == NULL))
+ {
+ g_set_error (error, G_SHELL_ERROR, G_SHELL_ERROR_FAILED,
+ _("Option \"--font\" requires specifying "
+ "the font name as its parameter"));
+ goto failed;
+ }
+ else
+ {
+ g_free (win_attr->font);
+ win_attr->font = g_strdup (s);
+ continue;
+ }
+ }
+ else if (terminal_option_cmp ("zoom", 0, argc, argv, &n, &s))
+ {
+ if (G_UNLIKELY (s == NULL) ||
+ strtol (s, &end_ptr, 0) < TERMINAL_ZOOM_LEVEL_MINIMUM ||
+ strtol (s, &end_ptr, 0) > TERMINAL_ZOOM_LEVEL_MAXIMUM)
+ {
+ g_set_error (error, G_SHELL_ERROR, G_SHELL_ERROR_FAILED,
+ _("Option \"--zoom\" requires specifying "
+ "the zoom (%d .. %d) as its parameter"),
+ TERMINAL_ZOOM_LEVEL_MINIMUM, TERMINAL_ZOOM_LEVEL_MAXIMUM);
+ goto failed;
+ }
+ else
+ {
+ win_attr->zoom = strtol (s, &end_ptr, 0);
+ continue;
+ }
+ }
else if (terminal_option_cmp ("disable-server", 0, argc, argv, &n, NULL)
|| terminal_option_cmp ("sync", 0, argc, argv, &n, NULL)
|| terminal_option_cmp ("g-fatal-warnings", 0, argc, argv, &n, NULL))
@@ -514,6 +552,7 @@ terminal_window_attr_new (void)
win_attr->menubar = TERMINAL_VISIBILITY_DEFAULT;
win_attr->borders = TERMINAL_VISIBILITY_DEFAULT;
win_attr->toolbar = TERMINAL_VISIBILITY_DEFAULT;
+ win_attr->zoom = TERMINAL_ZOOM_LEVEL_DEFAULT;
tab_attr = g_slice_new0 (TerminalTabAttr);
win_attr->tabs = g_slist_prepend (NULL, tab_attr);
@@ -540,5 +579,6 @@ terminal_window_attr_free (TerminalWindowAttr *attr)
g_free (attr->display);
g_free (attr->role);
g_free (attr->icon);
+ g_free (attr->font);
g_slice_free (TerminalWindowAttr, attr);
}
diff --git a/terminal/terminal-options.h b/terminal/terminal-options.h
index 14079be..9a540f5 100644
--- a/terminal/terminal-options.h
+++ b/terminal/terminal-options.h
@@ -27,6 +27,7 @@ G_BEGIN_DECLS
typedef struct _TerminalTabAttr TerminalTabAttr;
typedef struct _TerminalWindowAttr TerminalWindowAttr;
typedef enum _TerminalVisibility TerminalVisibility;
+typedef enum _TerminalZoomLevel TerminalZoomLevel;
enum _TerminalVisibility
{
@@ -35,6 +36,22 @@ enum _TerminalVisibility
TERMINAL_VISIBILITY_HIDE
};
+enum _TerminalZoomLevel
+{
+ TERMINAL_ZOOM_LEVEL_XXX_SMALL = -4,
+ TERMINAL_ZOOM_LEVEL_XX_SMALL = -3,
+ TERMINAL_ZOOM_LEVEL_X_SMALL = -2,
+ TERMINAL_ZOOM_LEVEL_SMALL = -1,
+ TERMINAL_ZOOM_LEVEL_MEDIUM = 0,
+ TERMINAL_ZOOM_LEVEL_LARGE = +1,
+ TERMINAL_ZOOM_LEVEL_X_LARGE = +2,
+ TERMINAL_ZOOM_LEVEL_XX_LARGE = +3,
+ TERMINAL_ZOOM_LEVEL_XXX_LARGE = +4,
+ TERMINAL_ZOOM_LEVEL_MINIMUM = TERMINAL_ZOOM_LEVEL_XXX_SMALL,
+ TERMINAL_ZOOM_LEVEL_MAXIMUM = TERMINAL_ZOOM_LEVEL_XXX_LARGE,
+ TERMINAL_ZOOM_LEVEL_DEFAULT = TERMINAL_ZOOM_LEVEL_MEDIUM,
+};
+
struct _TerminalTabAttr
{
gchar **command;
@@ -53,10 +70,12 @@ struct _TerminalWindowAttr
gchar *startup_id;
gchar *sm_client_id;
gchar *icon;
+ gchar *font;
guint fullscreen : 1;
TerminalVisibility menubar;
TerminalVisibility borders;
TerminalVisibility toolbar;
+ TerminalZoomLevel zoom;
guint maximize : 1;
guint reuse_last_window : 1;
};
diff --git a/terminal/terminal-screen.c b/terminal/terminal-screen.c
index 73d82c2..5b2aabe 100644
--- a/terminal/terminal-screen.c
+++ b/terminal/terminal-screen.c
@@ -111,7 +111,6 @@ static void terminal_screen_update_binding_backspace (TerminalScreen
static void terminal_screen_update_binding_delete (TerminalScreen *screen);
static void terminal_screen_update_encoding (TerminalScreen *screen);
static void terminal_screen_update_colors (TerminalScreen *screen);
-static void terminal_screen_update_font (TerminalScreen *screen);
static void terminal_screen_update_misc_bell (TerminalScreen *screen);
static void terminal_screen_update_misc_cursor_blinks (TerminalScreen *screen);
static void terminal_screen_update_misc_cursor_shape (TerminalScreen *screen);
@@ -142,7 +141,9 @@ static void terminal_screen_vte_window_contents_resized (TerminalScreen
static gboolean terminal_screen_timer_background (gpointer user_data);
static void terminal_screen_timer_background_destroy (gpointer user_data);
static void terminal_screen_update_label_orientation (TerminalScreen *screen);
-
+static gchar *terminal_screen_zoom_font (TerminalScreen *screen,
+ gchar *font_name,
+ TerminalZoomLevel zoom);
struct _TerminalScreenClass
@@ -975,7 +976,7 @@ terminal_screen_update_colors (TerminalScreen *screen)
-static void
+void
terminal_screen_update_font (TerminalScreen *screen)
{
gboolean font_allow_bold;
@@ -993,6 +994,18 @@ terminal_screen_update_font (TerminalScreen *screen)
"font-name", &font_name,
NULL);
+ toplevel = gtk_widget_get_toplevel (GTK_WIDGET (screen));
+ if (TERMINAL_IS_WINDOW (toplevel))
+ {
+ if (TERMINAL_WINDOW (toplevel)->font)
+ {
+ g_free (font_name);
+ font_name = g_strdup (TERMINAL_WINDOW (toplevel)->font);
+ }
+ if (TERMINAL_WINDOW (toplevel)->zoom != TERMINAL_ZOOM_LEVEL_DEFAULT)
+ font_name = terminal_screen_zoom_font (screen, font_name, TERMINAL_WINDOW (toplevel)->zoom);
+ }
+
if (gtk_widget_get_realized (GTK_WIDGET (screen)))
terminal_screen_get_size (screen, &grid_w, &grid_h);
@@ -1007,10 +1020,7 @@ terminal_screen_update_font (TerminalScreen *screen)
/* update window geometry it required */
if (grid_w > 0 && grid_h > 0)
- {
- toplevel = gtk_widget_get_toplevel (GTK_WIDGET (screen));
- terminal_screen_force_resize_window (screen, GTK_WINDOW (toplevel), grid_w, grid_h);
- }
+ terminal_screen_force_resize_window (screen, GTK_WINDOW (toplevel), grid_w, grid_h);
}
@@ -1488,6 +1498,56 @@ terminal_screen_update_label_orientation (TerminalScreen *screen)
+static
+gchar* terminal_screen_zoom_font (TerminalScreen *screen,
+ gchar *font_name,
+ TerminalZoomLevel zoom)
+{
+ gdouble scale;
+ PangoFontDescription *font_desc;
+ gchar *font_zoomed;
+
+ terminal_return_val_if_fail (TERMINAL_IS_SCREEN (screen), NULL);
+ terminal_return_val_if_fail (font_name != NULL, NULL);
+
+ switch (zoom)
+ {
+ case TERMINAL_ZOOM_LEVEL_XXX_SMALL: scale = PANGO_SCALE_XX_SMALL/1.2; break;
+ case TERMINAL_ZOOM_LEVEL_XX_SMALL: scale = PANGO_SCALE_XX_SMALL; break;
+ case TERMINAL_ZOOM_LEVEL_X_SMALL: scale = PANGO_SCALE_X_SMALL; break;
+ case TERMINAL_ZOOM_LEVEL_SMALL: scale = PANGO_SCALE_SMALL; break;
+ case TERMINAL_ZOOM_LEVEL_LARGE: scale = PANGO_SCALE_LARGE; break;
+ case TERMINAL_ZOOM_LEVEL_X_LARGE: scale = PANGO_SCALE_X_LARGE; break;
+ case TERMINAL_ZOOM_LEVEL_XX_LARGE: scale = PANGO_SCALE_XX_LARGE; break;
+ case TERMINAL_ZOOM_LEVEL_XXX_LARGE: scale = PANGO_SCALE_XX_LARGE*1.2; break;
+ default:
+ return font_name;
+ }
+
+ font_desc = pango_font_description_from_string (font_name);
+ if (font_desc == NULL)
+ return font_name;
+
+ if (pango_font_description_get_size_is_absolute (font_desc))
+ pango_font_description_set_absolute_size (font_desc,
+ scale * pango_font_description_get_size (font_desc));
+ else
+ pango_font_description_set_size (font_desc,
+ scale * pango_font_description_get_size (font_desc));
+
+ font_zoomed = pango_font_description_to_string (font_desc);
+ pango_font_description_free (font_desc);
+
+ if (font_zoomed == NULL)
+ return font_name;
+
+ g_free(font_name);
+
+ return font_zoomed;
+}
+
+
+
/**
* terminal_screen_launch_child:
* @screen : A #TerminalScreen.
diff --git a/terminal/terminal-screen.h b/terminal/terminal-screen.h
index ee0d51a..3fa6b2e 100644
--- a/terminal/terminal-screen.h
+++ b/terminal/terminal-screen.h
@@ -107,6 +107,7 @@ void terminal_screen_search_find_next (TerminalScreen *scree
void terminal_screen_search_find_previous (TerminalScreen *screen);
+void terminal_screen_update_font (TerminalScreen *screen);
G_END_DECLS
diff --git a/terminal/terminal-window-ui.xml b/terminal/terminal-window-ui.xml
index 1a63e04..41aadc6 100644
--- a/terminal/terminal-window-ui.xml
+++ b/terminal/terminal-window-ui.xml
@@ -31,6 +31,10 @@
<menuitem action="show-toolbar"/>
<menuitem action="show-borders"/>
<menuitem action="fullscreen"/>
+ <separator/>
+ <menuitem action="zoom-in"/>
+ <menuitem action="zoom-out"/>
+ <menuitem action="zoom-reset"/>
</menu>
<menu action="terminal-menu">
<menuitem action="set-title"/>
@@ -70,6 +74,10 @@
<menuitem action="show-menubar"/>
<menuitem action="fullscreen"/>
<separator/>
+ <menuitem action="zoom-in"/>
+ <menuitem action="zoom-out"/>
+ <menuitem action="zoom-reset"/>
+ <separator/>
<menuitem action="preferences"/>
</popup>
diff --git a/terminal/terminal-window.c b/terminal/terminal-window.c
index fb148a1..6f66828 100644
--- a/terminal/terminal-window.c
+++ b/terminal/terminal-window.c
@@ -155,6 +155,12 @@ static void terminal_window_action_show_borders (GtkToggleA
TerminalWindow *window);
static void terminal_window_action_fullscreen (GtkToggleAction *action,
TerminalWindow *window);
+static void terminal_window_action_zoom_in (GtkAction *action,
+ TerminalWindow *window);
+static void terminal_window_action_zoom_out (GtkAction *action,
+ TerminalWindow *window);
+static void terminal_window_action_zoom_reset (GtkAction *action,
+ TerminalWindow *window);
static void terminal_window_action_prev_tab (GtkAction *action,
TerminalWindow *window);
static void terminal_window_action_next_tab (GtkAction *action,
@@ -181,6 +187,7 @@ static void terminal_window_action_contents (GtkAction
TerminalWindow *window);
static void terminal_window_action_about (GtkAction *action,
TerminalWindow *window);
+static void terminal_window_zoom_update_screens (TerminalWindow *window);
@@ -205,6 +212,9 @@ static const GtkActionEntry action_entries[] =
{ "select-all", "edit-select-all", N_ ("Select _All"), "<control><shift>a", NULL, G_CALLBACK (terminal_window_action_select_all), },
{ "preferences", "preferences-system", N_ ("Pr_eferences..."), NULL, N_ ("Open the preferences dialog"), G_CALLBACK (terminal_window_action_prefs), },
{ "view-menu", NULL, N_ ("_View"), NULL, NULL, NULL, },
+ { "zoom-in", "zoom-in", N_ ("Zoom _In"), "<control>plus", N_ ("Zoom in with larger font"), G_CALLBACK (terminal_window_action_zoom_in), },
+ { "zoom-out", "zoom-out", N_ ("Zoom _Out"), "<control>minus", N_ ("Zoom out with smaller font"), G_CALLBACK (terminal_window_action_zoom_out), },
+ { "zoom-reset", "zoom-original", N_ ("_Normal Size"), "<control>0", N_ ("Zoom to default size"), G_CALLBACK (terminal_window_action_zoom_reset), },
{ "terminal-menu", NULL, N_ ("_Terminal"), NULL, NULL, NULL, },
{ "set-title", NULL, N_ ("_Set Title..."), "<control><shift>s", NULL, G_CALLBACK (terminal_window_action_set_title), },
{ "search", "edit-find", N_ ("_Find..."), "<control><shift>f", N_ ("Search terminal contents"), G_CALLBACK (terminal_window_action_search), },
@@ -292,6 +302,9 @@ terminal_window_init (TerminalWindow *window)
window->preferences = terminal_preferences_get ();
+ window->font = NULL;
+ window->zoom = TERMINAL_ZOOM_LEVEL_DEFAULT;
+
/* try to set the rgba colormap so vte can use real transparency */
screen = gtk_window_get_screen (GTK_WINDOW (window));
visual = gdk_screen_get_rgba_visual (screen);
@@ -390,6 +403,7 @@ terminal_window_finalize (GObject *object)
g_object_unref (G_OBJECT (window->encoding_action));
g_slist_free (window->tabs_menu_actions);
+ g_free (window->font);
(*G_OBJECT_CLASS (terminal_window_parent_class)->finalize) (object);
}
@@ -1455,6 +1469,51 @@ terminal_window_action_fullscreen (GtkToggleAction *action,
static void
+terminal_window_action_zoom_in (GtkAction *action,
+ TerminalWindow *window)
+{
+ terminal_return_if_fail (window->active != NULL);
+
+ if (window->zoom < TERMINAL_ZOOM_LEVEL_MAXIMUM)
+ {
+ ++window->zoom;
+ terminal_window_zoom_update_screens (window);
+ }
+}
+
+
+
+static void
+terminal_window_action_zoom_out (GtkAction *action,
+ TerminalWindow *window)
+{
+ terminal_return_if_fail (window->active != NULL);
+
+ if (window->zoom > TERMINAL_ZOOM_LEVEL_MINIMUM)
+ {
+ --window->zoom;
+ terminal_window_zoom_update_screens (window);
+ }
+}
+
+
+
+static void
+terminal_window_action_zoom_reset (GtkAction *action,
+ TerminalWindow *window)
+{
+ terminal_return_if_fail (window->active != NULL);
+
+ if (window->zoom != TERMINAL_ZOOM_LEVEL_DEFAULT)
+ {
+ window->zoom = TERMINAL_ZOOM_LEVEL_DEFAULT;
+ terminal_window_zoom_update_screens (window);
+ }
+}
+
+
+
+static void
terminal_window_action_prev_tab (GtkAction *action,
TerminalWindow *window)
{
@@ -1792,6 +1851,25 @@ terminal_window_action_about (GtkAction *action,
+static void
+terminal_window_zoom_update_screens (TerminalWindow *window)
+{
+ gint npages, n;
+ TerminalScreen *screen;
+
+ terminal_return_if_fail (GTK_IS_NOTEBOOK (window->notebook));
+
+ /* walk the tabs */
+ npages = gtk_notebook_get_n_pages (GTK_NOTEBOOK (window->notebook));
+ for (n = 0; n < npages; n++)
+ {
+ screen = TERMINAL_SCREEN (gtk_notebook_get_nth_page (GTK_NOTEBOOK (window->notebook), n));
+ terminal_screen_update_font (screen);
+ }
+}
+
+
+
/**
* terminal_window_new:
* @fullscreen: Whether to set the window to fullscreen.
@@ -1881,6 +1959,10 @@ terminal_window_add (TerminalWindow *window,
gtk_notebook_set_tab_reorderable (GTK_NOTEBOOK (window->notebook), GTK_WIDGET (screen), TRUE);
gtk_notebook_set_tab_detachable (GTK_NOTEBOOK (window->notebook), GTK_WIDGET (screen), TRUE);
+ /* update screen font from window */
+ if (window->font || window->zoom != TERMINAL_ZOOM_LEVEL_DEFAULT)
+ terminal_screen_update_font (screen);
+
/* show the terminal screen */
gtk_widget_realize (GTK_WIDGET (screen));
gtk_widget_show (GTK_WIDGET (screen));
@@ -2006,6 +2088,11 @@ terminal_window_get_restart_command (TerminalWindow *window)
else
result = g_slist_prepend (result, g_strdup ("--hide-toolbar"));
+ if (window->zoom != TERMINAL_ZOOM_LEVEL_DEFAULT)
+ result = g_slist_prepend (result, g_strdup_printf ("--zoom=%d", window->zoom));
+ if (window->font != NULL)
+ result = g_slist_prepend (result, g_strdup_printf ("--font=%s", window->font));
+
/* set restart commands of the tabs */
children = gtk_container_get_children (GTK_CONTAINER (window->notebook));
for (lp = children; lp != NULL; lp = lp->next)
diff --git a/terminal/terminal-window.h b/terminal/terminal-window.h
index c89ac46..dcf8507 100644
--- a/terminal/terminal-window.h
+++ b/terminal/terminal-window.h
@@ -72,6 +72,9 @@ struct _TerminalWindow
glong grid_width;
glong grid_height;
+ gchar *font;
+ TerminalZoomLevel zoom;
+
GtkAction *encoding_action;
TerminalScreen *active;
--
To stop receiving notification emails like this one, please contact
the administrator of this repository.
More information about the Xfce4-commits
mailing list