]> git.eshelyaron.com Git - emacs.git/commitdiff
(BUILD_CHAR_GLYPH): New macro.
authorEli Zaretskii <eliz@gnu.org>
Sun, 31 Aug 2008 19:41:40 +0000 (19:41 +0000)
committerEli Zaretskii <eliz@gnu.org>
Sun, 31 Aug 2008 19:41:40 +0000 (19:41 +0000)
(IT_menu_display): Use it instead of SET_CHAR_GLYPH to construct the menu.

src/ChangeLog
src/msdos.c

index fffb4205ff85a9f3fdf7638371d57b7971b8f18f..8505961647d12bbdf7c19ed467653bd5963fdebb 100644 (file)
@@ -1,3 +1,10 @@
+2008-08-31  Eli Zaretskii  <eliz@gnu.org>
+
+       * 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  <rudalics@gmx.at>
 
        * xdisp.c (prepare_menu_bars): Don't call
index 6b20d317df1419bc8e615e333b631b56f501c18b..4063753c70a9aa306f371e88235a182f6c93cdaf 100644 (file)
@@ -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);
     }