Save the overlay when DECTCEM is turned off and restore it when turned on.
This commit is contained in:
parent
9d1de50bf9
commit
b799eba81e
@ -747,31 +747,34 @@ get_overlay_text(Screen *self) {
|
|||||||
#undef ol
|
#undef ol
|
||||||
}
|
}
|
||||||
|
|
||||||
struct SaveOverlayLine {
|
|
||||||
PyObject *overlay_text;
|
|
||||||
Screen *screen;
|
|
||||||
const char *func_name;
|
|
||||||
};
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
save_overlay_line(struct SaveOverlayLine *sol) {
|
save_overlay_line(Screen *self, const char* func_name) {
|
||||||
if (sol->screen->overlay_line.is_active && screen_is_cursor_visible(sol->screen)) {
|
if (self->overlay_line.is_active && screen_is_cursor_visible(self)) {
|
||||||
sol->overlay_text = get_overlay_text(sol->screen);
|
if (self->overlay_line.save.overlay_text) {
|
||||||
deactivate_overlay_line(sol->screen);
|
Py_DECREF(self->overlay_line.save.overlay_text);
|
||||||
|
}
|
||||||
|
self->overlay_line.save.overlay_text = get_overlay_text(self);
|
||||||
|
self->overlay_line.save.func_name = func_name;
|
||||||
|
deactivate_overlay_line(self);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
restore_overlay_line(struct SaveOverlayLine *sol) {
|
restore_overlay_line(Screen *self) {
|
||||||
if (sol->overlay_text) {
|
if (self->overlay_line.save.overlay_text) {
|
||||||
debug("Received input from child (%s) while overlay active. Overlay contents: %s\n", sol->func_name, PyUnicode_AsUTF8(sol->overlay_text));
|
debug("Received input from child (%s) while overlay active. Overlay contents: %s\n", self->overlay_line.save.func_name, PyUnicode_AsUTF8(self->overlay_line.save.overlay_text));
|
||||||
screen_draw_overlay_text(sol->screen, PyUnicode_AsUTF8(sol->overlay_text));
|
screen_draw_overlay_text(self, PyUnicode_AsUTF8(self->overlay_line.save.overlay_text));
|
||||||
Py_DECREF(sol->overlay_text);
|
Py_DECREF(self->overlay_line.save.overlay_text);
|
||||||
update_ime_position_for_window(sol->screen->window_id, false, 0);
|
self->overlay_line.save.overlay_text = NULL;
|
||||||
|
update_ime_position_for_window(self->window_id, false, 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#define MOVE_OVERLAY_LINE_WITH_CURSOR struct SaveOverlayLine __attribute__ ((__cleanup__(restore_overlay_line))) _sol_ = {.screen=self,.func_name=__func__}; save_overlay_line(&_sol_);
|
static void restore_overlay_line_from_cleanup(Screen **self) {
|
||||||
|
restore_overlay_line(*self);
|
||||||
|
}
|
||||||
|
|
||||||
|
#define MOVE_OVERLAY_LINE_WITH_CURSOR Screen __attribute__ ((__cleanup__(restore_overlay_line_from_cleanup))) *_sol_ = self; save_overlay_line(_sol_, __func__);
|
||||||
|
|
||||||
void
|
void
|
||||||
screen_draw(Screen *self, uint32_t och, bool from_input_stream) {
|
screen_draw(Screen *self, uint32_t och, bool from_input_stream) {
|
||||||
@ -1003,6 +1006,12 @@ set_mode_from_const(Screen *self, unsigned int mode, bool val) {
|
|||||||
self->modes.mDECCKM = val;
|
self->modes.mDECCKM = val;
|
||||||
break;
|
break;
|
||||||
case DECTCEM:
|
case DECTCEM:
|
||||||
|
if(!val) {
|
||||||
|
save_overlay_line(self, __func__);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
restore_overlay_line(self);
|
||||||
|
}
|
||||||
self->modes.mDECTCEM = val;
|
self->modes.mDECTCEM = val;
|
||||||
break;
|
break;
|
||||||
case DECSCNM:
|
case DECSCNM:
|
||||||
|
|||||||
@ -72,6 +72,11 @@ typedef struct {
|
|||||||
GPUCell *gpu_cells;
|
GPUCell *gpu_cells;
|
||||||
bool is_active;
|
bool is_active;
|
||||||
index_type xstart, ynum, xnum;
|
index_type xstart, ynum, xnum;
|
||||||
|
|
||||||
|
struct {
|
||||||
|
PyObject *overlay_text;
|
||||||
|
const char *func_name;
|
||||||
|
} save;
|
||||||
} OverlayLine;
|
} OverlayLine;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user