terminal/vte/console: support inverse-screen-mode
In inverse screen mode we switch background and foreground colors. As our console layer supports transparent backgrounds, we have to do this in the terminal layer. Signed-off-by: David Herrmann <dh.herrmann@googlemail.com>
This commit is contained in:
parent
2630ee585b
commit
7129a9038c
@ -763,8 +763,17 @@ static void kmscon_buffer_draw(struct kmscon_buffer *buf,
|
|||||||
|
|
||||||
for (j = 0; j < num; ++j) {
|
for (j = 0; j < num; ++j) {
|
||||||
cell = &line->cells[j];
|
cell = &line->cells[j];
|
||||||
|
|
||||||
|
/* TODO: do some more sophisticated inverse here. When
|
||||||
|
* INVERSE mode is set, we should instead just select
|
||||||
|
* inverse colors instead of switching background and
|
||||||
|
* foreground */
|
||||||
|
if (buf->flags & KMSCON_CONSOLE_INVERSE)
|
||||||
|
cell->attr.inverse = !cell->attr.inverse;
|
||||||
font_screen_draw_char(fscr, cell->ch, &cell->attr,
|
font_screen_draw_char(fscr, cell->ch, &cell->attr,
|
||||||
j, i, 1, 1);
|
j, i, 1, 1);
|
||||||
|
if (buf->flags & KMSCON_CONSOLE_INVERSE)
|
||||||
|
cell->attr.inverse = !cell->attr.inverse;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -49,6 +49,7 @@ struct kmscon_console;
|
|||||||
#define KMSCON_CONSOLE_WRAP 0x02
|
#define KMSCON_CONSOLE_WRAP 0x02
|
||||||
/* modes for kmscon_console_re/set() */
|
/* modes for kmscon_console_re/set() */
|
||||||
#define KMSCON_CONSOLE_REL_ORIGIN 0x04
|
#define KMSCON_CONSOLE_REL_ORIGIN 0x04
|
||||||
|
#define KMSCON_CONSOLE_INVERSE 0x08
|
||||||
|
|
||||||
int kmscon_console_new(struct kmscon_console **out);
|
int kmscon_console_new(struct kmscon_console **out);
|
||||||
void kmscon_console_ref(struct kmscon_console *con);
|
void kmscon_console_ref(struct kmscon_console *con);
|
||||||
|
@ -86,9 +86,11 @@ static void draw_all(struct ev_eloop *eloop, void *unused, void *data)
|
|||||||
struct screen *iter;
|
struct screen *iter;
|
||||||
struct uterm_screen *screen;
|
struct uterm_screen *screen;
|
||||||
int ret;
|
int ret;
|
||||||
|
unsigned int cflags;
|
||||||
|
|
||||||
ev_eloop_unregister_idle_cb(term->eloop, draw_all, term);
|
ev_eloop_unregister_idle_cb(term->eloop, draw_all, term);
|
||||||
term->redraw = false;
|
term->redraw = false;
|
||||||
|
cflags = kmscon_console_get_flags(term->console);
|
||||||
|
|
||||||
iter = term->screens;
|
iter = term->screens;
|
||||||
for (; iter; iter = iter->next) {
|
for (; iter; iter = iter->next) {
|
||||||
@ -99,7 +101,10 @@ static void draw_all(struct ev_eloop *eloop, void *unused, void *data)
|
|||||||
continue;
|
continue;
|
||||||
|
|
||||||
gl_viewport(screen);
|
gl_viewport(screen);
|
||||||
glClearColor(0.0, 0.0, 0.0, 1.0);
|
if (cflags & KMSCON_CONSOLE_INVERSE)
|
||||||
|
glClearColor(1.0, 1.0, 1.0, 1.0);
|
||||||
|
else
|
||||||
|
glClearColor(0.0, 0.0, 0.0, 1.0);
|
||||||
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
||||||
kmscon_console_draw(term->console, iter->fscr);
|
kmscon_console_draw(term->console, iter->fscr);
|
||||||
uterm_screen_swap(screen);
|
uterm_screen_swap(screen);
|
||||||
|
@ -907,6 +907,12 @@ static void csi_mode(struct kmscon_vte *vte, bool set)
|
|||||||
continue;
|
continue;
|
||||||
case 5: /* DECSCNM */
|
case 5: /* DECSCNM */
|
||||||
set_reset_flag(vte, set, FLAG_INVERSE_SCREEN_MODE);
|
set_reset_flag(vte, set, FLAG_INVERSE_SCREEN_MODE);
|
||||||
|
if (set)
|
||||||
|
kmscon_console_set_flags(vte->con,
|
||||||
|
KMSCON_CONSOLE_INVERSE);
|
||||||
|
else
|
||||||
|
kmscon_console_reset_flags(vte->con,
|
||||||
|
KMSCON_CONSOLE_INVERSE);
|
||||||
continue;
|
continue;
|
||||||
case 6: /* DECOM */
|
case 6: /* DECOM */
|
||||||
set_reset_flag(vte, set, FLAG_ORIGIN_MODE);
|
set_reset_flag(vte, set, FLAG_ORIGIN_MODE);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user