001 /** 002 * Copyright (C) 2009, Progress Software Corporation and/or its 003 * subsidiaries or affiliates. All rights reserved. 004 * 005 * Licensed under the Apache License, Version 2.0 (the "License"); 006 * you may not use this file except in compliance with the License. 007 * You may obtain a copy of the License at 008 * 009 * http://www.apache.org/licenses/LICENSE-2.0 010 * 011 * Unless required by applicable law or agreed to in writing, software 012 * distributed under the License is distributed on an "AS IS" BASIS, 013 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 014 * See the License for the specific language governing permissions and 015 * limitations under the License. 016 */ 017 package org.fusesource.jansi.internal; 018 019 import static org.fusesource.jansi.internal.Kernel32.*; 020 021 import org.fusesource.jansi.internal.Kernel32.CONSOLE_SCREEN_BUFFER_INFO; 022 023 /** 024 * 025 * @author <a href="http://hiramchirino.com">Hiram Chirino</a> 026 */ 027 public class WindowsSupport { 028 029 public static String getLastErrorMessage() { 030 int errorCode = GetLastError(); 031 int bufferSize = 160; 032 byte data[] = new byte[bufferSize]; 033 FormatMessageW(FORMAT_MESSAGE_FROM_SYSTEM, 0, errorCode, 0, data, bufferSize, null); 034 return new String(data); 035 } 036 037 ////////////////////////////////////////////////////////////////////////// 038 // 039 // The following helper methods are for jline 040 // 041 ////////////////////////////////////////////////////////////////////////// 042 043 public static int readByte() { 044 return _getch(); 045 } 046 047 public static int getConsoleMode() { 048 long hConsole = GetStdHandle (STD_INPUT_HANDLE); 049 if (hConsole == INVALID_HANDLE_VALUE) 050 return -1; 051 int mode[] = new int[1]; 052 if (GetConsoleMode (hConsole, mode)==0) 053 return -1; 054 return mode[0]; 055 } 056 057 public static void setConsoleMode(int mode) { 058 long hConsole = GetStdHandle (STD_INPUT_HANDLE); 059 if (hConsole == INVALID_HANDLE_VALUE) 060 return; 061 SetConsoleMode (hConsole, mode); 062 } 063 064 public static int getWindowsTerminalWidth() { 065 long outputHandle = GetStdHandle (STD_OUTPUT_HANDLE); 066 CONSOLE_SCREEN_BUFFER_INFO info = new CONSOLE_SCREEN_BUFFER_INFO(); 067 GetConsoleScreenBufferInfo (outputHandle, info); 068 return info.windowWidth(); 069 } 070 071 public static int getWindowsTerminalHeight() { 072 long outputHandle = GetStdHandle (STD_OUTPUT_HANDLE); 073 CONSOLE_SCREEN_BUFFER_INFO info = new CONSOLE_SCREEN_BUFFER_INFO(); 074 GetConsoleScreenBufferInfo (outputHandle, info); 075 return info.windowHeight(); 076 } 077 078 public static KEY_EVENT_RECORD readConsoleInput() { 079 long hConsole = GetStdHandle (STD_INPUT_HANDLE); 080 if (hConsole == INVALID_HANDLE_VALUE) 081 return null; 082 return readKeyEvent(hConsole); 083 } 084 085 }