[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Emacs-diffs] Changes to emacs/src/xfns.c
From: |
Jan Dj�rv |
Subject: |
[Emacs-diffs] Changes to emacs/src/xfns.c |
Date: |
Thu, 21 Oct 2004 14:45:19 -0400 |
Index: emacs/src/xfns.c
diff -c emacs/src/xfns.c:1.615 emacs/src/xfns.c:1.616
*** emacs/src/xfns.c:1.615 Mon Oct 11 10:50:00 2004
--- emacs/src/xfns.c Thu Oct 21 18:38:57 2004
***************
*** 1941,1969 ****
};
! /* Create an X fontset on frame F with base font name
! BASE_FONTNAME.. */
static XFontSet
xic_create_xfontset (f, base_fontname)
struct frame *f;
char *base_fontname;
{
! XFontSet xfs;
char **missing_list;
int missing_count;
char *def_string;
! xfs = XCreateFontSet (FRAME_X_DISPLAY (f),
! base_fontname, &missing_list,
! &missing_count, &def_string);
if (missing_list)
XFreeStringList (missing_list);
! /* No need to free def_string. */
return xfs;
}
/* Value is the best input style, given user preferences USER (already
checked to be supported by Emacs), and styles supported by the
--- 1941,2023 ----
};
! /* Create an X fontset on frame F with base font name BASE_FONTNAME. */
static XFontSet
xic_create_xfontset (f, base_fontname)
struct frame *f;
char *base_fontname;
{
! XFontSet xfs = NULL;
char **missing_list;
int missing_count;
char *def_string;
+ Lisp_Object rest, frame;
+
+ /* See if there is another frame already using same fontset. */
+ FOR_EACH_FRAME (rest, frame)
+ {
+ struct frame *cf = XFRAME (frame);
+ if (cf != f && FRAME_LIVE_P (f) && FRAME_X_P (cf)
+ && FRAME_X_DISPLAY_INFO (cf) == FRAME_X_DISPLAY_INFO (f)
+ && !strcmp (FRAME_XIC_BASE_FONTNAME (cf), base_fontname))
+ {
+ xfs = FRAME_XIC_FONTSET (cf);
+ break;
+ }
+ }
! if (!xfs)
! /* New fontset. */
! xfs = XCreateFontSet (FRAME_X_DISPLAY (f),
! base_fontname, &missing_list,
! &missing_count, &def_string);
if (missing_list)
XFreeStringList (missing_list);
! if (FRAME_XIC_BASE_FONTNAME (f))
! xfree (FRAME_XIC_BASE_FONTNAME (f));
! FRAME_XIC_BASE_FONTNAME (f) = xstrdup (base_fontname);
!
! /* No need to free def_string. */
return xfs;
}
+ /* Free the X fontset of frame F if it is the last frame using it. */
+
+ void
+ xic_free_xfontset (f)
+ struct frame *f;
+ {
+ Lisp_Object rest, frame;
+ int shared_p = 0;
+
+ if (!FRAME_XIC_FONTSET (f))
+ return;
+
+ /* See if there is another frame sharing the same fontset. */
+ FOR_EACH_FRAME (rest, frame)
+ {
+ struct frame *cf = XFRAME (frame);
+ if (cf != f && FRAME_LIVE_P (f) && FRAME_X_P (cf)
+ && FRAME_X_DISPLAY_INFO (cf) == FRAME_X_DISPLAY_INFO (f)
+ && FRAME_XIC_FONTSET (cf) == FRAME_XIC_FONTSET (f))
+ {
+ shared_p = 1;
+ break;
+ }
+ }
+
+ if (!shared_p)
+ /* The fontset is not used anymore. It is safe to free it. */
+ XFreeFontSet (FRAME_X_DISPLAY (f), FRAME_XIC_FONTSET (f));
+
+ if (FRAME_XIC_BASE_FONTNAME (f))
+ xfree (FRAME_XIC_BASE_FONTNAME (f));
+ FRAME_XIC_BASE_FONTNAME (f) = NULL;
+ FRAME_XIC_FONTSET (f) = NULL;
+ }
+
/* Value is the best input style, given user preferences USER (already
checked to be supported by Emacs), and styles supported by the
***************
*** 2114,2124 ****
return;
XDestroyIC (FRAME_XIC (f));
! if (FRAME_XIC_FONTSET (f))
! XFreeFontSet (FRAME_X_DISPLAY (f), FRAME_XIC_FONTSET (f));
FRAME_XIC (f) = NULL;
- FRAME_XIC_FONTSET (f) = NULL;
}
--- 2168,2176 ----
return;
XDestroyIC (FRAME_XIC (f));
! xic_free_xfontset (f);
FRAME_XIC (f) = NULL;
}
***************
*** 2197,2202 ****
--- 2249,2256 ----
XVaNestedList attr;
XFontSet xfs;
+ xic_free_xfontset (f);
+
xfs = xic_create_xfontset (f, base_fontname);
attr = XVaCreateNestedList (0, XNFontSet, xfs, NULL);
***************
*** 2206,2213 ****
XSetICValues (FRAME_XIC (f), XNStatusAttributes, attr, NULL);
XFree (attr);
- if (FRAME_XIC_FONTSET (f))
- XFreeFontSet (FRAME_X_DISPLAY (f), FRAME_XIC_FONTSET (f));
FRAME_XIC_FONTSET (f) = xfs;
}
--- 2260,2265 ----