From d141d7011296265b0c2a6432bed9317614abf019 Mon Sep 17 00:00:00 2001 From: Dmitry Antipov Date: Fri, 18 Oct 2013 16:57:44 +0400 Subject: [PATCH] Remove port-specific display name lists to avoid extra complexity and data duplication with display info lists. * xterm.h (x_display_name_list): Remove declaration. * xterm.c (x_display_name_list): Remove. (x_term_init, x_delete_display, syms_of_xterm): Adjust users. * xfns.c (x_display_info_for_name, Fx_display_list): Likewise. Use x_display_list where appropriate. * w32term.h (w32_display_name_list): Remove declaration. * w32term.c (w32_display_name_list): Remove. (w32_initialize_display_info, x_delete_display, syms_of_w32term): Adjust users. * w32fns.c (x_display_info_for_name, Fx_display_list): Likewise. Use x_display_list where appropriate. * nsterm.h (ns_display_name_list): Remove declaration. * nsterm.m (ns_display_name_list): Remove. (ns_term_init, syms_of_nsterm): Adjust users. * nsfns.m (ns_display_info_for_name, Fx_display_list): Likewise. Use x_display_list where appropriate. * termhooks.h (TERMINAL_FONT_CACHE): New macro. * alloc.c (toplevel) [HAVE_WINDOW_SYSTEM]: Include TERM_HEADER. (mark_terminals): Mark per-terminal font cache. --- src/ChangeLog | 24 ++++++++++++++++++++++++ src/alloc.c | 6 ++++++ src/nsfns.m | 21 +++++++-------------- src/nsterm.h | 4 +--- src/nsterm.m | 9 +-------- src/termhooks.h | 13 +++++++++++++ src/w32fns.c | 21 +++++++-------------- src/w32term.c | 38 ++------------------------------------ src/w32term.h | 9 +-------- src/xfns.c | 21 +++++++-------------- src/xterm.c | 43 +++---------------------------------------- src/xterm.h | 9 +-------- 12 files changed, 73 insertions(+), 145 deletions(-) diff --git a/src/ChangeLog b/src/ChangeLog index 0dae87bd69a..53b9188dba9 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,27 @@ +2013-10-18 Dmitry Antipov + + Remove port-specific display name lists to avoid extra + complexity and data duplication with display info lists. + * xterm.h (x_display_name_list): Remove declaration. + * xterm.c (x_display_name_list): Remove. + (x_term_init, x_delete_display, syms_of_xterm): Adjust users. + * xfns.c (x_display_info_for_name, Fx_display_list): + Likewise. Use x_display_list where appropriate. + * w32term.h (w32_display_name_list): Remove declaration. + * w32term.c (w32_display_name_list): Remove. + (w32_initialize_display_info, x_delete_display, syms_of_w32term): + Adjust users. + * w32fns.c (x_display_info_for_name, Fx_display_list): + Likewise. Use x_display_list where appropriate. + * nsterm.h (ns_display_name_list): Remove declaration. + * nsterm.m (ns_display_name_list): Remove. + (ns_term_init, syms_of_nsterm): Adjust users. + * nsfns.m (ns_display_info_for_name, Fx_display_list): + Likewise. Use x_display_list where appropriate. + * termhooks.h (TERMINAL_FONT_CACHE): New macro. + * alloc.c (toplevel) [HAVE_WINDOW_SYSTEM]: Include TERM_HEADER. + (mark_terminals): Mark per-terminal font cache. + 2013-10-17 Barry O'Reilly Don't run timers in input-pending-p. Its new check-timers param diff --git a/src/alloc.c b/src/alloc.c index 0667353c1a8..02deaa94af1 100644 --- a/src/alloc.c +++ b/src/alloc.c @@ -42,6 +42,9 @@ along with GNU Emacs. If not, see . */ #include "frame.h" #include "blockinput.h" #include "termhooks.h" /* For struct terminal. */ +#ifdef HAVE_WINDOW_SYSTEM +#include TERM_HEADER +#endif /* HAVE_WINDOW_SYSTEM */ #include @@ -6115,6 +6118,9 @@ mark_terminals (void) it might have been marked already. Make sure the image cache gets marked. */ mark_image_cache (t->image_cache); + /* FIXME: currently font cache may grow too large + and probably needs special finalization. */ + mark_object (TERMINAL_FONT_CACHE (t)); #endif /* HAVE_WINDOW_SYSTEM */ if (!VECTOR_MARKED_P (t)) mark_vectorlike ((struct Lisp_Vector *)t); diff --git a/src/nsfns.m b/src/nsfns.m index 24edd4366ce..011edf38cef 100644 --- a/src/nsfns.m +++ b/src/nsfns.m @@ -175,20 +175,13 @@ ns_get_window (Lisp_Object maybeFrame) struct ns_display_info * ns_display_info_for_name (Lisp_Object name) { - Lisp_Object names; struct ns_display_info *dpyinfo; CHECK_STRING (name); - for (dpyinfo = x_display_list, names = ns_display_name_list; - dpyinfo; - dpyinfo = dpyinfo->next, names = XCDR (names)) - { - Lisp_Object tem; - tem = Fstring_equal (XCAR (XCAR (names)), name); - if (!NILP (tem)) - return dpyinfo; - } + for (dpyinfo = x_display_list; dpyinfo; dpyinfo = dpyinfo->next) + if (!NILP (Fstring_equal (XCAR (dpyinfo->name_list_element), name))) + return dpyinfo; error ("Emacs for OpenStep does not yet support multi-display."); @@ -1843,11 +1836,11 @@ DEFUN ("x-display-list", Fx_display_list, Sx_display_list, 0, 0, 0, doc: /* Return the list of display names that Emacs has connections to. */) (void) { - Lisp_Object tail, result; + Lisp_Object result = Qnil; + struct ns_display_info *ndi; - result = Qnil; - for (tail = ns_display_name_list; CONSP (tail); tail = XCDR (tail)) - result = Fcons (XCAR (XCAR (tail)), result); + for (ndi = x_display_list; ndi; ndi = ndi->next) + result = Fcons (XCAR (ndi->name_list_element), result); return result; } diff --git a/src/nsterm.h b/src/nsterm.h index a4e9519daae..71faa075f32 100644 --- a/src/nsterm.h +++ b/src/nsterm.h @@ -552,8 +552,7 @@ struct ns_display_info /* The generic display parameters corresponding to this NS display. */ struct terminal *terminal; - /* This is a cons cell of the form (NAME . FONT-LIST-CACHE). - The same cons cell also appears in ns_display_name_list. */ + /* This is a cons cell of the form (NAME . FONT-LIST-CACHE). */ Lisp_Object name_list_element; /* The number of fonts loaded. */ @@ -624,7 +623,6 @@ struct ns_display_info /* This is a chain of structures for all the NS displays currently in use. */ extern struct ns_display_info *x_display_list; -extern Lisp_Object ns_display_name_list; extern struct ns_display_info *ns_display_info_for_name (Lisp_Object name); struct ns_output diff --git a/src/nsterm.m b/src/nsterm.m index 5b48ff2cee6..5b2c6a3f686 100644 --- a/src/nsterm.m +++ b/src/nsterm.m @@ -184,7 +184,6 @@ NSString *ns_app_name = @"Emacs"; /* default changed later */ /* Display variables */ struct ns_display_info *x_display_list; /* Chain of existing displays */ -Lisp_Object ns_display_name_list; long context_menu_value = 0; /* display update */ @@ -4173,10 +4172,7 @@ ns_term_init (Lisp_Object display_name) dpyinfo->next = x_display_list; x_display_list = dpyinfo; - /* Put it on ns_display_name_list */ - ns_display_name_list = Fcons (Fcons (display_name, Qnil), - ns_display_name_list); - dpyinfo->name_list_element = XCAR (ns_display_name_list); + dpyinfo->name_list_element = Fcons (display_name, Qnil); terminal->name = xstrdup (SSDATA (display_name)); @@ -7460,9 +7456,6 @@ allowing it to be used at a lower level for accented character entry."); "Whether to confirm application quit using dialog."); ns_confirm_quit = Qnil; - staticpro (&ns_display_name_list); - ns_display_name_list = Qnil; - DEFVAR_LISP ("ns-auto-hide-menu-bar", ns_auto_hide_menu_bar, doc: /* Non-nil means that the menu bar is hidden, but appears when the mouse is near. Only works on OSX 10.6 or later. */); diff --git a/src/termhooks.h b/src/termhooks.h index 31825a4c95d..042a493882b 100644 --- a/src/termhooks.h +++ b/src/termhooks.h @@ -623,6 +623,19 @@ extern struct terminal *terminal_list; (((d)->type != output_termcap && (d)->type != output_msdos_raw) \ || (d)->display_info.tty->input) +/* Return font cache data for the specified terminal. The historical + name is grossly misleading, actually it is (NAME . FONT-LIST-CACHE). */ +#if defined (HAVE_X_WINDOWS) +#define TERMINAL_FONT_CACHE(t) \ + (t->type == output_x_window ? t->display_info.x->name_list_element : Qnil) +#elif defined (HAVE_NTGUI) +#define TERMINAL_FONT_CACHE(t) \ + (t->type == output_w32 ? t->display_info.w32->name_list_element : Qnil) +#elif defined (HAVE_NS) +#define TERMINAL_FONT_CACHE(t) \ + (t->type == output_ns ? t->display_info.ns->name_list_element : Qnil) +#endif + extern struct terminal *get_terminal (Lisp_Object terminal, bool); extern struct terminal *create_terminal (void); extern void delete_terminal (struct terminal *); diff --git a/src/w32fns.c b/src/w32fns.c index 6e52453caea..c98c84c8542 100644 --- a/src/w32fns.c +++ b/src/w32fns.c @@ -5126,20 +5126,13 @@ x_screen_planes (register struct frame *f) struct w32_display_info * x_display_info_for_name (Lisp_Object name) { - Lisp_Object names; struct w32_display_info *dpyinfo; CHECK_STRING (name); - for (dpyinfo = &one_w32_display_info, names = w32_display_name_list; - dpyinfo && !NILP (w32_display_name_list); - dpyinfo = dpyinfo->next, names = XCDR (names)) - { - Lisp_Object tem; - tem = Fstring_equal (XCAR (XCAR (names)), name); - if (!NILP (tem)) - return dpyinfo; - } + for (dpyinfo = &one_w32_display_info; dpyinfo; dpyinfo = dpyinfo->next) + if (!NILP (Fstring_equal (XCAR (dpyinfo->name_list_element), name))) + return dpyinfo; /* Use this general default value to start with. */ Vx_resource_name = Vinvocation_name; @@ -5274,11 +5267,11 @@ DEFUN ("x-display-list", Fx_display_list, Sx_display_list, 0, 0, 0, doc: /* Return the list of display names that Emacs has connections to. */) (void) { - Lisp_Object tail, result; + Lisp_Object result = Qnil; + struct w32_display_info *wdi; - result = Qnil; - for (tail = w32_display_name_list; CONSP (tail); tail = XCDR (tail)) - result = Fcons (XCAR (XCAR (tail)), result); + for (wdi = x_display_list; wdi; wdi = wdi->next) + result = Fcons (XCAR (wdi->name_list_element), result); return result; } diff --git a/src/w32term.c b/src/w32term.c index b128fbeaa9c..8bc46734b7d 100644 --- a/src/w32term.c +++ b/src/w32term.c @@ -99,13 +99,6 @@ extern Cursor w32_load_cursor (LPCTSTR name); struct w32_display_info one_w32_display_info; struct w32_display_info *x_display_list; -/* This is a list of cons cells, each of the form (NAME . FONT-LIST-CACHE), - one for each element of w32_display_list and in the same order. - NAME is the name of the frame. - FONT-LIST-CACHE records previous values returned by x-list-fonts. */ -Lisp_Object w32_display_name_list; - - #if _WIN32_WINNT < 0x0500 && !defined(_W64) /* Pre Windows 2000, this was not available, but define it here so that Emacs compiled on such a platform will run on newer versions. @@ -6105,11 +6098,7 @@ w32_initialize_display_info (Lisp_Object display_name) memset (dpyinfo, 0, sizeof (*dpyinfo)); - /* Put it on w32_display_name_list. */ - w32_display_name_list = Fcons (Fcons (display_name, Qnil), - w32_display_name_list); - dpyinfo->name_list_element = XCAR (w32_display_name_list); - + dpyinfo->name_list_element = Fcons (display_name, Qnil); dpyinfo->w32_id_name = xmalloc (SCHARS (Vinvocation_name) + SCHARS (Vsystem_name) + 2); sprintf (dpyinfo->w32_id_name, "%s@%s", @@ -6357,27 +6346,7 @@ w32_term_init (Lisp_Object display_name, char *xrm_option, char *resource_name) void x_delete_display (struct w32_display_info *dpyinfo) { - /* Discard this display from w32_display_name_list and w32_display_list. - We can't use Fdelq because that can quit. */ - if (! NILP (w32_display_name_list) - && EQ (XCAR (w32_display_name_list), dpyinfo->name_list_element)) - w32_display_name_list = XCDR (w32_display_name_list); - else - { - Lisp_Object tail; - - tail = w32_display_name_list; - while (CONSP (tail) && CONSP (XCDR (tail))) - { - if (EQ (XCAR (XCDR (tail)), dpyinfo->name_list_element)) - { - XSETCDR (tail, XCDR (XCDR (tail))); - break; - } - tail = XCDR (tail); - } - } - + /* FIXME: the only display info apparently can't be deleted. */ /* free palette table */ { struct w32_palette_entry * plist; @@ -6515,9 +6484,6 @@ w32_initialize (void) void syms_of_w32term (void) { - staticpro (&w32_display_name_list); - w32_display_name_list = Qnil; - DEFSYM (Qvendor_specific_keysyms, "vendor-specific-keysyms"); DEFSYM (Qadded, "added"); diff --git a/src/w32term.h b/src/w32term.h index 8244487dfc7..956e03d336c 100644 --- a/src/w32term.h +++ b/src/w32term.h @@ -86,8 +86,7 @@ struct w32_display_info /* The generic display parameters corresponding to this w32 display. */ struct terminal *terminal; - /* This is a cons cell of the form (NAME . FONT-LIST-CACHE). - The same cons cell also appears in x_display_name_list. */ + /* This is a cons cell of the form (NAME . FONT-LIST-CACHE). */ Lisp_Object name_list_element; /* Number of frames that are on this display. */ @@ -216,12 +215,6 @@ struct w32_display_info extern struct w32_display_info *x_display_list; extern struct w32_display_info one_w32_display_info; -/* This is a list of cons cells, each of the form (NAME . FONT-LIST-CACHE), - one for each element of w32_display_list and in the same order. - NAME is the name of the frame. - FONT-LIST-CACHE records previous values returned by x-list-fonts. */ -extern Lisp_Object w32_display_name_list; - extern struct frame *x_window_to_frame (struct w32_display_info *, HWND); struct w32_display_info *x_display_info_for_name (Lisp_Object); diff --git a/src/xfns.c b/src/xfns.c index 2b895642942..9cd7d3e6627 100644 --- a/src/xfns.c +++ b/src/xfns.c @@ -4242,20 +4242,13 @@ select_visual (struct x_display_info *dpyinfo) static struct x_display_info * x_display_info_for_name (Lisp_Object name) { - Lisp_Object names; struct x_display_info *dpyinfo; CHECK_STRING (name); - for (dpyinfo = x_display_list, names = x_display_name_list; - dpyinfo; - dpyinfo = dpyinfo->next, names = XCDR (names)) - { - Lisp_Object tem; - tem = Fstring_equal (XCAR (XCAR (names)), name); - if (!NILP (tem)) - return dpyinfo; - } + for (dpyinfo = x_display_list; dpyinfo; dpyinfo = dpyinfo->next) + if (!NILP (Fstring_equal (XCAR (dpyinfo->name_list_element), name))) + return dpyinfo; /* Use this general default value to start with. */ Vx_resource_name = Vinvocation_name; @@ -4338,11 +4331,11 @@ DEFUN ("x-display-list", Fx_display_list, Sx_display_list, 0, 0, 0, doc: /* Return the list of display names that Emacs has connections to. */) (void) { - Lisp_Object tail, result; + Lisp_Object result = Qnil; + struct x_display_info *xdi; - result = Qnil; - for (tail = x_display_name_list; CONSP (tail); tail = XCDR (tail)) - result = Fcons (XCAR (XCAR (tail)), result); + for (xdi = x_display_list; xdi; xdi = xdi->next) + result = Fcons (XCAR (xdi->name_list_element), result); return result; } diff --git a/src/xterm.c b/src/xterm.c index 9d1107e10bd..26ad5267625 100644 --- a/src/xterm.c +++ b/src/xterm.c @@ -148,13 +148,6 @@ static bool any_help_event_p; struct x_display_info *x_display_list; -/* This is a list of cons cells, each of the form (NAME - . FONT-LIST-CACHE), one for each element of x_display_list and in - the same order. NAME is the name of the frame. FONT-LIST-CACHE - records previous values returned by x-list-fonts. */ - -Lisp_Object x_display_name_list; - #ifdef USE_X_TOOLKIT /* The application context for Xt use. */ @@ -9894,11 +9887,9 @@ x_term_init (Lisp_Object display_name, char *xrm_option, char *resource_name) { struct x_display_info *share; - Lisp_Object tail; - for (share = x_display_list, tail = x_display_name_list; share; - share = share->next, tail = XCDR (tail)) - if (same_x_server (SSDATA (XCAR (XCAR (tail))), + for (share = x_display_list; share; share = share->next) + if (same_x_server (SSDATA (XCAR (share->name_list_element)), SSDATA (display_name))) break; if (share) @@ -9944,11 +9935,7 @@ x_term_init (Lisp_Object display_name, char *xrm_option, char *resource_name) dpyinfo->next = x_display_list; x_display_list = dpyinfo; - /* Put it on x_display_name_list as well, to keep them parallel. */ - x_display_name_list = Fcons (Fcons (display_name, Qnil), - x_display_name_list); - dpyinfo->name_list_element = XCAR (x_display_name_list); - + dpyinfo->name_list_element = Fcons (display_name, Qnil); dpyinfo->display = dpy; /* Set the name of the terminal. */ @@ -10275,27 +10262,6 @@ x_delete_display (struct x_display_info *dpyinfo) break; } - /* Discard this display from x_display_name_list and x_display_list. - We can't use Fdelq because that can quit. */ - if (! NILP (x_display_name_list) - && EQ (XCAR (x_display_name_list), dpyinfo->name_list_element)) - x_display_name_list = XCDR (x_display_name_list); - else - { - Lisp_Object tail; - - tail = x_display_name_list; - while (CONSP (tail) && CONSP (XCDR (tail))) - { - if (EQ (XCAR (XCDR (tail)), dpyinfo->name_list_element)) - { - XSETCDR (tail, XCDR (XCDR (tail))); - break; - } - tail = XCDR (tail); - } - } - if (next_noop_dpyinfo == dpyinfo) next_noop_dpyinfo = dpyinfo->next; @@ -10565,9 +10531,6 @@ syms_of_xterm (void) { x_error_message = NULL; - staticpro (&x_display_name_list); - x_display_name_list = Qnil; - DEFSYM (Qvendor_specific_keysyms, "vendor-specific-keysyms"); DEFSYM (Qlatin_1, "latin-1"); diff --git a/src/xterm.h b/src/xterm.h index 5ec4851a0e1..06c0d4882b8 100644 --- a/src/xterm.h +++ b/src/xterm.h @@ -142,8 +142,7 @@ struct x_display_info /* This says how to access this display in Xlib. */ Display *display; - /* This is a cons cell of the form (NAME . FONT-LIST-CACHE). - The same cons cell also appears in x_display_name_list. */ + /* This is a cons cell of the form (NAME . FONT-LIST-CACHE). */ Lisp_Object name_list_element; /* Number of frames that are on this display. */ @@ -412,12 +411,6 @@ extern int use_xim; /* This is a chain of structures for all the X displays currently in use. */ extern struct x_display_info *x_display_list; -/* This is a list of cons cells, each of the form (NAME . FONT-LIST-CACHE), - one for each element of x_display_list and in the same order. - NAME is the name of the frame. - FONT-LIST-CACHE records previous values returned by x-list-fonts. */ -extern Lisp_Object x_display_name_list; - extern struct x_display_info *x_display_info_for_display (Display *); extern struct frame *x_top_window_to_frame (struct x_display_info *, int); extern struct x_display_info *x_term_init (Lisp_Object, char *, char *); -- 2.39.2