1
0
mirror of https://github.com/rkd77/elinks.git synced 2024-12-04 14:46:47 -05:00

Add support for ECMA-48 SGR italic

Add 'Italic' checkbox to Terminal options dialog box.

Enable italic text by default for rxvt-unicode (and also enable
frames, 88-colour mode, and underline).
This commit is contained in:
Miciah Dashiel Butler Masters 2009-01-01 19:59:57 +00:00
parent d6116ca83a
commit 3334efb32c
4 changed files with 78 additions and 3 deletions

View File

@ -761,6 +761,14 @@ register_autocreated_options(void)
get_opt_int("terminal.xterm-88color.colors", NULL) = COLOR_MODE_88;
get_opt_bool("terminal.xterm-88color.underline", NULL) = 1;
#endif
get_opt_int("terminal.rxvt-unicode.type", NULL) = 1;
#ifdef CONFIG_88_COLORS
get_opt_int("terminal.rxvt-unicode.colors", NULL) = COLOR_MODE_88;
#else
get_opt_int("terminal.rxvt-unicode.colors", NULL) = COLOR_MODE_16;
#endif
get_opt_bool("terminal.rxvt-unicode.italic", NULL) = 1;
get_opt_bool("terminal.rxvt-unicode.underline", NULL) = 1;
#ifdef CONFIG_256_COLORS
get_opt_int("terminal.xterm-256color.type", NULL) = TERM_VT100;
get_opt_int("terminal.xterm-256color.colors", NULL) = COLOR_MODE_256;

View File

