Commit Graph

40 Commits

Author SHA1 Message Date
Kartik Agaram 7412e6eef8 4399 2018-07-25 08:26:48 -07:00
Kartik K. Agaram 537ad74ccc 3862
As the finishing touch on commit 3860, completely decouple the termbox
API between moving the cursor and printing at the cursor.
2017-05-19 00:09:18 -07:00
Kartik K. Agaram b6fa632e2f 3861 - screen untouched when entering console mode 2017-05-18 10:14:49 -07:00
Kartik K. Agaram ee1a18f050 3860 - stop buffering the screen in termbox
To achieve this we have to switch to a model of the screen in termbox that
is closer to the underlying terminal.

Before:
  a screen is a grid of characters
  writing out of bounds does nothing

After:
  a screen is a scrolling raster of characters
  writing out of bounds wraps to next line and scrolls if necessary

To move to the new model, it was essential that I migrate my fake screen
at the same time to mimic it. This is why the first attempt (commit 3824)
failed (commit 3858). This is also why this commit can't be split into
smaller pieces.

The fake screen now 'scrolls' by rotating screen lines from top to bottom.
There's still no notion of a scrollback buffer.

The newer model is richer; it permits repl-like apps that upstream termbox
can't do easily. It also permits us to simply use `printf` or `cout` to
write to the screen, and everything mostly works as you would expect. Exceptions:

  a) '\n' won't do what you expect. You need to explicitly print both '\n'
  and '\r'.

  b) backspace won't do what you expect. It only moves the cursor back,
  without erasing the previous character. It does not wrap.

  Both behaviors exactly mimic my existing terminal's emulation of vt100.

The catch: it's easy to accidentally scroll in apps. Out-of-bounds prints
didn't matter before, but they're bugs now. To help track them down, use
the `save-top-idx`, `assert-no-scroll` pair of helpers.

  An important trick is to wrap the cursor before rather after printing
  a character. Otherwise we end up scrolling every time we print to the
  bottom-right character. This means that the cursor position can be invalid
  at the start of a print, and we need to handle that.

In the process we also lose the ability to hide and show the screen. We
have to show the prints happening. Seems apt for a "white-box" platform
like Mu.
2017-05-18 09:57:57 -07:00
Kartik K. Agaram 27ec57de4c 3858
Lose the ability to hide the cursor. If we want to stop buffering the screen
in termbox, it needs to go.

What's more, it has no tests.
2017-05-13 20:48:16 -07:00
Kartik K. Agaram 6f4ce86543 3857 2017-05-13 18:39:41 -07:00
Kartik K. Agaram 0c0d1ea5cd 3854
Revert commits 3824, 3850 and 3852. We'll redo them more carefully.
2017-05-13 12:42:17 -07:00
Kartik K. Agaram 769a68cf1d 3842
Always start with an untouched screen that can scroll on printing "\r\n".
We can still clear the screen as needed.

Also drop support for hiding the cursor.
2017-05-04 23:20:37 -07:00
Kartik K. Agaram d592b81e15 3826 2017-04-16 15:19:09 -07:00
Kartik K. Agaram ace7ffb714 3824 - experiment: stop buffering in termbox
Now it's much more apparent why things are slow. You can see each repaint
happening. Already I fixed one performance bug -- in clear-rest-of-screen.

Since this subverts Mu's fake screen there may be bugs.

Another salubrious side effect: I've finally internalized that switching
to raw mode doesn't have to clear the screen. That was just an artifact
of how termbox abstracted operations. Now I can conceive of using termbox
to build a repl as well.

