terminal.py revision 7816
113540Sandrea.mondelli@ucf.edu# Copyright (c) 2011 Advanced Micro Devices, Inc. 212893Sbrandon.potter@amd.com# All rights reserved. 312893Sbrandon.potter@amd.com# 412893Sbrandon.potter@amd.com# Redistribution and use in source and binary forms, with or without 512893Sbrandon.potter@amd.com# modification, are permitted provided that the following conditions are 612893Sbrandon.potter@amd.com# met: redistributions of source code must retain the above copyright 712893Sbrandon.potter@amd.com# notice, this list of conditions and the following disclaimer; 812893Sbrandon.potter@amd.com# redistributions in binary form must reproduce the above copyright 912893Sbrandon.potter@amd.com# notice, this list of conditions and the following disclaimer in the 1012893Sbrandon.potter@amd.com# documentation and/or other materials provided with the distribution; 1112893Sbrandon.potter@amd.com# neither the name of the copyright holders nor the names of its 1212893Sbrandon.potter@amd.com# contributors may be used to endorse or promote products derived from 1312893Sbrandon.potter@amd.com# this software without specific prior written permission. 1412893Sbrandon.potter@amd.com# 1512893Sbrandon.potter@amd.com# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 1612893Sbrandon.potter@amd.com# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 1712893Sbrandon.potter@amd.com# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 1812893Sbrandon.potter@amd.com# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 1912893Sbrandon.potter@amd.com# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 2012893Sbrandon.potter@amd.com# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 2112893Sbrandon.potter@amd.com# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2212893Sbrandon.potter@amd.com# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2312893Sbrandon.potter@amd.com# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2412893Sbrandon.potter@amd.com# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 2512893Sbrandon.potter@amd.com# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2612893Sbrandon.potter@amd.com# 2712893Sbrandon.potter@amd.com# Author: Steve Reinhardt 2812893Sbrandon.potter@amd.com 2912893Sbrandon.potter@amd.comimport sys 3012893Sbrandon.potter@amd.com 3112893Sbrandon.potter@amd.com# Intended usage example: 3212893Sbrandon.potter@amd.com# 3312893Sbrandon.potter@amd.com# if force_colors: 3412893Sbrandon.potter@amd.com# from m5.util.terminal import termcap 3512893Sbrandon.potter@amd.com# elif no_colors: 3612893Sbrandon.potter@amd.com# from m5.util.terminal import no_termcap as termcap 3712893Sbrandon.potter@amd.com# else: 3812893Sbrandon.potter@amd.com# from m5.util.terminal import tty_termcap as termcap 3912893Sbrandon.potter@amd.com# print termcap.Blue + "This could be blue!" + termcap.Normal 4012893Sbrandon.potter@amd.com 4112893Sbrandon.potter@amd.com# ANSI color names in index order 4212893Sbrandon.potter@amd.comcolor_names = "Black Red Green Yellow Blue Magenta Cyan".split() 4312893Sbrandon.potter@amd.com 4412893Sbrandon.potter@amd.com# Character attribute capabilities. Note that not all terminals 4512893Sbrandon.potter@amd.com# support all of these capabilities, or support them 4612893Sbrandon.potter@amd.com# differently/meaningfully. For example: 4712893Sbrandon.potter@amd.com# 4812893Sbrandon.potter@amd.com# - In PuTTY (with the default settings), Dim has no effect, Standout 4912893Sbrandon.potter@amd.com# is the same as Reverse, and Blink does not blink but switches to a 5012893Sbrandon.potter@amd.com# gray background. 5112893Sbrandon.potter@amd.com# 5212893Sbrandon.potter@amd.com# Please feel free to add information about other terminals here. 5312893Sbrandon.potter@amd.com# 5412893Sbrandon.potter@amd.comcapability_map = { 5512893Sbrandon.potter@amd.com 'Bold': 'bold', 5612893Sbrandon.potter@amd.com 'Dim': 'dim', 5712893Sbrandon.potter@amd.com 'Blink': 'blink', 5812893Sbrandon.potter@amd.com 'Underline': 'smul', 5912893Sbrandon.potter@amd.com 'Reverse': 'rev', 6012893Sbrandon.potter@amd.com 'Standout': 'smso', 6112893Sbrandon.potter@amd.com 'Normal': 'sgr0' 6212893Sbrandon.potter@amd.com} 6312893Sbrandon.potter@amd.com 6412893Sbrandon.potter@amd.comcapability_names = capability_map.keys() 6512893Sbrandon.potter@amd.com 6612893Sbrandon.potter@amd.comdef null_cap_string(s, *args): 6712893Sbrandon.potter@amd.com return '' 6812893Sbrandon.potter@amd.com 6912893Sbrandon.potter@amd.comtry: 7012893Sbrandon.potter@amd.com import curses 7112893Sbrandon.potter@amd.com curses.setupterm() 7212893Sbrandon.potter@amd.com def cap_string(s, *args): 7312893Sbrandon.potter@amd.com cap = curses.tigetstr(s) 7412893Sbrandon.potter@amd.com if cap: 7512893Sbrandon.potter@amd.com return curses.tparm(cap, *args) 7612893Sbrandon.potter@amd.com else: 7712893Sbrandon.potter@amd.com return '' 7812893Sbrandon.potter@amd.comexcept: 7912893Sbrandon.potter@amd.com cap_string = null_cap_string 8012893Sbrandon.potter@amd.com 8112893Sbrandon.potter@amd.comclass ColorStrings(object): 8212893Sbrandon.potter@amd.com def __init__(self, cap_string): 8312893Sbrandon.potter@amd.com for i, c in enumerate(color_names): 8412893Sbrandon.potter@amd.com setattr(self, c, cap_string('setaf', i)) 8512893Sbrandon.potter@amd.com for name, cap in capability_map.iteritems(): 8612893Sbrandon.potter@amd.com setattr(self, name, cap_string(cap)) 8712893Sbrandon.potter@amd.com 8812893Sbrandon.potter@amd.comtermcap = ColorStrings(cap_string) 8912893Sbrandon.potter@amd.comno_termcap = ColorStrings(null_cap_string) 9012893Sbrandon.potter@amd.com 9112893Sbrandon.potter@amd.comif sys.stdout.isatty(): 9212893Sbrandon.potter@amd.com tty_termcap = termcap 9312893Sbrandon.potter@amd.comelse: 9412893Sbrandon.potter@amd.com tty_termcap = no_termcap 9512893Sbrandon.potter@amd.com 9612893Sbrandon.potter@amd.comdef test_termcap(obj): 9712893Sbrandon.potter@amd.com for c_name in color_names: 9812893Sbrandon.potter@amd.com c_str = getattr(obj, c_name) 9912893Sbrandon.potter@amd.com print c_str + c_name + obj.Normal 10012893Sbrandon.potter@amd.com for attr_name in capability_names: 10112893Sbrandon.potter@amd.com if attr_name == 'Normal': 10212893Sbrandon.potter@amd.com continue 10312893Sbrandon.potter@amd.com attr_str = getattr(obj, attr_name) 10412893Sbrandon.potter@amd.com print attr_str + c_str + attr_name + " " + c_name + obj.Normal 10512893Sbrandon.potter@amd.com print obj.Bold + obj.Underline + \ 10612893Sbrandon.potter@amd.com c_name + "Bold Underline " + c + obj.Normal 10712893Sbrandon.potter@amd.com 10812893Sbrandon.potter@amd.comif __name__ == '__main__': 10912893Sbrandon.potter@amd.com print "=== termcap enabled ===" 11012893Sbrandon.potter@amd.com test_termcap(termcap) 11112893Sbrandon.potter@amd.com print termcap.Normal 11212893Sbrandon.potter@amd.com print "=== termcap disabled ===" 11312893Sbrandon.potter@amd.com test_termcap(no_termcap) 11412893Sbrandon.potter@amd.com