changeset 97903:fa91a1ebb701

(BUILD_CHAR_GLYPH): New macro. (IT_menu_display): Use it instead of SET_CHAR_GLYPH to construct the menu.
author Eli Zaretskii <eliz@gnu.org>
date Sun, 31 Aug 2008 19:36:51 +0000
parents ee22ec4ace1d
children ed2a7d6c4d9c
files src/msdos.c
diffstat 1 files changed, 23 insertions(+), 9 deletions(-) [+]
line wrap: on
line diff
--- a/src/msdos.c	Sun Aug 31 14:07:35 2008 +0000
+++ b/src/msdos.c	Sun Aug 31 19:36:51 2008 +0000
@@ -3542,6 +3542,15 @@
 
 /* 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 @@
   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_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 @@
 	  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 @@
 	  text[max_width - 1].u.ch = '$'; /* indicate it's truncated */
 	}
       for (; j < max_width - 2; j++, p++)
-	SET_CHAR_GLYPH (*p, ' ', face, 0);
-
-      SET_CHAR_GLYPH (*p, menu->submenu[i] ? 16 : ' ', face, 0);
+	BUILD_CHAR_GLYPH (*p, ' ', 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);
     }