@ -981,6 +981,10 @@ static struct option_info config_options_info[] = {
"Note that this option makes sense only when colors are "
"enabled.")),
INIT_OPT_BOOL("terminal._template_", N_("Italic"),
"italic", 0, 0,
N_("If we should use italics.")),
INIT_OPT_BOOL("terminal._template_", N_("Underline"),
"underline", 0, 0,
N_("If we should use underline or enhance the color "

View File

@ -91,6 +91,7 @@ enum termopt {
TERM_OPT_UTF_8_IO,
TERM_OPT_TRANSPARENCY,
TERM_OPT_UNDERLINE,
TERM_OPT_ITALIC,
#ifdef CONFIG_COMBINE
TERM_OPT_COMBINE,
#endif
@ -107,6 +108,7 @@ static struct option_resolver resolvers[] = {
{ TERM_OPT_TRANSPARENCY, "transparency" },
{ TERM_OPT_UTF_8_IO, "utf_8_io" },
{ TERM_OPT_UNDERLINE, "underline" },
{ TERM_OPT_ITALIC, "italic" },
#ifdef CONFIG_COMBINE
{ TERM_OPT_COMBINE, "combine" },
#endif
@ -228,6 +230,7 @@ terminal_options(struct terminal *term, void *xxx, struct session *ses)
add_dlg_checkbox(dlg, _("Switch fonts for line drawing", term), &values[TERM_OPT_M11_HACK].number);
add_dlg_checkbox(dlg, _("Restrict frames in cp850/852", term), &values[TERM_OPT_RESTRICT_852].number);
add_dlg_checkbox(dlg, _("Block cursor", term), &values[TERM_OPT_BLOCK_CURSOR].number);
add_dlg_checkbox(dlg, _("Italic", term), &values[TERM_OPT_ITALIC].number);
add_dlg_checkbox(dlg, _("Transparency", term), &values[TERM_OPT_TRANSPARENCY].number);
add_dlg_checkbox(dlg, _("Underline", term), &values[TERM_OPT_UNDERLINE].number);
add_dlg_checkbox(dlg, _("UTF-8 I/O", term), &values[TERM_OPT_UTF_8_IO].number);

View File

@ -174,6 +174,16 @@ static const struct string vt100_frame_seqs[] = {
/* begin border: */ TERM_STRING("\x0e"),
};
/** Italic begin/end sequences using ECMA-48 SGR.
* ECMA-48: CSI Ps... 06/13 = SGR - SELECT GRAPHIC RENDITION
* - Ps = 3 = italicized
* - Ps = 20 = Fraktur (Gothic)
* - Ps = 23 = not italicized, not fraktur */
static const struct string italic_seqs[] = {
/* end italics: */ TERM_STRING("\033[23m"),
/* begin italics: */ TERM_STRING("\033[3m"),
};
/** Underline begin/end sequences using ECMA-48 SGR.
* ECMA-48: CSI Ps... 06/13 = SGR - SELECT GRAPHIC RENDITION
* - Ps = 4 = singly underlined
@ -223,6 +233,9 @@ struct screen_driver {
/** The frame mode setup and teardown sequences. May be NULL. */
const struct string *frame_seqs;
/** The italic mode setup and teardown sequences. May be NULL. */
const struct string *italic;
/** The underline mode setup and teardown sequences. May be NULL. */
const struct string *underline;
@ -257,6 +270,7 @@ static const struct screen_driver_opt dumb_screen_driver_opt = {
/* charsets: */ { -1, -1 }, /* No UTF8 I/O */
/* frame: */ frame_dumb,
/* frame_seqs: */ NULL,
/* italic: */ italic_seqs,
/* underline: */ underline_seqs,
/* color_mode: */ COLOR_MODE_16,
#if defined(CONFIG_88_COLORS) || defined(CONFIG_256_COLORS)
@ -276,6 +290,7 @@ static const struct screen_driver_opt vt100_screen_driver_opt = {
/* charsets: */ { -1, -1 }, /* No UTF8 I/O */
/* frame: */ frame_vt100,
/* frame_seqs: */ vt100_frame_seqs,
/* italic: */ italic_seqs,
/* underline: */ underline_seqs,
/* color_mode: */ COLOR_MODE_16,
#if defined(CONFIG_88_COLORS) || defined(CONFIG_256_COLORS)
@ -295,6 +310,7 @@ static const struct screen_driver_opt linux_screen_driver_opt = {
/* charsets: */ { -1, -1 }, /* No UTF8 I/O */
/* frame: */ NULL, /* No restrict_852 */
/* frame_seqs: */ NULL, /* No m11_hack */
/* italic: */ italic_seqs,
/* underline: */ underline_seqs,
/* color_mode: */ COLOR_MODE_16,
#if defined(CONFIG_88_COLORS) || defined(CONFIG_256_COLORS)
@ -314,6 +330,7 @@ static const struct screen_driver_opt koi8_screen_driver_opt = {
/* charsets: */ { -1, -1 }, /* No UTF8 I/O */
/* frame: */ frame_koi,
/* frame_seqs: */ NULL,
/* italic: */ italic_seqs,
/* underline: */ underline_seqs,
/* color_mode: */ COLOR_MODE_16,
#if defined(CONFIG_88_COLORS) || defined(CONFIG_256_COLORS)
@ -333,6 +350,7 @@ static const struct screen_driver_opt freebsd_screen_driver_opt = {
/* charsets: */ { -1, -1 }, /* No UTF8 I/O */
/* frame: */ frame_freebsd,
/* frame_seqs: */ NULL, /* No m11_hack */
/* italic: */ italic_seqs,
/* underline: */ underline_seqs,
/* color_mode: */ COLOR_MODE_16,
#if defined(CONFIG_88_COLORS) || defined(CONFIG_256_COLORS)
@ -415,6 +433,12 @@ set_screen_driver_opt(struct screen_driver *driver, struct option *term_spec)
driver->opt.transparent = get_opt_bool_tree(term_spec, "transparency",
NULL);
if (get_opt_bool_tree(term_spec, "italic", NULL)) {
driver->opt.italic = italic_seqs;
} else {
driver->opt.italic = NULL;
}
if (get_opt_bool_tree(term_spec, "underline", NULL)) {
driver->opt.underline = underline_seqs;
} else {
@ -580,6 +604,7 @@ add_cursor_move_to_string(struct string *screen, int y, int x)
struct screen_state {
unsigned char border;
unsigned char italic;
unsigned char underline;
unsigned char bold;
unsigned char attr;
@ -588,11 +613,11 @@ struct screen_state {
};
#if defined(CONFIG_TRUE_COLOR)
#define INIT_SCREEN_STATE { 0xFF, 0xFF, 0xFF, 0, { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF} }
#define INIT_SCREEN_STATE { 0xFF, 0xFF, 0xFF, 0xFF, 0, { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF} }
#elif defined(CONFIG_88_COLORS) || defined(CONFIG_256_COLORS)
#define INIT_SCREEN_STATE { 0xFF, 0xFF, 0xFF, 0, { 0xFF, 0xFF } }
#define INIT_SCREEN_STATE { 0xFF, 0xFF, 0xFF, 0xFF, 0, { 0xFF, 0xFF } }
#else
#define INIT_SCREEN_STATE { 0xFF, 0xFF, 0xFF, 0, { 0xFF } }
#define INIT_SCREEN_STATE { 0xFF, 0xFF, 0xFF, 0xFF, 0, { 0xFF } }
#endif
#ifdef CONFIG_TRUE_COLOR
@ -757,6 +782,7 @@ add_char16(struct string *screen, struct screen_driver *driver,
struct screen_char *ch, struct screen_state *state)
{
unsigned char border = (ch->attr & SCREEN_ATTR_FRAME);
unsigned char italic = (ch->attr & SCREEN_ATTR_ITALIC);
unsigned char underline = (ch->attr & SCREEN_ATTR_UNDERLINE);
unsigned char bold = (ch->attr & SCREEN_ATTR_BOLD);
@ -770,6 +796,16 @@ add_char16(struct string *screen, struct screen_driver *driver,
add_term_string(screen, driver->opt.frame_seqs[!!border]);
}
if (
#ifdef CONFIG_UTF8
!(driver->opt.utf8_cp && ch->data == UCS_NO_CHAR) &&
#endif /* CONFIG_UTF8 */
italic != state->italic && driver->opt.italic
) {
state->italic = italic;
add_term_string(screen, driver->opt.italic[!!italic]);
}
if (
#ifdef CONFIG_UTF8
!(driver->opt.utf8_cp && ch->data == UCS_NO_CHAR) &&
@ -832,6 +868,10 @@ add_char16(struct string *screen, struct screen_driver *driver,
add_bytes_to_string(screen, ";7", 2);
}
if (italic && driver->opt.italic) {
add_bytes_to_string(screen, ";3", 2);
}
if (underline && driver->opt.underline) {
add_bytes_to_string(screen, ";4", 2);
}
@ -916,6 +956,11 @@ add_char256(struct string *screen, struct screen_driver *driver,
add_term_string(screen, driver->opt.frame_seqs[state->border]);
}
if ((attr_delta & SCREEN_ATTR_ITALIC) && driver->opt.italic) {
state->italic = !!(ch->attr & SCREEN_ATTR_ITALIC);
add_term_string(screen, driver->opt.italic[state->italic]);
}
if ((attr_delta & SCREEN_ATTR_UNDERLINE) && driver->opt.underline) {
state->underline = !!(ch->attr & SCREEN_ATTR_UNDERLINE);
add_term_string(screen, driver->opt.underline[state->underline]);
@ -949,6 +994,11 @@ add_char256(struct string *screen, struct screen_driver *driver,
if (ch->attr & SCREEN_ATTR_BOLD)
add_bytes_to_string(screen, "\033[1m", 4);
if (ch->attr & SCREEN_ATTR_ITALIC && driver->opt.italic) {
state->italic = !!(ch->attr & SCREEN_ATTR_ITALIC);
add_term_string(screen, driver->opt.italic[state->italic]);
}
if (ch->attr & SCREEN_ATTR_UNDERLINE && driver->opt.underline) {
state->underline = !!(ch->attr & SCREEN_ATTR_UNDERLINE);
add_term_string(screen, driver->opt.underline[state->underline]);
@ -1031,6 +1081,11 @@ add_char_true(struct string *screen, struct screen_driver *driver,
add_term_string(screen, driver->opt.frame_seqs[state->border]);
}
if ((attr_delta & SCREEN_ATTR_ITALIC) && driver->opt.italic) {
state->italic = !!(ch->attr & SCREEN_ATTR_ITALIC);
add_term_string(screen, driver->opt.italic[state->italic]);
}
if ((attr_delta & SCREEN_ATTR_UNDERLINE) && driver->opt.underline) {
state->underline = !!(ch->attr & SCREEN_ATTR_UNDERLINE);
add_term_string(screen, driver->opt.underline[state->underline]);
@ -1064,6 +1119,11 @@ add_char_true(struct string *screen, struct screen_driver *driver,
if (ch->attr & SCREEN_ATTR_BOLD)
add_bytes_to_string(screen, "\033[1m", 4);
if (ch->attr & SCREEN_ATTR_ITALIC && driver->opt.italic) {
state->italic = !!(ch->attr & SCREEN_ATTR_ITALIC);
add_term_string(screen, driver->opt.italic[state->italic]);
}
if (ch->attr & SCREEN_ATTR_UNDERLINE && driver->opt.underline) {
state->underline = !!(ch->attr & SCREEN_ATTR_UNDERLINE);
add_term_string(screen, driver->opt.underline[state->underline]);