mirror of
https://git.tartarus.org/simon/putty.git
synced 2025-07-03 04:22:47 -05:00
Unix PuTTY/pterm: Ctrl-< / Ctrl-> to change font size.
Each gtkfont back end now provides a routine that will return the name of a similar font to the current one but one notch larger or smaller. For Pango, this is just a matter of incrementing the font size field in a standard way; for X11 server-side fonts, we have to go and do an XListFonts query with a wildcard that requests fonts that vary only in the size fields from the current one, and then iterate over the result looking for the best one. (I expect this will be more useful to Pango scalable-font users than to X11 fonts, but it seemed a shame not to give the X11 side my best shot while I was at it.) Choice of hotkey: I know I'm being inconsistent with gnome-terminal's use of Ctrl-plus and Ctrl-minus. I thought that was because I was already using Ctrl-minus as a more convenient synonym for Ctrl-underscore (which sends the actual control code 0x1F), but now I actually try it, apparently I'm not. However, Ctrl-plus and Ctrl-minus are quite horrible as a keystroke pair anyway (one has to be typed with shift and one without!), and I feel as if the 'less' and 'greater' signs are more specific anyway, in that they specifically indicate _size_ rather than just 'unspecified numerical value'.
This commit is contained in:
@ -638,6 +638,8 @@ char *dup_keyval_name(guint keyval)
|
||||
}
|
||||
#endif
|
||||
|
||||
static void change_font_size(struct gui_data *inst, int increment);
|
||||
|
||||
gint key_event(GtkWidget *widget, GdkEventKey *event, gpointer data)
|
||||
{
|
||||
struct gui_data *inst = (struct gui_data *)data;
|
||||
@ -838,6 +840,23 @@ gint key_event(GtkWidget *widget, GdkEventKey *event, gpointer data)
|
||||
}
|
||||
}
|
||||
|
||||
if (event->keyval == GDK_KEY_greater &&
|
||||
(event->state & GDK_CONTROL_MASK)) {
|
||||
#ifdef KEY_EVENT_DIAGNOSTICS
|
||||
debug((" - Ctrl->: increase font size\n"));
|
||||
#endif
|
||||
change_font_size(inst, +1);
|
||||
return TRUE;
|
||||
}
|
||||
if (event->keyval == GDK_KEY_less &&
|
||||
(event->state & GDK_CONTROL_MASK)) {
|
||||
#ifdef KEY_EVENT_DIAGNOSTICS
|
||||
debug((" - Ctrl-<: increase font size\n"));
|
||||
#endif
|
||||
change_font_size(inst, -1);
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/*
|
||||
* Shift-PgUp and Shift-PgDn don't even generate keystrokes
|
||||
* at all.
|
||||
@ -3972,6 +3991,67 @@ void change_settings_menuitem(GtkMenuItem *item, gpointer data)
|
||||
inst->reconfiguring = FALSE;
|
||||
}
|
||||
|
||||
static void change_font_size(struct gui_data *inst, int increment)
|
||||
{
|
||||
static const int conf_keys[lenof(inst->fonts)] = {
|
||||
CONF_font, CONF_boldfont, CONF_widefont, CONF_wideboldfont,
|
||||
};
|
||||
FontSpec *oldfonts[lenof(inst->fonts)];
|
||||
FontSpec *newfonts[lenof(inst->fonts)];
|
||||
char *errmsg = NULL;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < lenof(newfonts); i++)
|
||||
oldfonts[i] = newfonts[i] = NULL;
|
||||
|
||||
for (i = 0; i < lenof(inst->fonts); i++) {
|
||||
if (inst->fonts[i]) {
|
||||
char *newname = unifont_size_increment(inst->fonts[i], increment);
|
||||
if (!newname)
|
||||
goto cleanup;
|
||||
newfonts[i] = fontspec_new(newname);
|
||||
sfree(newname);
|
||||
}
|
||||
}
|
||||
|
||||
for (i = 0; i < lenof(newfonts); i++) {
|
||||
if (newfonts[i]) {
|
||||
oldfonts[i] = fontspec_copy(
|
||||
conf_get_fontspec(inst->conf, conf_keys[i]));
|
||||
conf_set_fontspec(inst->conf, conf_keys[i], newfonts[i]);
|
||||
}
|
||||
}
|
||||
|
||||
errmsg = setup_fonts_ucs(inst);
|
||||
if (errmsg)
|
||||
goto cleanup;
|
||||
|
||||
/* Success, so suppress putting everything back */
|
||||
for (i = 0; i < lenof(newfonts); i++) {
|
||||
if (oldfonts[i]) {
|
||||
fontspec_free(oldfonts[i]);
|
||||
oldfonts[i] = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
set_geom_hints(inst);
|
||||
request_resize(inst, conf_get_int(inst->conf, CONF_width),
|
||||
conf_get_int(inst->conf, CONF_height));
|
||||
term_invalidate(inst->term);
|
||||
gtk_widget_queue_draw(inst->area);
|
||||
|
||||
cleanup:
|
||||
for (i = 0; i < lenof(oldfonts); i++) {
|
||||
if (oldfonts[i]) {
|
||||
conf_set_fontspec(inst->conf, conf_keys[i], oldfonts[i]);
|
||||
fontspec_free(oldfonts[i]);
|
||||
}
|
||||
if (newfonts[i])
|
||||
fontspec_free(newfonts[i]);
|
||||
}
|
||||
sfree(errmsg);
|
||||
}
|
||||
|
||||
void dup_session_menuitem(GtkMenuItem *item, gpointer gdata)
|
||||
{
|
||||
struct gui_data *inst = (struct gui_data *)gdata;
|
||||
|
Reference in New Issue
Block a user