X-Git-Url: https://code.delx.au/gnu-emacs/blobdiff_plain/a660037698bce151915e6e084593071134df1331..9a8edcd9aba1650f68d7aea373bab65322585337:/src/terminal.c diff --git a/src/terminal.c b/src/terminal.c index b48d0623e1..5dd9975a6f 100644 --- a/src/terminal.c +++ b/src/terminal.c @@ -1,12 +1,12 @@ /* Functions related to terminal devices. - Copyright (C) 2005-2015 Free Software Foundation, Inc. + Copyright (C) 2005-2016 Free Software Foundation, Inc. This file is part of GNU Emacs. GNU Emacs is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by -the Free Software Foundation, either version 3 of the License, or -(at your option) any later version. +the Free Software Foundation, either version 3 of the License, or (at +your option) any later version. GNU Emacs is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of @@ -21,13 +21,18 @@ along with GNU Emacs. If not, see . */ #include #include "lisp.h" +#include "character.h" #include "frame.h" #include "termchar.h" #include "termhooks.h" -#include "charset.h" -#include "coding.h" #include "keyboard.h" +#if HAVE_STRUCT_UNIPAIR_UNICODE +# include +# include +# include +#endif + /* Chain of all terminals currently in use. */ struct terminal *terminal_list; @@ -526,6 +531,65 @@ selected frame's terminal). */) return store_terminal_param (decode_live_terminal (terminal), parameter, value); } +#if HAVE_STRUCT_UNIPAIR_UNICODE + +/* Compute the glyph code table for T. */ + +static void +calculate_glyph_code_table (struct terminal *t) +{ + Lisp_Object glyphtab = Qt; + enum { initial_unipairs = 1000 }; + int entry_ct = initial_unipairs; + struct unipair unipair_buffer[initial_unipairs]; + struct unipair *entries = unipair_buffer; + struct unipair *alloced = 0; + + while (true) + { + int fd = fileno (t->display_info.tty->output); + struct unimapdesc unimapdesc = { entry_ct, entries }; + if (ioctl (fd, GIO_UNIMAP, &unimapdesc) == 0) + { + glyphtab = Fmake_char_table (Qnil, make_number (-1)); + for (int i = 0; i < unimapdesc.entry_ct; i++) + char_table_set (glyphtab, entries[i].unicode, + make_number (entries[i].fontpos)); + break; + } + if (errno != ENOMEM) + break; + entry_ct = unimapdesc.entry_ct; + entries = alloced = xrealloc (alloced, entry_ct * sizeof *alloced); + } + + xfree (alloced); + t->glyph_code_table = glyphtab; +} +#endif + +/* Return the glyph code in T of character CH, or -1 if CH does not + have a font position in T, or nil if T does not report glyph codes. */ + +Lisp_Object +terminal_glyph_code (struct terminal *t, int ch) +{ +#if HAVE_STRUCT_UNIPAIR_UNICODE + if (t->type == output_termcap) + { + /* As a hack, recompute the table when CH is the maximum + character. */ + if (NILP (t->glyph_code_table) || ch == MAX_CHAR) + calculate_glyph_code_table (t); + + if (! EQ (t->glyph_code_table, Qt)) + return char_table_ref (t->glyph_code_table, ch); + } +#endif + + return Qnil; +} + /* Initial frame has no device-dependent output data, but has face cache which should be freed when the frame is deleted. */