leres@ucbarpa.Berkeley.EDU (Craig Leres) (05/16/87)
I've always wanted to dynamically change the font in xterm windows. The code I hacked out today is appended. After installing the new code, an escape sequence similar to "\033]47;fontname\033" will cause a new font to be loaded. The window is then resized to handle the new physical size. Craig ------ /* Put this new routine right after VTInit() in charproc.c */ VTChangeFont(screen, newfname) register Screen *screen; char *newfname; { register Vertex *vp; FontInfo *fInfo; register width, height, border, extra; /* Make sure we can get the new font */ if ((fInfo = XOpenFont(newfname)) == NULL) return(FALSE); /* Disallow variable fonts with no average sizes for now */ if (fInfo->width == 0 || fInfo->height == 0) { XCloseFont(fInfo); return(FALSE); } /* Destroy old font */ XFreeFont(screen->fnt_norm); screen->fnt_norm = fInfo->id; if (screen->enbolden) screen->fnt_bold = screen->fnt_norm; XSetResizeHint (VWindow(screen), 2 * screen->border + screen->scrollbar, 2 * screen->border + Titlebar(screen) + screen->statusheight, fInfo->width, fInfo->height); screen->fullVwin.f_width = fInfo->width; screen->fullVwin.f_height = fInfo->height; free((char *)fInfo); width = FontWidth(screen) * (screen->max_col + 1); height = FontHeight(screen) * (screen->max_row + 1); border = 2 * screen->border; extra = Titlebar(screen) + screen->statusheight; screen->fullVwin.fullwidth = width; screen->fullVwin.fullheight = height; screen->fullVwin.height = height - border - extra; screen->fullVwin.width = width - border - screen->scrollbar; vp = &VTbox[1]; (vp++)->x = FontWidth(screen) - 1; (vp++)->y = FontHeight(screen) - 1; (vp++)->x = -(FontWidth(screen) - 1); vp->y = -(FontHeight(screen) - 1); if(screen->sb) ResizeScrollBar(screen->sb, width - SCROLLBARWIDTH, Titlebar(screen) - 1, height - Titlebar(screen), screen->max_row + 1); if(screen->title.tbar) } VTTitleResize(width); /* Insert this new code in the switch in do_osc() in misc.c */ case 47: /* new screen font */ if (VTChangeFont(screen, buf)) { XChangeWindow (VWindow(screen), FontWidth(screen) * (screen->max_col + 1) + 2 * screen->border + screen->scrollbar, FontHeight(screen) * (screen->max_row + 1) + screen->statusheight + Titlebar(screen) + 2 * screen->border); XSync(FALSE); /* synchronize */ if(QLength() > 0) xevents(); } break; /* end */