jcs
/subtext
/amendments
/5
console: Add a speed hack to pass in cell hints
Rather than having to scan the entire cell array, just update the
cells in the hints
jcs made amendment 5 over 2 years ago
--- console.c Tue Nov 30 15:07:20 2021
+++ console.c Tue Nov 30 21:55:45 2021
@@ -15,6 +15,7 @@
*/
#include <stdio.h>
+#include <string.h>
#include "subtext.h"
#include "console.h"
@@ -30,7 +31,7 @@ struct node_funcs console_node_funcs = {
console_output,
};
-void console_redraw(struct console *console);
+void console_redraw(struct console *console, short numhints, short *hints);
void console_parse_csi(struct console *console);
struct console *
@@ -43,6 +44,7 @@ console_init(void)
short padding = 20;
console = xmalloczero(sizeof(struct console));
+ memset(console->chars, ' ', sizeof(console->chars));
bounds.left = (padding / 2);
bounds.top = screenBits.bounds.top + (GetMBarHeight() * 2) - 1 +
@@ -106,7 +108,7 @@ console_update(struct console *console, EventRecord *e
switch (what) {
case -1:
case updateEvt:
- console_redraw(console);
+ console_redraw(console, -1, NULL);
//browser_update_menu(browser);
UpdtControl(console->win, console->win->visRgn);
@@ -140,6 +142,8 @@ console_output(struct session *session)
{
struct console *console = (struct console *)session->cookie;
short n, len, cursor, iac = 0;
+ short hints[100];
+ short nhints = 0;
if (session->obuflen == 0)
return 0;
@@ -148,6 +152,7 @@ console_output(struct session *session)
console->cursor_column;
console->attrs[cursor] |= ATTR_DIRTY;
console->attrs[cursor] &= ~ATTR_CURSOR;
+ hints[nhints++] = cursor;
for (n = 0; n < session->obuflen; n++) {
if (console->cursor_column >= console->ncolumns &&
@@ -198,6 +203,10 @@ console_output(struct session *session)
console->chars[cursor] = session->obuf[n];
console->attrs[cursor] |= ATTR_DIRTY;
console->cursor_column++;
+ if (nhints != -1 && nhints < sizeof(hints) - 1)
+ hints[nhints++] = cursor;
+ else
+ nhints = -1;
break;
}
}
@@ -210,7 +219,11 @@ output_done:
cursor = (console->cursor_line * console->ncolumns) +
console->cursor_column;
console->attrs[cursor] |= (ATTR_DIRTY | ATTR_CURSOR);
- console_redraw(console);
+ if (nhints != -1 && nhints < sizeof(hints) - 1)
+ hints[nhints++] = cursor;
+ else if (nhints == -1)
+ nhints = 0;
+ console_redraw(console, nhints, hints);
return len;
}
@@ -224,20 +237,43 @@ console_input(struct session *session)
}
void
-console_redraw(struct console *console)
+console_redraw(struct console *console, short nhints, short hints[])
{
Rect cursor;
- short n, line = 0, column = 0;
+ short n, cell, line = 0, column = 0;
+ short nsize;
TextFont(monaco);
TextSize(9);
- for (n = 0; n < sizeof(console->chars); n++) {
- if (!(console->attrs[n] & ATTR_DIRTY))
- continue;
+ if (nhints > 0)
+ nsize = nhints;
+ else {
+ nsize = sizeof(console->chars);
+ SetCursor(*(GetCursor(watchCursor)));
+ }
+
+ for (n = 0; n < nsize; n++) {
+ if (nhints > 0) {
+ cell = hints[n];
+ } else {
+ if (nhints == 0 && !(console->attrs[n] & ATTR_DIRTY))
+ continue;
+
+ /*
+ * speed hack: if doing a whole-window update, no need to
+ * redraw blank space
+ */
+ if (nhints == -1 && console->chars[n] == ' ' &&
+ !(console->attrs[n] & ATTR_CURSOR))
+ continue;
+
+ cell = n;
+ }
- line = ((n + 1) / console->ncolumns);
- column = n - (line * console->ncolumns);
+ line = ((cell + 1) / console->ncolumns);
+ column = cell - (line * console->ncolumns);
+
cursor.left = FONT_WIDTH + ((console->win->portRect.left +
column) * FONT_WIDTH);
cursor.top = FONT_WIDTH + ((console->win->portRect.top + line) *
@@ -248,12 +284,17 @@ console_redraw(struct console *console)
FillRect(&cursor, white);
MoveTo(cursor.left, cursor.top + FONT_HEIGHT - 2);
- DrawChar(console->chars[n]);
+ DrawChar(console->chars[cell]);
console->attrs[n] &= ~ATTR_DIRTY;
- if (console->attrs[n] & ATTR_CURSOR)
+ if (console->attrs[cell] & ATTR_CURSOR)
InvertRect(&cursor);
}
+
+ ValidRect(&console->win->portRect);
+
+ if (nhints <= 0)
+ SetCursor(&arrow);
}
void
--- main.c Tue Nov 30 14:45:17 2021
+++ main.c Tue Nov 30 21:57:29 2021
@@ -70,13 +70,13 @@ main(void)
strcpy(config.name, "Kludge BBS");
strcpy(config.hostname, "klud.ge");
- telnet_init();
cur_console = console_init();
+ telnet_init();
while (!quitting) {
telnet_idle();
uthread_coordinate();
- WaitNextEvent(everyEvent, &event, 1L, 0L);
+ WaitNextEvent(everyEvent, &event, 1, 0);
switch (event.what) {
case nullEvent:
--- session.c Sun Nov 28 21:25:13 2021
+++ session.c Tue Nov 30 20:15:38 2021
@@ -93,8 +93,10 @@ session_input_char(struct session *session)
{
char ret;
- while (session->ibuflen == 0)
+ while (session->ibuflen == 0) {
session->node_funcs->input(session);
+ uthread_yield();
+ }
ret = session->ibuf[0];
if (session->ibuflen == 1)