(I was inspired to poke into termbox internals by
http://viewsourcecode.org/snaptoken/kilo and
https://github.com/antirez/linenoise)
2017-04-16 15:05:31 -07:00
Kartik K. Agaram 53fbba4f64 3711
Delete '^L' characters now that I'm trying to switch from Vim to Kakoune. Pages
aren't text objects in Kakoune.
2016-12-26 15:57:13 -08:00
Kartik K. Agaram 3315a7d3bb 3488 -
I'd messed up termbox in commit 3443; it was weird how it failed though.
The terminal got really sluggish to switch between windows when the
edit/ app was running. And it stopped clearing the screen properly.
2016-10-08 17:56:07 -07:00
Kartik K. Agaram b4785580be 3450
Purge remaining `makefile`s, without breaking CI.
2016-10-06 17:13:04 -07:00
Kartik K. Agaram 5af07e1c2c 3444
Fix CI. Turns out strlcpy and strlcat are not implemented on Linux.
2016-10-06 09:25:22 -07:00
Kartik K. Agaram d4ecd588af 3443
Fix some OpenBSD warnings.
2016-10-05 23:34:53 -07:00
Kartik K. Agaram 72d868e646 3222
Commit 3191 stopped defining _XOPEN_SOURCE when building termbox/ to get
Mu to build on OpenBSD. However, that had the side effect of not
declaring the prototype for wcwidth() on some versions of Linux. Ugh.
Just hack around this morass.

In general the direction we want to go in Mu is fewer feature #defines.
At least explicit ones. Should be an internal detail of the underlying
platform our code shouldn't have to worry about. If headers don't
cooperate, just start explicitly declaring prototypes and damn the
consequences.
2016-08-18 09:13:44 -07:00
Kartik K. Agaram 671635c0ca 3191 - now builds on OpenBSD
Looks like the _XOPEN_SOURCE #define isn't needed in termbox anymore, at
least after I removed some features from it that I don't need. All it
was doing is hiding SIGWINCH and likely other names as well.
2016-08-16 09:37:25 -07:00
Kartik K. Agaram 5002169370 2572 2016-01-19 17:54:24 -08:00
Kartik K. Agaram 5cee556294 2181 - detect shift-tab
Does nothing useful yet, though.
2015-09-11 09:05:22 -07:00
Kartik K. Agaram d31cba72fb 2142 2015-09-04 11:12:48 -07:00
Kartik K. Agaram 1ed9af8300 2141 - attempt to deal with slow networks
On slow networks sometimes escape sequences were being partially
consumed, causing junk to be added to the editor when you pressed arrow
keys and so on. Now we have a way to wait.

Empirically seems to work if I page-up and then scroll back up using
up-arrow. Before I'd consistently get junk even on my local machine. Now
I no longer do.

If we still see problems I'll increase the wait time and see if the
increase helps. Then we'll know more about this approach.
2015-09-04 11:12:03 -07:00
Kartik K. Agaram 4d6b5173e7 2132 - support for ctrl + arrow keys 2015-09-02 19:18:37 -07:00
Kartik K. Agaram 7dcdd40c27 2131 - better tb_sync()
For some reason porting the termbox-go implementation was still leaving
some gunk from git on screen when I ran my usual test:

  $ mkdir lesson; cd lesson; git init; mu edit.mu
  Then hit F4, generating messages from git on the initial commit.
  Then hit ctrl-l to clear all git gunk.
2015-09-02 12:39:35 -07:00
Kartik K. Agaram 930e9eae27 2113 - stop updating entire screen on tb_present()
Mu still isn't so optimized that I can be profligate with spare cycles.
Instead we'll follow termbox-go's example and create a new API routine
called tb_sync() (after discussion with termbox's author). Now we only
need use tb_sync() on ctrl-l. For everything else use the optimized
render.

Now I think I've eradicated all signs of "cursor thrashing" during
refresh, in spite of how slow mu is as an interpreted language. We only
render the whole screen in some situations, and only if there's no more
input, and even then we only refresh the parts of the screen that
changed.

Thanks Jack and Caleb Couch for providing the impetus behind commits
2109-2113.

I've been lazy about writing tests for all this, but it's still good to
know I could, if I wanted to.
2015-08-29 23:51:18 -07:00
Kartik K. Agaram 81b1975fc5 2078 - update entire screen on tb_present()
Termbox had been taking shortcuts when it thinks the screen hasn't
changed, which doesn't work if some other process messes up the screen.

The Go version has a Sync method in addition to Flush/tb_present for
precisely this eventuality. But it feels like an unnecessary
optimization given C's general speed. Just drop it altogether.

---

This took me a long time to track down, and interestingly I found myself
writing a new tracing primitive before I remembered how to selectively
trace just certain layers during manual tests. I'm scared of generating
traces not because of performance but because of the visual noise. Be
aware of this. I'm going to clean up $log now.

Maybe I should also stop using $print..
2015-08-26 01:21:41 -07:00
Kartik K. Agaram e709c65e67 1964 - don't mess up paste
It took me a long time to fix termbox because the escape codes it was
seeing seemed all wrong. Had to stop calling tb_shutdown/printf and put
in the extra 3 lines to log to a file. Then everything cleared up.
Weird.
2015-08-09 20:01:42 -07:00
Kartik K. Agaram 36204af2e0 1859 2015-07-27 22:09:18 -07:00
Kartik K. Agaram 5e9eff8ca1 1731 - ah, now fully responsive
The trick is to check for more events and not bother rendering if so.
2015-07-08 21:03:32 -07:00
Kartik K. Agaram e45c1ce281 1573 2015-06-16 16:18:26 -07:00
Kartik K. Agaram fb1f2a0a0e 1531 - enable termbox's mouse support 2015-06-05 16:06:16 -07:00
Kartik K. Agaram 10a3b8cca2 1530 - switch to termbox's 256-color mode 2015-06-05 16:03:54 -07:00
Kartik K. Agaram 0e120d8153 1486 - repl: hitting enter now working 2015-05-27 15:57:38 -07:00
Kartik K. Agaram af336c444f 1368 - alias carriage-return and newline
CRLF still shows as two newlines, though. Cross that bridge when we get
to it.

The new chessboard test is still hanging, though.
2015-05-14 12:27:31 -07:00
Kartik K. Agaram 4071055aee 1327 - better error handling in chessboard
Also a bugfix in break to label, because I noticed the screen wasn't
being cleaned up on quit.
2015-05-10 11:40:33 -07:00
Kartik K. Agaram 8536dcf46d 1325 2015-05-10 10:02:02 -07:00
Kartik K. Agaram dc1323e936 1323 - keyboard supports backspace and newline
Lots mixed into this commit:
  some off-by-one errors in display.cc
  a new transform to translate jump labels that I'd somehow never gotten around to supporting
2015-05-10 08:55:18 -07:00
Kartik K. Agaram d94d8243ef 1319
Allow termbox array sizes to be easily counted with 'wc'.
2015-05-10 05:43:41 -07:00
Kartik K. Agaram 9e5ceacd74 1314 2015-05-09 10:32:35 -07:00
Kartik K. Agaram 9ba313ab7f 1313 - merge termbox 2015-05-09 08:56:43 -07:00
Kartik K. Agaram b96af395b9 1276 - make C++ version the default
I've tried to update the Readme, but there are at least a couple of issues.
2015-05-05 21:17:24 -07:00