Maven Central in the README
[nikiroo-utils.git] / README.md
CommitLineData
7d4115a5
KL
1Jexer - Java Text User Interface library
2========================================
3
3cb99336
KL
4This library implements a text-based windowing system loosely
5reminiscient of Borland's [Turbo
6Vision](http://en.wikipedia.org/wiki/Turbo_Vision) system. (For those
7wishing to use the actual C++ Turbo Vision library, see [Sergio
8Sigala's C++ version based on the sources released by
9Borland,](http://tvision.sourceforge.net/) or consider Free Pascal's
10[Free Vision library.](http://wiki.freepascal.org/Free_Vision))
30bd4abd 11
4b257bd8 12Jexer currently supports three backends:
1ac2ccb1 13
30bd4abd
KL
14* System.in/out to a command-line ECMA-48 / ANSI X3.64 type terminal
15 (tested on Linux + xterm). I/O is handled through terminal escape
16 sequences generated by the library itself: ncurses is not required
a69ed767 17 or linked to. xterm mouse tracking is supported using both UTF8 and
3cb99336
KL
18 SGR coordinates. Images are optionally rendered via sixel graphics
19 (see jexer.ECMA48.sixel). For the demo application, this is the
20 default backend on non-Windows/non-Mac platforms.
1ac2ccb1 21
55b4f29b 22* The same command-line ECMA-48 / ANSI X3.64 type terminal as above,
31b7033c
KL
23 but to any general InputStream/OutputStream or Reader/Writer. See
24 the file jexer.demos.Demo2 for an example of running the demo over a
3cb99336
KL
25 TCP (telnet) socket. jexer.demos.Demo3 demonstrates how one might
26 use a character encoding than the default UTF-8.
55b4f29b 27
c447c6e5
KL
28* Java Swing UI. The default window size for Swing is 80x25 and 20
29 point font; this can be changed in the TApplication(BackendType)
30 constructor. For the demo applications, this is the default backend
31 on Windows and Mac platforms. This backend can be explicitly
32 selected for the demo applications by setting jexer.Swing=true.
1ac2ccb1 33
a4406f4e
KL
34Additional backends can be created by subclassing
35jexer.backend.Backend and passing it into the TApplication
fe0770f9 36constructor. See Demo5 and Demo6 for examples of other backends.
1ac2ccb1 37
1c15371a
KL
38The Jexer homepage, which includes additional information and binary
39release downloads, is at: https://jexer.sourceforge.io . The Jexer
a69ed767 40source code is hosted at: https://gitlab.com/klamonte/jexer .
1c15371a 41
1ac2ccb1 42
7d4115a5
KL
43
44License
45-------
46
e16dda65
KL
47This project is licensed under the MIT License. See the file LICENSE
48for the full license text.
7d4115a5
KL
49
50
1596e11a
KL
51Maven
52-----
53
54Jexer is available on Maven Central:
55
56```xml
57<dependency>
58 <groupId>com.gitlab.klamonte</groupId>
59 <artifactId>jexer</artifactId>
60 <version>0.3.0</version>
61</dependency>
62```
63
64
30bd4abd
KL
65
66Acknowledgements
67----------------
68
69Jexer makes use of the Terminus TrueType font [made available
70here](http://files.ax86.net/terminus-ttf/) .
71
72
73
7d4115a5
KL
74Usage
75-----
76
4b257bd8 77Simply subclass TApplication and then run it in a new thread:
7d4115a5
KL
78
79```Java
80import jexer.*;
81
4b257bd8 82class MyApplication extends TApplication {
7d4115a5 83
4b257bd8 84 public MyApplication() throws Exception {
a4406f4e 85 super(BackendType.SWING); // Could also use BackendType.XTERM
7d4115a5 86
fca67db0
KL
87 // Create standard menus for File and Window
88 addFileMenu();
89 addWindowMenu();
4b257bd8 90
d36057df
KL
91 // Add a custom window, see below for its code. The TWindow
92 // constructor will add it to this application.
93 new MyWindow(this);
7d4115a5
KL
94 }
95
96 public static void main(String [] args) {
4b257bd8
KL
97 try {
98 MyApplication app = new MyApplication();
99 (new Thread(app)).start();
100 } catch (Throwable t) {
101 t.printStackTrace();
102 }
7d4115a5
KL
103 }
104}
105```
106
4b257bd8
KL
107Similarly, subclass TWindow and add some widgets:
108
109```Java
110class MyWindow extends TWindow {
111
112 public MyWindow(TApplication application) {
113 // See TWindow's API for several constructors. This one uses the
114 // application, title, width, and height. Note that the window width
115 // and height include the borders. The widgets inside the window
116 // will see (0, 0) as the top-left corner inside the borders,
117 // i.e. what the window would see as (1, 1).
118 super(application, "My Window", 30, 20);
119
120 // See TWidget's API for convenience methods to add various kinds of
121 // widgets. Note that ANY widget can be a container for other
122 // widgets: TRadioGroup for example has TRadioButtons as child
123 // widgets.
124
125 // We will add a basic label, text entry field, and button.
126 addLabel("This is a label", 5, 3);
127 addField(5, 5, 20, false, "enter text here");
128 // For the button, we will pop up a message box if the user presses
129 // it.
130 addButton("Press &Me!", 5, 8, new TAction() {
131 public void DO() {
132 MyWindow.this.messageBox("Box Title", "You pressed me, yay!");
133 }
134 } );
135 }
136}
137```
138
139Put these into a file, compile it with jexer.jar in the classpath, run
140it and you'll see an application like this:
141
142![The Example Code Above](/screenshots/readme_application.png?raw=true "The application in the text of README.md")
143
144See the files in jexer.demos for many more detailed examples showing
92453213
KL
145all of the existing UI controls. The available demos can be run as
146follows:
4b257bd8
KL
147
148 * 'java -jar jexer.jar' . This will use System.in/out with
92453213
KL
149 xterm-like sequences on non-Windows non-Mac platforms. On Windows
150 and Mac it will use a Swing JFrame.
4b257bd8
KL
151
152 * 'java -Djexer.Swing=true -jar jexer.jar' . This will always use
153 Swing on any platform.
154
155 * 'java -cp jexer.jar jexer.demos.Demo2 PORT' (where PORT is a
156 number to run the TCP daemon on). This will use the telnet
157 protocol to establish an 8-bit clean channel and be aware of
158 screen size changes.
159
92453213
KL
160 * 'java -cp jexer.jar jexer.demos.Demo3' . This will use
161 System.in/out with xterm-like sequences. One can see in the code
162 how to pass a different InputReader and OutputReader to
163 TApplication, permitting a different encoding than UTF-8.
164
165 * 'java -cp jexer.jar jexer.demos.Demo4' . This demonstrates hidden
166 windows and a custom TDesktop.
167
88a99379
KL
168 * 'java -cp jexer.jar jexer.demos.Demo5' . This demonstrates two
169 demo applications using different fonts in the same Swing frame.
170
15c86fc2
KL
171 * 'java -cp jexer.jar jexer.demos.Demo6' . This demonstrates two
172 applications performing I/O across three screens: an xterm screen
173 and Swing screen, monitored from a third Swing screen.
88a99379 174
4b257bd8
KL
175
176
177More Screenshots
178----------------
179
180![Several Windows Open Including A Terminal](/screenshots/screenshot1.png?raw=true "Several Windows Open Including A Terminal")
181
182![Yo Dawg...](/screenshots/yodawg.png?raw=true "Yo Dawg, I heard you like text windowing systems, so I ran a text windowing system inside your text windowing system so you can have a terminal in your terminal.")
183
3cb99336
KL
184![Sixel Pictures Of Cliffs Of Moher And Buoy](/screenshots/sixel_images.png?raw=true "Sixel Pictures Of Cliffs Of Moher And Buoy")
185
186![Sixel Color Wheel](/screenshots/sixel_color_wheel.png?raw=true "Sixel Color Wheel")
187
4b257bd8
KL
188
189
190System Properties
191-----------------
192
193The following properties control features of Jexer:
194
195 jexer.Swing
196 -----------
197
92453213
KL
198 Used only by jexer.demos.Demo1 and jexer.demos.Demo4. If true, use
199 the Swing interface for the demo application. Default: true on
200 Windows (os.name starts with "Windows") and Mac (os.name starts with
201 "Mac"), false on non-Windows and non-Mac platforms.
4b257bd8
KL
202
203 jexer.Swing.cursorStyle
204 -----------------------
205
d79f1f31
KL
206 Used by jexer.backend.SwingTerminal. Selects the cursor style to
207 draw. Valid values are: underline, block, outline. Default:
208 underline.
30bd4abd 209
e685a47d
KL
210 jexer.Swing.tripleBuffer
211 ------------------------
212
d79f1f31
KL
213 Used by jexer.backend.SwingTerminal. If true, use triple-buffering
214 which reduces screen tearing but may also be slower to draw on
215 slower systems. If false, use naive Swing thread drawing, which may
216 be faster on slower systems but also more likely to have screen
92453213 217 tearing. Default: true.
e685a47d 218
1d99a38f
KL
219 jexer.TTerminal.ptypipe
220 -----------------------
221
222 Used by jexer.TTerminalWindow. If true, spawn shell using the
223 'ptypipe' utility rather than 'script'. This permits terminals to
224 resize with the window. ptypipe is a separate C language utility,
a69ed767
KL
225 available at https://gitlab.com/klamonte/ptypipe. Default: false.
226
3cb99336
KL
227 jexer.TTerminal.closeOnExit
228 ---------------------------
229
230 Used by jexer.TTerminalWindow. If true, close the window when the
231 spawned shell exits. Default: false.
232
a69ed767
KL
233 jexer.ECMA48.rgbColor
234 ---------------------
235
236 Used by jexer.backend.ECMA48Terminal. If true, emit T.416-style RGB
237 colors for normal system colors. This is expensive in bandwidth,
238 and potentially terrible looking for non-xterms. Default: false.
1d99a38f 239
3cb99336
KL
240 jexer.ECMA48.sixel
241 ------------------
242
243 Used by jexer.backend.ECMA48Terminal. If true, emit image data
244 using sixel, otherwise show blank cells where images could be. This
245 is expensive in bandwidth, very expensive in CPU (especially for
246 large images), and will leave artifacts on the screen if the
247 terminal does not support sixel. Default: true.
248
30bd4abd 249
7d4115a5 250
92554d64
KL
251Known Issues / Arbitrary Decisions
252----------------------------------
253
254Some arbitrary design decisions had to be made when either the
255obviously expected behavior did not happen or when a specification was
256ambiguous. This section describes such issues.
257
bd8d51fa
KL
258 - See jexer.tterminal.ECMA48 for more specifics of terminal
259 emulation limitations.
260
a4406f4e
KL
261 - TTerminalWindow uses cmd.exe on Windows. Output will not be seen
262 until enter is pressed, due to cmd.exe's use of line-oriented
263 input (see the ENABLE_LINE_INPUT flag for GetConsoleMode() and
264 SetConsoleMode()).
92554d64 265
1d99a38f
KL
266 - TTerminalWindow by default launches 'script -fqe /dev/null' or
267 'script -q -F /dev/null' on non-Windows platforms. This is a
268 workaround for the C library behavior of checking for a tty:
269 script launches $SHELL in a pseudo-tty. This works on Linux and
270 Mac but might not on other Posix-y platforms.
b5f2a6db 271
5dfd1c11
KL
272 - Closing a TTerminalWindow without exiting the process inside it
273 may result in a zombie 'script' process.
274
3cb99336
KL
275 - When using the Swing backend, and not using 'ptypipe', closing a
276 TTerminalWindow without exiting the process inside it may result
277 in a SIGTERM to the JVM causing it to crash. The root cause is
278 currently unknown, but is potentially a bug in more recent
279 releases of the 'script' utility from the util-linux package.
280
1d99a38f
KL
281 - TTerminalWindow can only notify the child process of changes in
282 window size if using the 'ptypipe' utility, due to Java's lack of
283 support for forkpty() and similar. ptypipe is available at
a69ed767 284 https://gitlab.com/klamonte/ptypipe.
fe0770f9 285
e3dfbd23
KL
286 - Java's InputStreamReader as used by the ECMA48 backend requires a
287 valid UTF-8 stream. The default X10 encoding for mouse
288 coordinates outside (160,94) can corrupt that stream, at best
289 putting garbage keyboard events in the input queue but at worst
290 causing the backend reader thread to throw an Exception and exit
291 and make the entire UI unusable. Mouse support therefore requires
292 a terminal that can deliver either UTF-8 coordinates (1005 mode)
293 or SGR coordinates (1006 mode). Most modern terminals can do
294 this.
b5f2a6db
KL
295
296 - jexer.session.TTYSession calls 'stty size' once every second to
297 check the current window size, performing the same function as
298 ioctl(TIOCGWINSZ) but without requiring a native library.
299
d79f1f31
KL
300 - jexer.backend.ECMA48Terminal calls 'stty' to perform the
301 equivalent of cfmakeraw() when using System.in/out. System.out is
302 also (blindly!) put in 'stty sane cooked' mode when exiting.
55b4f29b 303
3cb99336
KL
304 - jexer.backend.ECMA48Terminal uses a single palette containing
305 MAX_COLOR_REGISTERS colors for all sixel images. These colors are
306 generated in the SixelPalette.makePalette() method with bits for
307 hue, saturation, and luminance, and the two extremes set to pure
308 black and pure white. This provides a reasonable general-purpose
309 palette light on CPU, but at a cost that individual images do not
310 look as good as the terminal is actually capable of.
b5f2a6db
KL
311
312
7d4115a5 313
3cb99336
KL
314See Also
315--------
316
317[Tranquil Java IDE](https://tjide.sourceforge.io) is a TUI-based
318integrated development environment for the Java language that was
319built using a very lightly modified GPL version of Jexer. TJ provided
320a real-world use case to shake out numerous bugs and limitations of
321Jexer.
c60550e5
KL
322
323
324
325Maintainers Wanted
326------------------
327
328Both Jexer and TJIDE are seeking additional maintainers. I am not in
329a position in life to take on significant off-hours programming work,
330and am willing to hand these projects over to one or more persons with
331time and interest.
332
333My personal code design philosophy for TJIDE/Jexer is outlined at
334https://gitlab.com/klamonte/tjide/blob/master/java/docs/code_design.txt
335. I realize that some of the features listed below may require
336deviations from this philosophy, but this is what I have built so far.
337
338Some of the areas that will likely require significant efforts are:
339
340 * Editor improvements. The editor is currently very minimalistic,
341 much closer to MS-DOS edit.com than a real programmer's editor.
342 Users will probably desire many more features: drag-and-drop, real
343 syntax or at least regexp highlighting (not just keywords), paren
344 matching, paragraph/comment reflow, and dozens more. The
345 underlying Document/Line/Word model is not going to be sufficient
81377654 346 to meet these features.
c60550e5
KL
347
348 * Better Windows and OSX support. It would be nice to ship a
349 jlink'ed JVM on these platforms with the JRE, JDK, and JPDA
350 modules all together. For Windows, it might be preferable to
351 consider doing any of the following: ship a third-party terminal,
352 use PowerShell, or use the newer ConPTY for TTerminalWindow.
353
81377654 354 * Bug fixes. The Jexer codebase is quite large despite my best
c60550e5
KL
355 efforts. Bugs are typically very small to fix, but can take some
356 time to find: a simple NPE or AssertionError can sometimes take
357 4-8 hours to squash. Fortunately, fixing issues in one place has
358 not often led to breakages elsewhere.
359
81377654 360 * New Jexer applications. So far as I know, Jexer is the only
c60550e5
KL
361 mouse-supporting full TUI windowing framework with sixel image
362 support in existence. I cannot predict what kinds of applications
363 could be built out of it, and how those needs will push back to
364 the framework.
365
366These are what I can clearly see right now. Obviously users are
367capable of finding many more.
368
81377654 369I intend to continue poking on Jexer and TJIDE, and will maintain a
c60550e5
KL
370branch to be "the fastest and simplest Java language IDE available",
371which will deliberately remain small.
372
81377654
KL
373I hope that other languages choose to transliterate Jexer to provide
374TUIs to their own platforms. I will be happy to help them understand
375the code to support those efforts.