diff options
| author | Eli Zaretskii | 2013-09-18 11:51:45 +0300 |
|---|---|---|
| committer | Eli Zaretskii | 2013-09-18 11:51:45 +0300 |
| commit | 06284c32566c059d6360941589c7d59b0368ca7a (patch) | |
| tree | ad5b4f4b318de7dab91d63bcbfe97150ee4aee5a /src | |
| parent | 28a16449218739dc41387b71233e9f9c0d62ceb9 (diff) | |
| download | emacs-06284c32566c059d6360941589c7d59b0368ca7a.tar.gz emacs-06284c32566c059d6360941589c7d59b0368ca7a.zip | |
Fixed the menu item encoding for tty menus.
Diffstat (limited to 'src')
| -rw-r--r-- | src/menu.c | 131 |
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. */ | ||
| 462 | static Lisp_Object | ||
| 463 | encode_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. */ |
| 463 | static void | 473 | static 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) |