ConsoleLine *console_history_verify(const bContext *C) { SpaceConsole *sc = CTX_wm_space_console(C); ConsoleLine *ci = sc->history.last; if (ci == NULL) ci = console_history_add(sc, NULL); return ci; }
static int console_clear_line_exec(bContext *C, wmOperator *UNUSED(op)) { SpaceConsole *sc = CTX_wm_space_console(C); ARegion *ar = CTX_wm_region(C); ConsoleLine *ci = console_history_verify(C); if (ci->len == 0) { return OPERATOR_CANCELLED; } console_history_add(C, ci); console_history_add(C, NULL); console_textview_update_rect(sc, ar); ED_area_tag_redraw(CTX_wm_area(C)); console_scroll_bottom(ar); return OPERATOR_FINISHED; }
/* the python exec operator uses this */ static int console_history_cycle_exec(bContext *C, wmOperator *op) { SpaceConsole *sc = CTX_wm_space_console(C); ARegion *ar = CTX_wm_region(C); ConsoleLine *ci = console_history_verify(C); /* TODO - stupid, just prevents crashes when no command line */ const bool reverse = RNA_boolean_get(op->ptr, "reverse"); /* assumes down, reverse is up */ int prev_len = ci->len; /* keep a copy of the line above so when history is cycled * this is the only function that needs to know about the double-up */ if (ci->prev) { ConsoleLine *ci_prev = (ConsoleLine *)ci->prev; if (STREQ(ci->line, ci_prev->line)) console_history_free(sc, ci_prev); } if (reverse) { /* last item in history */ ci = sc->history.last; BLI_remlink(&sc->history, ci); BLI_addhead(&sc->history, ci); } else { ci = sc->history.first; BLI_remlink(&sc->history, ci); BLI_addtail(&sc->history, ci); } { /* add a duplicate of the new arg and remove all other instances */ ConsoleLine *cl; while ((cl = console_history_find(sc, ci->line, ci))) console_history_free(sc, cl); console_history_add(sc, (ConsoleLine *)sc->history.last); } ci = sc->history.last; console_select_offset(sc, ci->len - prev_len); /* could be wrapped so update scroll rect */ console_textview_update_rect(sc, ar); ED_area_tag_redraw(CTX_wm_area(C)); console_scroll_bottom(ar); return OPERATOR_FINISHED; }
void console_input(int c) { switch (c) { case SDL_SCANCODE_ESCAPE: console_clear_input(); console_refresh_caret(); break; case SDL_SCANCODE_RETURN: if (_consoleCurrentLine[0] != 0) { console_history_add(_consoleCurrentLine); console_execute(_consoleCurrentLine); console_write_prompt(); console_clear_input(); console_refresh_caret(); } break; case SDL_SCANCODE_UP: if (_consoleHistoryIndex > 0) { _consoleHistoryIndex--; memcpy(_consoleCurrentLine, _consoleHistory[_consoleHistoryIndex], 256); } gTextInputCursorPosition = strlen(_consoleCurrentLine); gTextInputLength = gTextInputCursorPosition; break; case SDL_SCANCODE_DOWN: if (_consoleHistoryIndex < _consoleHistoryCount - 1) { _consoleHistoryIndex++; memcpy(_consoleCurrentLine, _consoleHistory[_consoleHistoryIndex], 256); gTextInputCursorPosition = strlen(_consoleCurrentLine); gTextInputLength = gTextInputCursorPosition; } else { _consoleHistoryIndex = _consoleHistoryCount; console_clear_input(); } break; } }