From e52ab6c932fb28aa66ae666bfdcba19f7fbe09cd Mon Sep 17 00:00:00 2001 From: Eli Zaretskii Date: Sun, 31 Aug 2008 19:41:40 +0000 Subject: [PATCH] (BUILD_CHAR_GLYPH): New macro. (IT_menu_display): Use it instead of SET_CHAR_GLYPH to construct the menu. --- src/ChangeLog | 7 +++++++ src/msdos.c | 30 ++++++++++++++++++++++-------- 2 files changed, 29 insertions(+), 8 deletions(-) diff --git a/src/ChangeLog b/src/ChangeLog index fffb4205ff8..8505961647d 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,10 @@ +2008-08-31 Eli Zaretskii + + * msdos.c (BUILD_CHAR_GLYPH): New macro. + (IT_menu_display): Use it instead of SET_CHAR_GLYPH to construct + the menu. Allocate larger buffer for `text', to account for + possible ^C characters. + 2008-08-31 Martin Rudalics * xdisp.c (prepare_menu_bars): Don't call diff --git a/src/msdos.c b/src/msdos.c index 6b20d317df1..4063753c70a 100644 --- a/src/msdos.c +++ b/src/msdos.c @@ -3542,6 +3542,15 @@ IT_menu_calc_size (XMenu *menu, int *width, int *height) /* Display MENU at (X,Y) using FACES. */ +#define BUILD_CHAR_GLYPH(GLYPH, CODE, FACE_ID, PADDING_P) \ + do \ + { \ + (GLYPH).type = CHAR_GLYPH; \ + SET_CHAR_GLYPH ((GLYPH), CODE, FACE_ID, PADDING_P); \ + (GLYPH).charpos = -1; \ + } \ + while (0) + static void IT_menu_display (XMenu *menu, int y, int x, int pn, int *faces, int disp_help) { @@ -3553,7 +3562,9 @@ IT_menu_display (XMenu *menu, int y, int x, int pn, int *faces, int disp_help) menu_help_message = NULL; width = menu->width; - text = (struct glyph *) xmalloc ((width + 2) * sizeof (struct glyph)); + /* We multiply width by 2 to account for possible control characters. + FIXME: cater to non-ASCII characters in menus. */ + text = (struct glyph *) xmalloc ((width * 2 + 2) * sizeof (struct glyph)); ScreenGetCursor (&row, &col); mouse_get_xy (&mx, &my); IT_update_begin (sf); @@ -3564,7 +3575,7 @@ IT_menu_display (XMenu *menu, int y, int x, int pn, int *faces, int disp_help) IT_cursor_to (sf, y + i, x); enabled = (!menu->submenu[i] && menu->panenumber[i]) || (menu->submenu[i]); - mousehere = (y + i == my && x <= mx && mx < x + width + 2); + mousehere = (y + i == my && x <= mx && mx < x + max_width); face = faces[enabled + mousehere * 2]; /* The following if clause means that we display the menu help strings even if the menu item is currently disabled. */ @@ -3575,21 +3586,22 @@ IT_menu_display (XMenu *menu, int y, int x, int pn, int *faces, int disp_help) menu_help_itemno = i; } p = text; - SET_CHAR_GLYPH (*p, ' ', face, 0); + BUILD_CHAR_GLYPH (*p, ' ', face, 0); p++; for (j = 0, q = menu->text[i]; *q; j++) { if (*q > 26) { - SET_CHAR_GLYPH (*p, *q++, face, 0); + BUILD_CHAR_GLYPH (*p, *q++, face, 0); p++; } else /* make '^x' */ { - SET_CHAR_GLYPH (*p, '^', face, 0); + /* FIXME: need to handle non-ASCII characters! */ + BUILD_CHAR_GLYPH (*p, '^', face, 0); p++; j++; - SET_CHAR_GLYPH (*p, *q++ + 64, face, 0); + BUILD_CHAR_GLYPH (*p, *q++ + 64, face, 0); p++; } } @@ -3600,9 +3612,11 @@ IT_menu_display (XMenu *menu, int y, int x, int pn, int *faces, int disp_help) text[max_width - 1].u.ch = '$'; /* indicate it's truncated */ } for (; j < max_width - 2; j++, p++) - SET_CHAR_GLYPH (*p, ' ', face, 0); + BUILD_CHAR_GLYPH (*p, ' ', face, 0); - SET_CHAR_GLYPH (*p, menu->submenu[i] ? 16 : ' ', face, 0); + /* FIXME: should use Unicode codepoint for what Emacs 22.x + displayed here. */ + BUILD_CHAR_GLYPH (*p, menu->submenu[i] ? '>' : ' ', face, 0); p++; IT_write_glyphs (sf, text, max_width); } -- 2.39.5