and returns its error message as a string, instead of actually
printing it on standard error and exiting. Now we can preserve the
previous error behaviour when we get a nonexistent font name at
startup time, but no longer rudely terminate in mid-session if the
user configures a bogus font name in Change Settings.
git-svn-id: svn://svn.tartarus.org/sgt/putty@9745
cda61777-01e9-0310-a592-
d414129be87e
-static int string_width(char *text)
+int string_width(char *text)
{
GtkWidget *label = gtk_label_new(text);
GtkRequisition req;
{
GtkWidget *label = gtk_label_new(text);
GtkRequisition req;
#define PUTTY_DO_GLOBALS /* actually _define_ globals */
#define PUTTY_DO_GLOBALS /* actually _define_ globals */
+#define MAY_REFER_TO_GTK_IN_HEADERS
+
#include "putty.h"
#include "terminal.h"
#include "gtkfont.h"
#include "putty.h"
#include "terminal.h"
#include "gtkfont.h"
-void setup_fonts_ucs(struct gui_data *inst)
+char *setup_fonts_ucs(struct gui_data *inst)
{
int shadowbold = conf_get_int(inst->conf, CONF_shadowbold);
int shadowboldoffset = conf_get_int(inst->conf, CONF_shadowboldoffset);
FontSpec *fs;
{
int shadowbold = conf_get_int(inst->conf, CONF_shadowbold);
int shadowboldoffset = conf_get_int(inst->conf, CONF_shadowboldoffset);
FontSpec *fs;
-
- if (inst->fonts[0])
- unifont_destroy(inst->fonts[0]);
- if (inst->fonts[1])
- unifont_destroy(inst->fonts[1]);
- if (inst->fonts[2])
- unifont_destroy(inst->fonts[2]);
- if (inst->fonts[3])
- unifont_destroy(inst->fonts[3]);
+ unifont *fonts[4];
+ int i;
fs = conf_get_fontspec(inst->conf, CONF_font);
fs = conf_get_fontspec(inst->conf, CONF_font);
- inst->fonts[0] = multifont_create(inst->area, fs->name, FALSE, FALSE,
- shadowboldoffset, shadowbold);
- if (!inst->fonts[0]) {
- fprintf(stderr, "%s: unable to load font \"%s\"\n", appname,
- fs->name);
- exit(1);
+ fonts[0] = multifont_create(inst->area, fs->name, FALSE, FALSE,
+ shadowboldoffset, shadowbold);
+ if (!fonts[0]) {
+ return dupprintf("unable to load font \"%s\"", fs->name);
}
fs = conf_get_fontspec(inst->conf, CONF_boldfont);
if (shadowbold || !fs->name[0]) {
}
fs = conf_get_fontspec(inst->conf, CONF_boldfont);
if (shadowbold || !fs->name[0]) {
- inst->fonts[1] = multifont_create(inst->area, fs->name, FALSE, TRUE,
- shadowboldoffset, shadowbold);
- if (!inst->fonts[1]) {
- fprintf(stderr, "%s: unable to load bold font \"%s\"\n", appname,
- fs->name);
- exit(1);
+ fonts[1] = multifont_create(inst->area, fs->name, FALSE, TRUE,
+ shadowboldoffset, shadowbold);
+ if (!fonts[1]) {
+ if (fonts[0])
+ unifont_destroy(fonts[0]);
+ return dupprintf("unable to load bold font \"%s\"", fs->name);
}
}
fs = conf_get_fontspec(inst->conf, CONF_widefont);
if (fs->name[0]) {
}
}
fs = conf_get_fontspec(inst->conf, CONF_widefont);
if (fs->name[0]) {
- inst->fonts[2] = multifont_create(inst->area, fs->name, TRUE, FALSE,
- shadowboldoffset, shadowbold);
- if (!inst->fonts[2]) {
- fprintf(stderr, "%s: unable to load wide font \"%s\"\n", appname,
- fs->name);
- exit(1);
+ fonts[2] = multifont_create(inst->area, fs->name, TRUE, FALSE,
+ shadowboldoffset, shadowbold);
+ if (!fonts[2]) {
+ for (i = 0; i < 2; i++)
+ if (fonts[i])
+ unifont_destroy(fonts[i]);
+ return dupprintf("%s: unable to load wide font \"%s\"", fs->name);
}
fs = conf_get_fontspec(inst->conf, CONF_wideboldfont);
if (shadowbold || !fs->name[0]) {
}
fs = conf_get_fontspec(inst->conf, CONF_wideboldfont);
if (shadowbold || !fs->name[0]) {
- inst->fonts[3] = multifont_create(inst->area, fs->name, TRUE, TRUE,
- shadowboldoffset, shadowbold);
- if (!inst->fonts[3]) {
- fprintf(stderr, "%s: unable to load wide bold font \"%s\"\n", appname,
- fs->name);
- exit(1);
+ fonts[3] = multifont_create(inst->area, fs->name, TRUE, TRUE,
+ shadowboldoffset, shadowbold);
+ if (!fonts[3]) {
+ for (i = 0; i < 3; i++)
+ if (fonts[i])
+ unifont_destroy(fonts[i]);
+ return dupprintf("%s: unable to load wide bold font \"%s\"",
+ fs->name);
+ /*
+ * Now we've got past all the possible error conditions, we can
+ * actually update our state.
+ */
+
+ for (i = 0; i < 4; i++) {
+ if (inst->fonts[i])
+ unifont_destroy(inst->fonts[i]);
+ inst->fonts[i] = fonts[i];
+ }
+
inst->font_width = inst->fonts[0]->width;
inst->font_height = inst->fonts[0]->height;
inst->font_width = inst->fonts[0]->width;
inst->font_height = inst->fonts[0]->height;
conf_get_int(inst->conf, CONF_utf8_override),
inst->fonts[0]->public_charset,
conf_get_int(inst->conf, CONF_vtmode));
conf_get_int(inst->conf, CONF_utf8_override),
inst->fonts[0]->public_charset,
conf_get_int(inst->conf, CONF_vtmode));
}
void set_geom_hints(struct gui_data *inst)
}
void set_geom_hints(struct gui_data *inst)
* Redo the whole tangled fonts and Unicode mess if
* necessary.
*/
* Redo the whole tangled fonts and Unicode mess if
* necessary.
*/
if (strcmp(conf_get_fontspec(oldconf, CONF_font)->name,
conf_get_fontspec(newconf, CONF_font)->name) ||
strcmp(conf_get_fontspec(oldconf, CONF_boldfont)->name,
if (strcmp(conf_get_fontspec(oldconf, CONF_font)->name,
conf_get_fontspec(newconf, CONF_font)->name) ||
strcmp(conf_get_fontspec(oldconf, CONF_boldfont)->name,
conf_get_int(newconf, CONF_shadowbold) ||
conf_get_int(oldconf, CONF_shadowboldoffset) !=
conf_get_int(newconf, CONF_shadowboldoffset)) {
conf_get_int(newconf, CONF_shadowbold) ||
conf_get_int(oldconf, CONF_shadowboldoffset) !=
conf_get_int(newconf, CONF_shadowboldoffset)) {
- setup_fonts_ucs(inst);
- need_size = 1;
- } else
- need_size = 0;
+ char *errmsg = setup_fonts_ucs(inst);
+ if (errmsg) {
+ char *msgboxtext =
+ dupprintf("Could not change fonts in terminal window: %s\n",
+ errmsg);
+ messagebox(inst->window, "Font setup error", msgboxtext,
+ string_width("Could not change fonts in terminal window:"),
+ "OK", 'o', +1, 1,
+ NULL);
+ sfree(errmsg);
+ } else {
+ need_size = TRUE;
+ }
+ }
inst->imc = gtk_im_multicontext_new();
#endif
inst->imc = gtk_im_multicontext_new();
#endif
+ {
+ char *errmsg = setup_fonts_ucs(inst);
+ if (errmsg) {
+ fprintf(stderr, "%s: %s\n", appname, errmsg);
+ exit(1);
+ }
+ }
init_cutbuffers();
inst->window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
init_cutbuffers();
inst->window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
void showeventlog(void *estuff, void *parentwin);
void logevent_dlg(void *estuff, const char *string);
int reallyclose(void *frontend);
void showeventlog(void *estuff, void *parentwin);
void logevent_dlg(void *estuff, const char *string);
int reallyclose(void *frontend);
+#ifdef MAY_REFER_TO_GTK_IN_HEADERS
+int messagebox(GtkWidget *parentwin, char *title, char *msg, int minwid, ...);
+int string_width(char *text);
+#endif
/* Things pterm.c needs from {ptermm,uxputty}.c */
char *make_default_wintitle(char *hostname);
/* Things pterm.c needs from {ptermm,uxputty}.c */
char *make_default_wintitle(char *hostname);