aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorEli Zaretskii2013-09-18 11:51:45 +0300
committerEli Zaretskii2013-09-18 11:51:45 +0300
commit06284c32566c059d6360941589c7d59b0368ca7a (patch)
treead5b4f4b318de7dab91d63bcbfe97150ee4aee5a /src
parent28a16449218739dc41387b71233e9f9c0d62ceb9 (diff)
downloademacs-06284c32566c059d6360941589c7d59b0368ca7a.tar.gz
emacs-06284c32566c059d6360941589c7d59b0368ca7a.zip
Fixed the menu item encoding for tty menus.
Diffstat (limited to 'src')
-rw-r--r--src/menu.c131
1 files changed, 76 insertions, 55 deletions
diff --git a/src/menu.c b/src/menu.c
index 6ec2c411e31..cf6ceb58e7f 100644
--- a/src/menu.c
+++ b/src/menu.c
@@ -458,6 +458,16 @@ keymap_panes (Lisp_Object *keymaps, ptrdiff_t nmaps)
458 finish_menu_items (); 458 finish_menu_items ();
459} 459}
460 460
461/* Encode a menu string as appropriate for menu-updating-frame's type. */
462static Lisp_Object
463encode_menu_string (Lisp_Object str)
464{
465 /* TTY menu strings are encoded by write_glyphs, when they are
466 delivered to the glass, so no need to encode them here. */
467 if (FRAME_TERMCAP_P (XFRAME (Vmenu_updating_frame)))
468 return str;
469 return ENCODE_MENU_STRING (str);
470}
461 471
462/* Push the items in a single pane defined by the alist PANE. */ 472/* Push the items in a single pane defined by the alist PANE. */
463static void 473static void
@@ -469,13 +479,13 @@ list_of_items (Lisp_Object pane)
469 { 479 {
470 item = XCAR (tail); 480 item = XCAR (tail);
471 if (STRINGP (item)) 481 if (STRINGP (item))
472 push_menu_item (ENCODE_MENU_STRING (item), Qnil, Qnil, Qt, 482 push_menu_item (encode_menu_string (item), Qnil, Qnil, Qt,
473 Qnil, Qnil, Qnil, Qnil); 483 Qnil, Qnil, Qnil, Qnil);
474 else if (CONSP (item)) 484 else if (CONSP (item))
475 { 485 {
476 item1 = XCAR (item); 486 item1 = XCAR (item);
477 CHECK_STRING (item1); 487 CHECK_STRING (item1);
478 push_menu_item (ENCODE_MENU_STRING (item1), Qt, XCDR (item), 488 push_menu_item (encode_menu_string (item1), Qt, XCDR (item),
479 Qt, Qnil, Qnil, Qnil, Qnil); 489 Qt, Qnil, Qnil, Qnil, Qnil);
480 } 490 }
481 else 491 else
@@ -500,7 +510,7 @@ list_of_panes (Lisp_Object menu)
500 elt = XCAR (tail); 510 elt = XCAR (tail);
501 pane_name = Fcar (elt); 511 pane_name = Fcar (elt);
502 CHECK_STRING (pane_name); 512 CHECK_STRING (pane_name);
503 push_menu_pane (ENCODE_MENU_STRING (pane_name), Qnil); 513 push_menu_pane (encode_menu_string (pane_name), Qnil);
504 pane_data = Fcdr (elt); 514 pane_data = Fcdr (elt);
505 CHECK_CONS (pane_data); 515 CHECK_CONS (pane_data);
506 list_of_items (pane_data); 516 list_of_items (pane_data);
@@ -617,6 +627,7 @@ digest_single_submenu (int start, int end, bool top_level_items)
617 int submenu_depth = 0; 627 int submenu_depth = 0;
618 widget_value **submenu_stack; 628 widget_value **submenu_stack;
619 bool panes_seen = 0; 629 bool panes_seen = 0;
630 struct frame *f = XFRAME (Vmenu_updating_frame);
620 631
621 submenu_stack = alloca (menu_items_used * sizeof *submenu_stack); 632 submenu_stack = alloca (menu_items_used * sizeof *submenu_stack);
622 wv = xmalloc_widget_value (); 633 wv = xmalloc_widget_value ();
@@ -666,30 +677,35 @@ digest_single_submenu (int start, int end, bool top_level_items)
666 677
667 pane_name = AREF (menu_items, i + MENU_ITEMS_PANE_NAME); 678 pane_name = AREF (menu_items, i + MENU_ITEMS_PANE_NAME);
668 679
669#ifdef HAVE_NTGUI 680 /* TTY menus display menu items via tty_write_glyphs, which
670 if (STRINGP (pane_name)) 681 will encode the strings as appropriate. */
682 if (!FRAME_TERMCAP_P (f))
671 { 683 {
672 if (unicode_append_menu) 684#ifdef HAVE_NTGUI
673 /* Encode as UTF-8 for now. */ 685 if (STRINGP (pane_name))
674 pane_name = ENCODE_UTF_8 (pane_name); 686 {
675 else if (STRING_MULTIBYTE (pane_name)) 687 if (unicode_append_menu)
676 pane_name = ENCODE_SYSTEM (pane_name); 688 /* Encode as UTF-8 for now. */
689 pane_name = ENCODE_UTF_8 (pane_name);
690 else if (STRING_MULTIBYTE (pane_name))
691 pane_name = ENCODE_SYSTEM (pane_name);
677 692
678 ASET (menu_items, i + MENU_ITEMS_PANE_NAME, pane_name); 693 ASET (menu_items, i + MENU_ITEMS_PANE_NAME, pane_name);
679 } 694 }
680#elif defined (USE_LUCID) && defined (HAVE_XFT) 695#elif defined (USE_LUCID) && defined (HAVE_XFT)
681 if (STRINGP (pane_name)) 696 if (STRINGP (pane_name))
682 { 697 {
683 pane_name = ENCODE_UTF_8 (pane_name); 698 pane_name = ENCODE_UTF_8 (pane_name);
684 ASET (menu_items, i + MENU_ITEMS_PANE_NAME, pane_name); 699 ASET (menu_items, i + MENU_ITEMS_PANE_NAME, pane_name);
685 } 700 }
686#elif !defined (HAVE_MULTILINGUAL_MENU) 701#elif !defined (HAVE_MULTILINGUAL_MENU)
687 if (STRINGP (pane_name) && STRING_MULTIBYTE (pane_name)) 702 if (STRINGP (pane_name) && STRING_MULTIBYTE (pane_name))
688 { 703 {
689 pane_name = ENCODE_MENU_STRING (pane_name); 704 pane_name = ENCODE_MENU_STRING (pane_name);
690 ASET (menu_items, i + MENU_ITEMS_PANE_NAME, pane_name); 705 ASET (menu_items, i + MENU_ITEMS_PANE_NAME, pane_name);
691 } 706 }
692#endif 707#endif
708 }
693 709
694 pane_string = (NILP (pane_name) 710 pane_string = (NILP (pane_name)
695 ? "" : SSDATA (pane_name)); 711 ? "" : SSDATA (pane_name));
@@ -740,47 +756,52 @@ digest_single_submenu (int start, int end, bool top_level_items)
740 selected = AREF (menu_items, i + MENU_ITEMS_ITEM_SELECTED); 756 selected = AREF (menu_items, i + MENU_ITEMS_ITEM_SELECTED);
741 help = AREF (menu_items, i + MENU_ITEMS_ITEM_HELP); 757 help = AREF (menu_items, i + MENU_ITEMS_ITEM_HELP);
742 758
743#ifdef HAVE_NTGUI 759 /* TTY menu items and their descriptions will be encoded by
744 if (STRINGP (item_name)) 760 tty_write_glyphs. */
761 if (!FRAME_TERMCAP_P (f))
745 { 762 {
746 if (unicode_append_menu) 763#ifdef HAVE_NTGUI
747 item_name = ENCODE_UTF_8 (item_name); 764 if (STRINGP (item_name))
748 else if (STRING_MULTIBYTE (item_name)) 765 {
749 item_name = ENCODE_SYSTEM (item_name); 766 if (unicode_append_menu)
767 item_name = ENCODE_UTF_8 (item_name);
768 else if (STRING_MULTIBYTE (item_name))
769 item_name = ENCODE_SYSTEM (item_name);
750 770
751 ASET (menu_items, i + MENU_ITEMS_ITEM_NAME, item_name); 771 ASET (menu_items, i + MENU_ITEMS_ITEM_NAME, item_name);
752 } 772 }
753 773
754 if (STRINGP (descrip) && STRING_MULTIBYTE (descrip)) 774 if (STRINGP (descrip) && STRING_MULTIBYTE (descrip))
755 { 775 {
756 descrip = ENCODE_SYSTEM (descrip); 776 descrip = ENCODE_SYSTEM (descrip);
757 ASET (menu_items, i + MENU_ITEMS_ITEM_EQUIV_KEY, descrip); 777 ASET (menu_items, i + MENU_ITEMS_ITEM_EQUIV_KEY, descrip);
758 } 778 }
759#elif USE_LUCID 779#elif USE_LUCID
760 if (STRINGP (item_name)) 780 if (STRINGP (item_name))
761 { 781 {
762 item_name = ENCODE_UTF_8 (item_name); 782 item_name = ENCODE_UTF_8 (item_name);
763 ASET (menu_items, i + MENU_ITEMS_ITEM_NAME, item_name); 783 ASET (menu_items, i + MENU_ITEMS_ITEM_NAME, item_name);
764 } 784 }
765 785
766 if (STRINGP (descrip)) 786 if (STRINGP (descrip))
767 { 787 {
768 descrip = ENCODE_UTF_8 (descrip); 788 descrip = ENCODE_UTF_8 (descrip);
769 ASET (menu_items, i + MENU_ITEMS_ITEM_EQUIV_KEY, descrip); 789 ASET (menu_items, i + MENU_ITEMS_ITEM_EQUIV_KEY, descrip);
770 } 790 }
771#elif !defined (HAVE_MULTILINGUAL_MENU) 791#elif !defined (HAVE_MULTILINGUAL_MENU)
772 if (STRING_MULTIBYTE (item_name)) 792 if (STRING_MULTIBYTE (item_name))
773 { 793 {
774 item_name = ENCODE_MENU_STRING (item_name); 794 item_name = ENCODE_MENU_STRING (item_name);
775 ASET (menu_items, i + MENU_ITEMS_ITEM_NAME, item_name); 795 ASET (menu_items, i + MENU_ITEMS_ITEM_NAME, item_name);
776 } 796 }
777 797
778 if (STRINGP (descrip) && STRING_MULTIBYTE (descrip)) 798 if (STRINGP (descrip) && STRING_MULTIBYTE (descrip))
779 { 799 {
780 descrip = ENCODE_MENU_STRING (descrip); 800 descrip = ENCODE_MENU_STRING (descrip);
781 ASET (menu_items, i + MENU_ITEMS_ITEM_EQUIV_KEY, descrip); 801 ASET (menu_items, i + MENU_ITEMS_ITEM_EQUIV_KEY, descrip);
782 } 802 }
783#endif 803#endif
804 }
784 805
785 wv = xmalloc_widget_value (); 806 wv = xmalloc_widget_value ();
786 if (prev_wv) 807 if (prev_wv)