+void Redraw_Screen(void)\r
+{\r
+ int y = 0;\r
+ tMessage *msg;\r
+\r
+ printf("\x1B[2J"); // Clear screen\r
+ printf("\x1B[0;0H"); // Reset cursor\r
+\r
+ msg = gpCurrentWindow->Messages;\r
+ \r
+ // TODO: Title bar?\r
+\r
+ // Note: This renders from the bottom up\r
+ for( y = giTerminal_Height - 1; y -- && msg; msg = msg->Next)\r
+ {\r
+ int msglen = strlen(msg->Data);\r
+ int prefix_len = 3 + strlen(msg->Source);\r
+ int line_avail = giTerminal_Width - prefix_len;\r
+ int i = 0, done = 0;\r
+ \r
+ y -= msglen / line_avail; // Extra lines (y-- above handles the 1 line case)\r
+ SetCursorPos(y, 0);\r
+ printf("[%s] ", msg->Source);\r
+ \r
+ while(done < msglen) {\r
+ done += printf("%.*s", line_avail, msg->Data+done);\r
+ i ++;\r
+ SetCursorPos(y+i, prefix_len);\r
+ }\r
+ }\r
+\r
+ // Bottom line is rendered by the prompt\r
+}\r
+\r