[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