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