[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: x-create-frame is sluggish
From: |
Lőrentey Károly |
Subject: |
Re: x-create-frame is sluggish |
Date: |
Mon, 25 Oct 2004 15:07:18 +0200 |
User-agent: |
Gnus/5.110003 (No Gnus v0.3) Emacs/21.3.50 (gnu/linux) |
Does the new patch look all right to you? If there are no objections,
I will proceed with installing it. I've been using it for a few weeks
without problems.
Lőrentey Károly <address@hidden> writes:
> 2004-10-11 Károly Lőrentey <address@hidden>
>
> * src/xterm.h (x_output): New member `xic_base_fontname'.
> (FRAME_XIC_BASE_FONTNAME): New macro.
> (xic_delete_xfontset): Declare.
>
> * src/xfns.c (xic_create_xfontset): Share fontsets between frames
> based on base_fontname.
> (create_frame_xic): Set the frame's xic_base_fontname.
> (xic_delete_xfontset): New function.
> (free_frame_xic): Use it. Free xic_base_fontname.
> (xic_set_xfontset): Ditto.
>
> * src/xterm.c (xim_destroy_callback): Ditto.
>
> *** orig/src/xfns.c
> --- mod/src/xfns.c
> ***************
> *** 1953,1959 ****
> --- 1953,1971 ----
> 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))
> + return FRAME_XIC_FONTSET (cf);
> + }
> +
> + /* New fontset. */
> xfs = XCreateFontSet (FRAME_X_DISPLAY (f),
> base_fontname, &missing_list,
> &missing_count, &def_string);
> ***************
> *** 1964,1969 ****
> --- 1976,2005 ----
> return xfs;
> }
>
> + /* Free the X fontset of frame F if it is the last frame using it. */
> +
> + void
> + xic_delete_xfontset (f)
> + struct frame *f;
> + {
> + Lisp_Object rest, frame;
> +
> + 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))
> + return;
> + }
> + /* The fontset is not used anymore. It is safe to free it. */
> + XFreeFontSet (FRAME_X_DISPLAY (f), FRAME_XIC_FONTSET (f));
> + }
> +
>
> /* Value is the best input style, given user preferences USER (already
> checked to be supported by Emacs), and styles supported by the
> ***************
> *** 1996,2001 ****
> --- 2032,2038 ----
> XIM xim;
> XIC xic = NULL;
> XFontSet xfs = NULL;
> + char *base_fontname = NULL;
>
> if (FRAME_XIC (f))
> return;
> ***************
> *** 2007,2013 ****
> XPoint spot;
> XVaNestedList preedit_attr;
> XVaNestedList status_attr;
> - char *base_fontname;
> int fontset;
>
> s_area.x = 0; s_area.y = 0; s_area.width = 1; s_area.height = 1;
> --- 2044,2049 ----
> ***************
> *** 2101,2106 ****
> --- 2137,2143 ----
> FRAME_XIC (f) = xic;
> FRAME_XIC_STYLE (f) = xic_style;
> FRAME_XIC_FONTSET (f) = xfs;
> + FRAME_XIC_BASE_FONTNAME (f) = xstrdup (base_fontname);
> }
>
>
> ***************
> *** 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;
> }
>
>
> --- 2151,2163 ----
> return;
>
> XDestroyIC (FRAME_XIC (f));
> ! xic_delete_xfontset (f);
> ! if (FRAME_XIC_BASE_FONTNAME (f))
> ! xfree (FRAME_XIC_BASE_FONTNAME (f));
>
> FRAME_XIC (f) = NULL;
> FRAME_XIC_FONTSET (f) = NULL;
> + FRAME_XIC_BASE_FONTNAME (f) = NULL;
> }
>
>
> ***************
> *** 2207,2214 ****
> XFree (attr);
>
> if (FRAME_XIC_FONTSET (f))
> ! XFreeFontSet (FRAME_X_DISPLAY (f), FRAME_XIC_FONTSET (f));
> FRAME_XIC_FONTSET (f) = xfs;
> }
>
> #endif /* HAVE_X_I18N */
> --- 2246,2258 ----
> XFree (attr);
>
> if (FRAME_XIC_FONTSET (f))
> ! xic_delete_xfontset (f);
> !
> ! if (FRAME_XIC_BASE_FONTNAME (f))
> ! xfree (FRAME_XIC_BASE_FONTNAME (f));
> !
> FRAME_XIC_FONTSET (f) = xfs;
> + FRAME_XIC_BASE_FONTNAME (f) = xstrdup (base_fontname);
> }
>
> #endif /* HAVE_X_I18N */
> *** orig/src/xterm.c
> --- mod/src/xterm.c
> ***************
> *** 8024,8031 ****
> FRAME_XIC (f) = NULL;
> if (FRAME_XIC_FONTSET (f))
> {
> ! XFreeFontSet (FRAME_X_DISPLAY (f), FRAME_XIC_FONTSET (f));
> FRAME_XIC_FONTSET (f) = NULL;
> }
> }
> }
> --- 8024,8033 ----
> FRAME_XIC (f) = NULL;
> if (FRAME_XIC_FONTSET (f))
> {
> ! xic_delete_xfontset (f);
> ! xfree (FRAME_XIC_BASE_FONTNAME (f));
> FRAME_XIC_FONTSET (f) = NULL;
> + FRAME_XIC_BASE_FONTNAME (f) = NULL;
> }
> }
> }
> *** orig/src/xterm.h
> --- mod/src/xterm.h
> ***************
> *** 593,598 ****
> --- 593,599 ----
> XIC xic;
> XIMStyle xic_style;
> XFontSet xic_xfs;
> + char *xic_base_fontname;
> #endif
>
> /* Relief GCs, colors etc. */
> ***************
> *** 727,732 ****
> --- 728,734 ----
> #define FRAME_X_XIM_STYLES(f) (FRAME_X_DISPLAY_INFO (f)->xim_styles)
> #define FRAME_XIC_STYLE(f) ((f)->output_data.x->xic_style)
> #define FRAME_XIC_FONTSET(f) ((f)->output_data.x->xic_xfs)
> + #define FRAME_XIC_BASE_FONTNAME(f) ((f)->output_data.x->xic_base_fontname)
>
> /* Value is the smallest width of any character in any font on frame F. */
>
> ***************
> *** 1036,1041 ****
> --- 1038,1044 ----
> extern unsigned char * x_encode_text P_ ((Lisp_Object, Lisp_Object, int,
> int *, int *));
> extern void x_implicitly_set_name P_ ((struct frame *, Lisp_Object,
> Lisp_Object));
> + extern void xic_delete_xfontset P_ ((struct frame *));
> extern void create_frame_xic P_ ((struct frame *));
> extern void destroy_frame_xic P_ ((struct frame *));
> extern void xic_set_preeditarea P_ ((struct window *, int, int));
--
Károly
pgpb8r9r7Hqh3.pgp
Description: PGP signature