2 * Jexer - Java Text User Interface
4 * License: LGPLv3 or later
6 * This module is licensed under the GNU Lesser General Public License
7 * Version 3. Please see the file "COPYING" in this directory for more
8 * information about the GNU Lesser General Public License Version 3.
10 * Copyright (C) 2015 Kevin Lamonte
12 * This program is free software; you can redistribute it and/or
13 * modify it under the terms of the GNU Lesser General Public License
14 * as published by the Free Software Foundation; either version 3 of
15 * the License, or (at your option) any later version.
17 * This program is distributed in the hope that it will be useful, but
18 * WITHOUT ANY WARRANTY; without even the implied warranty of
19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
20 * General Public License for more details.
22 * You should have received a copy of the GNU Lesser General Public
23 * License along with this program; if not, see
24 * http://www.gnu.org/licenses/, or write to the Free Software
25 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
28 * @author Kevin Lamonte [kevin.lamonte@gmail.com]
31 package jexer
.session
;
33 import java
.io
.BufferedReader
;
34 import java
.io
.InputStreamReader
;
35 import java
.io
.IOException
;
36 import java
.util
.Date
;
37 import java
.util
.StringTokenizer
;
40 * TTYSessionInfo queries environment variables and the tty window size for
41 * the session information. The username is taken from
42 * getpwuid(geteuid()).pw_name, language is taken from LANG, and text window
43 * size from ioctl(TIOCGWINSIZ).
45 public final class TTYSessionInfo
implements SessionInfo
{
50 private String username
= "";
55 private String language
= "";
58 * Text window width. Default is 80x24 (same as VT100-ish terminals).
60 private int windowWidth
= 80;
63 * Text window height. Default is 80x24 (same as VT100-ish terminals).
65 private int windowHeight
= 24;
68 * Time at which the window size was refreshed.
70 private Date lastQueryWindowTime
;
75 * @return the username
77 public String
getUsername() {
84 * @param username the value
86 public void setUsername(final String username
) {
87 this.username
= username
;
93 * @return the language
95 public String
getLanguage() {
102 * @param language the value
104 public void setLanguage(final String language
) {
105 this.language
= language
;
109 * Call 'stty size' to obtain the tty window size. windowWidth and
110 * windowHeight are set automatically.
112 private void sttyWindowSize() {
114 "/bin/sh", "-c", "stty size < /dev/tty"
117 Process process
= Runtime
.getRuntime().exec(cmd
);
118 BufferedReader in
= new BufferedReader(
119 new InputStreamReader(process
.getInputStream(), "UTF-8"));
120 String line
= in
.readLine();
121 if ((line
!= null) && (line
.length() > 0)) {
122 StringTokenizer tokenizer
= new StringTokenizer(line
);
123 windowHeight
= Integer
.parseInt(tokenizer
.nextToken());
124 windowWidth
= Integer
.parseInt(tokenizer
.nextToken());
127 BufferedReader err
= new BufferedReader(
128 new InputStreamReader(process
.getErrorStream(),
130 line
= err
.readLine();
131 if ((line
!= null) && (line
.length() > 0)) {
132 System
.err
.println("Error output from stty: " + line
);
137 } catch (InterruptedException e
) {
141 int rc
= process
.exitValue();
143 System
.err
.println("stty returned error code: " + rc
);
145 } catch (IOException e
) {
151 * Text window width getter.
153 * @return the window width
155 public int getWindowWidth() {
156 if (System
.getProperty("os.name").startsWith("Windows")) {
157 // Always use 80x25 for Windows (same as DOS)
164 * Text window height getter.
166 * @return the window height
168 public int getWindowHeight() {
169 if (System
.getProperty("os.name").startsWith("Windows")) {
170 // Always use 80x25 for Windows (same as DOS)
177 * Re-query the text window size.
179 public void queryWindowSize() {
180 if (lastQueryWindowTime
== null) {
181 lastQueryWindowTime
= new Date();
183 Date now
= new Date();
184 if (now
.getTime() - lastQueryWindowTime
.getTime() < 3000) {
185 // Don't re-spawn stty, it's been too soon.
189 if (System
.getProperty("os.name").startsWith("Linux")
190 || System
.getProperty("os.name").startsWith("Mac OS X")
191 || System
.getProperty("os.name").startsWith("SunOS")
192 || System
.getProperty("os.name").startsWith("FreeBSD")
194 // Use stty to get the window size
200 * Public constructor.
202 public TTYSessionInfo() {
203 // Populate lang and user from the environment
204 username
= System
.getProperty("user.name");
205 language
= System
.getProperty("user.language");