void PDC_blink_text(void) { int i, j, k; if (!(SP->termattrs & A_BLINK)) blinked_off = FALSE; else blinked_off = !blinked_off; for (i = 0; i < SP->lines; i++) { const chtype *srcp = curscr->_y[i]; for (j = 0; j < SP->cols; j++) if (srcp[j] & A_BLINK) { k = j; while (k < SP->cols && (srcp[k] & A_BLINK)) k++; PDC_transform_line(i, j, k - j, srcp + j); j = k; } } PDC_gotoyx(SP->cursrow, SP->curscol); pdc_last_blink = GetTickCount(); }
int mvcur(int oldrow, int oldcol, int newrow, int newcol) { PDC_LOG(("mvcur() - called: oldrow %d oldcol %d newrow %d newcol %d\n", oldrow, oldcol, newrow, newcol)); if ((newrow >= LINES) || (newcol >= COLS) || (newrow < 0) || (newcol < 0)) return ERR; PDC_gotoyx(newrow, newcol); SP->cursrow = newrow; SP->curscol = newcol; return OK; }
int PDC_curs_set(int visibility) { int ret_vis; PDC_LOG(("PDC_curs_set() - called: visibility=%d\n", visibility)); ret_vis = SP->visibility; SP->visibility = visibility; PDC_gotoyx(SP->cursrow, SP->curscol); return ret_vis; }
int curs_set(int visibility) { int ret_vis; PDC_LOG(("curs_set() - called: visibility=%d\n", visibility)); if ((visibility < 0) || (visibility > 2)) return ERR; ret_vis = PDC_curs_set(visibility); /* If the cursor is changing from invisible to visible, update its position */ if (visibility && !ret_vis) PDC_gotoyx(SP->cursrow, SP->curscol); return ret_vis; }
static int _restore_mode(int i) { if (ctty[i].been_set == TRUE) { memcpy(SP, &(ctty[i].saved), sizeof(SCREEN)); if (ctty[i].saved.raw_out) raw(); PDC_restore_screen_mode(i); if ((LINES != ctty[i].saved.lines) || (COLS != ctty[i].saved.cols)) resize_term(ctty[i].saved.lines, ctty[i].saved.cols); PDC_curs_set(ctty[i].saved.visibility); PDC_gotoyx(ctty[i].saved.cursrow, ctty[i].saved.curscol); } return ctty[i].been_set ? OK : ERR; }
void PDC_scr_close(void) { PDC_LOG(("PDC_scr_close() - called\n")); if (SP->visibility != 1) curs_set(1); PDC_reset_shell_mode(); /* Position cursor to the bottom left of the screen. */ if (SP->_restore == PDC_RESTORE_NONE) { SMALL_RECT win; win.Left = orig_scr.srWindow.Left; win.Right = orig_scr.srWindow.Right; win.Top = 0; win.Bottom = orig_scr.srWindow.Bottom - orig_scr.srWindow.Top; SetConsoleWindowInfo(pdc_con_out, TRUE, &win); PDC_gotoyx(win.Bottom, 0); } }
int doupdate(void) { int y; bool clearall; PDC_LOG(("doupdate() - called\n")); if (!curscr) return ERR; if (isendwin()) /* coming back after endwin() called */ { reset_prog_mode(); clearall = TRUE; SP->alive = TRUE; /* so isendwin() result is correct */ } else clearall = curscr->_clear; for (y = 0; y < SP->lines; y++) { PDC_LOG(("doupdate() - Transforming line %d of %d: %s\n", y, SP->lines, (curscr->_firstch[y] != _NO_CHANGE) ? "Yes" : "No")); if (clearall || curscr->_firstch[y] != _NO_CHANGE) { int first, last; chtype *src = curscr->_y[y]; chtype *dest = pdc_lastscr->_y[y]; if (clearall) { first = 0; last = COLS - 1; } else { first = curscr->_firstch[y]; last = curscr->_lastch[y]; } while (first <= last) { int len = 0; /* build up a run of changed cells; if two runs are separated by a single unchanged cell, ignore the break */ if (clearall) len = last - first + 1; else while (first + len <= last && (src[first + len] != dest[first + len] || (len && first + len < last && src[first + len + 1] != dest[first + len + 1]) ) ) len++; /* update the screen, and pdc_lastscr */ if (len) { PDC_transform_line(y, first, len, src + first); memcpy(dest + first, src + first, len * sizeof(chtype)); first += len; } /* skip over runs of unchanged cells */ while (first <= last && src[first] == dest[first]) first++; } curscr->_firstch[y] = _NO_CHANGE; curscr->_lastch[y] = _NO_CHANGE; } } curscr->_clear = FALSE; if (SP->visibility) PDC_gotoyx(curscr->_cury, curscr->_curx); SP->cursrow = curscr->_cury; SP->curscol = curscr->_curx; return OK; }
void _new_packet(attr_t attr, int lineno, int x, int len, const chtype *srcp) { int j; short fore, back; bool blink, ansi; if (pdc_conemu && pdc_ansi && (lineno == (SP->lines - 1)) && ((x + len) == SP->cols)) { len--; if (len) _new_packet(attr, lineno, x, len, srcp); pdc_ansi = FALSE; _new_packet(attr, lineno, x + len, 1, srcp + len); pdc_ansi = TRUE; return; } PDC_pair_content(PAIR_NUMBER(attr), &fore, &back); ansi = pdc_ansi || (fore >= 16 || back >= 16); blink = (SP->termattrs & A_BLINK) && (attr & A_BLINK); if (blink) { attr &= ~A_BLINK; if (blinked_off) attr &= ~(A_UNDERLINE | A_RIGHT | A_LEFT); } if (attr & A_BOLD) fore |= 8; if (attr & A_BLINK) back |= 8; if (ansi) { #ifdef PDC_WIDE WCHAR buffer[512]; #else char buffer[512]; #endif for (j = 0; j < len; j++) { chtype ch = srcp[j]; if (ch & A_ALTCHARSET && !(ch & 0xff80)) ch = acs_map[ch & 0x7f]; if (blink && blinked_off) ch = ' '; buffer[j] = ch & A_CHARTEXT; } PDC_gotoyx(lineno, x); _set_ansi_color(fore, back, attr); #ifdef PDC_WIDE WriteConsoleW(pdc_con_out, buffer, len, NULL, NULL); #else WriteConsoleA(pdc_con_out, buffer, len, NULL, NULL); #endif } else { CHAR_INFO buffer[512]; COORD bufSize, bufPos; SMALL_RECT sr; WORD mapped_attr; fore = pdc_curstoreal[fore]; back = pdc_curstoreal[back]; if (attr & A_REVERSE) mapped_attr = back | (fore << 4); else mapped_attr = fore | (back << 4); if (attr & A_UNDERLINE) mapped_attr |= 0x8000; /* COMMON_LVB_UNDERSCORE */ if (attr & A_LEFT) mapped_attr |= 0x0800; /* COMMON_LVB_GRID_LVERTICAL */ if (attr & A_RIGHT) mapped_attr |= 0x1000; /* COMMON_LVB_GRID_RVERTICAL */ for (j = 0; j < len; j++) { chtype ch = srcp[j]; if (ch & A_ALTCHARSET && !(ch & 0xff80)) ch = acs_map[ch & 0x7f]; if (blink && blinked_off) ch = ' '; buffer[j].Attributes = mapped_attr; buffer[j].Char.UnicodeChar = ch & A_CHARTEXT; } bufPos.X = bufPos.Y = 0; bufSize.X = len; bufSize.Y = 1; sr.Top = sr.Bottom = lineno; sr.Left = x; sr.Right = x + len - 1; WriteConsoleOutput(pdc_con_out, buffer, bufSize, bufPos, &sr); } }