* xfns.c (x_set_name_internal): New function. Check if we shall call
xfree before ENCODE_UTF_8. (x_set_name, x_set_title): Call x_set_name_internal.
This commit is contained in:
parent
c3829a8e2f
commit
b10daec709
2 changed files with 92 additions and 123 deletions
|
@ -1,3 +1,9 @@
|
|||
2004-09-02 Jan Dj,Ad(Brv <jan.h.d@swipnet.se>
|
||||
|
||||
* xfns.c (x_set_name_internal): New function. Check if we shall call
|
||||
xfree before ENCODE_UTF_8.
|
||||
(x_set_name, x_set_title): Call x_set_name_internal.
|
||||
|
||||
2004-08-31 NAKAMURA Toshikazu <nr-tkz@nifty.com> (tiny change)
|
||||
|
||||
* w32fns.c (w32_load_font): If a BDF font is already loaded, do not
|
||||
|
|
209
src/xfns.c
209
src/xfns.c
|
@ -1560,6 +1560,90 @@ x_encode_text (string, coding_system, selectionp, text_bytes, stringp)
|
|||
}
|
||||
|
||||
|
||||
/* Set the WM name to NAME for frame F. Also set the icon name.
|
||||
If the frame already has an icon name, use that, otherwise set the
|
||||
icon name to NAME. */
|
||||
|
||||
static void
|
||||
x_set_name_internal (f, name)
|
||||
FRAME_PTR f;
|
||||
Lisp_Object name;
|
||||
{
|
||||
if (FRAME_X_WINDOW (f))
|
||||
{
|
||||
BLOCK_INPUT;
|
||||
#ifdef HAVE_X11R4
|
||||
{
|
||||
XTextProperty text, icon;
|
||||
int bytes, stringp;
|
||||
int do_free_icon_value = 0, do_free_text_value = 0;
|
||||
Lisp_Object coding_system;
|
||||
|
||||
coding_system = Qcompound_text;
|
||||
/* Note: Encoding strategy
|
||||
|
||||
We encode NAME by compound-text and use "COMPOUND-TEXT" in
|
||||
text.encoding. But, there are non-internationalized window
|
||||
managers which don't support that encoding. So, if NAME
|
||||
contains only ASCII and 8859-1 characters, encode it by
|
||||
iso-latin-1, and use "STRING" in text.encoding hoping that
|
||||
such window managers at least analyze this format correctly,
|
||||
i.e. treat 8-bit bytes as 8859-1 characters.
|
||||
|
||||
We may also be able to use "UTF8_STRING" in text.encoding
|
||||
in the future which can encode all Unicode characters.
|
||||
But, for the moment, there's no way to know that the
|
||||
current window manager supports it or not. */
|
||||
text.value = x_encode_text (name, coding_system, 0, &bytes, &stringp);
|
||||
text.encoding = (stringp ? XA_STRING
|
||||
: FRAME_X_DISPLAY_INFO (f)->Xatom_COMPOUND_TEXT);
|
||||
text.format = 8;
|
||||
text.nitems = bytes;
|
||||
|
||||
/* Check early, because ENCODE_UTF_8 below may GC and name may be
|
||||
relocated. */
|
||||
do_free_text_value = text.value != SDATA (name);
|
||||
|
||||
if (NILP (f->icon_name))
|
||||
{
|
||||
icon = text;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* See the above comment "Note: Encoding strategy". */
|
||||
icon.value = x_encode_text (f->icon_name, coding_system, 0,
|
||||
&bytes, &stringp);
|
||||
icon.encoding = (stringp ? XA_STRING
|
||||
: FRAME_X_DISPLAY_INFO (f)->Xatom_COMPOUND_TEXT);
|
||||
icon.format = 8;
|
||||
icon.nitems = bytes;
|
||||
do_free_icon_value = icon.value != SDATA (f->icon_name);
|
||||
}
|
||||
|
||||
#ifdef USE_GTK
|
||||
gtk_window_set_title (GTK_WINDOW (FRAME_GTK_OUTER_WIDGET (f)),
|
||||
SDATA (ENCODE_UTF_8 (name)));
|
||||
#else /* not USE_GTK */
|
||||
XSetWMName (FRAME_X_DISPLAY (f), FRAME_OUTER_WINDOW (f), &text);
|
||||
#endif /* not USE_GTK */
|
||||
|
||||
XSetWMIconName (FRAME_X_DISPLAY (f), FRAME_OUTER_WINDOW (f), &icon);
|
||||
|
||||
if (do_free_icon_value)
|
||||
xfree (icon.value);
|
||||
if (do_free_text_value)
|
||||
xfree (text.value);
|
||||
}
|
||||
#else /* not HAVE_X11R4 */
|
||||
XSetIconName (FRAME_X_DISPLAY (f), FRAME_X_WINDOW (f),
|
||||
SDATA (name));
|
||||
XStoreName (FRAME_X_DISPLAY (f), FRAME_X_WINDOW (f),
|
||||
SDATA (name));
|
||||
#endif /* not HAVE_X11R4 */
|
||||
UNBLOCK_INPUT;
|
||||
}
|
||||
}
|
||||
|
||||
/* Change the name of frame F to NAME. If NAME is nil, set F's name to
|
||||
x_id_name.
|
||||
|
||||
|
@ -1615,73 +1699,7 @@ x_set_name (f, name, explicit)
|
|||
if (! NILP (f->title))
|
||||
name = f->title;
|
||||
|
||||
if (FRAME_X_WINDOW (f))
|
||||
{
|
||||
BLOCK_INPUT;
|
||||
#ifdef HAVE_X11R4
|
||||
{
|
||||
XTextProperty text, icon;
|
||||
int bytes, stringp;
|
||||
Lisp_Object coding_system;
|
||||
|
||||
/* Note: Encoding strategy
|
||||
|
||||
We encode NAME by compound-text and use "COMPOUND-TEXT" in
|
||||
text.encoding. But, there are non-internationalized window
|
||||
managers which don't support that encoding. So, if NAME
|
||||
contains only ASCII and 8859-1 characters, encode it by
|
||||
iso-latin-1, and use "STRING" in text.encoding hoping that
|
||||
such window managers at least analyze this format correctly,
|
||||
i.e. treat 8-bit bytes as 8859-1 characters.
|
||||
|
||||
We may also be able to use "UTF8_STRING" in text.encoding
|
||||
in the future which can encode all Unicode characters.
|
||||
But, for the moment, there's no way to know that the
|
||||
current window manager supports it or not. */
|
||||
coding_system = Qcompound_text;
|
||||
text.value = x_encode_text (name, coding_system, 0, &bytes, &stringp);
|
||||
text.encoding = (stringp ? XA_STRING
|
||||
: FRAME_X_DISPLAY_INFO (f)->Xatom_COMPOUND_TEXT);
|
||||
text.format = 8;
|
||||
text.nitems = bytes;
|
||||
|
||||
if (NILP (f->icon_name))
|
||||
{
|
||||
icon = text;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* See the above comment "Note: Encoding strategy". */
|
||||
icon.value = x_encode_text (f->icon_name, coding_system, 0,
|
||||
&bytes, &stringp);
|
||||
icon.encoding = (stringp ? XA_STRING
|
||||
: FRAME_X_DISPLAY_INFO (f)->Xatom_COMPOUND_TEXT);
|
||||
icon.format = 8;
|
||||
icon.nitems = bytes;
|
||||
}
|
||||
#ifdef USE_GTK
|
||||
gtk_window_set_title (GTK_WINDOW (FRAME_GTK_OUTER_WIDGET (f)),
|
||||
SDATA (ENCODE_UTF_8 (name)));
|
||||
#else /* not USE_GTK */
|
||||
XSetWMName (FRAME_X_DISPLAY (f), FRAME_OUTER_WINDOW (f), &text);
|
||||
#endif /* not USE_GTK */
|
||||
|
||||
XSetWMIconName (FRAME_X_DISPLAY (f), FRAME_OUTER_WINDOW (f), &icon);
|
||||
|
||||
if (!NILP (f->icon_name)
|
||||
&& icon.value != (unsigned char *) SDATA (f->icon_name))
|
||||
xfree (icon.value);
|
||||
if (text.value != (unsigned char *) SDATA (name))
|
||||
xfree (text.value);
|
||||
}
|
||||
#else /* not HAVE_X11R4 */
|
||||
XSetIconName (FRAME_X_DISPLAY (f), FRAME_X_WINDOW (f),
|
||||
SDATA (name));
|
||||
XStoreName (FRAME_X_DISPLAY (f), FRAME_X_WINDOW (f),
|
||||
SDATA (name));
|
||||
#endif /* not HAVE_X11R4 */
|
||||
UNBLOCK_INPUT;
|
||||
}
|
||||
x_set_name_internal (f, name);
|
||||
}
|
||||
|
||||
/* This function should be called when the user's lisp code has
|
||||
|
@ -1735,62 +1753,7 @@ x_set_title (f, name, old_name)
|
|||
else
|
||||
CHECK_STRING (name);
|
||||
|
||||
if (FRAME_X_WINDOW (f))
|
||||
{
|
||||
BLOCK_INPUT;
|
||||
#ifdef HAVE_X11R4
|
||||
{
|
||||
XTextProperty text, icon;
|
||||
int bytes, stringp;
|
||||
Lisp_Object coding_system;
|
||||
|
||||
coding_system = Qcompound_text;
|
||||
/* See the comment "Note: Encoding strategy" in x_set_name. */
|
||||
text.value = x_encode_text (name, coding_system, 0, &bytes, &stringp);
|
||||
text.encoding = (stringp ? XA_STRING
|
||||
: FRAME_X_DISPLAY_INFO (f)->Xatom_COMPOUND_TEXT);
|
||||
text.format = 8;
|
||||
text.nitems = bytes;
|
||||
|
||||
if (NILP (f->icon_name))
|
||||
{
|
||||
icon = text;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* See the comment "Note: Encoding strategy" in x_set_name. */
|
||||
icon.value = x_encode_text (f->icon_name, coding_system, 0,
|
||||
&bytes, &stringp);
|
||||
icon.encoding = (stringp ? XA_STRING
|
||||
: FRAME_X_DISPLAY_INFO (f)->Xatom_COMPOUND_TEXT);
|
||||
icon.format = 8;
|
||||
icon.nitems = bytes;
|
||||
}
|
||||
|
||||
#ifdef USE_GTK
|
||||
gtk_window_set_title (GTK_WINDOW (FRAME_GTK_OUTER_WIDGET (f)),
|
||||
SDATA (ENCODE_UTF_8 (name)));
|
||||
#else /* not USE_GTK */
|
||||
XSetWMName (FRAME_X_DISPLAY (f), FRAME_OUTER_WINDOW (f), &text);
|
||||
#endif /* not USE_GTK */
|
||||
|
||||
XSetWMIconName (FRAME_X_DISPLAY (f), FRAME_OUTER_WINDOW (f),
|
||||
&icon);
|
||||
|
||||
if (!NILP (f->icon_name)
|
||||
&& icon.value != (unsigned char *) SDATA (f->icon_name))
|
||||
xfree (icon.value);
|
||||
if (text.value != (unsigned char *) SDATA (name))
|
||||
xfree (text.value);
|
||||
}
|
||||
#else /* not HAVE_X11R4 */
|
||||
XSetIconName (FRAME_X_DISPLAY (f), FRAME_X_WINDOW (f),
|
||||
SDATA (name));
|
||||
XStoreName (FRAME_X_DISPLAY (f), FRAME_X_WINDOW (f),
|
||||
SDATA (name));
|
||||
#endif /* not HAVE_X11R4 */
|
||||
UNBLOCK_INPUT;
|
||||
}
|
||||
x_set_name_internal (f, name);
|
||||
}
|
||||
|
||||
void
|
||||
|
|
Loading…
Add table
Reference in a new issue