I've rewritten the output routines so they catch the width changes but didn't change anything else. The output in *foo* should be almost self-explanatory now but see first one I ran with emacs -Q and the following four evaluations (set-face-attribute 'default nil :height 120 :family "DejaVu Sans Mono") (set-face-attribute 'default nil :height 140 :family "DejaVu Sans Mono") (set-face-attribute 'default nil :height 130 :family "DejaVu Sans Mono") (set-face-attribute 'default nil :height 120 :family "DejaVu Sans Mono") here. This got me adjust_frame_size old native pixels 80x25 new native pixels 80x25 old text pixels 80x25 new text pixels 80x24 old text chars 80x25 new text chars 80x24 adjust_frame_size old native pixels 80x25 new native pixels 736x450 old text pixels 80x25 new text pixels 720x450 old text chars 80x25 new text chars 80x25 adjust_frame_size old native pixels 736x450 new native pixels 736x648 old text pixels 720x450 new text pixels 720x648 old text chars 80x25 new text chars 80x36 adjust_frame_size old native pixels 736x648 new native pixels 752x648 old text pixels 720x648 new text pixels 720x648 old text chars 80x36 new text chars 80x36 xg_frame_set_char_size old native pixels 752x648 new native pixels 752x648 outer pixels 752x673 xg_wm_set_size_hint scale 1 char width 9 vscroll 16 fringes 16 borders 0 base width 41 width inc 9 char height 18 menubar 25 toolbar 0 hscroll 0 borders 0 base height 43 height inc 18 xg_wm_set_size_hint scale 1 char width 9 vscroll 16 fringes 16 borders 0 base width 41 width inc 9 char height 18 menubar 25 toolbar 41 hscroll 0 borders 0 base height 84 height inc 18 xg_frame_set_char_size old native pixels 752x648 new native pixels 752x648 outer pixels 752x714 outer rest 0x0 x_new_font old char size 9x18 new char size 10x19 text chars 80x36 old text pixels 720x648 new text pixels 800x684 xg_wm_set_size_hint scale 1 char width 10 vscroll 16 fringes 16 borders 0 base width 42 width inc 10 char height 19 menubar 25 toolbar 41 hscroll 0 borders 0 base height 85 height inc 19 xg_frame_set_char_size old native pixels 752x648 new native pixels 832x684 outer pixels 832x750 outer rest 0x0 xg_frame_resized old native pixels 752x648 new native pixels 832x684 adjust_frame_size old native pixels 752x648 new native pixels 832x684 old text pixels 720x648 new text pixels 800x684 old text chars 80x36 new text chars 80x36 x_new_font old char size 10x19 new char size 11x23 text chars 80x36 old text pixels 800x684 new text pixels 880x828 xg_wm_set_size_hint scale 1 char width 11 vscroll 16 fringes 16 borders 0 base width 43 width inc 11 char height 23 menubar 25 toolbar 41 hscroll 0 borders 0 base height 89 height inc 23 xg_frame_set_char_size old native pixels 832x684 new native pixels 912x828 outer pixels 912x894 outer rest 0x0 xg_frame_resized old native pixels 832x684 new native pixels 912x828 adjust_frame_size old native pixels 832x684 new native pixels 912x828 old text pixels 800x684 new text pixels 880x828 old text chars 80x36 new text chars 80x36 x_new_font old char size 11x23 new char size 10x21 text chars 80x36 old text pixels 880x828 new text pixels 800x756 xg_wm_set_size_hint scale 1 char width 10 vscroll 16 fringes 16 borders 0 base width 42 width inc 10 char height 21 menubar 25 toolbar 41 hscroll 0 borders 0 base height 87 height inc 21 xg_frame_set_char_size old native pixels 912x828 new native pixels 832x756 outer pixels 832x822 outer rest 0x0 xg_frame_resized old native pixels 912x828 new native pixels 832x756 adjust_frame_size old native pixels 912x828 new native pixels 832x756 old text pixels 880x828 new text pixels 800x756 old text chars 80x36 new text chars 80x36 x_new_font old char size 10x21 new char size 10x19 text chars 80x36 old text pixels 800x756 new text pixels 800x684 xg_wm_set_size_hint scale 1 char width 10 vscroll 16 fringes 16 borders 0 base width 42 width inc 10 char height 19 menubar 25 toolbar 41 hscroll 0 borders 0 base height 85 height inc 19 xg_frame_set_char_size old native pixels 832x756 new native pixels 832x684 outer pixels 832x750 outer rest 0x0 xg_frame_resized old native pixels 832x756 new native pixels 832x684 adjust_frame_size old native pixels 832x756 new native pixels 832x684 old text pixels 800x756 new text pixels 800x684 old text chars 80x36 new text chars 80x36 where each x_new_font paragraph corresponds to one evaluation above. Note the following two properties: - As soon as things clear up, the size of the frame in text characters is 80x36 and never changes after that. The same will have to hold for your 'set-face-attribute' calls regardless of what the pixel sizes say. - "outer rest 0x0" stands for a zero rest when dividing the requested size minus the base size by the size increments. The same will have to hold for your 'set-face-attribute' calls. Maybe I'm just lucky here or it's because I do not scale. I invite everyone on GTK with some spare time to apply the attached x_scale_font.diff, do some random 'set-face-attribute' calls and consult the contents of the *foo* buffer. If the two properties don't hold, something might be wrong and we should investigate that. martin