static void WCEL_Redraw(WCEL_Context* ctx) { COORD c = WCEL_GetCoord(ctx, ctx->len); CHAR_INFO ci; WCEL_Update(ctx, 0, ctx->len); ci.Char.UnicodeChar = ' '; ci.Attributes = ctx->csbi.wAttributes; CONSOLE_FillLineUniform(ctx->hConOut, c.X, c.Y, ctx->csbi.dwSize.X - c.X, &ci); }
static void WCEL_DeleteString(WCEL_Context* ctx, int beg, int end) { unsigned str_len = end - beg; if (end < ctx->len) memmove(&ctx->line[beg], &ctx->line[end], (ctx->len - end) * sizeof(WCHAR)); /* we need to clean from ctx->len - str_len to ctx->len */ if (ctx->shall_echo) { COORD cbeg = WCEL_GetCoord(ctx, ctx->len - str_len); COORD cend = WCEL_GetCoord(ctx, ctx->len); CHAR_INFO ci; ci.Char.UnicodeChar = ' '; ci.Attributes = ctx->csbi.wAttributes; if (cbeg.Y == cend.Y) { /* partial erase of sole line */ CONSOLE_FillLineUniform(ctx->hConOut, cbeg.X, cbeg.Y, cend.X - cbeg.X, &ci); } else { int i; /* erase til eol on first line */ CONSOLE_FillLineUniform(ctx->hConOut, cbeg.X, cbeg.Y, ctx->csbi.dwSize.X - cbeg.X, &ci); /* completely erase all the others (full lines) */ for (i = cbeg.Y + 1; i < cend.Y; i++) CONSOLE_FillLineUniform(ctx->hConOut, 0, i, ctx->csbi.dwSize.X, &ci); /* erase from beginning of line until last pos on last line */ CONSOLE_FillLineUniform(ctx->hConOut, 0, cend.Y, cend.X, &ci); } } ctx->len -= str_len; WCEL_Update(ctx, 0, ctx->len); ctx->line[ctx->len] = 0; }