Re: How does one find the terminal's width within the JVM?
Daniel Gee wrote:
I figured there might be no such simple solution, oh well.
If you know a target platform of your application, or more precisely,
have a limited types of terminals it will run on, then your goal is not
very difficult to achieve.
There are some ready to use libraries, functionality of which is based
on information you are looking for.
For example, for variety of terminals you may use JCurses
(http://sourceforge.net/projects/javacurses/):
jcurses.system.Toolkit.getScreenWidth();
or Charva (http://www.pitman.co.za/projects/charva/):
charva.awt.Toolkit.getDefaultToolkit().getScreenColumns();
That tools are not perfect, and on some platform/terminal combinations
they will give you a sort of your hard-coded assumption, rather than
actual terminal settings.
Of course, you may also use directly a native API of your target platform.
Below is a simple example making use of Windows API to display current
console info -- notice, that thanks to the JNA
(https://jna.dev.java.net/) my own native code is no more needed to
support system calls.
piotr
import com.sun.jna.Native;
import com.sun.jna.Structure;
import com.sun.jna.win32.StdCallLibrary;
public class ConsoleInfo {
public interface Kernel32 extends StdCallLibrary {
Kernel32 INSTANCE = (Kernel32)
Native.loadLibrary("kernel32", Kernel32.class);
int STD_INPUT_HANDLE = -10;
int STD_OUTPUT_HANDLE = -11;
int STD_ERROR_HANDLE = -12;
int GetStdHandle(
int nStdHandle
);
public static class CONSOLE_SCREEN_BUFFER_INFO extends Structure {
public short wSizeX; // effective console width
public short wSizeY;
public short wCursorPositionX;
public short wCursorPositionY;
public short wAttributes;
public short wWindowLeft;
public short wWindowTop;
public short wWindowRight;
public short wWindowBottom;
public short wMaximumWindowSizeX;
public short wMaximumWindowSizeY;
}
boolean GetConsoleScreenBufferInfo(
int hConsoleOutput,
CONSOLE_SCREEN_BUFFER_INFO lpConsoleScreenBufferInfo
);
}
public static void main(String[] args) {
Kernel32 lib = Kernel32.INSTANCE;
int h = lib.GetStdHandle(Kernel32.STD_OUTPUT_HANDLE);
Kernel32.CONSOLE_SCREEN_BUFFER_INFO info
= new Kernel32.CONSOLE_SCREEN_BUFFER_INFO();
lib.GetConsoleScreenBufferInfo(h, info);
System.out.printf("size .x=%d .y=%d\n",
info.wSizeX, info.wSizeY);
System.out.printf("cursor .x=%d .y=%d\n",
info.wCursorPositionX, info.wCursorPositionY);
System.out.printf("window .left=%d .top=%d .right=%d .bottom=%d\n",
info.wWindowLeft, info.wWindowTop, info.wWindowRight,
info.wWindowBottom);
System.out.printf("max-window-size .x=%d .y=%d\n",
info.wMaximumWindowSizeX, info.wMaximumWindowSizeY);
}
}