unofficial mirror of emacs-devel@gnu.org 
 help / color / mirror / code / Atom feed
* All platforms fail with Unicode in menus.
@ 2004-08-25 21:48 David Kastrup
  2004-08-26  8:13 ` YAMAMOTO Mitsuharu
  2004-08-26 18:30 ` Jan D.
  0 siblings, 2 replies; 12+ messages in thread
From: David Kastrup @ 2004-08-25 21:48 UTC (permalink / raw)
  Cc: reiner.steib

[-- Attachment #1: Type: text/plain, Size: 1169 bytes --]


Hi, considering that most Window systems can deal with iso10646 fonts
more or less properly, one should imagine that this would mean Unicode
to be supported in most environments.

The following package (a standalone excerpt from AUCTeX) can be loaded
with

  emacs -q -no-site-file unicode-menu.el

Pressing <f8> will add a "Math" menu to the menu bar.  This menu
contains TeX control sequences and corresponding Unicode.

Most platforms just produce some garbage that looks like an attempt at
Latin-1.  This includes Carbon, the standard X11 toolkits and Windows.
The best contender right now is GTK which gets it right, except that
it completely garbles the menus when garbage collection occurs during
their creation (the gc-cons-threshold setting at the end of this
example file more or less ensures that stuff gets garbled).

Since those kind of menus make for quite a bit of attraction, I'd
kindly ask the various platform programmer to consider accessing
Unicode support of their operating system/toolkit, and I'd appreciate
it if the GTK support of Unicode was made robust against garbage
collection.

Thanks,

-- 
David Kastrup, Kriemhildstr. 15, 44793 Bochum

[-- Attachment #2: unicode-menu.el --]
[-- Type: application/emacs-lisp, Size: 29747 bytes --]

[-- Attachment #3: Type: text/plain, Size: 142 bytes --]

_______________________________________________
Emacs-devel mailing list
Emacs-devel@gnu.org
http://lists.gnu.org/mailman/listinfo/emacs-devel

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: All platforms fail with Unicode in menus.
  2004-08-25 21:48 All platforms fail with Unicode in menus David Kastrup
@ 2004-08-26  8:13 ` YAMAMOTO Mitsuharu
  2004-08-26 18:30 ` Jan D.
  1 sibling, 0 replies; 12+ messages in thread
From: YAMAMOTO Mitsuharu @ 2004-08-26  8:13 UTC (permalink / raw)
  Cc: reiner.steib, emacs-devel

>>>>> On 25 Aug 2004 23:48:23 +0200, David Kastrup <dak@gnu.org> said:

> Since those kind of menus make for quite a bit of attraction, I'd
> kindly ask the various platform programmer to consider accessing
> Unicode support of their operating system/toolkit, and I'd
> appreciate it if the GTK support of Unicode was made robust against
> garbage collection.

Here's a patch for Mac OS X, Carbon.  It also contains a fix for the
bug that the menu bar cannot be activated just after a pop-up menu is
used.

				     YAMAMOTO Mitsuharu
				mituharu@math.s.chiba-u.ac.jp

Index: src/macmenu.c
===================================================================
RCS file: /cvsroot/emacs/emacs/src/macmenu.c,v
retrieving revision 1.15
diff -c -r1.15 macmenu.c
*** src/macmenu.c	30 May 2004 00:18:41 -0000	1.15
--- src/macmenu.c	26 Aug 2004 05:37:37 -0000
***************
*** 163,168 ****
--- 163,174 ----
  
  extern Lisp_Object Qmenu_bar_update_hook;
  
+ #if TARGET_API_MAC_CARBON
+ #define ENCODE_MENU_STRING(str) ENCODE_UTF_8 (str)
+ #else
+ #define ENCODE_MENU_STRING(str) ENCODE_SYSTEM (str)
+ #endif
+ 
  void set_frame_menubar ();
  
  static void push_menu_item P_ ((Lisp_Object, Lisp_Object, Lisp_Object,
***************
*** 1246,1258 ****
  #ifndef HAVE_MULTILINGUAL_MENU
  	  if (STRING_MULTIBYTE (item_name))
  	    {
! 	      item_name = ENCODE_SYSTEM (item_name);
  	      AREF (menu_items, i + MENU_ITEMS_ITEM_NAME) = item_name;
  	    }
  
  	  if (STRINGP (descrip) && STRING_MULTIBYTE (descrip))
  	    {
! 	      descrip = ENCODE_SYSTEM (descrip);
  	      AREF (menu_items, i + MENU_ITEMS_ITEM_EQUIV_KEY) = descrip;
  	    }
  #endif /* not HAVE_MULTILINGUAL_MENU */
--- 1252,1264 ----
  #ifndef HAVE_MULTILINGUAL_MENU
  	  if (STRING_MULTIBYTE (item_name))
  	    {
! 	      item_name = ENCODE_MENU_STRING (item_name);
  	      AREF (menu_items, i + MENU_ITEMS_ITEM_NAME) = item_name;
  	    }
  
  	  if (STRINGP (descrip) && STRING_MULTIBYTE (descrip))
  	    {
! 	      descrip = ENCODE_MENU_STRING (descrip);
  	      AREF (menu_items, i + MENU_ITEMS_ITEM_EQUIV_KEY) = descrip;
  	    }
  #endif /* not HAVE_MULTILINGUAL_MENU */
***************
*** 1705,1716 ****
  #ifndef HAVE_MULTILINGUAL_MENU
            if (STRINGP (item_name) && STRING_MULTIBYTE (item_name))
  	    {
! 	      item_name = ENCODE_SYSTEM (item_name);
  	      AREF (menu_items, i + MENU_ITEMS_ITEM_NAME) = item_name;
  	    }
            if (STRINGP (descrip) && STRING_MULTIBYTE (descrip))
              {
! 	      descrip = ENCODE_SYSTEM (descrip);
  	      AREF (menu_items, i + MENU_ITEMS_ITEM_EQUIV_KEY) = descrip;
  	    }
  #endif /* not HAVE_MULTILINGUAL_MENU */
--- 1711,1722 ----
  #ifndef HAVE_MULTILINGUAL_MENU
            if (STRINGP (item_name) && STRING_MULTIBYTE (item_name))
  	    {
! 	      item_name = ENCODE_MENU_STRING (item_name);
  	      AREF (menu_items, i + MENU_ITEMS_ITEM_NAME) = item_name;
  	    }
            if (STRINGP (descrip) && STRING_MULTIBYTE (descrip))
              {
! 	      descrip = ENCODE_MENU_STRING (descrip);
  	      AREF (menu_items, i + MENU_ITEMS_ITEM_EQUIV_KEY) = descrip;
  	    }
  #endif /* not HAVE_MULTILINGUAL_MENU */
***************
*** 1764,1770 ****
  
  #ifndef HAVE_MULTILINGUAL_MENU
        if (STRING_MULTIBYTE (title))
! 	title = ENCODE_SYSTEM (title);
  #endif
        wv_title->name = (char *) SDATA (title);
        wv_title->enabled = TRUE;
--- 1770,1776 ----
  
  #ifndef HAVE_MULTILINGUAL_MENU
        if (STRING_MULTIBYTE (title))
! 	title = ENCODE_MENU_STRING (title);
  #endif
        wv_title->name = (char *) SDATA (title);
        wv_title->enabled = TRUE;
***************
*** 1813,1818 ****
--- 1819,1828 ----
    discard_mouse_events ();
  #endif
  
+   /* Must reset this manually because the button release event is not
+      passed to Emacs event loop. */
+   FRAME_MAC_DISPLAY_INFO (f)->grabbed = 0;
+ 
    /* Free the widget_value objects we used to specify the
       contents.  */
    free_menubar_widget_value_tree (first_wv);
***************
*** 2219,2226 ****
--- 2229,2246 ----
  	  strncat (item_name, wv->key, 255);
  	}
        item_name[255] = 0;
+ #if TARGET_API_MAC_CARBON
+       {
+ 	CFStringRef string =
+ 	  CFStringCreateWithCString (NULL, item_name, kCFStringEncodingUTF8);
+ 
+ 	SetMenuItemTextWithCFString (menu, pos, string);
+ 	CFRelease (string);
+       }
+ #else
        c2pstr (item_name);
        SetMenuItemText (menu, pos, item_name);
+ #endif
  
        if (wv->enabled && !force_disable)
  #if TARGET_API_MAC_CARBON

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: All platforms fail with Unicode in menus.
  2004-08-25 21:48 All platforms fail with Unicode in menus David Kastrup
  2004-08-26  8:13 ` YAMAMOTO Mitsuharu
@ 2004-08-26 18:30 ` Jan D.
  2004-08-28  7:11   ` David Kastrup
  2004-08-30  7:52   ` YAMAMOTO Mitsuharu
  1 sibling, 2 replies; 12+ messages in thread
From: Jan D. @ 2004-08-26 18:30 UTC (permalink / raw)
  Cc: reiner.steib, emacs-devel

David Kastrup wrote:

> The best contender right now is GTK which gets it right, except that
> it completely garbles the menus when garbage collection occurs during
> their creation (the gc-cons-threshold setting at the end of this
> example file more or less ensures that stuff gets garbled).

It seems that the string returned by ENCODE_UTF_8 gets collected during GC,
resulting in passing garbage to the GTK menu code.

I can work around the bug by this patch (the call to inhibit_garbage_collection 
is present in macmenu.c), but I am not sure it is the correct way to fix this:

*** xmenu.c.~1.255.~    2004-01-12 00:15:16.000000000 +0100
--- xmenu.c     2004-08-26 20:18:28.000000000 +0200
***************
*** 1930,1935 ****
--- 1930,1936 ----
         FRAME_MENU_BAR_ITEMS (f) = menu_bar_items (FRAME_MENU_BAR_ITEMS (f));

         items = FRAME_MENU_BAR_ITEMS (f);
+       inhibit_garbage_collection ();

         /* Save the frame's previous menu bar contents data.  */
         if (previous_menu_items_used)

Can someone that knows ENCODE_UTF_8 and garbage collection well comment on this 
patch?

Thanks,

	Jan D.

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: All platforms fail with Unicode in menus.
  2004-08-26 18:30 ` Jan D.
@ 2004-08-28  7:11   ` David Kastrup
  2004-08-28  7:42     ` Jan D.
  2004-08-28 21:38     ` Stefan
  2004-08-30  7:52   ` YAMAMOTO Mitsuharu
  1 sibling, 2 replies; 12+ messages in thread
From: David Kastrup @ 2004-08-28  7:11 UTC (permalink / raw)
  Cc: reiner.steib, emacs-devel

"Jan D." <jan.h.d@swipnet.se> writes:

> David Kastrup wrote:
> 
> > The best contender right now is GTK which gets it right, except that
> > it completely garbles the menus when garbage collection occurs during
> > their creation (the gc-cons-threshold setting at the end of this
> > example file more or less ensures that stuff gets garbled).
> 
> It seems that the string returned by ENCODE_UTF_8 gets collected during GC,
> resulting in passing garbage to the GTK menu code.
> 
> I can work around the bug by this patch (the call to
> inhibit_garbage_collection is present in macmenu.c), but I am not sure
> it is the correct way to fix this:

> +       inhibit_garbage_collection ();

> Can someone that knows ENCODE_UTF_8 and garbage collection well
> comment on this patch?

I don't know either well, but of course that is not the correct way to
fix it.  The correct way would be to add appropriate GCPRO and UNGCPRO
calls for temporary data structures that should not yet be collected.

-- 
David Kastrup, Kriemhildstr. 15, 44793 Bochum

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: All platforms fail with Unicode in menus.
  2004-08-28  7:11   ` David Kastrup
@ 2004-08-28  7:42     ` Jan D.
  2004-08-28  8:08       ` David Kastrup
  2004-08-28 21:38     ` Stefan
  1 sibling, 1 reply; 12+ messages in thread
From: Jan D. @ 2004-08-28  7:42 UTC (permalink / raw)
  Cc: reiner.steib, emacs-devel


>
>> +       inhibit_garbage_collection ();
>
>> Can someone that knows ENCODE_UTF_8 and garbage collection well
>> comment on this patch?
>
> I don't know either well, but of course that is not the correct way to
> fix it.  The correct way would be to add appropriate GCPRO and UNGCPRO
> calls for temporary data structures that should not yet be collected.

I suspect this must be done in the coding functions.  This call to 
inhibit_garbage_collection was there about two years ago (1.234 removed 
it),
and it is still present in macmenu.c, which is the only reason the mac 
port
works better.  I suspect the w32 port also has this problem, but I can't
test that port.  I'll work a bit more on this, as a temporary solution I
checked in this patch.

	Jan D.

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: All platforms fail with Unicode in menus.
  2004-08-28  7:42     ` Jan D.
@ 2004-08-28  8:08       ` David Kastrup
  2004-08-28  8:24         ` Andreas Schwab
  0 siblings, 1 reply; 12+ messages in thread
From: David Kastrup @ 2004-08-28  8:08 UTC (permalink / raw)
  Cc: reiner.steib, emacs-devel

"Jan D." <jan.h.d@swipnet.se> writes:

> >
> >> +       inhibit_garbage_collection ();
> >
> >> Can someone that knows ENCODE_UTF_8 and garbage collection well
> >> comment on this patch?
> >
> > I don't know either well, but of course that is not the correct way to
> > fix it.  The correct way would be to add appropriate GCPRO and UNGCPRO
> > calls for temporary data structures that should not yet be collected.
> 
> I suspect this must be done in the coding functions.

Well, I glimpsed through the code, and it looked like there was quite
a bit of work involved.  Basically, whenever you have an automatic
Lisp_Object come into being and its life time reaches across some code
that might CONS memory (almost any Lisp code), and it may be the only
pointer to the respective Lisp Object, then you need to GCPRO it.

Glancing through the code looked like there was quite a bit of that.

The results of things like ENCODE_STRING or what it was need to get
into something GCPRO before garbage collection can strike.

> This call to inhibit_garbage_collection was there about two years
> ago (1.234 removed it), and it is still present in macmenu.c, which
> is the only reason the mac port works better.  I suspect the w32
> port also has this problem, but I can't test that port.  I'll work a
> bit more on this, as a temporary solution I checked in this patch.

Yes, as a temporary solution it will work, but it has the disadvantage
that during menu buildup, no old memory will be reclaimed for the
construction of the menus.  And I don't even know how long the effects
of inhibit_garbage_collection will last.

-- 
David Kastrup, Kriemhildstr. 15, 44793 Bochum

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: All platforms fail with Unicode in menus.
  2004-08-28  8:08       ` David Kastrup
@ 2004-08-28  8:24         ` Andreas Schwab
  0 siblings, 0 replies; 12+ messages in thread
From: Andreas Schwab @ 2004-08-28  8:24 UTC (permalink / raw)
  Cc: Jan D., reiner.steib, emacs-devel

David Kastrup <dak@gnu.org> writes:

> Well, I glimpsed through the code, and it looked like there was quite
> a bit of work involved.  Basically, whenever you have an automatic
> Lisp_Object come into being and its life time reaches across some code
> that might CONS memory (almost any Lisp code), and it may be the only
> pointer to the respective Lisp Object, then you need to GCPRO it.

Fcons does not GC.  Only Feval, Ffuncall, Fbytecode and read_char can GC.

Andreas.

-- 
Andreas Schwab, SuSE Labs, schwab@suse.de
SuSE Linux AG, Maxfeldstraße 5, 90409 Nürnberg, Germany
Key fingerprint = 58CA 54C7 6D53 942B 1756  01D3 44D5 214B 8276 4ED5
"And now for something completely different."

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: All platforms fail with Unicode in menus.
  2004-08-28  7:11   ` David Kastrup
  2004-08-28  7:42     ` Jan D.
@ 2004-08-28 21:38     ` Stefan
  2004-08-28 22:18       ` Jan D.
  1 sibling, 1 reply; 12+ messages in thread
From: Stefan @ 2004-08-28 21:38 UTC (permalink / raw)
  Cc: Jan D., reiner.steib, emacs-devel

>> +       inhibit_garbage_collection ();
>> Can someone that knows ENCODE_UTF_8 and garbage collection well
>> comment on this patch?
> I don't know either well, but of course that is not the correct way to
> fix it.  The correct way would be to add appropriate GCPRO and UNGCPRO
> calls for temporary data structures that should not yet be collected.

On what system is that, and how is it compiled.
The thing is that GCPROs are almost never used nowadays: on most systems we
just conservatively scan the stack.  So unless his config happens to not do
the conservative stack scan (and thus use the GCPROs instead), adding GCPROs
won't do a thing.


        Stefan

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: All platforms fail with Unicode in menus.
  2004-08-28 21:38     ` Stefan
@ 2004-08-28 22:18       ` Jan D.
  2004-08-28 22:38         ` Stefan
  0 siblings, 1 reply; 12+ messages in thread
From: Jan D. @ 2004-08-28 22:18 UTC (permalink / raw)
  Cc: reiner.steib, emacs-devel

>>> +       inhibit_garbage_collection ();
>>> Can someone that knows ENCODE_UTF_8 and garbage collection well
>>> comment on this patch?
>> I don't know either well, but of course that is not the correct way to
>> fix it.  The correct way would be to add appropriate GCPRO and UNGCPRO
>> calls for temporary data structures that should not yet be collected.
>
> On what system is that, and how is it compiled.
> The thing is that GCPROs are almost never used nowadays: on most 
> systems we
> just conservatively scan the stack.  So unless his config happens to 
> not do
> the conservative stack scan (and thus use the GCPROs instead), adding 
> GCPROs
> won't do a thing.

I don't know what system David originally used, but I used GNU/Linux on 
x86,
with gcc 3.4.1.
If the GCPROs don't help, can for example static Lisp_Object:s be the 
source
of this problem?  Are there any other cases where Lisp_Object:s should
be protected?

	Jan D.

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: All platforms fail with Unicode in menus.
  2004-08-28 22:18       ` Jan D.
@ 2004-08-28 22:38         ` Stefan
  0 siblings, 0 replies; 12+ messages in thread
From: Stefan @ 2004-08-28 22:38 UTC (permalink / raw)
  Cc: reiner.steib, emacs-devel

> I don't know what system David originally used, but I used GNU/Linux on x86,
> with gcc 3.4.1.

OK, so GCPROs won't help.

> If the GCPROs don't help, can for example static Lisp_Object:s be the source
> of this problem?

Yes, very much so.  You need to `staticpro' them.

> Are there any other cases where Lisp_Object:s should be protected?

Well, Lisp_Objects in the stack are protected by stack scanning or GCPRO,
Lisp_Objects in the static area are protected by staticpro, and Lisp_Objects
in the heap are protected by tracing, so you should make sure that any
Lisp_Objects in the heap are properly traced (typically, that means that
they are properly handled by mark_object).


        Stefan

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: All platforms fail with Unicode in menus.
  2004-08-26 18:30 ` Jan D.
  2004-08-28  7:11   ` David Kastrup
@ 2004-08-30  7:52   ` YAMAMOTO Mitsuharu
  2004-08-30 10:28     ` Jan D.
  1 sibling, 1 reply; 12+ messages in thread
From: YAMAMOTO Mitsuharu @ 2004-08-30  7:52 UTC (permalink / raw)
  Cc: reiner.steib, emacs-devel

>>>>> On Thu, 26 Aug 2004 20:30:12 +0200, "Jan D." <jan.h.d@swipnet.se> said:

> It seems that the string returned by ENCODE_UTF_8 gets collected
> during GC, resulting in passing garbage to the GTK menu code.

In this case, the Lisp Object returned by ENCODE_UTF_8 is reachable
from the root set via `menu_items', which is staticpro-ed.  I think
the problem is that ENCODE_UTF_8 may cause GC, and that leads to
relocation of string contents by the compaction of small strings.
Without the call of inhibit_garbage_collection, the buffer list in the
"Buffers" menu is also corrupted if "Math" menu is present.

				     YAMAMOTO Mitsuharu
				mituharu@math.s.chiba-u.ac.jp

^ permalink raw reply	[flat|nested] 12+ messages in thread

* Re: All platforms fail with Unicode in menus.
  2004-08-30  7:52   ` YAMAMOTO Mitsuharu
@ 2004-08-30 10:28     ` Jan D.
  0 siblings, 0 replies; 12+ messages in thread
From: Jan D. @ 2004-08-30 10:28 UTC (permalink / raw)
  Cc: reiner.steib, emacs-devel


>> It seems that the string returned by ENCODE_UTF_8 gets collected
>> during GC, resulting in passing garbage to the GTK menu code.
>
> In this case, the Lisp Object returned by ENCODE_UTF_8 is reachable
> from the root set via `menu_items', which is staticpro-ed.  I think
> the problem is that ENCODE_UTF_8 may cause GC, and that leads to
> relocation of string contents by the compaction of small strings.
> Without the call of inhibit_garbage_collection, the buffer list in the
> "Buffers" menu is also corrupted if "Math" menu is present.

Yes, you are correct.  The problem is that the menu code saves a pointer
to the strings in the menus, not the Lisp value, in its internal data
structure.  As it reaches the "Math" menu, the compaction of small 
strings
makes the previously saved pointers point to garbage as the strings has 
been
moved.

This problem has been considered in the code when the 
inhibit_garbage_collection was removed.  The pointers to the strings 
are
not stored until after the whole data structure is done, and no GC can 
happen.  But it is only done properly for the top level (i.e. menu bar)
entries.  Fixing the others should be easy, I'll do it within a day or
two.

	Jan D.

^ permalink raw reply	[flat|nested] 12+ messages in thread

end of thread, other threads:[~2004-08-30 10:28 UTC | newest]

Thread overview: 12+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2004-08-25 21:48 All platforms fail with Unicode in menus David Kastrup
2004-08-26  8:13 ` YAMAMOTO Mitsuharu
2004-08-26 18:30 ` Jan D.
2004-08-28  7:11   ` David Kastrup
2004-08-28  7:42     ` Jan D.
2004-08-28  8:08       ` David Kastrup
2004-08-28  8:24         ` Andreas Schwab
2004-08-28 21:38     ` Stefan
2004-08-28 22:18       ` Jan D.
2004-08-28 22:38         ` Stefan
2004-08-30  7:52   ` YAMAMOTO Mitsuharu
2004-08-30 10:28     ` Jan D.

Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).