| To: vim_dev@googlegroups.com |
| Subject: Patch 7.3.697 |
| Fcc: outbox |
| From: Bram Moolenaar <Bram@moolenaar.net> |
| Mime-Version: 1.0 |
| Content-Type: text/plain; charset=UTF-8 |
| Content-Transfer-Encoding: 8bit |
| |
| |
| Patch 7.3.697 |
| Problem: Leaking resources when setting GUI font. |
| Solution: Free the font. (Ken Takata) |
| Files: src/syntax.c |
| |
| |
| |
| |
| |
| *** 105,111 **** |
| # ifdef FEAT_XFONTSET |
| static GuiFontset fontset_name2handle __ARGS((char_u *name, int fixed_width)); |
| # endif |
| ! static void hl_do_font __ARGS((int idx, char_u *arg, int do_normal, int do_menu, int do_tooltip)); |
| #endif |
| |
| /* |
| --- 105,111 ---- |
| # ifdef FEAT_XFONTSET |
| static GuiFontset fontset_name2handle __ARGS((char_u *name, int fixed_width)); |
| # endif |
| ! static void hl_do_font __ARGS((int idx, char_u *arg, int do_normal, int do_menu, int do_tooltip, int free_font)); |
| #endif |
| |
| /* |
| |
| *** 7259,7272 **** |
| HL_TABLE()[idx].sg_fontset = NOFONTSET; |
| # endif |
| hl_do_font(idx, arg, is_normal_group, is_menu_group, |
| ! is_tooltip_group); |
| |
| # ifdef FEAT_XFONTSET |
| if (HL_TABLE()[idx].sg_fontset != NOFONTSET) |
| { |
| ! /* New fontset was accepted. Free the old one, if there was |
| ! * one. |
| ! */ |
| gui_mch_free_fontset(temp_sg_fontset); |
| vim_free(HL_TABLE()[idx].sg_font_name); |
| HL_TABLE()[idx].sg_font_name = vim_strsave(arg); |
| --- 7259,7271 ---- |
| HL_TABLE()[idx].sg_fontset = NOFONTSET; |
| # endif |
| hl_do_font(idx, arg, is_normal_group, is_menu_group, |
| ! is_tooltip_group, FALSE); |
| |
| # ifdef FEAT_XFONTSET |
| if (HL_TABLE()[idx].sg_fontset != NOFONTSET) |
| { |
| ! /* New fontset was accepted. Free the old one, if there |
| ! * was one. */ |
| gui_mch_free_fontset(temp_sg_fontset); |
| vim_free(HL_TABLE()[idx].sg_font_name); |
| HL_TABLE()[idx].sg_font_name = vim_strsave(arg); |
| |
| *** 7277,7284 **** |
| if (HL_TABLE()[idx].sg_font != NOFONT) |
| { |
| /* New font was accepted. Free the old one, if there was |
| ! * one. |
| ! */ |
| gui_mch_free_font(temp_sg_font); |
| vim_free(HL_TABLE()[idx].sg_font_name); |
| HL_TABLE()[idx].sg_font_name = vim_strsave(arg); |
| --- 7276,7282 ---- |
| if (HL_TABLE()[idx].sg_font != NOFONT) |
| { |
| /* New font was accepted. Free the old one, if there was |
| ! * one. */ |
| gui_mch_free_font(temp_sg_font); |
| vim_free(HL_TABLE()[idx].sg_font_name); |
| HL_TABLE()[idx].sg_font_name = vim_strsave(arg); |
| |
| *** 8064,8075 **** |
| * Get the font or fontset for one highlight group. |
| */ |
| static void |
| ! hl_do_font(idx, arg, do_normal, do_menu, do_tooltip) |
| int idx; |
| char_u *arg; |
| int do_normal; /* set normal font */ |
| int do_menu UNUSED; /* set menu font */ |
| int do_tooltip UNUSED; /* set tooltip font */ |
| { |
| # ifdef FEAT_XFONTSET |
| /* If 'guifontset' is not empty, first try using the name as a |
| --- 8062,8074 ---- |
| * Get the font or fontset for one highlight group. |
| */ |
| static void |
| ! hl_do_font(idx, arg, do_normal, do_menu, do_tooltip, free_font) |
| int idx; |
| char_u *arg; |
| int do_normal; /* set normal font */ |
| int do_menu UNUSED; /* set menu font */ |
| int do_tooltip UNUSED; /* set tooltip font */ |
| + int free_font; /* free current font/fontset */ |
| { |
| # ifdef FEAT_XFONTSET |
| /* If 'guifontset' is not empty, first try using the name as a |
| |
| *** 8083,8088 **** |
| --- 8082,8089 ---- |
| || do_tooltip |
| # endif |
| ) |
| + if (free_fontset) |
| + gui_mch_free_fontset(HL_TABLE()[idx].sg_fontset); |
| HL_TABLE()[idx].sg_fontset = fontset_name2handle(arg, 0 |
| # ifdef FONTSET_ALWAYS |
| || do_menu |
| |
| *** 8093,8100 **** |
| ); |
| if (HL_TABLE()[idx].sg_fontset != NOFONTSET) |
| { |
| ! /* If it worked and it's the Normal group, use it as the |
| ! * normal fontset. Same for the Menu group. */ |
| if (do_normal) |
| gui_init_font(arg, TRUE); |
| # if (defined(FEAT_GUI_MOTIF) || defined(FEAT_GUI_ATHENA)) && defined(FEAT_MENU) |
| --- 8094,8101 ---- |
| ); |
| if (HL_TABLE()[idx].sg_fontset != NOFONTSET) |
| { |
| ! /* If it worked and it's the Normal group, use it as the normal |
| ! * fontset. Same for the Menu group. */ |
| if (do_normal) |
| gui_init_font(arg, TRUE); |
| # if (defined(FEAT_GUI_MOTIF) || defined(FEAT_GUI_ATHENA)) && defined(FEAT_MENU) |
| |
| *** 8126,8131 **** |
| --- 8127,8134 ---- |
| else |
| # endif |
| { |
| + if (free_font) |
| + gui_mch_free_font(HL_TABLE()[idx].sg_font); |
| HL_TABLE()[idx].sg_font = font_name2handle(arg); |
| /* If it worked and it's the Normal group, use it as the |
| * normal font. Same for the Menu group. */ |
| |
| *** 9162,9168 **** |
| if (HL_TABLE()[idx].sg_font_name != NULL) |
| { |
| hl_do_font(idx, HL_TABLE()[idx].sg_font_name, FALSE, do_menu, |
| ! do_tooltip); |
| didit = TRUE; |
| } |
| if (HL_TABLE()[idx].sg_gui_fg_name != NULL) |
| --- 9165,9171 ---- |
| if (HL_TABLE()[idx].sg_font_name != NULL) |
| { |
| hl_do_font(idx, HL_TABLE()[idx].sg_font_name, FALSE, do_menu, |
| ! do_tooltip, TRUE); |
| didit = TRUE; |
| } |
| if (HL_TABLE()[idx].sg_gui_fg_name != NULL) |
| |
| |
| |
| *** 721,722 **** |
| --- 721,724 ---- |
| { /* Add new patch number below this line */ |
| + /**/ |
| + 697, |
| /**/ |
| |
| -- |
| BEDEVERE: Wait. Wait ... tell me, what also floats on water? |
| ALL: Bread? No, no, no. Apples .... gravy ... very small rocks ... |
| ARTHUR: A duck. |
| "Monty Python and the Holy Grail" PYTHON (MONTY) PICTURES LTD |
| |
| /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ |
| /// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ |
| \\\ an exciting new programming language -- http://www.Zimbu.org /// |
| \\\ help me help AIDS victims -- http://ICCF-Holland.org /// |