Merge branch 'master' of https://github.com/klamonte/jexer
[nikiroo-utils.git] / docs / worklog.md
CommitLineData
55d2b2c2
KL
1Jexer Work Log
2==============
3
d36057df
KL
4October 17, 2017
5
6I finally gave up the ghost on using gcj as the default compiler due
7to its awesome unused imports messages, and learned how to get PMD to
8do that job. Which promptly created 1000+ warning messages related to
9class item order (variables, constructors, methods), nested ifs,
10useless checks, and so on. So now we go on a code sweep to fix those,
11and along the way set a new class template. Since this is so large
12and invasive, I will bite the bullet now and get it done before the
13next release which will get it out on Maven finally.
14
be72cb5c
KL
15August 16, 2017
16
17Holy balls this has gotten so much faster! It is FINALLY visibly
18identical in speed to the original d-tui: on xterm it is glass
19smooth. CPU load is about +/- 10%, idling around 5%.
20
21I had to dramatically rework the event processing order, but now it
22makes much more sense. TApplication.run()'s sole job is to listen for
23backend I/O, push it into drainEventQueue, and wake up the consumer
24thread. The consumer thread's run() has the job of dealing with the
25event, AND THEN calling doIdles and updating the screen. That was the
26big breakthrough: why bother having main thread do screen updates? It
27just leads to contention everywhere as it tries to tell the consumer
28thread to lay off its data structures, when in reality the consumer
29thread should have been the real owner of those structures in the
30first place! This was mainly an artifact of the d-tui fiber threading
31design.
32
33So now we have nice flow of events:
34
35* I/O enters the backend, backend wakes up main thread.
36
37* Main thread grabs events, wakes up consumer thread.
38
39* Consumer thread does work, updates screen.
40
41* Anyone can call doRepaint() to get a screen update shortly
42 thereafter.
43
44* Same flow for TTerminalWindow: ECMA48 gets remote I/O, calls back
45 into TTerminalWindow, which then calls doRepaint(). So in this case
46 we have a completely external thread asking for a screen update, and
47 it is working.
48
49Along the way I also eliminated the Screen.dirty flag and cut out
50calls to CellAttribute checks. Overall we now have about 80% less CPU
51being burned and way less latency. Both HPROF samples and times puts
52my code at roughly 5% of the total, all the rest is the
53sleeping/locking infrastructure.
54
f6d90207
KL
55August 15, 2017
56
57I cut 0.0.5 just now, and also applied for a Sonatype repository.
58It was a reasonable spot: TEditor was working albeit buggy, and a bug
59had just come in on the main TApplication run loop. So we are about
60to embark upon some performance work again, it's been probably version
610.0.2 or so since the last cycle.
62
63Code size: 40446 lines.
64
65Now switching head to 0.0.6 and taking a small break.
66
df602ccf
KL
67August 14, 2017
68
69TEditor is basically done. Mouse movement, keyboard movement,
70backspace / delete / enter / etc. are all in. Things are starting to
71look pretty good.
72
73I'm going to prep for a final cut and release tag tomorrow or the next
74evening. I need to take a break and get some meatspace life dealt
75with.
76
e8a11f98
KL
77August 12, 2017
78
79TEditor is stubbed in about 50% complete now. I have a Highlighter
80class that provides different colors based on Word text values, but it
81is a lot too simple to do true syntax highlighting. I am noodling on
82the right design that would let TEditor be both a programmer's editor
83(so Highlighter needs to have state and do a lexical scan) and a word
84processor (where Word needs to tokenize on whitespace). I estimate
85probably a good 2-4 weeks left to get the editor behavior where I want
86it, and then after that will be the 0.0.5 release.
87
88Finding more minor paper cuts and fixing them: the mouse cursor being
89ahead of a window drag event, SwingTerminal resetting blink on new
90input, prevent TWindow from resizing down into the status bar.
91
3e074355
KL
92August 8, 2017
93
94Multiscreen is looking really cool! Demo6 now brings up three
95screens, including one that is inside a TWindow of a different
96application.
97
42873e30
KL
98August 7, 2017
99
100Had trouble sleeping, what with a bunch of imaginative thoughts for
101this release. jexer.backend will be the ultimate destination for
102jexer.session and most of jexer.io. TerminalReader will be the
103interface for keyboard and mouse events. cmScreenConnected and
104cmScreenDisconnected will be new events to represent a screen
105appearing/disappearing, and MultiBackend will be a new backend
106multiplexer that goes full XRandR. Several new demos demonstrating
107multi-screen support will be coming along.
108
109August 6, 2017
110
111Time to clean up more API, particularly between Backend and Screen.
112Both of these will be interfaces soon, so that one could easily
113subclass JComponent and implement both Screen and Backend. The
114original code evolved out of Qodem, where screen.c and input.c were
115two different things leading to ECMA48Screen and ECMA48Terminal, but
116now there is really no need to keep them separate. It also
117complicates the constructors, as these are basically friend classes
118that have used package private access to get around their artificial
119separation.
120
121When I get this done it should be a lot easier to do any of:
122
123* Pass a JFrame or JComponent to SwingBackend and have it add itself,
124 like any other Swing widget.
125
126* Construct a SwingBackend and add it to any regular JComponent.
127
128* Have multiple TApplications running inside the same Swing
129 application, including having actions affect each other. (Will also
130 need to ensure that TWidgets/TWindows are not in different
131 TApplication collections.)
132
133* Build a Backend/Screen multiplexer, so that one could have a ECMA48
134 TApplication listening on a port and a local Swing monitor for it.
135
136* Build a Backend/Screen manager, so that one could have multiple
137 ECMA48 screens acting as a single large screen (e.g. XRandR).
138
139Now I need to decide which package will collect Backend, SessionInfo,
140and Screen. jexer.io has some java.io stuff, so it stays anyway.
141
2fef9c6e
KL
142July 28, 2017
143
144Got very busy with my meatspace life, now getting a chance to come
145back around.
146
147I gave up on TEditor knowing about graphemes, instead pulling back to
148simple Cells. This will be better anyway in the long run, as getting
149grapheme support in Screen someday will also get it for me in TEditor
150for free. But it does mean that TEditor will chew through much more
151RAM than it needs to for a text file. Performance optimization will
152come someday. But this means I can also go back to gcj, because I
153really like its warnings about unused imports.
154
155I've got a POM stubbed in, and created an account over at sonatype.
156If it isn't too hard, I will try to get 0.0.5 released into the maven
157universe. But that is still a bit away, I need TEditor running with
158syntax highlighting first.
159
160July 17, 2017
161
162Focus-follows-mouse is in, as is NOCLOSEBOX.
163
8c236a98
KL
164July 15, 2017
165
166I think I have cleaned up most of the window show/hide/activate mess
167in TApplication. Demo4 has some cool interactions between a
168background TDesktop and several foreground TWindows, which helped
169expose bugs.
170
171July 9, 2017
172
173While working on TWindow.hide/show I decided that I am sick of
174TApplication's active window handling. TApplication makes lots of
175assumptions, things are too fragile between modal and not, and one
176cannot easily say window.activate(). So I will also be changing that
177too. ... Code is still a bit of a mess, but hooks are in place at
178least for show/hide/activate.
179
180July 8, 2017
181
182Qodem 1.0.0 released last month, I had a vacation, and a Jexer user
183(nikiroo) started opening up pull requests. :-) So back unto the
184breach we go!
185
186TButton is now animated so that there is some feedback when selected
187via keyboard. StringJustifier was written which permits TText's to
188have left/centered/right and full justification. TDesktop is now in
189too which can act as a permanent max-sized window without borders.
190
191Next up is Viewport, an interface to collect scrollbar API, and then a
192cleaner API for scrollable widgets and windows. After that is more
193window API: hide/show/maximize/restore, and unclosable windows. I am
194cherry-picking bits from @nikiroo's PRs, which will likely break them
195before it fixes things, but I will find some way to get Niki credited
196with those pieces.
197
e685a47d
KL
198March 21, 2017
199
200I am starting to gear up for making Jexer a serious project now. I've
201created its SourceForge project, linked it back to GitHub, have most
202of its web page set up (looks like Qodem's), and released 0.0.4. And
203then this morning saw an out-of-bounds exception if you kill the main
204demo window. Glad I marked it Alpha on SourceForge...
205
206Yesterday I was digging around the other Turbo Vision derived projects
207while populating the about page, and made a sad/happy-ish realization:
208Embarcadero could probably get all of them shut down if it really
209wanted to, including Free Vision. I uncovered some hidden history in
210Free Vision, such that it appears that Graphics Vision had some
211licensed Borland code in it, so there might be enough mud in the air
212that Free Vision could be shut down the same way RHTVision was. But
213even worse is the SCOTUS ruling on Oracle vs Google: if APIs are
214copyrighted (regardless of their thoughts on fair use), then any
215software that matches the API of a proprietary project might find
216itself subject to an infringement case. So that too could shut down
217the other API-compatible TV clones.
218
219Fortunately, Jexer (and D-TUI) is completely new, and has no API
220compatibility with Turbo Vision. Jexer could be a new root to a whole
221generation of TUI applications.
222
a7986f7b
KL
223March 18, 2017
224
225TStatusBar is working, as is "smart" window placement. Overall this
226is looking quite nice. Found a lot of other small paper cut items and
227fixed them. It looks absolutely gorgeous on Mac now.
228
229Tomorrow I will get to the public wifi and get this uploaded.
230
231Time to call this 0.0.4 now though. We are up to 32,123 lines of
232code.
233
55d2b2c2
KL
234March 17, 2017
235
236Jexer is coming back to active development status. I had a lot of
237other projects ahead of it in the queue, mostly Qodem but also Jermit
238and of course lots of actual day job work keeping me too tired for
239afterhours stuff. But here we are now, and I want to get Jexer to its
2401.0.0 release before the end of 2018. After that it will be a
241critical bit of function for IWP and NIB, if I ever get those going.
242I need to re-organize the demo app a bit so that it fits within 80x25,
243and then get to TStatusBar.
244
245A status bar will be an optional part of TWindow. If it exists, then
246it will be drawn last by TApplication and get events routed to it from
247TWindow's event handlers. This will have the nice effect that the
248status bar can change depending on which window is active, without any
249real extra work on TApplication's part.
250
251Putting together a proper TODO now, with release and regression
252checklists. I think I will see if jexer is available at SourceForge,
253and if so grab it. Perhaps I can put together some good Turbo Vision
254resources too. At the very least direct people to the Borland-derived
255C++ releases and Free Vision.