mirror of
https://github.com/rkd77/elinks.git
synced 2025-02-02 15:09:23 -05:00
Merge branch 'elinks-0.12' into elinks-0.13
Conflicts: src/bfu/dialog.c src/bfu/hotkey.c src/bfu/inpfield.c src/dialogs/options.c src/document/renderer.c src/intl/gettext/libintl.h src/protocol/http/codes.c src/session/task.c src/terminal/event.c src/terminal/terminal.h src/viewer/text/form.c src/viewer/text/link.c And a semantic conflict in src/terminal/terminal.c.
This commit is contained in:
commit
687f19dbde
9
NEWS
9
NEWS
@ -75,10 +75,16 @@ ELinks 0.12pre2.GIT now:
|
||||
To be released as 0.12pre3, 0.12rc1, or even 0.12.0. This branch also
|
||||
includes the changes listed under ``ELinks 0.11.5.GIT'' below.
|
||||
|
||||
* critical: Fix assertion failure if IMG/@usemap refers to a different
|
||||
file.
|
||||
* Preserve newlines in hidden input fields, and submit them as CRLF.
|
||||
Previously, they could turn into spaces or disappear entirely.
|
||||
* Perl scripts can use modules that dynamically load C libraries, like
|
||||
XML::LibXML::SAX does.
|
||||
* bug 885: Convert xterm titles to ISO-8859-1 by default, but add an
|
||||
option to disable this. When removing control characters from a
|
||||
title, note the charset. Don't truncate titles to the width of the
|
||||
terminal.
|
||||
* enhancement: Updated ISO 8859-7, ISO 8859-16, KOI8-R, and MacRoman.
|
||||
|
||||
ELinks 0.12pre2:
|
||||
@ -301,11 +307,14 @@ ELinks 0.11.5.GIT now:
|
||||
|
||||
To be released as 0.11.6.
|
||||
|
||||
* critical: fix double-free crash if EOF immediately follows </MAP>
|
||||
* critical bug 1053: fix crash if a download finishes after ELinks has
|
||||
closed the terminal from which the download was started
|
||||
* major bug 1004: ignore locales when comparing HTML element names and
|
||||
similar strings, so e.g. ``title'' matches ``TITLE'' even in the
|
||||
Turkish locale
|
||||
* minor: clicking a link with the mouse activates that link, rather
|
||||
than the one selected with move-cursor-* actions
|
||||
|
||||
ELinks 0.11.5:
|
||||
--------------
|
||||
|
@ -323,7 +323,7 @@ select_button_by_key(struct dialog_data *dlg_data)
|
||||
|
||||
#ifdef CONFIG_UTF8
|
||||
key = unicode_fold_label_case(get_kbd_key(ev));
|
||||
codepage = get_opt_codepage_tree(dlg_data->win->term->spec, "charset", NULL);
|
||||
codepage = get_terminal_codepage(dlg_data->win->term);
|
||||
#else
|
||||
key = toupper(get_kbd_key(ev));
|
||||
#endif
|
||||
|
@ -127,7 +127,7 @@ check_hotkeys_common(struct menu *menu, term_event_char_T hotkey, struct termina
|
||||
{
|
||||
#ifdef CONFIG_UTF8
|
||||
unicode_val_T key = unicode_fold_label_case(hotkey);
|
||||
int codepage = get_opt_codepage_tree(term->spec, "charset", NULL);
|
||||
int codepage = get_terminal_codepage(term);
|
||||
#else
|
||||
unsigned char key = toupper(hotkey);
|
||||
#endif
|
||||
|
@ -692,9 +692,7 @@ kbd_field(struct dialog_data *dlg_data, struct widget_data *widget_data)
|
||||
/* get_kbd_key(ev) is UCS-4, and @text
|
||||
* is in the terminal's charset. */
|
||||
ins = u2cp_no_nbsp(get_kbd_key(ev),
|
||||
get_opt_codepage_tree(term->spec,
|
||||
"charset",
|
||||
NULL));
|
||||
get_terminal_codepage(term));
|
||||
inslen = strlen(ins);
|
||||
#endif /* CONFIG_UTF8 */
|
||||
|
||||
|
@ -847,6 +847,19 @@ static struct option_info config_options_info[] = {
|
||||
"3 is KOI-8\n"
|
||||
"4 is FreeBSD")),
|
||||
|
||||
INIT_OPT_BOOL("terminal._template_", N_("Always encode xterm title in ISO-8859-1"),
|
||||
"latin1_title", 0, 1,
|
||||
N_("When updating the window title of xterm or a similar "
|
||||
"terminal emulator, encode the title in ISO-8859-1 (Latin-1), "
|
||||
"rather than in the charset used for other text in the window. "
|
||||
"Cyrillic and other characters get replaced with Latin ones. "
|
||||
"Xterm requires this unless you explicitly enable UTF-8 "
|
||||
"titles in it.\n"
|
||||
"\n"
|
||||
"If this option does not take effect immediately, try switching "
|
||||
"to a different page so that ELinks notices it needs to update "
|
||||
"the title.")),
|
||||
|
||||
INIT_OPT_BOOL("terminal._template_", N_("Switch fonts for line drawing"),
|
||||
"m11_hack", 0, 0,
|
||||
N_("Switch fonts when drawing lines, enabling both local characters\n"
|
||||
|
@ -50,7 +50,7 @@ charset_list(struct terminal *term, void *xxx, void *ses_)
|
||||
int i, items;
|
||||
int sel = 0;
|
||||
const unsigned char *const sel_mime = get_cp_mime_name(
|
||||
get_opt_codepage_tree(term->spec, "charset", NULL));
|
||||
get_terminal_codepage(term));
|
||||
struct menu_item *mi = new_menu(FREE_LIST);
|
||||
|
||||
if (!mi) return;
|
||||
|
@ -493,12 +493,12 @@ display_window_title(struct session *ses, struct terminal *term)
|
||||
if (!title) return;
|
||||
|
||||
titlelen = strlen(title);
|
||||
if (last_ses != ses
|
||||
|| !status->last_title
|
||||
|| strlen(status->last_title) != titlelen
|
||||
|| memcmp(status->last_title, title, titlelen)) {
|
||||
if ((last_ses != ses
|
||||
|| !status->last_title
|
||||
|| strlen(status->last_title) != titlelen
|
||||
|| memcmp(status->last_title, title, titlelen))
|
||||
&& set_terminal_title(term, title) >= 0) {
|
||||
mem_free_set(&status->last_title, title);
|
||||
set_terminal_title(term, title);
|
||||
last_ses = ses;
|
||||
} else {
|
||||
mem_free(title);
|
||||
|
@ -619,6 +619,9 @@ look_for_tag(unsigned char **pos, unsigned char *eof,
|
||||
return 0;
|
||||
}
|
||||
|
||||
/** @return -1 if EOF is hit without the closing tag; 0 if the closing
|
||||
* tag is found (in which case this also adds *@a menu to *@a ml); or
|
||||
* 1 if this should be called again. */
|
||||
static int
|
||||
look_for_link(unsigned char **pos, unsigned char *eof, struct menu_item **menu,
|
||||
struct memory_list **ml, struct uri *href_base,
|
||||
@ -636,7 +639,7 @@ look_for_link(unsigned char **pos, unsigned char *eof, struct menu_item **menu,
|
||||
(*pos)++;
|
||||
}
|
||||
|
||||
if (*pos >= eof) return 0;
|
||||
if (*pos >= eof) return -1;
|
||||
|
||||
if (*pos + 2 <= eof && ((*pos)[1] == '!' || (*pos)[1] == '?')) {
|
||||
*pos = skip_comment(*pos, eof);
|
||||
@ -651,7 +654,7 @@ look_for_link(unsigned char **pos, unsigned char *eof, struct menu_item **menu,
|
||||
if (!c_strlcasecmp(name, namelen, "A", 1)) {
|
||||
while (look_for_tag(pos, eof, name, namelen, &label));
|
||||
|
||||
if (*pos >= eof) return 0;
|
||||
if (*pos >= eof) return -1;
|
||||
|
||||
} else if (!c_strlcasecmp(name, namelen, "AREA", 4)) {
|
||||
/* FIXME (bug 784): options->cp is the terminal charset;
|
||||
@ -769,6 +772,7 @@ get_image_map(unsigned char *head, unsigned char *pos, unsigned char *eof,
|
||||
{
|
||||
struct conv_table *ct;
|
||||
struct string hd;
|
||||
int look_result;
|
||||
|
||||
if (!init_string(&hd)) return -1;
|
||||
|
||||
@ -789,10 +793,13 @@ get_image_map(unsigned char *head, unsigned char *pos, unsigned char *eof,
|
||||
|
||||
*ml = NULL;
|
||||
|
||||
while (look_for_link(&pos, eof, menu, ml, uri, target_base, ct, options))
|
||||
;
|
||||
do {
|
||||
/* This call can modify both *ml and *menu. */
|
||||
look_result = look_for_link(&pos, eof, menu, ml, uri,
|
||||
target_base, ct, options);
|
||||
} while (look_result > 0);
|
||||
|
||||
if (pos >= eof) {
|
||||
if (look_result < 0) {
|
||||
freeml(*ml);
|
||||
mem_free(*menu);
|
||||
return -1;
|
||||
|
@ -457,8 +457,7 @@ render_document_frames(struct session *ses, int no_cache)
|
||||
if (!get_opt_bool_tree(ses->tab->term->spec, "underline", NULL))
|
||||
doc_opts.color_flags |= COLOR_ENHANCE_UNDERLINE;
|
||||
|
||||
doc_opts.cp = get_opt_codepage_tree(ses->tab->term->spec, "charset",
|
||||
NULL);
|
||||
doc_opts.cp = get_terminal_codepage(ses->tab->term);
|
||||
doc_opts.no_cache = no_cache & 1;
|
||||
doc_opts.gradual_rerendering = !!(no_cache & 2);
|
||||
|
||||
|
@ -255,7 +255,6 @@ encode_utf8(unicode_val_T u)
|
||||
return utf_buffer;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_UTF8
|
||||
/* Number of bytes utf8 character indexed by first byte. Illegal bytes are
|
||||
* equal ones and handled different. */
|
||||
static const char utf8char_len_tab[256] = {
|
||||
@ -269,6 +268,7 @@ static const char utf8char_len_tab[256] = {
|
||||
3,3,3,3,3,3,3,3, 3,3,3,3,3,3,3,3, 4,4,4,4,4,4,4,4, 5,5,5,5,6,6,1,1,
|
||||
};
|
||||
|
||||
#ifdef CONFIG_UTF8
|
||||
inline int utf8charlen(const unsigned char *p)
|
||||
{
|
||||
return p ? utf8char_len_tab[*p] : 0;
|
||||
@ -631,6 +631,7 @@ unicode_fold_label_case(unicode_val_T c)
|
||||
return c;
|
||||
#endif /* !(__STDC_ISO_10646__ && HAVE_WCTYPE_H) */
|
||||
}
|
||||
#endif /* CONFIG_UTF8 */
|
||||
|
||||
inline unicode_val_T
|
||||
utf8_to_unicode(unsigned char **string, const unsigned char *end)
|
||||
@ -715,7 +716,6 @@ invalid_utf8:
|
||||
*string = str + length;
|
||||
return u;
|
||||
}
|
||||
#endif /* CONFIG_UTF8 */
|
||||
|
||||
/* The common part of cp2u and cp2utf_8. */
|
||||
static unicode_val_T
|
||||
@ -754,9 +754,8 @@ cp2utf8(int from, int c)
|
||||
return encode_utf8(cp2u_shared(&codepages[from], c));
|
||||
}
|
||||
|
||||
#ifdef CONFIG_UTF8
|
||||
unicode_val_T
|
||||
cp_to_unicode(int codepage, unsigned char **string, unsigned char *end)
|
||||
cp_to_unicode(int codepage, unsigned char **string, const unsigned char *end)
|
||||
{
|
||||
unicode_val_T ret;
|
||||
|
||||
@ -770,7 +769,6 @@ cp_to_unicode(int codepage, unsigned char **string, unsigned char *end)
|
||||
++*string;
|
||||
return ret;
|
||||
}
|
||||
#endif /* CONFIG_UTF8 */
|
||||
|
||||
|
||||
#ifdef CONFIG_COMBINE
|
||||
|
@ -154,9 +154,9 @@ unsigned char *utf8_step_backward(unsigned char *, unsigned char *,
|
||||
inline int unicode_to_cell(unicode_val_T);
|
||||
unicode_val_T unicode_fold_label_case(unicode_val_T);
|
||||
inline int strlen_utf8(unsigned char **);
|
||||
inline unicode_val_T utf8_to_unicode(unsigned char **, const unsigned char *);
|
||||
unicode_val_T cp_to_unicode(int, unsigned char **, unsigned char *);
|
||||
#endif /* CONFIG_UTF8 */
|
||||
inline unicode_val_T utf8_to_unicode(unsigned char **, const unsigned char *);
|
||||
unicode_val_T cp_to_unicode(int, unsigned char **, const unsigned char *);
|
||||
|
||||
#ifdef CONFIG_COMBINE
|
||||
extern unicode_val_T last_combined;
|
||||
|
@ -61,7 +61,7 @@ extern int current_charset;
|
||||
static inline void
|
||||
intl_set_charset(struct terminal *term)
|
||||
{
|
||||
int new_charset = get_opt_codepage_tree(term->spec, "charset", NULL);
|
||||
int new_charset = get_terminal_codepage(term);
|
||||
|
||||
/* Prevent useless switching. */
|
||||
if (current_charset != new_charset) {
|
||||
|
@ -303,7 +303,7 @@ get_window_title(void)
|
||||
}
|
||||
|
||||
void
|
||||
set_window_title(unsigned char *title)
|
||||
set_window_title(unsigned char *title, int codepage)
|
||||
{
|
||||
#ifndef DEBUG_OS2
|
||||
static PTIB tib;
|
||||
|
@ -407,73 +407,71 @@ set_clipboard_text(unsigned char *data)
|
||||
|
||||
/* Set xterm-like term window's title. */
|
||||
void
|
||||
set_window_title(unsigned char *title)
|
||||
set_window_title(unsigned char *title, int codepage)
|
||||
{
|
||||
unsigned char *s;
|
||||
int xsize, ysize;
|
||||
int j = 0;
|
||||
struct string filtered;
|
||||
|
||||
#ifndef HAVE_SYS_CYGWIN_H
|
||||
/* Check if we're in a xterm-like terminal. */
|
||||
if (!is_xterm() && !is_gnuscreen()) return;
|
||||
#endif
|
||||
|
||||
/* Retrieve terminal dimensions. */
|
||||
get_terminal_size(0, &xsize, &ysize);
|
||||
if (!init_string(&filtered)) return;
|
||||
|
||||
/* Check if terminal width is reasonnable. */
|
||||
if (xsize < 1 || xsize > 1024) return;
|
||||
|
||||
/* Allocate space for title + 3 ending points + null char. */
|
||||
s = mem_alloc(xsize + 3 + 1);
|
||||
if (!s) return;
|
||||
|
||||
/* Copy title to s if different from NULL */
|
||||
/* Copy title to filtered if different from NULL */
|
||||
if (title) {
|
||||
int i;
|
||||
unsigned char *scan = title;
|
||||
unsigned char *end = title + strlen(title);
|
||||
|
||||
/* We limit title length to terminal width and ignore control
|
||||
* chars if any. Note that in most cases window decoration
|
||||
* reduces printable width, so it's just a precaution. */
|
||||
/* Remove control characters, so that they cannot
|
||||
* interfere with the command we send to the terminal.
|
||||
* However, do not attempt to limit the title length
|
||||
* to terminal width, because the title is usually
|
||||
* drawn in a different font anyway. */
|
||||
/* Note that this is the right place where to do it, since
|
||||
* potential alternative set_window_title() routines might
|
||||
* want to take different precautions. */
|
||||
for (i = 0; title[i] && i < xsize; i++) {
|
||||
/* 0x80 .. 0x9f are ISO-8859-* control characters.
|
||||
* In some other encodings they could be used for
|
||||
* legitimate characters, though (ie. in Kamenicky).
|
||||
* We should therefore maybe check for these only
|
||||
* if the terminal is running in an ISO- encoding. */
|
||||
if (iscntrl(title[i]) || (title[i] & 0x7f) < 0x20
|
||||
|| title[i] == 0x7f)
|
||||
for (;;) {
|
||||
unsigned char *charbegin = scan;
|
||||
unicode_val_T unicode
|
||||
= cp_to_unicode(codepage, &scan, end);
|
||||
int charlen = scan - charbegin;
|
||||
|
||||
if (unicode == UCS_NO_CHAR)
|
||||
break;
|
||||
|
||||
/* This need not recognize all Unicode control
|
||||
* characters. Only those that can make the
|
||||
* terminal misparse the command. */
|
||||
if (unicode < 0x20
|
||||
|| (unicode >= 0x7F && unicode < 0xA0))
|
||||
continue;
|
||||
|
||||
s[j++] = title[i];
|
||||
}
|
||||
/* xterm entirely rejects 1024-byte or longer
|
||||
* titles. */
|
||||
if (filtered.length + charlen >= 1024 - 3) {
|
||||
add_to_string(&filtered, "...");
|
||||
break;
|
||||
}
|
||||
|
||||
/* If title is truncated, add "..." */
|
||||
if (i == xsize) {
|
||||
s[j++] = '.';
|
||||
s[j++] = '.';
|
||||
s[j++] = '.';
|
||||
add_bytes_to_string(&filtered, charbegin, charlen);
|
||||
}
|
||||
}
|
||||
s[j] = '\0';
|
||||
|
||||
/* Send terminal escape sequence + title string */
|
||||
printf("\033]0;%s\a", s);
|
||||
printf("\033]0;%s\a", filtered.source);
|
||||
|
||||
#if 0
|
||||
/* Miciah don't like this so it is disabled because it changes the
|
||||
* default window name. --jonas */
|
||||
/* Set the GNU screen window name */
|
||||
if (is_gnuscreen())
|
||||
printf("\033k%s\033\134", s);
|
||||
printf("\033k%s\033\134", filtered.source);
|
||||
#endif
|
||||
|
||||
fflush(stdout);
|
||||
|
||||
mem_free(s);
|
||||
done_string(&filtered);
|
||||
}
|
||||
|
||||
#ifdef HAVE_X11
|
||||
|
@ -38,7 +38,7 @@ void resume_mouse(void *);
|
||||
int start_thread(void (*)(void *, int), void *, int);
|
||||
unsigned char *get_clipboard_text(void);
|
||||
void set_clipboard_text(unsigned char *);
|
||||
void set_window_title(unsigned char *);
|
||||
void set_window_title(unsigned char *, int codepage);
|
||||
unsigned char *get_window_title(void);
|
||||
void block_stdin(void);
|
||||
void unblock_stdin(void);
|
||||
|
@ -171,8 +171,7 @@ show_http_error_document(struct session *ses, void *data)
|
||||
if (str) {
|
||||
/* The codepage that _("foo", term) used when it was
|
||||
* called by get_http_error_document. */
|
||||
const int gettext_codepage
|
||||
= get_opt_codepage_tree(term->spec, "charset", NULL);
|
||||
const int gettext_codepage = get_terminal_codepage(term);
|
||||
|
||||
if (cached) delete_entry_content(cache);
|
||||
|
||||
|
@ -518,17 +518,23 @@ maybe_pre_format_html(struct cache_entry *cached, struct session *ses)
|
||||
* were 0, it could then be freed, and the
|
||||
* cached->preformatted assignment at the end of this function
|
||||
* would crash. Normally, the document has a reference to the
|
||||
* cache entry, and that suffices. If the following assertion
|
||||
* ever fails, object_lock(cached) and object_unlock(cached)
|
||||
* must be added to this function. */
|
||||
assert(cached->object.refcount > 0);
|
||||
if_assert_failed return;
|
||||
* cache entry, and that suffices. However, if the cache
|
||||
* entry was loaded to satisfy e.g. USEMAP="imgmap.html#map",
|
||||
* then cached->object.refcount == 0 here, and must be
|
||||
* incremented.
|
||||
*
|
||||
* cached->object.refcount == 0 is safe while the cache entry
|
||||
* is being loaded, because garbage_collection() calls
|
||||
* is_entry_used(), which checks whether any connection is
|
||||
* using the cache entry. But loading has ended before this
|
||||
* point. */
|
||||
object_lock(cached);
|
||||
|
||||
fragment = get_cache_fragment(cached);
|
||||
if (!fragment) return;
|
||||
if (!fragment) goto unlock_and_return;
|
||||
|
||||
/* We cannot do anything if the data are fragmented. */
|
||||
if (!list_is_singleton(cached->frag)) return;
|
||||
if (!list_is_singleton(cached->frag)) goto unlock_and_return;
|
||||
|
||||
set_event_id(pre_format_html_event, "pre-format-html");
|
||||
trigger_event(pre_format_html_event, ses, cached);
|
||||
@ -536,6 +542,9 @@ maybe_pre_format_html(struct cache_entry *cached, struct session *ses)
|
||||
/* XXX: Keep this after the trigger_event, because hooks might call
|
||||
* normalize_cache_entry()! */
|
||||
cached->preformatted = 1;
|
||||
|
||||
unlock_and_return:
|
||||
object_unlock(cached);
|
||||
}
|
||||
#endif
|
||||
|
||||
|
@ -388,7 +388,7 @@ ses_imgmap(struct session *ses)
|
||||
&menu, &ml, ses->loading_uri,
|
||||
&doc_view->document->options,
|
||||
ses->task.target.frame,
|
||||
get_opt_codepage_tree(ses->tab->term->spec, "charset", NULL),
|
||||
get_terminal_codepage(ses->tab->term),
|
||||
get_opt_codepage("document.codepage.assume", ses),
|
||||
get_opt_bool("document.codepage.force_assumed", ses)))
|
||||
return;
|
||||
|
@ -149,8 +149,7 @@ term_send_ucs(struct terminal *term, unicode_val_T u,
|
||||
const unsigned char *recoded;
|
||||
|
||||
set_kbd_term_event(&ev, KBD_UNDEF, modifier);
|
||||
recoded = u2cp_no_nbsp(u, get_opt_codepage_tree(term->spec, "charset",
|
||||
NULL));
|
||||
recoded = u2cp_no_nbsp(u, get_terminal_codepage(term));
|
||||
if (!recoded) recoded = "*";
|
||||
while (*recoded) {
|
||||
ev.info.keyboard.key = *recoded;
|
||||
@ -186,8 +185,7 @@ check_terminal_name(struct terminal *term, struct terminal_info *info)
|
||||
/* Probably not best place for set this. But now we finally have
|
||||
* term->spec and term->utf8 should be set before decode session info.
|
||||
* --Scrool */
|
||||
term->utf8_cp = is_cp_utf8(get_opt_codepage_tree(term->spec,
|
||||
"charset", NULL));
|
||||
term->utf8_cp = is_cp_utf8(get_terminal_codepage(term));
|
||||
/* Force UTF-8 I/O if the UTF-8 charset is selected. Various
|
||||
* places assume that the terminal's charset is unibyte if
|
||||
* UTF-8 I/O is disabled. (bug 827) */
|
||||
|
@ -101,6 +101,7 @@ struct itrm {
|
||||
unsigned char *orig_title; /**< For restoring window title */
|
||||
|
||||
int verase; /**< Byte to map to KBD_BS, or -1 */
|
||||
int title_codepage; /**< Codepage of terminal title */
|
||||
unsigned int blocked:1; /**< Whether it was blocked */
|
||||
unsigned int altscreen:1; /**< Whether to use alternate screen */
|
||||
unsigned int touched_title:1; /**< Whether the term title was changed */
|
||||
|
@ -331,6 +331,11 @@ handle_trm(int std_in, int std_out, int sock_in, int sock_out, int ctl_in,
|
||||
itrm->timer = TIMER_ID_UNDEF;
|
||||
itrm->remote = !!remote;
|
||||
|
||||
/* If the master does not tell which charset it's using in
|
||||
* this terminal, assume it's some ISO 8859. Because that's
|
||||
* what older versions of ELinks did. */
|
||||
itrm->title_codepage = get_cp_index("ISO-8859-1");
|
||||
|
||||
/* FIXME: Combination altscreen + xwin does not work as it should,
|
||||
* mouse clicks are reportedly partially ignored. */
|
||||
if (info.system_env & (ENV_SCREEN | ENV_XWIN))
|
||||
@ -424,7 +429,7 @@ free_itrm(struct itrm *itrm)
|
||||
|
||||
if (!itrm->remote) {
|
||||
if (itrm->orig_title && *itrm->orig_title) {
|
||||
set_window_title(itrm->orig_title);
|
||||
set_window_title(itrm->orig_title, itrm->title_codepage);
|
||||
|
||||
} else if (itrm->touched_title) {
|
||||
/* Set the window title to the value of $TERM if X11
|
||||
@ -434,7 +439,8 @@ free_itrm(struct itrm *itrm)
|
||||
|
||||
get_terminal_name(title);
|
||||
if (*title)
|
||||
set_window_title(title);
|
||||
set_window_title(title,
|
||||
get_cp_index("US-ASCII"));
|
||||
}
|
||||
|
||||
|
||||
@ -507,7 +513,12 @@ dispatch_special(unsigned char *text)
|
||||
ditrm->orig_title = get_window_title();
|
||||
ditrm->touched_title = 1;
|
||||
}
|
||||
set_window_title(text + 1);
|
||||
/* TODO: Is it really possible to get here with
|
||||
* ditrm == NULL, and which charset would then
|
||||
* be most appropriate? */
|
||||
set_window_title(text + 1,
|
||||
ditrm ? ditrm->title_codepage
|
||||
: get_cp_index("US-ASCII"));
|
||||
break;
|
||||
case TERM_FN_RESIZE:
|
||||
if (ditrm && ditrm->remote)
|
||||
@ -515,6 +526,18 @@ dispatch_special(unsigned char *text)
|
||||
|
||||
resize_terminal_from_str(text + 1);
|
||||
break;
|
||||
case TERM_FN_TITLE_CODEPAGE:
|
||||
if (ditrm) {
|
||||
int cp = get_cp_index(text + 1);
|
||||
|
||||
/* If the master sends the name of an
|
||||
* unrecognized charset, assume only
|
||||
* that it's ASCII compatible. */
|
||||
if (cp == -1)
|
||||
cp = get_cp_index("US-ASCII");
|
||||
ditrm->title_codepage = cp;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -118,6 +118,24 @@ init_term(int fdin, int fdout)
|
||||
return term;
|
||||
}
|
||||
|
||||
/** Get the codepage of a terminal. The UTF-8 I/O option does not
|
||||
* affect this.
|
||||
*
|
||||
* @todo Perhaps cache the value in struct terminal?
|
||||
*
|
||||
* @bug Bug 1064: If the charset has been set as "System", this should
|
||||
* apply the locale environment variables of the slave ELinks process,
|
||||
* not those of the master ELinks process that parsed the configuration
|
||||
* file. That is why the parameter points to struct terminal and not
|
||||
* merely to its option tree (term->spec).
|
||||
*
|
||||
* @see get_translation_table(), get_cp_mime_name() */
|
||||
int
|
||||
get_terminal_codepage(const struct terminal *term)
|
||||
{
|
||||
return get_opt_codepage_tree(term->spec, "charset", NULL);
|
||||
}
|
||||
|
||||
void
|
||||
redraw_all_terminals(void)
|
||||
{
|
||||
@ -371,12 +389,44 @@ do_terminal_function(struct terminal *term, unsigned char code,
|
||||
fmem_free(x_data);
|
||||
}
|
||||
|
||||
void
|
||||
/** @return negative on error; zero or positive on success. */
|
||||
int
|
||||
set_terminal_title(struct terminal *term, unsigned char *title)
|
||||
{
|
||||
if (term->title && !strcmp(title, term->title)) return;
|
||||
int from_cp;
|
||||
int to_cp;
|
||||
unsigned char *converted = NULL;
|
||||
|
||||
if (term->title && !strcmp(title, term->title)) return 0;
|
||||
|
||||
/* In which codepage was the title parameter given? */
|
||||
from_cp = get_terminal_codepage(term);
|
||||
|
||||
/* In which codepage does the terminal want the title? */
|
||||
if (get_opt_bool_tree(term->spec, "latin1_title", NULL))
|
||||
to_cp = get_cp_index("ISO-8859-1");
|
||||
else if (get_opt_bool_tree(term->spec, "utf_8_io", NULL))
|
||||
to_cp = get_cp_index("UTF-8");
|
||||
else
|
||||
to_cp = from_cp;
|
||||
|
||||
if (from_cp != to_cp) {
|
||||
struct conv_table *convert_table;
|
||||
|
||||
convert_table = get_translation_table(from_cp, to_cp);
|
||||
if (!convert_table) return -1;
|
||||
converted = convert_string(convert_table, title, strlen(title),
|
||||
to_cp, CSM_NONE, NULL, NULL, NULL);
|
||||
if (!converted) return -1;
|
||||
}
|
||||
|
||||
mem_free_set(&term->title, stracpy(title));
|
||||
do_terminal_function(term, TERM_FN_TITLE, title);
|
||||
do_terminal_function(term, TERM_FN_TITLE_CODEPAGE,
|
||||
get_cp_mime_name(to_cp));
|
||||
do_terminal_function(term, TERM_FN_TITLE,
|
||||
converted ? converted : title);
|
||||
mem_free_if(converted);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int terminal_pipe[2];
|
||||
|
@ -179,6 +179,7 @@ void redraw_terminal(struct terminal *term);
|
||||
void redraw_terminal_cls(struct terminal *term);
|
||||
void cls_redraw_all_terminals(void);
|
||||
struct terminal *get_default_terminal(void);
|
||||
int get_terminal_codepage(const struct terminal *);
|
||||
|
||||
void redraw_all_terminals(void);
|
||||
void destroy_all_terminals(void);
|
||||
@ -191,12 +192,14 @@ void close_handle(void *);
|
||||
void assert_terminal_ptr_not_dangling(const struct terminal *);
|
||||
#endif
|
||||
|
||||
/** Operations that can be requested with do_terminal_function().
|
||||
/** Operations that can be requested with do_terminal_function() in
|
||||
* the master and then executed with dispatch_special() in a slave.
|
||||
* The interlink protocol passes these values as one byte in a
|
||||
* null-terminated string, so zero cannot be used. */
|
||||
enum {
|
||||
TERM_FN_TITLE = 1,
|
||||
TERM_FN_RESIZE = 2
|
||||
TERM_FN_TITLE = 1,
|
||||
TERM_FN_RESIZE = 2,
|
||||
TERM_FN_TITLE_CODEPAGE = 3
|
||||
};
|
||||
|
||||
/** How to execute a program in a terminal. These values are used in
|
||||
@ -217,7 +220,7 @@ enum term_exec {
|
||||
void exec_on_terminal(struct terminal *, unsigned char *, unsigned char *, enum term_exec);
|
||||
void exec_shell(struct terminal *term);
|
||||
|
||||
void set_terminal_title(struct terminal *, unsigned char *);
|
||||
int set_terminal_title(struct terminal *, unsigned char *);
|
||||
void do_terminal_function(struct terminal *, unsigned char, unsigned char *);
|
||||
|
||||
int check_terminal_pipes(void);
|
||||
|
@ -313,21 +313,11 @@ add_cp_html_to_string(struct string *string, int src_codepage,
|
||||
const unsigned char *const end = src + len;
|
||||
unicode_val_T unicode;
|
||||
|
||||
while (src != end) {
|
||||
if (is_cp_utf8(src_codepage)) {
|
||||
#ifdef CONFIG_UTF8
|
||||
unicode = utf8_to_unicode((unsigned char **) &src,
|
||||
end);
|
||||
if (unicode == UCS_NO_CHAR)
|
||||
break;
|
||||
#else /* !CONFIG_UTF8 */
|
||||
/* Cannot parse UTF-8 without CONFIG_UTF8.
|
||||
* Pretend the input is ISO-8859-1 instead. */
|
||||
unicode = *src++;
|
||||
#endif /* !CONFIG_UTF8 */
|
||||
} else {
|
||||
unicode = cp2u(src_codepage, *src++);
|
||||
}
|
||||
for (;;) {
|
||||
unicode = cp_to_unicode(src_codepage,
|
||||
(unsigned char **) &src, end);
|
||||
if (unicode == UCS_NO_CHAR)
|
||||
break;
|
||||
|
||||
if (unicode < 0x20 || unicode >= 0x7F
|
||||
|| unicode == '<' || unicode == '>' || unicode == '&'
|
||||
|
@ -177,7 +177,7 @@ init_form_state(struct document_view *doc_view,
|
||||
|
||||
doc_cp = doc_view->document->cp;
|
||||
term = doc_view->session->tab->term;
|
||||
viewer_cp = get_opt_codepage_tree(term->spec, "charset", NULL);
|
||||
viewer_cp = get_terminal_codepage(term);
|
||||
|
||||
mem_free_set(&fs->value, NULL);
|
||||
|
||||
@ -1235,7 +1235,7 @@ get_form_uri(struct session *ses, struct document_view *doc_view,
|
||||
|
||||
get_successful_controls(doc_view, fc, &submit);
|
||||
|
||||
cp_from = get_opt_codepage_tree(ses->tab->term->spec, "charset", NULL);
|
||||
cp_from = get_terminal_codepage(ses->tab->term);
|
||||
cp_to = doc_view->document->cp;
|
||||
switch (form->method) {
|
||||
case FORM_METHOD_GET:
|
||||
@ -1868,9 +1868,7 @@ field_op(struct session *ses, struct document_view *doc_view,
|
||||
#ifdef CONFIG_UTF8
|
||||
/* fs->value is in the charset of the terminal. */
|
||||
ctext = u2cp_no_nbsp(get_kbd_key(ev),
|
||||
get_opt_codepage_tree(ses->tab->term->spec,
|
||||
"charset",
|
||||
NULL));
|
||||
get_terminal_codepage(ses->tab->term));
|
||||
length = strlen(ctext);
|
||||
|
||||
if (strlen(fs->value) + length > fc->maxlength
|
||||
|
@ -1214,8 +1214,7 @@ try_document_key(struct session *ses, struct document_view *doc_view,
|
||||
#ifdef CONFIG_UTF8
|
||||
key = get_kbd_key(ev);
|
||||
#else /* !CONFIG_UTF8 */
|
||||
key = cp2u(get_opt_codepage_tree(ses->tab->term->spec,
|
||||
"charset", NULL),
|
||||
key = cp2u(get_terminal_codepage(ses->tab->term),
|
||||
get_kbd_key(ev));
|
||||
#endif /* !CONFIG_UTF8 */
|
||||
/* If @key now is 0 (which is used in link.accesskey if there
|
||||
|
@ -1169,6 +1169,7 @@ frame_ev_mouse(struct session *ses, struct document_view *doc_view, struct term_
|
||||
enum frame_event_status status = FRAME_EVENT_REFRESH;
|
||||
|
||||
doc_view->vs->current_link = link - doc_view->document->links;
|
||||
ses->navigate_mode = NAVIGATE_LINKWISE;
|
||||
|
||||
if (!link_is_textinput(link)) {
|
||||
|
||||
|
BIN
test/image.png
Normal file
BIN
test/image.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 2.1 KiB |
@ -1,11 +1,11 @@
|
||||
<html>
|
||||
<body>
|
||||
<IMG SRC="image.gif" ALT="ImageMap" USEMAP="#map">
|
||||
<IMG SRC="image.png" ALT="ImageMap" USEMAP="#map">
|
||||
<map name="map">
|
||||
<AREA SHAPE="rect" HREF="align.html" alt="1">
|
||||
<AREA SHAPE="rect" HREF="color.html" alt="2">
|
||||
<AREA SHAPE="rect" HREF="underline.html" alt="3">
|
||||
<AREA SHAPE="rect" HREF="poocs.net.html" name="91" alt="4">
|
||||
<AREA SHAPE="poly" COORDS="24,26, 30,30, 22,40, 15,35, 24,26" HREF="href_tests.html" alt="1">
|
||||
<AREA SHAPE="poly" COORDS="21,21, 38,10, 34,19, 39,29, 21,21" HREF="color.html" alt="2">
|
||||
<AREA SHAPE="rect" COORDS="12,1, 30,18" HREF="underline.html" alt="3">
|
||||
<AREA SHAPE="circle" COORDS="9.5,22, 9" HREF="nbsp.html" name="91" alt="4">
|
||||
</map>
|
||||
</body>
|
||||
</html>
|
||||
|
6
test/imgmap2.html
Normal file
6
test/imgmap2.html
Normal file
@ -0,0 +1,6 @@
|
||||
<TITLE>Crashes in client-side image maps</TITLE>
|
||||
<P><IMG src="image.png" usemap="imgmap.html#map" alt="ImageMap"> in another file</P>
|
||||
<P><IMG src="image.png" usemap="#at_eof" alt="ImageMap"> at the very end of this file</P>
|
||||
<MAP name="at_eof">
|
||||
<AREA shape="rect" coords="12,1, 30,18" href="http://elinks.cz/" alt="see this?">
|
||||
<!-- no newline at the end of this line --></MAP>
|
Loading…
x
Reference in New Issue
Block a user