/* * Delete the character under the cursor; all characters to the right of * the cursor on the same line are moved to the left by one position and * the last character on the line is filled with a blank. The cursor * position does not change. */ int wdelch(WINDOW *w) { int next, width, y, x; y = w->_cury; x = w->_curx; next = __m_cc_next(w, y, x); x = __m_cc_first(w, y, x); /* Determine the character width to delete. */ width = __m_cc_width(&w->_line[y][x]); /* Shift line left to erase the character under the cursor. */ (void) memcpy(&w->_line[y][x], &w->_line[y][next], (w->_maxx - next) * sizeof (**w->_line)); /* * Add blank(s) to the end of line based on the width * of the character that was deleted. */ (void) __m_cc_erase(w, y, w->_maxx - width, y, w->_maxx - 1); /* Set dity region markers. */ if (x < w->_first[y]) w->_first[y] = (short) x; w->_last[y] = w->_maxx; WSYNC(w); return (WFLUSH(w)); }
/* * Erase from the current cursor location right and down to the end of * the screen. The cursor position is not changed. */ int clrtoeol(void) { int x, value; x = __m_cc_first(stdscr, stdscr->_cury, stdscr->_curx); value = __m_cc_erase(stdscr, stdscr->_cury, x, stdscr->_cury, stdscr->_maxx - 1); return ((value == 0) ? OK : ERR); }
/* * Erase from the current cursor position in the window to the right * margin. */ int wclrtoeol(WINDOW *w) { int x; x = __m_cc_first(w, w->_cury, w->_curx); if (__m_cc_erase(w, w->_cury, x, w->_cury, w->_maxx-1) != 0) return (ERR); WSYNC(w); return (WFLUSH(w)); }
/*f * Erase from the current cursor location right and down to the end of * the screen. The cursor position is not changed. */ int clrtobot() { int x, value; #ifdef M_CURSES_TRACE __m_trace("clrtobot(void) from (%d, %d)", stdscr->_cury, stdscr->_curx); #endif x = __m_cc_first(stdscr, stdscr->_cury, stdscr->_curx); value = __m_cc_erase( stdscr, stdscr->_cury, x, stdscr->_maxy-1, stdscr->_maxx-1 ); return __m_return_code("clrtobot", value == 0 ? OK : ERR); }
/* * For positive n scroll the window up n lines (line i+n becomes i); * otherwise scroll the window down n lines. */ int wscrl(WINDOW *w, int n) { int start, finish, to; if (!(w->_flags & W_CAN_SCROLL)) return (ERR); if (n == 0) return (OK); if (w->_parent) { /* Sub-window should not shuffle pointers (parent owns them) */ int row; cchar_t save; int first; if (n > 0) { for (row = w->_top; row < w->_bottom; row++) { if (row < w->_bottom - n) { if (!w->_line[row+n][0]._f) { /* * Tail end of * a multi-col-char */ (void) __m_cc_erase(w, row + n, 0, row + n, 0); } /* * Erase trailing multi-col-chars * where they hang into parent window */ first = __m_cc_first(w, row + n, w->_maxx - 1); save = w->_line[row + n][first]; (void) __m_cc_erase(w, row + n, first, row + n, first); w->_line[row + n][first] = save; (void) memcpy(w->_line[row], w->_line[row + n], sizeof (cchar_t) * w->_maxx); } else { (void) __m_cc_erase(w, row, 0, w->_bottom -1, w->_maxx - 1); break; } } } else { abort(); } } else { /* * Shuffle pointers in order to scroll. The region * from start to finish inclusive will be moved to * either the top or bottom of _line[]. */ if (0 < n) { start = w->_top; finish = w->_top + n - 1; to = w->_bottom; } else { start = w->_bottom + n; finish = w->_bottom - 1; to = w->_top; } /* Blank out new lines. */ (void) __m_cc_erase(w, start, 0, finish, w->_maxx - 1); /* Scroll lines by shuffling pointers. */ (void) __m_ptr_move((void **) w->_line, w->_maxy, start, finish, to); } if ((w->_flags & W_FULL_WINDOW) && w->_top == 0 && w->_bottom == w->_maxy) w->_scroll += (short) n; else w->_scroll = 0; (void) wtouchln(w, 0, w->_maxy, 1); wtouchln_hard(w, 0, w->_maxy); #ifdef BREAKS_fimmedok_fimmedok1_2 w->_flags |= W_FLUSH; #endif /* BREAKS_fimmedok_fimmedok1_2 */ WSYNC(w); return (WFLUSH(w)); }