emacs-diffs
[Top][All Lists]
Advanced

[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 ----




reply via email to

[Prev in Thread] Current Thread [Next in Thread]