Index: xfce4-terminal-0.6.1/terminal/terminal-options.c =================================================================== --- xfce4-terminal-0.6.1.orig/terminal/terminal-options.c +++ xfce4-terminal-0.6.1/terminal/terminal-options.c @@ -444,6 +444,41 @@ terminal_window_attr_parse (gint 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)) + { + gchar *end_ptr = NULL; + if (G_UNLIKELY (s == NULL || strlen(s) == 0 || + strtol (s, &end_ptr, 0) < TERMINAL_ZOOM_LEVEL_MINIMUM || end_ptr == NULL || end_ptr == s || *end_ptr || + strtol (s, &end_ptr, 0) > TERMINAL_ZOOM_LEVEL_MAXIMUM || end_ptr == NULL || end_ptr == s || *end_ptr)) + { + 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); + terminal_assert (win_attr->zoom >= TERMINAL_ZOOM_LEVEL_MINIMUM && win_attr->zoom <= TERMINAL_ZOOM_LEVEL_MAXIMUM); + 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)) @@ -513,6 +548,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); @@ -539,5 +575,6 @@ terminal_window_attr_free (TerminalWindo g_free (attr->display); g_free (attr->role); g_free (attr->icon); + g_free (attr->font); g_slice_free (TerminalWindowAttr, attr); } Index: xfce4-terminal-0.6.1/terminal/terminal-options.h =================================================================== --- xfce4-terminal-0.6.1.orig/terminal/terminal-options.h +++ xfce4-terminal-0.6.1/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 { @@ -43,6 +44,23 @@ struct _TerminalTabAttr guint hold : 1; }; +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 = 0, +}; + struct _TerminalWindowAttr { GSList *tabs; @@ -59,6 +77,8 @@ struct _TerminalWindowAttr TerminalVisibility toolbar; guint maximize : 1; guint reuse_last_window : 1; + gchar *font; + TerminalZoomLevel zoom; }; void terminal_options_parse (gint argc, Index: xfce4-terminal-0.6.1/terminal/main.c =================================================================== --- xfce4-terminal-0.6.1.orig/terminal/main.c +++ xfce4-terminal-0.6.1/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); Index: xfce4-terminal-0.6.1/terminal/terminal-app.c =================================================================== --- xfce4-terminal-0.6.1.orig/terminal/terminal-app.c +++ xfce4-terminal-0.6.1/terminal/terminal-app.c @@ -375,6 +375,12 @@ terminal_app_new_window (TerminalWindow 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); if (G_UNLIKELY (inherit_geometry)) @@ -656,6 +662,18 @@ terminal_app_open_window (TerminalApp } } + /* font and zoom for new window */ + if (!reuse_window) + { + TerminalWindow *terminal_window = TERMINAL_WINDOW (window); + if (attr->font) + { + g_free (terminal_window->font); + terminal_window->font = g_strdup (attr->font); + } + terminal_window->zoom = attr->zoom; + } + /* add the tabs */ for (lp = attr->tabs; lp != NULL; lp = lp->next) { Index: xfce4-terminal-0.6.1/terminal/terminal-window.c =================================================================== --- xfce4-terminal-0.6.1.orig/terminal/terminal-window.c +++ xfce4-terminal-0.6.1/terminal/terminal-window.c @@ -182,6 +182,13 @@ static void terminal_window_a TerminalWindow *window); static void terminal_window_action_about (GtkAction *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_zoom_update_screens (TerminalWindow *window); @@ -232,6 +239,12 @@ static const GtkToggleActionEntry toggle { "fullscreen", GTK_STOCK_FULLSCREEN, N_ ("_Fullscreen"), "F11", N_ ("Toggle fullscreen mode"), G_CALLBACK (terminal_window_action_fullscreen), FALSE, }, }; +static const GtkActionEntry zoom_action_entries[] = +{ + { "zoom-in", GTK_STOCK_ZOOM_IN, N_ ("Zoom _In"), "plus", N_ ("Zoom in with larger font"), G_CALLBACK (terminal_window_action_zoom_in), }, + { "zoom-out", GTK_STOCK_ZOOM_OUT, N_ ("Zoom _Out"), "minus", N_ ("Zoom out with smaller font"), G_CALLBACK (terminal_window_action_zoom_out), }, + { "zoom-reset", GTK_STOCK_ZOOM_100, N_ ("_Normal Size"), "0", N_ ("Zoom to default size"), G_CALLBACK (terminal_window_action_zoom_reset), }, +}; G_DEFINE_TYPE (TerminalWindow, terminal_window, GTK_TYPE_WINDOW) @@ -294,6 +307,9 @@ terminal_window_init (TerminalWindow *wi 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)); colormap = gdk_screen_get_rgba_colormap (screen); @@ -311,6 +327,10 @@ terminal_window_init (TerminalWindow *wi toggle_action_entries, G_N_ELEMENTS (toggle_action_entries), GTK_WIDGET (window)); + gtk_action_group_add_actions (window->action_group, + zoom_action_entries, + G_N_ELEMENTS (zoom_action_entries), + GTK_WIDGET (window)); window->ui_manager = gtk_ui_manager_new (); gtk_ui_manager_insert_action_group (window->ui_manager, window->action_group, 0); @@ -401,6 +421,8 @@ terminal_window_finalize (GObject *objec g_slist_free (window->tabs_menu_actions); + g_free(window->font); + (*G_OBJECT_CLASS (terminal_window_parent_class)->finalize) (object); } @@ -1771,7 +1793,62 @@ terminal_window_action_about (GtkAction terminal_util_show_about_dialog (GTK_WINDOW (window)); } +static void +terminal_window_action_zoom_in (GtkAction *action, + TerminalWindow *window) +{ + if (G_LIKELY (window->active != NULL)) + { + TerminalZoomLevel old = window->zoom; + if (window->zoom < TERMINAL_ZOOM_LEVEL_MAXIMUM) + ++window->zoom; + if (window->zoom != old) + terminal_window_zoom_update_screens (window); + } +} + +static void +terminal_window_action_zoom_out(GtkAction *action, + TerminalWindow *window) +{ + if (G_LIKELY (window->active != NULL)) + { + TerminalZoomLevel old = window->zoom; + if (window->zoom > TERMINAL_ZOOM_LEVEL_MINIMUM) + --window->zoom; + if (window->zoom != old) + terminal_window_zoom_update_screens (window); + } +} + +static void +terminal_window_action_zoom_reset(GtkAction *action, + TerminalWindow *window) +{ + if (G_LIKELY (window->active != NULL)) + { + TerminalZoomLevel old = window->zoom; + if (window->zoom != TERMINAL_ZOOM_LEVEL_DEFAULT) + window->zoom = TERMINAL_ZOOM_LEVEL_DEFAULT; + if (window->zoom != old) + terminal_window_zoom_update_screens (window); + } +} +static void +terminal_window_zoom_update_screens(TerminalWindow *window) +{ + gint npages, n; + TerminalScreen *screen; + + /* 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: @@ -1861,6 +1938,12 @@ terminal_window_add (TerminalWindow *win 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)); @@ -1986,6 +2069,11 @@ terminal_window_get_restart_command (Ter 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) Index: xfce4-terminal-0.6.1/terminal/terminal-window.h =================================================================== --- xfce4-terminal-0.6.1.orig/terminal/terminal-window.h +++ xfce4-terminal-0.6.1/terminal/terminal-window.h @@ -54,6 +54,9 @@ struct _TerminalWindow TerminalPreferences *preferences; GtkWidget *preferences_dialog; + gchar *font; + TerminalZoomLevel zoom; + GtkActionGroup *action_group; GtkUIManager *ui_manager; Index: xfce4-terminal-0.6.1/terminal/terminal-screen.c =================================================================== --- xfce4-terminal-0.6.1.orig/terminal/terminal-screen.c +++ xfce4-terminal-0.6.1/terminal/terminal-screen.c @@ -121,7 +121,9 @@ static void terminal_screen_update 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 gchar *terminal_screen_zoom_font (TerminalScreen *screen, + gchar *font_name, + TerminalZoomLevel zoom); static void terminal_screen_update_misc_bell (TerminalScreen *screen); static void terminal_screen_update_emulation (TerminalScreen *screen); static void terminal_screen_update_misc_cursor_blinks (TerminalScreen *screen); @@ -965,7 +967,57 @@ terminal_screen_update_colors (TerminalS -static void +static +gchar* terminal_screen_zoom_font (TerminalScreen *screen, + gchar *font_name, + TerminalZoomLevel zoom) +{ + gdouble scale; + PangoFontDescription *desc; + gchar *font_zoomed; + + terminal_return_val_if_fail ( font_name != NULL, NULL); + terminal_return_val_if_fail ( zoom != TERMINAL_ZOOM_LEVEL_DEFAULT, font_name); + terminal_return_val_if_fail ( zoom >= TERMINAL_ZOOM_LEVEL_MINIMUM && zoom <= TERMINAL_ZOOM_LEVEL_MAXIMUM, font_name); + + 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; + } + + desc = pango_font_description_from_string (font_name); + if (desc == NULL) + return font_name; + + if (pango_font_description_get_size_is_absolute (desc)) + pango_font_description_set_absolute_size (desc, + scale * pango_font_description_get_size (desc)); + else + pango_font_description_set_size (desc, + scale * pango_font_description_get_size (desc)); + + font_zoomed = pango_font_description_to_string (desc); + pango_font_description_free (desc); + + if (font_zoomed == NULL) + return font_name; + + g_free(font_name); + return font_zoomed; +} + + + +void terminal_screen_update_font (TerminalScreen *screen) { gboolean font_allow_bold; @@ -982,6 +1034,19 @@ terminal_screen_update_font (TerminalScr "font-name", &font_name, NULL); + toplevel = gtk_widget_get_toplevel (GTK_WIDGET (screen)); + if (TERMINAL_IS_WINDOW (toplevel)) + { + TerminalWindow *window = TERMINAL_WINDOW (toplevel); + if (window->font) + { + g_free (font_name); + font_name = g_strdup (window->font); + } + if (window->zoom != TERMINAL_ZOOM_LEVEL_DEFAULT) + font_name = terminal_screen_zoom_font (screen, font_name, window->zoom); + } + if (gtk_widget_get_realized (GTK_WIDGET (screen))) terminal_screen_get_size (screen, &grid_w, &grid_h); Index: xfce4-terminal-0.6.1/terminal/terminal-screen.h =================================================================== --- xfce4-terminal-0.6.1.orig/terminal/terminal-screen.h +++ xfce4-terminal-0.6.1/terminal/terminal-screen.h @@ -110,6 +110,8 @@ void terminal_screen_search_find void terminal_screen_search_find_previous (TerminalScreen *screen); +void terminal_screen_update_font (TerminalScreen *screen); + G_END_DECLS Index: xfce4-terminal-0.6.1/terminal/terminal-window-ui.xml =================================================================== --- xfce4-terminal-0.6.1.orig/terminal/terminal-window-ui.xml +++ xfce4-terminal-0.6.1/terminal/terminal-window-ui.xml @@ -31,6 +31,10 @@ + + + + @@ -69,6 +73,9 @@ + + + @@ -100,6 +107,9 @@ + + + Index: xfce4-terminal-0.6.1/terminal/terminal-window-ui.h =================================================================== --- xfce4-terminal-0.6.1.orig/terminal/terminal-window-ui.h +++ xfce4-terminal-0.6.1/terminal/terminal-window-ui.h @@ -16,33 +16,37 @@ static const char terminal_window_ui[] = "aste-selection\"/>" - "" - "" - "<" - "menuitem action=\"new-tab\"/>" + "<" + "menuitem action=\"zoom-reset\"/><" + "menuitem action=\"set-title\"/>" + "" + "" }; -static const unsigned terminal_window_ui_length = 2220u; +static const unsigned terminal_window_ui_length = 2496u;