pax_global_header00006660000000000000000000000064135417351130014515gustar00rootroot0000000000000052 comment=4d152cc2622d491e1b0a034c3211b9df28c0ba2d tcell-1.3.0/000077500000000000000000000000001354173511300126215ustar00rootroot00000000000000tcell-1.3.0/.appveyor.yml000066400000000000000000000004231354173511300152660ustar00rootroot00000000000000version: 1.0.{build} clone_folder: c:\gopath\src\github.com\gdamore\tcell environment: GOPATH: c:\gopath build_script: - go version - go env - SET PATH=%LOCALAPPDATA%\atom\bin;%GOPATH%\bin;%PATH% - go get -t ./... - go build - go install ./... test_script: - go test ./... tcell-1.3.0/.gitignore000066400000000000000000000000151354173511300146050ustar00rootroot00000000000000coverage.txt tcell-1.3.0/.travis.yml000066400000000000000000000003371354173511300147350ustar00rootroot00000000000000language: go go: - 1.10.x - 1.11.x - master before_install: - go get -t -v ./... script: - go test -race -coverprofile=coverage.txt -covermode=atomic after_success: - bash <(curl -s https://codecov.io/bash) tcell-1.3.0/AUTHORS000066400000000000000000000002331354173511300136670ustar00rootroot00000000000000Garrett D'Amore Zachary Yedidia Junegunn Choi Staysail Systems, Inc. tcell-1.3.0/LICENSE000066400000000000000000000261361354173511300136360ustar00rootroot00000000000000 Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright [yyyy] [name of copyright owner] Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. tcell-1.3.0/README.adoc000066400000000000000000000307071354173511300144150ustar00rootroot00000000000000= tcell image:https://img.shields.io/travis/gdamore/tcell.svg?label=linux[Linux Status,link="https://travis-ci.org/gdamore/tcell"] image:https://img.shields.io/appveyor/ci/gdamore/tcell.svg?label=windows[Windows Status,link="https://ci.appveyor.com/project/gdamore/tcell"] image:https://img.shields.io/badge/license-APACHE2-blue.svg[Apache License,link="https://github.com/gdamore/tcell/blob/master/LICENSE"] image:https://img.shields.io/badge/gitter-join-brightgreen.svg[Gitter,link="https://gitter.im/gdamore/tcell"] image:https://img.shields.io/badge/godoc-reference-blue.svg[GoDoc,link="https://godoc.org/github.com/gdamore/tcell"] image:http://goreportcard.com/badge/gdamore/tcell[Go Report Card,link="http://goreportcard.com/report/gdamore/tcell"] image:https://codecov.io/gh/gdamore/tcell/branch/master/graph/badge.svg[codecov,link="https://codecov.io/gh/gdamore/tcell"] image:https://tidelift.com/badges/github/gdamore/tcell?style=flat[Dependencies] [cols="2",grid="none"] |=== |_Tcell_ is a _Go_ package that provides a cell based view for text terminals, like _xterm_. It was inspired by _termbox_, but includes many additional improvements. a|[.right] image::logos/tcell.png[float="right"] |=== ## Examples * https://github.com/gdamore/proxima5[proxima5] - space shooter (https://youtu.be/jNxKTCmY_bQ[video]) * https://github.com/gdamore/govisor[govisor] - service management UI (http://2.bp.blogspot.com/--OsvnfzSNow/Vf7aqMw3zXI/AAAAAAAAARo/uOMtOvw4Sbg/s1600/Screen%2BShot%2B2015-09-20%2Bat%2B9.08.41%2BAM.png[screenshot]) * mouse demo - included mouse test (http://2.bp.blogspot.com/-fWvW5opT0es/VhIdItdKqJI/AAAAAAAAATE/7Ojc0L1SpB0/s1600/Screen%2BShot%2B2015-10-04%2Bat%2B11.47.13%2BPM.png[screenshot]) * https://github.com/gdamore/gomatrix[gomatrix] - converted from Termbox * https://github.com/zyedidia/micro/[micro] - lightweight text editor with syntax-highlighting and themes * https://github.com/viktomas/godu[godu] - simple golang utility helping to discover large files/folders. * https://github.com/rivo/tview[tview] - rich interactive widgets for terminal UIs * https://github.com/marcusolsson/tui-go[tui-go] - UI library for terminal apps * https://github.com/rgm3/gomandelbrot[gomandelbrot] - Mandelbrot! * https://github.com/senorprogrammer/wtf[WTF]- Personal information dashboard for your terminal * https://github.com/browsh-org/browsh[browsh] - A fully-modern text-based browser, rendering to TTY and browsers (https://www.youtube.com/watch?v=HZq86XfBoRo[video]) * https://github.com/sachaos/go-life[go-life] - Conway's Game of Life. * https://github.com/gcla/gowid[gowid] - compositional widgets for terminal UIs, inspired by urwid * https://termshark.io[termshark] - a terminal UI for tshark, inspired by Wireshark, built on gowid ## Pure Go Terminfo Database _Tcell_ includes a full parser and expander for terminfo capability strings, so that it can avoid hard coding escape strings for formatting. It also favors portability, and includes support for all POSIX systems. The database is also flexible & extensible, and can modified by either running a program to build the entire database, or an entry for just a single terminal. ## More Portable _Tcell_ is portable to a wide variety of systems. _Tcell_ is believed to work with all of the systems officially supported by golang with the exception of nacl (which lacks any kind of a terminal interface). (Plan9 is not supported by _Tcell_, but it is experimental status only in golang.) For all of these systems *except Solaris/illumos*, _Tcell_ is pure Go, with no need for CGO. ## No Async IO _Tcell_ is able to operate without requiring `SIGIO` signals (unlike _termbox_), or asynchronous I/O, and can instead use standard Go file objects and Go routines. This means it should be safe, especially for use with programs that use exec, or otherwise need to manipulate the tty streams. This model is also much closer to idiomatic Go, leading to fewer surprises. ## Rich Unicode & non-Unicode support _Tcell_ includes enhanced support for Unicode, including wide characters and combining characters, provided your terminal can support them. Note that Windows terminals generally don't support the full Unicode repertoire. It will also convert to and from Unicode locales, so that the program can work with UTF-8 internally, and get reasonable output in other locales. _Tcell_ tries hard to convert to native characters on both input and output, and on output _Tcell_ even makes use of the alternate character set to facilitate drawing certain characters. ## More Function Keys _Tcell_ also has richer support for a larger number of special keys that some terminals can send. ## Better Color Handling _Tcell_ will respect your terminal's color space as specified within your terminfo entries, so that for example attempts to emit color sequences on VT100 terminals won't result in unintended consequences. In Windows mode, _Tcell_ supports 16 colors, bold, dim, and reverse, instead of just termbox's 8 colors with reverse. (Note that there is some conflation with bold/dim and colors.) _Tcell_ maps 16 colors down to 8, for terminals that need it. (The upper 8 colors are just brighter versions of the lower 8.) ## Better Mouse Support _Tcell_ supports enhanced mouse tracking mode, so your application can receive regular mouse motion events, and wheel events, if your terminal supports it. ## _Termbox_ Compatibility A compatibility layer for _termbox_ is provided in the `compat` directory. To use it, try importing `github.com/gdamore/tcell/termbox` instead. Most _termbox-go_ programs will probably work without further modification. ## Working With Unicode Internally Tcell uses UTF-8, just like Go. However, Tcell understands how to convert to and from other character sets, using the capabilities of the `golang.org/x/text/encoding packages`. Your application must supply them, as the full set of the most common ones bloats the program by about 2MB. If you're lazy, and want them all anyway, see the `encoding` sub-directory. ## Wide & Combining Characters The `SetContent()` API takes a primary rune, and an optional list of combining runes. If any of the runes is a wide (East Asian) rune occupying two cells, then the library will skip output from the following cell, but care must be taken in the application to avoid explicitly attempting to set content in the next cell, otherwise the results are undefined. (Normally wide character is displayed, and the other character is not; do not depend on that behavior.) Experience has shown that the vanilla Windows 8 console application does not support any of these characters properly, but at least some options like _ConEmu_ do support Wide characters. ## Colors _Tcell_ assumes the ANSI/XTerm color model, including the 256 color map that XTerm uses when it supports 256 colors. The terminfo guidance will be honored, with respect to the number of colors supported. Also, only terminals which expose ANSI style `setaf` and `setab` will support color; if you have a color terminal that only has `setf` and `setb`, please let me know; it wouldn't be hard to add that if there is need. ## 24-bit Color _Tcell_ _supports true color_! (That is, if your terminal can support it, _Tcell_ can accurately display 24-bit color.) To use 24-bit color, you need to use a terminal that supports it. Modern xterm and similar teminal emulators can support this. As terminfo lacks any way to describe this capability, we fabricate the capability for terminals with names ending in `*-truecolor`. The stock distribution ships with a database that defines `xterm-truecolor`. To try it out, set your `TERM` variable to `xterm-truecolor`. When using TrueColor, programs will display the colors that the programmer intended, overriding any "`themes`" you may have set in your terminal emulator. (For some cases, accurate color fidelity is more important than respecting themes. For other cases, such as typical text apps that only use a few colors, its more desirable to respect the themes that the user has established.) If you find this undesirable, you can either use a `TERM` variable that lacks the `TRUECOLOR` setting, or set `TCELL_TRUECOLOR=disable` in your environment. ## Performance Reasonable attempts have been made to minimize sending data to terminals, avoiding repeated sequences or drawing the same cell on refresh updates. ## Terminfo (Not relevent for Windows users.) The Terminfo implementation operates with two forms of database. The first is the built-in go database, which contains a number of real database entries that are compiled into the program directly. This should minimize calling out to database file searches. The second is in the form of JSON files, that contain the same information, which can be located either by the `$TCELLDB` environment file, `$HOME/.tcelldb`, or is located in the Go source directory as `database.json`. These files (both the Go and the JSON files) can be generated using the mkinfo.go program. If you need to regnerate the entire set for some reason, run the mkdatabase.sh file. The generation uses the infocmp(1) program on the system to collect the necessary information. The `mkinfo.go` program can also be used to generate specific database entries for named terminals, in case your favorite terminal is missing. (If you find that this is the case, please let me know and I'll try to add it!) _Tcell_ requires that the terminal support the `cup` mode of cursor addressing. Terminals without absolute cursor addressability are not supported. This is unlikely to be a problem; such terminals have not been mass produced since the early 1970s. ## Mouse Support Mouse support is detected via the `kmous` terminfo variable, however, enablement/disablement and decoding mouse events is done using hard coded sequences based on the XTerm X11 model. As of this writing all popular terminals with mouse tracking support this model. (Full terminfo support is not possible as terminfo sequences are not defined.) On Windows, the mouse works normally. Mouse wheel buttons on various terminals are known to work, but the support in terminal emulators, as well as support for various buttons and live mouse tracking, varies widely. Modern _xterm_, macOS _Terminal_, and _iTerm_ all work well. ## Testablity There is a `SimulationScreen`, that can be used to simulate a real screen for automated testing. The supplied tests do this. The simulation contains event delivery, screen resizing support, and capabilities to inject events and examine "`physical`" screen contents. ## Platforms ### POSIX (Linux, FreeBSD, macOS, Solaris, etc.) For mainstream systems with a suitably well defined system call interface to tty settings, everything works using pure Go. For the remainder (right now means only Solaris/illumos) we use POSIX function calls to manage termios, which implies that CGO is required on those platforms. ### Windows Windows console mode applications are supported. Unfortunately _mintty_ and other _cygwin_ style applications are not supported. Modern console applications like ConEmu, as well as the Windows 10 console itself, support all the good features (resize, mouse tracking, etc.) I haven't figured out how to cleanly resolve the dichotomy between cygwin style termios and the Windows Console API; it seems that perhaps nobody else has either. If anyone has suggestions, let me know! Really, if you're using a Windows application, you should use the native Windows console or a fully compatible console implementation. ### Plan9 and Native Client (Nacl) The nacl and plan9 platforms won't work, but compilation stubs are supplied for folks that want to include parts of this in software targetting those platforms. The Simulation screen works, but as Tcell doesn't know how to allocate a real screen object on those platforms, `NewScreen()` will fail. If anyone has wisdom about how to improve support for either of these, please let me know. PRs are especially welcome. ### Commercial Support _Tcell_ is absolutely free, but if you want to obtain commercial, professional support, there are options. [cols="2",align="center",frame="none", grid="none"] |=== ^.^| image:logos/tidelift.png[100,100] a| https://tidelift.com/[Tidelift] subscriptions include support for _Tcell_, as well as many other open source packages. ^.^| image:logos/staysail.png[100,100] a| mailto:info@staysail.tech[Staysail Systems, Inc.] offers direct support, and custom development around _Tcell_ on an hourly basis. ^.^| image:logos/patreon.png[100,100] a|I also welcome donations at https://www.patreon.com/gedamore/[Patreon], if you just want to make a contribution. |=== tcell-1.3.0/_demos/000077500000000000000000000000001354173511300140675ustar00rootroot00000000000000tcell-1.3.0/_demos/boxes.go000066400000000000000000000047111354173511300155410ustar00rootroot00000000000000// Copyright 2015 The TCell Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use file except in compliance with the License. // You may obtain a copy of the license at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // boxes just displays random colored boxes on your terminal screen. // Press ESC to exit the program. package main import ( "fmt" "math/rand" "os" "time" "github.com/gdamore/tcell" ) func makebox(s tcell.Screen) { w, h := s.Size() if w == 0 || h == 0 { return } glyphs := []rune{'@', '#', '&', '*', '=', '%', 'Z', 'A'} lx := rand.Int() % w ly := rand.Int() % h lw := rand.Int() % (w - lx) lh := rand.Int() % (h - ly) st := tcell.StyleDefault gl := ' ' if s.Colors() > 256 { rgb := tcell.NewHexColor(int32(rand.Int() & 0xffffff)) st = st.Background(rgb) } else if s.Colors() > 1 { st = st.Background(tcell.Color(rand.Int() % s.Colors())) } else { st = st.Reverse(rand.Int()%2 == 0) gl = glyphs[rand.Int()%len(glyphs)] } for row := 0; row < lh; row++ { for col := 0; col < lw; col++ { s.SetCell(lx+col, ly+row, st, gl) } } s.Show() } func main() { tcell.SetEncodingFallback(tcell.EncodingFallbackASCII) s, e := tcell.NewScreen() if e != nil { fmt.Fprintf(os.Stderr, "%v\n", e) os.Exit(1) } if e = s.Init(); e != nil { fmt.Fprintf(os.Stderr, "%v\n", e) os.Exit(1) } s.SetStyle(tcell.StyleDefault. Foreground(tcell.ColorBlack). Background(tcell.ColorWhite)) s.Clear() quit := make(chan struct{}) go func() { for { ev := s.PollEvent() switch ev := ev.(type) { case *tcell.EventKey: switch ev.Key() { case tcell.KeyEscape, tcell.KeyEnter: close(quit) return case tcell.KeyCtrlL: s.Sync() } case *tcell.EventResize: s.Sync() } } }() cnt := 0 dur := time.Duration(0) loop: for { select { case <-quit: break loop case <-time.After(time.Millisecond * 50): } start := time.Now() makebox(s) cnt++ dur += time.Now().Sub(start) } s.Fini() fmt.Printf("Finished %d boxes in %s\n", cnt, dur) fmt.Printf("Average is %0.3f ms / box\n", (float64(dur)/float64(cnt))/1000000.0) } tcell-1.3.0/_demos/colors.go000066400000000000000000000063021354173511300157200ustar00rootroot00000000000000// Copyright 2019 The TCell Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use file except in compliance with the License. // You may obtain a copy of the license at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // colors just displays a single centered rectangle that should pulse // through available colors. It uses the RGB color cube, bumping at // predefined larger intervals (values of about 8) in order that the // changes happen quickly enough to be appreciable. // // Press ESC to exit the program. package main import ( "fmt" "math/rand" "os" "time" "github.com/gdamore/tcell" ) var red = int32(rand.Int() % 256) var grn = int32(rand.Int() % 256) var blu = int32(rand.Int() % 256) var inc = int32(8) // rate of color change var redi = int32(inc) var grni = int32(inc) var blui = int32(inc) func makebox(s tcell.Screen) { w, h := s.Size() if w == 0 || h == 0 { return } glyphs := []rune{'@', '#', '&', '*', '=', '%', 'Z', 'A'} lh := h / 2 lw := w / 2 lx := w / 4 ly := h / 4 st := tcell.StyleDefault gl := ' ' if s.Colors() == 0 { st = st.Reverse(rand.Int()%2 == 0) gl = glyphs[rand.Int()%len(glyphs)] } else { red += redi if (red >= 256) || (red < 0) { redi = -redi red += redi } grn += grni if (grn >= 256) || (grn < 0) { grni = -grni grn += grni } blu += blui if (blu >= 256) || (blu < 0) { blui = -blui blu += blui } st = st.Background(tcell.NewRGBColor(red, grn, blu)) } for row := 0; row < lh; row++ { for col := 0; col < lw; col++ { s.SetCell(lx+col, ly+row, st, gl) } } s.Show() } func flipcoin() bool { if rand.Int()&1 == 0 { return false } return true } func main() { rand.Seed(time.Now().UnixNano()) tcell.SetEncodingFallback(tcell.EncodingFallbackASCII) s, e := tcell.NewScreen() if e != nil { fmt.Fprintf(os.Stderr, "%v\n", e) os.Exit(1) } if e = s.Init(); e != nil { fmt.Fprintf(os.Stderr, "%v\n", e) os.Exit(1) } s.SetStyle(tcell.StyleDefault. Foreground(tcell.ColorBlack). Background(tcell.ColorWhite)) s.Clear() quit := make(chan struct{}) go func() { for { ev := s.PollEvent() switch ev := ev.(type) { case *tcell.EventKey: switch ev.Key() { case tcell.KeyEscape, tcell.KeyEnter: close(quit) return case tcell.KeyCtrlL: s.Sync() } case *tcell.EventResize: s.Sync() } } }() cnt := 0 dur := time.Duration(0) loop: for { select { case <-quit: break loop case <-time.After(time.Millisecond * 50): } start := time.Now() makebox(s) dur += time.Now().Sub(start) cnt++ if cnt%(256/int(inc)) == 0 { if flipcoin() { redi = -redi } if flipcoin() { grni = -grni } if flipcoin() { blui = -blui } } } s.Fini() fmt.Printf("Finished %d boxes in %s\n", cnt, dur) fmt.Printf("Average is %0.3f ms / box\n", (float64(dur)/float64(cnt))/1000000.0) } tcell-1.3.0/_demos/mouse.go000066400000000000000000000131711354173511300155510ustar00rootroot00000000000000//+build ignore // Copyright 2015 The TCell Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use file except in compliance with the License. // You may obtain a copy of the license at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // mouse displays a text box and tests mouse interaction. As you click // and drag, boxes are displayed on screen. Other events are reported in // the box. Press ESC twice to exit the program. package main import ( "fmt" "os" "github.com/gdamore/tcell" "github.com/gdamore/tcell/encoding" "github.com/mattn/go-runewidth" ) var defStyle tcell.Style func emitStr(s tcell.Screen, x, y int, style tcell.Style, str string) { for _, c := range str { var comb []rune w := runewidth.RuneWidth(c) if w == 0 { comb = []rune{c} c = ' ' w = 1 } s.SetContent(x, y, c, comb, style) x += w } } func drawBox(s tcell.Screen, x1, y1, x2, y2 int, style tcell.Style, r rune) { if y2 < y1 { y1, y2 = y2, y1 } if x2 < x1 { x1, x2 = x2, x1 } for col := x1; col <= x2; col++ { s.SetContent(col, y1, tcell.RuneHLine, nil, style) s.SetContent(col, y2, tcell.RuneHLine, nil, style) } for row := y1 + 1; row < y2; row++ { s.SetContent(x1, row, tcell.RuneVLine, nil, style) s.SetContent(x2, row, tcell.RuneVLine, nil, style) } if y1 != y2 && x1 != x2 { // Only add corners if we need to s.SetContent(x1, y1, tcell.RuneULCorner, nil, style) s.SetContent(x2, y1, tcell.RuneURCorner, nil, style) s.SetContent(x1, y2, tcell.RuneLLCorner, nil, style) s.SetContent(x2, y2, tcell.RuneLRCorner, nil, style) } for row := y1 + 1; row < y2; row++ { for col := x1 + 1; col < x2; col++ { s.SetContent(col, row, r, nil, style) } } } func drawSelect(s tcell.Screen, x1, y1, x2, y2 int, sel bool) { if y2 < y1 { y1, y2 = y2, y1 } if x2 < x1 { x1, x2 = x2, x1 } for row := y1; row <= y2; row++ { for col := x1; col <= x2; col++ { mainc, combc, style, width := s.GetContent(col, row) if style == tcell.StyleDefault { style = defStyle } style = style.Reverse(sel) s.SetContent(col, row, mainc, combc, style) col += width - 1 } } } // This program just shows simple mouse and keyboard events. Press ESC twice to // exit. func main() { encoding.Register() s, e := tcell.NewScreen() if e != nil { fmt.Fprintf(os.Stderr, "%v\n", e) os.Exit(1) } if e := s.Init(); e != nil { fmt.Fprintf(os.Stderr, "%v\n", e) os.Exit(1) } defStyle = tcell.StyleDefault. Background(tcell.ColorBlack). Foreground(tcell.ColorWhite) s.SetStyle(defStyle) s.EnableMouse() s.Clear() posfmt := "Mouse: %d, %d " btnfmt := "Buttons: %s" keyfmt := "Keys: %s" white := tcell.StyleDefault. Foreground(tcell.ColorWhite).Background(tcell.ColorRed) mx, my := -1, -1 ox, oy := -1, -1 bx, by := -1, -1 w, h := s.Size() lchar := '*' bstr := "" lks := "" ecnt := 0 for { drawBox(s, 1, 1, 42, 6, white, ' ') emitStr(s, 2, 2, white, "Press ESC twice to exit, C to clear.") emitStr(s, 2, 3, white, fmt.Sprintf(posfmt, mx, my)) emitStr(s, 2, 4, white, fmt.Sprintf(btnfmt, bstr)) emitStr(s, 2, 5, white, fmt.Sprintf(keyfmt, lks)) s.Show() bstr = "" ev := s.PollEvent() st := tcell.StyleDefault.Background(tcell.ColorRed) up := tcell.StyleDefault. Background(tcell.ColorBlue). Foreground(tcell.ColorBlack) w, h = s.Size() // always clear any old selection box if ox >= 0 && oy >= 0 && bx >= 0 { drawSelect(s, ox, oy, bx, by, false) } switch ev := ev.(type) { case *tcell.EventResize: s.Sync() s.SetContent(w-1, h-1, 'R', nil, st) case *tcell.EventKey: s.SetContent(w-2, h-2, ev.Rune(), nil, st) s.SetContent(w-1, h-1, 'K', nil, st) if ev.Key() == tcell.KeyEscape { ecnt++ if ecnt > 1 { s.Fini() os.Exit(0) } } else if ev.Key() == tcell.KeyCtrlL { s.Sync() } else { ecnt = 0 if ev.Rune() == 'C' || ev.Rune() == 'c' { s.Clear() } } lks = ev.Name() case *tcell.EventMouse: x, y := ev.Position() button := ev.Buttons() for i := uint(0); i < 8; i++ { if int(button)&(1<= 0 { bg := tcell.Color((lchar - '0') * 2) drawBox(s, ox, oy, x, y, up.Background(bg), lchar) ox, oy = -1, -1 bx, by = -1, -1 } case tcell.Button1: ch = '1' case tcell.Button2: ch = '2' case tcell.Button3: ch = '3' case tcell.Button4: ch = '4' case tcell.Button5: ch = '5' case tcell.Button6: ch = '6' case tcell.Button7: ch = '7' case tcell.Button8: ch = '8' default: ch = '*' } if button != tcell.ButtonNone { bx, by = x, y } lchar = ch s.SetContent(w-1, h-1, 'M', nil, st) mx, my = x, y default: s.SetContent(w-1, h-1, 'X', nil, st) } if ox >= 0 && bx >= 0 { drawSelect(s, ox, oy, bx, by, true) } } } tcell-1.3.0/_demos/unicode.go000066400000000000000000000102521354173511300160440ustar00rootroot00000000000000// Copyright 2019 The TCell Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use file except in compliance with the License. // You may obtain a copy of the license at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // unicode just displays a Unicode test on your screen. // Press ESC to exit the program. package main import ( "fmt" "os" "github.com/gdamore/tcell" "github.com/gdamore/tcell/encoding" runewidth "github.com/mattn/go-runewidth" ) var row = 0 var style = tcell.StyleDefault func putln(s tcell.Screen, str string) { puts(s, style, 1, row, str) row++ } func puts(s tcell.Screen, style tcell.Style, x, y int, str string) { i := 0 var deferred []rune dwidth := 0 zwj := false for _, r := range str { if r == '\u200d' { if len(deferred) == 0 { deferred = append(deferred, ' ') dwidth = 1 } deferred = append(deferred, r) zwj = true continue } if zwj { deferred = append(deferred, r) zwj = false continue } switch runewidth.RuneWidth(r) { case 0: if len(deferred) == 0 { deferred = append(deferred, ' ') dwidth = 1 } case 1: if len(deferred) != 0 { s.SetContent(x+i, y, deferred[0], deferred[1:], style) i += dwidth } deferred = nil dwidth = 1 case 2: if len(deferred) != 0 { s.SetContent(x+i, y, deferred[0], deferred[1:], style) i += dwidth } deferred = nil dwidth = 2 } deferred = append(deferred, r) } if len(deferred) != 0 { s.SetContent(x+i, y, deferred[0], deferred[1:], style) i += dwidth } } func main() { s, e := tcell.NewScreen() if e != nil { fmt.Fprintf(os.Stderr, "%v\n", e) os.Exit(1) } encoding.Register() if e = s.Init(); e != nil { fmt.Fprintf(os.Stderr, "%v\n", e) os.Exit(1) } plain := tcell.StyleDefault bold := style.Bold(true) s.SetStyle(tcell.StyleDefault. Foreground(tcell.ColorBlack). Background(tcell.ColorWhite)) s.Clear() quit := make(chan struct{}) style = bold putln(s, "Press ESC to Exit") putln(s, "Character set: "+s.CharacterSet()) style = plain putln(s, "English: October") putln(s, "Icelandic: október") putln(s, "Arabic: أكتوبر") putln(s, "Russian: октября") putln(s, "Greek: Οκτωβρίου") putln(s, "Chinese: 十月 (note, two double wide characters)") putln(s, "Combining: A\u030a (should look like Angstrom)") putln(s, "Emoticon: \U0001f618 (blowing a kiss)") putln(s, "Airplane: \u2708 (fly away)") putln(s, "Command: \u2318 (mac clover key)") putln(s, "Enclose: !\u20e3 (should be enclosed exclamation)") putln(s, "ZWJ: \U0001f9db\u200d\u2640 (female vampire)") putln(s, "ZWJ: \U0001f9db\u200d\u2642 (male vampire)") putln(s, "Family: \U0001f469\u200d\U0001f467\u200d\U0001f467 (woman girl girl)\n") putln(s, "Region: \U0001f1fa\U0001f1f8 (USA! USA!)\n") putln(s, "") putln(s, "Box:") putln(s, string([]rune{ tcell.RuneULCorner, tcell.RuneHLine, tcell.RuneTTee, tcell.RuneHLine, tcell.RuneURCorner, })) putln(s, string([]rune{ tcell.RuneVLine, tcell.RuneBullet, tcell.RuneVLine, tcell.RuneLantern, tcell.RuneVLine, })+" (bullet, lantern/section)") putln(s, string([]rune{ tcell.RuneLTee, tcell.RuneHLine, tcell.RunePlus, tcell.RuneHLine, tcell.RuneRTee, })) putln(s, string([]rune{ tcell.RuneVLine, tcell.RuneDiamond, tcell.RuneVLine, tcell.RuneUArrow, tcell.RuneVLine, })+" (diamond, up arrow)") putln(s, string([]rune{ tcell.RuneLLCorner, tcell.RuneHLine, tcell.RuneBTee, tcell.RuneHLine, tcell.RuneLRCorner, })) s.Show() go func() { for { ev := s.PollEvent() switch ev := ev.(type) { case *tcell.EventKey: switch ev.Key() { case tcell.KeyEscape, tcell.KeyEnter: close(quit) return case tcell.KeyCtrlL: s.Sync() } case *tcell.EventResize: s.Sync() } } }() <-quit s.Fini() } tcell-1.3.0/attr.go000066400000000000000000000020531354173511300141220ustar00rootroot00000000000000// Copyright 2015 The TCell Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use file except in compliance with the License. // You may obtain a copy of the license at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package tcell // AttrMask represents a mask of text attributes, apart from color. // Note that support for attributes may vary widely across terminals. type AttrMask int // Attributes are not colors, but affect the display of text. They can // be combined. const ( AttrBold AttrMask = 1 << (25 + iota) AttrBlink AttrReverse AttrUnderline AttrDim AttrNone AttrMask = 0 // Just normal text. ) const attrAll = AttrBold | AttrBlink | AttrReverse | AttrUnderline | AttrDim tcell-1.3.0/cell.go000066400000000000000000000111631354173511300140710ustar00rootroot00000000000000// Copyright 2019 The TCell Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use file except in compliance with the License. // You may obtain a copy of the license at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package tcell import ( runewidth "github.com/mattn/go-runewidth" ) type cell struct { currMain rune currComb []rune currStyle Style lastMain rune lastStyle Style lastComb []rune width int } // CellBuffer represents a two dimensional array of character cells. // This is primarily intended for use by Screen implementors; it // contains much of the common code they need. To create one, just // declare a variable of its type; no explicit initialization is necessary. // // CellBuffer is not thread safe. type CellBuffer struct { w int h int cells []cell } // SetContent sets the contents (primary rune, combining runes, // and style) for a cell at a given location. func (cb *CellBuffer) SetContent(x int, y int, mainc rune, combc []rune, style Style) { if x >= 0 && y >= 0 && x < cb.w && y < cb.h { c := &cb.cells[(y*cb.w)+x] c.currComb = append([]rune{}, combc...) if c.currMain != mainc { c.width = runewidth.RuneWidth(mainc) } c.currMain = mainc c.currStyle = style } } // GetContent returns the contents of a character cell, including the // primary rune, any combining character runes (which will usually be // nil), the style, and the display width in cells. (The width can be // either 1, normally, or 2 for East Asian full-width characters.) func (cb *CellBuffer) GetContent(x, y int) (rune, []rune, Style, int) { var mainc rune var combc []rune var style Style var width int if x >= 0 && y >= 0 && x < cb.w && y < cb.h { c := &cb.cells[(y*cb.w)+x] mainc, combc, style = c.currMain, c.currComb, c.currStyle if width = c.width; width == 0 || mainc < ' ' { width = 1 mainc = ' ' } } return mainc, combc, style, width } // Size returns the (width, height) in cells of the buffer. func (cb *CellBuffer) Size() (int, int) { return cb.w, cb.h } // Invalidate marks all characters within the buffer as dirty. func (cb *CellBuffer) Invalidate() { for i := range cb.cells { cb.cells[i].lastMain = rune(0) } } // Dirty checks if a character at the given location needs an // to be refreshed on the physical display. This returns true // if the cell content is different since the last time it was // marked clean. func (cb *CellBuffer) Dirty(x, y int) bool { if x >= 0 && y >= 0 && x < cb.w && y < cb.h { c := &cb.cells[(y*cb.w)+x] if c.lastMain == rune(0) { return true } if c.lastMain != c.currMain { return true } if c.lastStyle != c.currStyle { return true } if len(c.lastComb) != len(c.currComb) { return true } for i := range c.lastComb { if c.lastComb[i] != c.currComb[i] { return true } } } return false } // SetDirty is normally used to indicate that a cell has // been displayed (in which case dirty is false), or to manually // force a cell to be marked dirty. func (cb *CellBuffer) SetDirty(x, y int, dirty bool) { if x >= 0 && y >= 0 && x < cb.w && y < cb.h { c := &cb.cells[(y*cb.w)+x] if dirty { c.lastMain = rune(0) } else { if c.currMain == rune(0) { c.currMain = ' ' } c.lastMain = c.currMain c.lastComb = c.currComb c.lastStyle = c.currStyle } } } // Resize is used to resize the cells array, with different dimensions, // while preserving the original contents. The cells will be invalidated // so that they can be redrawn. func (cb *CellBuffer) Resize(w, h int) { if cb.h == h && cb.w == w { return } newc := make([]cell, w*h) for y := 0; y < h && y < cb.h; y++ { for x := 0; x < w && x < cb.w; x++ { oc := &cb.cells[(y*cb.w)+x] nc := &newc[(y*w)+x] nc.currMain = oc.currMain nc.currComb = oc.currComb nc.currStyle = oc.currStyle nc.width = oc.width nc.lastMain = rune(0) } } cb.cells = newc cb.h = h cb.w = w } // Fill fills the entire cell buffer array with the specified character // and style. Normally choose ' ' to clear the screen. This API doesn't // support combining characters, or characters with a width larger than one. func (cb *CellBuffer) Fill(r rune, style Style) { for i := range cb.cells { c := &cb.cells[i] c.currMain = r c.currComb = nil c.currStyle = style c.width = 1 } } tcell-1.3.0/charset_stub.go000066400000000000000000000012321354173511300156340ustar00rootroot00000000000000// +build plan9 nacl // Copyright 2015 The TCell Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use file except in compliance with the License. // You may obtain a copy of the license at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package tcell func getCharset() string { return "" } tcell-1.3.0/charset_unix.go000066400000000000000000000026061354173511300156500ustar00rootroot00000000000000// +build !windows,!nacl,!plan9 // Copyright 2016 The TCell Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use file except in compliance with the License. // You may obtain a copy of the license at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package tcell import ( "os" "strings" ) func getCharset() string { // Determine the character set. This can help us later. // Per POSIX, we search for LC_ALL first, then LC_CTYPE, and // finally LANG. First one set wins. locale := "" if locale = os.Getenv("LC_ALL"); locale == "" { if locale = os.Getenv("LC_CTYPE"); locale == "" { locale = os.Getenv("LANG") } } if locale == "POSIX" || locale == "C" { return "US-ASCII" } if i := strings.IndexRune(locale, '@'); i >= 0 { locale = locale[:i] } if i := strings.IndexRune(locale, '.'); i >= 0 { locale = locale[i+1:] } else { // Default assumption, and on Linux we can see LC_ALL // without a character set, which we assume implies UTF-8. return "UTF-8" } // XXX: add support for aliases return locale } tcell-1.3.0/charset_windows.go000066400000000000000000000012351354173511300163540ustar00rootroot00000000000000// +build windows // Copyright 2015 The TCell Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use file except in compliance with the License. // You may obtain a copy of the license at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package tcell func getCharset() string { return "UTF-16" } tcell-1.3.0/color.go000066400000000000000000000701001354173511300142640ustar00rootroot00000000000000// Copyright 2015 The TCell Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use file except in compliance with the License. // You may obtain a copy of the license at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package tcell import "strconv" // Color represents a color. The low numeric values are the same as used // by ECMA-48, and beyond that XTerm. A 24-bit RGB value may be used by // adding in the ColorIsRGB flag. For Color names we use the W3C approved // color names. // // Note that on various terminals colors may be approximated however, or // not supported at all. If no suitable representation for a color is known, // the library will simply not set any color, deferring to whatever default // attributes the terminal uses. type Color int32 const ( // ColorDefault is used to leave the Color unchanged from whatever // system or teminal default may exist. ColorDefault Color = -1 // ColorIsRGB is used to indicate that the numeric value is not // a known color constant, but rather an RGB value. The lower // order 3 bytes are RGB. ColorIsRGB Color = 1 << 24 ) // Note that the order of these options is important -- it follows the // definitions used by ECMA and XTerm. Hence any further named colors // must begin at a value not less than 256. const ( ColorBlack Color = iota ColorMaroon ColorGreen ColorOlive ColorNavy ColorPurple ColorTeal ColorSilver ColorGray ColorRed ColorLime ColorYellow ColorBlue ColorFuchsia ColorAqua ColorWhite Color16 Color17 Color18 Color19 Color20 Color21 Color22 Color23 Color24 Color25 Color26 Color27 Color28 Color29 Color30 Color31 Color32 Color33 Color34 Color35 Color36 Color37 Color38 Color39 Color40 Color41 Color42 Color43 Color44 Color45 Color46 Color47 Color48 Color49 Color50 Color51 Color52 Color53 Color54 Color55 Color56 Color57 Color58 Color59 Color60 Color61 Color62 Color63 Color64 Color65 Color66 Color67 Color68 Color69 Color70 Color71 Color72 Color73 Color74 Color75 Color76 Color77 Color78 Color79 Color80 Color81 Color82 Color83 Color84 Color85 Color86 Color87 Color88 Color89 Color90 Color91 Color92 Color93 Color94 Color95 Color96 Color97 Color98 Color99 Color100 Color101 Color102 Color103 Color104 Color105 Color106 Color107 Color108 Color109 Color110 Color111 Color112 Color113 Color114 Color115 Color116 Color117 Color118 Color119 Color120 Color121 Color122 Color123 Color124 Color125 Color126 Color127 Color128 Color129 Color130 Color131 Color132 Color133 Color134 Color135 Color136 Color137 Color138 Color139 Color140 Color141 Color142 Color143 Color144 Color145 Color146 Color147 Color148 Color149 Color150 Color151 Color152 Color153 Color154 Color155 Color156 Color157 Color158 Color159 Color160 Color161 Color162 Color163 Color164 Color165 Color166 Color167 Color168 Color169 Color170 Color171 Color172 Color173 Color174 Color175 Color176 Color177 Color178 Color179 Color180 Color181 Color182 Color183 Color184 Color185 Color186 Color187 Color188 Color189 Color190 Color191 Color192 Color193 Color194 Color195 Color196 Color197 Color198 Color199 Color200 Color201 Color202 Color203 Color204 Color205 Color206 Color207 Color208 Color209 Color210 Color211 Color212 Color213 Color214 Color215 Color216 Color217 Color218 Color219 Color220 Color221 Color222 Color223 Color224 Color225 Color226 Color227 Color228 Color229 Color230 Color231 Color232 Color233 Color234 Color235 Color236 Color237 Color238 Color239 Color240 Color241 Color242 Color243 Color244 Color245 Color246 Color247 Color248 Color249 Color250 Color251 Color252 Color253 Color254 Color255 ColorAliceBlue ColorAntiqueWhite ColorAquaMarine ColorAzure ColorBeige ColorBisque ColorBlanchedAlmond ColorBlueViolet ColorBrown ColorBurlyWood ColorCadetBlue ColorChartreuse ColorChocolate ColorCoral ColorCornflowerBlue ColorCornsilk ColorCrimson ColorDarkBlue ColorDarkCyan ColorDarkGoldenrod ColorDarkGray ColorDarkGreen ColorDarkKhaki ColorDarkMagenta ColorDarkOliveGreen ColorDarkOrange ColorDarkOrchid ColorDarkRed ColorDarkSalmon ColorDarkSeaGreen ColorDarkSlateBlue ColorDarkSlateGray ColorDarkTurquoise ColorDarkViolet ColorDeepPink ColorDeepSkyBlue ColorDimGray ColorDodgerBlue ColorFireBrick ColorFloralWhite ColorForestGreen ColorGainsboro ColorGhostWhite ColorGold ColorGoldenrod ColorGreenYellow ColorHoneydew ColorHotPink ColorIndianRed ColorIndigo ColorIvory ColorKhaki ColorLavender ColorLavenderBlush ColorLawnGreen ColorLemonChiffon ColorLightBlue ColorLightCoral ColorLightCyan ColorLightGoldenrodYellow ColorLightGray ColorLightGreen ColorLightPink ColorLightSalmon ColorLightSeaGreen ColorLightSkyBlue ColorLightSlateGray ColorLightSteelBlue ColorLightYellow ColorLimeGreen ColorLinen ColorMediumAquamarine ColorMediumBlue ColorMediumOrchid ColorMediumPurple ColorMediumSeaGreen ColorMediumSlateBlue ColorMediumSpringGreen ColorMediumTurquoise ColorMediumVioletRed ColorMidnightBlue ColorMintCream ColorMistyRose ColorMoccasin ColorNavajoWhite ColorOldLace ColorOliveDrab ColorOrange ColorOrangeRed ColorOrchid ColorPaleGoldenrod ColorPaleGreen ColorPaleTurquoise ColorPaleVioletRed ColorPapayaWhip ColorPeachPuff ColorPeru ColorPink ColorPlum ColorPowderBlue ColorRebeccaPurple ColorRosyBrown ColorRoyalBlue ColorSaddleBrown ColorSalmon ColorSandyBrown ColorSeaGreen ColorSeashell ColorSienna ColorSkyblue ColorSlateBlue ColorSlateGray ColorSnow ColorSpringGreen ColorSteelBlue ColorTan ColorThistle ColorTomato ColorTurquoise ColorViolet ColorWheat ColorWhiteSmoke ColorYellowGreen ) // These are aliases for the color gray, because some of us spell // it as grey. const ( ColorGrey = ColorGray ColorDimGrey = ColorDimGray ColorDarkGrey = ColorDarkGray ColorDarkSlateGrey = ColorDarkSlateGray ColorLightGrey = ColorLightGray ColorLightSlateGrey = ColorLightSlateGray ColorSlateGrey = ColorSlateGray ) // ColorValues maps color constants to their RGB values. var ColorValues = map[Color]int32{ ColorBlack: 0x000000, ColorMaroon: 0x800000, ColorGreen: 0x008000, ColorOlive: 0x808000, ColorNavy: 0x000080, ColorPurple: 0x800080, ColorTeal: 0x008080, ColorSilver: 0xC0C0C0, ColorGray: 0x808080, ColorRed: 0xFF0000, ColorLime: 0x00FF00, ColorYellow: 0xFFFF00, ColorBlue: 0x0000FF, ColorFuchsia: 0xFF00FF, ColorAqua: 0x00FFFF, ColorWhite: 0xFFFFFF, Color16: 0x000000, // black Color17: 0x00005F, Color18: 0x000087, Color19: 0x0000AF, Color20: 0x0000D7, Color21: 0x0000FF, // blue Color22: 0x005F00, Color23: 0x005F5F, Color24: 0x005F87, Color25: 0x005FAF, Color26: 0x005FD7, Color27: 0x005FFF, Color28: 0x008700, Color29: 0x00875F, Color30: 0x008787, Color31: 0x0087Af, Color32: 0x0087D7, Color33: 0x0087FF, Color34: 0x00AF00, Color35: 0x00AF5F, Color36: 0x00AF87, Color37: 0x00AFAF, Color38: 0x00AFD7, Color39: 0x00AFFF, Color40: 0x00D700, Color41: 0x00D75F, Color42: 0x00D787, Color43: 0x00D7AF, Color44: 0x00D7D7, Color45: 0x00D7FF, Color46: 0x00FF00, // lime Color47: 0x00FF5F, Color48: 0x00FF87, Color49: 0x00FFAF, Color50: 0x00FFd7, Color51: 0x00FFFF, // aqua Color52: 0x5F0000, Color53: 0x5F005F, Color54: 0x5F0087, Color55: 0x5F00AF, Color56: 0x5F00D7, Color57: 0x5F00FF, Color58: 0x5F5F00, Color59: 0x5F5F5F, Color60: 0x5F5F87, Color61: 0x5F5FAF, Color62: 0x5F5FD7, Color63: 0x5F5FFF, Color64: 0x5F8700, Color65: 0x5F875F, Color66: 0x5F8787, Color67: 0x5F87AF, Color68: 0x5F87D7, Color69: 0x5F87FF, Color70: 0x5FAF00, Color71: 0x5FAF5F, Color72: 0x5FAF87, Color73: 0x5FAFAF, Color74: 0x5FAFD7, Color75: 0x5FAFFF, Color76: 0x5FD700, Color77: 0x5FD75F, Color78: 0x5FD787, Color79: 0x5FD7AF, Color80: 0x5FD7D7, Color81: 0x5FD7FF, Color82: 0x5FFF00, Color83: 0x5FFF5F, Color84: 0x5FFF87, Color85: 0x5FFFAF, Color86: 0x5FFFD7, Color87: 0x5FFFFF, Color88: 0x870000, Color89: 0x87005F, Color90: 0x870087, Color91: 0x8700AF, Color92: 0x8700D7, Color93: 0x8700FF, Color94: 0x875F00, Color95: 0x875F5F, Color96: 0x875F87, Color97: 0x875FAF, Color98: 0x875FD7, Color99: 0x875FFF, Color100: 0x878700, Color101: 0x87875F, Color102: 0x878787, Color103: 0x8787AF, Color104: 0x8787D7, Color105: 0x8787FF, Color106: 0x87AF00, Color107: 0x87AF5F, Color108: 0x87AF87, Color109: 0x87AFAF, Color110: 0x87AFD7, Color111: 0x87AFFF, Color112: 0x87D700, Color113: 0x87D75F, Color114: 0x87D787, Color115: 0x87D7AF, Color116: 0x87D7D7, Color117: 0x87D7FF, Color118: 0x87FF00, Color119: 0x87FF5F, Color120: 0x87FF87, Color121: 0x87FFAF, Color122: 0x87FFD7, Color123: 0x87FFFF, Color124: 0xAF0000, Color125: 0xAF005F, Color126: 0xAF0087, Color127: 0xAF00AF, Color128: 0xAF00D7, Color129: 0xAF00FF, Color130: 0xAF5F00, Color131: 0xAF5F5F, Color132: 0xAF5F87, Color133: 0xAF5FAF, Color134: 0xAF5FD7, Color135: 0xAF5FFF, Color136: 0xAF8700, Color137: 0xAF875F, Color138: 0xAF8787, Color139: 0xAF87AF, Color140: 0xAF87D7, Color141: 0xAF87FF, Color142: 0xAFAF00, Color143: 0xAFAF5F, Color144: 0xAFAF87, Color145: 0xAFAFAF, Color146: 0xAFAFD7, Color147: 0xAFAFFF, Color148: 0xAFD700, Color149: 0xAFD75F, Color150: 0xAFD787, Color151: 0xAFD7AF, Color152: 0xAFD7D7, Color153: 0xAFD7FF, Color154: 0xAFFF00, Color155: 0xAFFF5F, Color156: 0xAFFF87, Color157: 0xAFFFAF, Color158: 0xAFFFD7, Color159: 0xAFFFFF, Color160: 0xD70000, Color161: 0xD7005F, Color162: 0xD70087, Color163: 0xD700AF, Color164: 0xD700D7, Color165: 0xD700FF, Color166: 0xD75F00, Color167: 0xD75F5F, Color168: 0xD75F87, Color169: 0xD75FAF, Color170: 0xD75FD7, Color171: 0xD75FFF, Color172: 0xD78700, Color173: 0xD7875F, Color174: 0xD78787, Color175: 0xD787AF, Color176: 0xD787D7, Color177: 0xD787FF, Color178: 0xD7AF00, Color179: 0xD7AF5F, Color180: 0xD7AF87, Color181: 0xD7AFAF, Color182: 0xD7AFD7, Color183: 0xD7AFFF, Color184: 0xD7D700, Color185: 0xD7D75F, Color186: 0xD7D787, Color187: 0xD7D7AF, Color188: 0xD7D7D7, Color189: 0xD7D7FF, Color190: 0xD7FF00, Color191: 0xD7FF5F, Color192: 0xD7FF87, Color193: 0xD7FFAF, Color194: 0xD7FFD7, Color195: 0xD7FFFF, Color196: 0xFF0000, // red Color197: 0xFF005F, Color198: 0xFF0087, Color199: 0xFF00AF, Color200: 0xFF00D7, Color201: 0xFF00FF, // fuchsia Color202: 0xFF5F00, Color203: 0xFF5F5F, Color204: 0xFF5F87, Color205: 0xFF5FAF, Color206: 0xFF5FD7, Color207: 0xFF5FFF, Color208: 0xFF8700, Color209: 0xFF875F, Color210: 0xFF8787, Color211: 0xFF87AF, Color212: 0xFF87D7, Color213: 0xFF87FF, Color214: 0xFFAF00, Color215: 0xFFAF5F, Color216: 0xFFAF87, Color217: 0xFFAFAF, Color218: 0xFFAFD7, Color219: 0xFFAFFF, Color220: 0xFFD700, Color221: 0xFFD75F, Color222: 0xFFD787, Color223: 0xFFD7AF, Color224: 0xFFD7D7, Color225: 0xFFD7FF, Color226: 0xFFFF00, // yellow Color227: 0xFFFF5F, Color228: 0xFFFF87, Color229: 0xFFFFAF, Color230: 0xFFFFD7, Color231: 0xFFFFFF, // white Color232: 0x080808, Color233: 0x121212, Color234: 0x1C1C1C, Color235: 0x262626, Color236: 0x303030, Color237: 0x3A3A3A, Color238: 0x444444, Color239: 0x4E4E4E, Color240: 0x585858, Color241: 0x626262, Color242: 0x6C6C6C, Color243: 0x767676, Color244: 0x808080, // grey Color245: 0x8A8A8A, Color246: 0x949494, Color247: 0x9E9E9E, Color248: 0xA8A8A8, Color249: 0xB2B2B2, Color250: 0xBCBCBC, Color251: 0xC6C6C6, Color252: 0xD0D0D0, Color253: 0xDADADA, Color254: 0xE4E4E4, Color255: 0xEEEEEE, ColorAliceBlue: 0xF0F8FF, ColorAntiqueWhite: 0xFAEBD7, ColorAquaMarine: 0x7FFFD4, ColorAzure: 0xF0FFFF, ColorBeige: 0xF5F5DC, ColorBisque: 0xFFE4C4, ColorBlanchedAlmond: 0xFFEBCD, ColorBlueViolet: 0x8A2BE2, ColorBrown: 0xA52A2A, ColorBurlyWood: 0xDEB887, ColorCadetBlue: 0x5F9EA0, ColorChartreuse: 0x7FFF00, ColorChocolate: 0xD2691E, ColorCoral: 0xFF7F50, ColorCornflowerBlue: 0x6495ED, ColorCornsilk: 0xFFF8DC, ColorCrimson: 0xDC143C, ColorDarkBlue: 0x00008B, ColorDarkCyan: 0x008B8B, ColorDarkGoldenrod: 0xB8860B, ColorDarkGray: 0xA9A9A9, ColorDarkGreen: 0x006400, ColorDarkKhaki: 0xBDB76B, ColorDarkMagenta: 0x8B008B, ColorDarkOliveGreen: 0x556B2F, ColorDarkOrange: 0xFF8C00, ColorDarkOrchid: 0x9932CC, ColorDarkRed: 0x8B0000, ColorDarkSalmon: 0xE9967A, ColorDarkSeaGreen: 0x8FBC8F, ColorDarkSlateBlue: 0x483D8B, ColorDarkSlateGray: 0x2F4F4F, ColorDarkTurquoise: 0x00CED1, ColorDarkViolet: 0x9400D3, ColorDeepPink: 0xFF1493, ColorDeepSkyBlue: 0x00BFFF, ColorDimGray: 0x696969, ColorDodgerBlue: 0x1E90FF, ColorFireBrick: 0xB22222, ColorFloralWhite: 0xFFFAF0, ColorForestGreen: 0x228B22, ColorGainsboro: 0xDCDCDC, ColorGhostWhite: 0xF8F8FF, ColorGold: 0xFFD700, ColorGoldenrod: 0xDAA520, ColorGreenYellow: 0xADFF2F, ColorHoneydew: 0xF0FFF0, ColorHotPink: 0xFF69B4, ColorIndianRed: 0xCD5C5C, ColorIndigo: 0x4B0082, ColorIvory: 0xFFFFF0, ColorKhaki: 0xF0E68C, ColorLavender: 0xE6E6FA, ColorLavenderBlush: 0xFFF0F5, ColorLawnGreen: 0x7CFC00, ColorLemonChiffon: 0xFFFACD, ColorLightBlue: 0xADD8E6, ColorLightCoral: 0xF08080, ColorLightCyan: 0xE0FFFF, ColorLightGoldenrodYellow: 0xFAFAD2, ColorLightGray: 0xD3D3D3, ColorLightGreen: 0x90EE90, ColorLightPink: 0xFFB6C1, ColorLightSalmon: 0xFFA07A, ColorLightSeaGreen: 0x20B2AA, ColorLightSkyBlue: 0x87CEFA, ColorLightSlateGray: 0x778899, ColorLightSteelBlue: 0xB0C4DE, ColorLightYellow: 0xFFFFE0, ColorLimeGreen: 0x32CD32, ColorLinen: 0xFAF0E6, ColorMediumAquamarine: 0x66CDAA, ColorMediumBlue: 0x0000CD, ColorMediumOrchid: 0xBA55D3, ColorMediumPurple: 0x9370DB, ColorMediumSeaGreen: 0x3CB371, ColorMediumSlateBlue: 0x7B68EE, ColorMediumSpringGreen: 0x00FA9A, ColorMediumTurquoise: 0x48D1CC, ColorMediumVioletRed: 0xC71585, ColorMidnightBlue: 0x191970, ColorMintCream: 0xF5FFFA, ColorMistyRose: 0xFFE4E1, ColorMoccasin: 0xFFE4B5, ColorNavajoWhite: 0xFFDEAD, ColorOldLace: 0xFDF5E6, ColorOliveDrab: 0x6B8E23, ColorOrange: 0xFFA500, ColorOrangeRed: 0xFF4500, ColorOrchid: 0xDA70D6, ColorPaleGoldenrod: 0xEEE8AA, ColorPaleGreen: 0x98FB98, ColorPaleTurquoise: 0xAFEEEE, ColorPaleVioletRed: 0xDB7093, ColorPapayaWhip: 0xFFEFD5, ColorPeachPuff: 0xFFDAB9, ColorPeru: 0xCD853F, ColorPink: 0xFFC0CB, ColorPlum: 0xDDA0DD, ColorPowderBlue: 0xB0E0E6, ColorRebeccaPurple: 0x663399, ColorRosyBrown: 0xBC8F8F, ColorRoyalBlue: 0x4169E1, ColorSaddleBrown: 0x8B4513, ColorSalmon: 0xFA8072, ColorSandyBrown: 0xF4A460, ColorSeaGreen: 0x2E8B57, ColorSeashell: 0xFFF5EE, ColorSienna: 0xA0522D, ColorSkyblue: 0x87CEEB, ColorSlateBlue: 0x6A5ACD, ColorSlateGray: 0x708090, ColorSnow: 0xFFFAFA, ColorSpringGreen: 0x00FF7F, ColorSteelBlue: 0x4682B4, ColorTan: 0xD2B48C, ColorThistle: 0xD8BFD8, ColorTomato: 0xFF6347, ColorTurquoise: 0x40E0D0, ColorViolet: 0xEE82EE, ColorWheat: 0xF5DEB3, ColorWhiteSmoke: 0xF5F5F5, ColorYellowGreen: 0x9ACD32, } // ColorNames holds the written names of colors. Useful to present a list of // recognized named colors. var ColorNames = map[string]Color{ "black": ColorBlack, "maroon": ColorMaroon, "green": ColorGreen, "olive": ColorOlive, "navy": ColorNavy, "purple": ColorPurple, "teal": ColorTeal, "silver": ColorSilver, "gray": ColorGray, "red": ColorRed, "lime": ColorLime, "yellow": ColorYellow, "blue": ColorBlue, "fuchsia": ColorFuchsia, "aqua": ColorAqua, "white": ColorWhite, "aliceblue": ColorAliceBlue, "antiquewhite": ColorAntiqueWhite, "aquamarine": ColorAquaMarine, "azure": ColorAzure, "beige": ColorBeige, "bisque": ColorBisque, "blanchedalmond": ColorBlanchedAlmond, "blueviolet": ColorBlueViolet, "brown": ColorBrown, "burlywood": ColorBurlyWood, "cadetblue": ColorCadetBlue, "chartreuse": ColorChartreuse, "chocolate": ColorChocolate, "coral": ColorCoral, "cornflowerblue": ColorCornflowerBlue, "cornsilk": ColorCornsilk, "crimson": ColorCrimson, "darkblue": ColorDarkBlue, "darkcyan": ColorDarkCyan, "darkgoldenrod": ColorDarkGoldenrod, "darkgray": ColorDarkGray, "darkgreen": ColorDarkGreen, "darkkhaki": ColorDarkKhaki, "darkmagenta": ColorDarkMagenta, "darkolivegreen": ColorDarkOliveGreen, "darkorange": ColorDarkOrange, "darkorchid": ColorDarkOrchid, "darkred": ColorDarkRed, "darksalmon": ColorDarkSalmon, "darkseagreen": ColorDarkSeaGreen, "darkslateblue": ColorDarkSlateBlue, "darkslategray": ColorDarkSlateGray, "darkturquoise": ColorDarkTurquoise, "darkviolet": ColorDarkViolet, "deeppink": ColorDeepPink, "deepskyblue": ColorDeepSkyBlue, "dimgray": ColorDimGray, "dodgerblue": ColorDodgerBlue, "firebrick": ColorFireBrick, "floralwhite": ColorFloralWhite, "forestgreen": ColorForestGreen, "gainsboro": ColorGainsboro, "ghostwhite": ColorGhostWhite, "gold": ColorGold, "goldenrod": ColorGoldenrod, "greenyellow": ColorGreenYellow, "honeydew": ColorHoneydew, "hotpink": ColorHotPink, "indianred": ColorIndianRed, "indigo": ColorIndigo, "ivory": ColorIvory, "khaki": ColorKhaki, "lavender": ColorLavender, "lavenderblush": ColorLavenderBlush, "lawngreen": ColorLawnGreen, "lemonchiffon": ColorLemonChiffon, "lightblue": ColorLightBlue, "lightcoral": ColorLightCoral, "lightcyan": ColorLightCyan, "lightgoldenrodyellow": ColorLightGoldenrodYellow, "lightgray": ColorLightGray, "lightgreen": ColorLightGreen, "lightpink": ColorLightPink, "lightsalmon": ColorLightSalmon, "lightseagreen": ColorLightSeaGreen, "lightskyblue": ColorLightSkyBlue, "lightslategray": ColorLightSlateGray, "lightsteelblue": ColorLightSteelBlue, "lightyellow": ColorLightYellow, "limegreen": ColorLimeGreen, "linen": ColorLinen, "mediumaquamarine": ColorMediumAquamarine, "mediumblue": ColorMediumBlue, "mediumorchid": ColorMediumOrchid, "mediumpurple": ColorMediumPurple, "mediumseagreen": ColorMediumSeaGreen, "mediumslateblue": ColorMediumSlateBlue, "mediumspringgreen": ColorMediumSpringGreen, "mediumturquoise": ColorMediumTurquoise, "mediumvioletred": ColorMediumVioletRed, "midnightblue": ColorMidnightBlue, "mintcream": ColorMintCream, "mistyrose": ColorMistyRose, "moccasin": ColorMoccasin, "navajowhite": ColorNavajoWhite, "oldlace": ColorOldLace, "olivedrab": ColorOliveDrab, "orange": ColorOrange, "orangered": ColorOrangeRed, "orchid": ColorOrchid, "palegoldenrod": ColorPaleGoldenrod, "palegreen": ColorPaleGreen, "paleturquoise": ColorPaleTurquoise, "palevioletred": ColorPaleVioletRed, "papayawhip": ColorPapayaWhip, "peachpuff": ColorPeachPuff, "peru": ColorPeru, "pink": ColorPink, "plum": ColorPlum, "powderblue": ColorPowderBlue, "rebeccapurple": ColorRebeccaPurple, "rosybrown": ColorRosyBrown, "royalblue": ColorRoyalBlue, "saddlebrown": ColorSaddleBrown, "salmon": ColorSalmon, "sandybrown": ColorSandyBrown, "seagreen": ColorSeaGreen, "seashell": ColorSeashell, "sienna": ColorSienna, "skyblue": ColorSkyblue, "slateblue": ColorSlateBlue, "slategray": ColorSlateGray, "snow": ColorSnow, "springgreen": ColorSpringGreen, "steelblue": ColorSteelBlue, "tan": ColorTan, "thistle": ColorThistle, "tomato": ColorTomato, "turquoise": ColorTurquoise, "violet": ColorViolet, "wheat": ColorWheat, "whitesmoke": ColorWhiteSmoke, "yellowgreen": ColorYellowGreen, "grey": ColorGray, "dimgrey": ColorDimGray, "darkgrey": ColorDarkGray, "darkslategrey": ColorDarkSlateGray, "lightgrey": ColorLightGray, "lightslategrey": ColorLightSlateGray, "slategrey": ColorSlateGray, } // Hex returns the color's hexadecimal RGB 24-bit value with each component // consisting of a single byte, ala R << 16 | G << 8 | B. If the color // is unknown or unset, -1 is returned. func (c Color) Hex() int32 { if c&ColorIsRGB != 0 { return (int32(c) & 0xffffff) } if v, ok := ColorValues[c]; ok { return v } return -1 } // RGB returns the red, green, and blue components of the color, with // each component represented as a value 0-255. In the event that the // color cannot be broken up (not set usually), -1 is returned for each value. func (c Color) RGB() (int32, int32, int32) { v := c.Hex() if v < 0 { return -1, -1, -1 } return (v >> 16) & 0xff, (v >> 8) & 0xff, v & 0xff } // NewRGBColor returns a new color with the given red, green, and blue values. // Each value must be represented in the range 0-255. func NewRGBColor(r, g, b int32) Color { return NewHexColor(((r & 0xff) << 16) | ((g & 0xff) << 8) | (b & 0xff)) } // NewHexColor returns a color using the given 24-bit RGB value. func NewHexColor(v int32) Color { return ColorIsRGB | Color(v) } // GetColor creates a Color from a color name (W3C name). A hex value may // be supplied as a string in the format "#ffffff". func GetColor(name string) Color { if c, ok := ColorNames[name]; ok { return c } if len(name) == 7 && name[0] == '#' { if v, e := strconv.ParseInt(name[1:], 16, 32); e == nil { return NewHexColor(int32(v)) } } return ColorDefault } tcell-1.3.0/color_test.go000066400000000000000000000045531354173511300153340ustar00rootroot00000000000000// Copyright 2018 The TCell Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use file except in compliance with the License. // You may obtain a copy of the license at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package tcell import ( "testing" ) func TestColorValues(t *testing.T) { var values = []struct { color Color hex int32 }{ {ColorRed, 0x00FF0000}, {ColorGreen, 0x00008000}, {ColorLime, 0x0000FF00}, {ColorBlue, 0x000000FF}, {ColorBlack, 0x00000000}, {ColorWhite, 0x00FFFFFF}, {ColorSilver, 0x00C0C0C0}, } for _, tc := range values { if tc.color.Hex() != tc.hex { t.Errorf("Color: %x != %x", tc.color.Hex(), tc.hex) } } } func TestColorFitting(t *testing.T) { pal := []Color{} for i := 0; i < 255; i++ { pal = append(pal, Color(i)) } // Exact color fitting on ANSI colors for i := 0; i < 7; i++ { if FindColor(Color(i), pal[:8]) != Color(i) { t.Errorf("Color ANSI fit fail at %d", i) } } // Grey is closest to Silver if FindColor(Color(8), pal[:8]) != Color(7) { t.Errorf("Grey does not fit to silver") } // Color fitting of upper 8 colors. for i := 9; i < 16; i++ { if FindColor(Color(i), pal[:8]) != Color(i%8) { t.Errorf("Color fit fail at %d", i) } } // Imperfect fit if FindColor(ColorOrangeRed, pal[:16]) != ColorRed || FindColor(ColorAliceBlue, pal[:16]) != ColorWhite || FindColor(ColorPink, pal) != Color217 || FindColor(ColorSienna, pal) != Color173 || FindColor(GetColor("#00FD00"), pal) != ColorLime { t.Errorf("Imperfect color fit") } } func TestColorNameLookup(t *testing.T) { var values = []struct { name string color Color }{ {"#FF0000", ColorRed}, {"black", ColorBlack}, {"orange", ColorOrange}, } for _, v := range values { c := GetColor(v.name) if c.Hex() != v.color.Hex() { t.Errorf("Wrong color for %v: %v", v.name, c.Hex()) } } } func TestColorRGB(t *testing.T) { r, g, b := GetColor("#112233").RGB() if r != 0x11 || g != 0x22 || b != 0x33 { t.Errorf("RGB wrong (%x, %x, %x)", r, g, b) } } tcell-1.3.0/colorfit.go000066400000000000000000000026401354173511300147730ustar00rootroot00000000000000// Copyright 2016 The TCell Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use file except in compliance with the License. // You may obtain a copy of the license at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package tcell import ( "github.com/lucasb-eyer/go-colorful" "math" ) // FindColor attempts to find a given color, or the best match possible for it, // from the palette given. This is an expensive operation, so results should // be cached by the caller. func FindColor(c Color, palette []Color) Color { match := ColorDefault dist := float64(0) r, g, b := c.RGB() c1 := colorful.Color{ R: float64(r) / 255.0, G: float64(g) / 255.0, B: float64(b) / 255.0, } for _, d := range palette { r, g, b = d.RGB() c2 := colorful.Color{ R: float64(r) / 255.0, G: float64(g) / 255.0, B: float64(b) / 255.0, } // CIE94 is more accurate, but really really expensive. nd := c1.DistanceCIE76(c2) if math.IsNaN(nd) { nd = math.Inf(1) } if match == ColorDefault || nd < dist { match = d dist = nd } } return match } tcell-1.3.0/console_stub.go000066400000000000000000000015011354173511300156440ustar00rootroot00000000000000// +build !windows // Copyright 2015 The TCell Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use file except in compliance with the License. // You may obtain a copy of the license at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package tcell // NewConsoleScreen returns a console based screen. This platform // doesn't have support for any, so it returns nil and a suitable error. func NewConsoleScreen() (Screen, error) { return nil, ErrNoScreen } tcell-1.3.0/console_win.go000066400000000000000000000514151354173511300154750ustar00rootroot00000000000000// +build windows // Copyright 2019 The TCell Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use file except in compliance with the License. // You may obtain a copy of the license at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package tcell import ( "errors" "sync" "syscall" "unicode/utf16" "unsafe" ) type cScreen struct { in syscall.Handle out syscall.Handle cancelflag syscall.Handle scandone chan struct{} evch chan Event quit chan struct{} curx int cury int style Style clear bool fini bool w int h int oscreen consoleInfo ocursor cursorInfo oimode uint32 oomode uint32 cells CellBuffer colors map[Color]Color sync.Mutex } var winLock sync.Mutex var winPalette = []Color{ ColorBlack, ColorMaroon, ColorGreen, ColorNavy, ColorOlive, ColorPurple, ColorTeal, ColorSilver, ColorGray, ColorRed, ColorLime, ColorBlue, ColorYellow, ColorFuchsia, ColorAqua, ColorWhite, } var winColors = map[Color]Color{ ColorBlack: ColorBlack, ColorMaroon: ColorMaroon, ColorGreen: ColorGreen, ColorNavy: ColorNavy, ColorOlive: ColorOlive, ColorPurple: ColorPurple, ColorTeal: ColorTeal, ColorSilver: ColorSilver, ColorGray: ColorGray, ColorRed: ColorRed, ColorLime: ColorLime, ColorBlue: ColorBlue, ColorYellow: ColorYellow, ColorFuchsia: ColorFuchsia, ColorAqua: ColorAqua, ColorWhite: ColorWhite, } var k32 = syscall.NewLazyDLL("kernel32.dll") // We have to bring in the kernel32.dll directly, so we can get access to some // system calls that the core Go API lacks. // // Note that Windows appends some functions with W to indicate that wide // characters (Unicode) are in use. The documentation refers to them // without this suffix, as the resolution is made via preprocessor. var ( procReadConsoleInput = k32.NewProc("ReadConsoleInputW") procWaitForMultipleObjects = k32.NewProc("WaitForMultipleObjects") procCreateEvent = k32.NewProc("CreateEventW") procSetEvent = k32.NewProc("SetEvent") procGetConsoleCursorInfo = k32.NewProc("GetConsoleCursorInfo") procSetConsoleCursorInfo = k32.NewProc("SetConsoleCursorInfo") procSetConsoleCursorPosition = k32.NewProc("SetConsoleCursorPosition") procSetConsoleMode = k32.NewProc("SetConsoleMode") procGetConsoleMode = k32.NewProc("GetConsoleMode") procGetConsoleScreenBufferInfo = k32.NewProc("GetConsoleScreenBufferInfo") procFillConsoleOutputAttribute = k32.NewProc("FillConsoleOutputAttribute") procFillConsoleOutputCharacter = k32.NewProc("FillConsoleOutputCharacterW") procSetConsoleWindowInfo = k32.NewProc("SetConsoleWindowInfo") procSetConsoleScreenBufferSize = k32.NewProc("SetConsoleScreenBufferSize") procSetConsoleTextAttribute = k32.NewProc("SetConsoleTextAttribute") ) const ( w32Infinite = ^uintptr(0) w32WaitObject0 = uintptr(0) ) // NewConsoleScreen returns a Screen for the Windows console associated // with the current process. The Screen makes use of the Windows Console // API to display content and read events. func NewConsoleScreen() (Screen, error) { return &cScreen{}, nil } func (s *cScreen) Init() error { s.evch = make(chan Event, 10) s.quit = make(chan struct{}) s.scandone = make(chan struct{}) in, e := syscall.Open("CONIN$", syscall.O_RDWR, 0) if e != nil { return e } s.in = in out, e := syscall.Open("CONOUT$", syscall.O_RDWR, 0) if e != nil { syscall.Close(s.in) return e } s.out = out cf, _, e := procCreateEvent.Call( uintptr(0), uintptr(1), uintptr(0), uintptr(0)) if cf == uintptr(0) { return e } s.cancelflag = syscall.Handle(cf) s.Lock() s.curx = -1 s.cury = -1 s.style = StyleDefault s.getCursorInfo(&s.ocursor) s.getConsoleInfo(&s.oscreen) s.getOutMode(&s.oomode) s.getInMode(&s.oimode) s.resize() s.fini = false s.setInMode(modeResizeEn) s.setOutMode(0) s.clearScreen(s.style) s.hideCursor() s.Unlock() go s.scanInput() return nil } func (s *cScreen) CharacterSet() string { // We are always UTF-16LE on Windows return "UTF-16LE" } func (s *cScreen) EnableMouse() { s.setInMode(modeResizeEn | modeMouseEn | modeExtndFlg) } func (s *cScreen) DisableMouse() { s.setInMode(modeResizeEn) } func (s *cScreen) Fini() { s.Lock() s.style = StyleDefault s.curx = -1 s.cury = -1 s.fini = true s.Unlock() s.setCursorInfo(&s.ocursor) s.setInMode(s.oimode) s.setOutMode(s.oomode) s.setBufferSize(int(s.oscreen.size.x), int(s.oscreen.size.y)) s.clearScreen(StyleDefault) s.setCursorPos(0, 0) procSetConsoleTextAttribute.Call( uintptr(s.out), uintptr(s.mapStyle(StyleDefault))) close(s.quit) procSetEvent.Call(uintptr(s.cancelflag)) // Block until scanInput returns; this prevents a race condition on Win 8+ // which causes syscall.Close to block until another keypress is read. <-s.scandone syscall.Close(s.in) syscall.Close(s.out) } func (s *cScreen) PostEventWait(ev Event) { s.evch <- ev } func (s *cScreen) PostEvent(ev Event) error { select { case s.evch <- ev: return nil default: return ErrEventQFull } } func (s *cScreen) PollEvent() Event { select { case <-s.quit: return nil case ev := <-s.evch: return ev } } type cursorInfo struct { size uint32 visible uint32 } type coord struct { x int16 y int16 } func (c coord) uintptr() uintptr { // little endian, put x first return uintptr(c.x) | (uintptr(c.y) << 16) } type rect struct { left int16 top int16 right int16 bottom int16 } func (s *cScreen) showCursor() { s.setCursorInfo(&cursorInfo{size: 100, visible: 1}) } func (s *cScreen) hideCursor() { s.setCursorInfo(&cursorInfo{size: 1, visible: 0}) } func (s *cScreen) ShowCursor(x, y int) { s.Lock() if !s.fini { s.curx = x s.cury = y } s.doCursor() s.Unlock() } func (s *cScreen) doCursor() { x, y := s.curx, s.cury if x < 0 || y < 0 || x >= s.w || y >= s.h { s.hideCursor() } else { s.setCursorPos(x, y) s.showCursor() } } func (s *cScreen) HideCursor() { s.ShowCursor(-1, -1) } type charInfo struct { ch uint16 attr uint16 } type inputRecord struct { typ uint16 _ uint16 data [16]byte } const ( keyEvent uint16 = 1 mouseEvent uint16 = 2 resizeEvent uint16 = 4 menuEvent uint16 = 8 // don't use focusEvent uint16 = 16 // don't use ) type mouseRecord struct { x int16 y int16 btns uint32 mod uint32 flags uint32 } const ( mouseDoubleClick uint32 = 0x2 mouseHWheeled uint32 = 0x8 mouseVWheeled uint32 = 0x4 mouseMoved uint32 = 0x1 ) type resizeRecord struct { x int16 y int16 } type keyRecord struct { isdown int32 repeat uint16 kcode uint16 scode uint16 ch uint16 mod uint32 } const ( // Constants per Microsoft. We don't put the modifiers // here. vkCancel = 0x03 vkBack = 0x08 // Backspace vkTab = 0x09 vkClear = 0x0c vkReturn = 0x0d vkPause = 0x13 vkEscape = 0x1b vkSpace = 0x20 vkPrior = 0x21 // PgUp vkNext = 0x22 // PgDn vkEnd = 0x23 vkHome = 0x24 vkLeft = 0x25 vkUp = 0x26 vkRight = 0x27 vkDown = 0x28 vkPrint = 0x2a vkPrtScr = 0x2c vkInsert = 0x2d vkDelete = 0x2e vkHelp = 0x2f vkF1 = 0x70 vkF2 = 0x71 vkF3 = 0x72 vkF4 = 0x73 vkF5 = 0x74 vkF6 = 0x75 vkF7 = 0x76 vkF8 = 0x77 vkF9 = 0x78 vkF10 = 0x79 vkF11 = 0x7a vkF12 = 0x7b vkF13 = 0x7c vkF14 = 0x7d vkF15 = 0x7e vkF16 = 0x7f vkF17 = 0x80 vkF18 = 0x81 vkF19 = 0x82 vkF20 = 0x83 vkF21 = 0x84 vkF22 = 0x85 vkF23 = 0x86 vkF24 = 0x87 ) var vkKeys = map[uint16]Key{ vkCancel: KeyCancel, vkBack: KeyBackspace, vkTab: KeyTab, vkClear: KeyClear, vkPause: KeyPause, vkPrint: KeyPrint, vkPrtScr: KeyPrint, vkPrior: KeyPgUp, vkNext: KeyPgDn, vkReturn: KeyEnter, vkEnd: KeyEnd, vkHome: KeyHome, vkLeft: KeyLeft, vkUp: KeyUp, vkRight: KeyRight, vkDown: KeyDown, vkInsert: KeyInsert, vkDelete: KeyDelete, vkHelp: KeyHelp, vkF1: KeyF1, vkF2: KeyF2, vkF3: KeyF3, vkF4: KeyF4, vkF5: KeyF5, vkF6: KeyF6, vkF7: KeyF7, vkF8: KeyF8, vkF9: KeyF9, vkF10: KeyF10, vkF11: KeyF11, vkF12: KeyF12, vkF13: KeyF13, vkF14: KeyF14, vkF15: KeyF15, vkF16: KeyF16, vkF17: KeyF17, vkF18: KeyF18, vkF19: KeyF19, vkF20: KeyF20, vkF21: KeyF21, vkF22: KeyF22, vkF23: KeyF23, vkF24: KeyF24, } // NB: All Windows platforms are little endian. We assume this // never, ever change. The following code is endian safe. and does // not use unsafe pointers. func getu32(v []byte) uint32 { return uint32(v[0]) + (uint32(v[1]) << 8) + (uint32(v[2]) << 16) + (uint32(v[3]) << 24) } func geti32(v []byte) int32 { return int32(getu32(v)) } func getu16(v []byte) uint16 { return uint16(v[0]) + (uint16(v[1]) << 8) } func geti16(v []byte) int16 { return int16(getu16(v)) } // Convert windows dwControlKeyState to modifier mask func mod2mask(cks uint32) ModMask { mm := ModNone // Left or right control if (cks & (0x0008 | 0x0004)) != 0 { mm |= ModCtrl } // Left or right alt if (cks & (0x0002 | 0x0001)) != 0 { mm |= ModAlt } // Any shift if (cks & 0x0010) != 0 { mm |= ModShift } return mm } func mrec2btns(mbtns, flags uint32) ButtonMask { btns := ButtonNone if mbtns&0x1 != 0 { btns |= Button1 } if mbtns&0x2 != 0 { btns |= Button2 } if mbtns&0x4 != 0 { btns |= Button3 } if mbtns&0x8 != 0 { btns |= Button4 } if mbtns&0x10 != 0 { btns |= Button5 } if mbtns&0x20 != 0 { btns |= Button6 } if mbtns&0x40 != 0 { btns |= Button7 } if mbtns&0x80 != 0 { btns |= Button8 } if flags&mouseVWheeled != 0 { if mbtns&0x80000000 == 0 { btns |= WheelUp } else { btns |= WheelDown } } if flags&mouseHWheeled != 0 { if mbtns&0x80000000 == 0 { btns |= WheelRight } else { btns |= WheelLeft } } return btns } func (s *cScreen) getConsoleInput() error { // cancelFlag comes first as WaitForMultipleObjects returns the lowest index // in the event that both events are signalled. waitObjects := []syscall.Handle{s.cancelflag, s.in} // As arrays are contiguous in memory, a pointer to the first object is the // same as a pointer to the array itself. pWaitObjects := unsafe.Pointer(&waitObjects[0]) rv, _, er := procWaitForMultipleObjects.Call( uintptr(len(waitObjects)), uintptr(pWaitObjects), uintptr(0), w32Infinite) // WaitForMultipleObjects returns WAIT_OBJECT_0 + the index. switch rv { case w32WaitObject0: // s.cancelFlag return errors.New("cancelled") case w32WaitObject0 + 1: // s.in rec := &inputRecord{} var nrec int32 rv, _, er := procReadConsoleInput.Call( uintptr(s.in), uintptr(unsafe.Pointer(rec)), uintptr(1), uintptr(unsafe.Pointer(&nrec))) if rv == 0 { return er } if nrec != 1 { return nil } switch rec.typ { case keyEvent: krec := &keyRecord{} krec.isdown = geti32(rec.data[0:]) krec.repeat = getu16(rec.data[4:]) krec.kcode = getu16(rec.data[6:]) krec.scode = getu16(rec.data[8:]) krec.ch = getu16(rec.data[10:]) krec.mod = getu32(rec.data[12:]) if krec.isdown == 0 || krec.repeat < 1 { // its a key release event, ignore it return nil } if krec.ch != 0 { // synthesized key code for krec.repeat > 0 { // convert shift+tab to backtab if mod2mask(krec.mod) == ModShift && krec.ch == vkTab { s.PostEvent(NewEventKey(KeyBacktab, 0, ModNone)) } else { s.PostEvent(NewEventKey(KeyRune, rune(krec.ch), mod2mask(krec.mod))) } krec.repeat-- } return nil } key := KeyNUL // impossible on Windows ok := false if key, ok = vkKeys[krec.kcode]; !ok { return nil } for krec.repeat > 0 { s.PostEvent(NewEventKey(key, rune(krec.ch), mod2mask(krec.mod))) krec.repeat-- } case mouseEvent: var mrec mouseRecord mrec.x = geti16(rec.data[0:]) mrec.y = geti16(rec.data[2:]) mrec.btns = getu32(rec.data[4:]) mrec.mod = getu32(rec.data[8:]) mrec.flags = getu32(rec.data[12:]) btns := mrec2btns(mrec.btns, mrec.flags) // we ignore double click, events are delivered normally s.PostEvent(NewEventMouse(int(mrec.x), int(mrec.y), btns, mod2mask(mrec.mod))) case resizeEvent: var rrec resizeRecord rrec.x = geti16(rec.data[0:]) rrec.y = geti16(rec.data[2:]) s.PostEvent(NewEventResize(int(rrec.x), int(rrec.y))) default: } default: return er } return nil } func (s *cScreen) scanInput() { for { if e := s.getConsoleInput(); e != nil { close(s.scandone) return } } } // Windows console can display 8 characters, in either low or high intensity func (s *cScreen) Colors() int { return 16 } var vgaColors = map[Color]uint16{ ColorBlack: 0, ColorMaroon: 0x4, ColorGreen: 0x2, ColorNavy: 0x1, ColorOlive: 0x6, ColorPurple: 0x5, ColorTeal: 0x3, ColorSilver: 0x7, ColorGrey: 0x8, ColorRed: 0xc, ColorLime: 0xa, ColorBlue: 0x9, ColorYellow: 0xe, ColorFuchsia: 0xd, ColorAqua: 0xb, ColorWhite: 0xf, } // Windows uses RGB signals func mapColor2RGB(c Color) uint16 { winLock.Lock() if v, ok := winColors[c]; ok { c = v } else { v = FindColor(c, winPalette) winColors[c] = v c = v } winLock.Unlock() if vc, ok := vgaColors[c]; ok { return vc } return 0 } // Map a tcell style to Windows attributes func (s *cScreen) mapStyle(style Style) uint16 { f, b, a := style.Decompose() fa := s.oscreen.attrs & 0xf ba := (s.oscreen.attrs) >> 4 & 0xf if f != ColorDefault { fa = mapColor2RGB(f) } if b != ColorDefault { ba = mapColor2RGB(b) } var attr uint16 // We simulate reverse by doing the color swap ourselves. // Apparently windows cannot really do this except in DBCS // views. if a&AttrReverse != 0 { attr = ba attr |= (fa << 4) } else { attr = fa attr |= (ba << 4) } if a&AttrBold != 0 { attr |= 0x8 } if a&AttrDim != 0 { attr &^= 0x8 } if a&AttrUnderline != 0 { // Best effort -- doesn't seem to work though. attr |= 0x8000 } // Blink is unsupported return attr } func (s *cScreen) SetCell(x, y int, style Style, ch ...rune) { if len(ch) > 0 { s.SetContent(x, y, ch[0], ch[1:], style) } else { s.SetContent(x, y, ' ', nil, style) } } func (s *cScreen) SetContent(x, y int, mainc rune, combc []rune, style Style) { s.Lock() if !s.fini { s.cells.SetContent(x, y, mainc, combc, style) } s.Unlock() } func (s *cScreen) GetContent(x, y int) (rune, []rune, Style, int) { s.Lock() mainc, combc, style, width := s.cells.GetContent(x, y) s.Unlock() return mainc, combc, style, width } func (s *cScreen) writeString(x, y int, style Style, ch []uint16) { // we assume the caller has hidden the cursor if len(ch) == 0 { return } nw := uint32(len(ch)) procSetConsoleTextAttribute.Call( uintptr(s.out), uintptr(s.mapStyle(style))) s.setCursorPos(x, y) syscall.WriteConsole(s.out, &ch[0], nw, &nw, nil) } func (s *cScreen) draw() { // allocate a scratch line bit enough for no combining chars. // if you have combining characters, you may pay for extra allocs. if s.clear { s.clearScreen(s.style) s.clear = false s.cells.Invalidate() } buf := make([]uint16, 0, s.w) wcs := buf[:] lstyle := Style(-1) // invalid attribute lx, ly := -1, -1 ra := make([]rune, 1) for y := 0; y < int(s.h); y++ { for x := 0; x < int(s.w); x++ { mainc, combc, style, width := s.cells.GetContent(x, y) dirty := s.cells.Dirty(x, y) if style == StyleDefault { style = s.style } if !dirty || style != lstyle { // write out any data queued thus far // because we are going to skip over some // cells, or because we need to change styles s.writeString(lx, ly, lstyle, wcs) wcs = buf[0:0] lstyle = Style(-1) if !dirty { continue } } if x > s.w-width { mainc = ' ' combc = nil width = 1 } if len(wcs) == 0 { lstyle = style lx = x ly = y } ra[0] = mainc wcs = append(wcs, utf16.Encode(ra)...) if len(combc) != 0 { wcs = append(wcs, utf16.Encode(combc)...) } for dx := 0; dx < width; dx++ { s.cells.SetDirty(x+dx, y, false) } x += width - 1 } s.writeString(lx, ly, lstyle, wcs) wcs = buf[0:0] lstyle = Style(-1) } } func (s *cScreen) Show() { s.Lock() if !s.fini { s.hideCursor() s.resize() s.draw() s.doCursor() } s.Unlock() } func (s *cScreen) Sync() { s.Lock() if !s.fini { s.cells.Invalidate() s.hideCursor() s.resize() s.draw() s.doCursor() } s.Unlock() } type consoleInfo struct { size coord pos coord attrs uint16 win rect maxsz coord } func (s *cScreen) getConsoleInfo(info *consoleInfo) { procGetConsoleScreenBufferInfo.Call( uintptr(s.out), uintptr(unsafe.Pointer(info))) } func (s *cScreen) getCursorInfo(info *cursorInfo) { procGetConsoleCursorInfo.Call( uintptr(s.out), uintptr(unsafe.Pointer(info))) } func (s *cScreen) setCursorInfo(info *cursorInfo) { procSetConsoleCursorInfo.Call( uintptr(s.out), uintptr(unsafe.Pointer(info))) } func (s *cScreen) setCursorPos(x, y int) { procSetConsoleCursorPosition.Call( uintptr(s.out), coord{int16(x), int16(y)}.uintptr()) } func (s *cScreen) setBufferSize(x, y int) { procSetConsoleScreenBufferSize.Call( uintptr(s.out), coord{int16(x), int16(y)}.uintptr()) } func (s *cScreen) Size() (int, int) { s.Lock() w, h := s.w, s.h s.Unlock() return w, h } func (s *cScreen) resize() { info := consoleInfo{} s.getConsoleInfo(&info) w := int((info.win.right - info.win.left) + 1) h := int((info.win.bottom - info.win.top) + 1) if s.w == w && s.h == h { return } s.cells.Resize(w, h) s.w = w s.h = h s.setBufferSize(w, h) r := rect{0, 0, int16(w - 1), int16(h - 1)} procSetConsoleWindowInfo.Call( uintptr(s.out), uintptr(1), uintptr(unsafe.Pointer(&r))) s.PostEvent(NewEventResize(w, h)) } func (s *cScreen) Clear() { s.Fill(' ', s.style) } func (s *cScreen) Fill(r rune, style Style) { s.Lock() if !s.fini { s.cells.Fill(r, style) s.clear = true } s.Unlock() } func (s *cScreen) clearScreen(style Style) { pos := coord{0, 0} attr := s.mapStyle(style) x, y := s.w, s.h scratch := uint32(0) count := uint32(x * y) procFillConsoleOutputAttribute.Call( uintptr(s.out), uintptr(attr), uintptr(count), pos.uintptr(), uintptr(unsafe.Pointer(&scratch))) procFillConsoleOutputCharacter.Call( uintptr(s.out), uintptr(' '), uintptr(count), pos.uintptr(), uintptr(unsafe.Pointer(&scratch))) } const ( modeExtndFlg uint32 = 0x0080 modeMouseEn uint32 = 0x0010 modeResizeEn uint32 = 0x0008 modeWrapEOL uint32 = 0x0002 modeCooked uint32 = 0x0001 ) func (s *cScreen) setInMode(mode uint32) error { rv, _, err := procSetConsoleMode.Call( uintptr(s.in), uintptr(mode)) if rv == 0 { return err } return nil } func (s *cScreen) setOutMode(mode uint32) error { rv, _, err := procSetConsoleMode.Call( uintptr(s.out), uintptr(mode)) if rv == 0 { return err } return nil } func (s *cScreen) getInMode(v *uint32) { procGetConsoleMode.Call( uintptr(s.in), uintptr(unsafe.Pointer(v))) } func (s *cScreen) getOutMode(v *uint32) { procGetConsoleMode.Call( uintptr(s.out), uintptr(unsafe.Pointer(v))) } func (s *cScreen) SetStyle(style Style) { s.Lock() s.style = style s.Unlock() } // No fallback rune support, since we have Unicode. Yay! func (s *cScreen) RegisterRuneFallback(r rune, subst string) { } func (s *cScreen) UnregisterRuneFallback(r rune) { } func (s *cScreen) CanDisplay(r rune, checkFallbacks bool) bool { // We presume we can display anything -- we're Unicode. // (Sadly this not precisely true. Combinings are especially // poorly supported under Windows.) return true } func (s *cScreen) HasMouse() bool { return true } func (s *cScreen) Resize(int, int, int, int) {} func (s *cScreen) HasKey(k Key) bool { // Microsoft has codes for some keys, but they are unusual, // so we don't include them. We include all the typical // 101, 105 key layout keys. valid := map[Key]bool{ KeyBackspace: true, KeyTab: true, KeyEscape: true, KeyPause: true, KeyPrint: true, KeyPgUp: true, KeyPgDn: true, KeyEnter: true, KeyEnd: true, KeyHome: true, KeyLeft: true, KeyUp: true, KeyRight: true, KeyDown: true, KeyInsert: true, KeyDelete: true, KeyF1: true, KeyF2: true, KeyF3: true, KeyF4: true, KeyF5: true, KeyF6: true, KeyF7: true, KeyF8: true, KeyF9: true, KeyF10: true, KeyF11: true, KeyF12: true, KeyRune: true, } return valid[k] } tcell-1.3.0/doc.go000066400000000000000000000045701354173511300137230ustar00rootroot00000000000000// Copyright 2018 The TCell Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use file except in compliance with the License. // You may obtain a copy of the license at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Package tcell provides a lower-level, portable API for building // programs that interact with terminals or consoles. It works with // both common (and many uncommon!) terminals or terminal emulators, // and Windows console implementations. // // It provides support for up to 256 colors, text attributes, and box drawing // elements. A database of terminals built from a real terminfo database // is provided, along with code to generate new database entries. // // Tcell offers very rich support for mice, dependent upon the terminal // of course. (Windows, XTerm, and iTerm 2 are known to work very well.) // // If the environment is not Unicode by default, such as an ISO8859 based // locale or GB18030, Tcell can convert input and output, so that your // terminal can operate in whatever locale is most convenient, while the // application program can just assume "everything is UTF-8". Reasonable // defaults are used for updating characters to something suitable for // display. Unicode box drawing characters will be converted to use the // alternate character set of your terminal, if native conversions are // not available. If no ACS is available, then some ASCII fallbacks will // be used. // // Note that support for non-UTF-8 locales (other than C) must be enabled // by the application using RegisterEncoding() -- we don't have them all // enabled by default to avoid bloating the application unneccessarily. // (These days UTF-8 is good enough for almost everyone, and nobody should // be using legacy locales anymore.) Also, actual glyphs for various code // point will only be displayed if your terminal or emulator (or the font // the emulator is using) supports them. // // A rich set of keycodes is supported, with support for up to 65 function // keys, and various other special keys. // package tcell tcell-1.3.0/encoding.go000066400000000000000000000121071354173511300147370ustar00rootroot00000000000000// Copyright 2015 The TCell Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use file except in compliance with the License. // You may obtain a copy of the license at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package tcell import ( "strings" "sync" "golang.org/x/text/encoding" gencoding "github.com/gdamore/encoding" ) var encodings map[string]encoding.Encoding var encodingLk sync.Mutex var encodingFallback EncodingFallback = EncodingFallbackFail // RegisterEncoding may be called by the application to register an encoding. // The presence of additional encodings will facilitate application usage with // terminal environments where the I/O subsystem does not support Unicode. // // Windows systems use Unicode natively, and do not need any of the encoding // subsystem when using Windows Console screens. // // Please see the Go documentation for golang.org/x/text/encoding -- most of // the common ones exist already as stock variables. For example, ISO8859-15 // can be registered using the following code: // // import "golang.org/x/text/encoding/charmap" // // ... // RegisterEncoding("ISO8859-15", charmap.ISO8859_15) // // Aliases can be registered as well, for example "8859-15" could be an alias // for "ISO8859-15". // // For POSIX systems, the tcell package will check the environment variables // LC_ALL, LC_CTYPE, and LANG (in that order) to determine the character set. // These are expected to have the following pattern: // // $language[.$codeset[@$variant] // // We extract only the $codeset part, which will usually be something like // UTF-8 or ISO8859-15 or KOI8-R. Note that if the locale is either "POSIX" // or "C", then we assume US-ASCII (the POSIX 'portable character set' // and assume all other characters are somehow invalid.) // // Modern POSIX systems and terminal emulators may use UTF-8, and for those // systems, this API is also unnecessary. For example, Darwin (MacOS X) and // modern Linux running modern xterm generally will out of the box without // any of this. Use of UTF-8 is recommended when possible, as it saves // quite a lot processing overhead. // // Note that some encodings are quite large (for example GB18030 which is a // superset of Unicode) and so the application size can be expected ot // increase quite a bit as each encoding is added. The East Asian encodings // have been seen to add 100-200K per encoding to the application size. // func RegisterEncoding(charset string, enc encoding.Encoding) { encodingLk.Lock() charset = strings.ToLower(charset) encodings[charset] = enc encodingLk.Unlock() } // EncodingFallback describes how the system behavees when the locale // requires a character set that we do not support. The system always // supports UTF-8 and US-ASCII. On Windows consoles, UTF-16LE is also // supported automatically. Other character sets must be added using the // RegisterEncoding API. (A large group of nearly all of them can be // added using the RegisterAll function in the encoding sub package.) type EncodingFallback int const ( // EncodingFallbackFail behavior causes GetEncoding to fail // when it cannot find an encoding. EncodingFallbackFail = iota // EncodingFallbackASCII behaviore causes GetEncoding to fall back // to a 7-bit ASCII encoding, if no other encoding can be found. EncodingFallbackASCII // EncodingFallbackUTF8 behavior causes GetEncoding to assume // UTF8 can pass unmodified upon failure. Note that this behavior // is not recommended, unless you are sure your terminal can cope // with real UTF8 sequences. EncodingFallbackUTF8 ) // SetEncodingFallback changes the behavior of GetEncoding when a suitable // encoding is not found. The default is EncodingFallbackFail, which // causes GetEncoding to simply return nil. func SetEncodingFallback(fb EncodingFallback) { encodingLk.Lock() encodingFallback = fb encodingLk.Unlock() } // GetEncoding is used by Screen implementors who want to locate an encoding // for the given character set name. Note that this will return nil for // either the Unicode (UTF-8) or ASCII encodings, since we don't use // encodings for them but instead have our own native methods. func GetEncoding(charset string) encoding.Encoding { charset = strings.ToLower(charset) encodingLk.Lock() defer encodingLk.Unlock() if enc, ok := encodings[charset]; ok { return enc } switch encodingFallback { case EncodingFallbackASCII: return gencoding.ASCII case EncodingFallbackUTF8: return encoding.Nop } return nil } func init() { // We always support UTF-8 and ASCII. encodings = make(map[string]encoding.Encoding) encodings["utf-8"] = gencoding.UTF8 encodings["utf8"] = gencoding.UTF8 encodings["us-ascii"] = gencoding.ASCII encodings["ascii"] = gencoding.ASCII encodings["iso646"] = gencoding.ASCII } tcell-1.3.0/encoding/000077500000000000000000000000001354173511300144075ustar00rootroot00000000000000tcell-1.3.0/encoding/all.go000066400000000000000000000076001354173511300155110ustar00rootroot00000000000000// Copyright 2015 The TCell Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use file except in compliance with the License. // You may obtain a copy of the license at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package encoding import ( "github.com/gdamore/encoding" "github.com/gdamore/tcell" "golang.org/x/text/encoding/charmap" "golang.org/x/text/encoding/japanese" "golang.org/x/text/encoding/korean" "golang.org/x/text/encoding/simplifiedchinese" "golang.org/x/text/encoding/traditionalchinese" ) // Register registers all known encodings. This is a short-cut to // add full character set support to your program. Note that this can // add several megabytes to your program's size, because some of the encodings // are rather large (particularly those from East Asia.) func Register() { // We supply latin1 and latin5, because Go doesn't tcell.RegisterEncoding("ISO8859-1", encoding.ISO8859_1) tcell.RegisterEncoding("ISO8859-9", encoding.ISO8859_9) tcell.RegisterEncoding("ISO8859-10", charmap.ISO8859_10) tcell.RegisterEncoding("ISO8859-13", charmap.ISO8859_13) tcell.RegisterEncoding("ISO8859-14", charmap.ISO8859_14) tcell.RegisterEncoding("ISO8859-15", charmap.ISO8859_15) tcell.RegisterEncoding("ISO8859-16", charmap.ISO8859_16) tcell.RegisterEncoding("ISO8859-2", charmap.ISO8859_2) tcell.RegisterEncoding("ISO8859-3", charmap.ISO8859_3) tcell.RegisterEncoding("ISO8859-4", charmap.ISO8859_4) tcell.RegisterEncoding("ISO8859-5", charmap.ISO8859_5) tcell.RegisterEncoding("ISO8859-6", charmap.ISO8859_6) tcell.RegisterEncoding("ISO8859-7", charmap.ISO8859_7) tcell.RegisterEncoding("ISO8859-8", charmap.ISO8859_8) tcell.RegisterEncoding("KOI8-R", charmap.KOI8R) tcell.RegisterEncoding("KOI8-U", charmap.KOI8U) // Asian stuff tcell.RegisterEncoding("EUC-JP", japanese.EUCJP) tcell.RegisterEncoding("SHIFT_JIS", japanese.ShiftJIS) tcell.RegisterEncoding("ISO2022JP", japanese.ISO2022JP) tcell.RegisterEncoding("EUC-KR", korean.EUCKR) tcell.RegisterEncoding("GB18030", simplifiedchinese.GB18030) tcell.RegisterEncoding("GB2312", simplifiedchinese.HZGB2312) tcell.RegisterEncoding("GBK", simplifiedchinese.GBK) tcell.RegisterEncoding("Big5", traditionalchinese.Big5) // Common aliaess aliases := map[string]string{ "8859-1": "ISO8859-1", "ISO-8859-1": "ISO8859-1", "8859-13": "ISO8859-13", "ISO-8859-13": "ISO8859-13", "8859-14": "ISO8859-14", "ISO-8859-14": "ISO8859-14", "8859-15": "ISO8859-15", "ISO-8859-15": "ISO8859-15", "8859-16": "ISO8859-16", "ISO-8859-16": "ISO8859-16", "8859-2": "ISO8859-2", "ISO-8859-2": "ISO8859-2", "8859-3": "ISO8859-3", "ISO-8859-3": "ISO8859-3", "8859-4": "ISO8859-4", "ISO-8859-4": "ISO8859-4", "8859-5": "ISO8859-5", "ISO-8859-5": "ISO8859-5", "8859-6": "ISO8859-6", "ISO-8859-6": "ISO8859-6", "8859-7": "ISO8859-7", "ISO-8859-7": "ISO8859-7", "8859-8": "ISO8859-8", "ISO-8859-8": "ISO8859-8", "8859-9": "ISO8859-9", "ISO-8859-9": "ISO8859-9", "SJIS": "Shift_JIS", "EUCJP": "EUC-JP", "2022-JP": "ISO2022JP", "ISO-2022-JP": "ISO2022JP", "EUCKR": "EUC-KR", // ISO646 isn't quite exactly ASCII, but the 1991 IRV // (international reference version) is so. This helps // some older systems that may use "646" for POSIX locales. "646": "US-ASCII", "ISO646": "US-ASCII", // Other names for UTF-8 "UTF8": "UTF-8", } for n, v := range aliases { if enc := tcell.GetEncoding(v); enc != nil { tcell.RegisterEncoding(n, enc) } } } tcell-1.3.0/errors.go000066400000000000000000000050201354173511300144610ustar00rootroot00000000000000// Copyright 2015 The TCell Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use file except in compliance with the License. // You may obtain a copy of the license at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package tcell import ( "errors" "time" "github.com/gdamore/tcell/terminfo" ) var ( // ErrTermNotFound indicates that a suitable terminal entry could // not be found. This can result from either not having TERM set, // or from the TERM failing to support certain minimal functionality, // in particular absolute cursor addressability (the cup capability) // is required. For example, legacy "adm3" lacks this capability, // whereas the slightly newer "adm3a" supports it. This failure // occurs most often with "dumb". ErrTermNotFound = terminfo.ErrTermNotFound // ErrNoScreen indicates that no suitable screen could be found. // This may result from attempting to run on a platform where there // is no support for either termios or console I/O (such as nacl), // or from running in an environment where there is no access to // a suitable console/terminal device. (For example, running on // without a controlling TTY or with no /dev/tty on POSIX platforms.) ErrNoScreen = errors.New("no suitable screen available") // ErrNoCharset indicates that the locale environment the // program is not supported by the program, because no suitable // encoding was found for it. This problem never occurs if // the environment is UTF-8 or UTF-16. ErrNoCharset = errors.New("character set not supported") // ErrEventQFull indicates that the event queue is full, and // cannot accept more events. ErrEventQFull = errors.New("event queue full") ) // An EventError is an event representing some sort of error, and carries // an error payload. type EventError struct { t time.Time err error } // When returns the time when the event was created. func (ev *EventError) When() time.Time { return ev.t } // Error implements the error. func (ev *EventError) Error() string { return ev.err.Error() } // NewEventError creates an ErrorEvent with the given error payload. func NewEventError(err error) *EventError { return &EventError{t: time.Now(), err: err} } tcell-1.3.0/event.go000066400000000000000000000030211354173511300142650ustar00rootroot00000000000000// Copyright 2015 The TCell Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use file except in compliance with the License. // You may obtain a copy of the license at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package tcell import ( "time" ) // Event is a generic interface used for passing around Events. // Concrete types follow. type Event interface { // When reports the time when the event was generated. When() time.Time } // EventTime is a simple base event class, suitable for easy reuse. // It can be used to deliver actual timer events as well. type EventTime struct { when time.Time } // When returns the time stamp when the event occurred. func (e *EventTime) When() time.Time { return e.when } // SetEventTime sets the time of occurrence for the event. func (e *EventTime) SetEventTime(t time.Time) { e.when = t } // SetEventNow sets the time of occurrence for the event to the current time. func (e *EventTime) SetEventNow() { e.SetEventTime(time.Now()) } // EventHandler is anything that handles events. If the handler has // consumed the event, it should return true. False otherwise. type EventHandler interface { HandleEvent(Event) bool } tcell-1.3.0/event_test.go000066400000000000000000000027241354173511300153350ustar00rootroot00000000000000// Copyright 2018 The TCell Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use file except in compliance with the License. // You may obtain a copy of the license at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package tcell import ( "testing" "time" ) func eventLoop(s SimulationScreen, evch chan Event) { for { ev := s.PollEvent() if ev == nil { close(evch) return } select { case evch <- ev: case <-time.After(time.Second): } } } func TestMouseEvents(t *testing.T) { s := mkTestScreen(t, "") defer s.Fini() s.EnableMouse() s.InjectMouse(4, 9, Button1, ModCtrl) evch := make(chan Event) em := &EventMouse{} done := false go eventLoop(s, evch) for !done { select { case ev := <-evch: if evm, ok := ev.(*EventMouse); ok { em = evm done = true } continue case <-time.After(time.Second): done = true } } if x, y := em.Position(); x != 4 || y != 9 { t.Errorf("Mouse position wrong (%v, %v)", x, y) } if em.Buttons() != Button1 { t.Errorf("Should be Button1") } if em.Modifiers() != ModCtrl { t.Errorf("Modifiers should be control") } } tcell-1.3.0/go.mod000066400000000000000000000003721354173511300137310ustar00rootroot00000000000000module github.com/gdamore/tcell go 1.12 require ( github.com/gdamore/encoding v1.0.0 github.com/lucasb-eyer/go-colorful v1.0.2 github.com/mattn/go-runewidth v0.0.4 golang.org/x/sys v0.0.0-20190626150813-e07cf5db2756 golang.org/x/text v0.3.0 ) tcell-1.3.0/go.sum000066400000000000000000000020641354173511300137560ustar00rootroot00000000000000github.com/DATA-DOG/go-sqlmock v1.3.3 h1:CWUqKXe0s8A2z6qCgkP4Kru7wC11YoAnoupUKFDnH08= github.com/DATA-DOG/go-sqlmock v1.3.3/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM= github.com/gdamore/encoding v1.0.0 h1:+7OoQ1Bc6eTm5niUzBa0Ctsh6JbMW6Ra+YNuAtDBdko= github.com/gdamore/encoding v1.0.0/go.mod h1:alR0ol34c49FCSBLjhosxzcPHQbf2trDkoo5dl+VrEg= github.com/lucasb-eyer/go-colorful v1.0.2 h1:mCMFu6PgSozg9tDNMMK3g18oJBX7oYGrC09mS6CXfO4= github.com/lucasb-eyer/go-colorful v1.0.2/go.mod h1:0MS4r+7BZKSJ5mw4/S5MPN+qHFF1fYclkSPilDOKW0s= github.com/mattn/go-runewidth v0.0.4 h1:2BvfKmzob6Bmd4YsL0zygOqfdFnK7GR4QL06Do4/p7Y= github.com/mattn/go-runewidth v0.0.4/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= golang.org/x/sys v0.0.0-20190626150813-e07cf5db2756 h1:9nuHUbU8dRnRRfj9KjWUVrJeoexdbeMjttk6Oh1rD10= golang.org/x/sys v0.0.0-20190626150813-e07cf5db2756/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/text v0.3.0 h1:g61tztE5qeGQ89tm6NTjjM9VPIm088od1l6aSorWRWg= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= tcell-1.3.0/interrupt.go000066400000000000000000000023141354173511300152040ustar00rootroot00000000000000// Copyright 2015 The TCell Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use file except in compliance with the License. // You may obtain a copy of the license at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package tcell import ( "time" ) // EventInterrupt is a generic wakeup event. Its can be used to // to request a redraw. It can carry an arbitrary payload, as well. type EventInterrupt struct { t time.Time v interface{} } // When returns the time when this event was created. func (ev *EventInterrupt) When() time.Time { return ev.t } // Data is used to obtain the opaque event payload. func (ev *EventInterrupt) Data() interface{} { return ev.v } // NewEventInterrupt creates an EventInterrupt with the given payload. func NewEventInterrupt(data interface{}) *EventInterrupt { return &EventInterrupt{t: time.Now(), v: data} } tcell-1.3.0/key.go000066400000000000000000000257571354173511300137600ustar00rootroot00000000000000// Copyright 2016 The TCell Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use file except in compliance with the License. // You may obtain a copy of the license at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package tcell import ( "fmt" "strings" "time" ) // EventKey represents a key press. Usually this is a key press followed // by a key release, but since terminal programs don't have a way to report // key release events, we usually get just one event. If a key is held down // then the terminal may synthesize repeated key presses at some predefined // rate. We have no control over that, nor visibility into it. // // In some cases, we can have a modifier key, such as ModAlt, that can be // generated with a key press. (This usually is represented by having the // high bit set, or in some cases, by sending an ESC prior to the rune.) // // If the value of Key() is KeyRune, then the actual key value will be // available with the Rune() method. This will be the case for most keys. // In most situations, the modifiers will not be set. For example, if the // rune is 'A', this will be reported without the ModShift bit set, since // really can't tell if the Shift key was pressed (it might have been CAPSLOCK, // or a terminal that only can send capitals, or keyboard with separate // capital letters from lower case letters). // // Generally, terminal applications have far less visibility into keyboard // activity than graphical applications. Hence, they should avoid depending // overly much on availability of modifiers, or the availability of any // specific keys. type EventKey struct { t time.Time mod ModMask key Key ch rune } // When returns the time when this Event was created, which should closely // match the time when the key was pressed. func (ev *EventKey) When() time.Time { return ev.t } // Rune returns the rune corresponding to the key press, if it makes sense. // The result is only defined if the value of Key() is KeyRune. func (ev *EventKey) Rune() rune { return ev.ch } // Key returns a virtual key code. We use this to identify specific key // codes, such as KeyEnter, etc. Most control and function keys are reported // with unique Key values. Normal alphanumeric and punctuation keys will // generally return KeyRune here; the specific key can be further decoded // using the Rune() function. func (ev *EventKey) Key() Key { return ev.key } // Modifiers returns the modifiers that were present with the key press. Note // that not all platforms and terminals support this equally well, and some // cases we will not not know for sure. Hence, applications should avoid // using this in most circumstances. func (ev *EventKey) Modifiers() ModMask { return ev.mod } // KeyNames holds the written names of special keys. Useful to echo back a key // name, or to look up a key from a string value. var KeyNames = map[Key]string{ KeyEnter: "Enter", KeyBackspace: "Backspace", KeyTab: "Tab", KeyBacktab: "Backtab", KeyEsc: "Esc", KeyBackspace2: "Backspace2", KeyDelete: "Delete", KeyInsert: "Insert", KeyUp: "Up", KeyDown: "Down", KeyLeft: "Left", KeyRight: "Right", KeyHome: "Home", KeyEnd: "End", KeyUpLeft: "UpLeft", KeyUpRight: "UpRight", KeyDownLeft: "DownLeft", KeyDownRight: "DownRight", KeyCenter: "Center", KeyPgDn: "PgDn", KeyPgUp: "PgUp", KeyClear: "Clear", KeyExit: "Exit", KeyCancel: "Cancel", KeyPause: "Pause", KeyPrint: "Print", KeyF1: "F1", KeyF2: "F2", KeyF3: "F3", KeyF4: "F4", KeyF5: "F5", KeyF6: "F6", KeyF7: "F7", KeyF8: "F8", KeyF9: "F9", KeyF10: "F10", KeyF11: "F11", KeyF12: "F12", KeyF13: "F13", KeyF14: "F14", KeyF15: "F15", KeyF16: "F16", KeyF17: "F17", KeyF18: "F18", KeyF19: "F19", KeyF20: "F20", KeyF21: "F21", KeyF22: "F22", KeyF23: "F23", KeyF24: "F24", KeyF25: "F25", KeyF26: "F26", KeyF27: "F27", KeyF28: "F28", KeyF29: "F29", KeyF30: "F30", KeyF31: "F31", KeyF32: "F32", KeyF33: "F33", KeyF34: "F34", KeyF35: "F35", KeyF36: "F36", KeyF37: "F37", KeyF38: "F38", KeyF39: "F39", KeyF40: "F40", KeyF41: "F41", KeyF42: "F42", KeyF43: "F43", KeyF44: "F44", KeyF45: "F45", KeyF46: "F46", KeyF47: "F47", KeyF48: "F48", KeyF49: "F49", KeyF50: "F50", KeyF51: "F51", KeyF52: "F52", KeyF53: "F53", KeyF54: "F54", KeyF55: "F55", KeyF56: "F56", KeyF57: "F57", KeyF58: "F58", KeyF59: "F59", KeyF60: "F60", KeyF61: "F61", KeyF62: "F62", KeyF63: "F63", KeyF64: "F64", KeyCtrlA: "Ctrl-A", KeyCtrlB: "Ctrl-B", KeyCtrlC: "Ctrl-C", KeyCtrlD: "Ctrl-D", KeyCtrlE: "Ctrl-E", KeyCtrlF: "Ctrl-F", KeyCtrlG: "Ctrl-G", KeyCtrlJ: "Ctrl-J", KeyCtrlK: "Ctrl-K", KeyCtrlL: "Ctrl-L", KeyCtrlN: "Ctrl-N", KeyCtrlO: "Ctrl-O", KeyCtrlP: "Ctrl-P", KeyCtrlQ: "Ctrl-Q", KeyCtrlR: "Ctrl-R", KeyCtrlS: "Ctrl-S", KeyCtrlT: "Ctrl-T", KeyCtrlU: "Ctrl-U", KeyCtrlV: "Ctrl-V", KeyCtrlW: "Ctrl-W", KeyCtrlX: "Ctrl-X", KeyCtrlY: "Ctrl-Y", KeyCtrlZ: "Ctrl-Z", KeyCtrlSpace: "Ctrl-Space", KeyCtrlUnderscore: "Ctrl-_", KeyCtrlRightSq: "Ctrl-]", KeyCtrlBackslash: "Ctrl-\\", KeyCtrlCarat: "Ctrl-^", } // Name returns a printable value or the key stroke. This can be used // when printing the event, for example. func (ev *EventKey) Name() string { s := "" m := []string{} if ev.mod&ModShift != 0 { m = append(m, "Shift") } if ev.mod&ModAlt != 0 { m = append(m, "Alt") } if ev.mod&ModMeta != 0 { m = append(m, "Meta") } if ev.mod&ModCtrl != 0 { m = append(m, "Ctrl") } ok := false if s, ok = KeyNames[ev.key]; !ok { if ev.key == KeyRune { s = "Rune[" + string(ev.ch) + "]" } else { s = fmt.Sprintf("Key[%d,%d]", ev.key, int(ev.ch)) } } if len(m) != 0 { if ev.mod&ModCtrl != 0 && strings.HasPrefix(s, "Ctrl-") { s = s[5:] } return fmt.Sprintf("%s+%s", strings.Join(m, "+"), s) } return s } // NewEventKey attempts to create a suitable event. It parses the various // ASCII control sequences if KeyRune is passed for Key, but if the caller // has more precise information it should set that specifically. Callers // that aren't sure about modifier state (most) should just pass ModNone. func NewEventKey(k Key, ch rune, mod ModMask) *EventKey { if k == KeyRune && (ch < ' ' || ch == 0x7f) { // Turn specials into proper key codes. This is for // control characters and the DEL. k = Key(ch) if mod == ModNone && ch < ' ' { switch Key(ch) { case KeyBackspace, KeyTab, KeyEsc, KeyEnter: // these keys are directly typeable without CTRL default: // most likely entered with a CTRL keypress mod = ModCtrl } } } return &EventKey{t: time.Now(), key: k, ch: ch, mod: mod} } // ModMask is a mask of modifier keys. Note that it will not always be // possible to report modifier keys. type ModMask int16 // These are the modifiers keys that can be sent either with a key press, // or a mouse event. Note that as of now, due to the confusion associated // with Meta, and the lack of support for it on many/most platforms, the // current implementations never use it. Instead, they use ModAlt, even for // events that could possibly have been distinguished from ModAlt. const ( ModShift ModMask = 1 << iota ModCtrl ModAlt ModMeta ModNone ModMask = 0 ) // Key is a generic value for representing keys, and especially special // keys (function keys, cursor movement keys, etc.) For normal keys, like // ASCII letters, we use KeyRune, and then expect the application to // inspect the Rune() member of the EventKey. type Key int16 // This is the list of named keys. KeyRune is special however, in that it is // a place holder key indicating that a printable character was sent. The // actual value of the rune will be transported in the Rune of the associated // EventKey. const ( KeyRune Key = iota + 256 KeyUp KeyDown KeyRight KeyLeft KeyUpLeft KeyUpRight KeyDownLeft KeyDownRight KeyCenter KeyPgUp KeyPgDn KeyHome KeyEnd KeyInsert KeyDelete KeyHelp KeyExit KeyClear KeyCancel KeyPrint KeyPause KeyBacktab KeyF1 KeyF2 KeyF3 KeyF4 KeyF5 KeyF6 KeyF7 KeyF8 KeyF9 KeyF10 KeyF11 KeyF12 KeyF13 KeyF14 KeyF15 KeyF16 KeyF17 KeyF18 KeyF19 KeyF20 KeyF21 KeyF22 KeyF23 KeyF24 KeyF25 KeyF26 KeyF27 KeyF28 KeyF29 KeyF30 KeyF31 KeyF32 KeyF33 KeyF34 KeyF35 KeyF36 KeyF37 KeyF38 KeyF39 KeyF40 KeyF41 KeyF42 KeyF43 KeyF44 KeyF45 KeyF46 KeyF47 KeyF48 KeyF49 KeyF50 KeyF51 KeyF52 KeyF53 KeyF54 KeyF55 KeyF56 KeyF57 KeyF58 KeyF59 KeyF60 KeyF61 KeyF62 KeyF63 KeyF64 ) // These are the control keys. Note that they overlap with other keys, // perhaps. For example, KeyCtrlH is the same as KeyBackspace. const ( KeyCtrlSpace Key = iota KeyCtrlA KeyCtrlB KeyCtrlC KeyCtrlD KeyCtrlE KeyCtrlF KeyCtrlG KeyCtrlH KeyCtrlI KeyCtrlJ KeyCtrlK KeyCtrlL KeyCtrlM KeyCtrlN KeyCtrlO KeyCtrlP KeyCtrlQ KeyCtrlR KeyCtrlS KeyCtrlT KeyCtrlU KeyCtrlV KeyCtrlW KeyCtrlX KeyCtrlY KeyCtrlZ KeyCtrlLeftSq // Escape KeyCtrlBackslash KeyCtrlRightSq KeyCtrlCarat KeyCtrlUnderscore ) // Special values - these are fixed in an attempt to make it more likely // that aliases will encode the same way. // These are the defined ASCII values for key codes. They generally match // with KeyCtrl values. const ( KeyNUL Key = iota KeySOH KeySTX KeyETX KeyEOT KeyENQ KeyACK KeyBEL KeyBS KeyTAB KeyLF KeyVT KeyFF KeyCR KeySO KeySI KeyDLE KeyDC1 KeyDC2 KeyDC3 KeyDC4 KeyNAK KeySYN KeyETB KeyCAN KeyEM KeySUB KeyESC KeyFS KeyGS KeyRS KeyUS KeyDEL Key = 0x7F ) // These keys are aliases for other names. const ( KeyBackspace = KeyBS KeyTab = KeyTAB KeyEsc = KeyESC KeyEscape = KeyESC KeyEnter = KeyCR KeyBackspace2 = KeyDEL ) tcell-1.3.0/logos/000077500000000000000000000000001354173511300137445ustar00rootroot00000000000000tcell-1.3.0/logos/patreon.png000066400000000000000000000136511354173511300161300ustar00rootroot00000000000000PNG  IHDR@@͐gAMA a`IDATx U<呐H CqVDDyruWVk*RUPk]-JgX5 Ѷ#> Ѷ#> Ѷ#> Ѷ#> Ѷ#> Ѷ#> Ѷ#> Ѷ#> Ѷ#> Ѷ#> Ѷ#> Ѷ#> Ѷ#> Ѷ#> Ѷ#> Ѷ#> Ѷ#> Ѷ#> Ѷ#> Ѷ#> Ѷ#> Ѷ#> Ѷ#> Ѷ#> Ѷ#> Ѷ#> Ѷ#> Ѷ#> Ѷ#> Ѷ#> Ѷ#> Ѷ#> Ѷ#> Ѷ#> Ѷ#> Ѷ#> Ѷ#> Ѷ#@yϧen/!Wpy5Ob=-mn&Ҿli 2~2ĪIed1{M3}i3ukT [Qon|UI|>zGmmf;p~̞+f<ݦx O|m,| %b>UݴQ<򐤿^ 1V̜y| Ĺ"ƗZW'@Vgϖ_p/)JzB/6M_ZkŮ^%.׉qO#$OsС} +@UH֎ɮo_WL{[bKcO Cq# P $*V>v~7Bsı8l13W5*@wIߣ)f~'$#xFN.OZW.n6ڧ eWKr|is}ӖٌЇ"cZuҺ?%{]^k%9ti 5]}Bַ,K%zIo M[5{4TܑwT>RZ?=}Ujw?a [l~"SnuXN0l͒^_b^)?+fD80Z}VHK ٍݯHv5/_C`]P\]'~5Dbkk~&Ɋygq@`@V}i]%¯e;K`}PWEv"i}_zGx |D>}Ah$u`^_, z?K?), -I{_a`ax Rw ?[?H~d\!WҺ8'_!5GM}?Q@%_yf}I[`ؑd-`.nl'`] \uϕF&@#AjXJOJxI|ɂvY>ykdZقK ÿ(@(C뮔}u}K``i)yR]Ο +@oϺts"*y=jU?:ܹ\#;Q ; RIP@C'-ܩSw@S UC֨E%{bu!X$W׋@T6uGzVV5=;B-@\ljvg$?bKqZǗ53FxZW7?6ug!||p „x@~:l\/ ݛ^Z,=o eXtW *[?&gmf\ٹعU-itֈlX[T26ᗰeY ,k,J:6f<h;Fc^-O+j6Nw[|RR6ٳ&@s8ƍ\M]u!ғΕxocUM_vpdbpf5M콫`vE]:*vĴ;d}uS7sb} 6ChC)E۞Y 锭y5rmXCJou5vUNzJ>.VF*mϲ#$ǟsH,Si(KraQQyѸ?Y<N T^''& y/f}+!1t96?bػ5Y@/=||c[4Y;XBSgJ69}\i&og? 7r܅̱#}ָs3^cjh~_D_?GS[][OUZ}eNorÁ|"-t{ ]Q|5>pÎ*chC*g$.<üU⾷{G/H3O{?)Mwz3Ź;zt#qNo6N6x E8CbbTi"5~e.@z'g3ܑJg?}[<qQ~^̌z| E#/9͒w.d9w>݆;^n/'4ܬM~(}fH ߐ}4>O0`=GfϕKnRyE+,a aEmU֓9$2I^vE 5N=K{H?"eKwqM#n] >X4 ɼKɡ44%5txܗ.$]ZS;yG8ɼ}T0u/'o{$o9E_$m7ݲY4F*8hK3%q1#){=noU$qg8KN:],׋ݴQ',_'͢S7U&K]{n΅bW<$9NGBrP8H}p&m"럖E'ZF'K =eX^ꝉ{!9ŮdK|U+Ķ>/3q!$ |, W2$ wwGdxdyOiV6|U{ڸ0Bw å.Mb<.w@ boy~29lĉ? "{O3m3ܿ3燸.NJ/h% @5`5l h% @5`5l h% @5`5l h% @5`5l h% @5`5l h% @5`5l h% @5`5l h% @5`5l h% @5`5l h% @5`5l h% @5`5l h% @5`5l h% @5`5l h% @5`5l h% @5`5l h% @5`5l h% @5`5l h% @5`5l h% @5`5lhP5OfQeDh0-ZN@O}j2 Ub@S@@]>@@UX)@d,P%@j"OЧ&c!*PU(| >5 T E SX JT.EOMBUvQ, }j2 Ub@S@@]>@@UX)@d,P%@j"OЧ&c!*PU(| >5 T E SX JT.EOMBUvQ, }j2 Ub@S@@]>@@UX)@d,P%@j"OЧ&c!*PU(| >5 T E SX JT.EOMBUvQ, }j2 Ub@S@@]>@@UX)@d,P%@j"OЧ&c!*PU(| >5 T E SX JT.EOMBUvQ, }j2 Ub@S@@]>@@UX)@d,P%@j"OЧ&c!*PU(| >5 T E SX JT.EOMBUU_,IENDB`tcell-1.3.0/logos/staysail.png000066400000000000000000000420161354173511300163060ustar00rootroot00000000000000PNG  IHDR,,y}usBIT|d pHYs itEXtSoftwarewww.inkscape.org< IDATxwxTי?QwQ1.'8n$ko$ec0`'8Nw,lǸ`6wi4E3z~ `HBv̜f}%f9sCq(y8- J3)H4$"C H?2O=]@sC܁APv)h@'D'~BzoZ:/ +6".,_9 `ԌC ~g=B9ܰu`\H*J/@bB`s%8nIB7H OXPXk=VxPloziLJc@:.Y(ŏZ=BxCQu|?KGmm ;eu*AK~^V<{.;`Ą'Y%$:I@XG"~ېuX\ !0,[*^ FB&*w`9o^8Z@`:7rI8+2-~:IUW'pPBD"욷\R҂@dN2S4xc>_+-6kRB<͊EI/u$N⹽bʩ;5 :f.OԮy{ӋӱxV.}89HMYh9sҊe1 XA0T5JS8KC -]x-Nz\YiZ,+_tK$Z7gDE*eG$̝\㙯 !Jbey! -zoLyۮ(gDiTrl\Y>;["'"K^e>a_X),?dR fg`s ̛^ۖnV"PJvI .7Y2Q'=wxu$شzyǦӰdv>mhO!򅡄9&ByӲQjJlcTK۬'fXDm$Ӎ7D{iZ.+EżhxHrYdiyF\0'i+᪘$-BP/z\xD jwHnTN;Sj2S5X  1W I%:,)?>j΋&B@.6?:s.al[J(} yѬ\Qdji4⋓}VU)9!z뗗ᓯoDCMS6`㋢ @T +tW%JS`zN'$pCp{'j2l4/P'D!b2w[qq1VILEE+v$jE1EaG"0oZ6.[;ى3Zqᜰ3Xk;crM.RT5,ϔ:;#kDϧ*pKqڅRil{ n޺2@,;~ PQū{`GtGg1&NG7sN%u{"^# ɿ0De.aN[0=I+}"}҈&H3QNX]Be%˂i]|3_2c]BݛW}EJ{k)aһBh2+ɋ|~(-,m@"J,:n `GgBJXk=C0$=KhFv&}a%LAsx.M.|WXgd7E(dd萢{fh umUHtҹdR ˴aL Z;ًpچ\n{O3,?ٶ8X6y U3&ɵ| 9?hWOi YߴuH  ':%@|Li3#};cXA6.ï"%[&f /3^ 58(ʍ w`͝W/Ɔeྖ/'%$ fDz 5x]BJ}"筫Q1 22nT+C~{бMT(R*йɯ~tD8%HR1': V:OXQPmħp!!O"VeׇR+3"73:3mA2R*94r2tَj8܈+9yVL@fDBJRGoeWPбTšyӲO):߃"*"$s^?y k26-"'JqVy>-G.N#G쨜g`>? :λw5uɍrT֍j܄՗j/U !hw~0!]k0_PqD(xw0LkGQVhJ)vWTs n NG<$VJq+8a7\u ^݁ y]LXA]>. +F5t̨U&6$޶2)uyn /F'>kFkagzd~y\@$tX3a '9 ,bwR;xh7iMfw^ bn3j:v4j%%Q;=v8]1!]kJӴ {G?&,D[Wa]>!k!OX*|>|Q+0f;<#N͊5N)w #mjaw a$2j)(aWVQvQUs2yŠ WLk#-۰7lnP"a>0D nw[TЪy-hy7--g KA K(_R袼Rh NX;]R{-0V?(%,?Z$ ~ǰ7x~p4-~m2,6rȄUY'%bNbJkl n]@Y#$ŝW/fF2Xzn @i\@ӐI ƖܧpEvI0Ps Pʻ!R+W!!\l=3iE;77ʅHT4>|il h˦6;3ݾWzwfL +1(vQƯ`*ETN߽ϊJp&7IX3ù\^w3u0kM.`F¡-,$,@ܘ]>3gGX4+vd@Ve@nd~LwQ/8 J$٧O( OBa_0',1LߪXD*o8^gn|!"^>;)ǀTqT/UX0)R>PiA +b[zFx&{]S^$?S O_pŴu,Żb%IQwG%_ )Nw tL |]ԦKc{s&!ѳZX- 1Lu {qxS2ҋ )r8u _5e(n:w>i:^=DZo*z:a< ^oB`Te#ͣ +~gp#kw nA[W| g>?š[O1!+WIJÈ[ ޹>@p5lZWƠu8xb9oUJW n2\5e&6<~xKF5 JI@x!q4rܶ 8a(Ũ]V:#tR[Xz"f YOtUSDE7-K&R& k F\^Ůū :&+b;=:;-&CI(]±n)ҠͱcfƠcK!+BIk/(ƚEÈ ]oaf?^lj뗕B!;ͦP1/u@9ҵ|܆3exD[V'YqTl9?o~tlL)Í*;]o]f5EZXOG[w ؎-K\(Xoۋe. N,R *Dȝ-k6ܩcF~n,9|kwe,L+U&k07SW,b?:e<pb#w늘4.F$bYgq(wWΘYMkC Ip6>?StOTn{YR"(EpUgķGWjDKuı4-j+JEĉ^6 B!u R4⩿\4RAD]fzr߈~ }㈅[.[" zګ4xy1NM27:BnZ>-Y,()~?Gc浸8qV +s$?ߟ]BBY)/ZW WTbOv `#~/!;,)Guȅ!6 + :R*hջ"/r0(KG)ʧ QfJ w]knH$hN%, z ߻ewN75h3D{o ;7\[W\2S59xgJ4N%,f:E5PEö!7N>|qCS T?٢) ſ.-?8Q 8?h“Sb<<˦>|q=CuEJ!-g=:na!+f ;0&̔c@<^KL Zp mМw iDI%˭h.R[ET-ږ xt.R*_Q: .AT&GQWpVG x'.^?K[quVn:ܸRʥؼv0l^JPr&7IXD-hT9F}o$],F  NXnA\`@p͆9ĬL^T:hp:IDI`Uy!_W-DfVk9"1go]qVgą+{SB_K!^ӈSLfF 9=D1tJqq=bYZ) Z.JToq(! ٢-l|!jcJh#Q!@kU53Y0a X:a`wz0tctac8j9T  )Jj9r)TJ)**)򯿧QɑW!EQQՆ$іū/4KqVIn4f)~EY̯r{kGG ]}v0[7*IBi`Q{5 ::RtJ*0_tJU0T0}UsVɘ7b:/j6Q%+G+StiA[vtkGgf+_i5ͅ ?Dwx;zԍ-ׇaw./<^x<~ =p{}p|p{|pypO=뱉PRlfczqcVi:R lؼY1$_>1oQPJ_$B.EQt  2RTHիAQtF"D&Ȉߏ~W.<^.^?./^./|^?^8py|p {aÍan6r^o`D/@bja:fflj6s:jw'a Ij9L)(ME^ze҈EL*9K5\n/?Cp{p ݰ;ZtppcB9nW|"^|e>+B?UtPJ1Vz4ښX&`VY:MܩbJ\) B.B>uw/cra ;%c kaŨWskv/:]xNl7#9g'[:w}3%qv : ;z*9u/:r/Pɟ e}Pn@Fd. $>jA}gr1vnjT ب\T[/_iCOqu}ͫgL~|`ǝ=9<OX7&.Ċ&,_2SZ"Լzd.GǺF%&GA`-,TIMrCH%&j3J21,EP§2pS^;qcM4qi/ _G!tnsMya3/EDa# J"#UT Yi(]Ƅ4}t<zcCS/5Bȿ67l|;Jw&6 QVʐAAT Ҍ*ЩkikkP+e1 8:6 }V 6lC.X0hƀʼn^D8TXSC)yI%tj9tZE )jP&h5r(d(Rhէ-AC.@%B4@;P"!q 7( _|8=pg6p Ɛ ǰN'dpa Uyd6O'x}@6 :S,J)$RAZ5r NpT*Z^6nƧ^F9]>/Xc'jI$"=hr xR.K'\q6(Ch1q# k:X7OYHq\dP铓y¤VmQ^8nr /f.cIk8; I璐UjJ\8GZX4'V(܏!=8}$煔2T@K(8.Q4SCJXG@ %9{p.E!p~IPq\"S)ܿ !'ރw)(?qɋ|;!.y % 8F)տ a1oE},FK*#7C'6# :ҍjJu 00h0P+Pgv>+"Ű ?P]6ƐӅa/NNtoGO}CE#Binw N&ʠS?~|)2g5 ~o~o^&dkQGAYdiEQ4 -wpe8܏dN*H4 $)WPNx$5n^W~g{\:d둟S)ۀLݨ%sO)Zd/}ځ$;$IX,/Ro_VO1>l/|ǚcF<#JRQgDaYfh!ä4YVi}ڞO33=eJRdڼn{ˊ =gx(^? qQP禠 %)LհM4^ #v yJ襭 ;/hvSMՑ.h{y':a_V}FcezE9r2tz«:,RYz$?%(-HA~F=vv[mA[ =CgiR10 SLibJEQRi7熣<ڰH3⯶ {3>1H{G_v'LJeQk)nFa)r{1mfh5c͝tؘMb,OrHm9}o8;F qul,±~|ҏ|<mfѽr)ҍjdiCNZdju/Nd Nqm[kxΟ ˰4?|0?,"x=5;}r v6֯(V=P굡]vtkXJJVZV VFi)jH ݨԋ+K.hn~4NՏڂ p_41rsQUQ Vvv9U)PB!b|T--ŊނN4>?Eg'3NZNb'5^?͘PO᫖e .ymotFQ/Z__ﱸVeT,%s`zv\S mȍ+ڻm8>fw>3^mqy H%ax}=NHAPҰh^$&IzϿSBoŵ"Ab,bJP$x>t sMh鰠sMQ`䢠̔-Œy}컟{u7v%& @Q, :L-LE)SMi(-HANrCNzkvφ>;:{l賢ǎ>ߑK0+b(Ko?% Гrt~mQn~9^CJA4-4N"']T :ZZZZlpcx}vzw\]:\ݰڇaraDw߼떜T o1c<^VH`y }+'KLǕ jD(9JyP œUx𶕣 %r`G]O:vo$jx~=]^8=p{|\;-_8Sa~G8Yg.F^ƀc;SU} | u3Ǎ`㪩شz$+^ TXҽ_Edf 8.(L->2õDž_tk"$w=V8n\*lgx}vrkv @8ġKfT#ͨD^ N ZRRJZZJvfmZ%XƇSg;هiAs z͎L$X|LaMZ 4 LNT jdg萓95Mt5R JdhblCN;qՌu㯺qɁn|r`K,`T;2407Ct-sq}GǺ{MxpSnEa'#`@%=U#ˠS{0?Sl= 2$zͱ=^4u~h\IܰaVI:,c T@VyyFeꑗC^&~#?ؕ~ Rtnu({,M" ` Xiԣ4?)#/K|Rx]؟pK$KoeiJXPaoV-GAYzPGal(pV 'V'zC0[w=rx`s04cxMȆD"@CC ֨d(M”gDqF2^o֑|e|@&GW@/4W7)j,_'lL9L?3;kGWݧ矮Tkv`dZUU4?sda,̝5$'ӿ"U-/8:s2a@Aui8FD\&xStJdiCAl=O%4ux+Zhﶢۊ^] fea2\r 4O{bݘ ږϰ b,MPX]%xu"r\2t>|~-hDG=&1HRtJu*fT#']4 2ϪӥIzÍ-@b겢 :Q+el xqo~9@)pWd:a~;(Yq+wTׇA', چ1hƠ}f'Xtz(2JLBJ\ R ZT ):%R*f赡s';a=Uy.ìqyf˃Knݖ#5L@biʅ`jw o9b $n|7qejr\j V ?:^;& JES~qܳ5È ǰ]h벡km6vMSs;ѽ-v7 Tng9x̶|av5nk.+E9?hi~fOD|[_6֡T Ǭ hoЁ~;hﶠTRj붢g`uxO,܁_ @IaG(N֑ %)Yr (1";C.,N X0[oqwqj:z;4s#P[/-0aƒ@z%4 )zUkjKjRAð ېn.N]>m800zqGo-/.0B L@Էa9ND(N$TW`, eBy(r`4NVBM5Wq,|8qqBonnց+!UZJ9^F^ڰ ցDB$, P|/:l`Ký?  +f* ,ֱp\aˬCOXao?K@DcV/Vn k4)$B%'qEFW&Cu6Ss:ֱp\䮖u t ) ֱp\Ͷ^KƆAKAS`5(Po{XBRΖ_Xqchݒ(KlBi;ߵ !pqRȥɞvJBɓk9q8}nd𱛳X72kC `9c \]q 0\5]|~I,f <((Y"F1-%Ar%똸fw[ݝsIDAT۬^`Ċ& vw@ @{zqe{FxšGSH)zֱp$^(a )p:xVzӝׂ'.nbZA.T\G<:DVeT>U[Ap/Lh>:V<{.;p OXRW'oW:M>:DV ]l' m9󯬃ItCU3Hc~O?h~y笃I,wI3s7}ﯖSEmRWOoz17?嗾dHg` c0p=Ǡa9 T;*0u#}߷#N2-ĹB\0srPS:0" i!EVa[m c+c1 Q0J0F f(!{v7Sa4gƇ7t _agnmC׍5 3a`1 Q0J0F f( b%A 3a`1 Q0J0F f( b%A 3a`1 Q0J0F f( b%A 3a`1 Q0J0F f(a4L C`lv%$rΛQ6Ite]8AMA* \lGAzZ\tTa54KgLA!x 2Kqxζykz,z "kJNspdp,z NnGbU4ԉ{O=| l ) ]|w#ڝLu["*]X8!UZ2 ]A2[a5!'jD3md yݓ=Hy.ȴ]K$*[ D M?~Jnݵ9x:)D)3f4]|ѩ>NP+.eZ/, pi FNlHJXdck01?kGB$[ACd[@6n Zr%C~ W7ZCE[EP ҅ަmS0X,^3YFZ@0(/h=V$E*9Qi'k ps\BiΆyoC#;Rr!)Y܏ mǁ"nDOŷ ^3dzתo~0QW0Uź2V!~#(Pe Lz FۣNyUp :4 =ُIyoi]/@} \=ք6.*m0ä́y-0JhOk{ |p l+'ci::c V\q*d_,(^4\GE/ąܥ*~G3nu6#ˑݤz=UЛgKaފ& S9V?2[-&A?TLyg5#^C[ >u n *B.nIDi$cT'>3=֣LMB x`JAPZ+"'GN\ =pwM>2_% =zpp<ٟiZk\Nw@*9Cf\\t{_'L^͒xCF$?T}YW4_1¶--YI[G|?.#Re 늬Ľ9o[՞ɂHK@4 )F") O"7k#>ykMqQ|EPe}%"'0hqE%O!.-po۰9܏'!%w";FnN>Vx$ފ%uug;,EzxY% ?V ,p7Mr ÓX@L)vk'#7W{&NDzixwo I}j+)!M5\PF>?R 3O!B䠳U$i1)Park*DCnUZi8j44DVj} 4TϮX=ۓ&M5^o'| B#7w\pAD9"._= 'h*]sU¯[m" AU7u> iCi8& ldEG#ۘ{\{i2ً7Q еHw!k<4DZțb׽lR#[F]{x1ݳMNQ k]qYIdwH i%qostG}cě 'JJy+u4_As h_D#DO.Jlt 2Р 3ȴ)2*(N7(0.p d_s%!{jGCg 2P4#C 9LCM~sf8i;ֆON#\hȒJh[ȿҹb!GuBF!/n pv6WG&vEwmkyܮ¡a\W}:ʁ ><l>Hlj7qZ:^!ai)f5ךskMk(bTI "ߨA0u^#dF; aY87]Xbs)J)kM,!NՈo; ~ldV)Wړ[x1$v#RWHTw]rTeG"ZHS)o" qeaU 4{ kA.T_]X\z l(V?wM#RA=LϦ+ AY}i"yC=mSOJЛKXVR"󢾇:2\NJZtiBZZq@@3)ԕW2 - /א(V bJLBЩ7LS*4*=_76fHnFdfF[=q~UCtmj4t|t:L t*y#wᾶ1i/Krꮶ,eOcu -F{pدp_ٽ5H|+5Ve.^C&C)̋Si} ȝh6:g)<<ك.O\ߋCTzKA|+/>u!<0Wh?؞YrD =>/5\E|שּmĻ](P9ʊ'x`io~NkY|-*EK;&ixqk[GП#/m0=g x*S^MCfeɨkep7\"$mq[=*cȅlsUp.jY ԫ>OIPOɏfEDʹ>B.K`?ozQf!&Α O'=.k1UIbsB. 16Y2Aď^&KF h56V[$EzeZe!.uR$]ERl AXI #ý yڝJ Oe 91SR{xYڷq0Q<5IRr?K0}a~,b.$D{k^xZVGw[k:5cF0F f( b%A 3a`1 Q0J0F f( b%A 3a`1 Q0J0F f( b%A 3a`1 Q0J0F f( b%A 3a %Sh63&2Q6ș 0(X0J0F f( b%A 3aN0-iEyÝVa[uZal1_?q>;0u\p9}%Xou 96;'ۀ)F&Do8ԗ98IENDB`tcell-1.3.0/logos/tidelift.png000066400000000000000000000044351354173511300162640ustar00rootroot00000000000000PNG  IHDR*s IDATxm8єTK}1\\Jp :U+"L;]",FT^ax?k5Q1Y\Z3~7QcyTt@P]u>%k*}C:@ T:\}1PtyvbtTR`gP*l*ߦ*V5oJQ[g @m 7I, JQ;Lh *hBT ?/MJ@%P T@*J@%P T*J2!*J@%P T* T@%P T*ʄ* T@T \TToJߔJkIq1v<)S T ?XoP@*j2iTiba*P)Ry>\OdI2K@~s:'kv@&Pǵ|tWKYb4TwtJ T@* T*P T*P T@*P TA@*P T@*P T@*P T@%P T@* T@* T*P T*P T@*P T@*P T@*P T@*P T@*P T2A*P T@*P T@*P T@*P T~lh63JkXp@*P9Tm؂ TjX T.c s>;@¡~xLWA"*Pb2Ri8@V|`]<*PGrޏU *P)?TRP%}V[O vAu4#@Peu7J: S# d?V'PJAeQ&RE-_G=TUԷpf|mUPʣ<*PQ,a T- A*P9 SP | goPh) @U,T{͵܃ TA(LyGo@r&[T*ָsm[P4ܣ7=@UTYP*WԱo#*I$J$ T*IR6Nɵ4΁>9}&O Tzҏ gfP:& PRQDjHf Td?9@5n T*/NP\SP<~nPM-TPM1P TC55/R7 5C;TsTу QbGo@؏w,<*> *Go@Ga@ f?\2T}+PiEE\Ts{sTz^\ TCCғ€PiE}~TPy{(0rT TހJ=yaG[J7T nUP9 'P9z*-vTހJw?z\PPiѣ0rTi/6rT*uecOnN{dM.B"o;91F Ye}3AUþ!Zn3m?-ӿsJ(P9 ݏcט{1mnC&IENDB`tcell-1.3.0/mouse.go000066400000000000000000000072021354173511300143010ustar00rootroot00000000000000// Copyright 2015 The TCell Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use file except in compliance with the License. // You may obtain a copy of the license at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package tcell import ( "time" ) // EventMouse is a mouse event. It is sent on either mouse up or mouse down // events. It is also sent on mouse motion events - if the terminal supports // it. We make every effort to ensure that mouse release events are delivered. // Hence, click drag can be identified by a motion event with the mouse down, // without any intervening button release. On some terminals only the initiating // press and terminating release event will be delivered. // // Mouse wheel events, when reported, may appear on their own as individual // impulses; that is, there will normally not be a release event delivered // for mouse wheel movements. // // Most terminals cannot report the state of more than one button at a time -- // and some cannot report motion events unless a button is pressed. // // Applications can inspect the time between events to resolve double or // triple clicks. type EventMouse struct { t time.Time btn ButtonMask mod ModMask x int y int } // When returns the time when this EventMouse was created. func (ev *EventMouse) When() time.Time { return ev.t } // Buttons returns the list of buttons that were pressed or wheel motions. func (ev *EventMouse) Buttons() ButtonMask { return ev.btn } // Modifiers returns a list of keyboard modifiers that were pressed // with the mouse button(s). func (ev *EventMouse) Modifiers() ModMask { return ev.mod } // Position returns the mouse position in character cells. The origin // 0, 0 is at the upper left corner. func (ev *EventMouse) Position() (int, int) { return ev.x, ev.y } // NewEventMouse is used to create a new mouse event. Applications // shouldn't need to use this; its mostly for screen implementors. func NewEventMouse(x, y int, btn ButtonMask, mod ModMask) *EventMouse { return &EventMouse{t: time.Now(), x: x, y: y, btn: btn, mod: mod} } // ButtonMask is a mask of mouse buttons and wheel events. Mouse button presses // are normally delivered as both press and release events. Mouse wheel events // are normally just single impulse events. Windows supports up to eight // separate buttons plus all four wheel directions, but XTerm can only support // mouse buttons 1-3 and wheel up/down. Its not unheard of for terminals // to support only one or two buttons (think Macs). Old terminals, and true // emulations (such as vt100) won't support mice at all, of course. type ButtonMask int16 // These are the actual button values. const ( Button1 ButtonMask = 1 << iota // Usually left mouse button. Button2 // Usually the middle mouse button. Button3 // Usually the right mouse button. Button4 // Often a side button (thumb/next). Button5 // Often a side button (thumb/prev). Button6 Button7 Button8 WheelUp // Wheel motion up/away from user. WheelDown // Wheel motion down/towards user. WheelLeft // Wheel motion to left. WheelRight // Wheel motion to right. ButtonNone ButtonMask = 0 // No button or wheel events. ) tcell-1.3.0/resize.go000066400000000000000000000022701354173511300144520ustar00rootroot00000000000000// Copyright 2015 The TCell Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use file except in compliance with the License. // You may obtain a copy of the license at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package tcell import ( "time" ) // EventResize is sent when the window size changes. type EventResize struct { t time.Time w int h int } // NewEventResize creates an EventResize with the new updated window size, // which is given in character cells. func NewEventResize(width, height int) *EventResize { return &EventResize{t: time.Now(), w: width, h: height} } // When returns the time when the Event was created. func (ev *EventResize) When() time.Time { return ev.t } // Size returns the new window size as width, height in character cells. func (ev *EventResize) Size() (int, int) { return ev.w, ev.h } tcell-1.3.0/runes.go000066400000000000000000000065001354173511300143050ustar00rootroot00000000000000// Copyright 2015 The TCell Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use file except in compliance with the License. // You may obtain a copy of the license at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package tcell // The names of these constants are chosen to match Terminfo names, // modulo case, and changing the prefix from ACS_ to Rune. These are // the runes we provide extra special handling for, with ASCII fallbacks // for terminals that lack them. const ( RuneSterling = '£' RuneDArrow = '↓' RuneLArrow = '←' RuneRArrow = '→' RuneUArrow = '↑' RuneBullet = '·' RuneBoard = '░' RuneCkBoard = '▒' RuneDegree = '°' RuneDiamond = '◆' RuneGEqual = '≥' RunePi = 'π' RuneHLine = '─' RuneLantern = '§' RunePlus = '┼' RuneLEqual = '≤' RuneLLCorner = '└' RuneLRCorner = '┘' RuneNEqual = '≠' RunePlMinus = '±' RuneS1 = '⎺' RuneS3 = '⎻' RuneS7 = '⎼' RuneS9 = '⎽' RuneBlock = '█' RuneTTee = '┬' RuneRTee = '┤' RuneLTee = '├' RuneBTee = '┴' RuneULCorner = '┌' RuneURCorner = '┐' RuneVLine = '│' ) // RuneFallbacks is the default map of fallback strings that will be // used to replace a rune when no other more appropriate transformation // is available, and the rune cannot be displayed directly. // // New entries may be added to this map over time, as it becomes clear // that such is desirable. Characters that represent either letters or // numbers should not be added to this list unless it is certain that // the meaning will still convey unambiguously. // // As an example, it would be appropriate to add an ASCII mapping for // the full width form of the letter 'A', but it would not be appropriate // to do so a glyph representing the country China. // // Programs that desire richer fallbacks may register additional ones, // or change or even remove these mappings with Screen.RegisterRuneFallback // Screen.UnregisterRuneFallback methods. // // Note that Unicode is presumed to be able to display all glyphs. // This is a pretty poor assumption, but there is no easy way to // figure out which glyphs are supported in a given font. Hence, // some care in selecting the characters you support in your application // is still appropriate. var RuneFallbacks = map[rune]string{ RuneSterling: "f", RuneDArrow: "v", RuneLArrow: "<", RuneRArrow: ">", RuneUArrow: "^", RuneBullet: "o", RuneBoard: "#", RuneCkBoard: ":", RuneDegree: "\\", RuneDiamond: "+", RuneGEqual: ">", RunePi: "*", RuneHLine: "-", RuneLantern: "#", RunePlus: "+", RuneLEqual: "<", RuneLLCorner: "+", RuneLRCorner: "+", RuneNEqual: "!", RunePlMinus: "#", RuneS1: "~", RuneS3: "-", RuneS7: "-", RuneS9: "_", RuneBlock: "#", RuneTTee: "+", RuneRTee: "+", RuneLTee: "+", RuneBTee: "+", RuneULCorner: "+", RuneURCorner: "+", RuneVLine: "|", } tcell-1.3.0/runes_test.go000066400000000000000000000052101354173511300153410ustar00rootroot00000000000000// Copyright 2018 The TCell Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use file except in compliance with the License. // You may obtain a copy of the license at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package tcell import ( "testing" ) func TestCanDisplayUTF8(t *testing.T) { s := mkTestScreen(t, "UTF-8") defer s.Fini() if s.CharacterSet() != "UTF-8" { t.Errorf("Bad charset: %v", s.CharacterSet()) } if !s.CanDisplay('a', true) { t.Errorf("Should be able to display 'a'") } if !s.CanDisplay(RuneHLine, true) { t.Errorf("Should be able to display hline (with fallback)") } if !s.CanDisplay(RuneHLine, false) { t.Errorf("Should be able to display hline (no fallback)") } if !s.CanDisplay('⌀', false) { t.Errorf("Should be able to display null") } } func TestCanDisplayASCII(t *testing.T) { s := mkTestScreen(t, "US-ASCII") defer s.Fini() if s.CharacterSet() != "US-ASCII" { t.Errorf("Wrong character set: %v", s.CharacterSet()) } if !s.CanDisplay('a', true) { t.Errorf("Should be able to display 'a'") } if !s.CanDisplay(RuneHLine, true) { t.Errorf("Should be able to display hline (with fallback)") } if s.CanDisplay(RunePi, false) { t.Errorf("Should not be able to display Pi (no fallback)") } if s.CanDisplay('⌀', false) { t.Errorf("Should not be able to display null") } } func TestRuneFallbacks(t *testing.T) { s := mkTestScreen(t, "US-ASCII") defer s.Fini() if s.CharacterSet() != "US-ASCII" { t.Errorf("Wrong character set: %v", s.CharacterSet()) } // Test registering a fallback s.RegisterRuneFallback('⌀', "o") if s.CanDisplay('⌀', false) { t.Errorf("Should not be able to display null (no fallback)") } if !s.CanDisplay('⌀', true) { t.Errorf("Should be able to display null (with fallback)") } // Test unregistering custom fallback s.UnregisterRuneFallback('⌀') if s.CanDisplay('⌀', false) { t.Errorf("Should not be able to display null (no fallback)") } if s.CanDisplay('⌀', true) { t.Errorf("Should not be able to display null (with fallback)") } // Test unregistering builtin fallback if !s.CanDisplay(RuneHLine, true) { t.Errorf("Should be able to display hline") } s.UnregisterRuneFallback(RuneHLine) if s.CanDisplay(RuneHLine, true) { t.Errorf("Should not be able to display hline") } } tcell-1.3.0/screen.go000066400000000000000000000211741354173511300144340ustar00rootroot00000000000000// Copyright 2019 The TCell Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use file except in compliance with the License. // You may obtain a copy of the license at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package tcell // Screen represents the physical (or emulated) screen. // This can be a terminal window or a physical console. Platforms implement // this differerently. type Screen interface { // Init initializes the screen for use. Init() error // Fini finalizes the screen also releasing resources. Fini() // Clear erases the screen. The contents of any screen buffers // will also be cleared. This has the logical effect of // filling the screen with spaces, using the global default style. Clear() // Fill fills the screen with the given character and style. Fill(rune, Style) // SetCell is an older API, and will be removed. Please use // SetContent instead; SetCell is implemented in terms of SetContent. SetCell(x int, y int, style Style, ch ...rune) // GetContent returns the contents at the given location. If the // coordinates are out of range, then the values will be 0, nil, // StyleDefault. Note that the contents returned are logical contents // and may not actually be what is displayed, but rather are what will // be displayed if Show() or Sync() is called. The width is the width // in screen cells; most often this will be 1, but some East Asian // characters require two cells. GetContent(x, y int) (mainc rune, combc []rune, style Style, width int) // SetContent sets the contents of the given cell location. If // the coordinates are out of range, then the operation is ignored. // // The first rune is the primary non-zero width rune. The array // that follows is a possible list of combining characters to append, // and will usually be nil (no combining characters.) // // The results are not displayd until Show() or Sync() is called. // // Note that wide (East Asian full width) runes occupy two cells, // and attempts to place character at next cell to the right will have // undefined effects. Wide runes that are printed in the // last column will be replaced with a single width space on output. SetContent(x int, y int, mainc rune, combc []rune, style Style) // SetStyle sets the default style to use when clearing the screen // or when StyleDefault is specified. If it is also StyleDefault, // then whatever system/terminal default is relevant will be used. SetStyle(style Style) // ShowCursor is used to display the cursor at a given location. // If the coordinates -1, -1 are given or are otherwise outside the // dimensions of the screen, the cursor will be hidden. ShowCursor(x int, y int) // HideCursor is used to hide the cursor. Its an alias for // ShowCursor(-1, -1). HideCursor() // Size returns the screen size as width, height. This changes in // response to a call to Clear or Flush. Size() (int, int) // PollEvent waits for events to arrive. Main application loops // must spin on this to prevent the application from stalling. // Furthermore, this will return nil if the Screen is finalized. PollEvent() Event // PostEvent tries to post an event into the event stream. This // can fail if the event queue is full. In that case, the event // is dropped, and ErrEventQFull is returned. PostEvent(ev Event) error // PostEventWait is like PostEvent, but if the queue is full, it // blocks until there is space in the queue, making delivery // reliable. However, it is VERY important that this function // never be called from within whatever event loop is polling // with PollEvent(), otherwise a deadlock may arise. // // For this reason, when using this function, the use of a // Goroutine is recommended to ensure no deadlock can occur. PostEventWait(ev Event) // EnableMouse enables the mouse. (If your terminal supports it.) EnableMouse() // DisableMouse disables the mouse. DisableMouse() // HasMouse returns true if the terminal (apparently) supports a // mouse. Note that the a return value of true doesn't guarantee that // a mouse/pointing device is present; a false return definitely // indicates no mouse support is available. HasMouse() bool // Colors returns the number of colors. All colors are assumed to // use the ANSI color map. If a terminal is monochrome, it will // return 0. Colors() int // Show makes all the content changes made using SetContent() visible // on the display. // // It does so in the most efficient and least visually disruptive // manner possible. Show() // Sync works like Show(), but it updates every visible cell on the // physical display, assuming that it is not synchronized with any // internal model. This may be both expensive and visually jarring, // so it should only be used when believed to actually be necessary. // // Typically this is called as a result of a user-requested redraw // (e.g. to clear up on screen corruption caused by some other program), // or during a resize event. Sync() // CharacterSet returns information about the character set. // This isn't the full locale, but it does give us the input/output // character set. Note that this is just for diagnostic purposes, // we normally translate input/output to/from UTF-8, regardless of // what the user's environment is. CharacterSet() string // RegisterRuneFallback adds a fallback for runes that are not // part of the character set -- for example one coudld register // o as a fallback for ø. This should be done cautiously for // characters that might be displayed ordinarily in language // specific text -- characters that could change the meaning of // of written text would be dangerous. The intention here is to // facilitate fallback characters in pseudo-graphical applications. // // If the terminal has fallbacks already in place via an alternate // character set, those are used in preference. Also, standard // fallbacks for graphical characters in the ACSC terminfo string // are registered implicitly. // The display string should be the same width as original rune. // This makes it possible to register two character replacements // for full width East Asian characters, for example. // // It is recommended that replacement strings consist only of // 7-bit ASCII, since other characters may not display everywhere. RegisterRuneFallback(r rune, subst string) // UnregisterRuneFallback unmaps a replacement. It will unmap // the implicit ASCII replacements for alternate characters as well. // When an unmapped char needs to be displayed, but no suitable // glyph is available, '?' is emitted instead. It is not possible // to "disable" the use of alternate characters that are supported // by your terminal except by changing the terminal database. UnregisterRuneFallback(r rune) // CanDisplay returns true if the given rune can be displayed on // this screen. Note that this is a best guess effort -- whether // your fonts support the character or not may be questionable. // Mostly this is for folks who work outside of Unicode. // // If checkFallbacks is true, then if any (possibly imperfect) // fallbacks are registered, this will return true. This will // also return true if the terminal can replace the glyph with // one that is visually indistinguishable from the one requested. CanDisplay(r rune, checkFallbacks bool) bool // Resize does nothing, since its generally not possible to // ask a screen to resize, but it allows the Screen to implement // the View interface. Resize(int, int, int, int) // HasKey returns true if the keyboard is believed to have the // key. In some cases a keyboard may have keys with this name // but no support for them, while in others a key may be reported // as supported but not actually be usable (such as some emulators // that hijack certain keys). Its best not to depend to strictly // on this function, but it can be used for hinting when building // menus, displayed hot-keys, etc. Note that KeyRune (literal // runes) is always true. HasKey(Key) bool } // NewScreen returns a default Screen suitable for the user's terminal // environment. func NewScreen() (Screen, error) { // Windows is happier if we try for a console screen first. if s, _ := NewConsoleScreen(); s != nil { return s, nil } else if s, e := NewTerminfoScreen(); s != nil { return s, nil } else { return nil, e } } tcell-1.3.0/sim_test.go000066400000000000000000000056341354173511300150070ustar00rootroot00000000000000// Copyright 2018 The TCell Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use file except in compliance with the License. // You may obtain a copy of the license at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package tcell import ( "testing" ) func mkTestScreen(t *testing.T, charset string) SimulationScreen { s := NewSimulationScreen(charset) if s == nil { t.Fatalf("Failed to get simulation screen") } if e := s.Init(); e != nil { t.Fatalf("Failed to initialize screen: %v", e) } return s } func TestInitScreen(t *testing.T) { s := mkTestScreen(t, "") defer s.Fini() if x, y := s.Size(); x != 80 || y != 25 { t.Fatalf("Size should be 80, 25, was %v, %v", x, y) } if s.CharacterSet() != "UTF-8" { t.Fatalf("Character Set (%v) not UTF-8", s.CharacterSet()) } if b, x, y := s.GetContents(); len(b) != x*y || x != 80 || y != 25 { t.Fatalf("Contents (%v, %v, %v) wrong", len(b), x, y) } } func TestClearScreen(t *testing.T) { s := mkTestScreen(t, "") defer s.Fini() s.Clear() b, x, y := s.GetContents() if len(b) != x*y || x != 80 || y != 25 { t.Fatalf("Contents (%v, %v, %v) wrong", len(b), x, y) } for i := 0; i < x*y; i++ { if len(b[i].Runes) == 1 && b[i].Runes[0] != ' ' { t.Errorf("Incorrect contents at %v: %v", i, b[i].Runes) } if b[i].Style != StyleDefault { t.Errorf("Incorrect style at %v: %v", i, b[i].Style) } } } func TestSetCell(t *testing.T) { st := StyleDefault.Background(ColorRed).Blink(true) s := mkTestScreen(t, "") defer s.Fini() s.SetCell(2, 5, st, '@') b, _, _ := s.GetContents() s.Show() if len(b) != 80*25 { t.Fatalf("Wrong content size") } cell := &b[5*80+2] if len(cell.Runes) != 1 || len(cell.Bytes) != 1 || cell.Runes[0] != '@' || cell.Bytes[0] != '@' || cell.Style != st { t.Errorf("Incorrect cell content: %v", cell) } } func TestResize(t *testing.T) { st := StyleDefault.Background(ColorYellow).Underline(true) s := mkTestScreen(t, "") defer s.Fini() s.SetCell(2, 5, st, '&') b, x, y := s.GetContents() s.Show() cell := &b[5*80+2] if len(cell.Runes) != 1 || len(cell.Bytes) != 1 || cell.Runes[0] != '&' || cell.Bytes[0] != '&' || cell.Style != st { t.Errorf("Incorrect cell content: %v", cell) } s.SetSize(30, 10) s.Show() b2, x2, y2 := s.GetContents() if len(b2) == len(b) || x2 == x || y2 == y { t.Errorf("Screen parameters should not match") } cell2 := &b[5*80+2] if len(cell2.Runes) != 1 || len(cell2.Bytes) != 1 || cell2.Runes[0] != '&' || cell2.Bytes[0] != '&' || cell2.Style != st { t.Errorf("Incorrect cell content after resize: %v", cell2) } } tcell-1.3.0/simulation.go000066400000000000000000000245741354173511300153500ustar00rootroot00000000000000// Copyright 2016 The TCell Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use file except in compliance with the License. // You may obtain a copy of the license at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package tcell import ( "sync" "unicode/utf8" "golang.org/x/text/transform" ) // NewSimulationScreen returns a SimulationScreen. Note that // SimulationScreen is also a Screen. func NewSimulationScreen(charset string) SimulationScreen { if charset == "" { charset = "UTF-8" } s := &simscreen{charset: charset} return s } // SimulationScreen represents a screen simulation. This is intended to // be a superset of normal Screens, but also adds some important interfaces // for testing. type SimulationScreen interface { // InjectKeyBytes injects a stream of bytes corresponding to // the native encoding (see charset). It turns true if the entire // set of bytes were processed and delivered as KeyEvents, false // if any bytes were not fully understood. Any bytes that are not // fully converted are discarded. InjectKeyBytes(buf []byte) bool // InjectKey injects a key event. The rune is a UTF-8 rune, post // any translation. InjectKey(key Key, r rune, mod ModMask) // InjectMouse injects a mouse event. InjectMouse(x, y int, buttons ButtonMask, mod ModMask) // SetSize resizes the underlying physical screen. It also causes // a resize event to be injected during the next Show() or Sync(). // A new physical contents array will be allocated (with data from // the old copied), so any prior value obtained with GetContents // won't be used anymore SetSize(width, height int) // GetContents returns screen contents as an array of // cells, along with the physical width & height. Note that the // physical contents will be used until the next time SetSize() // is called. GetContents() (cells []SimCell, width int, height int) // GetCursor returns the cursor details. GetCursor() (x int, y int, visible bool) Screen } // SimCell represents a simulated screen cell. The purpose of this // is to track on screen content. type SimCell struct { // Bytes is the actual character bytes. Normally this is // rune data, but it could be be data in another encoding system. Bytes []byte // Style is the style used to display the data. Style Style // Runes is the list of runes, unadulterated, in UTF-8. Runes []rune } type simscreen struct { physw int physh int fini bool style Style evch chan Event quit chan struct{} front []SimCell back CellBuffer clear bool cursorx int cursory int cursorvis bool mouse bool charset string encoder transform.Transformer decoder transform.Transformer fillchar rune fillstyle Style fallback map[rune]string sync.Mutex } func (s *simscreen) Init() error { s.evch = make(chan Event, 10) s.quit = make(chan struct{}) s.fillchar = 'X' s.fillstyle = StyleDefault s.mouse = false s.physw = 80 s.physh = 25 s.cursorx = -1 s.cursory = -1 s.style = StyleDefault if enc := GetEncoding(s.charset); enc != nil { s.encoder = enc.NewEncoder() s.decoder = enc.NewDecoder() } else { return ErrNoCharset } s.front = make([]SimCell, s.physw*s.physh) s.back.Resize(80, 25) // default fallbacks s.fallback = make(map[rune]string) for k, v := range RuneFallbacks { s.fallback[k] = v } return nil } func (s *simscreen) Fini() { s.Lock() s.fini = true s.back.Resize(0, 0) s.Unlock() if s.quit != nil { close(s.quit) } s.physw = 0 s.physh = 0 s.front = nil } func (s *simscreen) SetStyle(style Style) { s.Lock() s.style = style s.Unlock() } func (s *simscreen) Clear() { s.Fill(' ', s.style) } func (s *simscreen) Fill(r rune, style Style) { s.Lock() s.back.Fill(r, style) s.Unlock() } func (s *simscreen) SetCell(x, y int, style Style, ch ...rune) { if len(ch) > 0 { s.SetContent(x, y, ch[0], ch[1:], style) } else { s.SetContent(x, y, ' ', nil, style) } } func (s *simscreen) SetContent(x, y int, mainc rune, combc []rune, st Style) { s.Lock() s.back.SetContent(x, y, mainc, combc, st) s.Unlock() } func (s *simscreen) GetContent(x, y int) (rune, []rune, Style, int) { var mainc rune var combc []rune var style Style var width int s.Lock() mainc, combc, style, width = s.back.GetContent(x, y) s.Unlock() return mainc, combc, style, width } func (s *simscreen) drawCell(x, y int) int { mainc, combc, style, width := s.back.GetContent(x, y) if !s.back.Dirty(x, y) { return width } if x >= s.physw || y >= s.physh || x < 0 || y < 0 { return width } simc := &s.front[(y*s.physw)+x] if style == StyleDefault { style = s.style } simc.Style = style simc.Runes = append([]rune{mainc}, combc...) // now emit runes - taking care to not overrun width with a // wide character, and to ensure that we emit exactly one regular // character followed up by any residual combing characters simc.Bytes = nil if x > s.physw-width { simc.Runes = []rune{' '} simc.Bytes = []byte{' '} return width } lbuf := make([]byte, 12) ubuf := make([]byte, 12) nout := 0 for _, r := range simc.Runes { l := utf8.EncodeRune(ubuf, r) nout, _, _ = s.encoder.Transform(lbuf, ubuf[:l], true) if nout == 0 || lbuf[0] == '\x1a' { // skip combining if subst, ok := s.fallback[r]; ok { simc.Bytes = append(simc.Bytes, []byte(subst)...) } else if r >= ' ' && r <= '~' { simc.Bytes = append(simc.Bytes, byte(r)) } else if simc.Bytes == nil { simc.Bytes = append(simc.Bytes, '?') } } else { simc.Bytes = append(simc.Bytes, lbuf[:nout]...) } } s.back.SetDirty(x, y, false) return width } func (s *simscreen) ShowCursor(x, y int) { s.Lock() s.cursorx, s.cursory = x, y s.showCursor() s.Unlock() } func (s *simscreen) HideCursor() { s.ShowCursor(-1, -1) } func (s *simscreen) showCursor() { x, y := s.cursorx, s.cursory if x < 0 || y < 0 || x >= s.physw || y >= s.physh { s.cursorvis = false } else { s.cursorvis = true } } func (s *simscreen) hideCursor() { // does not update cursor position s.cursorvis = false } func (s *simscreen) Show() { s.Lock() s.resize() s.draw() s.Unlock() } func (s *simscreen) clearScreen() { // We emulate a hardware clear by filling with a specific pattern for i := range s.front { s.front[i].Style = s.fillstyle s.front[i].Runes = []rune{s.fillchar} s.front[i].Bytes = []byte{byte(s.fillchar)} } s.clear = false } func (s *simscreen) draw() { s.hideCursor() if s.clear { s.clearScreen() } w, h := s.back.Size() for y := 0; y < h; y++ { for x := 0; x < w; x++ { width := s.drawCell(x, y) x += width - 1 } } s.showCursor() } func (s *simscreen) EnableMouse() { s.mouse = true } func (s *simscreen) DisableMouse() { s.mouse = false } func (s *simscreen) Size() (int, int) { s.Lock() w, h := s.back.Size() s.Unlock() return w, h } func (s *simscreen) resize() { w, h := s.physw, s.physh ow, oh := s.back.Size() if w != ow || h != oh { s.back.Resize(w, h) ev := NewEventResize(w, h) s.PostEvent(ev) } } func (s *simscreen) Colors() int { return 256 } func (s *simscreen) PollEvent() Event { select { case <-s.quit: return nil case ev := <-s.evch: return ev } } func (s *simscreen) PostEventWait(ev Event) { s.evch <- ev } func (s *simscreen) PostEvent(ev Event) error { select { case s.evch <- ev: return nil default: return ErrEventQFull } } func (s *simscreen) InjectMouse(x, y int, buttons ButtonMask, mod ModMask) { ev := NewEventMouse(x, y, buttons, mod) s.PostEvent(ev) } func (s *simscreen) InjectKey(key Key, r rune, mod ModMask) { ev := NewEventKey(key, r, mod) s.PostEvent(ev) } func (s *simscreen) InjectKeyBytes(b []byte) bool { failed := false outer: for len(b) > 0 { if b[0] >= ' ' && b[0] <= 0x7F { // printable ASCII easy to deal with -- no encodings ev := NewEventKey(KeyRune, rune(b[0]), ModNone) s.PostEvent(ev) b = b[1:] continue } if b[0] < 0x80 { mod := ModNone // No encodings start with low numbered values if Key(b[0]) >= KeyCtrlA && Key(b[0]) <= KeyCtrlZ { mod = ModCtrl } ev := NewEventKey(Key(b[0]), 0, mod) s.PostEvent(ev) continue } utfb := make([]byte, len(b)*4) // worst case for l := 1; l < len(b); l++ { s.decoder.Reset() nout, nin, _ := s.decoder.Transform(utfb, b[:l], true) if nout != 0 { r, _ := utf8.DecodeRune(utfb[:nout]) if r != utf8.RuneError { ev := NewEventKey(KeyRune, r, ModNone) s.PostEvent(ev) } b = b[nin:] continue outer } } failed = true b = b[1:] continue } return !failed } func (s *simscreen) Sync() { s.Lock() s.clear = true s.resize() s.back.Invalidate() s.draw() s.Unlock() } func (s *simscreen) CharacterSet() string { return s.charset } func (s *simscreen) SetSize(w, h int) { s.Lock() newc := make([]SimCell, w*h) for row := 0; row < h && row < s.physh; row++ { for col := 0; col < w && col < s.physw; col++ { newc[(row*w)+col] = s.front[(row*s.physw)+col] } } s.cursorx, s.cursory = -1, -1 s.physw, s.physh = w, h s.front = newc s.back.Resize(w, h) s.Unlock() } func (s *simscreen) GetContents() ([]SimCell, int, int) { s.Lock() cells, w, h := s.front, s.physw, s.physh s.Unlock() return cells, w, h } func (s *simscreen) GetCursor() (int, int, bool) { s.Lock() x, y, vis := s.cursorx, s.cursory, s.cursorvis s.Unlock() return x, y, vis } func (s *simscreen) RegisterRuneFallback(r rune, subst string) { s.Lock() s.fallback[r] = subst s.Unlock() } func (s *simscreen) UnregisterRuneFallback(r rune) { s.Lock() delete(s.fallback, r) s.Unlock() } func (s *simscreen) CanDisplay(r rune, checkFallbacks bool) bool { if enc := s.encoder; enc != nil { nb := make([]byte, 6) ob := make([]byte, 6) num := utf8.EncodeRune(ob, r) enc.Reset() dst, _, err := enc.Transform(nb, ob[:num], true) if dst != 0 && err == nil && nb[0] != '\x1A' { return true } } if !checkFallbacks { return false } if _, ok := s.fallback[r]; ok { return true } return false } func (s *simscreen) HasMouse() bool { return false } func (s *simscreen) Resize(int, int, int, int) {} func (s *simscreen) HasKey(Key) bool { return true } tcell-1.3.0/style.go000066400000000000000000000076121354173511300143160ustar00rootroot00000000000000// Copyright 2015 The TCell Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use file except in compliance with the License. // You may obtain a copy of the license at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package tcell // Style represents a complete text style, including both foreground // and background color. We encode it in a 64-bit int for efficiency. // The coding is (MSB): <7b flags><1b><24b fgcolor><7b attr><1b><24b bgcolor>. // The <1b> is set true to indicate that the color is an RGB color, rather // than a named index. // // This gives 24bit color options, if it ever becomes truly necessary. // However, applications must not rely on this encoding. // // Note that not all terminals can display all colors or attributes, and // many might have specific incompatibilities between specific attributes // and color combinations. // // The intention is to extend styles to support paletting, in which case // some flag bit(s) would be set, and the foreground and background colors // would be replaced with a palette number and palette index. // // To use Style, just declare a variable of its type. type Style int64 // StyleDefault represents a default style, based upon the context. // It is the zero value. const StyleDefault Style = 0 // styleFlags -- used internally for now. const ( styleBgSet = 1 << (iota + 57) styleFgSet stylePalette ) // Foreground returns a new style based on s, with the foreground color set // as requested. ColorDefault can be used to select the global default. func (s Style) Foreground(c Color) Style { if c == ColorDefault { return (s &^ (0x1ffffff00000000 | styleFgSet)) } return (s &^ Style(0x1ffffff00000000)) | ((Style(c) & 0x1ffffff) << 32) | styleFgSet } // Background returns a new style based on s, with the background color set // as requested. ColorDefault can be used to select the global default. func (s Style) Background(c Color) Style { if c == ColorDefault { return (s &^ (0x1ffffff | styleBgSet)) } return (s &^ (0x1ffffff)) | (Style(c) & 0x1ffffff) | styleBgSet } // Decompose breaks a style up, returning the foreground, background, // and other attributes. func (s Style) Decompose() (fg Color, bg Color, attr AttrMask) { if s&styleFgSet != 0 { fg = Color(s>>32) & 0x1ffffff } else { fg = ColorDefault } if s&styleBgSet != 0 { bg = Color(s & 0x1ffffff) } else { bg = ColorDefault } attr = AttrMask(s) & attrAll return fg, bg, attr } func (s Style) setAttrs(attrs Style, on bool) Style { if on { return s | attrs } return s &^ attrs } // Normal returns the style with all attributes disabled. func (s Style) Normal() Style { return s &^ Style(attrAll) } // Bold returns a new style based on s, with the bold attribute set // as requested. func (s Style) Bold(on bool) Style { return s.setAttrs(Style(AttrBold), on) } // Blink returns a new style based on s, with the blink attribute set // as requested. func (s Style) Blink(on bool) Style { return s.setAttrs(Style(AttrBlink), on) } // Dim returns a new style based on s, with the dim attribute set // as requested. func (s Style) Dim(on bool) Style { return s.setAttrs(Style(AttrDim), on) } // Reverse returns a new style based on s, with the reverse attribute set // as requested. (Reverse usually changes the foreground and background // colors.) func (s Style) Reverse(on bool) Style { return s.setAttrs(Style(AttrReverse), on) } // Underline returns a new style based on s, with the underline attribute set // as requested. func (s Style) Underline(on bool) Style { return s.setAttrs(Style(AttrUnderline), on) } tcell-1.3.0/style_test.go000066400000000000000000000021431354173511300153470ustar00rootroot00000000000000// Copyright 2018 The TCell Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use file except in compliance with the License. // You may obtain a copy of the license at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package tcell import ( "testing" ) func TestStyle(t *testing.T) { s := mkTestScreen(t, "") defer s.Fini() style := StyleDefault fg, bg, attr := style.Decompose() if fg != ColorDefault || bg != ColorDefault || attr != AttrNone { t.Errorf("Bad default style (%v, %v, %v)", fg, bg, attr) } s2 := style. Background(ColorRed). Foreground(ColorBlue). Blink(true) fg, bg, attr = s2.Decompose() if fg != ColorBlue || bg != ColorRed || attr != AttrBlink { t.Errorf("Bad custom style (%v, %v, %v)", fg, bg, attr) } } tcell-1.3.0/termbox/000077500000000000000000000000001354173511300143015ustar00rootroot00000000000000tcell-1.3.0/termbox/compat.go000066400000000000000000000177571354173511300161340ustar00rootroot00000000000000// Copyright 2016 The TCell Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use file except in compliance with the License. // You may obtain a copy of the license at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Package termbox is a compatibility layer to allow tcells to emulate // the github.com/nsf/termbox package. package termbox import ( "errors" "github.com/gdamore/tcell" ) var screen tcell.Screen var outMode OutputMode // Init initializes the screen for use. func Init() error { outMode = OutputNormal if s, e := tcell.NewScreen(); e != nil { return e } else if e = s.Init(); e != nil { return e } else { screen = s return nil } } // Close cleans up the terminal, restoring terminal modes, etc. func Close() { screen.Fini() } // Flush updates the screen. func Flush() error { screen.Show() return nil } // SetCursor displays the terminal cursor at the given location. func SetCursor(x, y int) { screen.ShowCursor(x, y) } // HideCursor hides the terminal cursor. func HideCursor() { SetCursor(-1, -1) } // Size returns the screen size as width, height in character cells. func Size() (int, int) { return screen.Size() } // Attribute affects the presentation of characters, such as color, boldness, // and so forth. type Attribute uint16 // Colors first. The order here is significant. const ( ColorDefault Attribute = iota ColorBlack ColorRed ColorGreen ColorYellow ColorBlue ColorMagenta ColorCyan ColorWhite ) // Other attributes. const ( AttrBold Attribute = 1 << (9 + iota) AttrUnderline AttrReverse ) func fixColor(c tcell.Color) tcell.Color { if c == tcell.ColorDefault { return c } switch outMode { case OutputNormal: c %= tcell.Color(16) case Output256: c %= tcell.Color(256) case Output216: c %= tcell.Color(216) c += tcell.Color(16) case OutputGrayscale: c %= tcell.Color(24) c += tcell.Color(232) default: c = tcell.ColorDefault } return c } func mkStyle(fg, bg Attribute) tcell.Style { st := tcell.StyleDefault f := tcell.Color(int(fg)&0x1ff) - 1 b := tcell.Color(int(bg)&0x1ff) - 1 f = fixColor(f) b = fixColor(b) st = st.Foreground(f).Background(b) if (fg|bg)&AttrBold != 0 { st = st.Bold(true) } if (fg|bg)&AttrUnderline != 0 { st = st.Underline(true) } if (fg|bg)&AttrReverse != 0 { st = st.Reverse(true) } return st } // Clear clears the screen with the given attributes. func Clear(fg, bg Attribute) { st := mkStyle(fg, bg) w, h := screen.Size() for row := 0; row < h; row++ { for col := 0; col < w; col++ { screen.SetContent(col, row, ' ', nil, st) } } } // InputMode is not used. type InputMode int // Unused input modes; here for compatibility. const ( InputCurrent InputMode = iota InputEsc InputAlt InputMouse ) // SetInputMode does not do anything in this version. func SetInputMode(mode InputMode) InputMode { // We don't do anything else right now return InputEsc } // OutputMode represents an output mode, which determines how colors // are used. See the termbox documentation for an explanation. type OutputMode int // OutputMode values. const ( OutputCurrent OutputMode = iota OutputNormal Output256 Output216 OutputGrayscale ) // SetOutputMode is used to set the color palette used. func SetOutputMode(mode OutputMode) OutputMode { if screen.Colors() < 256 { mode = OutputNormal } switch mode { case OutputCurrent: return outMode case OutputNormal, Output256, Output216, OutputGrayscale: outMode = mode return mode default: return outMode } } // Sync forces a resync of the screen. func Sync() error { screen.Sync() return nil } // SetCell sets the character cell at a given location to the given // content (rune) and attributes. func SetCell(x, y int, ch rune, fg, bg Attribute) { st := mkStyle(fg, bg) screen.SetContent(x, y, ch, nil, st) } // EventType represents the type of event. type EventType uint8 // Modifier represents the possible modifier keys. type Modifier tcell.ModMask // Key is a key press. type Key tcell.Key // Event represents an event like a key press, mouse action, or window resize. type Event struct { Type EventType Mod Modifier Key Key Ch rune Width int Height int Err error MouseX int MouseY int N int } // Event types. const ( EventNone EventType = iota EventKey EventResize EventMouse EventInterrupt EventError EventRaw ) // Keys codes. const ( KeyF1 = Key(tcell.KeyF1) KeyF2 = Key(tcell.KeyF2) KeyF3 = Key(tcell.KeyF3) KeyF4 = Key(tcell.KeyF4) KeyF5 = Key(tcell.KeyF5) KeyF6 = Key(tcell.KeyF6) KeyF7 = Key(tcell.KeyF7) KeyF8 = Key(tcell.KeyF8) KeyF9 = Key(tcell.KeyF9) KeyF10 = Key(tcell.KeyF10) KeyF11 = Key(tcell.KeyF11) KeyF12 = Key(tcell.KeyF12) KeyInsert = Key(tcell.KeyInsert) KeyDelete = Key(tcell.KeyDelete) KeyHome = Key(tcell.KeyHome) KeyEnd = Key(tcell.KeyEnd) KeyArrowUp = Key(tcell.KeyUp) KeyArrowDown = Key(tcell.KeyDown) KeyArrowRight = Key(tcell.KeyRight) KeyArrowLeft = Key(tcell.KeyLeft) KeyCtrlA = Key(tcell.KeyCtrlA) KeyCtrlB = Key(tcell.KeyCtrlB) KeyCtrlC = Key(tcell.KeyCtrlC) KeyCtrlD = Key(tcell.KeyCtrlD) KeyCtrlE = Key(tcell.KeyCtrlE) KeyCtrlF = Key(tcell.KeyCtrlF) KeyCtrlG = Key(tcell.KeyCtrlG) KeyCtrlH = Key(tcell.KeyCtrlH) KeyCtrlI = Key(tcell.KeyCtrlI) KeyCtrlJ = Key(tcell.KeyCtrlJ) KeyCtrlK = Key(tcell.KeyCtrlK) KeyCtrlL = Key(tcell.KeyCtrlL) KeyCtrlM = Key(tcell.KeyCtrlM) KeyCtrlN = Key(tcell.KeyCtrlN) KeyCtrlO = Key(tcell.KeyCtrlO) KeyCtrlP = Key(tcell.KeyCtrlP) KeyCtrlQ = Key(tcell.KeyCtrlQ) KeyCtrlR = Key(tcell.KeyCtrlR) KeyCtrlS = Key(tcell.KeyCtrlS) KeyCtrlT = Key(tcell.KeyCtrlT) KeyCtrlU = Key(tcell.KeyCtrlU) KeyCtrlV = Key(tcell.KeyCtrlV) KeyCtrlW = Key(tcell.KeyCtrlW) KeyCtrlX = Key(tcell.KeyCtrlX) KeyCtrlY = Key(tcell.KeyCtrlY) KeyCtrlZ = Key(tcell.KeyCtrlZ) KeyBackspace = Key(tcell.KeyBackspace) KeyBackspace2 = Key(tcell.KeyBackspace2) KeyTab = Key(tcell.KeyTab) KeyEnter = Key(tcell.KeyEnter) KeyEsc = Key(tcell.KeyEscape) KeyPgdn = Key(tcell.KeyPgDn) KeyPgup = Key(tcell.KeyPgUp) MouseLeft = Key(tcell.KeyF63) // arbitrary assignments MouseRight = Key(tcell.KeyF62) MouseMiddle = Key(tcell.KeyF61) KeySpace = Key(tcell.Key(' ')) ) // Modifiers. const ( ModAlt = Modifier(tcell.ModAlt) ) func makeEvent(tev tcell.Event) Event { switch tev := tev.(type) { case *tcell.EventInterrupt: return Event{Type: EventInterrupt} case *tcell.EventResize: w, h := tev.Size() return Event{Type: EventResize, Width: w, Height: h} case *tcell.EventKey: k := tev.Key() ch := rune(0) if k == tcell.KeyRune { ch = tev.Rune() if ch == ' ' { k = tcell.Key(' ') } } mod := tev.Modifiers() return Event{ Type: EventKey, Key: Key(k), Ch: ch, Mod: Modifier(mod), } default: return Event{Type: EventNone} } } // ParseEvent is not supported. func ParseEvent(data []byte) Event { // Not supported return Event{Type: EventError, Err: errors.New("no raw events")} } // PollRawEvent is not supported. func PollRawEvent(data []byte) Event { // Not supported return Event{Type: EventError, Err: errors.New("no raw events")} } // PollEvent blocks until an event is ready, and then returns it. func PollEvent() Event { ev := screen.PollEvent() return makeEvent(ev) } // Interrupt posts an interrupt event. func Interrupt() { screen.PostEvent(tcell.NewEventInterrupt(nil)) } // Cell represents a single character cell on screen. type Cell struct { Ch rune Fg Attribute Bg Attribute } tcell-1.3.0/terminfo/000077500000000000000000000000001354173511300144445ustar00rootroot00000000000000tcell-1.3.0/terminfo/.gitignore000066400000000000000000000000071354173511300164310ustar00rootroot00000000000000mkinfo tcell-1.3.0/terminfo/README.md000066400000000000000000000016731354173511300157320ustar00rootroot00000000000000This package represents the parent for all terminals. In older versions of tcell we had (a couple of) different external file formats for the terminal database. Those are now removed. All terminal definitions are supplied by one of two methods: 1. Compiled Go code 2. For systems with terminfo and infocmp, dynamically generated at runtime. The Go code can be generated using the mkinfo utility in this directory. The database entry should be generated into a package in a directory named as the first character of the package name. (This permits us to group them all without having a huge directory of little packages.) It may be desirable to add new packages to the extended package, or -- rarely -- the base package. Applications which want to have the large set of terminal descriptions built into the binary can simply import the extended package. Otherwise a smaller reasonable default set (the base package) will be included instead. tcell-1.3.0/terminfo/TERMINALS.md000066400000000000000000000003631354173511300163260ustar00rootroot00000000000000TERMINALS ========= The best way to populate terminals on Debian is to install ncurses, ncurses-term, screen, tmux, rxvt-unicode, and dvtm. This populates the the terminfo database so that we can have a reasonable set of starting terminals. tcell-1.3.0/terminfo/a/000077500000000000000000000000001354173511300146645ustar00rootroot00000000000000tcell-1.3.0/terminfo/a/adm3a/000077500000000000000000000000001354173511300156515ustar00rootroot00000000000000tcell-1.3.0/terminfo/a/adm3a/term.go000066400000000000000000000007521354173511300171530ustar00rootroot00000000000000// Generated automatically. DO NOT HAND-EDIT. package adm3a import "github.com/gdamore/tcell/terminfo" func init() { // lsi adm3a terminfo.AddTerminfo(&terminfo.Terminfo{ Name: "adm3a", Columns: 80, Lines: 24, Bell: "\a", Clear: "\x1a$<1/>", PadChar: "\x00", SetCursor: "\x1b=%p1%' '%+%c%p2%' '%+%c", CursorBack1: "\b", CursorUp1: "\v", KeyUp: "\v", KeyDown: "\n", KeyRight: "\f", KeyLeft: "\b", }) } tcell-1.3.0/terminfo/a/aixterm/000077500000000000000000000000001354173511300163355ustar00rootroot00000000000000tcell-1.3.0/terminfo/a/aixterm/term.go000066400000000000000000000041641354173511300176400ustar00rootroot00000000000000// Generated automatically. DO NOT HAND-EDIT. package aixterm import "github.com/gdamore/tcell/terminfo" func init() { // IBM Aixterm Terminal Emulator terminfo.AddTerminfo(&terminfo.Terminfo{ Name: "aixterm", Columns: 80, Lines: 25, Colors: 8, Bell: "\a", Clear: "\x1b[H\x1b[J", AttrOff: "\x1b[0;10m\x1b(B", Underline: "\x1b[4m", Bold: "\x1b[1m", Reverse: "\x1b[7m", SetFg: "\x1b[3%p1%dm", SetBg: "\x1b[4%p1%dm", SetFgBg: "\x1b[3%p1%d;4%p2%dm", PadChar: "\x00", AltChars: "jjkkllmmnnqqttuuvvwwxx", EnterAcs: "\x1b(0", ExitAcs: "\x1b(B", SetCursor: "\x1b[%i%p1%d;%p2%dH", CursorBack1: "\b", CursorUp1: "\x1b[A", KeyUp: "\x1b[A", KeyDown: "\x1b[B", KeyRight: "\x1b[C", KeyLeft: "\x1b[D", KeyInsert: "\x1b[139q", KeyDelete: "\x1b[P", KeyBackspace: "\b", KeyHome: "\x1b[H", KeyEnd: "\x1b[146q", KeyPgUp: "\x1b[150q", KeyPgDn: "\x1b[154q", KeyF1: "\x1b[001q", KeyF2: "\x1b[002q", KeyF3: "\x1b[003q", KeyF4: "\x1b[004q", KeyF5: "\x1b[005q", KeyF6: "\x1b[006q", KeyF7: "\x1b[007q", KeyF8: "\x1b[008q", KeyF9: "\x1b[009q", KeyF10: "\x1b[010q", KeyF11: "\x1b[011q", KeyF12: "\x1b[012q", KeyF13: "\x1b[013q", KeyF14: "\x1b[014q", KeyF15: "\x1b[015q", KeyF16: "\x1b[016q", KeyF17: "\x1b[017q", KeyF18: "\x1b[018q", KeyF19: "\x1b[019q", KeyF20: "\x1b[020q", KeyF21: "\x1b[021q", KeyF22: "\x1b[022q", KeyF23: "\x1b[023q", KeyF24: "\x1b[024q", KeyF25: "\x1b[025q", KeyF26: "\x1b[026q", KeyF27: "\x1b[027q", KeyF28: "\x1b[028q", KeyF29: "\x1b[029q", KeyF30: "\x1b[030q", KeyF31: "\x1b[031q", KeyF32: "\x1b[032q", KeyF33: "\x1b[033q", KeyF34: "\x1b[034q", KeyF35: "\x1b[035q", KeyF36: "\x1b[036q", KeyClear: "\x1b[144q", KeyBacktab: "\x1b[Z", }) } tcell-1.3.0/terminfo/a/alacritty/000077500000000000000000000000001354173511300166605ustar00rootroot00000000000000tcell-1.3.0/terminfo/a/alacritty/term.go000066400000000000000000000112101354173511300201510ustar00rootroot00000000000000// Generated automatically. DO NOT HAND-EDIT. package alacritty import "github.com/gdamore/tcell/terminfo" func init() { // alacritty terminal emulator terminfo.AddTerminfo(&terminfo.Terminfo{ Name: "alacritty", Columns: 80, Lines: 24, Colors: 256, Bell: "\a", Clear: "\x1b[H\x1b[2J", EnterCA: "\x1b[?1049h\x1b[22;0;0t", ExitCA: "\x1b[?1049l\x1b[23;0;0t", ShowCursor: "\x1b[?12l\x1b[?25h", HideCursor: "\x1b[?25l", AttrOff: "\x1b(B\x1b[m", Underline: "\x1b[4m", Bold: "\x1b[1m", Dim: "\x1b[2m", Blink: "\x1b[5m", Reverse: "\x1b[7m", EnterKeypad: "\x1b[?1h\x1b=", ExitKeypad: "\x1b[?1l\x1b>", SetFg: "\x1b[%?%p1%{8}%<%t3%p1%d%e%p1%{16}%<%t9%p1%{8}%-%d%e38;5;%p1%d%;m", SetBg: "\x1b[%?%p1%{8}%<%t4%p1%d%e%p1%{16}%<%t10%p1%{8}%-%d%e48;5;%p1%d%;m", SetFgBg: "\x1b[%?%p1%{8}%<%t3%p1%d%e%p1%{16}%<%t9%p1%{8}%-%d%e38;5;%p1%d%;;%?%p2%{8}%<%t4%p2%d%e%p2%{16}%<%t10%p2%{8}%-%d%e48;5;%p2%d%;m", AltChars: "``aaffggiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~", EnterAcs: "\x1b(0", ExitAcs: "\x1b(B", Mouse: "\x1b[M", MouseMode: "%?%p1%{1}%=%t%'h'%Pa%e%'l'%Pa%;\x1b[?1000%ga%c\x1b[?1002%ga%c\x1b[?1003%ga%c\x1b[?1006%ga%c", SetCursor: "\x1b[%i%p1%d;%p2%dH", CursorBack1: "\b", CursorUp1: "\x1b[A", KeyUp: "\x1bOA", KeyDown: "\x1bOB", KeyRight: "\x1bOC", KeyLeft: "\x1bOD", KeyInsert: "\x1b[2~", KeyDelete: "\x1b[3~", KeyBackspace: "\b", KeyHome: "\x1bOH", KeyEnd: "\x1bOF", KeyPgUp: "\x1b[5~", KeyPgDn: "\x1b[6~", KeyF1: "\x1bOP", KeyF2: "\x1bOQ", KeyF3: "\x1bOR", KeyF4: "\x1bOS", KeyF5: "\x1b[15~", KeyF6: "\x1b[17~", KeyF7: "\x1b[18~", KeyF8: "\x1b[19~", KeyF9: "\x1b[20~", KeyF10: "\x1b[21~", KeyF11: "\x1b[23~", KeyF12: "\x1b[24~", KeyF13: "\x1b[1;2P", KeyF14: "\x1b[1;2Q", KeyF15: "\x1b[1;2R", KeyF16: "\x1b[1;2S", KeyF17: "\x1b[15;2~", KeyF18: "\x1b[17;2~", KeyF19: "\x1b[18;2~", KeyF20: "\x1b[19;2~", KeyF21: "\x1b[20;2~", KeyF22: "\x1b[21;2~", KeyF23: "\x1b[23;2~", KeyF24: "\x1b[24;2~", KeyF25: "\x1b[1;5P", KeyF26: "\x1b[1;5Q", KeyF27: "\x1b[1;5R", KeyF28: "\x1b[1;5S", KeyF29: "\x1b[15;5~", KeyF30: "\x1b[17;5~", KeyF31: "\x1b[18;5~", KeyF32: "\x1b[19;5~", KeyF33: "\x1b[20;5~", KeyF34: "\x1b[21;5~", KeyF35: "\x1b[23;5~", KeyF36: "\x1b[24;5~", KeyF37: "\x1b[1;6P", KeyF38: "\x1b[1;6Q", KeyF39: "\x1b[1;6R", KeyF40: "\x1b[1;6S", KeyF41: "\x1b[15;6~", KeyF42: "\x1b[17;6~", KeyF43: "\x1b[18;6~", KeyF44: "\x1b[19;6~", KeyF45: "\x1b[20;6~", KeyF46: "\x1b[21;6~", KeyF47: "\x1b[23;6~", KeyF48: "\x1b[24;6~", KeyF49: "\x1b[1;3P", KeyF50: "\x1b[1;3Q", KeyF51: "\x1b[1;3R", KeyF52: "\x1b[1;3S", KeyF53: "\x1b[15;3~", KeyF54: "\x1b[17;3~", KeyF55: "\x1b[18;3~", KeyF56: "\x1b[19;3~", KeyF57: "\x1b[20;3~", KeyF58: "\x1b[21;3~", KeyF59: "\x1b[23;3~", KeyF60: "\x1b[24;3~", KeyF61: "\x1b[1;4P", KeyF62: "\x1b[1;4Q", KeyF63: "\x1b[1;4R", KeyBacktab: "\x1b[Z", KeyShfLeft: "\x1b[1;2D", KeyShfRight: "\x1b[1;2C", KeyShfUp: "\x1b[1;2A", KeyShfDown: "\x1b[1;2B", KeyCtrlLeft: "\x1b[1;5D", KeyCtrlRight: "\x1b[1;5C", KeyCtrlUp: "\x1b[1;5A", KeyCtrlDown: "\x1b[1;5B", KeyMetaLeft: "\x1b[1;9D", KeyMetaRight: "\x1b[1;9C", KeyMetaUp: "\x1b[1;9A", KeyMetaDown: "\x1b[1;9B", KeyAltLeft: "\x1b[1;3D", KeyAltRight: "\x1b[1;3C", KeyAltUp: "\x1b[1;3A", KeyAltDown: "\x1b[1;3B", KeyAltShfLeft: "\x1b[1;4D", KeyAltShfRight: "\x1b[1;4C", KeyAltShfUp: "\x1b[1;4A", KeyAltShfDown: "\x1b[1;4B", KeyMetaShfLeft: "\x1b[1;10D", KeyMetaShfRight: "\x1b[1;10C", KeyMetaShfUp: "\x1b[1;10A", KeyMetaShfDown: "\x1b[1;10B", KeyCtrlShfLeft: "\x1b[1;6D", KeyCtrlShfRight: "\x1b[1;6C", KeyCtrlShfUp: "\x1b[1;6A", KeyCtrlShfDown: "\x1b[1;6B", KeyShfHome: "\x1b[1;2H", KeyShfEnd: "\x1b[1;2F", KeyCtrlHome: "\x1b[1;5H", KeyCtrlEnd: "\x1b[1;5F", KeyAltHome: "\x1b[1;9H", KeyAltEnd: "\x1b[1;9F", KeyCtrlShfHome: "\x1b[1;6H", KeyCtrlShfEnd: "\x1b[1;6F", KeyMetaShfHome: "\x1b[1;10H", KeyMetaShfEnd: "\x1b[1;10F", KeyAltShfHome: "\x1b[1;4H", KeyAltShfEnd: "\x1b[1;4F", }) } tcell-1.3.0/terminfo/a/ansi/000077500000000000000000000000001354173511300156165ustar00rootroot00000000000000tcell-1.3.0/terminfo/a/ansi/term.go000066400000000000000000000021521354173511300171140ustar00rootroot00000000000000// Generated automatically. DO NOT HAND-EDIT. package ansi import "github.com/gdamore/tcell/terminfo" func init() { // ansi/pc-term compatible with color terminfo.AddTerminfo(&terminfo.Terminfo{ Name: "ansi", Columns: 80, Lines: 24, Colors: 8, Bell: "\a", Clear: "\x1b[H\x1b[J", AttrOff: "\x1b[0;10m", Underline: "\x1b[4m", Bold: "\x1b[1m", Blink: "\x1b[5m", Reverse: "\x1b[7m", SetFg: "\x1b[3%p1%dm", SetBg: "\x1b[4%p1%dm", SetFgBg: "\x1b[3%p1%d;4%p2%dm", PadChar: "\x00", AltChars: "+\x10,\x11-\x18.\x190\xdb`\x04a\xb1f\xf8g\xf1h\xb0j\xd9k\xbfl\xdam\xc0n\xc5o~p\xc4q\xc4r\xc4s_t\xc3u\xb4v\xc1w\xc2x\xb3y\xf3z\xf2{\xe3|\xd8}\x9c~\xfe", EnterAcs: "\x1b[11m", ExitAcs: "\x1b[10m", SetCursor: "\x1b[%i%p1%d;%p2%dH", CursorBack1: "\x1b[D", CursorUp1: "\x1b[A", KeyUp: "\x1b[A", KeyDown: "\x1b[B", KeyRight: "\x1b[C", KeyLeft: "\x1b[D", KeyInsert: "\x1b[L", KeyBackspace: "\b", KeyHome: "\x1b[H", KeyBacktab: "\x1b[Z", }) } tcell-1.3.0/terminfo/a/aterm/000077500000000000000000000000001354173511300157745ustar00rootroot00000000000000tcell-1.3.0/terminfo/a/aterm/term.go000066400000000000000000000057061354173511300173020ustar00rootroot00000000000000// Generated automatically. DO NOT HAND-EDIT. package aterm import "github.com/gdamore/tcell/terminfo" func init() { // AfterStep terminal terminfo.AddTerminfo(&terminfo.Terminfo{ Name: "aterm", Columns: 80, Lines: 24, Colors: 8, Bell: "\a", Clear: "\x1b[H\x1b[2J", EnterCA: "\x1b7\x1b[?47h", ExitCA: "\x1b[2J\x1b[?47l\x1b8", ShowCursor: "\x1b[?25h", HideCursor: "\x1b[?25l", AttrOff: "\x1b[m\x0f", Underline: "\x1b[4m", Bold: "\x1b[1m", Blink: "\x1b[5m", Reverse: "\x1b[7m", EnterKeypad: "\x1b=", ExitKeypad: "\x1b>", SetFg: "\x1b[3%p1%dm", SetBg: "\x1b[4%p1%dm", SetFgBg: "\x1b[3%p1%d;4%p2%dm", PadChar: "\x00", AltChars: "``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~", EnterAcs: "\x0e", ExitAcs: "\x0f", EnableAcs: "\x1b(B\x1b)0", Mouse: "\x1b[M", MouseMode: "%?%p1%{1}%=%t%'h'%Pa%e%'l'%Pa%;\x1b[?1000%ga%c\x1b[?1002%ga%c\x1b[?1003%ga%c\x1b[?1006%ga%c", SetCursor: "\x1b[%i%p1%d;%p2%dH", CursorBack1: "\b", CursorUp1: "\x1b[A", KeyUp: "\x1b[A", KeyDown: "\x1b[B", KeyRight: "\x1b[C", KeyLeft: "\x1b[D", KeyInsert: "\x1b[2~", KeyDelete: "\x1b[3~", KeyBackspace: "\xff", KeyHome: "\x1b[7~", KeyEnd: "\x1b[8~", KeyPgUp: "\x1b[5~", KeyPgDn: "\x1b[6~", KeyF1: "\x1bOP", KeyF2: "\x1bOQ", KeyF3: "\x1bOR", KeyF4: "\x1bOS", KeyF5: "\x1b[15~", KeyF6: "\x1b[17~", KeyF7: "\x1b[18~", KeyF8: "\x1b[19~", KeyF9: "\x1b[20~", KeyF10: "\x1b[21~", KeyF11: "\x1b[23~", KeyF12: "\x1b[24~", KeyF13: "\x1b[25~", KeyF14: "\x1b[26~", KeyF15: "\x1b[28~", KeyF16: "\x1b[29~", KeyF17: "\x1b[31~", KeyF18: "\x1b[32~", KeyF19: "\x1b[33~", KeyF20: "\x1b[34~", KeyF21: "\x1b[23$", KeyF22: "\x1b[24$", KeyF23: "\x1b[11^", KeyF24: "\x1b[12^", KeyF25: "\x1b[13^", KeyF26: "\x1b[14^", KeyF27: "\x1b[15^", KeyF28: "\x1b[17^", KeyF29: "\x1b[18^", KeyF30: "\x1b[19^", KeyF31: "\x1b[20^", KeyF32: "\x1b[21^", KeyF33: "\x1b[23^", KeyF34: "\x1b[24^", KeyF35: "\x1b[25^", KeyF36: "\x1b[26^", KeyF37: "\x1b[28^", KeyF38: "\x1b[29^", KeyF39: "\x1b[31^", KeyF40: "\x1b[32^", KeyF41: "\x1b[33^", KeyF42: "\x1b[34^", KeyF43: "\x1b[23@", KeyF44: "\x1b[24@", KeyBacktab: "\x1b[Z", KeyShfLeft: "\x1b[d", KeyShfRight: "\x1b[c", KeyShfUp: "\x1b[a", KeyShfDown: "\x1b[b", KeyCtrlLeft: "\x1b[Od", KeyCtrlRight: "\x1b[Oc", KeyCtrlUp: "\x1b[Oa", KeyCtrlDown: "\x1b[Ob", KeyShfHome: "\x1b[7$", KeyShfEnd: "\x1b[8$", KeyCtrlHome: "\x1b[7^", KeyCtrlEnd: "\x1b[8^", }) } tcell-1.3.0/terminfo/b/000077500000000000000000000000001354173511300146655ustar00rootroot00000000000000tcell-1.3.0/terminfo/b/beterm/000077500000000000000000000000001354173511300161435ustar00rootroot00000000000000tcell-1.3.0/terminfo/b/beterm/term.go000066400000000000000000000024651354173511300174500ustar00rootroot00000000000000// Generated automatically. DO NOT HAND-EDIT. package beterm import "github.com/gdamore/tcell/terminfo" func init() { // BeOS Terminal terminfo.AddTerminfo(&terminfo.Terminfo{ Name: "beterm", Columns: 80, Lines: 25, Colors: 8, Bell: "\a", Clear: "\x1b[H\x1b[J", AttrOff: "\x1b[0;10m", Underline: "\x1b[4m", Bold: "\x1b[1m", Reverse: "\x1b[7m", EnterKeypad: "\x1b[?4h", ExitKeypad: "\x1b[?4l", SetFg: "\x1b[3%p1%dm", SetBg: "\x1b[4%p1%dm", SetFgBg: "\x1b[3%p1%d;4%p2%dm", PadChar: "\x00", SetCursor: "\x1b[%i%p1%d;%p2%dH", CursorBack1: "\b", CursorUp1: "\x1b[A", KeyUp: "\x1b[A", KeyDown: "\x1b[B", KeyRight: "\x1b[C", KeyLeft: "\x1b[D", KeyInsert: "\x1b[2~", KeyDelete: "\x1b[3~", KeyBackspace: "\b", KeyHome: "\x1b[1~", KeyEnd: "\x1b[4~", KeyPgUp: "\x1b[5~", KeyPgDn: "\x1b[6~", KeyF1: "\x1b[11~", KeyF2: "\x1b[12~", KeyF3: "\x1b[13~", KeyF4: "\x1b[14~", KeyF5: "\x1b[15~", KeyF6: "\x1b[16~", KeyF7: "\x1b[17~", KeyF8: "\x1b[18~", KeyF9: "\x1b[19~", KeyF10: "\x1b[20~", KeyF11: "\x1b[21~", KeyF12: "\x1b[22~", }) } tcell-1.3.0/terminfo/b/bsdos_pc/000077500000000000000000000000001354173511300164615ustar00rootroot00000000000000tcell-1.3.0/terminfo/b/bsdos_pc/term.go000066400000000000000000000021641354173511300177620ustar00rootroot00000000000000// Generated automatically. DO NOT HAND-EDIT. package bsdos_pc import "github.com/gdamore/tcell/terminfo" func init() { // IBM PC BSD/OS Console terminfo.AddTerminfo(&terminfo.Terminfo{ Name: "bsdos-pc", Columns: 80, Lines: 25, Colors: 8, Bell: "\a", Clear: "\x1bc", AttrOff: "\x1b[0;10m", Underline: "\x1b[4m", Bold: "\x1b[1m", Blink: "\x1b[5m", Reverse: "\x1b[7m", SetFg: "\x1b[3%p1%dm", SetBg: "\x1b[4%p1%dm", SetFgBg: "\x1b[3%p1%d;4%p2%dm", PadChar: "\x00", AltChars: "+\x10,\x11-\x18.\x190\xdb`\x04a\xb1f\xf8g\xf1h\xb0j\xd9k\xbfl\xdam\xc0n\xc5o~p\xc4q\xc4r\xc4s_t\xc3u\xb4v\xc1w\xc2x\xb3y\xf3z\xf2{\xe3|\xd8}\x9c~\xfe", EnterAcs: "\x1b[11m", ExitAcs: "\x1b[10m", SetCursor: "\x1b[%i%p1%d;%p2%dH", CursorBack1: "\b", CursorUp1: "\x1b[A", KeyUp: "\x1b[A", KeyDown: "\x1b[B", KeyRight: "\x1b[C", KeyLeft: "\x1b[D", KeyInsert: "\x1b[L", KeyBackspace: "\b", KeyHome: "\x1b[H", KeyPgUp: "\x1b[I", KeyPgDn: "\x1b[G", }) } tcell-1.3.0/terminfo/base/000077500000000000000000000000001354173511300153565ustar00rootroot00000000000000tcell-1.3.0/terminfo/base/base.go000066400000000000000000000024631354173511300166240ustar00rootroot00000000000000// Copyright 2019 The TCell Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use file except in compliance with the License. // You may obtain a copy of the license at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // This is just a "minimalist" set of the base terminal descriptions. // It should be sufficient for most applications. // Package base contains the base terminal descriptions that are likely // to be needed by any stock application. It is imported by default in the // terminfo package, so terminal types listed here will be available to any // tcell application. package base import ( // The following imports just register themselves -- // thse are the terminal types we aggregate in this package. _ "github.com/gdamore/tcell/terminfo/a/ansi" _ "github.com/gdamore/tcell/terminfo/v/vt100" _ "github.com/gdamore/tcell/terminfo/v/vt102" _ "github.com/gdamore/tcell/terminfo/v/vt220" _ "github.com/gdamore/tcell/terminfo/x/xterm" ) tcell-1.3.0/terminfo/c/000077500000000000000000000000001354173511300146665ustar00rootroot00000000000000tcell-1.3.0/terminfo/c/cygwin/000077500000000000000000000000001354173511300161665ustar00rootroot00000000000000tcell-1.3.0/terminfo/c/cygwin/term.go000066400000000000000000000033501354173511300174650ustar00rootroot00000000000000// Generated automatically. DO NOT HAND-EDIT. package cygwin import "github.com/gdamore/tcell/terminfo" func init() { // ansi emulation for Cygwin terminfo.AddTerminfo(&terminfo.Terminfo{ Name: "cygwin", Colors: 8, Bell: "\a", Clear: "\x1b[H\x1b[J", EnterCA: "\x1b7\x1b[?47h", ExitCA: "\x1b[2J\x1b[?47l\x1b8", AttrOff: "\x1b[0;10m", Underline: "\x1b[4m", Bold: "\x1b[1m", Reverse: "\x1b[7m", SetFg: "\x1b[3%p1%dm", SetBg: "\x1b[4%p1%dm", SetFgBg: "\x1b[3%p1%d;4%p2%dm", PadChar: "\x00", AltChars: "+\x10,\x11-\x18.\x190\xdb`\x04a\xb1f\xf8g\xf1h\xb0j\xd9k\xbfl\xdam\xc0n\xc5o~p\xc4q\xc4r\xc4s_t\xc3u\xb4v\xc1w\xc2x\xb3y\xf3z\xf2{\xe3|\xd8}\x9c~\xfe", EnterAcs: "\x1b[11m", ExitAcs: "\x1b[10m", SetCursor: "\x1b[%i%p1%d;%p2%dH", CursorBack1: "\b", CursorUp1: "\x1b[A", KeyUp: "\x1b[A", KeyDown: "\x1b[B", KeyRight: "\x1b[C", KeyLeft: "\x1b[D", KeyInsert: "\x1b[2~", KeyDelete: "\x1b[3~", KeyBackspace: "\b", KeyHome: "\x1b[1~", KeyEnd: "\x1b[4~", KeyPgUp: "\x1b[5~", KeyPgDn: "\x1b[6~", KeyF1: "\x1b[[A", KeyF2: "\x1b[[B", KeyF3: "\x1b[[C", KeyF4: "\x1b[[D", KeyF5: "\x1b[[E", KeyF6: "\x1b[17~", KeyF7: "\x1b[18~", KeyF8: "\x1b[19~", KeyF9: "\x1b[20~", KeyF10: "\x1b[21~", KeyF11: "\x1b[23~", KeyF12: "\x1b[24~", KeyF13: "\x1b[25~", KeyF14: "\x1b[26~", KeyF15: "\x1b[28~", KeyF16: "\x1b[29~", KeyF17: "\x1b[31~", KeyF18: "\x1b[32~", KeyF19: "\x1b[33~", KeyF20: "\x1b[34~", }) } tcell-1.3.0/terminfo/d/000077500000000000000000000000001354173511300146675ustar00rootroot00000000000000tcell-1.3.0/terminfo/d/d200/000077500000000000000000000000001354173511300153345ustar00rootroot00000000000000tcell-1.3.0/terminfo/d/d200/term.go000066400000000000000000000043131354173511300166330ustar00rootroot00000000000000// Generated automatically. DO NOT HAND-EDIT. package d200 import "github.com/gdamore/tcell/terminfo" func init() { // Data General DASHER D200 terminfo.AddTerminfo(&terminfo.Terminfo{ Name: "d200", Aliases: []string{"d200-dg"}, Columns: 80, Lines: 24, Bell: "\a", Clear: "\f", AttrOff: "\x0f\x15\x1d\x1eE", Underline: "\x14", Bold: "\x1eD\x14", Dim: "\x1c", Blink: "\x0e", Reverse: "\x1eD", PadChar: "\x00", SetCursor: "\x10%p2%c%p1%c", CursorBack1: "\x19", CursorUp1: "\x17", KeyUp: "\x17", KeyDown: "\x1a", KeyRight: "\x18", KeyLeft: "\x19", KeyHome: "\b", KeyF1: "\x1eq", KeyF2: "\x1er", KeyF3: "\x1es", KeyF4: "\x1et", KeyF5: "\x1eu", KeyF6: "\x1ev", KeyF7: "\x1ew", KeyF8: "\x1ex", KeyF9: "\x1ey", KeyF10: "\x1ez", KeyF11: "\x1e{", KeyF12: "\x1e|", KeyF13: "\x1e}", KeyF14: "\x1e~", KeyF15: "\x1ep", KeyF16: "\x1ea", KeyF17: "\x1eb", KeyF18: "\x1ec", KeyF19: "\x1ed", KeyF20: "\x1ee", KeyF21: "\x1ef", KeyF22: "\x1eg", KeyF23: "\x1eh", KeyF24: "\x1ei", KeyF25: "\x1ej", KeyF26: "\x1ek", KeyF27: "\x1el", KeyF28: "\x1em", KeyF29: "\x1en", KeyF30: "\x1e`", KeyF31: "\x1e1", KeyF32: "\x1e2", KeyF33: "\x1e3", KeyF34: "\x1e4", KeyF35: "\x1e5", KeyF36: "\x1e6", KeyF37: "\x1e7", KeyF38: "\x1e8", KeyF39: "\x1e9", KeyF40: "\x1e:", KeyF41: "\x1e;", KeyF42: "\x1e<", KeyF43: "\x1e=", KeyF44: "\x1e>", KeyF45: "\x1e0", KeyF46: "\x1e!", KeyF47: "\x1e\"", KeyF48: "\x1e#", KeyF49: "\x1e$", KeyF50: "\x1e%%", KeyF51: "\x1e&", KeyF52: "\x1e'", KeyF53: "\x1e(", KeyF54: "\x1e)", KeyF55: "\x1e*", KeyF56: "\x1e+", KeyF57: "\x1e,", KeyF58: "\x1e-", KeyF59: "\x1e.", KeyF60: "\x1e ", KeyClear: "\f", KeyShfLeft: "\x1e\x19", KeyShfRight: "\x1e\x18", KeyShfHome: "\x1e\b", }) } tcell-1.3.0/terminfo/d/d210/000077500000000000000000000000001354173511300153355ustar00rootroot00000000000000tcell-1.3.0/terminfo/d/d210/term.go000066400000000000000000000046421354173511300166410ustar00rootroot00000000000000// Generated automatically. DO NOT HAND-EDIT. package d210 import "github.com/gdamore/tcell/terminfo" func init() { // Data General DASHER D210 series terminfo.AddTerminfo(&terminfo.Terminfo{ Name: "d210", Aliases: []string{"d214"}, Columns: 80, Lines: 24, Bell: "\a", Clear: "\x1b[2J", AttrOff: "\x1b[m", Underline: "\x1b[4m", Bold: "\x1b[4;7m", Dim: "\x1b[2m", Blink: "\x1b[5m", Reverse: "\x1b[7m", PadChar: "\x00", SetCursor: "\x1b[%i%p1%d;%p2%dH", CursorBack1: "\b", CursorUp1: "\x1b[A", KeyUp: "\x1b[A", KeyDown: "\x1b[B", KeyRight: "\x1b[C", KeyLeft: "\x1b[D", KeyHome: "\x1b[H", KeyF1: "\x1b[001z", KeyF2: "\x1b[002z", KeyF3: "\x1b[003z", KeyF4: "\x1b[004z", KeyF5: "\x1b[005z", KeyF6: "\x1b[006z", KeyF7: "\x1b[007z", KeyF8: "\x1b[008z", KeyF9: "\x1b[009z", KeyF10: "\x1b[010z", KeyF11: "\x1b[011z", KeyF12: "\x1b[012z", KeyF13: "\x1b[013z", KeyF14: "\x1b[014z", KeyF15: "\x1b[000z", KeyF16: "\x1b[101z", KeyF17: "\x1b[102z", KeyF18: "\x1b[103z", KeyF19: "\x1b[104z", KeyF20: "\x1b[105z", KeyF21: "\x1b[106z", KeyF22: "\x1b[107z", KeyF23: "\x1b[108z", KeyF24: "\x1b[109z", KeyF25: "\x1b[110z", KeyF26: "\x1b[111z", KeyF27: "\x1b[112z", KeyF28: "\x1b[113z", KeyF29: "\x1b[114z", KeyF30: "\x1b[100z", KeyF31: "\x1b[201z", KeyF32: "\x1b[202z", KeyF33: "\x1b[203z", KeyF34: "\x1b[204z", KeyF35: "\x1b[205z", KeyF36: "\x1b[206z", KeyF37: "\x1b[207z", KeyF38: "\x1b[208z", KeyF39: "\x1b[209z", KeyF40: "\x1b[210z", KeyF41: "\x1b[211z", KeyF42: "\x1b[212z", KeyF43: "\x1b[213z", KeyF44: "\x1b[214z", KeyF45: "\x1b[200z", KeyF46: "\x1b[301z", KeyF47: "\x1b[302z", KeyF48: "\x1b[303z", KeyF49: "\x1b[304z", KeyF50: "\x1b[305z", KeyF51: "\x1b[306z", KeyF52: "\x1b[307z", KeyF53: "\x1b[308z", KeyF54: "\x1b[309z", KeyF55: "\x1b[310z", KeyF56: "\x1b[311z", KeyF57: "\x1b[312z", KeyF58: "\x1b[313z", KeyF59: "\x1b[314z", KeyF60: "\x1b[300z", KeyPrint: "\x1b[i", KeyClear: "\x1b[2J", }) } tcell-1.3.0/terminfo/d/dtterm/000077500000000000000000000000001354173511300161665ustar00rootroot00000000000000tcell-1.3.0/terminfo/d/dtterm/term.go000066400000000000000000000033201354173511300174620ustar00rootroot00000000000000// Generated automatically. DO NOT HAND-EDIT. package dtterm import "github.com/gdamore/tcell/terminfo" func init() { // CDE desktop terminal terminfo.AddTerminfo(&terminfo.Terminfo{ Name: "dtterm", Columns: 80, Lines: 24, Colors: 8, Bell: "\a", Clear: "\x1b[H\x1b[J", ShowCursor: "\x1b[?25h", HideCursor: "\x1b[?25l", AttrOff: "\x1b[m\x0f", Underline: "\x1b[4m", Bold: "\x1b[1m", Dim: "\x1b[2m", Blink: "\x1b[5m", Reverse: "\x1b[7m", SetFg: "\x1b[3%p1%dm", SetBg: "\x1b[4%p1%dm", SetFgBg: "\x1b[3%p1%d;4%p2%dm", PadChar: "\x00", AltChars: "``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~", EnterAcs: "\x0e", ExitAcs: "\x0f", EnableAcs: "\x1b(B\x1b)0", SetCursor: "\x1b[%i%p1%d;%p2%dH", CursorBack1: "\b", CursorUp1: "\x1b[A", KeyUp: "\x1b[A", KeyDown: "\x1b[B", KeyRight: "\x1b[C", KeyLeft: "\x1b[D", KeyInsert: "\x1b[2~", KeyDelete: "\x1b[3~", KeyBackspace: "\b", KeyPgUp: "\x1b[5~", KeyPgDn: "\x1b[6~", KeyF1: "\x1b[11~", KeyF2: "\x1b[12~", KeyF3: "\x1b[13~", KeyF4: "\x1b[14~", KeyF5: "\x1b[15~", KeyF6: "\x1b[17~", KeyF7: "\x1b[18~", KeyF8: "\x1b[19~", KeyF9: "\x1b[20~", KeyF10: "\x1b[21~", KeyF11: "\x1b[23~", KeyF12: "\x1b[24~", KeyF13: "\x1b[25~", KeyF14: "\x1b[26~", KeyF15: "\x1b[28~", KeyF16: "\x1b[29~", KeyF17: "\x1b[31~", KeyF18: "\x1b[32~", KeyF19: "\x1b[33~", KeyF20: "\x1b[34~", KeyHelp: "\x1b[28~", }) } tcell-1.3.0/terminfo/dynamic/000077500000000000000000000000001354173511300160705ustar00rootroot00000000000000tcell-1.3.0/terminfo/dynamic/dynamic.go000066400000000000000000000300041354173511300200400ustar00rootroot00000000000000// Copyright 2019 The TCell Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use file except in compliance with the License. // You may obtain a copy of the license at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // The dynamic package is used to generate a terminal description dynamically, // using infocmp. This is really a method of last resort, as the performance // will be slow, and it requires a working infocmp. But, the hope is that it // will assist folks who have to deal with a terminal description that isn't // already built in. This requires infocmp to be in the user's path, and to // support reasonably the -1 option. package dynamic import ( "bytes" "errors" "os/exec" "regexp" "strconv" "strings" "github.com/gdamore/tcell/terminfo" ) type termcap struct { name string desc string aliases []string bools map[string]bool nums map[string]int strs map[string]string } func (tc *termcap) getnum(s string) int { return (tc.nums[s]) } func (tc *termcap) getflag(s string) bool { return (tc.bools[s]) } func (tc *termcap) getstr(s string) string { return (tc.strs[s]) } const ( none = iota control escaped ) var errNotAddressable = errors.New("terminal not cursor addressable") func unescape(s string) string { // Various escapes are in \x format. Control codes are // encoded as ^M (carat followed by ASCII equivalent). // escapes are: \e, \E - escape // \0 NULL, \n \l \r \t \b \f \s for equivalent C escape. buf := &bytes.Buffer{} esc := none for i := 0; i < len(s); i++ { c := s[i] switch esc { case none: switch c { case '\\': esc = escaped case '^': esc = control default: buf.WriteByte(c) } case control: buf.WriteByte(c - 0x40) esc = none case escaped: switch c { case 'E', 'e': buf.WriteByte(0x1b) case '0', '1', '2', '3', '4', '5', '6', '7': if i+2 < len(s) && s[i+1] >= '0' && s[i+1] <= '7' && s[i+2] >= '0' && s[i+2] <= '7' { buf.WriteByte(((c - '0') * 64) + ((s[i+1] - '0') * 8) + (s[i+2] - '0')) i = i + 2 } else if c == '0' { buf.WriteByte(0) } case 'n': buf.WriteByte('\n') case 'r': buf.WriteByte('\r') case 't': buf.WriteByte('\t') case 'b': buf.WriteByte('\b') case 'f': buf.WriteByte('\f') case 's': buf.WriteByte(' ') default: buf.WriteByte(c) } esc = none } } return (buf.String()) } func (tc *termcap) setupterm(name string) error { cmd := exec.Command("infocmp", "-1", name) output := &bytes.Buffer{} cmd.Stdout = output tc.strs = make(map[string]string) tc.bools = make(map[string]bool) tc.nums = make(map[string]int) if err := cmd.Run(); err != nil { return err } // Now parse the output. // We get comment lines (starting with "#"), followed by // a header line that looks like "||...|" // then capabilities, one per line, starting with a tab and ending // with a comma and newline. lines := strings.Split(output.String(), "\n") for len(lines) > 0 && strings.HasPrefix(lines[0], "#") { lines = lines[1:] } // Ditch trailing empty last line if lines[len(lines)-1] == "" { lines = lines[:len(lines)-1] } header := lines[0] if strings.HasSuffix(header, ",") { header = header[:len(header)-1] } names := strings.Split(header, "|") tc.name = names[0] names = names[1:] if len(names) > 0 { tc.desc = names[len(names)-1] names = names[:len(names)-1] } tc.aliases = names for _, val := range lines[1:] { if (!strings.HasPrefix(val, "\t")) || (!strings.HasSuffix(val, ",")) { return (errors.New("malformed infocmp: " + val)) } val = val[1:] val = val[:len(val)-1] if k := strings.SplitN(val, "=", 2); len(k) == 2 { tc.strs[k[0]] = unescape(k[1]) } else if k := strings.SplitN(val, "#", 2); len(k) == 2 { u, err := strconv.ParseUint(k[1], 0, 0) if err != nil { return (err) } tc.nums[k[0]] = int(u) } else { tc.bools[val] = true } } return nil } // LoadTerminfo creates a Terminfo by for named terminal by attempting to parse // the output from infocmp. This returns the terminfo entry, a description of // the terminal, and either nil or an error. func LoadTerminfo(name string) (*terminfo.Terminfo, string, error) { var tc termcap if err := tc.setupterm(name); err != nil { if err != nil { return nil, "", err } } t := &terminfo.Terminfo{} // If this is an alias record, then just emit the alias t.Name = tc.name if t.Name != name { return t, "", nil } t.Aliases = tc.aliases t.Colors = tc.getnum("colors") t.Columns = tc.getnum("cols") t.Lines = tc.getnum("lines") t.Bell = tc.getstr("bel") t.Clear = tc.getstr("clear") t.EnterCA = tc.getstr("smcup") t.ExitCA = tc.getstr("rmcup") t.ShowCursor = tc.getstr("cnorm") t.HideCursor = tc.getstr("civis") t.AttrOff = tc.getstr("sgr0") t.Underline = tc.getstr("smul") t.Bold = tc.getstr("bold") t.Blink = tc.getstr("blink") t.Dim = tc.getstr("dim") t.Reverse = tc.getstr("rev") t.EnterKeypad = tc.getstr("smkx") t.ExitKeypad = tc.getstr("rmkx") t.SetFg = tc.getstr("setaf") t.SetBg = tc.getstr("setab") t.SetCursor = tc.getstr("cup") t.CursorBack1 = tc.getstr("cub1") t.CursorUp1 = tc.getstr("cuu1") t.KeyF1 = tc.getstr("kf1") t.KeyF2 = tc.getstr("kf2") t.KeyF3 = tc.getstr("kf3") t.KeyF4 = tc.getstr("kf4") t.KeyF5 = tc.getstr("kf5") t.KeyF6 = tc.getstr("kf6") t.KeyF7 = tc.getstr("kf7") t.KeyF8 = tc.getstr("kf8") t.KeyF9 = tc.getstr("kf9") t.KeyF10 = tc.getstr("kf10") t.KeyF11 = tc.getstr("kf11") t.KeyF12 = tc.getstr("kf12") t.KeyF13 = tc.getstr("kf13") t.KeyF14 = tc.getstr("kf14") t.KeyF15 = tc.getstr("kf15") t.KeyF16 = tc.getstr("kf16") t.KeyF17 = tc.getstr("kf17") t.KeyF18 = tc.getstr("kf18") t.KeyF19 = tc.getstr("kf19") t.KeyF20 = tc.getstr("kf20") t.KeyF21 = tc.getstr("kf21") t.KeyF22 = tc.getstr("kf22") t.KeyF23 = tc.getstr("kf23") t.KeyF24 = tc.getstr("kf24") t.KeyF25 = tc.getstr("kf25") t.KeyF26 = tc.getstr("kf26") t.KeyF27 = tc.getstr("kf27") t.KeyF28 = tc.getstr("kf28") t.KeyF29 = tc.getstr("kf29") t.KeyF30 = tc.getstr("kf30") t.KeyF31 = tc.getstr("kf31") t.KeyF32 = tc.getstr("kf32") t.KeyF33 = tc.getstr("kf33") t.KeyF34 = tc.getstr("kf34") t.KeyF35 = tc.getstr("kf35") t.KeyF36 = tc.getstr("kf36") t.KeyF37 = tc.getstr("kf37") t.KeyF38 = tc.getstr("kf38") t.KeyF39 = tc.getstr("kf39") t.KeyF40 = tc.getstr("kf40") t.KeyF41 = tc.getstr("kf41") t.KeyF42 = tc.getstr("kf42") t.KeyF43 = tc.getstr("kf43") t.KeyF44 = tc.getstr("kf44") t.KeyF45 = tc.getstr("kf45") t.KeyF46 = tc.getstr("kf46") t.KeyF47 = tc.getstr("kf47") t.KeyF48 = tc.getstr("kf48") t.KeyF49 = tc.getstr("kf49") t.KeyF50 = tc.getstr("kf50") t.KeyF51 = tc.getstr("kf51") t.KeyF52 = tc.getstr("kf52") t.KeyF53 = tc.getstr("kf53") t.KeyF54 = tc.getstr("kf54") t.KeyF55 = tc.getstr("kf55") t.KeyF56 = tc.getstr("kf56") t.KeyF57 = tc.getstr("kf57") t.KeyF58 = tc.getstr("kf58") t.KeyF59 = tc.getstr("kf59") t.KeyF60 = tc.getstr("kf60") t.KeyF61 = tc.getstr("kf61") t.KeyF62 = tc.getstr("kf62") t.KeyF63 = tc.getstr("kf63") t.KeyF64 = tc.getstr("kf64") t.KeyInsert = tc.getstr("kich1") t.KeyDelete = tc.getstr("kdch1") t.KeyBackspace = tc.getstr("kbs") t.KeyHome = tc.getstr("khome") t.KeyEnd = tc.getstr("kend") t.KeyUp = tc.getstr("kcuu1") t.KeyDown = tc.getstr("kcud1") t.KeyRight = tc.getstr("kcuf1") t.KeyLeft = tc.getstr("kcub1") t.KeyPgDn = tc.getstr("knp") t.KeyPgUp = tc.getstr("kpp") t.KeyBacktab = tc.getstr("kcbt") t.KeyExit = tc.getstr("kext") t.KeyCancel = tc.getstr("kcan") t.KeyPrint = tc.getstr("kprt") t.KeyHelp = tc.getstr("khlp") t.KeyClear = tc.getstr("kclr") t.AltChars = tc.getstr("acsc") t.EnterAcs = tc.getstr("smacs") t.ExitAcs = tc.getstr("rmacs") t.EnableAcs = tc.getstr("enacs") t.Mouse = tc.getstr("kmous") t.KeyShfRight = tc.getstr("kRIT") t.KeyShfLeft = tc.getstr("kLFT") t.KeyShfHome = tc.getstr("kHOM") t.KeyShfEnd = tc.getstr("kEND") // Terminfo lacks descriptions for a bunch of modified keys, // but modern XTerm and emulators often have them. Let's add them, // if the shifted right and left arrows are defined. if t.KeyShfRight == "\x1b[1;2C" && t.KeyShfLeft == "\x1b[1;2D" { t.KeyShfUp = "\x1b[1;2A" t.KeyShfDown = "\x1b[1;2B" t.KeyMetaUp = "\x1b[1;9A" t.KeyMetaDown = "\x1b[1;9B" t.KeyMetaRight = "\x1b[1;9C" t.KeyMetaLeft = "\x1b[1;9D" t.KeyAltUp = "\x1b[1;3A" t.KeyAltDown = "\x1b[1;3B" t.KeyAltRight = "\x1b[1;3C" t.KeyAltLeft = "\x1b[1;3D" t.KeyCtrlUp = "\x1b[1;5A" t.KeyCtrlDown = "\x1b[1;5B" t.KeyCtrlRight = "\x1b[1;5C" t.KeyCtrlLeft = "\x1b[1;5D" t.KeyAltShfUp = "\x1b[1;4A" t.KeyAltShfDown = "\x1b[1;4B" t.KeyAltShfRight = "\x1b[1;4C" t.KeyAltShfLeft = "\x1b[1;4D" t.KeyMetaShfUp = "\x1b[1;10A" t.KeyMetaShfDown = "\x1b[1;10B" t.KeyMetaShfRight = "\x1b[1;10C" t.KeyMetaShfLeft = "\x1b[1;10D" t.KeyCtrlShfUp = "\x1b[1;6A" t.KeyCtrlShfDown = "\x1b[1;6B" t.KeyCtrlShfRight = "\x1b[1;6C" t.KeyCtrlShfLeft = "\x1b[1;6D" } // And also for Home and End if t.KeyShfHome == "\x1b[1;2H" && t.KeyShfEnd == "\x1b[1;2F" { t.KeyCtrlHome = "\x1b[1;5H" t.KeyCtrlEnd = "\x1b[1;5F" t.KeyAltHome = "\x1b[1;9H" t.KeyAltEnd = "\x1b[1;9F" t.KeyCtrlShfHome = "\x1b[1;6H" t.KeyCtrlShfEnd = "\x1b[1;6F" t.KeyAltShfHome = "\x1b[1;4H" t.KeyAltShfEnd = "\x1b[1;4F" t.KeyMetaShfHome = "\x1b[1;10H" t.KeyMetaShfEnd = "\x1b[1;10F" } // And the same thing for rxvt and workalikes (Eterm, aterm, etc.) // It seems that urxvt at least send escaped as ALT prefix for these, // although some places seem to indicate a separate ALT key sesquence. if t.KeyShfRight == "\x1b[c" && t.KeyShfLeft == "\x1b[d" { t.KeyShfUp = "\x1b[a" t.KeyShfDown = "\x1b[b" t.KeyCtrlUp = "\x1b[Oa" t.KeyCtrlDown = "\x1b[Ob" t.KeyCtrlRight = "\x1b[Oc" t.KeyCtrlLeft = "\x1b[Od" } if t.KeyShfHome == "\x1b[7$" && t.KeyShfEnd == "\x1b[8$" { t.KeyCtrlHome = "\x1b[7^" t.KeyCtrlEnd = "\x1b[8^" } // If the kmous entry is present, then we need to record the // the codes to enter and exit mouse mode. Sadly, this is not // part of the terminfo databases anywhere that I've found, but // is an extension. The escapedape codes are documented in the XTerm // manual, and all terminals that have kmous are expected to // use these same codes, unless explicitly configured otherwise // vi XM. Note that in any event, we only known how to parse either // x11 or SGR mouse events -- if your terminal doesn't support one // of these two forms, you maybe out of luck. t.MouseMode = tc.getstr("XM") if t.Mouse != "" && t.MouseMode == "" { // we anticipate that all xterm mouse tracking compatible // terminals understand mouse tracking (1000), but we hope // that those that don't understand any-event tracking (1003) // will at least ignore it. Likewise we hope that terminals // that don't understand SGR reporting (1006) just ignore it. t.MouseMode = "%?%p1%{1}%=%t%'h'%Pa%e%'l'%Pa%;" + "\x1b[?1000%ga%c\x1b[?1002%ga%c\x1b[?1003%ga%c\x1b[?1006%ga%c" } // We only support colors in ANSI 8 or 256 color mode. if t.Colors < 8 || t.SetFg == "" { t.Colors = 0 } if t.SetCursor == "" { return nil, "", errNotAddressable } // For padding, we lookup the pad char. If that isn't present, // and npc is *not* set, then we assume a null byte. t.PadChar = tc.getstr("pad") if t.PadChar == "" { if !tc.getflag("npc") { t.PadChar = "\u0000" } } // For terminals that use "standard" SGR sequences, lets combine the // foreground and background together. if strings.HasPrefix(t.SetFg, "\x1b[") && strings.HasPrefix(t.SetBg, "\x1b[") && strings.HasSuffix(t.SetFg, "m") && strings.HasSuffix(t.SetBg, "m") { fg := t.SetFg[:len(t.SetFg)-1] r := regexp.MustCompile("%p1") bg := r.ReplaceAllString(t.SetBg[2:], "%p2") t.SetFgBg = fg + ";" + bg } return t, tc.desc, nil } tcell-1.3.0/terminfo/e/000077500000000000000000000000001354173511300146705ustar00rootroot00000000000000tcell-1.3.0/terminfo/e/emacs/000077500000000000000000000000001354173511300157605ustar00rootroot00000000000000tcell-1.3.0/terminfo/e/emacs/term.go000066400000000000000000000027621354173511300172650ustar00rootroot00000000000000// Generated automatically. DO NOT HAND-EDIT. package emacs import "github.com/gdamore/tcell/terminfo" func init() { // gnu emacs term.el terminal emulation terminfo.AddTerminfo(&terminfo.Terminfo{ Name: "eterm", Columns: 80, Lines: 24, Bell: "\a", Clear: "\x1b[H\x1b[J", EnterCA: "\x1b7\x1b[?47h", ExitCA: "\x1b[2J\x1b[?47l\x1b8", AttrOff: "\x1b[m", Underline: "\x1b[4m", Bold: "\x1b[1m", Reverse: "\x1b[7m", PadChar: "\x00", SetCursor: "\x1b[%i%p1%d;%p2%dH", CursorBack1: "\b", CursorUp1: "\x1b[A", }) // Emacs term.el terminal emulator term-protocol-version 0.96 terminfo.AddTerminfo(&terminfo.Terminfo{ Name: "eterm-color", Columns: 80, Lines: 24, Colors: 8, Bell: "\a", Clear: "\x1b[H\x1b[J", AttrOff: "\x1b[m", Underline: "\x1b[4m", Bold: "\x1b[1m", Blink: "\x1b[5m", Reverse: "\x1b[7m", SetFg: "\x1b[%p1%{30}%+%dm", SetBg: "\x1b[%p1%'('%+%dm", SetFgBg: "\x1b[%p1%{30}%+%d;%p2%'('%+%dm", PadChar: "\x00", SetCursor: "\x1b[%i%p1%d;%p2%dH", CursorBack1: "\b", CursorUp1: "\x1b[A", KeyUp: "\x1bOA", KeyDown: "\x1bOB", KeyRight: "\x1bOC", KeyLeft: "\x1bOD", KeyInsert: "\x1b[2~", KeyDelete: "\x1b[3~", KeyBackspace: "\xff", KeyHome: "\x1b[1~", KeyEnd: "\x1b[4~", KeyPgUp: "\x1b[5~", KeyPgDn: "\x1b[6~", }) } tcell-1.3.0/terminfo/e/eterm/000077500000000000000000000000001354173511300160045ustar00rootroot00000000000000tcell-1.3.0/terminfo/e/eterm/term.go000066400000000000000000000217521354173511300173110ustar00rootroot00000000000000// Generated automatically. DO NOT HAND-EDIT. package eterm import "github.com/gdamore/tcell/terminfo" func init() { // Eterm with xterm-style color support (X Window System) terminfo.AddTerminfo(&terminfo.Terminfo{ Name: "Eterm", Aliases: []string{"Eterm-color"}, Columns: 80, Lines: 24, Colors: 8, Bell: "\a", Clear: "\x1b[H\x1b[2J", EnterCA: "\x1b7\x1b[?47h", ExitCA: "\x1b[2J\x1b[?47l\x1b8", ShowCursor: "\x1b[?25h", HideCursor: "\x1b[?25l", AttrOff: "\x1b[m\x0f", Underline: "\x1b[4m", Bold: "\x1b[1m", Blink: "\x1b[5m", Reverse: "\x1b[7m", SetFg: "\x1b[3%p1%dm", SetBg: "\x1b[4%p1%dm", SetFgBg: "\x1b[3%p1%d;4%p2%dm", PadChar: "\x00", AltChars: "``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~", EnterAcs: "\x0e", ExitAcs: "\x0f", EnableAcs: "\x1b)0", Mouse: "\x1b[M", MouseMode: "%?%p1%{1}%=%t%'h'%Pa%e%'l'%Pa%;\x1b[?1000%ga%c\x1b[?1002%ga%c\x1b[?1003%ga%c\x1b[?1006%ga%c", SetCursor: "\x1b[%i%p1%d;%p2%dH", CursorBack1: "\b", CursorUp1: "\x1b[A", KeyUp: "\x1b[A", KeyDown: "\x1b[B", KeyRight: "\x1b[C", KeyLeft: "\x1b[D", KeyInsert: "\x1b[2~", KeyDelete: "\x1b[3~", KeyBackspace: "\xff", KeyHome: "\x1b[7~", KeyEnd: "\x1b[8~", KeyPgUp: "\x1b[5~", KeyPgDn: "\x1b[6~", KeyF1: "\x1b[11~", KeyF2: "\x1b[12~", KeyF3: "\x1b[13~", KeyF4: "\x1b[14~", KeyF5: "\x1b[15~", KeyF6: "\x1b[17~", KeyF7: "\x1b[18~", KeyF8: "\x1b[19~", KeyF9: "\x1b[20~", KeyF10: "\x1b[21~", KeyF11: "\x1b[23~", KeyF12: "\x1b[24~", KeyF13: "\x1b[25~", KeyF14: "\x1b[26~", KeyF15: "\x1b[28~", KeyF16: "\x1b[29~", KeyF17: "\x1b[31~", KeyF18: "\x1b[32~", KeyF19: "\x1b[33~", KeyF20: "\x1b[34~", KeyF21: "\x1b[23$", KeyF22: "\x1b[24$", KeyF23: "\x1b[11^", KeyF24: "\x1b[12^", KeyF25: "\x1b[13^", KeyF26: "\x1b[14^", KeyF27: "\x1b[15^", KeyF28: "\x1b[17^", KeyF29: "\x1b[18^", KeyF30: "\x1b[19^", KeyF31: "\x1b[20^", KeyF32: "\x1b[21^", KeyF33: "\x1b[23^", KeyF34: "\x1b[24^", KeyF35: "\x1b[25^", KeyF36: "\x1b[26^", KeyF37: "\x1b[28^", KeyF38: "\x1b[29^", KeyF39: "\x1b[31^", KeyF40: "\x1b[32^", KeyF41: "\x1b[33^", KeyF42: "\x1b[34^", KeyF43: "\x1b[23@", KeyF44: "\x1b[24@", KeyHelp: "\x1b[28~", KeyShfLeft: "\x1b[d", KeyShfRight: "\x1b[c", KeyShfUp: "\x1b[a", KeyShfDown: "\x1b[b", KeyCtrlLeft: "\x1b[Od", KeyCtrlRight: "\x1b[Oc", KeyCtrlUp: "\x1b[Oa", KeyCtrlDown: "\x1b[Ob", KeyShfHome: "\x1b[7$", KeyShfEnd: "\x1b[8$", KeyCtrlHome: "\x1b[7^", KeyCtrlEnd: "\x1b[8^", }) // Eterm with 88 colors terminfo.AddTerminfo(&terminfo.Terminfo{ Name: "Eterm-88color", Columns: 80, Lines: 24, Colors: 88, Bell: "\a", Clear: "\x1b[H\x1b[2J", EnterCA: "\x1b7\x1b[?47h", ExitCA: "\x1b[2J\x1b[?47l\x1b8", ShowCursor: "\x1b[?25h", HideCursor: "\x1b[?25l", AttrOff: "\x1b[m\x0f", Underline: "\x1b[4m", Bold: "\x1b[1m", Blink: "\x1b[5m", Reverse: "\x1b[7m", SetFg: "\x1b[%?%p1%{8}%<%t3%p1%d%e%p1%{16}%<%t9%p1%{8}%-%d%e38;5;%p1%d%;m", SetBg: "\x1b[%?%p1%{8}%<%t4%p1%d%e%p1%{16}%<%t10%p1%{8}%-%d%e48;5;%p1%d%;m", SetFgBg: "\x1b[%?%p1%{8}%<%t3%p1%d%e%p1%{16}%<%t9%p1%{8}%-%d%e38;5;%p1%d%;;%?%p2%{8}%<%t4%p2%d%e%p2%{16}%<%t10%p2%{8}%-%d%e48;5;%p2%d%;m", PadChar: "\x00", AltChars: "``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~", EnterAcs: "\x0e", ExitAcs: "\x0f", EnableAcs: "\x1b)0", Mouse: "\x1b[M", MouseMode: "%?%p1%{1}%=%t%'h'%Pa%e%'l'%Pa%;\x1b[?1000%ga%c\x1b[?1002%ga%c\x1b[?1003%ga%c\x1b[?1006%ga%c", SetCursor: "\x1b[%i%p1%d;%p2%dH", CursorBack1: "\b", CursorUp1: "\x1b[A", KeyUp: "\x1b[A", KeyDown: "\x1b[B", KeyRight: "\x1b[C", KeyLeft: "\x1b[D", KeyInsert: "\x1b[2~", KeyDelete: "\x1b[3~", KeyBackspace: "\xff", KeyHome: "\x1b[7~", KeyEnd: "\x1b[8~", KeyPgUp: "\x1b[5~", KeyPgDn: "\x1b[6~", KeyF1: "\x1b[11~", KeyF2: "\x1b[12~", KeyF3: "\x1b[13~", KeyF4: "\x1b[14~", KeyF5: "\x1b[15~", KeyF6: "\x1b[17~", KeyF7: "\x1b[18~", KeyF8: "\x1b[19~", KeyF9: "\x1b[20~", KeyF10: "\x1b[21~", KeyF11: "\x1b[23~", KeyF12: "\x1b[24~", KeyF13: "\x1b[25~", KeyF14: "\x1b[26~", KeyF15: "\x1b[28~", KeyF16: "\x1b[29~", KeyF17: "\x1b[31~", KeyF18: "\x1b[32~", KeyF19: "\x1b[33~", KeyF20: "\x1b[34~", KeyF21: "\x1b[23$", KeyF22: "\x1b[24$", KeyF23: "\x1b[11^", KeyF24: "\x1b[12^", KeyF25: "\x1b[13^", KeyF26: "\x1b[14^", KeyF27: "\x1b[15^", KeyF28: "\x1b[17^", KeyF29: "\x1b[18^", KeyF30: "\x1b[19^", KeyF31: "\x1b[20^", KeyF32: "\x1b[21^", KeyF33: "\x1b[23^", KeyF34: "\x1b[24^", KeyF35: "\x1b[25^", KeyF36: "\x1b[26^", KeyF37: "\x1b[28^", KeyF38: "\x1b[29^", KeyF39: "\x1b[31^", KeyF40: "\x1b[32^", KeyF41: "\x1b[33^", KeyF42: "\x1b[34^", KeyF43: "\x1b[23@", KeyF44: "\x1b[24@", KeyHelp: "\x1b[28~", KeyShfLeft: "\x1b[d", KeyShfRight: "\x1b[c", KeyShfUp: "\x1b[a", KeyShfDown: "\x1b[b", KeyCtrlLeft: "\x1b[Od", KeyCtrlRight: "\x1b[Oc", KeyCtrlUp: "\x1b[Oa", KeyCtrlDown: "\x1b[Ob", KeyShfHome: "\x1b[7$", KeyShfEnd: "\x1b[8$", KeyCtrlHome: "\x1b[7^", KeyCtrlEnd: "\x1b[8^", }) // Eterm with xterm 256-colors terminfo.AddTerminfo(&terminfo.Terminfo{ Name: "Eterm-256color", Columns: 80, Lines: 24, Colors: 256, Bell: "\a", Clear: "\x1b[H\x1b[2J", EnterCA: "\x1b7\x1b[?47h", ExitCA: "\x1b[2J\x1b[?47l\x1b8", ShowCursor: "\x1b[?25h", HideCursor: "\x1b[?25l", AttrOff: "\x1b[m\x0f", Underline: "\x1b[4m", Bold: "\x1b[1m", Blink: "\x1b[5m", Reverse: "\x1b[7m", SetFg: "\x1b[%?%p1%{8}%<%t3%p1%d%e%p1%{16}%<%t9%p1%{8}%-%d%e38;5;%p1%d%;m", SetBg: "\x1b[%?%p1%{8}%<%t4%p1%d%e%p1%{16}%<%t10%p1%{8}%-%d%e48;5;%p1%d%;m", SetFgBg: "\x1b[%?%p1%{8}%<%t3%p1%d%e%p1%{16}%<%t9%p1%{8}%-%d%e38;5;%p1%d%;;%?%p2%{8}%<%t4%p2%d%e%p2%{16}%<%t10%p2%{8}%-%d%e48;5;%p2%d%;m", PadChar: "\x00", AltChars: "``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~", EnterAcs: "\x0e", ExitAcs: "\x0f", EnableAcs: "\x1b)0", Mouse: "\x1b[M", MouseMode: "%?%p1%{1}%=%t%'h'%Pa%e%'l'%Pa%;\x1b[?1000%ga%c\x1b[?1002%ga%c\x1b[?1003%ga%c\x1b[?1006%ga%c", SetCursor: "\x1b[%i%p1%d;%p2%dH", CursorBack1: "\b", CursorUp1: "\x1b[A", KeyUp: "\x1b[A", KeyDown: "\x1b[B", KeyRight: "\x1b[C", KeyLeft: "\x1b[D", KeyInsert: "\x1b[2~", KeyDelete: "\x1b[3~", KeyBackspace: "\xff", KeyHome: "\x1b[7~", KeyEnd: "\x1b[8~", KeyPgUp: "\x1b[5~", KeyPgDn: "\x1b[6~", KeyF1: "\x1b[11~", KeyF2: "\x1b[12~", KeyF3: "\x1b[13~", KeyF4: "\x1b[14~", KeyF5: "\x1b[15~", KeyF6: "\x1b[17~", KeyF7: "\x1b[18~", KeyF8: "\x1b[19~", KeyF9: "\x1b[20~", KeyF10: "\x1b[21~", KeyF11: "\x1b[23~", KeyF12: "\x1b[24~", KeyF13: "\x1b[25~", KeyF14: "\x1b[26~", KeyF15: "\x1b[28~", KeyF16: "\x1b[29~", KeyF17: "\x1b[31~", KeyF18: "\x1b[32~", KeyF19: "\x1b[33~", KeyF20: "\x1b[34~", KeyF21: "\x1b[23$", KeyF22: "\x1b[24$", KeyF23: "\x1b[11^", KeyF24: "\x1b[12^", KeyF25: "\x1b[13^", KeyF26: "\x1b[14^", KeyF27: "\x1b[15^", KeyF28: "\x1b[17^", KeyF29: "\x1b[18^", KeyF30: "\x1b[19^", KeyF31: "\x1b[20^", KeyF32: "\x1b[21^", KeyF33: "\x1b[23^", KeyF34: "\x1b[24^", KeyF35: "\x1b[25^", KeyF36: "\x1b[26^", KeyF37: "\x1b[28^", KeyF38: "\x1b[29^", KeyF39: "\x1b[31^", KeyF40: "\x1b[32^", KeyF41: "\x1b[33^", KeyF42: "\x1b[34^", KeyF43: "\x1b[23@", KeyF44: "\x1b[24@", KeyHelp: "\x1b[28~", KeyShfLeft: "\x1b[d", KeyShfRight: "\x1b[c", KeyShfUp: "\x1b[a", KeyShfDown: "\x1b[b", KeyCtrlLeft: "\x1b[Od", KeyCtrlRight: "\x1b[Oc", KeyCtrlUp: "\x1b[Oa", KeyCtrlDown: "\x1b[Ob", KeyShfHome: "\x1b[7$", KeyShfEnd: "\x1b[8$", KeyCtrlHome: "\x1b[7^", KeyCtrlEnd: "\x1b[8^", }) } tcell-1.3.0/terminfo/extended/000077500000000000000000000000001354173511300162445ustar00rootroot00000000000000tcell-1.3.0/terminfo/extended/extended.go000066400000000000000000000060631354173511300204000ustar00rootroot00000000000000// Copyright 2019 The TCell Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use file except in compliance with the License. // You may obtain a copy of the license at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // Package extended contains an extended set of terminal descriptions. // Applications desiring to have a better chance of Just Working by // default should include this package. This will significantly increase // the size of the program. package extended import ( // The following imports just register themselves -- // these are the terminal types we aggregate in this package. _ "github.com/gdamore/tcell/terminfo/a/adm3a" _ "github.com/gdamore/tcell/terminfo/a/aixterm" _ "github.com/gdamore/tcell/terminfo/a/alacritty" _ "github.com/gdamore/tcell/terminfo/a/ansi" _ "github.com/gdamore/tcell/terminfo/a/aterm" _ "github.com/gdamore/tcell/terminfo/b/beterm" _ "github.com/gdamore/tcell/terminfo/b/bsdos_pc" _ "github.com/gdamore/tcell/terminfo/c/cygwin" _ "github.com/gdamore/tcell/terminfo/d/d200" _ "github.com/gdamore/tcell/terminfo/d/d210" _ "github.com/gdamore/tcell/terminfo/d/dtterm" _ "github.com/gdamore/tcell/terminfo/e/emacs" _ "github.com/gdamore/tcell/terminfo/e/eterm" _ "github.com/gdamore/tcell/terminfo/g/gnome" _ "github.com/gdamore/tcell/terminfo/h/hpterm" _ "github.com/gdamore/tcell/terminfo/h/hz1500" _ "github.com/gdamore/tcell/terminfo/k/konsole" _ "github.com/gdamore/tcell/terminfo/k/kterm" _ "github.com/gdamore/tcell/terminfo/l/linux" _ "github.com/gdamore/tcell/terminfo/p/pcansi" _ "github.com/gdamore/tcell/terminfo/r/rxvt" _ "github.com/gdamore/tcell/terminfo/s/screen" _ "github.com/gdamore/tcell/terminfo/s/simpleterm" _ "github.com/gdamore/tcell/terminfo/s/sun" _ "github.com/gdamore/tcell/terminfo/t/termite" _ "github.com/gdamore/tcell/terminfo/t/tvi910" _ "github.com/gdamore/tcell/terminfo/t/tvi912" _ "github.com/gdamore/tcell/terminfo/t/tvi921" _ "github.com/gdamore/tcell/terminfo/t/tvi925" _ "github.com/gdamore/tcell/terminfo/t/tvi950" _ "github.com/gdamore/tcell/terminfo/t/tvi970" _ "github.com/gdamore/tcell/terminfo/v/vt100" _ "github.com/gdamore/tcell/terminfo/v/vt102" _ "github.com/gdamore/tcell/terminfo/v/vt220" _ "github.com/gdamore/tcell/terminfo/v/vt320" _ "github.com/gdamore/tcell/terminfo/v/vt400" _ "github.com/gdamore/tcell/terminfo/v/vt420" _ "github.com/gdamore/tcell/terminfo/v/vt52" _ "github.com/gdamore/tcell/terminfo/w/wy50" _ "github.com/gdamore/tcell/terminfo/w/wy60" _ "github.com/gdamore/tcell/terminfo/w/wy99_ansi" _ "github.com/gdamore/tcell/terminfo/x/xfce" _ "github.com/gdamore/tcell/terminfo/x/xnuppc" _ "github.com/gdamore/tcell/terminfo/x/xterm" _ "github.com/gdamore/tcell/terminfo/x/xterm_kitty" ) tcell-1.3.0/terminfo/g/000077500000000000000000000000001354173511300146725ustar00rootroot00000000000000tcell-1.3.0/terminfo/g/gnome/000077500000000000000000000000001354173511300157775ustar00rootroot00000000000000tcell-1.3.0/terminfo/g/gnome/term.go000066400000000000000000000233461354173511300173050ustar00rootroot00000000000000// Generated automatically. DO NOT HAND-EDIT. package gnome import "github.com/gdamore/tcell/terminfo" func init() { // GNOME Terminal terminfo.AddTerminfo(&terminfo.Terminfo{ Name: "gnome", Columns: 80, Lines: 24, Colors: 8, Bell: "\a", Clear: "\x1b[H\x1b[2J", EnterCA: "\x1b7\x1b[?47h", ExitCA: "\x1b[2J\x1b[?47l\x1b8", ShowCursor: "\x1b[?25h", HideCursor: "\x1b[?25l", AttrOff: "\x1b[0m\x0f", Underline: "\x1b[4m", Bold: "\x1b[1m", Dim: "\x1b[2m", Reverse: "\x1b[7m", EnterKeypad: "\x1b[?1h\x1b=", ExitKeypad: "\x1b[?1l\x1b>", SetFg: "\x1b[3%p1%dm", SetBg: "\x1b[4%p1%dm", SetFgBg: "\x1b[3%p1%d;4%p2%dm", PadChar: "\x00", AltChars: "``aaffggiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~", EnterAcs: "\x0e", ExitAcs: "\x0f", EnableAcs: "\x1b)0", Mouse: "\x1b[M", MouseMode: "%?%p1%{1}%=%t%'h'%Pa%e%'l'%Pa%;\x1b[?1000%ga%c\x1b[?1002%ga%c\x1b[?1003%ga%c\x1b[?1006%ga%c", SetCursor: "\x1b[%i%p1%d;%p2%dH", CursorBack1: "\b", CursorUp1: "\x1b[A", KeyUp: "\x1bOA", KeyDown: "\x1bOB", KeyRight: "\x1bOC", KeyLeft: "\x1bOD", KeyInsert: "\x1b[2~", KeyDelete: "\x1b[3~", KeyBackspace: "\xff", KeyHome: "\x1bOH", KeyEnd: "\x1bOF", KeyPgUp: "\x1b[5~", KeyPgDn: "\x1b[6~", KeyF1: "\x1bOP", KeyF2: "\x1bOQ", KeyF3: "\x1bOR", KeyF4: "\x1bOS", KeyF5: "\x1b[15~", KeyF6: "\x1b[17~", KeyF7: "\x1b[18~", KeyF8: "\x1b[19~", KeyF9: "\x1b[20~", KeyF10: "\x1b[21~", KeyF11: "\x1b[23~", KeyF12: "\x1b[24~", KeyF13: "\x1bO1;2P", KeyF14: "\x1bO1;2Q", KeyF15: "\x1bO1;2R", KeyF16: "\x1bO1;2S", KeyF17: "\x1b[15;2~", KeyF18: "\x1b[17;2~", KeyF19: "\x1b[18;2~", KeyF20: "\x1b[19;2~", KeyF21: "\x1b[20;2~", KeyF22: "\x1b[21;2~", KeyF23: "\x1b[23;2~", KeyF24: "\x1b[24;2~", KeyF25: "\x1bO1;5P", KeyF26: "\x1bO1;5Q", KeyF27: "\x1bO1;5R", KeyF28: "\x1bO1;5S", KeyF29: "\x1b[15;5~", KeyF30: "\x1b[17;5~", KeyF31: "\x1b[18;5~", KeyF32: "\x1b[19;5~", KeyF33: "\x1b[20;5~", KeyF34: "\x1b[21;5~", KeyF35: "\x1b[23;5~", KeyF36: "\x1b[24;5~", KeyF37: "\x1bO1;6P", KeyF38: "\x1bO1;6Q", KeyF39: "\x1bO1;6R", KeyF40: "\x1bO1;6S", KeyF41: "\x1b[15;6~", KeyF42: "\x1b[17;6~", KeyF43: "\x1b[18;6~", KeyF44: "\x1b[19;6~", KeyF45: "\x1b[20;6~", KeyF46: "\x1b[21;6~", KeyF47: "\x1b[23;6~", KeyF48: "\x1b[24;6~", KeyF49: "\x1bO1;3P", KeyF50: "\x1bO1;3Q", KeyF51: "\x1bO1;3R", KeyF52: "\x1bO1;3S", KeyF53: "\x1b[15;3~", KeyF54: "\x1b[17;3~", KeyF55: "\x1b[18;3~", KeyF56: "\x1b[19;3~", KeyF57: "\x1b[20;3~", KeyF58: "\x1b[21;3~", KeyF59: "\x1b[23;3~", KeyF60: "\x1b[24;3~", KeyF61: "\x1bO1;4P", KeyF62: "\x1bO1;4Q", KeyF63: "\x1bO1;4R", KeyBacktab: "\x1b[Z", KeyShfLeft: "\x1b[1;2D", KeyShfRight: "\x1b[1;2C", KeyShfUp: "\x1b[1;2A", KeyShfDown: "\x1b[1;2B", KeyCtrlLeft: "\x1b[1;5D", KeyCtrlRight: "\x1b[1;5C", KeyCtrlUp: "\x1b[1;5A", KeyCtrlDown: "\x1b[1;5B", KeyMetaLeft: "\x1b[1;9D", KeyMetaRight: "\x1b[1;9C", KeyMetaUp: "\x1b[1;9A", KeyMetaDown: "\x1b[1;9B", KeyAltLeft: "\x1b[1;3D", KeyAltRight: "\x1b[1;3C", KeyAltUp: "\x1b[1;3A", KeyAltDown: "\x1b[1;3B", KeyAltShfLeft: "\x1b[1;4D", KeyAltShfRight: "\x1b[1;4C", KeyAltShfUp: "\x1b[1;4A", KeyAltShfDown: "\x1b[1;4B", KeyMetaShfLeft: "\x1b[1;10D", KeyMetaShfRight: "\x1b[1;10C", KeyMetaShfUp: "\x1b[1;10A", KeyMetaShfDown: "\x1b[1;10B", KeyCtrlShfLeft: "\x1b[1;6D", KeyCtrlShfRight: "\x1b[1;6C", KeyCtrlShfUp: "\x1b[1;6A", KeyCtrlShfDown: "\x1b[1;6B", KeyShfHome: "\x1b[1;2H", KeyShfEnd: "\x1b[1;2F", KeyCtrlHome: "\x1b[1;5H", KeyCtrlEnd: "\x1b[1;5F", KeyAltHome: "\x1b[1;9H", KeyAltEnd: "\x1b[1;9F", KeyCtrlShfHome: "\x1b[1;6H", KeyCtrlShfEnd: "\x1b[1;6F", KeyMetaShfHome: "\x1b[1;10H", KeyMetaShfEnd: "\x1b[1;10F", KeyAltShfHome: "\x1b[1;4H", KeyAltShfEnd: "\x1b[1;4F", }) // GNOME Terminal with xterm 256-colors terminfo.AddTerminfo(&terminfo.Terminfo{ Name: "gnome-256color", Columns: 80, Lines: 24, Colors: 256, Bell: "\a", Clear: "\x1b[H\x1b[2J", EnterCA: "\x1b7\x1b[?47h", ExitCA: "\x1b[2J\x1b[?47l\x1b8", ShowCursor: "\x1b[?25h", HideCursor: "\x1b[?25l", AttrOff: "\x1b[0m\x0f", Underline: "\x1b[4m", Bold: "\x1b[1m", Dim: "\x1b[2m", Reverse: "\x1b[7m", EnterKeypad: "\x1b[?1h\x1b=", ExitKeypad: "\x1b[?1l\x1b>", SetFg: "\x1b[%?%p1%{8}%<%t3%p1%d%e%p1%{16}%<%t9%p1%{8}%-%d%e38;5;%p1%d%;m", SetBg: "\x1b[%?%p1%{8}%<%t4%p1%d%e%p1%{16}%<%t10%p1%{8}%-%d%e48;5;%p1%d%;m", SetFgBg: "\x1b[%?%p1%{8}%<%t3%p1%d%e%p1%{16}%<%t9%p1%{8}%-%d%e38;5;%p1%d%;;%?%p2%{8}%<%t4%p2%d%e%p2%{16}%<%t10%p2%{8}%-%d%e48;5;%p2%d%;m", PadChar: "\x00", AltChars: "``aaffggiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~", EnterAcs: "\x0e", ExitAcs: "\x0f", EnableAcs: "\x1b)0", Mouse: "\x1b[<", MouseMode: "%?%p1%{1}%=%t%'h'%Pa%e%'l'%Pa%;\x1b[?1000%ga%c\x1b[?1002%ga%c\x1b[?1003%ga%c\x1b[?1006%ga%c", SetCursor: "\x1b[%i%p1%d;%p2%dH", CursorBack1: "\b", CursorUp1: "\x1b[A", KeyUp: "\x1bOA", KeyDown: "\x1bOB", KeyRight: "\x1bOC", KeyLeft: "\x1bOD", KeyInsert: "\x1b[2~", KeyDelete: "\x1b[3~", KeyBackspace: "\xff", KeyHome: "\x1bOH", KeyEnd: "\x1bOF", KeyPgUp: "\x1b[5~", KeyPgDn: "\x1b[6~", KeyF1: "\x1bOP", KeyF2: "\x1bOQ", KeyF3: "\x1bOR", KeyF4: "\x1bOS", KeyF5: "\x1b[15~", KeyF6: "\x1b[17~", KeyF7: "\x1b[18~", KeyF8: "\x1b[19~", KeyF9: "\x1b[20~", KeyF10: "\x1b[21~", KeyF11: "\x1b[23~", KeyF12: "\x1b[24~", KeyF13: "\x1b[1;2P", KeyF14: "\x1b[1;2Q", KeyF15: "\x1b[1;2R", KeyF16: "\x1b[1;2S", KeyF17: "\x1b[15;2~", KeyF18: "\x1b[17;2~", KeyF19: "\x1b[18;2~", KeyF20: "\x1b[19;2~", KeyF21: "\x1b[20;2~", KeyF22: "\x1b[21;2~", KeyF23: "\x1b[23;2~", KeyF24: "\x1b[24;2~", KeyF25: "\x1b[1;5P", KeyF26: "\x1b[1;5Q", KeyF27: "\x1b[1;5R", KeyF28: "\x1b[1;5S", KeyF29: "\x1b[15;5~", KeyF30: "\x1b[17;5~", KeyF31: "\x1b[18;5~", KeyF32: "\x1b[19;5~", KeyF33: "\x1b[20;5~", KeyF34: "\x1b[21;5~", KeyF35: "\x1b[23;5~", KeyF36: "\x1b[24;5~", KeyF37: "\x1b[1;6P", KeyF38: "\x1b[1;6Q", KeyF39: "\x1b[1;6R", KeyF40: "\x1b[1;6S", KeyF41: "\x1b[15;6~", KeyF42: "\x1b[17;6~", KeyF43: "\x1b[18;6~", KeyF44: "\x1b[19;6~", KeyF45: "\x1b[20;6~", KeyF46: "\x1b[21;6~", KeyF47: "\x1b[23;6~", KeyF48: "\x1b[24;6~", KeyF49: "\x1b[1;3P", KeyF50: "\x1b[1;3Q", KeyF51: "\x1b[1;3R", KeyF52: "\x1b[1;3S", KeyF53: "\x1b[15;3~", KeyF54: "\x1b[17;3~", KeyF55: "\x1b[18;3~", KeyF56: "\x1b[19;3~", KeyF57: "\x1b[20;3~", KeyF58: "\x1b[21;3~", KeyF59: "\x1b[23;3~", KeyF60: "\x1b[24;3~", KeyF61: "\x1b[1;4P", KeyF62: "\x1b[1;4Q", KeyF63: "\x1b[1;4R", KeyBacktab: "\x1b[Z", KeyShfLeft: "\x1b[1;2D", KeyShfRight: "\x1b[1;2C", KeyShfUp: "\x1b[1;2A", KeyShfDown: "\x1b[1;2B", KeyCtrlLeft: "\x1b[1;5D", KeyCtrlRight: "\x1b[1;5C", KeyCtrlUp: "\x1b[1;5A", KeyCtrlDown: "\x1b[1;5B", KeyMetaLeft: "\x1b[1;9D", KeyMetaRight: "\x1b[1;9C", KeyMetaUp: "\x1b[1;9A", KeyMetaDown: "\x1b[1;9B", KeyAltLeft: "\x1b[1;3D", KeyAltRight: "\x1b[1;3C", KeyAltUp: "\x1b[1;3A", KeyAltDown: "\x1b[1;3B", KeyAltShfLeft: "\x1b[1;4D", KeyAltShfRight: "\x1b[1;4C", KeyAltShfUp: "\x1b[1;4A", KeyAltShfDown: "\x1b[1;4B", KeyMetaShfLeft: "\x1b[1;10D", KeyMetaShfRight: "\x1b[1;10C", KeyMetaShfUp: "\x1b[1;10A", KeyMetaShfDown: "\x1b[1;10B", KeyCtrlShfLeft: "\x1b[1;6D", KeyCtrlShfRight: "\x1b[1;6C", KeyCtrlShfUp: "\x1b[1;6A", KeyCtrlShfDown: "\x1b[1;6B", KeyShfHome: "\x1b[1;2H", KeyShfEnd: "\x1b[1;2F", KeyCtrlHome: "\x1b[1;5H", KeyCtrlEnd: "\x1b[1;5F", KeyAltHome: "\x1b[1;9H", KeyAltEnd: "\x1b[1;9F", KeyCtrlShfHome: "\x1b[1;6H", KeyCtrlShfEnd: "\x1b[1;6F", KeyMetaShfHome: "\x1b[1;10H", KeyMetaShfEnd: "\x1b[1;10F", KeyAltShfHome: "\x1b[1;4H", KeyAltShfEnd: "\x1b[1;4F", }) } tcell-1.3.0/terminfo/gen.sh000066400000000000000000000006311354173511300155510ustar00rootroot00000000000000while read line do case "$line" in *'|'*) alias=${line#*|} line=${line%|*} ;; *) alias=${line%%,*} ;; esac alias=${alias//-/_} direc=${alias:0:1} mkdir -p ${direc}/${alias} go run mkinfo.go -P ${alias} -go ${direc}/${alias}/term.go ${line//,/ } done < models.txt tcell-1.3.0/terminfo/h/000077500000000000000000000000001354173511300146735ustar00rootroot00000000000000tcell-1.3.0/terminfo/h/hpterm/000077500000000000000000000000001354173511300161725ustar00rootroot00000000000000tcell-1.3.0/terminfo/h/hpterm/term.go000066400000000000000000000022411354173511300174670ustar00rootroot00000000000000// Generated automatically. DO NOT HAND-EDIT. package hpterm import "github.com/gdamore/tcell/terminfo" func init() { // hp X11 terminal emulator terminfo.AddTerminfo(&terminfo.Terminfo{ Name: "hpterm", Aliases: []string{"X-hpterm"}, Columns: 80, Lines: 24, Bell: "\a", Clear: "\x1b&a0y0C\x1bJ", AttrOff: "\x1b&d@\x0f", Underline: "\x1b&dD", Bold: "\x1b&dB", Dim: "\x1b&dH", Reverse: "\x1b&dB", EnterKeypad: "\x1b&s1A", ExitKeypad: "\x1b&s0A", PadChar: "\x00", EnterAcs: "\x0e", ExitAcs: "\x0f", SetCursor: "\x1b&a%p1%dy%p2%dC", CursorBack1: "\b", CursorUp1: "\x1bA", KeyUp: "\x1bA", KeyDown: "\x1bB", KeyRight: "\x1bC", KeyLeft: "\x1bD", KeyInsert: "\x1bQ", KeyDelete: "\x1bP", KeyBackspace: "\b", KeyHome: "\x1bh", KeyPgUp: "\x1bV", KeyPgDn: "\x1bU", KeyF1: "\x1bp", KeyF2: "\x1bq", KeyF3: "\x1br", KeyF4: "\x1bs", KeyF5: "\x1bt", KeyF6: "\x1bu", KeyF7: "\x1bv", KeyF8: "\x1bw", KeyClear: "\x1bJ", }) } tcell-1.3.0/terminfo/h/hz1500/000077500000000000000000000000001354173511300156225ustar00rootroot00000000000000tcell-1.3.0/terminfo/h/hz1500/term.go000066400000000000000000000010371354173511300171210ustar00rootroot00000000000000// Generated automatically. DO NOT HAND-EDIT. package hz1500 import "github.com/gdamore/tcell/terminfo" func init() { // hazeltine 1500 terminfo.AddTerminfo(&terminfo.Terminfo{ Name: "hz1500", Columns: 80, Lines: 24, Bell: "\a", Clear: "~\x1c", PadChar: "\x00", SetCursor: "~\x11%p2%p2%?%{30}%>%t%' '%+%;%'`'%+%c%p1%'`'%+%c", CursorBack1: "\b", CursorUp1: "~\f", KeyUp: "~\f", KeyDown: "\n", KeyRight: "\x10", KeyLeft: "\b", KeyHome: "~\x12", }) } tcell-1.3.0/terminfo/k/000077500000000000000000000000001354173511300146765ustar00rootroot00000000000000tcell-1.3.0/terminfo/k/konsole/000077500000000000000000000000001354173511300163505ustar00rootroot00000000000000tcell-1.3.0/terminfo/k/konsole/term.go000066400000000000000000000231741354173511300176550ustar00rootroot00000000000000// Generated automatically. DO NOT HAND-EDIT. package konsole import "github.com/gdamore/tcell/terminfo" func init() { // KDE console window terminfo.AddTerminfo(&terminfo.Terminfo{ Name: "konsole", Columns: 80, Lines: 24, Colors: 8, Clear: "\x1b[H\x1b[2J", EnterCA: "\x1b7\x1b[?47h", ExitCA: "\x1b[2J\x1b[?47l\x1b8", ShowCursor: "\x1b[?25h", HideCursor: "\x1b[?25l", AttrOff: "\x1b[0m\x0f", Underline: "\x1b[4m", Bold: "\x1b[1m", Dim: "\x1b[2m", Blink: "\x1b[5m", Reverse: "\x1b[7m", EnterKeypad: "\x1b[?1h\x1b=", ExitKeypad: "\x1b[?1l\x1b>", SetFg: "\x1b[3%p1%dm", SetBg: "\x1b[4%p1%dm", SetFgBg: "\x1b[3%p1%d;4%p2%dm", AltChars: "``aaffggiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~", EnterAcs: "\x0e", ExitAcs: "\x0f", EnableAcs: "\x1b)0", Mouse: "\x1b[M", MouseMode: "%?%p1%{1}%=%t%'h'%Pa%e%'l'%Pa%;\x1b[?1000%ga%c\x1b[?1002%ga%c\x1b[?1003%ga%c\x1b[?1006%ga%c", SetCursor: "\x1b[%i%p1%d;%p2%dH", CursorBack1: "\b", CursorUp1: "\x1b[A", KeyUp: "\x1bOA", KeyDown: "\x1bOB", KeyRight: "\x1bOC", KeyLeft: "\x1bOD", KeyInsert: "\x1b[2~", KeyDelete: "\x1b[3~", KeyBackspace: "\xff", KeyHome: "\x1bOH", KeyEnd: "\x1bOF", KeyPgUp: "\x1b[5~", KeyPgDn: "\x1b[6~", KeyF1: "\x1bOP", KeyF2: "\x1bOQ", KeyF3: "\x1bOR", KeyF4: "\x1bOS", KeyF5: "\x1b[15~", KeyF6: "\x1b[17~", KeyF7: "\x1b[18~", KeyF8: "\x1b[19~", KeyF9: "\x1b[20~", KeyF10: "\x1b[21~", KeyF11: "\x1b[23~", KeyF12: "\x1b[24~", KeyF13: "\x1bO2P", KeyF14: "\x1bO2Q", KeyF15: "\x1bO2R", KeyF16: "\x1bO2S", KeyF17: "\x1b[15;2~", KeyF18: "\x1b[17;2~", KeyF19: "\x1b[18;2~", KeyF20: "\x1b[19;2~", KeyF21: "\x1b[20;2~", KeyF22: "\x1b[21;2~", KeyF23: "\x1b[23;2~", KeyF24: "\x1b[24;2~", KeyF25: "\x1bO5P", KeyF26: "\x1bO5Q", KeyF27: "\x1bO5R", KeyF28: "\x1bO5S", KeyF29: "\x1b[15;5~", KeyF30: "\x1b[17;5~", KeyF31: "\x1b[18;5~", KeyF32: "\x1b[19;5~", KeyF33: "\x1b[20;5~", KeyF34: "\x1b[21;5~", KeyF35: "\x1b[23;5~", KeyF36: "\x1b[24;5~", KeyF37: "\x1bO6P", KeyF38: "\x1bO6Q", KeyF39: "\x1bO6R", KeyF40: "\x1bO6S", KeyF41: "\x1b[15;6~", KeyF42: "\x1b[17;6~", KeyF43: "\x1b[18;6~", KeyF44: "\x1b[19;6~", KeyF45: "\x1b[20;6~", KeyF46: "\x1b[21;6~", KeyF47: "\x1b[23;6~", KeyF48: "\x1b[24;6~", KeyF49: "\x1bO3P", KeyF50: "\x1bO3Q", KeyF51: "\x1bO3R", KeyF52: "\x1bO3S", KeyF53: "\x1b[15;3~", KeyF54: "\x1b[17;3~", KeyF55: "\x1b[18;3~", KeyF56: "\x1b[19;3~", KeyF57: "\x1b[20;3~", KeyF58: "\x1b[21;3~", KeyF59: "\x1b[23;3~", KeyF60: "\x1b[24;3~", KeyF61: "\x1bO4P", KeyF62: "\x1bO4Q", KeyF63: "\x1bO4R", KeyBacktab: "\x1b[Z", KeyShfLeft: "\x1b[1;2D", KeyShfRight: "\x1b[1;2C", KeyShfUp: "\x1b[1;2A", KeyShfDown: "\x1b[1;2B", KeyCtrlLeft: "\x1b[1;5D", KeyCtrlRight: "\x1b[1;5C", KeyCtrlUp: "\x1b[1;5A", KeyCtrlDown: "\x1b[1;5B", KeyMetaLeft: "\x1b[1;9D", KeyMetaRight: "\x1b[1;9C", KeyMetaUp: "\x1b[1;9A", KeyMetaDown: "\x1b[1;9B", KeyAltLeft: "\x1b[1;3D", KeyAltRight: "\x1b[1;3C", KeyAltUp: "\x1b[1;3A", KeyAltDown: "\x1b[1;3B", KeyAltShfLeft: "\x1b[1;4D", KeyAltShfRight: "\x1b[1;4C", KeyAltShfUp: "\x1b[1;4A", KeyAltShfDown: "\x1b[1;4B", KeyMetaShfLeft: "\x1b[1;10D", KeyMetaShfRight: "\x1b[1;10C", KeyMetaShfUp: "\x1b[1;10A", KeyMetaShfDown: "\x1b[1;10B", KeyCtrlShfLeft: "\x1b[1;6D", KeyCtrlShfRight: "\x1b[1;6C", KeyCtrlShfUp: "\x1b[1;6A", KeyCtrlShfDown: "\x1b[1;6B", KeyShfHome: "\x1b[1;2H", KeyShfEnd: "\x1b[1;2F", KeyCtrlHome: "\x1b[1;5H", KeyCtrlEnd: "\x1b[1;5F", KeyAltHome: "\x1b[1;9H", KeyAltEnd: "\x1b[1;9F", KeyCtrlShfHome: "\x1b[1;6H", KeyCtrlShfEnd: "\x1b[1;6F", KeyMetaShfHome: "\x1b[1;10H", KeyMetaShfEnd: "\x1b[1;10F", KeyAltShfHome: "\x1b[1;4H", KeyAltShfEnd: "\x1b[1;4F", }) // KDE console window with xterm 256-colors terminfo.AddTerminfo(&terminfo.Terminfo{ Name: "konsole-256color", Columns: 80, Lines: 24, Colors: 256, Clear: "\x1b[H\x1b[2J", EnterCA: "\x1b7\x1b[?47h", ExitCA: "\x1b[2J\x1b[?47l\x1b8", ShowCursor: "\x1b[?25h", HideCursor: "\x1b[?25l", AttrOff: "\x1b[0m\x0f", Underline: "\x1b[4m", Bold: "\x1b[1m", Dim: "\x1b[2m", Blink: "\x1b[5m", Reverse: "\x1b[7m", EnterKeypad: "\x1b[?1h\x1b=", ExitKeypad: "\x1b[?1l\x1b>", SetFg: "\x1b[%?%p1%{8}%<%t3%p1%d%e%p1%{16}%<%t9%p1%{8}%-%d%e38;5;%p1%d%;m", SetBg: "\x1b[%?%p1%{8}%<%t4%p1%d%e%p1%{16}%<%t10%p1%{8}%-%d%e48;5;%p1%d%;m", SetFgBg: "\x1b[%?%p1%{8}%<%t3%p1%d%e%p1%{16}%<%t9%p1%{8}%-%d%e38;5;%p1%d%;;%?%p2%{8}%<%t4%p2%d%e%p2%{16}%<%t10%p2%{8}%-%d%e48;5;%p2%d%;m", AltChars: "``aaffggiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~", EnterAcs: "\x0e", ExitAcs: "\x0f", EnableAcs: "\x1b)0", Mouse: "\x1b[M", MouseMode: "%?%p1%{1}%=%t%'h'%Pa%e%'l'%Pa%;\x1b[?1000%ga%c\x1b[?1002%ga%c\x1b[?1003%ga%c\x1b[?1006%ga%c", SetCursor: "\x1b[%i%p1%d;%p2%dH", CursorBack1: "\b", CursorUp1: "\x1b[A", KeyUp: "\x1bOA", KeyDown: "\x1bOB", KeyRight: "\x1bOC", KeyLeft: "\x1bOD", KeyInsert: "\x1b[2~", KeyDelete: "\x1b[3~", KeyBackspace: "\xff", KeyHome: "\x1bOH", KeyEnd: "\x1bOF", KeyPgUp: "\x1b[5~", KeyPgDn: "\x1b[6~", KeyF1: "\x1bOP", KeyF2: "\x1bOQ", KeyF3: "\x1bOR", KeyF4: "\x1bOS", KeyF5: "\x1b[15~", KeyF6: "\x1b[17~", KeyF7: "\x1b[18~", KeyF8: "\x1b[19~", KeyF9: "\x1b[20~", KeyF10: "\x1b[21~", KeyF11: "\x1b[23~", KeyF12: "\x1b[24~", KeyF13: "\x1bO2P", KeyF14: "\x1bO2Q", KeyF15: "\x1bO2R", KeyF16: "\x1bO2S", KeyF17: "\x1b[15;2~", KeyF18: "\x1b[17;2~", KeyF19: "\x1b[18;2~", KeyF20: "\x1b[19;2~", KeyF21: "\x1b[20;2~", KeyF22: "\x1b[21;2~", KeyF23: "\x1b[23;2~", KeyF24: "\x1b[24;2~", KeyF25: "\x1bO5P", KeyF26: "\x1bO5Q", KeyF27: "\x1bO5R", KeyF28: "\x1bO5S", KeyF29: "\x1b[15;5~", KeyF30: "\x1b[17;5~", KeyF31: "\x1b[18;5~", KeyF32: "\x1b[19;5~", KeyF33: "\x1b[20;5~", KeyF34: "\x1b[21;5~", KeyF35: "\x1b[23;5~", KeyF36: "\x1b[24;5~", KeyF37: "\x1bO6P", KeyF38: "\x1bO6Q", KeyF39: "\x1bO6R", KeyF40: "\x1bO6S", KeyF41: "\x1b[15;6~", KeyF42: "\x1b[17;6~", KeyF43: "\x1b[18;6~", KeyF44: "\x1b[19;6~", KeyF45: "\x1b[20;6~", KeyF46: "\x1b[21;6~", KeyF47: "\x1b[23;6~", KeyF48: "\x1b[24;6~", KeyF49: "\x1bO3P", KeyF50: "\x1bO3Q", KeyF51: "\x1bO3R", KeyF52: "\x1bO3S", KeyF53: "\x1b[15;3~", KeyF54: "\x1b[17;3~", KeyF55: "\x1b[18;3~", KeyF56: "\x1b[19;3~", KeyF57: "\x1b[20;3~", KeyF58: "\x1b[21;3~", KeyF59: "\x1b[23;3~", KeyF60: "\x1b[24;3~", KeyF61: "\x1bO4P", KeyF62: "\x1bO4Q", KeyF63: "\x1bO4R", KeyBacktab: "\x1b[Z", KeyShfLeft: "\x1b[1;2D", KeyShfRight: "\x1b[1;2C", KeyShfUp: "\x1b[1;2A", KeyShfDown: "\x1b[1;2B", KeyCtrlLeft: "\x1b[1;5D", KeyCtrlRight: "\x1b[1;5C", KeyCtrlUp: "\x1b[1;5A", KeyCtrlDown: "\x1b[1;5B", KeyMetaLeft: "\x1b[1;9D", KeyMetaRight: "\x1b[1;9C", KeyMetaUp: "\x1b[1;9A", KeyMetaDown: "\x1b[1;9B", KeyAltLeft: "\x1b[1;3D", KeyAltRight: "\x1b[1;3C", KeyAltUp: "\x1b[1;3A", KeyAltDown: "\x1b[1;3B", KeyAltShfLeft: "\x1b[1;4D", KeyAltShfRight: "\x1b[1;4C", KeyAltShfUp: "\x1b[1;4A", KeyAltShfDown: "\x1b[1;4B", KeyMetaShfLeft: "\x1b[1;10D", KeyMetaShfRight: "\x1b[1;10C", KeyMetaShfUp: "\x1b[1;10A", KeyMetaShfDown: "\x1b[1;10B", KeyCtrlShfLeft: "\x1b[1;6D", KeyCtrlShfRight: "\x1b[1;6C", KeyCtrlShfUp: "\x1b[1;6A", KeyCtrlShfDown: "\x1b[1;6B", KeyShfHome: "\x1b[1;2H", KeyShfEnd: "\x1b[1;2F", KeyCtrlHome: "\x1b[1;5H", KeyCtrlEnd: "\x1b[1;5F", KeyAltHome: "\x1b[1;9H", KeyAltEnd: "\x1b[1;9F", KeyCtrlShfHome: "\x1b[1;6H", KeyCtrlShfEnd: "\x1b[1;6F", KeyMetaShfHome: "\x1b[1;10H", KeyMetaShfEnd: "\x1b[1;10F", KeyAltShfHome: "\x1b[1;4H", KeyAltShfEnd: "\x1b[1;4F", }) } tcell-1.3.0/terminfo/k/kterm/000077500000000000000000000000001354173511300160205ustar00rootroot00000000000000tcell-1.3.0/terminfo/k/kterm/term.go000066400000000000000000000035161354173511300173230ustar00rootroot00000000000000// Generated automatically. DO NOT HAND-EDIT. package kterm import "github.com/gdamore/tcell/terminfo" func init() { // kterm kanji terminal emulator (X window system) terminfo.AddTerminfo(&terminfo.Terminfo{ Name: "kterm", Columns: 80, Lines: 24, Colors: 8, Bell: "\a", Clear: "\x1b[H\x1b[2J", EnterCA: "\x1b7\x1b[?47h", ExitCA: "\x1b[2J\x1b[?47l\x1b8", AttrOff: "\x1b[m\x1b(B", Underline: "\x1b[4m", Bold: "\x1b[1m", Reverse: "\x1b[7m", EnterKeypad: "\x1b[?1h\x1b=", ExitKeypad: "\x1b[?1l\x1b>", SetFg: "\x1b[3%p1%dm", SetBg: "\x1b[4%p1%dm", SetFgBg: "\x1b[3%p1%d;4%p2%dm", PadChar: "\x00", AltChars: "``aajjkkllmmnnooppqqrrssttuuvvwwxx~~", EnterAcs: "\x1b(0", ExitAcs: "\x1b(B", Mouse: "\x1b[M", MouseMode: "%?%p1%{1}%=%t%'h'%Pa%e%'l'%Pa%;\x1b[?1000%ga%c\x1b[?1002%ga%c\x1b[?1003%ga%c\x1b[?1006%ga%c", SetCursor: "\x1b[%i%p1%d;%p2%dH", CursorBack1: "\b", CursorUp1: "\x1b[A", KeyUp: "\x1bOA", KeyDown: "\x1bOB", KeyRight: "\x1bOC", KeyLeft: "\x1bOD", KeyInsert: "\x1b[2~", KeyDelete: "\x1b[3~", KeyBackspace: "\xff", KeyPgUp: "\x1b[5~", KeyPgDn: "\x1b[6~", KeyF1: "\x1b[11~", KeyF2: "\x1b[12~", KeyF3: "\x1b[13~", KeyF4: "\x1b[14~", KeyF5: "\x1b[15~", KeyF6: "\x1b[17~", KeyF7: "\x1b[18~", KeyF8: "\x1b[19~", KeyF9: "\x1b[20~", KeyF10: "\x1b[21~", KeyF11: "\x1b[23~", KeyF12: "\x1b[24~", KeyF13: "\x1b[25~", KeyF14: "\x1b[26~", KeyF15: "\x1b[28~", KeyF16: "\x1b[29~", KeyF17: "\x1b[31~", KeyF18: "\x1b[32~", KeyF19: "\x1b[33~", KeyF20: "\x1b[34~", }) } tcell-1.3.0/terminfo/l/000077500000000000000000000000001354173511300146775ustar00rootroot00000000000000tcell-1.3.0/terminfo/l/linux/000077500000000000000000000000001354173511300160365ustar00rootroot00000000000000tcell-1.3.0/terminfo/l/linux/term.go000066400000000000000000000035631354173511300173430ustar00rootroot00000000000000// Generated automatically. DO NOT HAND-EDIT. package linux import "github.com/gdamore/tcell/terminfo" func init() { // linux console terminfo.AddTerminfo(&terminfo.Terminfo{ Name: "linux", Colors: 8, Bell: "\a", Clear: "\x1b[H\x1b[J", ShowCursor: "\x1b[?25h\x1b[?0c", HideCursor: "\x1b[?25l\x1b[?1c", AttrOff: "\x1b[m\x0f", Underline: "\x1b[4m", Bold: "\x1b[1m", Dim: "\x1b[2m", Blink: "\x1b[5m", Reverse: "\x1b[7m", SetFg: "\x1b[3%p1%dm", SetBg: "\x1b[4%p1%dm", SetFgBg: "\x1b[3%p1%d;4%p2%dm", PadChar: "\x00", AltChars: "++,,--..00__``aaffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}c~~", EnterAcs: "\x0e", ExitAcs: "\x0f", EnableAcs: "\x1b)0", Mouse: "\x1b[M", MouseMode: "%?%p1%{1}%=%t%'h'%Pa%e%'l'%Pa%;\x1b[?1000%ga%c\x1b[?1002%ga%c\x1b[?1003%ga%c\x1b[?1006%ga%c", SetCursor: "\x1b[%i%p1%d;%p2%dH", CursorBack1: "\b", CursorUp1: "\x1b[A", KeyUp: "\x1b[A", KeyDown: "\x1b[B", KeyRight: "\x1b[C", KeyLeft: "\x1b[D", KeyInsert: "\x1b[2~", KeyDelete: "\x1b[3~", KeyBackspace: "\xff", KeyHome: "\x1b[1~", KeyEnd: "\x1b[4~", KeyPgUp: "\x1b[5~", KeyPgDn: "\x1b[6~", KeyF1: "\x1b[[A", KeyF2: "\x1b[[B", KeyF3: "\x1b[[C", KeyF4: "\x1b[[D", KeyF5: "\x1b[[E", KeyF6: "\x1b[17~", KeyF7: "\x1b[18~", KeyF8: "\x1b[19~", KeyF9: "\x1b[20~", KeyF10: "\x1b[21~", KeyF11: "\x1b[23~", KeyF12: "\x1b[24~", KeyF13: "\x1b[25~", KeyF14: "\x1b[26~", KeyF15: "\x1b[28~", KeyF16: "\x1b[29~", KeyF17: "\x1b[31~", KeyF18: "\x1b[32~", KeyF19: "\x1b[33~", KeyF20: "\x1b[34~", KeyBacktab: "\x1b[Z", }) } tcell-1.3.0/terminfo/mkinfo.go000066400000000000000000000526451354173511300162720ustar00rootroot00000000000000// +build ignore // Copyright 2019 The TCell Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use file except in compliance with the License. // You may obtain a copy of the license at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. // This command is used to generate suitable configuration files in either // go syntax or in JSON. It defaults to JSON output on stdout. If no // term values are specified on the command line, then $TERM is used. // // Usage is like this: // // mkinfo [-go file.go] [-quiet] [-nofatal] [-I ] [-P ...] // // -go specifies Go output into the named file. Use - for stdout. // -nofatal indicates that errors loading definitions should not be fatal // -P pkg use the supplied package name // -I import use the named import instead of github.com/gdamore/tcell/terminfo // package main import ( "bytes" "errors" "flag" "fmt" "io" "os" "os/exec" "regexp" "strconv" "strings" "github.com/gdamore/tcell/terminfo" ) type termcap struct { name string desc string aliases []string bools map[string]bool nums map[string]int strs map[string]string } func (tc *termcap) getnum(s string) int { return (tc.nums[s]) } func (tc *termcap) getflag(s string) bool { return (tc.bools[s]) } func (tc *termcap) getstr(s string) string { return (tc.strs[s]) } const ( NONE = iota CTRL ESC ) var notaddressable = errors.New("terminal not cursor addressable") func unescape(s string) string { // Various escapes are in \x format. Control codes are // encoded as ^M (carat followed by ASCII equivalent). // Escapes are: \e, \E - escape // \0 NULL, \n \l \r \t \b \f \s for equivalent C escape. buf := &bytes.Buffer{} esc := NONE for i := 0; i < len(s); i++ { c := s[i] switch esc { case NONE: switch c { case '\\': esc = ESC case '^': esc = CTRL default: buf.WriteByte(c) } case CTRL: buf.WriteByte(c - 0x40) esc = NONE case ESC: switch c { case 'E', 'e': buf.WriteByte(0x1b) case '0', '1', '2', '3', '4', '5', '6', '7': if i+2 < len(s) && s[i+1] >= '0' && s[i+1] <= '7' && s[i+2] >= '0' && s[i+2] <= '7' { buf.WriteByte(((c - '0') * 64) + ((s[i+1] - '0') * 8) + (s[i+2] - '0')) i = i + 2 } else if c == '0' { buf.WriteByte(0) } case 'n': buf.WriteByte('\n') case 'r': buf.WriteByte('\r') case 't': buf.WriteByte('\t') case 'b': buf.WriteByte('\b') case 'f': buf.WriteByte('\f') case 's': buf.WriteByte(' ') case 'l': panic("WTF: weird format: " + s) default: buf.WriteByte(c) } esc = NONE } } return (buf.String()) } func (tc *termcap) setupterm(name string) error { cmd := exec.Command("infocmp", "-1", name) output := &bytes.Buffer{} cmd.Stdout = output tc.strs = make(map[string]string) tc.bools = make(map[string]bool) tc.nums = make(map[string]int) err := cmd.Run() if err != nil { return err } // Now parse the output. // We get comment lines (starting with "#"), followed by // a header line that looks like "||...|" // then capabilities, one per line, starting with a tab and ending // with a comma and newline. lines := strings.Split(output.String(), "\n") for len(lines) > 0 && strings.HasPrefix(lines[0], "#") { lines = lines[1:] } // Ditch trailing empty last line if lines[len(lines)-1] == "" { lines = lines[:len(lines)-1] } header := lines[0] if strings.HasSuffix(header, ",") { header = header[:len(header)-1] } names := strings.Split(header, "|") tc.name = names[0] names = names[1:] if len(names) > 0 { tc.desc = names[len(names)-1] names = names[:len(names)-1] } tc.aliases = names for _, val := range lines[1:] { if (!strings.HasPrefix(val, "\t")) || (!strings.HasSuffix(val, ",")) { return (errors.New("malformed infocmp: " + val)) } val = val[1:] val = val[:len(val)-1] if k := strings.SplitN(val, "=", 2); len(k) == 2 { tc.strs[k[0]] = unescape(k[1]) } else if k := strings.SplitN(val, "#", 2); len(k) == 2 { if u, err := strconv.ParseUint(k[1], 0, 0); err != nil { return (err) } else { tc.nums[k[0]] = int(u) } } else { tc.bools[val] = true } } return nil } // This program is used to collect data from the system's terminfo library, // and write it into Go source code. That is, we maintain our terminfo // capabilities encoded in the program. It should never need to be run by // an end user, but developers can use this to add codes for additional // terminal types. func getinfo(name string) (*terminfo.Terminfo, string, error) { var tc termcap if err := tc.setupterm(name); err != nil { if err != nil { return nil, "", err } } t := &terminfo.Terminfo{} // If this is an alias record, then just emit the alias t.Name = tc.name if t.Name != name { return t, "", nil } t.Aliases = tc.aliases t.Colors = tc.getnum("colors") t.Columns = tc.getnum("cols") t.Lines = tc.getnum("lines") t.Bell = tc.getstr("bel") t.Clear = tc.getstr("clear") t.EnterCA = tc.getstr("smcup") t.ExitCA = tc.getstr("rmcup") t.ShowCursor = tc.getstr("cnorm") t.HideCursor = tc.getstr("civis") t.AttrOff = tc.getstr("sgr0") t.Underline = tc.getstr("smul") t.Bold = tc.getstr("bold") t.Blink = tc.getstr("blink") t.Dim = tc.getstr("dim") t.Reverse = tc.getstr("rev") t.EnterKeypad = tc.getstr("smkx") t.ExitKeypad = tc.getstr("rmkx") t.SetFg = tc.getstr("setaf") t.SetBg = tc.getstr("setab") t.SetCursor = tc.getstr("cup") t.CursorBack1 = tc.getstr("cub1") t.CursorUp1 = tc.getstr("cuu1") t.KeyF1 = tc.getstr("kf1") t.KeyF2 = tc.getstr("kf2") t.KeyF3 = tc.getstr("kf3") t.KeyF4 = tc.getstr("kf4") t.KeyF5 = tc.getstr("kf5") t.KeyF6 = tc.getstr("kf6") t.KeyF7 = tc.getstr("kf7") t.KeyF8 = tc.getstr("kf8") t.KeyF9 = tc.getstr("kf9") t.KeyF10 = tc.getstr("kf10") t.KeyF11 = tc.getstr("kf11") t.KeyF12 = tc.getstr("kf12") t.KeyF13 = tc.getstr("kf13") t.KeyF14 = tc.getstr("kf14") t.KeyF15 = tc.getstr("kf15") t.KeyF16 = tc.getstr("kf16") t.KeyF17 = tc.getstr("kf17") t.KeyF18 = tc.getstr("kf18") t.KeyF19 = tc.getstr("kf19") t.KeyF20 = tc.getstr("kf20") t.KeyF21 = tc.getstr("kf21") t.KeyF22 = tc.getstr("kf22") t.KeyF23 = tc.getstr("kf23") t.KeyF24 = tc.getstr("kf24") t.KeyF25 = tc.getstr("kf25") t.KeyF26 = tc.getstr("kf26") t.KeyF27 = tc.getstr("kf27") t.KeyF28 = tc.getstr("kf28") t.KeyF29 = tc.getstr("kf29") t.KeyF30 = tc.getstr("kf30") t.KeyF31 = tc.getstr("kf31") t.KeyF32 = tc.getstr("kf32") t.KeyF33 = tc.getstr("kf33") t.KeyF34 = tc.getstr("kf34") t.KeyF35 = tc.getstr("kf35") t.KeyF36 = tc.getstr("kf36") t.KeyF37 = tc.getstr("kf37") t.KeyF38 = tc.getstr("kf38") t.KeyF39 = tc.getstr("kf39") t.KeyF40 = tc.getstr("kf40") t.KeyF41 = tc.getstr("kf41") t.KeyF42 = tc.getstr("kf42") t.KeyF43 = tc.getstr("kf43") t.KeyF44 = tc.getstr("kf44") t.KeyF45 = tc.getstr("kf45") t.KeyF46 = tc.getstr("kf46") t.KeyF47 = tc.getstr("kf47") t.KeyF48 = tc.getstr("kf48") t.KeyF49 = tc.getstr("kf49") t.KeyF50 = tc.getstr("kf50") t.KeyF51 = tc.getstr("kf51") t.KeyF52 = tc.getstr("kf52") t.KeyF53 = tc.getstr("kf53") t.KeyF54 = tc.getstr("kf54") t.KeyF55 = tc.getstr("kf55") t.KeyF56 = tc.getstr("kf56") t.KeyF57 = tc.getstr("kf57") t.KeyF58 = tc.getstr("kf58") t.KeyF59 = tc.getstr("kf59") t.KeyF60 = tc.getstr("kf60") t.KeyF61 = tc.getstr("kf61") t.KeyF62 = tc.getstr("kf62") t.KeyF63 = tc.getstr("kf63") t.KeyF64 = tc.getstr("kf64") t.KeyInsert = tc.getstr("kich1") t.KeyDelete = tc.getstr("kdch1") t.KeyBackspace = tc.getstr("kbs") t.KeyHome = tc.getstr("khome") t.KeyEnd = tc.getstr("kend") t.KeyUp = tc.getstr("kcuu1") t.KeyDown = tc.getstr("kcud1") t.KeyRight = tc.getstr("kcuf1") t.KeyLeft = tc.getstr("kcub1") t.KeyPgDn = tc.getstr("knp") t.KeyPgUp = tc.getstr("kpp") t.KeyBacktab = tc.getstr("kcbt") t.KeyExit = tc.getstr("kext") t.KeyCancel = tc.getstr("kcan") t.KeyPrint = tc.getstr("kprt") t.KeyHelp = tc.getstr("khlp") t.KeyClear = tc.getstr("kclr") t.AltChars = tc.getstr("acsc") t.EnterAcs = tc.getstr("smacs") t.ExitAcs = tc.getstr("rmacs") t.EnableAcs = tc.getstr("enacs") t.Mouse = tc.getstr("kmous") t.KeyShfRight = tc.getstr("kRIT") t.KeyShfLeft = tc.getstr("kLFT") t.KeyShfHome = tc.getstr("kHOM") t.KeyShfEnd = tc.getstr("kEND") // Terminfo lacks descriptions for a bunch of modified keys, // but modern XTerm and emulators often have them. Let's add them, // if the shifted right and left arrows are defined. if t.KeyShfRight == "\x1b[1;2C" && t.KeyShfLeft == "\x1b[1;2D" { t.KeyShfUp = "\x1b[1;2A" t.KeyShfDown = "\x1b[1;2B" t.KeyMetaUp = "\x1b[1;9A" t.KeyMetaDown = "\x1b[1;9B" t.KeyMetaRight = "\x1b[1;9C" t.KeyMetaLeft = "\x1b[1;9D" t.KeyAltUp = "\x1b[1;3A" t.KeyAltDown = "\x1b[1;3B" t.KeyAltRight = "\x1b[1;3C" t.KeyAltLeft = "\x1b[1;3D" t.KeyCtrlUp = "\x1b[1;5A" t.KeyCtrlDown = "\x1b[1;5B" t.KeyCtrlRight = "\x1b[1;5C" t.KeyCtrlLeft = "\x1b[1;5D" t.KeyAltShfUp = "\x1b[1;4A" t.KeyAltShfDown = "\x1b[1;4B" t.KeyAltShfRight = "\x1b[1;4C" t.KeyAltShfLeft = "\x1b[1;4D" t.KeyMetaShfUp = "\x1b[1;10A" t.KeyMetaShfDown = "\x1b[1;10B" t.KeyMetaShfRight = "\x1b[1;10C" t.KeyMetaShfLeft = "\x1b[1;10D" t.KeyCtrlShfUp = "\x1b[1;6A" t.KeyCtrlShfDown = "\x1b[1;6B" t.KeyCtrlShfRight = "\x1b[1;6C" t.KeyCtrlShfLeft = "\x1b[1;6D" } // And also for Home and End if t.KeyShfHome == "\x1b[1;2H" && t.KeyShfEnd == "\x1b[1;2F" { t.KeyCtrlHome = "\x1b[1;5H" t.KeyCtrlEnd = "\x1b[1;5F" t.KeyAltHome = "\x1b[1;9H" t.KeyAltEnd = "\x1b[1;9F" t.KeyCtrlShfHome = "\x1b[1;6H" t.KeyCtrlShfEnd = "\x1b[1;6F" t.KeyAltShfHome = "\x1b[1;4H" t.KeyAltShfEnd = "\x1b[1;4F" t.KeyMetaShfHome = "\x1b[1;10H" t.KeyMetaShfEnd = "\x1b[1;10F" } // And the same thing for rxvt and workalikes (Eterm, aterm, etc.) // It seems that urxvt at least send ESC as ALT prefix for these, // although some places seem to indicate a separate ALT key sesquence. if t.KeyShfRight == "\x1b[c" && t.KeyShfLeft == "\x1b[d" { t.KeyShfUp = "\x1b[a" t.KeyShfDown = "\x1b[b" t.KeyCtrlUp = "\x1b[Oa" t.KeyCtrlDown = "\x1b[Ob" t.KeyCtrlRight = "\x1b[Oc" t.KeyCtrlLeft = "\x1b[Od" } if t.KeyShfHome == "\x1b[7$" && t.KeyShfEnd == "\x1b[8$" { t.KeyCtrlHome = "\x1b[7^" t.KeyCtrlEnd = "\x1b[8^" } // If the kmous entry is present, then we need to record the // the codes to enter and exit mouse mode. Sadly, this is not // part of the terminfo databases anywhere that I've found, but // is an extension. The escape codes are documented in the XTerm // manual, and all terminals that have kmous are expected to // use these same codes, unless explicitly configured otherwise // vi XM. Note that in any event, we only known how to parse either // x11 or SGR mouse events -- if your terminal doesn't support one // of these two forms, you maybe out of luck. t.MouseMode = tc.getstr("XM") if t.Mouse != "" && t.MouseMode == "" { // we anticipate that all xterm mouse tracking compatible // terminals understand mouse tracking (1000), but we hope // that those that don't understand any-event tracking (1003) // will at least ignore it. Likewise we hope that terminals // that don't understand SGR reporting (1006) just ignore it. t.MouseMode = "%?%p1%{1}%=%t%'h'%Pa%e%'l'%Pa%;" + "\x1b[?1000%ga%c\x1b[?1002%ga%c\x1b[?1003%ga%c\x1b[?1006%ga%c" } // We only support colors in ANSI 8 or 256 color mode. if t.Colors < 8 || t.SetFg == "" { t.Colors = 0 } if t.SetCursor == "" { return nil, "", notaddressable } // For padding, we lookup the pad char. If that isn't present, // and npc is *not* set, then we assume a null byte. t.PadChar = tc.getstr("pad") if t.PadChar == "" { if !tc.getflag("npc") { t.PadChar = "\u0000" } } // For terminals that use "standard" SGR sequences, lets combine the // foreground and background together. if strings.HasPrefix(t.SetFg, "\x1b[") && strings.HasPrefix(t.SetBg, "\x1b[") && strings.HasSuffix(t.SetFg, "m") && strings.HasSuffix(t.SetBg, "m") { fg := t.SetFg[:len(t.SetFg)-1] r := regexp.MustCompile("%p1") bg := r.ReplaceAllString(t.SetBg[2:], "%p2") t.SetFgBg = fg + ";" + bg } return t, tc.desc, nil } func dotGoAddInt(w io.Writer, n string, i int) { if i == 0 { // initialized to 0, ignore return } fmt.Fprintf(w, "\t\t%-13s %d,\n", n+":", i) } func dotGoAddStr(w io.Writer, n string, s string) { if s == "" { return } fmt.Fprintf(w, "\t\t%-13s %q,\n", n+":", s) } func dotGoAddArr(w io.Writer, n string, a []string) { if len(a) == 0 { return } fmt.Fprintf(w, "\t\t%-13s []string{", n+":") did := false for _, b := range a { if did { fmt.Fprint(w, ", ") } did = true fmt.Fprintf(w, "%q", b) } fmt.Fprintln(w, "},") } func dotGoHeader(w io.Writer, packname, tipackname string) { fmt.Fprintln(w, "// Generated automatically. DO NOT HAND-EDIT.") fmt.Fprintln(w, "") fmt.Fprintf(w, "package %s\n", packname) fmt.Fprintln(w, "") fmt.Fprintf(w, "import \"%s\"\n", tipackname) fmt.Fprintln(w, "") } func dotGoTrailer(w io.Writer) { } func dotGoInfo(w io.Writer, terms []*TData) { fmt.Fprintln(w, "func init() {") for _, t := range terms { fmt.Fprintf(w, "\n\t// %s\n", t.Desc) fmt.Fprintln(w, "\tterminfo.AddTerminfo(&terminfo.Terminfo{") dotGoAddStr(w, "Name", t.Name) dotGoAddArr(w, "Aliases", t.Aliases) dotGoAddInt(w, "Columns", t.Columns) dotGoAddInt(w, "Lines", t.Lines) dotGoAddInt(w, "Colors", t.Colors) dotGoAddStr(w, "Bell", t.Bell) dotGoAddStr(w, "Clear", t.Clear) dotGoAddStr(w, "EnterCA", t.EnterCA) dotGoAddStr(w, "ExitCA", t.ExitCA) dotGoAddStr(w, "ShowCursor", t.ShowCursor) dotGoAddStr(w, "HideCursor", t.HideCursor) dotGoAddStr(w, "AttrOff", t.AttrOff) dotGoAddStr(w, "Underline", t.Underline) dotGoAddStr(w, "Bold", t.Bold) dotGoAddStr(w, "Dim", t.Dim) dotGoAddStr(w, "Blink", t.Blink) dotGoAddStr(w, "Reverse", t.Reverse) dotGoAddStr(w, "EnterKeypad", t.EnterKeypad) dotGoAddStr(w, "ExitKeypad", t.ExitKeypad) dotGoAddStr(w, "SetFg", t.SetFg) dotGoAddStr(w, "SetBg", t.SetBg) dotGoAddStr(w, "SetFgBg", t.SetFgBg) dotGoAddStr(w, "PadChar", t.PadChar) dotGoAddStr(w, "AltChars", t.AltChars) dotGoAddStr(w, "EnterAcs", t.EnterAcs) dotGoAddStr(w, "ExitAcs", t.ExitAcs) dotGoAddStr(w, "EnableAcs", t.EnableAcs) dotGoAddStr(w, "SetFgRGB", t.SetFgRGB) dotGoAddStr(w, "SetBgRGB", t.SetBgRGB) dotGoAddStr(w, "SetFgBgRGB", t.SetFgBgRGB) dotGoAddStr(w, "Mouse", t.Mouse) dotGoAddStr(w, "MouseMode", t.MouseMode) dotGoAddStr(w, "SetCursor", t.SetCursor) dotGoAddStr(w, "CursorBack1", t.CursorBack1) dotGoAddStr(w, "CursorUp1", t.CursorUp1) dotGoAddStr(w, "KeyUp", t.KeyUp) dotGoAddStr(w, "KeyDown", t.KeyDown) dotGoAddStr(w, "KeyRight", t.KeyRight) dotGoAddStr(w, "KeyLeft", t.KeyLeft) dotGoAddStr(w, "KeyInsert", t.KeyInsert) dotGoAddStr(w, "KeyDelete", t.KeyDelete) dotGoAddStr(w, "KeyBackspace", t.KeyBackspace) dotGoAddStr(w, "KeyHome", t.KeyHome) dotGoAddStr(w, "KeyEnd", t.KeyEnd) dotGoAddStr(w, "KeyPgUp", t.KeyPgUp) dotGoAddStr(w, "KeyPgDn", t.KeyPgDn) dotGoAddStr(w, "KeyF1", t.KeyF1) dotGoAddStr(w, "KeyF2", t.KeyF2) dotGoAddStr(w, "KeyF3", t.KeyF3) dotGoAddStr(w, "KeyF4", t.KeyF4) dotGoAddStr(w, "KeyF5", t.KeyF5) dotGoAddStr(w, "KeyF6", t.KeyF6) dotGoAddStr(w, "KeyF7", t.KeyF7) dotGoAddStr(w, "KeyF8", t.KeyF8) dotGoAddStr(w, "KeyF9", t.KeyF9) dotGoAddStr(w, "KeyF10", t.KeyF10) dotGoAddStr(w, "KeyF11", t.KeyF11) dotGoAddStr(w, "KeyF12", t.KeyF12) dotGoAddStr(w, "KeyF13", t.KeyF13) dotGoAddStr(w, "KeyF14", t.KeyF14) dotGoAddStr(w, "KeyF15", t.KeyF15) dotGoAddStr(w, "KeyF16", t.KeyF16) dotGoAddStr(w, "KeyF17", t.KeyF17) dotGoAddStr(w, "KeyF18", t.KeyF18) dotGoAddStr(w, "KeyF19", t.KeyF19) dotGoAddStr(w, "KeyF20", t.KeyF20) dotGoAddStr(w, "KeyF21", t.KeyF21) dotGoAddStr(w, "KeyF22", t.KeyF22) dotGoAddStr(w, "KeyF23", t.KeyF23) dotGoAddStr(w, "KeyF24", t.KeyF24) dotGoAddStr(w, "KeyF25", t.KeyF25) dotGoAddStr(w, "KeyF26", t.KeyF26) dotGoAddStr(w, "KeyF27", t.KeyF27) dotGoAddStr(w, "KeyF28", t.KeyF28) dotGoAddStr(w, "KeyF29", t.KeyF29) dotGoAddStr(w, "KeyF30", t.KeyF30) dotGoAddStr(w, "KeyF31", t.KeyF31) dotGoAddStr(w, "KeyF32", t.KeyF32) dotGoAddStr(w, "KeyF33", t.KeyF33) dotGoAddStr(w, "KeyF34", t.KeyF34) dotGoAddStr(w, "KeyF35", t.KeyF35) dotGoAddStr(w, "KeyF36", t.KeyF36) dotGoAddStr(w, "KeyF37", t.KeyF37) dotGoAddStr(w, "KeyF38", t.KeyF38) dotGoAddStr(w, "KeyF39", t.KeyF39) dotGoAddStr(w, "KeyF40", t.KeyF40) dotGoAddStr(w, "KeyF41", t.KeyF41) dotGoAddStr(w, "KeyF42", t.KeyF42) dotGoAddStr(w, "KeyF43", t.KeyF43) dotGoAddStr(w, "KeyF44", t.KeyF44) dotGoAddStr(w, "KeyF45", t.KeyF45) dotGoAddStr(w, "KeyF46", t.KeyF46) dotGoAddStr(w, "KeyF47", t.KeyF47) dotGoAddStr(w, "KeyF48", t.KeyF48) dotGoAddStr(w, "KeyF49", t.KeyF49) dotGoAddStr(w, "KeyF50", t.KeyF50) dotGoAddStr(w, "KeyF51", t.KeyF51) dotGoAddStr(w, "KeyF52", t.KeyF52) dotGoAddStr(w, "KeyF53", t.KeyF53) dotGoAddStr(w, "KeyF54", t.KeyF54) dotGoAddStr(w, "KeyF55", t.KeyF55) dotGoAddStr(w, "KeyF56", t.KeyF56) dotGoAddStr(w, "KeyF57", t.KeyF57) dotGoAddStr(w, "KeyF58", t.KeyF58) dotGoAddStr(w, "KeyF59", t.KeyF59) dotGoAddStr(w, "KeyF60", t.KeyF60) dotGoAddStr(w, "KeyF61", t.KeyF61) dotGoAddStr(w, "KeyF62", t.KeyF62) dotGoAddStr(w, "KeyF63", t.KeyF63) dotGoAddStr(w, "KeyF64", t.KeyF64) dotGoAddStr(w, "KeyCancel", t.KeyCancel) dotGoAddStr(w, "KeyPrint", t.KeyPrint) dotGoAddStr(w, "KeyExit", t.KeyExit) dotGoAddStr(w, "KeyHelp", t.KeyHelp) dotGoAddStr(w, "KeyClear", t.KeyClear) dotGoAddStr(w, "KeyBacktab", t.KeyBacktab) dotGoAddStr(w, "KeyShfLeft", t.KeyShfLeft) dotGoAddStr(w, "KeyShfRight", t.KeyShfRight) dotGoAddStr(w, "KeyShfUp", t.KeyShfUp) dotGoAddStr(w, "KeyShfDown", t.KeyShfDown) dotGoAddStr(w, "KeyCtrlLeft", t.KeyCtrlLeft) dotGoAddStr(w, "KeyCtrlRight", t.KeyCtrlRight) dotGoAddStr(w, "KeyCtrlUp", t.KeyCtrlUp) dotGoAddStr(w, "KeyCtrlDown", t.KeyCtrlDown) dotGoAddStr(w, "KeyMetaLeft", t.KeyMetaLeft) dotGoAddStr(w, "KeyMetaRight", t.KeyMetaRight) dotGoAddStr(w, "KeyMetaUp", t.KeyMetaUp) dotGoAddStr(w, "KeyMetaDown", t.KeyMetaDown) dotGoAddStr(w, "KeyAltLeft", t.KeyAltLeft) dotGoAddStr(w, "KeyAltRight", t.KeyAltRight) dotGoAddStr(w, "KeyAltUp", t.KeyAltUp) dotGoAddStr(w, "KeyAltDown", t.KeyAltDown) dotGoAddStr(w, "KeyAltShfLeft", t.KeyAltShfLeft) dotGoAddStr(w, "KeyAltShfRight", t.KeyAltShfRight) dotGoAddStr(w, "KeyAltShfUp", t.KeyAltShfUp) dotGoAddStr(w, "KeyAltShfDown", t.KeyAltShfDown) dotGoAddStr(w, "KeyMetaShfLeft", t.KeyMetaShfLeft) dotGoAddStr(w, "KeyMetaShfRight", t.KeyMetaShfRight) dotGoAddStr(w, "KeyMetaShfUp", t.KeyMetaShfUp) dotGoAddStr(w, "KeyMetaShfDown", t.KeyMetaShfDown) dotGoAddStr(w, "KeyCtrlShfLeft", t.KeyCtrlShfLeft) dotGoAddStr(w, "KeyCtrlShfRight", t.KeyCtrlShfRight) dotGoAddStr(w, "KeyCtrlShfUp", t.KeyCtrlShfUp) dotGoAddStr(w, "KeyCtrlShfDown", t.KeyCtrlShfDown) dotGoAddStr(w, "KeyShfHome", t.KeyShfHome) dotGoAddStr(w, "KeyShfEnd", t.KeyShfEnd) dotGoAddStr(w, "KeyCtrlHome", t.KeyCtrlHome) dotGoAddStr(w, "KeyCtrlEnd", t.KeyCtrlEnd) dotGoAddStr(w, "KeyMetaHome", t.KeyMetaHome) dotGoAddStr(w, "KeyMetaEnd", t.KeyMetaEnd) dotGoAddStr(w, "KeyAltHome", t.KeyAltHome) dotGoAddStr(w, "KeyAltEnd", t.KeyAltEnd) dotGoAddStr(w, "KeyCtrlShfHome", t.KeyCtrlShfHome) dotGoAddStr(w, "KeyCtrlShfEnd", t.KeyCtrlShfEnd) dotGoAddStr(w, "KeyMetaShfHome", t.KeyMetaShfHome) dotGoAddStr(w, "KeyMetaShfEnd", t.KeyMetaShfEnd) dotGoAddStr(w, "KeyAltShfHome", t.KeyAltShfHome) dotGoAddStr(w, "KeyAltShfEnd", t.KeyAltShfEnd) fmt.Fprintln(w, "\t})") } fmt.Fprintln(w, "}") } var packname = "" var tipackname = "github.com/gdamore/tcell/terminfo" func dotGoFile(fname string, terms []*TData) error { w := os.Stdout var e error if fname != "-" && fname != "" { if w, e = os.Create(fname); e != nil { return e } } if packname == "" { packname = strings.Replace(terms[0].Name, "-", "_", -1) } dotGoHeader(w, packname, tipackname) dotGoInfo(w, terms) dotGoTrailer(w) if w != os.Stdout { w.Close() } cmd := exec.Command("go", "fmt", fname) cmd.Run() return nil } type TData struct { Desc string terminfo.Terminfo } func main() { gofile := "" nofatal := false quiet := false all := false flag.StringVar(&gofile, "go", "", "generate go source in named file") flag.StringVar(&tipackname, "I", tipackname, "import package path") flag.StringVar(&packname, "P", packname, "package name (go source)") flag.BoolVar(&nofatal, "nofatal", false, "errors are not fatal") flag.BoolVar(&quiet, "quiet", false, "suppress error messages") flag.BoolVar(&all, "all", false, "load all terminals from terminfo") flag.Parse() var e error args := flag.Args() if len(args) == 0 { args = []string{os.Getenv("TERM")} } tdata := make([]*TData, 0) for _, term := range args { if t, desc, e := getinfo(term); e != nil { if all && e == notaddressable { continue } if !quiet { fmt.Fprintf(os.Stderr, "Failed loading %s: %v\n", term, e) } if !nofatal { os.Exit(1) } } else { tdata = append(tdata, &TData{ Desc: desc, Terminfo: *t, }) } } if len(tdata) == 0 { // No data. os.Exit(0) } e = dotGoFile(gofile, tdata) if e != nil { fmt.Fprintf(os.Stderr, "Failed %s: %v", gofile, e) os.Exit(1) } } tcell-1.3.0/terminfo/models.txt000066400000000000000000000007741354173511300165000ustar00rootroot00000000000000adm3a aixterm ansi aterm beterm bsdos-pc cygwin d200 d210 dtterm eterm,eterm-color|emacs Eterm,Eterm-88color,Eterm-256color|eterm gnome,gnome-256color hpterm hz1500 konsole,konsole-256color kterm linux pcansi rxvt,rxvt-256color,rxvt-88color,rxvt-unicode,rxvt-unicode-256color screen,screen-256color st,st-256color|simpleterm sun,sun-color termite tvi910 tvi912 tvi921 tvi925 tvi950 tvi970 vt52 vt100 vt102 vt220 vt320 vt400 vt420 wy50 wy60 wy99-ansi,wy99a-ansi xfce xnuppc xterm,xterm-88color,xterm-256color tcell-1.3.0/terminfo/p/000077500000000000000000000000001354173511300147035ustar00rootroot00000000000000tcell-1.3.0/terminfo/p/pcansi/000077500000000000000000000000001354173511300161605ustar00rootroot00000000000000tcell-1.3.0/terminfo/p/pcansi/term.go000066400000000000000000000021041354173511300174530ustar00rootroot00000000000000// Generated automatically. DO NOT HAND-EDIT. package pcansi import "github.com/gdamore/tcell/terminfo" func init() { // ibm-pc terminal programs claiming to be ansi terminfo.AddTerminfo(&terminfo.Terminfo{ Name: "pcansi", Columns: 80, Lines: 24, Colors: 8, Bell: "\a", Clear: "\x1b[H\x1b[J", AttrOff: "\x1b[0;10m", Underline: "\x1b[4m", Bold: "\x1b[1m", Blink: "\x1b[5m", Reverse: "\x1b[7m", SetFg: "\x1b[3%p1%dm", SetBg: "\x1b[4%p1%dm", SetFgBg: "\x1b[3%p1%d;4%p2%dm", PadChar: "\x00", AltChars: "+\x10,\x11-\x18.\x190\xdb`\x04a\xb1f\xf8g\xf1h\xb0j\xd9k\xbfl\xdam\xc0n\xc5o~p\xc4q\xc4r\xc4s_t\xc3u\xb4v\xc1w\xc2x\xb3y\xf3z\xf2{\xe3|\xd8}\x9c~\xfe", EnterAcs: "\x1b[12m", ExitAcs: "\x1b[10m", SetCursor: "\x1b[%i%p1%d;%p2%dH", CursorBack1: "\x1b[D", CursorUp1: "\x1b[A", KeyUp: "\x1b[A", KeyDown: "\x1b[B", KeyRight: "\x1b[C", KeyLeft: "\x1b[D", KeyBackspace: "\b", KeyHome: "\x1b[H", }) } tcell-1.3.0/terminfo/r/000077500000000000000000000000001354173511300147055ustar00rootroot00000000000000tcell-1.3.0/terminfo/r/rxvt/000077500000000000000000000000001354173511300157105ustar00rootroot00000000000000tcell-1.3.0/terminfo/r/rxvt/term.go000066400000000000000000000327671354173511300172250ustar00rootroot00000000000000// Generated automatically. DO NOT HAND-EDIT. package rxvt import "github.com/gdamore/tcell/terminfo" func init() { // rxvt terminal emulator (X Window System) terminfo.AddTerminfo(&terminfo.Terminfo{ Name: "rxvt", Columns: 80, Lines: 24, Colors: 8, Bell: "\a", Clear: "\x1b[H\x1b[2J", EnterCA: "\x1b7\x1b[?47h", ExitCA: "\x1b[2J\x1b[?47l\x1b8", ShowCursor: "\x1b[?25h", HideCursor: "\x1b[?25l", AttrOff: "\x1b[m\x0f", Underline: "\x1b[4m", Bold: "\x1b[1m", Blink: "\x1b[5m", Reverse: "\x1b[7m", EnterKeypad: "\x1b=", ExitKeypad: "\x1b>", SetFg: "\x1b[3%p1%dm", SetBg: "\x1b[4%p1%dm", SetFgBg: "\x1b[3%p1%d;4%p2%dm", PadChar: "\x00", AltChars: "``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~", EnterAcs: "\x0e", ExitAcs: "\x0f", EnableAcs: "\x1b(B\x1b)0", Mouse: "\x1b[M", MouseMode: "%?%p1%{1}%=%t%'h'%Pa%e%'l'%Pa%;\x1b[?1000%ga%c\x1b[?1002%ga%c\x1b[?1003%ga%c\x1b[?1006%ga%c", SetCursor: "\x1b[%i%p1%d;%p2%dH", CursorBack1: "\b", CursorUp1: "\x1b[A", KeyUp: "\x1b[A", KeyDown: "\x1b[B", KeyRight: "\x1b[C", KeyLeft: "\x1b[D", KeyInsert: "\x1b[2~", KeyDelete: "\x1b[3~", KeyBackspace: "\xff", KeyHome: "\x1b[7~", KeyEnd: "\x1b[8~", KeyPgUp: "\x1b[5~", KeyPgDn: "\x1b[6~", KeyF1: "\x1b[11~", KeyF2: "\x1b[12~", KeyF3: "\x1b[13~", KeyF4: "\x1b[14~", KeyF5: "\x1b[15~", KeyF6: "\x1b[17~", KeyF7: "\x1b[18~", KeyF8: "\x1b[19~", KeyF9: "\x1b[20~", KeyF10: "\x1b[21~", KeyF11: "\x1b[23~", KeyF12: "\x1b[24~", KeyF13: "\x1b[25~", KeyF14: "\x1b[26~", KeyF15: "\x1b[28~", KeyF16: "\x1b[29~", KeyF17: "\x1b[31~", KeyF18: "\x1b[32~", KeyF19: "\x1b[33~", KeyF20: "\x1b[34~", KeyF21: "\x1b[23$", KeyF22: "\x1b[24$", KeyF23: "\x1b[11^", KeyF24: "\x1b[12^", KeyF25: "\x1b[13^", KeyF26: "\x1b[14^", KeyF27: "\x1b[15^", KeyF28: "\x1b[17^", KeyF29: "\x1b[18^", KeyF30: "\x1b[19^", KeyF31: "\x1b[20^", KeyF32: "\x1b[21^", KeyF33: "\x1b[23^", KeyF34: "\x1b[24^", KeyF35: "\x1b[25^", KeyF36: "\x1b[26^", KeyF37: "\x1b[28^", KeyF38: "\x1b[29^", KeyF39: "\x1b[31^", KeyF40: "\x1b[32^", KeyF41: "\x1b[33^", KeyF42: "\x1b[34^", KeyF43: "\x1b[23@", KeyF44: "\x1b[24@", KeyBacktab: "\x1b[Z", KeyShfLeft: "\x1b[d", KeyShfRight: "\x1b[c", KeyShfUp: "\x1b[a", KeyShfDown: "\x1b[b", KeyCtrlLeft: "\x1b[Od", KeyCtrlRight: "\x1b[Oc", KeyCtrlUp: "\x1b[Oa", KeyCtrlDown: "\x1b[Ob", KeyShfHome: "\x1b[7$", KeyShfEnd: "\x1b[8$", KeyCtrlHome: "\x1b[7^", KeyCtrlEnd: "\x1b[8^", }) // rxvt 2.7.9 with xterm 256-colors terminfo.AddTerminfo(&terminfo.Terminfo{ Name: "rxvt-256color", Columns: 80, Lines: 24, Colors: 256, Bell: "\a", Clear: "\x1b[H\x1b[2J", EnterCA: "\x1b7\x1b[?47h", ExitCA: "\x1b[2J\x1b[?47l\x1b8", ShowCursor: "\x1b[?25h", HideCursor: "\x1b[?25l", AttrOff: "\x1b[m\x0f", Underline: "\x1b[4m", Bold: "\x1b[1m", Blink: "\x1b[5m", Reverse: "\x1b[7m", EnterKeypad: "\x1b=", ExitKeypad: "\x1b>", SetFg: "\x1b[%?%p1%{8}%<%t3%p1%d%e%p1%{16}%<%t9%p1%{8}%-%d%e38;5;%p1%d%;m", SetBg: "\x1b[%?%p1%{8}%<%t4%p1%d%e%p1%{16}%<%t10%p1%{8}%-%d%e48;5;%p1%d%;m", SetFgBg: "\x1b[%?%p1%{8}%<%t3%p1%d%e%p1%{16}%<%t9%p1%{8}%-%d%e38;5;%p1%d%;;%?%p2%{8}%<%t4%p2%d%e%p2%{16}%<%t10%p2%{8}%-%d%e48;5;%p2%d%;m", PadChar: "\x00", AltChars: "``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~", EnterAcs: "\x0e", ExitAcs: "\x0f", EnableAcs: "\x1b(B\x1b)0", Mouse: "\x1b[M", MouseMode: "%?%p1%{1}%=%t%'h'%Pa%e%'l'%Pa%;\x1b[?1000%ga%c\x1b[?1002%ga%c\x1b[?1003%ga%c\x1b[?1006%ga%c", SetCursor: "\x1b[%i%p1%d;%p2%dH", CursorBack1: "\b", CursorUp1: "\x1b[A", KeyUp: "\x1b[A", KeyDown: "\x1b[B", KeyRight: "\x1b[C", KeyLeft: "\x1b[D", KeyInsert: "\x1b[2~", KeyDelete: "\x1b[3~", KeyBackspace: "\xff", KeyHome: "\x1b[7~", KeyEnd: "\x1b[8~", KeyPgUp: "\x1b[5~", KeyPgDn: "\x1b[6~", KeyF1: "\x1b[11~", KeyF2: "\x1b[12~", KeyF3: "\x1b[13~", KeyF4: "\x1b[14~", KeyF5: "\x1b[15~", KeyF6: "\x1b[17~", KeyF7: "\x1b[18~", KeyF8: "\x1b[19~", KeyF9: "\x1b[20~", KeyF10: "\x1b[21~", KeyF11: "\x1b[23~", KeyF12: "\x1b[24~", KeyF13: "\x1b[25~", KeyF14: "\x1b[26~", KeyF15: "\x1b[28~", KeyF16: "\x1b[29~", KeyF17: "\x1b[31~", KeyF18: "\x1b[32~", KeyF19: "\x1b[33~", KeyF20: "\x1b[34~", KeyF21: "\x1b[23$", KeyF22: "\x1b[24$", KeyF23: "\x1b[11^", KeyF24: "\x1b[12^", KeyF25: "\x1b[13^", KeyF26: "\x1b[14^", KeyF27: "\x1b[15^", KeyF28: "\x1b[17^", KeyF29: "\x1b[18^", KeyF30: "\x1b[19^", KeyF31: "\x1b[20^", KeyF32: "\x1b[21^", KeyF33: "\x1b[23^", KeyF34: "\x1b[24^", KeyF35: "\x1b[25^", KeyF36: "\x1b[26^", KeyF37: "\x1b[28^", KeyF38: "\x1b[29^", KeyF39: "\x1b[31^", KeyF40: "\x1b[32^", KeyF41: "\x1b[33^", KeyF42: "\x1b[34^", KeyF43: "\x1b[23@", KeyF44: "\x1b[24@", KeyBacktab: "\x1b[Z", KeyShfLeft: "\x1b[d", KeyShfRight: "\x1b[c", KeyShfUp: "\x1b[a", KeyShfDown: "\x1b[b", KeyCtrlLeft: "\x1b[Od", KeyCtrlRight: "\x1b[Oc", KeyCtrlUp: "\x1b[Oa", KeyCtrlDown: "\x1b[Ob", KeyShfHome: "\x1b[7$", KeyShfEnd: "\x1b[8$", KeyCtrlHome: "\x1b[7^", KeyCtrlEnd: "\x1b[8^", }) // rxvt 2.7.9 with xterm 88-colors terminfo.AddTerminfo(&terminfo.Terminfo{ Name: "rxvt-88color", Columns: 80, Lines: 24, Colors: 88, Bell: "\a", Clear: "\x1b[H\x1b[2J", EnterCA: "\x1b7\x1b[?47h", ExitCA: "\x1b[2J\x1b[?47l\x1b8", ShowCursor: "\x1b[?25h", HideCursor: "\x1b[?25l", AttrOff: "\x1b[m\x0f", Underline: "\x1b[4m", Bold: "\x1b[1m", Blink: "\x1b[5m", Reverse: "\x1b[7m", EnterKeypad: "\x1b=", ExitKeypad: "\x1b>", SetFg: "\x1b[%?%p1%{8}%<%t3%p1%d%e%p1%{16}%<%t9%p1%{8}%-%d%e38;5;%p1%d%;m", SetBg: "\x1b[%?%p1%{8}%<%t4%p1%d%e%p1%{16}%<%t10%p1%{8}%-%d%e48;5;%p1%d%;m", SetFgBg: "\x1b[%?%p1%{8}%<%t3%p1%d%e%p1%{16}%<%t9%p1%{8}%-%d%e38;5;%p1%d%;;%?%p2%{8}%<%t4%p2%d%e%p2%{16}%<%t10%p2%{8}%-%d%e48;5;%p2%d%;m", PadChar: "\x00", AltChars: "``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~", EnterAcs: "\x0e", ExitAcs: "\x0f", EnableAcs: "\x1b(B\x1b)0", Mouse: "\x1b[M", MouseMode: "%?%p1%{1}%=%t%'h'%Pa%e%'l'%Pa%;\x1b[?1000%ga%c\x1b[?1002%ga%c\x1b[?1003%ga%c\x1b[?1006%ga%c", SetCursor: "\x1b[%i%p1%d;%p2%dH", CursorBack1: "\b", CursorUp1: "\x1b[A", KeyUp: "\x1b[A", KeyDown: "\x1b[B", KeyRight: "\x1b[C", KeyLeft: "\x1b[D", KeyInsert: "\x1b[2~", KeyDelete: "\x1b[3~", KeyBackspace: "\xff", KeyHome: "\x1b[7~", KeyEnd: "\x1b[8~", KeyPgUp: "\x1b[5~", KeyPgDn: "\x1b[6~", KeyF1: "\x1b[11~", KeyF2: "\x1b[12~", KeyF3: "\x1b[13~", KeyF4: "\x1b[14~", KeyF5: "\x1b[15~", KeyF6: "\x1b[17~", KeyF7: "\x1b[18~", KeyF8: "\x1b[19~", KeyF9: "\x1b[20~", KeyF10: "\x1b[21~", KeyF11: "\x1b[23~", KeyF12: "\x1b[24~", KeyF13: "\x1b[25~", KeyF14: "\x1b[26~", KeyF15: "\x1b[28~", KeyF16: "\x1b[29~", KeyF17: "\x1b[31~", KeyF18: "\x1b[32~", KeyF19: "\x1b[33~", KeyF20: "\x1b[34~", KeyF21: "\x1b[23$", KeyF22: "\x1b[24$", KeyF23: "\x1b[11^", KeyF24: "\x1b[12^", KeyF25: "\x1b[13^", KeyF26: "\x1b[14^", KeyF27: "\x1b[15^", KeyF28: "\x1b[17^", KeyF29: "\x1b[18^", KeyF30: "\x1b[19^", KeyF31: "\x1b[20^", KeyF32: "\x1b[21^", KeyF33: "\x1b[23^", KeyF34: "\x1b[24^", KeyF35: "\x1b[25^", KeyF36: "\x1b[26^", KeyF37: "\x1b[28^", KeyF38: "\x1b[29^", KeyF39: "\x1b[31^", KeyF40: "\x1b[32^", KeyF41: "\x1b[33^", KeyF42: "\x1b[34^", KeyF43: "\x1b[23@", KeyF44: "\x1b[24@", KeyBacktab: "\x1b[Z", KeyShfLeft: "\x1b[d", KeyShfRight: "\x1b[c", KeyShfUp: "\x1b[a", KeyShfDown: "\x1b[b", KeyCtrlLeft: "\x1b[Od", KeyCtrlRight: "\x1b[Oc", KeyCtrlUp: "\x1b[Oa", KeyCtrlDown: "\x1b[Ob", KeyShfHome: "\x1b[7$", KeyShfEnd: "\x1b[8$", KeyCtrlHome: "\x1b[7^", KeyCtrlEnd: "\x1b[8^", }) // rxvt-unicode terminal (X Window System) terminfo.AddTerminfo(&terminfo.Terminfo{ Name: "rxvt-unicode", Columns: 80, Lines: 24, Colors: 88, Bell: "\a", Clear: "\x1b[H\x1b[2J", EnterCA: "\x1b[?1049h", ExitCA: "\x1b[r\x1b[?1049l", ShowCursor: "\x1b[?12l\x1b[?25h", HideCursor: "\x1b[?25l", AttrOff: "\x1b[m\x1b(B", Underline: "\x1b[4m", Bold: "\x1b[1m", Blink: "\x1b[5m", Reverse: "\x1b[7m", EnterKeypad: "\x1b=", ExitKeypad: "\x1b>", SetFg: "\x1b[38;5;%p1%dm", SetBg: "\x1b[48;5;%p1%dm", SetFgBg: "\x1b[38;5;%p1%d;48;5;%p2%dm", AltChars: "+C,D-A.B0E``aaffgghFiGjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~", EnterAcs: "\x1b(0", ExitAcs: "\x1b(B", Mouse: "\x1b[M", MouseMode: "%?%p1%{1}%=%t%'h'%Pa%e%'l'%Pa%;\x1b[?1000%ga%c\x1b[?1002%ga%c\x1b[?1003%ga%c\x1b[?1006%ga%c", SetCursor: "\x1b[%i%p1%d;%p2%dH", CursorBack1: "\b", CursorUp1: "\x1b[A", KeyUp: "\x1b[A", KeyDown: "\x1b[B", KeyRight: "\x1b[C", KeyLeft: "\x1b[D", KeyInsert: "\x1b[2~", KeyDelete: "\x1b[3~", KeyBackspace: "\xff", KeyHome: "\x1b[7~", KeyEnd: "\x1b[8~", KeyPgUp: "\x1b[5~", KeyPgDn: "\x1b[6~", KeyF1: "\x1b[11~", KeyF2: "\x1b[12~", KeyF3: "\x1b[13~", KeyF4: "\x1b[14~", KeyF5: "\x1b[15~", KeyF6: "\x1b[17~", KeyF7: "\x1b[18~", KeyF8: "\x1b[19~", KeyF9: "\x1b[20~", KeyF10: "\x1b[21~", KeyF11: "\x1b[23~", KeyF12: "\x1b[24~", KeyF13: "\x1b[25~", KeyF14: "\x1b[26~", KeyF15: "\x1b[28~", KeyF16: "\x1b[29~", KeyF17: "\x1b[31~", KeyF18: "\x1b[32~", KeyF19: "\x1b[33~", KeyF20: "\x1b[34~", KeyBacktab: "\x1b[Z", KeyShfLeft: "\x1b[d", KeyShfRight: "\x1b[c", KeyShfUp: "\x1b[a", KeyShfDown: "\x1b[b", KeyCtrlLeft: "\x1b[Od", KeyCtrlRight: "\x1b[Oc", KeyCtrlUp: "\x1b[Oa", KeyCtrlDown: "\x1b[Ob", KeyShfHome: "\x1b[7$", KeyShfEnd: "\x1b[8$", KeyCtrlHome: "\x1b[7^", KeyCtrlEnd: "\x1b[8^", }) // rxvt-unicode terminal with 256 colors (X Window System) terminfo.AddTerminfo(&terminfo.Terminfo{ Name: "rxvt-unicode-256color", Columns: 80, Lines: 24, Colors: 256, Bell: "\a", Clear: "\x1b[H\x1b[2J", EnterCA: "\x1b[?1049h", ExitCA: "\x1b[r\x1b[?1049l", ShowCursor: "\x1b[?12l\x1b[?25h", HideCursor: "\x1b[?25l", AttrOff: "\x1b[m\x1b(B", Underline: "\x1b[4m", Bold: "\x1b[1m", Blink: "\x1b[5m", Reverse: "\x1b[7m", EnterKeypad: "\x1b=", ExitKeypad: "\x1b>", SetFg: "\x1b[38;5;%p1%dm", SetBg: "\x1b[48;5;%p1%dm", SetFgBg: "\x1b[38;5;%p1%d;48;5;%p2%dm", AltChars: "+C,D-A.B0E``aaffgghFiGjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~", EnterAcs: "\x1b(0", ExitAcs: "\x1b(B", Mouse: "\x1b[M", MouseMode: "%?%p1%{1}%=%t%'h'%Pa%e%'l'%Pa%;\x1b[?1000%ga%c\x1b[?1002%ga%c\x1b[?1003%ga%c\x1b[?1006%ga%c", SetCursor: "\x1b[%i%p1%d;%p2%dH", CursorBack1: "\b", CursorUp1: "\x1b[A", KeyUp: "\x1b[A", KeyDown: "\x1b[B", KeyRight: "\x1b[C", KeyLeft: "\x1b[D", KeyInsert: "\x1b[2~", KeyDelete: "\x1b[3~", KeyBackspace: "\xff", KeyHome: "\x1b[7~", KeyEnd: "\x1b[8~", KeyPgUp: "\x1b[5~", KeyPgDn: "\x1b[6~", KeyF1: "\x1b[11~", KeyF2: "\x1b[12~", KeyF3: "\x1b[13~", KeyF4: "\x1b[14~", KeyF5: "\x1b[15~", KeyF6: "\x1b[17~", KeyF7: "\x1b[18~", KeyF8: "\x1b[19~", KeyF9: "\x1b[20~", KeyF10: "\x1b[21~", KeyF11: "\x1b[23~", KeyF12: "\x1b[24~", KeyF13: "\x1b[25~", KeyF14: "\x1b[26~", KeyF15: "\x1b[28~", KeyF16: "\x1b[29~", KeyF17: "\x1b[31~", KeyF18: "\x1b[32~", KeyF19: "\x1b[33~", KeyF20: "\x1b[34~", KeyBacktab: "\x1b[Z", KeyShfLeft: "\x1b[d", KeyShfRight: "\x1b[c", KeyShfUp: "\x1b[a", KeyShfDown: "\x1b[b", KeyCtrlLeft: "\x1b[Od", KeyCtrlRight: "\x1b[Oc", KeyCtrlUp: "\x1b[Oa", KeyCtrlDown: "\x1b[Ob", KeyShfHome: "\x1b[7$", KeyShfEnd: "\x1b[8$", KeyCtrlHome: "\x1b[7^", KeyCtrlEnd: "\x1b[8^", }) } tcell-1.3.0/terminfo/s/000077500000000000000000000000001354173511300147065ustar00rootroot00000000000000tcell-1.3.0/terminfo/s/screen/000077500000000000000000000000001354173511300161655ustar00rootroot00000000000000tcell-1.3.0/terminfo/s/screen/term.go000066400000000000000000000073611354173511300174720ustar00rootroot00000000000000// Generated automatically. DO NOT HAND-EDIT. package screen import "github.com/gdamore/tcell/terminfo" func init() { // VT 100/ANSI X3.64 virtual terminal terminfo.AddTerminfo(&terminfo.Terminfo{ Name: "screen", Columns: 80, Lines: 24, Colors: 8, Bell: "\a", Clear: "\x1b[H\x1b[J", EnterCA: "\x1b[?1049h", ExitCA: "\x1b[?1049l", ShowCursor: "\x1b[34h\x1b[?25h", HideCursor: "\x1b[?25l", AttrOff: "\x1b[m\x0f", Underline: "\x1b[4m", Bold: "\x1b[1m", Dim: "\x1b[2m", Blink: "\x1b[5m", Reverse: "\x1b[7m", EnterKeypad: "\x1b[?1h\x1b=", ExitKeypad: "\x1b[?1l\x1b>", SetFg: "\x1b[3%p1%dm", SetBg: "\x1b[4%p1%dm", SetFgBg: "\x1b[3%p1%d;4%p2%dm", PadChar: "\x00", AltChars: "++,,--..00``aaffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~", EnterAcs: "\x0e", ExitAcs: "\x0f", EnableAcs: "\x1b(B\x1b)0", Mouse: "\x1b[M", MouseMode: "%?%p1%{1}%=%t%'h'%Pa%e%'l'%Pa%;\x1b[?1000%ga%c\x1b[?1002%ga%c\x1b[?1003%ga%c\x1b[?1006%ga%c", SetCursor: "\x1b[%i%p1%d;%p2%dH", CursorBack1: "\b", CursorUp1: "\x1bM", KeyUp: "\x1bOA", KeyDown: "\x1bOB", KeyRight: "\x1bOC", KeyLeft: "\x1bOD", KeyInsert: "\x1b[2~", KeyDelete: "\x1b[3~", KeyBackspace: "\xff", KeyHome: "\x1b[1~", KeyEnd: "\x1b[4~", KeyPgUp: "\x1b[5~", KeyPgDn: "\x1b[6~", KeyF1: "\x1bOP", KeyF2: "\x1bOQ", KeyF3: "\x1bOR", KeyF4: "\x1bOS", KeyF5: "\x1b[15~", KeyF6: "\x1b[17~", KeyF7: "\x1b[18~", KeyF8: "\x1b[19~", KeyF9: "\x1b[20~", KeyF10: "\x1b[21~", KeyF11: "\x1b[23~", KeyF12: "\x1b[24~", KeyBacktab: "\x1b[Z", }) // GNU Screen with 256 colors terminfo.AddTerminfo(&terminfo.Terminfo{ Name: "screen-256color", Columns: 80, Lines: 24, Colors: 256, Bell: "\a", Clear: "\x1b[H\x1b[J", EnterCA: "\x1b[?1049h", ExitCA: "\x1b[?1049l", ShowCursor: "\x1b[34h\x1b[?25h", HideCursor: "\x1b[?25l", AttrOff: "\x1b[m\x0f", Underline: "\x1b[4m", Bold: "\x1b[1m", Dim: "\x1b[2m", Blink: "\x1b[5m", Reverse: "\x1b[7m", EnterKeypad: "\x1b[?1h\x1b=", ExitKeypad: "\x1b[?1l\x1b>", SetFg: "\x1b[%?%p1%{8}%<%t3%p1%d%e%p1%{16}%<%t9%p1%{8}%-%d%e38;5;%p1%d%;m", SetBg: "\x1b[%?%p1%{8}%<%t4%p1%d%e%p1%{16}%<%t10%p1%{8}%-%d%e48;5;%p1%d%;m", SetFgBg: "\x1b[%?%p1%{8}%<%t3%p1%d%e%p1%{16}%<%t9%p1%{8}%-%d%e38;5;%p1%d%;;%?%p2%{8}%<%t4%p2%d%e%p2%{16}%<%t10%p2%{8}%-%d%e48;5;%p2%d%;m", PadChar: "\x00", AltChars: "++,,--..00``aaffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~", EnterAcs: "\x0e", ExitAcs: "\x0f", EnableAcs: "\x1b(B\x1b)0", Mouse: "\x1b[M", MouseMode: "%?%p1%{1}%=%t%'h'%Pa%e%'l'%Pa%;\x1b[?1000%ga%c\x1b[?1002%ga%c\x1b[?1003%ga%c\x1b[?1006%ga%c", SetCursor: "\x1b[%i%p1%d;%p2%dH", CursorBack1: "\b", CursorUp1: "\x1bM", KeyUp: "\x1bOA", KeyDown: "\x1bOB", KeyRight: "\x1bOC", KeyLeft: "\x1bOD", KeyInsert: "\x1b[2~", KeyDelete: "\x1b[3~", KeyBackspace: "\xff", KeyHome: "\x1b[1~", KeyEnd: "\x1b[4~", KeyPgUp: "\x1b[5~", KeyPgDn: "\x1b[6~", KeyF1: "\x1bOP", KeyF2: "\x1bOQ", KeyF3: "\x1bOR", KeyF4: "\x1bOS", KeyF5: "\x1b[15~", KeyF6: "\x1b[17~", KeyF7: "\x1b[18~", KeyF8: "\x1b[19~", KeyF9: "\x1b[20~", KeyF10: "\x1b[21~", KeyF11: "\x1b[23~", KeyF12: "\x1b[24~", KeyBacktab: "\x1b[Z", }) } tcell-1.3.0/terminfo/s/simpleterm/000077500000000000000000000000001354173511300170675ustar00rootroot00000000000000tcell-1.3.0/terminfo/s/simpleterm/term.go000066400000000000000000000235171354173511300203750ustar00rootroot00000000000000// Generated automatically. DO NOT HAND-EDIT. package simpleterm import "github.com/gdamore/tcell/terminfo" func init() { // simpleterm terminfo.AddTerminfo(&terminfo.Terminfo{ Name: "st", Aliases: []string{"stterm"}, Columns: 80, Lines: 24, Colors: 8, Bell: "\a", Clear: "\x1b[H\x1b[2J", EnterCA: "\x1b[?1049h", ExitCA: "\x1b[?1049l", ShowCursor: "\x1b[?12l\x1b[?25h", HideCursor: "\x1b[?25l", AttrOff: "\x1b[0m", Underline: "\x1b[4m", Bold: "\x1b[1m", Dim: "\x1b[2m", Blink: "\x1b[5m", Reverse: "\x1b[7m", EnterKeypad: "\x1b[?1h\x1b=", ExitKeypad: "\x1b[?1l\x1b>", SetFg: "\x1b[3%p1%dm", SetBg: "\x1b[4%p1%dm", SetFgBg: "\x1b[3%p1%d;4%p2%dm", AltChars: "+C,D-A.B0E``aaffgghFiGjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~", EnterAcs: "\x1b(0", ExitAcs: "\x1b(B", EnableAcs: "\x1b)0", Mouse: "\x1b[M", MouseMode: "%?%p1%{1}%=%t%'h'%Pa%e%'l'%Pa%;\x1b[?1000%ga%c\x1b[?1002%ga%c\x1b[?1003%ga%c\x1b[?1006%ga%c", SetCursor: "\x1b[%i%p1%d;%p2%dH", CursorBack1: "\b", CursorUp1: "\x1b[A", KeyUp: "\x1bOA", KeyDown: "\x1bOB", KeyRight: "\x1bOC", KeyLeft: "\x1bOD", KeyInsert: "\x1b[2~", KeyDelete: "\x1b[3~", KeyBackspace: "\xff", KeyHome: "\x1b[1~", KeyEnd: "\x1b[4~", KeyPgUp: "\x1b[5~", KeyPgDn: "\x1b[6~", KeyF1: "\x1bOP", KeyF2: "\x1bOQ", KeyF3: "\x1bOR", KeyF4: "\x1bOS", KeyF5: "\x1b[15~", KeyF6: "\x1b[17~", KeyF7: "\x1b[18~", KeyF8: "\x1b[19~", KeyF9: "\x1b[20~", KeyF10: "\x1b[21~", KeyF11: "\x1b[23~", KeyF12: "\x1b[24~", KeyF13: "\x1b[1;2P", KeyF14: "\x1b[1;2Q", KeyF15: "\x1b[1;2R", KeyF16: "\x1b[1;2S", KeyF17: "\x1b[15;2~", KeyF18: "\x1b[17;2~", KeyF19: "\x1b[18;2~", KeyF20: "\x1b[19;2~", KeyF21: "\x1b[20;2~", KeyF22: "\x1b[21;2~", KeyF23: "\x1b[23;2~", KeyF24: "\x1b[24;2~", KeyF25: "\x1b[1;5P", KeyF26: "\x1b[1;5Q", KeyF27: "\x1b[1;5R", KeyF28: "\x1b[1;5S", KeyF29: "\x1b[15;5~", KeyF30: "\x1b[17;5~", KeyF31: "\x1b[18;5~", KeyF32: "\x1b[19;5~", KeyF33: "\x1b[20;5~", KeyF34: "\x1b[21;5~", KeyF35: "\x1b[23;5~", KeyF36: "\x1b[24;5~", KeyF37: "\x1b[1;6P", KeyF38: "\x1b[1;6Q", KeyF39: "\x1b[1;6R", KeyF40: "\x1b[1;6S", KeyF41: "\x1b[15;6~", KeyF42: "\x1b[17;6~", KeyF43: "\x1b[18;6~", KeyF44: "\x1b[19;6~", KeyF45: "\x1b[20;6~", KeyF46: "\x1b[21;6~", KeyF47: "\x1b[23;6~", KeyF48: "\x1b[24;6~", KeyF49: "\x1b[1;3P", KeyF50: "\x1b[1;3Q", KeyF51: "\x1b[1;3R", KeyF52: "\x1b[1;3S", KeyF53: "\x1b[15;3~", KeyF54: "\x1b[17;3~", KeyF55: "\x1b[18;3~", KeyF56: "\x1b[19;3~", KeyF57: "\x1b[20;3~", KeyF58: "\x1b[21;3~", KeyF59: "\x1b[23;3~", KeyF60: "\x1b[24;3~", KeyF61: "\x1b[1;4P", KeyF62: "\x1b[1;4Q", KeyF63: "\x1b[1;4R", KeyClear: "\x1b[3;5~", KeyShfLeft: "\x1b[1;2D", KeyShfRight: "\x1b[1;2C", KeyShfUp: "\x1b[1;2A", KeyShfDown: "\x1b[1;2B", KeyCtrlLeft: "\x1b[1;5D", KeyCtrlRight: "\x1b[1;5C", KeyCtrlUp: "\x1b[1;5A", KeyCtrlDown: "\x1b[1;5B", KeyMetaLeft: "\x1b[1;9D", KeyMetaRight: "\x1b[1;9C", KeyMetaUp: "\x1b[1;9A", KeyMetaDown: "\x1b[1;9B", KeyAltLeft: "\x1b[1;3D", KeyAltRight: "\x1b[1;3C", KeyAltUp: "\x1b[1;3A", KeyAltDown: "\x1b[1;3B", KeyAltShfLeft: "\x1b[1;4D", KeyAltShfRight: "\x1b[1;4C", KeyAltShfUp: "\x1b[1;4A", KeyAltShfDown: "\x1b[1;4B", KeyMetaShfLeft: "\x1b[1;10D", KeyMetaShfRight: "\x1b[1;10C", KeyMetaShfUp: "\x1b[1;10A", KeyMetaShfDown: "\x1b[1;10B", KeyCtrlShfLeft: "\x1b[1;6D", KeyCtrlShfRight: "\x1b[1;6C", KeyCtrlShfUp: "\x1b[1;6A", KeyCtrlShfDown: "\x1b[1;6B", KeyShfHome: "\x1b[1;2H", KeyShfEnd: "\x1b[1;2F", KeyCtrlHome: "\x1b[1;5H", KeyCtrlEnd: "\x1b[1;5F", KeyAltHome: "\x1b[1;9H", KeyAltEnd: "\x1b[1;9F", KeyCtrlShfHome: "\x1b[1;6H", KeyCtrlShfEnd: "\x1b[1;6F", KeyMetaShfHome: "\x1b[1;10H", KeyMetaShfEnd: "\x1b[1;10F", KeyAltShfHome: "\x1b[1;4H", KeyAltShfEnd: "\x1b[1;4F", }) // simpleterm with 256 colors terminfo.AddTerminfo(&terminfo.Terminfo{ Name: "st-256color", Aliases: []string{"stterm-256color"}, Columns: 80, Lines: 24, Colors: 256, Bell: "\a", Clear: "\x1b[H\x1b[2J", EnterCA: "\x1b[?1049h", ExitCA: "\x1b[?1049l", ShowCursor: "\x1b[?12l\x1b[?25h", HideCursor: "\x1b[?25l", AttrOff: "\x1b[0m", Underline: "\x1b[4m", Bold: "\x1b[1m", Dim: "\x1b[2m", Blink: "\x1b[5m", Reverse: "\x1b[7m", EnterKeypad: "\x1b[?1h\x1b=", ExitKeypad: "\x1b[?1l\x1b>", SetFg: "\x1b[%?%p1%{8}%<%t3%p1%d%e%p1%{16}%<%t9%p1%{8}%-%d%e38;5;%p1%d%;m", SetBg: "\x1b[%?%p1%{8}%<%t4%p1%d%e%p1%{16}%<%t10%p1%{8}%-%d%e48;5;%p1%d%;m", SetFgBg: "\x1b[%?%p1%{8}%<%t3%p1%d%e%p1%{16}%<%t9%p1%{8}%-%d%e38;5;%p1%d%;;%?%p2%{8}%<%t4%p2%d%e%p2%{16}%<%t10%p2%{8}%-%d%e48;5;%p2%d%;m", AltChars: "+C,D-A.B0E``aaffgghFiGjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~", EnterAcs: "\x1b(0", ExitAcs: "\x1b(B", EnableAcs: "\x1b)0", Mouse: "\x1b[M", MouseMode: "%?%p1%{1}%=%t%'h'%Pa%e%'l'%Pa%;\x1b[?1000%ga%c\x1b[?1002%ga%c\x1b[?1003%ga%c\x1b[?1006%ga%c", SetCursor: "\x1b[%i%p1%d;%p2%dH", CursorBack1: "\b", CursorUp1: "\x1b[A", KeyUp: "\x1bOA", KeyDown: "\x1bOB", KeyRight: "\x1bOC", KeyLeft: "\x1bOD", KeyInsert: "\x1b[2~", KeyDelete: "\x1b[3~", KeyBackspace: "\xff", KeyHome: "\x1b[1~", KeyEnd: "\x1b[4~", KeyPgUp: "\x1b[5~", KeyPgDn: "\x1b[6~", KeyF1: "\x1bOP", KeyF2: "\x1bOQ", KeyF3: "\x1bOR", KeyF4: "\x1bOS", KeyF5: "\x1b[15~", KeyF6: "\x1b[17~", KeyF7: "\x1b[18~", KeyF8: "\x1b[19~", KeyF9: "\x1b[20~", KeyF10: "\x1b[21~", KeyF11: "\x1b[23~", KeyF12: "\x1b[24~", KeyF13: "\x1b[1;2P", KeyF14: "\x1b[1;2Q", KeyF15: "\x1b[1;2R", KeyF16: "\x1b[1;2S", KeyF17: "\x1b[15;2~", KeyF18: "\x1b[17;2~", KeyF19: "\x1b[18;2~", KeyF20: "\x1b[19;2~", KeyF21: "\x1b[20;2~", KeyF22: "\x1b[21;2~", KeyF23: "\x1b[23;2~", KeyF24: "\x1b[24;2~", KeyF25: "\x1b[1;5P", KeyF26: "\x1b[1;5Q", KeyF27: "\x1b[1;5R", KeyF28: "\x1b[1;5S", KeyF29: "\x1b[15;5~", KeyF30: "\x1b[17;5~", KeyF31: "\x1b[18;5~", KeyF32: "\x1b[19;5~", KeyF33: "\x1b[20;5~", KeyF34: "\x1b[21;5~", KeyF35: "\x1b[23;5~", KeyF36: "\x1b[24;5~", KeyF37: "\x1b[1;6P", KeyF38: "\x1b[1;6Q", KeyF39: "\x1b[1;6R", KeyF40: "\x1b[1;6S", KeyF41: "\x1b[15;6~", KeyF42: "\x1b[17;6~", KeyF43: "\x1b[18;6~", KeyF44: "\x1b[19;6~", KeyF45: "\x1b[20;6~", KeyF46: "\x1b[21;6~", KeyF47: "\x1b[23;6~", KeyF48: "\x1b[24;6~", KeyF49: "\x1b[1;3P", KeyF50: "\x1b[1;3Q", KeyF51: "\x1b[1;3R", KeyF52: "\x1b[1;3S", KeyF53: "\x1b[15;3~", KeyF54: "\x1b[17;3~", KeyF55: "\x1b[18;3~", KeyF56: "\x1b[19;3~", KeyF57: "\x1b[20;3~", KeyF58: "\x1b[21;3~", KeyF59: "\x1b[23;3~", KeyF60: "\x1b[24;3~", KeyF61: "\x1b[1;4P", KeyF62: "\x1b[1;4Q", KeyF63: "\x1b[1;4R", KeyClear: "\x1b[3;5~", KeyShfLeft: "\x1b[1;2D", KeyShfRight: "\x1b[1;2C", KeyShfUp: "\x1b[1;2A", KeyShfDown: "\x1b[1;2B", KeyCtrlLeft: "\x1b[1;5D", KeyCtrlRight: "\x1b[1;5C", KeyCtrlUp: "\x1b[1;5A", KeyCtrlDown: "\x1b[1;5B", KeyMetaLeft: "\x1b[1;9D", KeyMetaRight: "\x1b[1;9C", KeyMetaUp: "\x1b[1;9A", KeyMetaDown: "\x1b[1;9B", KeyAltLeft: "\x1b[1;3D", KeyAltRight: "\x1b[1;3C", KeyAltUp: "\x1b[1;3A", KeyAltDown: "\x1b[1;3B", KeyAltShfLeft: "\x1b[1;4D", KeyAltShfRight: "\x1b[1;4C", KeyAltShfUp: "\x1b[1;4A", KeyAltShfDown: "\x1b[1;4B", KeyMetaShfLeft: "\x1b[1;10D", KeyMetaShfRight: "\x1b[1;10C", KeyMetaShfUp: "\x1b[1;10A", KeyMetaShfDown: "\x1b[1;10B", KeyCtrlShfLeft: "\x1b[1;6D", KeyCtrlShfRight: "\x1b[1;6C", KeyCtrlShfUp: "\x1b[1;6A", KeyCtrlShfDown: "\x1b[1;6B", KeyShfHome: "\x1b[1;2H", KeyShfEnd: "\x1b[1;2F", KeyCtrlHome: "\x1b[1;5H", KeyCtrlEnd: "\x1b[1;5F", KeyAltHome: "\x1b[1;9H", KeyAltEnd: "\x1b[1;9F", KeyCtrlShfHome: "\x1b[1;6H", KeyCtrlShfEnd: "\x1b[1;6F", KeyMetaShfHome: "\x1b[1;10H", KeyMetaShfEnd: "\x1b[1;10F", KeyAltShfHome: "\x1b[1;4H", KeyAltShfEnd: "\x1b[1;4F", }) } tcell-1.3.0/terminfo/s/sun/000077500000000000000000000000001354173511300155135ustar00rootroot00000000000000tcell-1.3.0/terminfo/s/sun/term.go000066400000000000000000000044671354173511300170240ustar00rootroot00000000000000// Generated automatically. DO NOT HAND-EDIT. package sun import "github.com/gdamore/tcell/terminfo" func init() { // Sun Microsystems Inc. workstation console terminfo.AddTerminfo(&terminfo.Terminfo{ Name: "sun", Aliases: []string{"sun1", "sun2"}, Columns: 80, Lines: 34, Bell: "\a", Clear: "\f", AttrOff: "\x1b[m", Reverse: "\x1b[7m", PadChar: "\x00", SetCursor: "\x1b[%i%p1%d;%p2%dH", CursorBack1: "\b", CursorUp1: "\x1b[A", KeyUp: "\x1b[A", KeyDown: "\x1b[B", KeyRight: "\x1b[C", KeyLeft: "\x1b[D", KeyInsert: "\x1b[247z", KeyDelete: "\xff", KeyBackspace: "\b", KeyHome: "\x1b[214z", KeyEnd: "\x1b[220z", KeyPgUp: "\x1b[216z", KeyPgDn: "\x1b[222z", KeyF1: "\x1b[224z", KeyF2: "\x1b[225z", KeyF3: "\x1b[226z", KeyF4: "\x1b[227z", KeyF5: "\x1b[228z", KeyF6: "\x1b[229z", KeyF7: "\x1b[230z", KeyF8: "\x1b[231z", KeyF9: "\x1b[232z", KeyF10: "\x1b[233z", KeyF11: "\x1b[234z", KeyF12: "\x1b[235z", }) // Sun Microsystems Workstation console with color support (IA systems) terminfo.AddTerminfo(&terminfo.Terminfo{ Name: "sun-color", Columns: 80, Lines: 34, Colors: 8, Bell: "\a", Clear: "\f", AttrOff: "\x1b[m", Bold: "\x1b[1m", Reverse: "\x1b[7m", SetFg: "\x1b[3%p1%dm", SetBg: "\x1b[4%p1%dm", SetFgBg: "\x1b[3%p1%d;4%p2%dm", PadChar: "\x00", SetCursor: "\x1b[%i%p1%d;%p2%dH", CursorBack1: "\b", CursorUp1: "\x1b[A", KeyUp: "\x1b[A", KeyDown: "\x1b[B", KeyRight: "\x1b[C", KeyLeft: "\x1b[D", KeyInsert: "\x1b[247z", KeyDelete: "\xff", KeyBackspace: "\b", KeyHome: "\x1b[214z", KeyEnd: "\x1b[220z", KeyPgUp: "\x1b[216z", KeyPgDn: "\x1b[222z", KeyF1: "\x1b[224z", KeyF2: "\x1b[225z", KeyF3: "\x1b[226z", KeyF4: "\x1b[227z", KeyF5: "\x1b[228z", KeyF6: "\x1b[229z", KeyF7: "\x1b[230z", KeyF8: "\x1b[231z", KeyF9: "\x1b[232z", KeyF10: "\x1b[233z", KeyF11: "\x1b[234z", KeyF12: "\x1b[235z", }) } tcell-1.3.0/terminfo/t/000077500000000000000000000000001354173511300147075ustar00rootroot00000000000000tcell-1.3.0/terminfo/t/termite/000077500000000000000000000000001354173511300163605ustar00rootroot00000000000000tcell-1.3.0/terminfo/t/termite/term.go000066400000000000000000000117141354173511300176620ustar00rootroot00000000000000// Generated automatically. DO NOT HAND-EDIT. package termite import "github.com/gdamore/tcell/terminfo" func init() { // VTE-based terminal terminfo.AddTerminfo(&terminfo.Terminfo{ Name: "termite", Columns: 80, Lines: 24, Colors: 256, Bell: "\a", Clear: "\x1b[H\x1b[2J", EnterCA: "\x1b[?1049h", ExitCA: "\x1b[?1049l", ShowCursor: "\x1b[?12l\x1b[?25h", HideCursor: "\x1b[?25l", AttrOff: "\x1b(B\x1b[m", Underline: "\x1b[4m", Bold: "\x1b[1m", Reverse: "\x1b[7m", EnterKeypad: "\x1b[?1h\x1b=", ExitKeypad: "\x1b[?1l\x1b>", SetFg: "\x1b[%?%p1%{8}%<%t3%p1%d%e%p1%{16}%<%t9%p1%{8}%-%d%e38;5;%p1%d%;m", SetBg: "\x1b[%?%p1%{8}%<%t4%p1%d%e%p1%{16}%<%t10%p1%{8}%-%d%e48;5;%p1%d%;m", SetFgBg: "\x1b[%?%p1%{8}%<%t3%p1%d%e%p1%{16}%<%t9%p1%{8}%-%d%e38;5;%p1%d%;;%?%p2%{8}%<%t4%p2%d%e%p2%{16}%<%t10%p2%{8}%-%d%e48;5;%p2%d%;m", AltChars: "++,,--..00``aaffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~", EnterAcs: "\x1b(0", ExitAcs: "\x1b(B", Mouse: "\x1b[M", MouseMode: "%?%p1%{1}%=%t%'h'%Pa%e%'l'%Pa%;\x1b[?1000%ga%c\x1b[?1002%ga%c\x1b[?1003%ga%c\x1b[?1006%ga%c", SetCursor: "\x1b[%i%p1%d;%p2%dH", CursorBack1: "\b", CursorUp1: "\x1b[A", KeyUp: "\x1bOA", KeyDown: "\x1bOB", KeyRight: "\x1bOC", KeyLeft: "\x1bOD", KeyInsert: "\x1b[2~", KeyDelete: "\x1b[3~", KeyBackspace: "\xff", KeyHome: "\x1bOH", KeyEnd: "\x1bOF", KeyPgUp: "\x1b[5~", KeyPgDn: "\x1b[6~", KeyF1: "\x1bOP", KeyF2: "\x1bOQ", KeyF3: "\x1bOR", KeyF4: "\x1bOS", KeyF5: "\x1b[15~", KeyF6: "\x1b[17~", KeyF7: "\x1b[18~", KeyF8: "\x1b[19~", KeyF9: "\x1b[20~", KeyF10: "\x1b[21~", KeyF11: "\x1b[23~", KeyF12: "\x1b[24~", KeyF13: "\x1b[1;2P", KeyF14: "\x1b[1;2Q", KeyF15: "\x1b[1;2R", KeyF16: "\x1b[1;2S", KeyF17: "\x1b[15;2~", KeyF18: "\x1b[17;2~", KeyF19: "\x1b[18;2~", KeyF20: "\x1b[19;2~", KeyF21: "\x1b[20;2~", KeyF22: "\x1b[21;2~", KeyF23: "\x1b[23;2~", KeyF24: "\x1b[24;2~", KeyF25: "\x1b[1;5P", KeyF26: "\x1b[1;5Q", KeyF27: "\x1b[1;5R", KeyF28: "\x1b[1;5S", KeyF29: "\x1b[15;5~", KeyF30: "\x1b[17;5~", KeyF31: "\x1b[18;5~", KeyF32: "\x1b[19;5~", KeyF33: "\x1b[20;5~", KeyF34: "\x1b[21;5~", KeyF35: "\x1b[23;5~", KeyF36: "\x1b[24;5~", KeyF37: "\x1b[1;6P", KeyF38: "\x1b[1;6Q", KeyF39: "\x1b[1;6R", KeyF40: "\x1b[1;6S", KeyF41: "\x1b[15;6~", KeyF42: "\x1b[17;6~", KeyF43: "\x1b[18;6~", KeyF44: "\x1b[19;6~", KeyF45: "\x1b[20;6~", KeyF46: "\x1b[21;6~", KeyF47: "\x1b[23;6~", KeyF48: "\x1b[24;6~", KeyF49: "\x1b[1;3P", KeyF50: "\x1b[1;3Q", KeyF51: "\x1b[1;3R", KeyF52: "\x1b[1;3S", KeyF53: "\x1b[15;3~", KeyF54: "\x1b[17;3~", KeyF55: "\x1b[18;3~", KeyF56: "\x1b[19;3~", KeyF57: "\x1b[20;3~", KeyF58: "\x1b[21;3~", KeyF59: "\x1b[23;3~", KeyF60: "\x1b[24;3~", KeyF61: "\x1b[1;4P", KeyF62: "\x1b[1;4Q", KeyF63: "\x1b[1;4R", KeyBacktab: "\x1b[Z", KeyShfLeft: "\x1b[1;2D", KeyShfRight: "\x1b[1;2C", KeyShfUp: "\x1b[1;2A", KeyShfDown: "\x1b[1;2B", KeyCtrlLeft: "\x1b[1;5D", KeyCtrlRight: "\x1b[1;5C", KeyCtrlUp: "\x1b[1;5A", KeyCtrlDown: "\x1b[1;5B", KeyMetaLeft: "\x1b[1;9D", KeyMetaRight: "\x1b[1;9C", KeyMetaUp: "\x1b[1;9A", KeyMetaDown: "\x1b[1;9B", KeyAltLeft: "\x1b[1;3D", KeyAltRight: "\x1b[1;3C", KeyAltUp: "\x1b[1;3A", KeyAltDown: "\x1b[1;3B", KeyAltShfLeft: "\x1b[1;4D", KeyAltShfRight: "\x1b[1;4C", KeyAltShfUp: "\x1b[1;4A", KeyAltShfDown: "\x1b[1;4B", KeyMetaShfLeft: "\x1b[1;10D", KeyMetaShfRight: "\x1b[1;10C", KeyMetaShfUp: "\x1b[1;10A", KeyMetaShfDown: "\x1b[1;10B", KeyCtrlShfLeft: "\x1b[1;6D", KeyCtrlShfRight: "\x1b[1;6C", KeyCtrlShfUp: "\x1b[1;6A", KeyCtrlShfDown: "\x1b[1;6B", KeyShfHome: "\x1b[1;2H", KeyShfEnd: "\x1b[1;2F", KeyCtrlHome: "\x1b[1;5H", KeyCtrlEnd: "\x1b[1;5F", KeyAltHome: "\x1b[1;9H", KeyAltEnd: "\x1b[1;9F", KeyCtrlShfHome: "\x1b[1;6H", KeyCtrlShfEnd: "\x1b[1;6F", KeyMetaShfHome: "\x1b[1;10H", KeyMetaShfEnd: "\x1b[1;10F", KeyAltShfHome: "\x1b[1;4H", KeyAltShfEnd: "\x1b[1;4F", }) } tcell-1.3.0/terminfo/t/tvi910/000077500000000000000000000000001354173511300157435ustar00rootroot00000000000000tcell-1.3.0/terminfo/t/tvi910/term.go000066400000000000000000000015551354173511300172470ustar00rootroot00000000000000// Generated automatically. DO NOT HAND-EDIT. package tvi910 import "github.com/gdamore/tcell/terminfo" func init() { // televideo model 910 terminfo.AddTerminfo(&terminfo.Terminfo{ Name: "tvi910", Columns: 80, Lines: 24, Bell: "\a", Clear: "\x1a", AttrOff: "\x1bG0", Underline: "\x1bG8", Reverse: "\x1bG4", PadChar: "\x00", SetCursor: "\x1b=%p1%' '%+%c%p2%' '%+%c", CursorBack1: "\b", CursorUp1: "\v", KeyUp: "\v", KeyDown: "\n", KeyRight: "\f", KeyLeft: "\b", KeyBackspace: "\b", KeyHome: "\x1e", KeyF1: "\x01@\r", KeyF2: "\x01A\r", KeyF3: "\x01B\r", KeyF4: "\x01C\r", KeyF5: "\x01D\r", KeyF6: "\x01E\r", KeyF7: "\x01F\r", KeyF8: "\x01G\r", KeyF9: "\x01H\r", }) } tcell-1.3.0/terminfo/t/tvi912/000077500000000000000000000000001354173511300157455ustar00rootroot00000000000000tcell-1.3.0/terminfo/t/tvi912/term.go000066400000000000000000000015541354173511300172500ustar00rootroot00000000000000// Generated automatically. DO NOT HAND-EDIT. package tvi912 import "github.com/gdamore/tcell/terminfo" func init() { // old televideo 912/914/920 terminfo.AddTerminfo(&terminfo.Terminfo{ Name: "tvi912", Aliases: []string{"tvi914", "tvi920"}, Columns: 80, Lines: 24, Bell: "\a", Clear: "\x1a", Underline: "\x1bl", PadChar: "\x00", SetCursor: "\x1b=%p1%' '%+%c%p2%' '%+%c", CursorBack1: "\b", CursorUp1: "\v", KeyUp: "\v", KeyDown: "\n", KeyRight: "\f", KeyLeft: "\b", KeyBackspace: "\b", KeyHome: "\x1e", KeyF1: "\x01@\r", KeyF2: "\x01A\r", KeyF3: "\x01B\r", KeyF4: "\x01C\r", KeyF5: "\x01D\r", KeyF6: "\x01E\r", KeyF7: "\x01F\r", KeyF8: "\x01G\r", KeyF9: "\x01H\r", }) } tcell-1.3.0/terminfo/t/tvi921/000077500000000000000000000000001354173511300157455ustar00rootroot00000000000000tcell-1.3.0/terminfo/t/tvi921/term.go000066400000000000000000000014271354173511300172470ustar00rootroot00000000000000// Generated automatically. DO NOT HAND-EDIT. package tvi921 import "github.com/gdamore/tcell/terminfo" func init() { // televideo model 921 with sysline same as page & real vi function terminfo.AddTerminfo(&terminfo.Terminfo{ Name: "tvi921", Columns: 80, Lines: 24, Clear: "\x1a", ShowCursor: "\x1b.3", AttrOff: "\x1bG0", Underline: "\x1bG8", Reverse: "\x1bG4", PadChar: "\x00", EnterAcs: "\x1b$", ExitAcs: "\x1b%%", SetCursor: "\x1b=%p1%' '%+%c%p2%' '%+%c$<3/>", CursorBack1: "\b", CursorUp1: "\v", KeyUp: "\v", KeyDown: "\x16", KeyRight: "\f", KeyLeft: "\b", KeyInsert: "\x1bQ", KeyDelete: "\x1bW", KeyBackspace: "\b", KeyClear: "\x1a", }) } tcell-1.3.0/terminfo/t/tvi925/000077500000000000000000000000001354173511300157515ustar00rootroot00000000000000tcell-1.3.0/terminfo/t/tvi925/term.go000066400000000000000000000017151354173511300172530ustar00rootroot00000000000000// Generated automatically. DO NOT HAND-EDIT. package tvi925 import "github.com/gdamore/tcell/terminfo" func init() { // televideo 925 terminfo.AddTerminfo(&terminfo.Terminfo{ Name: "tvi925", Columns: 80, Lines: 24, Bell: "\a", Clear: "\x1a", ShowCursor: "\x1b.4", AttrOff: "\x1bG0", Underline: "\x1bG8", Reverse: "\x1bG4", PadChar: "\x00", SetCursor: "\x1b=%p1%' '%+%c%p2%' '%+%c", CursorBack1: "\b", CursorUp1: "\v", KeyUp: "\v", KeyDown: "\x16", KeyRight: "\f", KeyLeft: "\b", KeyInsert: "\x1bQ", KeyDelete: "\x1bW", KeyBackspace: "\b", KeyHome: "\x1e", KeyF1: "\x01@\r", KeyF2: "\x01A\r", KeyF3: "\x01B\r", KeyF4: "\x01C\r", KeyF5: "\x01D\r", KeyF6: "\x01E\r", KeyF7: "\x01F\r", KeyF8: "\x01G\r", KeyF9: "\x01H\r", KeyClear: "\x1a", }) } tcell-1.3.0/terminfo/t/tvi950/000077500000000000000000000000001354173511300157475ustar00rootroot00000000000000tcell-1.3.0/terminfo/t/tvi950/term.go000066400000000000000000000020411354173511300172420ustar00rootroot00000000000000// Generated automatically. DO NOT HAND-EDIT. package tvi950 import "github.com/gdamore/tcell/terminfo" func init() { // televideo 950 terminfo.AddTerminfo(&terminfo.Terminfo{ Name: "tvi950", Columns: 80, Lines: 24, Bell: "\a", Clear: "\x1b*", AttrOff: "\x1bG0", Underline: "\x1bG8", Reverse: "\x1bG4", PadChar: "\x00", AltChars: "b\tc\fd\re\ni\v", EnterAcs: "\x15", ExitAcs: "\x18", SetCursor: "\x1b=%p1%' '%+%c%p2%' '%+%c", CursorBack1: "\b", CursorUp1: "\v", KeyUp: "\v", KeyDown: "\x16", KeyRight: "\f", KeyLeft: "\b", KeyInsert: "\x1bQ", KeyDelete: "\x1bW", KeyBackspace: "\b", KeyHome: "\x1e", KeyF1: "\x01@\r", KeyF2: "\x01A\r", KeyF3: "\x01B\r", KeyF4: "\x01C\r", KeyF5: "\x01D\r", KeyF6: "\x01E\r", KeyF7: "\x01F\r", KeyF8: "\x01G\r", KeyF9: "\x01H\r", KeyClear: "\x1b*", KeyBacktab: "\x1bI", }) } tcell-1.3.0/terminfo/t/tvi970/000077500000000000000000000000001354173511300157515ustar00rootroot00000000000000tcell-1.3.0/terminfo/t/tvi970/term.go000066400000000000000000000016451354173511300172550ustar00rootroot00000000000000// Generated automatically. DO NOT HAND-EDIT. package tvi970 import "github.com/gdamore/tcell/terminfo" func init() { // televideo 970 terminfo.AddTerminfo(&terminfo.Terminfo{ Name: "tvi970", Columns: 80, Lines: 24, Clear: "\x1b[H\x1b[2J", EnterCA: "\x1b[?20l\x1b[?7h\x1b[1Q", AttrOff: "\x1b[m", Underline: "\x1b[4m", PadChar: "\x00", EnterAcs: "\x1b(B", ExitAcs: "\x1b(B", SetCursor: "\x1b[%i%p1%d;%p2%df", CursorBack1: "\b", CursorUp1: "\x1bM", KeyUp: "\x1b[A", KeyDown: "\x1b[B", KeyRight: "\x1b[C", KeyLeft: "\x1b[D", KeyBackspace: "\b", KeyHome: "\x1b[H", KeyF1: "\x1b?a", KeyF2: "\x1b?b", KeyF3: "\x1b?c", KeyF4: "\x1b?d", KeyF5: "\x1b?e", KeyF6: "\x1b?f", KeyF7: "\x1b?g", KeyF8: "\x1b?h", KeyF9: "\x1b?i", }) } tcell-1.3.0/terminfo/terminfo.go000066400000000000000000000440161354173511300166230ustar00rootroot00000000000000// Copyright 2019 The TCell Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use file except in compliance with the License. // You may obtain a copy of the license at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package terminfo import ( "bytes" "errors" "fmt" "io" "os" "strconv" "strings" "sync" "time" ) var ( // ErrTermNotFound indicates that a suitable terminal entry could // not be found. This can result from either not having TERM set, // or from the TERM failing to support certain minimal functionality, // in particular absolute cursor addressability (the cup capability) // is required. For example, legacy "adm3" lacks this capability, // whereas the slightly newer "adm3a" supports it. This failure // occurs most often with "dumb". ErrTermNotFound = errors.New("terminal entry not found") ) // Terminfo represents a terminfo entry. Note that we use friendly names // in Go, but when we write out JSON, we use the same names as terminfo. // The name, aliases and smous, rmous fields do not come from terminfo directly. type Terminfo struct { Name string Aliases []string Columns int // cols Lines int // lines Colors int // colors Bell string // bell Clear string // clear EnterCA string // smcup ExitCA string // rmcup ShowCursor string // cnorm HideCursor string // civis AttrOff string // sgr0 Underline string // smul Bold string // bold Blink string // blink Reverse string // rev Dim string // dim EnterKeypad string // smkx ExitKeypad string // rmkx SetFg string // setaf SetBg string // setab SetCursor string // cup CursorBack1 string // cub1 CursorUp1 string // cuu1 PadChar string // pad KeyBackspace string // kbs KeyF1 string // kf1 KeyF2 string // kf2 KeyF3 string // kf3 KeyF4 string // kf4 KeyF5 string // kf5 KeyF6 string // kf6 KeyF7 string // kf7 KeyF8 string // kf8 KeyF9 string // kf9 KeyF10 string // kf10 KeyF11 string // kf11 KeyF12 string // kf12 KeyF13 string // kf13 KeyF14 string // kf14 KeyF15 string // kf15 KeyF16 string // kf16 KeyF17 string // kf17 KeyF18 string // kf18 KeyF19 string // kf19 KeyF20 string // kf20 KeyF21 string // kf21 KeyF22 string // kf22 KeyF23 string // kf23 KeyF24 string // kf24 KeyF25 string // kf25 KeyF26 string // kf26 KeyF27 string // kf27 KeyF28 string // kf28 KeyF29 string // kf29 KeyF30 string // kf30 KeyF31 string // kf31 KeyF32 string // kf32 KeyF33 string // kf33 KeyF34 string // kf34 KeyF35 string // kf35 KeyF36 string // kf36 KeyF37 string // kf37 KeyF38 string // kf38 KeyF39 string // kf39 KeyF40 string // kf40 KeyF41 string // kf41 KeyF42 string // kf42 KeyF43 string // kf43 KeyF44 string // kf44 KeyF45 string // kf45 KeyF46 string // kf46 KeyF47 string // kf47 KeyF48 string // kf48 KeyF49 string // kf49 KeyF50 string // kf50 KeyF51 string // kf51 KeyF52 string // kf52 KeyF53 string // kf53 KeyF54 string // kf54 KeyF55 string // kf55 KeyF56 string // kf56 KeyF57 string // kf57 KeyF58 string // kf58 KeyF59 string // kf59 KeyF60 string // kf60 KeyF61 string // kf61 KeyF62 string // kf62 KeyF63 string // kf63 KeyF64 string // kf64 KeyInsert string // kich1 KeyDelete string // kdch1 KeyHome string // khome KeyEnd string // kend KeyHelp string // khlp KeyPgUp string // kpp KeyPgDn string // knp KeyUp string // kcuu1 KeyDown string // kcud1 KeyLeft string // kcub1 KeyRight string // kcuf1 KeyBacktab string // kcbt KeyExit string // kext KeyClear string // kclr KeyPrint string // kprt KeyCancel string // kcan Mouse string // kmous MouseMode string // XM AltChars string // acsc EnterAcs string // smacs ExitAcs string // rmacs EnableAcs string // enacs KeyShfRight string // kRIT KeyShfLeft string // kLFT KeyShfHome string // kHOM KeyShfEnd string // kEND // These are non-standard extensions to terminfo. This includes // true color support, and some additional keys. Its kind of bizarre // that shifted variants of left and right exist, but not up and down. // Terminal support for these are going to vary amongst XTerm // emulations, so don't depend too much on them in your application. SetFgBg string // setfgbg SetFgBgRGB string // setfgbgrgb SetFgRGB string // setfrgb SetBgRGB string // setbrgb KeyShfUp string // shift-up KeyShfDown string // shift-down KeyCtrlUp string // ctrl-up KeyCtrlDown string // ctrl-left KeyCtrlRight string // ctrl-right KeyCtrlLeft string // ctrl-left KeyMetaUp string // meta-up KeyMetaDown string // meta-left KeyMetaRight string // meta-right KeyMetaLeft string // meta-left KeyAltUp string // alt-up KeyAltDown string // alt-left KeyAltRight string // alt-right KeyAltLeft string // alt-left KeyCtrlHome string KeyCtrlEnd string KeyMetaHome string KeyMetaEnd string KeyAltHome string KeyAltEnd string KeyAltShfUp string KeyAltShfDown string KeyAltShfLeft string KeyAltShfRight string KeyMetaShfUp string KeyMetaShfDown string KeyMetaShfLeft string KeyMetaShfRight string KeyCtrlShfUp string KeyCtrlShfDown string KeyCtrlShfLeft string KeyCtrlShfRight string KeyCtrlShfHome string KeyCtrlShfEnd string KeyAltShfHome string KeyAltShfEnd string KeyMetaShfHome string KeyMetaShfEnd string } type stackElem struct { s string i int isStr bool isInt bool } type stack []stackElem func (st stack) Push(v string) stack { e := stackElem{ s: v, isStr: true, } return append(st, e) } func (st stack) Pop() (string, stack) { v := "" if len(st) > 0 { e := st[len(st)-1] st = st[:len(st)-1] if e.isStr { v = e.s } else { v = strconv.Itoa(e.i) } } return v, st } func (st stack) PopInt() (int, stack) { if len(st) > 0 { e := st[len(st)-1] st = st[:len(st)-1] if e.isInt { return e.i, st } else if e.isStr { i, _ := strconv.Atoi(e.s) return i, st } } return 0, st } func (st stack) PopBool() (bool, stack) { if len(st) > 0 { e := st[len(st)-1] st = st[:len(st)-1] if e.isStr { if e.s == "1" { return true, st } return false, st } else if e.i == 1 { return true, st } else { return false, st } } return false, st } func (st stack) PushInt(i int) stack { e := stackElem{ i: i, isInt: true, } return append(st, e) } func (st stack) PushBool(i bool) stack { if i { return st.PushInt(1) } return st.PushInt(0) } func nextch(s string, index int) (byte, int) { if index < len(s) { return s[index], index + 1 } return 0, index } // static vars var svars [26]string // paramsBuffer handles some persistent state for TParam. Technically we // could probably dispense with this, but caching buffer arrays gives us // a nice little performance boost. Furthermore, we know that TParam is // rarely (never?) called re-entrantly, so we can just reuse the same // buffers, making it thread-safe by stashing a lock. type paramsBuffer struct { out bytes.Buffer buf bytes.Buffer lk sync.Mutex } // Start initializes the params buffer with the initial string data. // It also locks the paramsBuffer. The caller must call End() when // finished. func (pb *paramsBuffer) Start(s string) { pb.lk.Lock() pb.out.Reset() pb.buf.Reset() pb.buf.WriteString(s) } // End returns the final output from TParam, but it also releases the lock. func (pb *paramsBuffer) End() string { s := pb.out.String() pb.lk.Unlock() return s } // NextCh returns the next input character to the expander. func (pb *paramsBuffer) NextCh() (byte, error) { return pb.buf.ReadByte() } // PutCh "emits" (rather schedules for output) a single byte character. func (pb *paramsBuffer) PutCh(ch byte) { pb.out.WriteByte(ch) } // PutString schedules a string for output. func (pb *paramsBuffer) PutString(s string) { pb.out.WriteString(s) } var pb = ¶msBuffer{} // TParm takes a terminfo parameterized string, such as setaf or cup, and // evaluates the string, and returns the result with the parameter // applied. func (t *Terminfo) TParm(s string, p ...int) string { var stk stack var a, b string var ai, bi int var ab bool var dvars [26]string var params [9]int pb.Start(s) // make sure we always have 9 parameters -- makes it easier // later to skip checks for i := 0; i < len(params) && i < len(p); i++ { params[i] = p[i] } nest := 0 for { ch, err := pb.NextCh() if err != nil { break } if ch != '%' { pb.PutCh(ch) continue } ch, err = pb.NextCh() if err != nil { // XXX Error break } switch ch { case '%': // quoted % pb.PutCh(ch) case 'i': // increment both parameters (ANSI cup support) params[0]++ params[1]++ case 'c', 's': // NB: these, and 'd' below are special cased for // efficiency. They could be handled by the richer // format support below, less efficiently. a, stk = stk.Pop() pb.PutString(a) case 'd': ai, stk = stk.PopInt() pb.PutString(strconv.Itoa(ai)) case '0', '1', '2', '3', '4', 'x', 'X', 'o', ':': // This is pretty suboptimal, but this is rarely used. // None of the mainstream terminals use any of this, // and it would surprise me if this code is ever // executed outside of test cases. f := "%" if ch == ':' { ch, _ = pb.NextCh() } f += string(ch) for ch == '+' || ch == '-' || ch == '#' || ch == ' ' { ch, _ = pb.NextCh() f += string(ch) } for (ch >= '0' && ch <= '9') || ch == '.' { ch, _ = pb.NextCh() f += string(ch) } switch ch { case 'd', 'x', 'X', 'o': ai, stk = stk.PopInt() pb.PutString(fmt.Sprintf(f, ai)) case 'c', 's': a, stk = stk.Pop() pb.PutString(fmt.Sprintf(f, a)) } case 'p': // push parameter ch, _ = pb.NextCh() ai = int(ch - '1') if ai >= 0 && ai < len(params) { stk = stk.PushInt(params[ai]) } else { stk = stk.PushInt(0) } case 'P': // pop & store variable ch, _ = pb.NextCh() if ch >= 'A' && ch <= 'Z' { svars[int(ch-'A')], stk = stk.Pop() } else if ch >= 'a' && ch <= 'z' { dvars[int(ch-'a')], stk = stk.Pop() } case 'g': // recall & push variable ch, _ = pb.NextCh() if ch >= 'A' && ch <= 'Z' { stk = stk.Push(svars[int(ch-'A')]) } else if ch >= 'a' && ch <= 'z' { stk = stk.Push(dvars[int(ch-'a')]) } case '\'': // push(char) ch, _ = pb.NextCh() pb.NextCh() // must be ' but we don't check stk = stk.Push(string(ch)) case '{': // push(int) ai = 0 ch, _ = pb.NextCh() for ch >= '0' && ch <= '9' { ai *= 10 ai += int(ch - '0') ch, _ = pb.NextCh() } // ch must be '}' but no verification stk = stk.PushInt(ai) case 'l': // push(strlen(pop)) a, stk = stk.Pop() stk = stk.PushInt(len(a)) case '+': bi, stk = stk.PopInt() ai, stk = stk.PopInt() stk = stk.PushInt(ai + bi) case '-': bi, stk = stk.PopInt() ai, stk = stk.PopInt() stk = stk.PushInt(ai - bi) case '*': bi, stk = stk.PopInt() ai, stk = stk.PopInt() stk = stk.PushInt(ai * bi) case '/': bi, stk = stk.PopInt() ai, stk = stk.PopInt() if bi != 0 { stk = stk.PushInt(ai / bi) } else { stk = stk.PushInt(0) } case 'm': // push(pop mod pop) bi, stk = stk.PopInt() ai, stk = stk.PopInt() if bi != 0 { stk = stk.PushInt(ai % bi) } else { stk = stk.PushInt(0) } case '&': // AND bi, stk = stk.PopInt() ai, stk = stk.PopInt() stk = stk.PushInt(ai & bi) case '|': // OR bi, stk = stk.PopInt() ai, stk = stk.PopInt() stk = stk.PushInt(ai | bi) case '^': // XOR bi, stk = stk.PopInt() ai, stk = stk.PopInt() stk = stk.PushInt(ai ^ bi) case '~': // bit complement ai, stk = stk.PopInt() stk = stk.PushInt(ai ^ -1) case '!': // logical NOT ai, stk = stk.PopInt() stk = stk.PushBool(ai != 0) case '=': // numeric compare or string compare b, stk = stk.Pop() a, stk = stk.Pop() stk = stk.PushBool(a == b) case '>': // greater than, numeric bi, stk = stk.PopInt() ai, stk = stk.PopInt() stk = stk.PushBool(ai > bi) case '<': // less than, numeric bi, stk = stk.PopInt() ai, stk = stk.PopInt() stk = stk.PushBool(ai < bi) case '?': // start conditional case 't': ab, stk = stk.PopBool() if ab { // just keep going break } nest = 0 ifloop: // this loop consumes everything until we hit our else, // or the end of the conditional for { ch, err = pb.NextCh() if err != nil { break } if ch != '%' { continue } ch, _ = pb.NextCh() switch ch { case ';': if nest == 0 { break ifloop } nest-- case '?': nest++ case 'e': if nest == 0 { break ifloop } } } case 'e': // if we got here, it means we didn't use the else // in the 't' case above, and we should skip until // the end of the conditional nest = 0 elloop: for { ch, err = pb.NextCh() if err != nil { break } if ch != '%' { continue } ch, _ = pb.NextCh() switch ch { case ';': if nest == 0 { break elloop } nest-- case '?': nest++ } } case ';': // endif } } return pb.End() } // TPuts emits the string to the writer, but expands inline padding // indications (of the form $<[delay]> where [delay] is msec) to // a suitable time (unless the terminfo string indicates this isn't needed // by specifying npc - no padding). All Terminfo based strings should be // emitted using this function. func (t *Terminfo) TPuts(w io.Writer, s string) { for { beg := strings.Index(s, "$<") if beg < 0 { // Most strings don't need padding, which is good news! io.WriteString(w, s) return } io.WriteString(w, s[:beg]) s = s[beg+2:] end := strings.Index(s, ">") if end < 0 { // unterminated.. just emit bytes unadulterated io.WriteString(w, "$<"+s) return } val := s[:end] s = s[end+1:] padus := 0 unit := time.Millisecond dot := false loop: for i := range val { switch val[i] { case '0', '1', '2', '3', '4', '5', '6', '7', '8', '9': padus *= 10 padus += int(val[i] - '0') if dot { unit /= 10 } case '.': if !dot { dot = true } else { break loop } default: break loop } } // Curses historically uses padding to achieve "fine grained" // delays. We have much better clocks these days, and so we // do not rely on padding but simply sleep a bit. if len(t.PadChar) > 0 { time.Sleep(unit * time.Duration(padus)) } } } // TGoto returns a string suitable for addressing the cursor at the given // row and column. The origin 0, 0 is in the upper left corner of the screen. func (t *Terminfo) TGoto(col, row int) string { return t.TParm(t.SetCursor, row, col) } // TColor returns a string corresponding to the given foreground and background // colors. Either fg or bg can be set to -1 to elide. func (t *Terminfo) TColor(fi, bi int) string { rv := "" // As a special case, we map bright colors to lower versions if the // color table only holds 8. For the remaining 240 colors, the user // is out of luck. Someday we could create a mapping table, but its // not worth it. if t.Colors == 8 { if fi > 7 && fi < 16 { fi -= 8 } if bi > 7 && bi < 16 { bi -= 8 } } if t.Colors > fi && fi >= 0 { rv += t.TParm(t.SetFg, fi) } if t.Colors > bi && bi >= 0 { rv += t.TParm(t.SetBg, bi) } return rv } var ( dblock sync.Mutex terminfos = make(map[string]*Terminfo) aliases = make(map[string]string) ) // AddTerminfo can be called to register a new Terminfo entry. func AddTerminfo(t *Terminfo) { dblock.Lock() terminfos[t.Name] = t for _, x := range t.Aliases { terminfos[x] = t } dblock.Unlock() } // LookupTerminfo attempts to find a definition for the named $TERM. func LookupTerminfo(name string) (*Terminfo, error) { if name == "" { // else on windows: index out of bounds // on the name[0] reference below return nil, ErrTermNotFound } addtruecolor := false switch os.Getenv("COLORTERM") { case "truecolor", "24bit", "24-bit": addtruecolor = true } dblock.Lock() t := terminfos[name] dblock.Unlock() // If the name ends in -truecolor, then fabricate an entry // from the corresponding -256color, -color, or bare terminal. if t == nil && strings.HasSuffix(name, "-truecolor") { suffixes := []string{ "-256color", "-88color", "-color", "", } base := name[:len(name)-len("-truecolor")] for _, s := range suffixes { if t, _ = LookupTerminfo(base + s); t != nil { addtruecolor = true break } } } if t == nil { return nil, ErrTermNotFound } switch os.Getenv("TCELL_TRUECOLOR") { case "": case "disable": addtruecolor = false default: addtruecolor = true } // If the user has requested 24-bit color with $COLORTERM, then // amend the value (unless already present). This means we don't // need to have a value present. if addtruecolor && t.SetFgBgRGB == "" && t.SetFgRGB == "" && t.SetBgRGB == "" { // Supply vanilla ISO 8613-6:1994 24-bit color sequences. t.SetFgRGB = "\x1b[38;2;%p1%d;%p2%d;%p3%dm" t.SetBgRGB = "\x1b[48;2;%p1%d;%p2%d;%p3%dm" t.SetFgBgRGB = "\x1b[38;2;%p1%d;%p2%d;%p3%d;" + "48;2;%p4%d;%p5%d;%p6%dm" } return t, nil } tcell-1.3.0/terminfo/terminfo_test.go000066400000000000000000000052131354173511300176560ustar00rootroot00000000000000// Copyright 2019 The TCell Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use file except in compliance with the License. // You may obtain a copy of the license at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package terminfo import ( "bytes" "testing" "time" ) // This terminfo entry is a stripped down version from // xterm-256color, but I've added some of my own entries. var testTerminfo = &Terminfo{ Name: "simulation_test", Columns: 80, Lines: 24, Colors: 256, Bell: "\a", Blink: "\x1b2ms$<20>something", Reverse: "\x1b[7m", SetFg: "\x1b[%?%p1%{8}%<%t3%p1%d%e%p1%{16}%<%t9%p1%{8}%-%d%e38;5;%p1%d%;m", SetBg: "\x1b[%?%p1%{8}%<%t4%p1%d%e%p1%{16}%<%t10%p1%{8}%-%d%e48;5;%p1%d%;m", AltChars: "``aaffggiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~", Mouse: "\x1b[M", MouseMode: "%?%p1%{1}%=%t%'h'%Pa%e%'l'%Pa%;\x1b[?1000%ga%c\x1b[?1003%ga%c\x1b[?1006%ga%c", SetCursor: "\x1b[%i%p1%d;%p2%dH", PadChar: "\x00", } func TestTerminfoExpansion(t *testing.T) { ti := testTerminfo // Tests %i and basic parameter strings too if ti.TGoto(7, 9) != "\x1b[10;8H" { t.Error("TGoto expansion failed") } // This tests some conditionals if ti.TParm("A[%p1%2.2X]B", 47) != "A[2F]B" { t.Error("TParm conditionals failed") } // Color tests. if ti.TParm(ti.SetFg, 7) != "\x1b[37m" { t.Error("SetFg(7) failed") } if ti.TParm(ti.SetFg, 15) != "\x1b[97m" { t.Error("SetFg(15) failed") } if ti.TParm(ti.SetFg, 200) != "\x1b[38;5;200m" { t.Error("SetFg(200) failed") } if ti.TParm(ti.MouseMode, 1) != "\x1b[?1000h\x1b[?1003h\x1b[?1006h" { t.Error("Enable mouse mode failed") } if ti.TParm(ti.MouseMode, 0) != "\x1b[?1000l\x1b[?1003l\x1b[?1006l" { t.Error("Disable mouse mode failed") } } func TestTerminfoDelay(t *testing.T) { ti := testTerminfo buf := bytes.NewBuffer(nil) now := time.Now() ti.TPuts(buf, ti.Blink) then := time.Now() s := string(buf.Bytes()) if s != "\x1b2mssomething" { t.Errorf("Terminfo delay failed: %s", s) } if then.Sub(now) < time.Millisecond*20 { t.Error("Too short delay") } if then.Sub(now) > time.Millisecond*50 { t.Error("Too late delay") } } func BenchmarkSetFgBg(b *testing.B) { ti := testTerminfo for i := 0; i < b.N; i++ { ti.TParm(ti.SetFg, 100, 200) ti.TParm(ti.SetBg, 100, 200) } } tcell-1.3.0/terminfo/v/000077500000000000000000000000001354173511300147115ustar00rootroot00000000000000tcell-1.3.0/terminfo/v/vt100/000077500000000000000000000000001354173511300155635ustar00rootroot00000000000000tcell-1.3.0/terminfo/v/vt100/term.go000066400000000000000000000023341354173511300170630ustar00rootroot00000000000000// Generated automatically. DO NOT HAND-EDIT. package vt100 import "github.com/gdamore/tcell/terminfo" func init() { // dec vt100 (w/advanced video) terminfo.AddTerminfo(&terminfo.Terminfo{ Name: "vt100", Aliases: []string{"vt100-am"}, Columns: 80, Lines: 24, Bell: "\a", Clear: "\x1b[H\x1b[J$<50>", AttrOff: "\x1b[m\x0f$<2>", Underline: "\x1b[4m$<2>", Bold: "\x1b[1m$<2>", Blink: "\x1b[5m$<2>", Reverse: "\x1b[7m$<2>", EnterKeypad: "\x1b[?1h\x1b=", ExitKeypad: "\x1b[?1l\x1b>", PadChar: "\x00", AltChars: "``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~", EnterAcs: "\x0e", ExitAcs: "\x0f", EnableAcs: "\x1b(B\x1b)0", SetCursor: "\x1b[%i%p1%d;%p2%dH$<5>", CursorBack1: "\b", CursorUp1: "\x1b[A$<2>", KeyUp: "\x1bOA", KeyDown: "\x1bOB", KeyRight: "\x1bOC", KeyLeft: "\x1bOD", KeyBackspace: "\b", KeyF1: "\x1bOP", KeyF2: "\x1bOQ", KeyF3: "\x1bOR", KeyF4: "\x1bOS", KeyF5: "\x1bOt", KeyF6: "\x1bOu", KeyF7: "\x1bOv", KeyF8: "\x1bOl", KeyF9: "\x1bOw", KeyF10: "\x1bOx", }) } tcell-1.3.0/terminfo/v/vt102/000077500000000000000000000000001354173511300155655ustar00rootroot00000000000000tcell-1.3.0/terminfo/v/vt102/term.go000066400000000000000000000022431354173511300170640ustar00rootroot00000000000000// Generated automatically. DO NOT HAND-EDIT. package vt102 import "github.com/gdamore/tcell/terminfo" func init() { // dec vt102 terminfo.AddTerminfo(&terminfo.Terminfo{ Name: "vt102", Columns: 80, Lines: 24, Bell: "\a", Clear: "\x1b[H\x1b[J$<50>", AttrOff: "\x1b[m\x0f$<2>", Underline: "\x1b[4m$<2>", Bold: "\x1b[1m$<2>", Blink: "\x1b[5m$<2>", Reverse: "\x1b[7m$<2>", EnterKeypad: "\x1b[?1h\x1b=", ExitKeypad: "\x1b[?1l\x1b>", PadChar: "\x00", AltChars: "``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~", EnterAcs: "\x0e", ExitAcs: "\x0f", EnableAcs: "\x1b(B\x1b)0", SetCursor: "\x1b[%i%p1%d;%p2%dH$<5>", CursorBack1: "\b", CursorUp1: "\x1b[A$<2>", KeyUp: "\x1bOA", KeyDown: "\x1bOB", KeyRight: "\x1bOC", KeyLeft: "\x1bOD", KeyBackspace: "\b", KeyF1: "\x1bOP", KeyF2: "\x1bOQ", KeyF3: "\x1bOR", KeyF4: "\x1bOS", KeyF5: "\x1bOt", KeyF6: "\x1bOu", KeyF7: "\x1bOv", KeyF8: "\x1bOl", KeyF9: "\x1bOw", KeyF10: "\x1bOx", }) } tcell-1.3.0/terminfo/v/vt220/000077500000000000000000000000001354173511300155665ustar00rootroot00000000000000tcell-1.3.0/terminfo/v/vt220/term.go000066400000000000000000000027031354173511300170660ustar00rootroot00000000000000// Generated automatically. DO NOT HAND-EDIT. package vt220 import "github.com/gdamore/tcell/terminfo" func init() { // dec vt220 terminfo.AddTerminfo(&terminfo.Terminfo{ Name: "vt220", Aliases: []string{"vt200"}, Columns: 80, Lines: 24, Bell: "\a", Clear: "\x1b[H\x1b[J", AttrOff: "\x1b[m\x1b(B", Underline: "\x1b[4m", Bold: "\x1b[1m", Blink: "\x1b[5m", Reverse: "\x1b[7m", PadChar: "\x00", AltChars: "``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~", EnterAcs: "\x1b(0$<2>", ExitAcs: "\x1b(B$<4>", EnableAcs: "\x1b)0", SetCursor: "\x1b[%i%p1%d;%p2%dH", CursorBack1: "\b", CursorUp1: "\x1b[A", KeyUp: "\x1b[A", KeyDown: "\x1b[B", KeyRight: "\x1b[C", KeyLeft: "\x1b[D", KeyInsert: "\x1b[2~", KeyDelete: "\x1b[3~", KeyBackspace: "\b", KeyPgUp: "\x1b[5~", KeyPgDn: "\x1b[6~", KeyF1: "\x1bOP", KeyF2: "\x1bOQ", KeyF3: "\x1bOR", KeyF4: "\x1bOS", KeyF6: "\x1b[17~", KeyF7: "\x1b[18~", KeyF8: "\x1b[19~", KeyF9: "\x1b[20~", KeyF10: "\x1b[21~", KeyF11: "\x1b[23~", KeyF12: "\x1b[24~", KeyF13: "\x1b[25~", KeyF14: "\x1b[26~", KeyF17: "\x1b[31~", KeyF18: "\x1b[32~", KeyF19: "\x1b[33~", KeyF20: "\x1b[34~", KeyHelp: "\x1b[28~", }) } tcell-1.3.0/terminfo/v/vt320/000077500000000000000000000000001354173511300155675ustar00rootroot00000000000000tcell-1.3.0/terminfo/v/vt320/term.go000066400000000000000000000031461354173511300170710ustar00rootroot00000000000000// Generated automatically. DO NOT HAND-EDIT. package vt320 import "github.com/gdamore/tcell/terminfo" func init() { // dec vt320 7 bit terminal terminfo.AddTerminfo(&terminfo.Terminfo{ Name: "vt320", Aliases: []string{"vt300"}, Columns: 80, Lines: 24, Bell: "\a", Clear: "\x1b[H\x1b[2J", ShowCursor: "\x1b[?25h", HideCursor: "\x1b[?25l", AttrOff: "\x1b[m\x1b(B", Underline: "\x1b[4m", Bold: "\x1b[1m", Blink: "\x1b[5m", Reverse: "\x1b[7m", EnterKeypad: "\x1b[?1h\x1b=", ExitKeypad: "\x1b[?1l\x1b>", PadChar: "\x00", AltChars: "``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~", EnterAcs: "\x1b(0", ExitAcs: "\x1b(B", SetCursor: "\x1b[%i%p1%d;%p2%dH", CursorBack1: "\b", CursorUp1: "\x1b[A", KeyUp: "\x1bOA", KeyDown: "\x1bOB", KeyRight: "\x1bOC", KeyLeft: "\x1bOD", KeyInsert: "\x1b[2~", KeyDelete: "\x1b[3~", KeyBackspace: "\xff", KeyHome: "\x1b[1~", KeyPgUp: "\x1b[5~", KeyPgDn: "\x1b[6~", KeyF1: "\x1bOP", KeyF2: "\x1bOQ", KeyF3: "\x1bOR", KeyF4: "\x1bOS", KeyF6: "\x1b[17~", KeyF7: "\x1b[18~", KeyF8: "\x1b[19~", KeyF9: "\x1b[20~", KeyF10: "\x1b[21~", KeyF11: "\x1b[23~", KeyF12: "\x1b[24~", KeyF13: "\x1b[25~", KeyF14: "\x1b[26~", KeyF15: "\x1b[28~", KeyF16: "\x1b[29~", KeyF17: "\x1b[31~", KeyF18: "\x1b[32~", KeyF19: "\x1b[33~", KeyF20: "\x1b[34~", }) } tcell-1.3.0/terminfo/v/vt400/000077500000000000000000000000001354173511300155665ustar00rootroot00000000000000tcell-1.3.0/terminfo/v/vt400/term.go000066400000000000000000000022571354173511300170720ustar00rootroot00000000000000// Generated automatically. DO NOT HAND-EDIT. package vt400 import "github.com/gdamore/tcell/terminfo" func init() { // dec vt400 24x80 column autowrap terminfo.AddTerminfo(&terminfo.Terminfo{ Name: "vt400", Aliases: []string{"vt400-24", "dec-vt400"}, Columns: 80, Lines: 24, Clear: "\x1b[H\x1b[J$<10/>", ShowCursor: "\x1b[?25h", HideCursor: "\x1b[?25l", AttrOff: "\x1b[m\x1b(B", Underline: "\x1b[4m", Bold: "\x1b[1m", Blink: "\x1b[5m", Reverse: "\x1b[7m", EnterKeypad: "\x1b[?1h\x1b=", ExitKeypad: "\x1b[?1l\x1b>", PadChar: "\x00", AltChars: "``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~", EnterAcs: "\x1b(0", ExitAcs: "\x1b(B", SetCursor: "\x1b[%i%p1%d;%p2%dH", CursorBack1: "\b", CursorUp1: "\x1b[A", KeyUp: "\x1bOA", KeyDown: "\x1bOB", KeyRight: "\x1bOC", KeyLeft: "\x1bOD", KeyBackspace: "\b", KeyF1: "\x1bOP", KeyF2: "\x1bOQ", KeyF3: "\x1bOR", KeyF4: "\x1bOS", KeyF6: "\x1b[17~", KeyF7: "\x1b[18~", KeyF8: "\x1b[19~", KeyF9: "\x1b[20~", }) } tcell-1.3.0/terminfo/v/vt420/000077500000000000000000000000001354173511300155705ustar00rootroot00000000000000tcell-1.3.0/terminfo/v/vt420/term.go000066400000000000000000000025071354173511300170720ustar00rootroot00000000000000// Generated automatically. DO NOT HAND-EDIT. package vt420 import "github.com/gdamore/tcell/terminfo" func init() { // DEC VT420 terminfo.AddTerminfo(&terminfo.Terminfo{ Name: "vt420", Columns: 80, Lines: 24, Bell: "\a", Clear: "\x1b[H\x1b[2J$<50>", ShowCursor: "\x1b[?25h", HideCursor: "\x1b[?25l", AttrOff: "\x1b[m\x1b(B$<2>", Underline: "\x1b[4m", Bold: "\x1b[1m$<2>", Blink: "\x1b[5m$<2>", Reverse: "\x1b[7m$<2>", EnterKeypad: "\x1b=", ExitKeypad: "\x1b>", PadChar: "\x00", AltChars: "``aaffggjjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~", EnterAcs: "\x1b(0$<2>", ExitAcs: "\x1b(B$<4>", EnableAcs: "\x1b)0", SetCursor: "\x1b[%i%p1%d;%p2%dH$<10>", CursorBack1: "\b", CursorUp1: "\x1b[A", KeyUp: "\x1b[A", KeyDown: "\x1b[B", KeyRight: "\x1b[C", KeyLeft: "\x1b[D", KeyInsert: "\x1b[2~", KeyDelete: "\x1b[3~", KeyBackspace: "\b", KeyPgUp: "\x1b[5~", KeyPgDn: "\x1b[6~", KeyF1: "\x1bOP", KeyF2: "\x1bOQ", KeyF3: "\x1bOR", KeyF4: "\x1bOS", KeyF5: "\x1b[17~", KeyF6: "\x1b[18~", KeyF7: "\x1b[19~", KeyF8: "\x1b[20~", KeyF9: "\x1b[21~", KeyF10: "\x1b[29~", }) } tcell-1.3.0/terminfo/v/vt52/000077500000000000000000000000001354173511300155115ustar00rootroot00000000000000tcell-1.3.0/terminfo/v/vt52/term.go000066400000000000000000000011671354173511300170140ustar00rootroot00000000000000// Generated automatically. DO NOT HAND-EDIT. package vt52 import "github.com/gdamore/tcell/terminfo" func init() { // dec vt52 terminfo.AddTerminfo(&terminfo.Terminfo{ Name: "vt52", Columns: 80, Lines: 24, Bell: "\a", Clear: "\x1bH\x1bJ", PadChar: "\x00", AltChars: "+h.k0affggolpnqprrss", EnterAcs: "\x1bF", ExitAcs: "\x1bG", SetCursor: "\x1bY%p1%' '%+%c%p2%' '%+%c", CursorBack1: "\x1bD", CursorUp1: "\x1bA", KeyUp: "\x1bA", KeyDown: "\x1bB", KeyRight: "\x1bC", KeyLeft: "\x1bD", KeyBackspace: "\b", }) } tcell-1.3.0/terminfo/w/000077500000000000000000000000001354173511300147125ustar00rootroot00000000000000tcell-1.3.0/terminfo/w/wy50/000077500000000000000000000000001354173511300155165ustar00rootroot00000000000000tcell-1.3.0/terminfo/w/wy50/term.go000066400000000000000000000026431354173511300170210ustar00rootroot00000000000000// Generated automatically. DO NOT HAND-EDIT. package wy50 import "github.com/gdamore/tcell/terminfo" func init() { // Wyse 50 terminfo.AddTerminfo(&terminfo.Terminfo{ Name: "wy50", Aliases: []string{"wyse50"}, Columns: 80, Lines: 24, Bell: "\a", Clear: "\x1b+$<20>", ShowCursor: "\x1b`1", HideCursor: "\x1b`0", AttrOff: "\x1b(\x1bH\x03", Dim: "\x1b`7\x1b)", Reverse: "\x1b`6\x1b)", PadChar: "\x00", AltChars: "0wa_h[jukslrmqnxqzttuyv]wpxv", EnterAcs: "\x1bH\x02", ExitAcs: "\x1bH\x03", SetCursor: "\x1b=%p1%' '%+%c%p2%' '%+%c", CursorBack1: "\b", CursorUp1: "\v", KeyUp: "\v", KeyDown: "\n", KeyRight: "\f", KeyLeft: "\b", KeyInsert: "\x1bQ", KeyDelete: "\x1bW", KeyBackspace: "\b", KeyHome: "\x1e", KeyPgUp: "\x1bJ", KeyPgDn: "\x1bK", KeyF1: "\x01@\r", KeyF2: "\x01A\r", KeyF3: "\x01B\r", KeyF4: "\x01C\r", KeyF5: "\x01D\r", KeyF6: "\x01E\r", KeyF7: "\x01F\r", KeyF8: "\x01G\r", KeyF9: "\x01H\r", KeyF10: "\x01I\r", KeyF11: "\x01J\r", KeyF12: "\x01K\r", KeyF13: "\x01L\r", KeyF14: "\x01M\r", KeyF15: "\x01N\r", KeyF16: "\x01O\r", KeyPrint: "\x1bP", KeyBacktab: "\x1bI", KeyShfHome: "\x1b{", }) } tcell-1.3.0/terminfo/w/wy60/000077500000000000000000000000001354173511300155175ustar00rootroot00000000000000tcell-1.3.0/terminfo/w/wy60/term.go000066400000000000000000000030321354173511300170130ustar00rootroot00000000000000// Generated automatically. DO NOT HAND-EDIT. package wy60 import "github.com/gdamore/tcell/terminfo" func init() { // Wyse 60 terminfo.AddTerminfo(&terminfo.Terminfo{ Name: "wy60", Aliases: []string{"wyse60"}, Columns: 80, Lines: 24, Bell: "\a", Clear: "\x1b+$<100>", EnterCA: "\x1bw0", ExitCA: "\x1bw1", ShowCursor: "\x1b`1", HideCursor: "\x1b`0", AttrOff: "\x1b(\x1bH\x03\x1bG0\x1bcD", Underline: "\x1bG8", Dim: "\x1bGp", Blink: "\x1bG2", Reverse: "\x1bG4", PadChar: "\x00", AltChars: "+/,.0[a2fxgqh1ihjYk?lZm@nEqDtCu4vAwBx3yszr{c~~", EnterAcs: "\x1bcE", ExitAcs: "\x1bcD", SetCursor: "\x1b=%p1%' '%+%c%p2%' '%+%c", CursorBack1: "\b", CursorUp1: "\v", KeyUp: "\v", KeyDown: "\n", KeyRight: "\f", KeyLeft: "\b", KeyInsert: "\x1bQ", KeyDelete: "\x1bW", KeyBackspace: "\b", KeyHome: "\x1e", KeyPgUp: "\x1bJ", KeyPgDn: "\x1bK", KeyF1: "\x01@\r", KeyF2: "\x01A\r", KeyF3: "\x01B\r", KeyF4: "\x01C\r", KeyF5: "\x01D\r", KeyF6: "\x01E\r", KeyF7: "\x01F\r", KeyF8: "\x01G\r", KeyF9: "\x01H\r", KeyF10: "\x01I\r", KeyF11: "\x01J\r", KeyF12: "\x01K\r", KeyF13: "\x01L\r", KeyF14: "\x01M\r", KeyF15: "\x01N\r", KeyF16: "\x01O\r", KeyPrint: "\x1bP", KeyBacktab: "\x1bI", KeyShfHome: "\x1b{", }) } tcell-1.3.0/terminfo/w/wy99_ansi/000077500000000000000000000000001354173511300165455ustar00rootroot00000000000000tcell-1.3.0/terminfo/w/wy99_ansi/term.go000066400000000000000000000057671354173511300200620ustar00rootroot00000000000000// Generated automatically. DO NOT HAND-EDIT. package wy99_ansi import "github.com/gdamore/tcell/terminfo" func init() { // Wyse WY-99GT in ansi mode (int'l PC keyboard) terminfo.AddTerminfo(&terminfo.Terminfo{ Name: "wy99-ansi", Columns: 80, Lines: 25, Bell: "\a", Clear: "\x1b[H\x1b[J$<200>", ShowCursor: "\x1b[34h\x1b[?25h", HideCursor: "\x1b[?25l", AttrOff: "\x1b[m\x0f\x1b[\"q", Underline: "\x1b[4m", Bold: "\x1b[1m", Dim: "\x1b[2m", Blink: "\x1b[5m", Reverse: "\x1b[7m", EnterKeypad: "\x1b[?1h", ExitKeypad: "\x1b[?1l", PadChar: "\x00", AltChars: "``aaffggjjkkllmmnnooqqssttuuvvwwxx{{||}}~~", EnterAcs: "\x0e", ExitAcs: "\x0f", EnableAcs: "\x1b)0", SetCursor: "\x1b[%i%p1%d;%p2%dH", CursorBack1: "\b$<1>", CursorUp1: "\x1bM", KeyUp: "\x1bOA", KeyDown: "\x1bOB", KeyRight: "\x1bOC", KeyLeft: "\x1bOD", KeyBackspace: "\b", KeyF1: "\x1bOP", KeyF2: "\x1bOQ", KeyF3: "\x1bOR", KeyF4: "\x1bOS", KeyF5: "\x1b[M", KeyF6: "\x1b[17~", KeyF7: "\x1b[18~", KeyF8: "\x1b[19~", KeyF9: "\x1b[20~", KeyF10: "\x1b[21~", KeyF11: "\x1b[23~", KeyF12: "\x1b[24~", KeyF17: "\x1b[K", KeyF18: "\x1b[31~", KeyF19: "\x1b[32~", KeyF20: "\x1b[33~", KeyF21: "\x1b[34~", KeyF22: "\x1b[35~", KeyF23: "\x1b[1~", KeyF24: "\x1b[2~", KeyBacktab: "\x1b[z", }) // Wyse WY-99GT in ansi mode (US PC keyboard) terminfo.AddTerminfo(&terminfo.Terminfo{ Name: "wy99a-ansi", Columns: 80, Lines: 25, Bell: "\a", Clear: "\x1b[H\x1b[J$<200>", ShowCursor: "\x1b[34h\x1b[?25h", HideCursor: "\x1b[?25l", AttrOff: "\x1b[m\x0f\x1b[\"q", Underline: "\x1b[4m", Bold: "\x1b[1m", Dim: "\x1b[2m", Blink: "\x1b[5m", Reverse: "\x1b[7m", EnterKeypad: "\x1b[?1h", ExitKeypad: "\x1b[?1l", PadChar: "\x00", AltChars: "``aaffggjjkkllmmnnooqqssttuuvvwwxx{{||}}~~", EnterAcs: "\x0e", ExitAcs: "\x0f", EnableAcs: "\x1b)0", SetCursor: "\x1b[%i%p1%d;%p2%dH", CursorBack1: "\b$<1>", CursorUp1: "\x1bM", KeyUp: "\x1bOA", KeyDown: "\x1bOB", KeyRight: "\x1bOC", KeyLeft: "\x1bOD", KeyBackspace: "\b", KeyF1: "\x1bOP", KeyF2: "\x1bOQ", KeyF3: "\x1bOR", KeyF4: "\x1bOS", KeyF5: "\x1b[M", KeyF6: "\x1b[17~", KeyF7: "\x1b[18~", KeyF8: "\x1b[19~", KeyF9: "\x1b[20~", KeyF10: "\x1b[21~", KeyF11: "\x1b[23~", KeyF12: "\x1b[24~", KeyF17: "\x1b[K", KeyF18: "\x1b[31~", KeyF19: "\x1b[32~", KeyF20: "\x1b[33~", KeyF21: "\x1b[34~", KeyF22: "\x1b[35~", KeyF23: "\x1b[1~", KeyF24: "\x1b[2~", KeyBacktab: "\x1b[z", }) } tcell-1.3.0/terminfo/x/000077500000000000000000000000001354173511300147135ustar00rootroot00000000000000tcell-1.3.0/terminfo/x/xfce/000077500000000000000000000000001354173511300156405ustar00rootroot00000000000000tcell-1.3.0/terminfo/x/xfce/term.go000066400000000000000000000114241354173511300171400ustar00rootroot00000000000000// Generated automatically. DO NOT HAND-EDIT. package xfce import "github.com/gdamore/tcell/terminfo" func init() { // Xfce Terminal terminfo.AddTerminfo(&terminfo.Terminfo{ Name: "xfce", Columns: 80, Lines: 24, Colors: 8, Bell: "\a", Clear: "\x1b[H\x1b[2J", EnterCA: "\x1b7\x1b[?47h", ExitCA: "\x1b[2J\x1b[?47l\x1b8", ShowCursor: "\x1b[?25h", HideCursor: "\x1b[?25l", AttrOff: "\x1b[0m\x0f", Underline: "\x1b[4m", Bold: "\x1b[1m", Reverse: "\x1b[7m", EnterKeypad: "\x1b[?1h\x1b=", ExitKeypad: "\x1b[?1l\x1b>", SetFg: "\x1b[3%p1%dm", SetBg: "\x1b[4%p1%dm", SetFgBg: "\x1b[3%p1%d;4%p2%dm", PadChar: "\x00", AltChars: "``aaffggiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~", EnterAcs: "\x0e", ExitAcs: "\x0f", EnableAcs: "\x1b)0", Mouse: "\x1b[M", MouseMode: "%?%p1%{1}%=%t%'h'%Pa%e%'l'%Pa%;\x1b[?1000%ga%c\x1b[?1002%ga%c\x1b[?1003%ga%c\x1b[?1006%ga%c", SetCursor: "\x1b[%i%p1%d;%p2%dH", CursorBack1: "\b", CursorUp1: "\x1b[A", KeyUp: "\x1bOA", KeyDown: "\x1bOB", KeyRight: "\x1bOC", KeyLeft: "\x1bOD", KeyInsert: "\x1b[2~", KeyDelete: "\x1b[3~", KeyBackspace: "\xff", KeyHome: "\x1bOH", KeyEnd: "\x1bOF", KeyPgUp: "\x1b[5~", KeyPgDn: "\x1b[6~", KeyF1: "\x1bOP", KeyF2: "\x1bOQ", KeyF3: "\x1bOR", KeyF4: "\x1bOS", KeyF5: "\x1b[15~", KeyF6: "\x1b[17~", KeyF7: "\x1b[18~", KeyF8: "\x1b[19~", KeyF9: "\x1b[20~", KeyF10: "\x1b[21~", KeyF11: "\x1b[23~", KeyF12: "\x1b[24~", KeyF13: "\x1bO1;2P", KeyF14: "\x1bO1;2Q", KeyF15: "\x1bO1;2R", KeyF16: "\x1bO1;2S", KeyF17: "\x1b[15;2~", KeyF18: "\x1b[17;2~", KeyF19: "\x1b[18;2~", KeyF20: "\x1b[19;2~", KeyF21: "\x1b[20;2~", KeyF22: "\x1b[21;2~", KeyF23: "\x1b[23;2~", KeyF24: "\x1b[24;2~", KeyF25: "\x1bO1;5P", KeyF26: "\x1bO1;5Q", KeyF27: "\x1bO1;5R", KeyF28: "\x1bO1;5S", KeyF29: "\x1b[15;5~", KeyF30: "\x1b[17;5~", KeyF31: "\x1b[18;5~", KeyF32: "\x1b[19;5~", KeyF33: "\x1b[20;5~", KeyF34: "\x1b[21;5~", KeyF35: "\x1b[23;5~", KeyF36: "\x1b[24;5~", KeyF37: "\x1bO1;6P", KeyF38: "\x1bO1;6Q", KeyF39: "\x1bO1;6R", KeyF40: "\x1bO1;6S", KeyF41: "\x1b[15;6~", KeyF42: "\x1b[17;6~", KeyF43: "\x1b[18;6~", KeyF44: "\x1b[19;6~", KeyF45: "\x1b[20;6~", KeyF46: "\x1b[21;6~", KeyF47: "\x1b[23;6~", KeyF48: "\x1b[24;6~", KeyF49: "\x1bO1;3P", KeyF50: "\x1bO1;3Q", KeyF51: "\x1bO1;3R", KeyF52: "\x1bO1;3S", KeyF53: "\x1b[15;3~", KeyF54: "\x1b[17;3~", KeyF55: "\x1b[18;3~", KeyF56: "\x1b[19;3~", KeyF57: "\x1b[20;3~", KeyF58: "\x1b[21;3~", KeyF59: "\x1b[23;3~", KeyF60: "\x1b[24;3~", KeyF61: "\x1bO1;4P", KeyF62: "\x1bO1;4Q", KeyF63: "\x1bO1;4R", KeyBacktab: "\x1b[Z", KeyShfLeft: "\x1b[1;2D", KeyShfRight: "\x1b[1;2C", KeyShfUp: "\x1b[1;2A", KeyShfDown: "\x1b[1;2B", KeyCtrlLeft: "\x1b[1;5D", KeyCtrlRight: "\x1b[1;5C", KeyCtrlUp: "\x1b[1;5A", KeyCtrlDown: "\x1b[1;5B", KeyMetaLeft: "\x1b[1;9D", KeyMetaRight: "\x1b[1;9C", KeyMetaUp: "\x1b[1;9A", KeyMetaDown: "\x1b[1;9B", KeyAltLeft: "\x1b[1;3D", KeyAltRight: "\x1b[1;3C", KeyAltUp: "\x1b[1;3A", KeyAltDown: "\x1b[1;3B", KeyAltShfLeft: "\x1b[1;4D", KeyAltShfRight: "\x1b[1;4C", KeyAltShfUp: "\x1b[1;4A", KeyAltShfDown: "\x1b[1;4B", KeyMetaShfLeft: "\x1b[1;10D", KeyMetaShfRight: "\x1b[1;10C", KeyMetaShfUp: "\x1b[1;10A", KeyMetaShfDown: "\x1b[1;10B", KeyCtrlShfLeft: "\x1b[1;6D", KeyCtrlShfRight: "\x1b[1;6C", KeyCtrlShfUp: "\x1b[1;6A", KeyCtrlShfDown: "\x1b[1;6B", KeyShfHome: "\x1b[1;2H", KeyShfEnd: "\x1b[1;2F", KeyCtrlHome: "\x1b[1;5H", KeyCtrlEnd: "\x1b[1;5F", KeyAltHome: "\x1b[1;9H", KeyAltEnd: "\x1b[1;9F", KeyCtrlShfHome: "\x1b[1;6H", KeyCtrlShfEnd: "\x1b[1;6F", KeyMetaShfHome: "\x1b[1;10H", KeyMetaShfEnd: "\x1b[1;10F", KeyAltShfHome: "\x1b[1;4H", KeyAltShfEnd: "\x1b[1;4F", }) } tcell-1.3.0/terminfo/x/xnuppc/000077500000000000000000000000001354173511300162305ustar00rootroot00000000000000tcell-1.3.0/terminfo/x/xnuppc/term.go000066400000000000000000000015061354173511300175300ustar00rootroot00000000000000// Generated automatically. DO NOT HAND-EDIT. package xnuppc import "github.com/gdamore/tcell/terminfo" func init() { // Darwin PowerPC Console (color) terminfo.AddTerminfo(&terminfo.Terminfo{ Name: "xnuppc", Aliases: []string{"darwin"}, Colors: 8, Clear: "\x1b[H\x1b[J", AttrOff: "\x1b[m", Underline: "\x1b[4m", Bold: "\x1b[1m", Reverse: "\x1b[7m", EnterKeypad: "\x1b[?1h\x1b=", ExitKeypad: "\x1b[?1l\x1b>", SetFg: "\x1b[3%p1%dm", SetBg: "\x1b[4%p1%dm", SetFgBg: "\x1b[3%p1%d;4%p2%dm", PadChar: "\x00", SetCursor: "\x1b[%i%p1%d;%p2%dH", CursorBack1: "\x1b[D", CursorUp1: "\x1b[A", KeyUp: "\x1bOA", KeyDown: "\x1bOB", KeyRight: "\x1bOC", KeyLeft: "\x1bOD", KeyBackspace: "\xff", }) } tcell-1.3.0/terminfo/x/xterm/000077500000000000000000000000001354173511300160525ustar00rootroot00000000000000tcell-1.3.0/terminfo/x/xterm/term.go000066400000000000000000000352471354173511300173630ustar00rootroot00000000000000// Generated automatically. DO NOT HAND-EDIT. package xterm import "github.com/gdamore/tcell/terminfo" func init() { // X11 terminal emulator terminfo.AddTerminfo(&terminfo.Terminfo{ Name: "xterm", Aliases: []string{"xterm-debian"}, Columns: 80, Lines: 24, Colors: 8, Bell: "\a", Clear: "\x1b[H\x1b[2J", EnterCA: "\x1b[?1049h\x1b[22;0;0t", ExitCA: "\x1b[?1049l\x1b[23;0;0t", ShowCursor: "\x1b[?12l\x1b[?25h", HideCursor: "\x1b[?25l", AttrOff: "\x1b(B\x1b[m", Underline: "\x1b[4m", Bold: "\x1b[1m", Dim: "\x1b[2m", Blink: "\x1b[5m", Reverse: "\x1b[7m", EnterKeypad: "\x1b[?1h\x1b=", ExitKeypad: "\x1b[?1l\x1b>", SetFg: "\x1b[3%p1%dm", SetBg: "\x1b[4%p1%dm", SetFgBg: "\x1b[3%p1%d;4%p2%dm", AltChars: "``aaffggiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~", EnterAcs: "\x1b(0", ExitAcs: "\x1b(B", Mouse: "\x1b[M", MouseMode: "%?%p1%{1}%=%t%'h'%Pa%e%'l'%Pa%;\x1b[?1000%ga%c\x1b[?1002%ga%c\x1b[?1003%ga%c\x1b[?1006%ga%c", SetCursor: "\x1b[%i%p1%d;%p2%dH", CursorBack1: "\b", CursorUp1: "\x1b[A", KeyUp: "\x1bOA", KeyDown: "\x1bOB", KeyRight: "\x1bOC", KeyLeft: "\x1bOD", KeyInsert: "\x1b[2~", KeyDelete: "\x1b[3~", KeyBackspace: "\xff", KeyHome: "\x1bOH", KeyEnd: "\x1bOF", KeyPgUp: "\x1b[5~", KeyPgDn: "\x1b[6~", KeyF1: "\x1bOP", KeyF2: "\x1bOQ", KeyF3: "\x1bOR", KeyF4: "\x1bOS", KeyF5: "\x1b[15~", KeyF6: "\x1b[17~", KeyF7: "\x1b[18~", KeyF8: "\x1b[19~", KeyF9: "\x1b[20~", KeyF10: "\x1b[21~", KeyF11: "\x1b[23~", KeyF12: "\x1b[24~", KeyF13: "\x1b[1;2P", KeyF14: "\x1b[1;2Q", KeyF15: "\x1b[1;2R", KeyF16: "\x1b[1;2S", KeyF17: "\x1b[15;2~", KeyF18: "\x1b[17;2~", KeyF19: "\x1b[18;2~", KeyF20: "\x1b[19;2~", KeyF21: "\x1b[20;2~", KeyF22: "\x1b[21;2~", KeyF23: "\x1b[23;2~", KeyF24: "\x1b[24;2~", KeyF25: "\x1b[1;5P", KeyF26: "\x1b[1;5Q", KeyF27: "\x1b[1;5R", KeyF28: "\x1b[1;5S", KeyF29: "\x1b[15;5~", KeyF30: "\x1b[17;5~", KeyF31: "\x1b[18;5~", KeyF32: "\x1b[19;5~", KeyF33: "\x1b[20;5~", KeyF34: "\x1b[21;5~", KeyF35: "\x1b[23;5~", KeyF36: "\x1b[24;5~", KeyF37: "\x1b[1;6P", KeyF38: "\x1b[1;6Q", KeyF39: "\x1b[1;6R", KeyF40: "\x1b[1;6S", KeyF41: "\x1b[15;6~", KeyF42: "\x1b[17;6~", KeyF43: "\x1b[18;6~", KeyF44: "\x1b[19;6~", KeyF45: "\x1b[20;6~", KeyF46: "\x1b[21;6~", KeyF47: "\x1b[23;6~", KeyF48: "\x1b[24;6~", KeyF49: "\x1b[1;3P", KeyF50: "\x1b[1;3Q", KeyF51: "\x1b[1;3R", KeyF52: "\x1b[1;3S", KeyF53: "\x1b[15;3~", KeyF54: "\x1b[17;3~", KeyF55: "\x1b[18;3~", KeyF56: "\x1b[19;3~", KeyF57: "\x1b[20;3~", KeyF58: "\x1b[21;3~", KeyF59: "\x1b[23;3~", KeyF60: "\x1b[24;3~", KeyF61: "\x1b[1;4P", KeyF62: "\x1b[1;4Q", KeyF63: "\x1b[1;4R", KeyBacktab: "\x1b[Z", KeyShfLeft: "\x1b[1;2D", KeyShfRight: "\x1b[1;2C", KeyShfUp: "\x1b[1;2A", KeyShfDown: "\x1b[1;2B", KeyCtrlLeft: "\x1b[1;5D", KeyCtrlRight: "\x1b[1;5C", KeyCtrlUp: "\x1b[1;5A", KeyCtrlDown: "\x1b[1;5B", KeyMetaLeft: "\x1b[1;9D", KeyMetaRight: "\x1b[1;9C", KeyMetaUp: "\x1b[1;9A", KeyMetaDown: "\x1b[1;9B", KeyAltLeft: "\x1b[1;3D", KeyAltRight: "\x1b[1;3C", KeyAltUp: "\x1b[1;3A", KeyAltDown: "\x1b[1;3B", KeyAltShfLeft: "\x1b[1;4D", KeyAltShfRight: "\x1b[1;4C", KeyAltShfUp: "\x1b[1;4A", KeyAltShfDown: "\x1b[1;4B", KeyMetaShfLeft: "\x1b[1;10D", KeyMetaShfRight: "\x1b[1;10C", KeyMetaShfUp: "\x1b[1;10A", KeyMetaShfDown: "\x1b[1;10B", KeyCtrlShfLeft: "\x1b[1;6D", KeyCtrlShfRight: "\x1b[1;6C", KeyCtrlShfUp: "\x1b[1;6A", KeyCtrlShfDown: "\x1b[1;6B", KeyShfHome: "\x1b[1;2H", KeyShfEnd: "\x1b[1;2F", KeyCtrlHome: "\x1b[1;5H", KeyCtrlEnd: "\x1b[1;5F", KeyAltHome: "\x1b[1;9H", KeyAltEnd: "\x1b[1;9F", KeyCtrlShfHome: "\x1b[1;6H", KeyCtrlShfEnd: "\x1b[1;6F", KeyMetaShfHome: "\x1b[1;10H", KeyMetaShfEnd: "\x1b[1;10F", KeyAltShfHome: "\x1b[1;4H", KeyAltShfEnd: "\x1b[1;4F", }) // xterm with 88 colors terminfo.AddTerminfo(&terminfo.Terminfo{ Name: "xterm-88color", Columns: 80, Lines: 24, Colors: 88, Bell: "\a", Clear: "\x1b[H\x1b[2J", EnterCA: "\x1b[?1049h\x1b[22;0;0t", ExitCA: "\x1b[?1049l\x1b[23;0;0t", ShowCursor: "\x1b[?12l\x1b[?25h", HideCursor: "\x1b[?25l", AttrOff: "\x1b(B\x1b[m", Underline: "\x1b[4m", Bold: "\x1b[1m", Dim: "\x1b[2m", Blink: "\x1b[5m", Reverse: "\x1b[7m", EnterKeypad: "\x1b[?1h\x1b=", ExitKeypad: "\x1b[?1l\x1b>", SetFg: "\x1b[%?%p1%{8}%<%t3%p1%d%e%p1%{16}%<%t9%p1%{8}%-%d%e38;5;%p1%d%;m", SetBg: "\x1b[%?%p1%{8}%<%t4%p1%d%e%p1%{16}%<%t10%p1%{8}%-%d%e48;5;%p1%d%;m", SetFgBg: "\x1b[%?%p1%{8}%<%t3%p1%d%e%p1%{16}%<%t9%p1%{8}%-%d%e38;5;%p1%d%;;%?%p2%{8}%<%t4%p2%d%e%p2%{16}%<%t10%p2%{8}%-%d%e48;5;%p2%d%;m", AltChars: "``aaffggiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~", EnterAcs: "\x1b(0", ExitAcs: "\x1b(B", Mouse: "\x1b[M", MouseMode: "%?%p1%{1}%=%t%'h'%Pa%e%'l'%Pa%;\x1b[?1000%ga%c\x1b[?1002%ga%c\x1b[?1003%ga%c\x1b[?1006%ga%c", SetCursor: "\x1b[%i%p1%d;%p2%dH", CursorBack1: "\b", CursorUp1: "\x1b[A", KeyUp: "\x1bOA", KeyDown: "\x1bOB", KeyRight: "\x1bOC", KeyLeft: "\x1bOD", KeyInsert: "\x1b[2~", KeyDelete: "\x1b[3~", KeyBackspace: "\xff", KeyHome: "\x1bOH", KeyEnd: "\x1bOF", KeyPgUp: "\x1b[5~", KeyPgDn: "\x1b[6~", KeyF1: "\x1bOP", KeyF2: "\x1bOQ", KeyF3: "\x1bOR", KeyF4: "\x1bOS", KeyF5: "\x1b[15~", KeyF6: "\x1b[17~", KeyF7: "\x1b[18~", KeyF8: "\x1b[19~", KeyF9: "\x1b[20~", KeyF10: "\x1b[21~", KeyF11: "\x1b[23~", KeyF12: "\x1b[24~", KeyF13: "\x1b[1;2P", KeyF14: "\x1b[1;2Q", KeyF15: "\x1b[1;2R", KeyF16: "\x1b[1;2S", KeyF17: "\x1b[15;2~", KeyF18: "\x1b[17;2~", KeyF19: "\x1b[18;2~", KeyF20: "\x1b[19;2~", KeyF21: "\x1b[20;2~", KeyF22: "\x1b[21;2~", KeyF23: "\x1b[23;2~", KeyF24: "\x1b[24;2~", KeyF25: "\x1b[1;5P", KeyF26: "\x1b[1;5Q", KeyF27: "\x1b[1;5R", KeyF28: "\x1b[1;5S", KeyF29: "\x1b[15;5~", KeyF30: "\x1b[17;5~", KeyF31: "\x1b[18;5~", KeyF32: "\x1b[19;5~", KeyF33: "\x1b[20;5~", KeyF34: "\x1b[21;5~", KeyF35: "\x1b[23;5~", KeyF36: "\x1b[24;5~", KeyF37: "\x1b[1;6P", KeyF38: "\x1b[1;6Q", KeyF39: "\x1b[1;6R", KeyF40: "\x1b[1;6S", KeyF41: "\x1b[15;6~", KeyF42: "\x1b[17;6~", KeyF43: "\x1b[18;6~", KeyF44: "\x1b[19;6~", KeyF45: "\x1b[20;6~", KeyF46: "\x1b[21;6~", KeyF47: "\x1b[23;6~", KeyF48: "\x1b[24;6~", KeyF49: "\x1b[1;3P", KeyF50: "\x1b[1;3Q", KeyF51: "\x1b[1;3R", KeyF52: "\x1b[1;3S", KeyF53: "\x1b[15;3~", KeyF54: "\x1b[17;3~", KeyF55: "\x1b[18;3~", KeyF56: "\x1b[19;3~", KeyF57: "\x1b[20;3~", KeyF58: "\x1b[21;3~", KeyF59: "\x1b[23;3~", KeyF60: "\x1b[24;3~", KeyF61: "\x1b[1;4P", KeyF62: "\x1b[1;4Q", KeyF63: "\x1b[1;4R", KeyBacktab: "\x1b[Z", KeyShfLeft: "\x1b[1;2D", KeyShfRight: "\x1b[1;2C", KeyShfUp: "\x1b[1;2A", KeyShfDown: "\x1b[1;2B", KeyCtrlLeft: "\x1b[1;5D", KeyCtrlRight: "\x1b[1;5C", KeyCtrlUp: "\x1b[1;5A", KeyCtrlDown: "\x1b[1;5B", KeyMetaLeft: "\x1b[1;9D", KeyMetaRight: "\x1b[1;9C", KeyMetaUp: "\x1b[1;9A", KeyMetaDown: "\x1b[1;9B", KeyAltLeft: "\x1b[1;3D", KeyAltRight: "\x1b[1;3C", KeyAltUp: "\x1b[1;3A", KeyAltDown: "\x1b[1;3B", KeyAltShfLeft: "\x1b[1;4D", KeyAltShfRight: "\x1b[1;4C", KeyAltShfUp: "\x1b[1;4A", KeyAltShfDown: "\x1b[1;4B", KeyMetaShfLeft: "\x1b[1;10D", KeyMetaShfRight: "\x1b[1;10C", KeyMetaShfUp: "\x1b[1;10A", KeyMetaShfDown: "\x1b[1;10B", KeyCtrlShfLeft: "\x1b[1;6D", KeyCtrlShfRight: "\x1b[1;6C", KeyCtrlShfUp: "\x1b[1;6A", KeyCtrlShfDown: "\x1b[1;6B", KeyShfHome: "\x1b[1;2H", KeyShfEnd: "\x1b[1;2F", KeyCtrlHome: "\x1b[1;5H", KeyCtrlEnd: "\x1b[1;5F", KeyAltHome: "\x1b[1;9H", KeyAltEnd: "\x1b[1;9F", KeyCtrlShfHome: "\x1b[1;6H", KeyCtrlShfEnd: "\x1b[1;6F", KeyMetaShfHome: "\x1b[1;10H", KeyMetaShfEnd: "\x1b[1;10F", KeyAltShfHome: "\x1b[1;4H", KeyAltShfEnd: "\x1b[1;4F", }) // xterm with 256 colors terminfo.AddTerminfo(&terminfo.Terminfo{ Name: "xterm-256color", Columns: 80, Lines: 24, Colors: 256, Bell: "\a", Clear: "\x1b[H\x1b[2J", EnterCA: "\x1b[?1049h\x1b[22;0;0t", ExitCA: "\x1b[?1049l\x1b[23;0;0t", ShowCursor: "\x1b[?12l\x1b[?25h", HideCursor: "\x1b[?25l", AttrOff: "\x1b(B\x1b[m", Underline: "\x1b[4m", Bold: "\x1b[1m", Dim: "\x1b[2m", Blink: "\x1b[5m", Reverse: "\x1b[7m", EnterKeypad: "\x1b[?1h\x1b=", ExitKeypad: "\x1b[?1l\x1b>", SetFg: "\x1b[%?%p1%{8}%<%t3%p1%d%e%p1%{16}%<%t9%p1%{8}%-%d%e38;5;%p1%d%;m", SetBg: "\x1b[%?%p1%{8}%<%t4%p1%d%e%p1%{16}%<%t10%p1%{8}%-%d%e48;5;%p1%d%;m", SetFgBg: "\x1b[%?%p1%{8}%<%t3%p1%d%e%p1%{16}%<%t9%p1%{8}%-%d%e38;5;%p1%d%;;%?%p2%{8}%<%t4%p2%d%e%p2%{16}%<%t10%p2%{8}%-%d%e48;5;%p2%d%;m", AltChars: "``aaffggiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~", EnterAcs: "\x1b(0", ExitAcs: "\x1b(B", Mouse: "\x1b[M", MouseMode: "%?%p1%{1}%=%t%'h'%Pa%e%'l'%Pa%;\x1b[?1000%ga%c\x1b[?1002%ga%c\x1b[?1003%ga%c\x1b[?1006%ga%c", SetCursor: "\x1b[%i%p1%d;%p2%dH", CursorBack1: "\b", CursorUp1: "\x1b[A", KeyUp: "\x1bOA", KeyDown: "\x1bOB", KeyRight: "\x1bOC", KeyLeft: "\x1bOD", KeyInsert: "\x1b[2~", KeyDelete: "\x1b[3~", KeyBackspace: "\xff", KeyHome: "\x1bOH", KeyEnd: "\x1bOF", KeyPgUp: "\x1b[5~", KeyPgDn: "\x1b[6~", KeyF1: "\x1bOP", KeyF2: "\x1bOQ", KeyF3: "\x1bOR", KeyF4: "\x1bOS", KeyF5: "\x1b[15~", KeyF6: "\x1b[17~", KeyF7: "\x1b[18~", KeyF8: "\x1b[19~", KeyF9: "\x1b[20~", KeyF10: "\x1b[21~", KeyF11: "\x1b[23~", KeyF12: "\x1b[24~", KeyF13: "\x1b[1;2P", KeyF14: "\x1b[1;2Q", KeyF15: "\x1b[1;2R", KeyF16: "\x1b[1;2S", KeyF17: "\x1b[15;2~", KeyF18: "\x1b[17;2~", KeyF19: "\x1b[18;2~", KeyF20: "\x1b[19;2~", KeyF21: "\x1b[20;2~", KeyF22: "\x1b[21;2~", KeyF23: "\x1b[23;2~", KeyF24: "\x1b[24;2~", KeyF25: "\x1b[1;5P", KeyF26: "\x1b[1;5Q", KeyF27: "\x1b[1;5R", KeyF28: "\x1b[1;5S", KeyF29: "\x1b[15;5~", KeyF30: "\x1b[17;5~", KeyF31: "\x1b[18;5~", KeyF32: "\x1b[19;5~", KeyF33: "\x1b[20;5~", KeyF34: "\x1b[21;5~", KeyF35: "\x1b[23;5~", KeyF36: "\x1b[24;5~", KeyF37: "\x1b[1;6P", KeyF38: "\x1b[1;6Q", KeyF39: "\x1b[1;6R", KeyF40: "\x1b[1;6S", KeyF41: "\x1b[15;6~", KeyF42: "\x1b[17;6~", KeyF43: "\x1b[18;6~", KeyF44: "\x1b[19;6~", KeyF45: "\x1b[20;6~", KeyF46: "\x1b[21;6~", KeyF47: "\x1b[23;6~", KeyF48: "\x1b[24;6~", KeyF49: "\x1b[1;3P", KeyF50: "\x1b[1;3Q", KeyF51: "\x1b[1;3R", KeyF52: "\x1b[1;3S", KeyF53: "\x1b[15;3~", KeyF54: "\x1b[17;3~", KeyF55: "\x1b[18;3~", KeyF56: "\x1b[19;3~", KeyF57: "\x1b[20;3~", KeyF58: "\x1b[21;3~", KeyF59: "\x1b[23;3~", KeyF60: "\x1b[24;3~", KeyF61: "\x1b[1;4P", KeyF62: "\x1b[1;4Q", KeyF63: "\x1b[1;4R", KeyBacktab: "\x1b[Z", KeyShfLeft: "\x1b[1;2D", KeyShfRight: "\x1b[1;2C", KeyShfUp: "\x1b[1;2A", KeyShfDown: "\x1b[1;2B", KeyCtrlLeft: "\x1b[1;5D", KeyCtrlRight: "\x1b[1;5C", KeyCtrlUp: "\x1b[1;5A", KeyCtrlDown: "\x1b[1;5B", KeyMetaLeft: "\x1b[1;9D", KeyMetaRight: "\x1b[1;9C", KeyMetaUp: "\x1b[1;9A", KeyMetaDown: "\x1b[1;9B", KeyAltLeft: "\x1b[1;3D", KeyAltRight: "\x1b[1;3C", KeyAltUp: "\x1b[1;3A", KeyAltDown: "\x1b[1;3B", KeyAltShfLeft: "\x1b[1;4D", KeyAltShfRight: "\x1b[1;4C", KeyAltShfUp: "\x1b[1;4A", KeyAltShfDown: "\x1b[1;4B", KeyMetaShfLeft: "\x1b[1;10D", KeyMetaShfRight: "\x1b[1;10C", KeyMetaShfUp: "\x1b[1;10A", KeyMetaShfDown: "\x1b[1;10B", KeyCtrlShfLeft: "\x1b[1;6D", KeyCtrlShfRight: "\x1b[1;6C", KeyCtrlShfUp: "\x1b[1;6A", KeyCtrlShfDown: "\x1b[1;6B", KeyShfHome: "\x1b[1;2H", KeyShfEnd: "\x1b[1;2F", KeyCtrlHome: "\x1b[1;5H", KeyCtrlEnd: "\x1b[1;5F", KeyAltHome: "\x1b[1;9H", KeyAltEnd: "\x1b[1;9F", KeyCtrlShfHome: "\x1b[1;6H", KeyCtrlShfEnd: "\x1b[1;6F", KeyMetaShfHome: "\x1b[1;10H", KeyMetaShfEnd: "\x1b[1;10F", KeyAltShfHome: "\x1b[1;4H", KeyAltShfEnd: "\x1b[1;4F", }) } tcell-1.3.0/terminfo/x/xterm_kitty/000077500000000000000000000000001354173511300172765ustar00rootroot00000000000000tcell-1.3.0/terminfo/x/xterm_kitty/term.go000066400000000000000000000117361354173511300206040ustar00rootroot00000000000000// Generated automatically. DO NOT HAND-EDIT. package xterm_kitty import "github.com/gdamore/tcell/terminfo" func init() { // KovIdTTY terminfo.AddTerminfo(&terminfo.Terminfo{ Name: "xterm-kitty", Columns: 80, Lines: 24, Colors: 256, Bell: "\a", Clear: "\x1b[H\x1b[2J", EnterCA: "\x1b[?1049h", ExitCA: "\x1b[?1049l", ShowCursor: "\x1b[?12l\x1b[?25h", HideCursor: "\x1b[?25l", AttrOff: "\x1b(B\x1b[m", Underline: "\x1b[4m", Bold: "\x1b[1m", Dim: "\x1b[2m", Reverse: "\x1b[7m", EnterKeypad: "\x1b[?1h", ExitKeypad: "\x1b[?1l", SetFg: "\x1b[%?%p1%{8}%<%t3%p1%d%e%p1%{16}%<%t9%p1%{8}%-%d%e38;5;%p1%d%;m", SetBg: "\x1b[%?%p1%{8}%<%t4%p1%d%e%p1%{16}%<%t10%p1%{8}%-%d%e48;5;%p1%d%;m", SetFgBg: "\x1b[%?%p1%{8}%<%t3%p1%d%e%p1%{16}%<%t9%p1%{8}%-%d%e38;5;%p1%d%;;%?%p2%{8}%<%t4%p2%d%e%p2%{16}%<%t10%p2%{8}%-%d%e48;5;%p2%d%;m", AltChars: "++,,--..00``aaffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz{{||}}~~", EnterAcs: "\x1b(0", ExitAcs: "\x1b(B", Mouse: "\x1b[M", MouseMode: "%?%p1%{1}%=%t%'h'%Pa%e%'l'%Pa%;\x1b[?1000%ga%c\x1b[?1002%ga%c\x1b[?1003%ga%c\x1b[?1006%ga%c", SetCursor: "\x1b[%i%p1%d;%p2%dH", CursorBack1: "\b", CursorUp1: "\x1b[A", KeyUp: "\x1bOA", KeyDown: "\x1bOB", KeyRight: "\x1bOC", KeyLeft: "\x1bOD", KeyInsert: "\x1b[2~", KeyDelete: "\x1b[3~", KeyBackspace: "\xff", KeyHome: "\x1bOH", KeyEnd: "\x1bOF", KeyPgUp: "\x1b[5~", KeyPgDn: "\x1b[6~", KeyF1: "\x1bOP", KeyF2: "\x1bOQ", KeyF3: "\x1bOR", KeyF4: "\x1bOS", KeyF5: "\x1b[15~", KeyF6: "\x1b[17~", KeyF7: "\x1b[18~", KeyF8: "\x1b[19~", KeyF9: "\x1b[20~", KeyF10: "\x1b[21~", KeyF11: "\x1b[23~", KeyF12: "\x1b[24~", KeyF13: "\x1b[1;2P", KeyF14: "\x1b[1;2Q", KeyF15: "\x1b[1;2R", KeyF16: "\x1b[1;2S", KeyF17: "\x1b[15;2~", KeyF18: "\x1b[17;2~", KeyF19: "\x1b[18;2~", KeyF20: "\x1b[19;2~", KeyF21: "\x1b[20;2~", KeyF22: "\x1b[21;2~", KeyF23: "\x1b[23;2~", KeyF24: "\x1b[24;2~", KeyF25: "\x1b[1;5P", KeyF26: "\x1b[1;5Q", KeyF27: "\x1b[1;5R", KeyF28: "\x1b[1;5S", KeyF29: "\x1b[15;5~", KeyF30: "\x1b[17;5~", KeyF31: "\x1b[18;5~", KeyF32: "\x1b[19;5~", KeyF33: "\x1b[20;5~", KeyF34: "\x1b[21;5~", KeyF35: "\x1b[23;5~", KeyF36: "\x1b[24;5~", KeyF37: "\x1b[1;6P", KeyF38: "\x1b[1;6Q", KeyF39: "\x1b[1;6R", KeyF40: "\x1b[1;6S", KeyF41: "\x1b[15;6~", KeyF42: "\x1b[17;6~", KeyF43: "\x1b[18;6~", KeyF44: "\x1b[19;6~", KeyF45: "\x1b[20;6~", KeyF46: "\x1b[21;6~", KeyF47: "\x1b[23;6~", KeyF48: "\x1b[24;6~", KeyF49: "\x1b[1;3P", KeyF50: "\x1b[1;3Q", KeyF51: "\x1b[1;3R", KeyF52: "\x1b[1;3S", KeyF53: "\x1b[15;3~", KeyF54: "\x1b[17;3~", KeyF55: "\x1b[18;3~", KeyF56: "\x1b[19;3~", KeyF57: "\x1b[20;3~", KeyF58: "\x1b[21;3~", KeyF59: "\x1b[23;3~", KeyF60: "\x1b[24;3~", KeyF61: "\x1b[1;4P", KeyF62: "\x1b[1;4Q", KeyF63: "\x1b[1;4R", KeyBacktab: "\x1b[Z", KeyShfLeft: "\x1b[1;2D", KeyShfRight: "\x1b[1;2C", KeyShfUp: "\x1b[1;2A", KeyShfDown: "\x1b[1;2B", KeyCtrlLeft: "\x1b[1;5D", KeyCtrlRight: "\x1b[1;5C", KeyCtrlUp: "\x1b[1;5A", KeyCtrlDown: "\x1b[1;5B", KeyMetaLeft: "\x1b[1;9D", KeyMetaRight: "\x1b[1;9C", KeyMetaUp: "\x1b[1;9A", KeyMetaDown: "\x1b[1;9B", KeyAltLeft: "\x1b[1;3D", KeyAltRight: "\x1b[1;3C", KeyAltUp: "\x1b[1;3A", KeyAltDown: "\x1b[1;3B", KeyAltShfLeft: "\x1b[1;4D", KeyAltShfRight: "\x1b[1;4C", KeyAltShfUp: "\x1b[1;4A", KeyAltShfDown: "\x1b[1;4B", KeyMetaShfLeft: "\x1b[1;10D", KeyMetaShfRight: "\x1b[1;10C", KeyMetaShfUp: "\x1b[1;10A", KeyMetaShfDown: "\x1b[1;10B", KeyCtrlShfLeft: "\x1b[1;6D", KeyCtrlShfRight: "\x1b[1;6C", KeyCtrlShfUp: "\x1b[1;6A", KeyCtrlShfDown: "\x1b[1;6B", KeyShfHome: "\x1b[1;2H", KeyShfEnd: "\x1b[1;2F", KeyCtrlHome: "\x1b[1;5H", KeyCtrlEnd: "\x1b[1;5F", KeyAltHome: "\x1b[1;9H", KeyAltEnd: "\x1b[1;9F", KeyCtrlShfHome: "\x1b[1;6H", KeyCtrlShfEnd: "\x1b[1;6F", KeyMetaShfHome: "\x1b[1;10H", KeyMetaShfEnd: "\x1b[1;10F", KeyAltShfHome: "\x1b[1;4H", KeyAltShfEnd: "\x1b[1;4F", }) } tcell-1.3.0/terms_default.go000066400000000000000000000014221354173511300160050ustar00rootroot00000000000000// +build !tcell_minimal // Copyright 2019 The TCell Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use file except in compliance with the License. // You may obtain a copy of the license at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package tcell import ( // This imports the default terminal entries. To disable, use the // tcell_minimal build tag. _ "github.com/gdamore/tcell/terminfo/extended" ) tcell-1.3.0/terms_dynamic.go000066400000000000000000000025321354173511300160100ustar00rootroot00000000000000// +build !tcell_minimal,!nacl,!js,!zos,!plan9,!windows,!android // Copyright 2019 The TCell Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use file except in compliance with the License. // You may obtain a copy of the license at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package tcell import ( // This imports a dynamic version of the terminal database, which // is built using infocmp. This relies on a working installation // of infocmp (typically supplied with ncurses). We only do this // for systems likely to have that -- i.e. UNIX based hosts. We // also don't support Android here, because you really don't want // to run external programs there. Generally the android terminals // will be automatically included anyway. "github.com/gdamore/tcell/terminfo" "github.com/gdamore/tcell/terminfo/dynamic" ) func loadDynamicTerminfo(term string) (*terminfo.Terminfo, error) { ti, _, e := dynamic.LoadTerminfo(term) if e != nil { return nil, e } return ti, nil } tcell-1.3.0/terms_static.go000066400000000000000000000015161354173511300156540ustar00rootroot00000000000000// +build tcell_minimal nacl js zos plan9 windows android // Copyright 2019 The TCell Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use file except in compliance with the License. // You may obtain a copy of the license at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package tcell import ( "errors" "github.com/gdamore/tcell/terminfo" ) func loadDynamicTerminfo(term string) (*terminfo.Terminfo, error) { return nil, errors.New("terminal type unsupported") } tcell-1.3.0/tscreen.go000066400000000000000000000767721354173511300146360ustar00rootroot00000000000000// Copyright 2019 The TCell Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use file except in compliance with the License. // You may obtain a copy of the license at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package tcell import ( "bytes" "io" "os" "strconv" "sync" "time" "unicode/utf8" "golang.org/x/text/transform" "github.com/gdamore/tcell/terminfo" // import the stock terminals _ "github.com/gdamore/tcell/terminfo/base" ) // NewTerminfoScreen returns a Screen that uses the stock TTY interface // and POSIX termios, combined with a terminfo description taken from // the $TERM environment variable. It returns an error if the terminal // is not supported for any reason. // // For terminals that do not support dynamic resize events, the $LINES // $COLUMNS environment variables can be set to the actual window size, // otherwise defaults taken from the terminal database are used. func NewTerminfoScreen() (Screen, error) { ti, e := terminfo.LookupTerminfo(os.Getenv("TERM")) if e != nil { ti, e = loadDynamicTerminfo(os.Getenv("TERM")) if e != nil { return nil, e } terminfo.AddTerminfo(ti) } t := &tScreen{ti: ti} t.keyexist = make(map[Key]bool) t.keycodes = make(map[string]*tKeyCode) if len(ti.Mouse) > 0 { t.mouse = []byte(ti.Mouse) } t.prepareKeys() t.buildAcsMap() t.sigwinch = make(chan os.Signal, 10) t.fallback = make(map[rune]string) for k, v := range RuneFallbacks { t.fallback[k] = v } return t, nil } // tKeyCode represents a combination of a key code and modifiers. type tKeyCode struct { key Key mod ModMask } // tScreen represents a screen backed by a terminfo implementation. type tScreen struct { ti *terminfo.Terminfo h int w int fini bool cells CellBuffer in *os.File out *os.File buffering bool // true if we are collecting writes to buf instead of sending directly to out buf bytes.Buffer curstyle Style style Style evch chan Event sigwinch chan os.Signal quit chan struct{} indoneq chan struct{} keyexist map[Key]bool keycodes map[string]*tKeyCode keychan chan []byte keytimer *time.Timer keyexpire time.Time cx int cy int mouse []byte clear bool cursorx int cursory int tiosp *termiosPrivate wasbtn bool acs map[rune]string charset string encoder transform.Transformer decoder transform.Transformer fallback map[rune]string colors map[Color]Color palette []Color truecolor bool escaped bool buttondn bool sync.Mutex } func (t *tScreen) Init() error { t.evch = make(chan Event, 10) t.indoneq = make(chan struct{}) t.keychan = make(chan []byte, 10) t.keytimer = time.NewTimer(time.Millisecond * 50) t.charset = "UTF-8" t.charset = getCharset() if enc := GetEncoding(t.charset); enc != nil { t.encoder = enc.NewEncoder() t.decoder = enc.NewDecoder() } else { return ErrNoCharset } ti := t.ti // environment overrides w := ti.Columns h := ti.Lines if i, _ := strconv.Atoi(os.Getenv("LINES")); i != 0 { h = i } if i, _ := strconv.Atoi(os.Getenv("COLUMNS")); i != 0 { w = i } if e := t.termioInit(); e != nil { return e } if t.ti.SetFgBgRGB != "" || t.ti.SetFgRGB != "" || t.ti.SetBgRGB != "" { t.truecolor = true } // A user who wants to have his themes honored can // set this environment variable. if os.Getenv("TCELL_TRUECOLOR") == "disable" { t.truecolor = false } if !t.truecolor { t.colors = make(map[Color]Color) t.palette = make([]Color, t.Colors()) for i := 0; i < t.Colors(); i++ { t.palette[i] = Color(i) // identity map for our builtin colors t.colors[Color(i)] = Color(i) } } t.TPuts(ti.EnterCA) t.TPuts(ti.HideCursor) t.TPuts(ti.EnableAcs) t.TPuts(ti.Clear) t.quit = make(chan struct{}) t.Lock() t.cx = -1 t.cy = -1 t.style = StyleDefault t.cells.Resize(w, h) t.cursorx = -1 t.cursory = -1 t.resize() t.Unlock() go t.mainLoop() go t.inputLoop() return nil } func (t *tScreen) prepareKeyMod(key Key, mod ModMask, val string) { if val != "" { // Do not overrride codes that already exist if _, exist := t.keycodes[val]; !exist { t.keyexist[key] = true t.keycodes[val] = &tKeyCode{key: key, mod: mod} } } } func (t *tScreen) prepareKey(key Key, val string) { t.prepareKeyMod(key, ModNone, val) } func (t *tScreen) prepareKeys() { ti := t.ti t.prepareKey(KeyBackspace, ti.KeyBackspace) t.prepareKey(KeyF1, ti.KeyF1) t.prepareKey(KeyF2, ti.KeyF2) t.prepareKey(KeyF3, ti.KeyF3) t.prepareKey(KeyF4, ti.KeyF4) t.prepareKey(KeyF5, ti.KeyF5) t.prepareKey(KeyF6, ti.KeyF6) t.prepareKey(KeyF7, ti.KeyF7) t.prepareKey(KeyF8, ti.KeyF8) t.prepareKey(KeyF9, ti.KeyF9) t.prepareKey(KeyF10, ti.KeyF10) t.prepareKey(KeyF11, ti.KeyF11) t.prepareKey(KeyF12, ti.KeyF12) t.prepareKey(KeyF13, ti.KeyF13) t.prepareKey(KeyF14, ti.KeyF14) t.prepareKey(KeyF15, ti.KeyF15) t.prepareKey(KeyF16, ti.KeyF16) t.prepareKey(KeyF17, ti.KeyF17) t.prepareKey(KeyF18, ti.KeyF18) t.prepareKey(KeyF19, ti.KeyF19) t.prepareKey(KeyF20, ti.KeyF20) t.prepareKey(KeyF21, ti.KeyF21) t.prepareKey(KeyF22, ti.KeyF22) t.prepareKey(KeyF23, ti.KeyF23) t.prepareKey(KeyF24, ti.KeyF24) t.prepareKey(KeyF25, ti.KeyF25) t.prepareKey(KeyF26, ti.KeyF26) t.prepareKey(KeyF27, ti.KeyF27) t.prepareKey(KeyF28, ti.KeyF28) t.prepareKey(KeyF29, ti.KeyF29) t.prepareKey(KeyF30, ti.KeyF30) t.prepareKey(KeyF31, ti.KeyF31) t.prepareKey(KeyF32, ti.KeyF32) t.prepareKey(KeyF33, ti.KeyF33) t.prepareKey(KeyF34, ti.KeyF34) t.prepareKey(KeyF35, ti.KeyF35) t.prepareKey(KeyF36, ti.KeyF36) t.prepareKey(KeyF37, ti.KeyF37) t.prepareKey(KeyF38, ti.KeyF38) t.prepareKey(KeyF39, ti.KeyF39) t.prepareKey(KeyF40, ti.KeyF40) t.prepareKey(KeyF41, ti.KeyF41) t.prepareKey(KeyF42, ti.KeyF42) t.prepareKey(KeyF43, ti.KeyF43) t.prepareKey(KeyF44, ti.KeyF44) t.prepareKey(KeyF45, ti.KeyF45) t.prepareKey(KeyF46, ti.KeyF46) t.prepareKey(KeyF47, ti.KeyF47) t.prepareKey(KeyF48, ti.KeyF48) t.prepareKey(KeyF49, ti.KeyF49) t.prepareKey(KeyF50, ti.KeyF50) t.prepareKey(KeyF51, ti.KeyF51) t.prepareKey(KeyF52, ti.KeyF52) t.prepareKey(KeyF53, ti.KeyF53) t.prepareKey(KeyF54, ti.KeyF54) t.prepareKey(KeyF55, ti.KeyF55) t.prepareKey(KeyF56, ti.KeyF56) t.prepareKey(KeyF57, ti.KeyF57) t.prepareKey(KeyF58, ti.KeyF58) t.prepareKey(KeyF59, ti.KeyF59) t.prepareKey(KeyF60, ti.KeyF60) t.prepareKey(KeyF61, ti.KeyF61) t.prepareKey(KeyF62, ti.KeyF62) t.prepareKey(KeyF63, ti.KeyF63) t.prepareKey(KeyF64, ti.KeyF64) t.prepareKey(KeyInsert, ti.KeyInsert) t.prepareKey(KeyDelete, ti.KeyDelete) t.prepareKey(KeyHome, ti.KeyHome) t.prepareKey(KeyEnd, ti.KeyEnd) t.prepareKey(KeyUp, ti.KeyUp) t.prepareKey(KeyDown, ti.KeyDown) t.prepareKey(KeyLeft, ti.KeyLeft) t.prepareKey(KeyRight, ti.KeyRight) t.prepareKey(KeyPgUp, ti.KeyPgUp) t.prepareKey(KeyPgDn, ti.KeyPgDn) t.prepareKey(KeyHelp, ti.KeyHelp) t.prepareKey(KeyPrint, ti.KeyPrint) t.prepareKey(KeyCancel, ti.KeyCancel) t.prepareKey(KeyExit, ti.KeyExit) t.prepareKey(KeyBacktab, ti.KeyBacktab) t.prepareKeyMod(KeyRight, ModShift, ti.KeyShfRight) t.prepareKeyMod(KeyLeft, ModShift, ti.KeyShfLeft) t.prepareKeyMod(KeyUp, ModShift, ti.KeyShfUp) t.prepareKeyMod(KeyDown, ModShift, ti.KeyShfDown) t.prepareKeyMod(KeyHome, ModShift, ti.KeyShfHome) t.prepareKeyMod(KeyEnd, ModShift, ti.KeyShfEnd) t.prepareKeyMod(KeyRight, ModCtrl, ti.KeyCtrlRight) t.prepareKeyMod(KeyLeft, ModCtrl, ti.KeyCtrlLeft) t.prepareKeyMod(KeyUp, ModCtrl, ti.KeyCtrlUp) t.prepareKeyMod(KeyDown, ModCtrl, ti.KeyCtrlDown) t.prepareKeyMod(KeyHome, ModCtrl, ti.KeyCtrlHome) t.prepareKeyMod(KeyEnd, ModCtrl, ti.KeyCtrlEnd) t.prepareKeyMod(KeyRight, ModAlt, ti.KeyAltRight) t.prepareKeyMod(KeyLeft, ModAlt, ti.KeyAltLeft) t.prepareKeyMod(KeyUp, ModAlt, ti.KeyAltUp) t.prepareKeyMod(KeyDown, ModAlt, ti.KeyAltDown) t.prepareKeyMod(KeyHome, ModAlt, ti.KeyAltHome) t.prepareKeyMod(KeyEnd, ModAlt, ti.KeyAltEnd) t.prepareKeyMod(KeyRight, ModAlt, ti.KeyMetaRight) t.prepareKeyMod(KeyLeft, ModAlt, ti.KeyMetaLeft) t.prepareKeyMod(KeyUp, ModAlt, ti.KeyMetaUp) t.prepareKeyMod(KeyDown, ModAlt, ti.KeyMetaDown) t.prepareKeyMod(KeyHome, ModAlt, ti.KeyMetaHome) t.prepareKeyMod(KeyEnd, ModAlt, ti.KeyMetaEnd) t.prepareKeyMod(KeyRight, ModAlt|ModShift, ti.KeyAltShfRight) t.prepareKeyMod(KeyLeft, ModAlt|ModShift, ti.KeyAltShfLeft) t.prepareKeyMod(KeyUp, ModAlt|ModShift, ti.KeyAltShfUp) t.prepareKeyMod(KeyDown, ModAlt|ModShift, ti.KeyAltShfDown) t.prepareKeyMod(KeyHome, ModAlt|ModShift, ti.KeyAltShfHome) t.prepareKeyMod(KeyEnd, ModAlt|ModShift, ti.KeyAltShfEnd) t.prepareKeyMod(KeyRight, ModAlt|ModShift, ti.KeyMetaShfRight) t.prepareKeyMod(KeyLeft, ModAlt|ModShift, ti.KeyMetaShfLeft) t.prepareKeyMod(KeyUp, ModAlt|ModShift, ti.KeyMetaShfUp) t.prepareKeyMod(KeyDown, ModAlt|ModShift, ti.KeyMetaShfDown) t.prepareKeyMod(KeyHome, ModAlt|ModShift, ti.KeyMetaShfHome) t.prepareKeyMod(KeyEnd, ModAlt|ModShift, ti.KeyMetaShfEnd) t.prepareKeyMod(KeyRight, ModCtrl|ModShift, ti.KeyCtrlShfRight) t.prepareKeyMod(KeyLeft, ModCtrl|ModShift, ti.KeyCtrlShfLeft) t.prepareKeyMod(KeyUp, ModCtrl|ModShift, ti.KeyCtrlShfUp) t.prepareKeyMod(KeyDown, ModCtrl|ModShift, ti.KeyCtrlShfDown) t.prepareKeyMod(KeyHome, ModCtrl|ModShift, ti.KeyCtrlShfHome) t.prepareKeyMod(KeyEnd, ModCtrl|ModShift, ti.KeyCtrlShfEnd) // Sadly, xterm handling of keycodes is somewhat erratic. In // particular, different codes are sent depending on application // mode is in use or not, and the entries for many of these are // simply absent from terminfo on many systems. So we insert // a number of escape sequences if they are not already used, in // order to have the widest correct usage. Note that prepareKey // will not inject codes if the escape sequence is already known. // We also only do this for terminals that have the application // mode present. // Cursor mode if ti.EnterKeypad != "" { t.prepareKey(KeyUp, "\x1b[A") t.prepareKey(KeyDown, "\x1b[B") t.prepareKey(KeyRight, "\x1b[C") t.prepareKey(KeyLeft, "\x1b[D") t.prepareKey(KeyEnd, "\x1b[F") t.prepareKey(KeyHome, "\x1b[H") t.prepareKey(KeyDelete, "\x1b[3~") t.prepareKey(KeyHome, "\x1b[1~") t.prepareKey(KeyEnd, "\x1b[4~") t.prepareKey(KeyPgUp, "\x1b[5~") t.prepareKey(KeyPgDn, "\x1b[6~") // Application mode t.prepareKey(KeyUp, "\x1bOA") t.prepareKey(KeyDown, "\x1bOB") t.prepareKey(KeyRight, "\x1bOC") t.prepareKey(KeyLeft, "\x1bOD") t.prepareKey(KeyHome, "\x1bOH") } outer: // Add key mappings for control keys. for i := 0; i < ' '; i++ { // Do not insert direct key codes for ambiguous keys. // For example, ESC is used for lots of other keys, so // when parsing this we don't want to fast path handling // of it, but instead wait a bit before parsing it as in // isolation. for esc := range t.keycodes { if []byte(esc)[0] == byte(i) { continue outer } } t.keyexist[Key(i)] = true mod := ModCtrl switch Key(i) { case KeyBS, KeyTAB, KeyESC, KeyCR: // directly typeable- no control sequence mod = ModNone } t.keycodes[string(rune(i))] = &tKeyCode{key: Key(i), mod: mod} } } func (t *tScreen) Fini() { t.Lock() defer t.Unlock() ti := t.ti t.cells.Resize(0, 0) t.TPuts(ti.ShowCursor) t.TPuts(ti.AttrOff) t.TPuts(ti.Clear) t.TPuts(ti.ExitCA) t.TPuts(ti.ExitKeypad) t.TPuts(ti.TParm(ti.MouseMode, 0)) t.curstyle = Style(-1) t.clear = false t.fini = true select { case <-t.quit: // do nothing, already closed default: close(t.quit) } t.termioFini() } func (t *tScreen) SetStyle(style Style) { t.Lock() if !t.fini { t.style = style } t.Unlock() } func (t *tScreen) Clear() { t.Fill(' ', t.style) } func (t *tScreen) Fill(r rune, style Style) { t.Lock() if !t.fini { t.cells.Fill(r, style) } t.Unlock() } func (t *tScreen) SetContent(x, y int, mainc rune, combc []rune, style Style) { t.Lock() if !t.fini { t.cells.SetContent(x, y, mainc, combc, style) } t.Unlock() } func (t *tScreen) GetContent(x, y int) (rune, []rune, Style, int) { t.Lock() mainc, combc, style, width := t.cells.GetContent(x, y) t.Unlock() return mainc, combc, style, width } func (t *tScreen) SetCell(x, y int, style Style, ch ...rune) { if len(ch) > 0 { t.SetContent(x, y, ch[0], ch[1:], style) } else { t.SetContent(x, y, ' ', nil, style) } } func (t *tScreen) encodeRune(r rune, buf []byte) []byte { nb := make([]byte, 6) ob := make([]byte, 6) num := utf8.EncodeRune(ob, r) ob = ob[:num] dst := 0 var err error if enc := t.encoder; enc != nil { enc.Reset() dst, _, err = enc.Transform(nb, ob, true) } if err != nil || dst == 0 || nb[0] == '\x1a' { // Combining characters are elided if len(buf) == 0 { if acs, ok := t.acs[r]; ok { buf = append(buf, []byte(acs)...) } else if fb, ok := t.fallback[r]; ok { buf = append(buf, []byte(fb)...) } else { buf = append(buf, '?') } } } else { buf = append(buf, nb[:dst]...) } return buf } func (t *tScreen) sendFgBg(fg Color, bg Color) { ti := t.ti if ti.Colors == 0 { return } if t.truecolor { if ti.SetFgBgRGB != "" && fg != ColorDefault && bg != ColorDefault { r1, g1, b1 := fg.RGB() r2, g2, b2 := bg.RGB() t.TPuts(ti.TParm(ti.SetFgBgRGB, int(r1), int(g1), int(b1), int(r2), int(g2), int(b2))) } else { if fg != ColorDefault && ti.SetFgRGB != "" { r, g, b := fg.RGB() t.TPuts(ti.TParm(ti.SetFgRGB, int(r), int(g), int(b))) } if bg != ColorDefault && ti.SetBgRGB != "" { r, g, b := bg.RGB() t.TPuts(ti.TParm(ti.SetBgRGB, int(r), int(g), int(b))) } } return } if fg != ColorDefault { if v, ok := t.colors[fg]; ok { fg = v } else { v = FindColor(fg, t.palette) t.colors[fg] = v fg = v } } if bg != ColorDefault { if v, ok := t.colors[bg]; ok { bg = v } else { v = FindColor(bg, t.palette) t.colors[bg] = v bg = v } } if ti.SetFgBg != "" && fg != ColorDefault && bg != ColorDefault { t.TPuts(ti.TParm(ti.SetFgBg, int(fg), int(bg))) } else { if fg != ColorDefault && ti.SetFg != "" { t.TPuts(ti.TParm(ti.SetFg, int(fg))) } if bg != ColorDefault && ti.SetBg != "" { t.TPuts(ti.TParm(ti.SetBg, int(bg))) } } } func (t *tScreen) drawCell(x, y int) int { ti := t.ti mainc, combc, style, width := t.cells.GetContent(x, y) if !t.cells.Dirty(x, y) { return width } if t.cy != y || t.cx != x { t.TPuts(ti.TGoto(x, y)) t.cx = x t.cy = y } if style == StyleDefault { style = t.style } if style != t.curstyle { fg, bg, attrs := style.Decompose() t.TPuts(ti.AttrOff) t.sendFgBg(fg, bg) if attrs&AttrBold != 0 { t.TPuts(ti.Bold) } if attrs&AttrUnderline != 0 { t.TPuts(ti.Underline) } if attrs&AttrReverse != 0 { t.TPuts(ti.Reverse) } if attrs&AttrBlink != 0 { t.TPuts(ti.Blink) } if attrs&AttrDim != 0 { t.TPuts(ti.Dim) } t.curstyle = style } // now emit runes - taking care to not overrun width with a // wide character, and to ensure that we emit exactly one regular // character followed up by any residual combing characters if width < 1 { width = 1 } var str string buf := make([]byte, 0, 6) buf = t.encodeRune(mainc, buf) for _, r := range combc { buf = t.encodeRune(r, buf) } str = string(buf) if width > 1 && str == "?" { // No FullWidth character support str = "? " t.cx = -1 } // XXX: check for hazeltine not being able to display ~ if x > t.w-width { // too wide to fit; emit a single space instead width = 1 str = " " } t.writeString(str) t.cx += width t.cells.SetDirty(x, y, false) if width > 1 { t.cx = -1 } return width } func (t *tScreen) ShowCursor(x, y int) { t.Lock() t.cursorx = x t.cursory = y t.Unlock() } func (t *tScreen) HideCursor() { t.ShowCursor(-1, -1) } func (t *tScreen) showCursor() { x, y := t.cursorx, t.cursory w, h := t.cells.Size() if x < 0 || y < 0 || x >= w || y >= h { t.hideCursor() return } t.TPuts(t.ti.TGoto(x, y)) t.TPuts(t.ti.ShowCursor) t.cx = x t.cy = y } // writeString sends a string to the terminal. The string is sent as-is and // this function does not expand inline padding indications (of the form // $<[delay]> where [delay] is msec). In order to have these expanded, use // TPuts. If the screen is "buffering", the string is collected in a buffer, // with the intention that the entire buffer be sent to the terminal in one // write operation at some point later. func (t *tScreen) writeString(s string) { if t.buffering { io.WriteString(&t.buf, s) } else { io.WriteString(t.out, s) } } func (t *tScreen) TPuts(s string) { if t.buffering { t.ti.TPuts(&t.buf, s) } else { t.ti.TPuts(t.out, s) } } func (t *tScreen) Show() { t.Lock() if !t.fini { t.resize() t.draw() } t.Unlock() } func (t *tScreen) clearScreen() { fg, bg, _ := t.style.Decompose() t.sendFgBg(fg, bg) t.TPuts(t.ti.Clear) t.clear = false } func (t *tScreen) hideCursor() { // does not update cursor position if t.ti.HideCursor != "" { t.TPuts(t.ti.HideCursor) } else { // No way to hide cursor, stick it // at bottom right of screen t.cx, t.cy = t.cells.Size() t.TPuts(t.ti.TGoto(t.cx, t.cy)) } } func (t *tScreen) draw() { // clobber cursor position, because we're gonna change it all t.cx = -1 t.cy = -1 t.buf.Reset() t.buffering = true defer func() { t.buffering = false }() // hide the cursor while we move stuff around t.hideCursor() if t.clear { t.clearScreen() } for y := 0; y < t.h; y++ { for x := 0; x < t.w; x++ { width := t.drawCell(x, y) if width > 1 { if x+1 < t.w { // this is necessary so that if we ever // go back to drawing that cell, we // actually will *draw* it. t.cells.SetDirty(x+1, y, true) } } x += width - 1 } } // restore the cursor t.showCursor() t.buf.WriteTo(t.out) } func (t *tScreen) EnableMouse() { if len(t.mouse) != 0 { t.TPuts(t.ti.TParm(t.ti.MouseMode, 1)) } } func (t *tScreen) DisableMouse() { if len(t.mouse) != 0 { t.TPuts(t.ti.TParm(t.ti.MouseMode, 0)) } } func (t *tScreen) Size() (int, int) { t.Lock() w, h := t.w, t.h t.Unlock() return w, h } func (t *tScreen) resize() { if w, h, e := t.getWinSize(); e == nil { if w != t.w || h != t.h { t.cx = -1 t.cy = -1 t.cells.Resize(w, h) t.cells.Invalidate() t.h = h t.w = w ev := NewEventResize(w, h) t.PostEvent(ev) } } } func (t *tScreen) Colors() int { // this doesn't change, no need for lock if t.truecolor { return 1 << 24 } return t.ti.Colors } func (t *tScreen) PollEvent() Event { select { case <-t.quit: return nil case ev := <-t.evch: return ev } } // vtACSNames is a map of bytes defined by terminfo that are used in // the terminals Alternate Character Set to represent other glyphs. // For example, the upper left corner of the box drawing set can be // displayed by printing "l" while in the alternate character set. // Its not quite that simple, since the "l" is the terminfo name, // and it may be necessary to use a different character based on // the terminal implementation (or the terminal may lack support for // this altogether). See buildAcsMap below for detail. var vtACSNames = map[byte]rune{ '+': RuneRArrow, ',': RuneLArrow, '-': RuneUArrow, '.': RuneDArrow, '0': RuneBlock, '`': RuneDiamond, 'a': RuneCkBoard, 'b': '␉', // VT100, Not defined by terminfo 'c': '␌', // VT100, Not defined by terminfo 'd': '␋', // VT100, Not defined by terminfo 'e': '␊', // VT100, Not defined by terminfo 'f': RuneDegree, 'g': RunePlMinus, 'h': RuneBoard, 'i': RuneLantern, 'j': RuneLRCorner, 'k': RuneURCorner, 'l': RuneULCorner, 'm': RuneLLCorner, 'n': RunePlus, 'o': RuneS1, 'p': RuneS3, 'q': RuneHLine, 'r': RuneS7, 's': RuneS9, 't': RuneLTee, 'u': RuneRTee, 'v': RuneBTee, 'w': RuneTTee, 'x': RuneVLine, 'y': RuneLEqual, 'z': RuneGEqual, '{': RunePi, '|': RuneNEqual, '}': RuneSterling, '~': RuneBullet, } // buildAcsMap builds a map of characters that we translate from Unicode to // alternate character encodings. To do this, we use the standard VT100 ACS // maps. This is only done if the terminal lacks support for Unicode; we // always prefer to emit Unicode glyphs when we are able. func (t *tScreen) buildAcsMap() { acsstr := t.ti.AltChars t.acs = make(map[rune]string) for len(acsstr) > 2 { srcv := acsstr[0] dstv := string(acsstr[1]) if r, ok := vtACSNames[srcv]; ok { t.acs[r] = t.ti.EnterAcs + dstv + t.ti.ExitAcs } acsstr = acsstr[2:] } } func (t *tScreen) PostEventWait(ev Event) { t.evch <- ev } func (t *tScreen) PostEvent(ev Event) error { select { case t.evch <- ev: return nil default: return ErrEventQFull } } func (t *tScreen) clip(x, y int) (int, int) { w, h := t.cells.Size() if x < 0 { x = 0 } if y < 0 { y = 0 } if x > w-1 { x = w - 1 } if y > h-1 { y = h - 1 } return x, y } // buildMouseEvent returns an event based on the supplied coordinates and button // state. Note that the screen's mouse button state is updated based on the // input to this function (i.e. it mutates the receiver). func (t *tScreen) buildMouseEvent(x, y, btn int) *EventMouse { // XTerm mouse events only report at most one button at a time, // which may include a wheel button. Wheel motion events are // reported as single impulses, while other button events are reported // as separate press & release events. button := ButtonNone mod := ModNone // Mouse wheel has bit 6 set, no release events. It should be noted // that wheel events are sometimes misdelivered as mouse button events // during a click-drag, so we debounce these, considering them to be // button press events unless we see an intervening release event. switch btn & 0x43 { case 0: button = Button1 t.wasbtn = true case 1: button = Button2 t.wasbtn = true case 2: button = Button3 t.wasbtn = true case 3: button = ButtonNone t.wasbtn = false case 0x40: if !t.wasbtn { button = WheelUp } else { button = Button1 } case 0x41: if !t.wasbtn { button = WheelDown } else { button = Button2 } } if btn&0x4 != 0 { mod |= ModShift } if btn&0x8 != 0 { mod |= ModAlt } if btn&0x10 != 0 { mod |= ModCtrl } // Some terminals will report mouse coordinates outside the // screen, especially with click-drag events. Clip the coordinates // to the screen in that case. x, y = t.clip(x, y) return NewEventMouse(x, y, button, mod) } // parseSgrMouse attempts to locate an SGR mouse record at the start of the // buffer. It returns true, true if it found one, and the associated bytes // be removed from the buffer. It returns true, false if the buffer might // contain such an event, but more bytes are necessary (partial match), and // false, false if the content is definitely *not* an SGR mouse record. func (t *tScreen) parseSgrMouse(buf *bytes.Buffer, evs *[]Event) (bool, bool) { b := buf.Bytes() var x, y, btn, state int dig := false neg := false motion := false i := 0 val := 0 for i = range b { switch b[i] { case '\x1b': if state != 0 { return false, false } state = 1 case '\x9b': if state != 0 { return false, false } state = 2 case '[': if state != 1 { return false, false } state = 2 case '<': if state != 2 { return false, false } val = 0 dig = false neg = false state = 3 case '-': if state != 3 && state != 4 && state != 5 { return false, false } if dig || neg { return false, false } neg = true // stay in state case '0', '1', '2', '3', '4', '5', '6', '7', '8', '9': if state != 3 && state != 4 && state != 5 { return false, false } val *= 10 val += int(b[i] - '0') dig = true // stay in state case ';': if neg { val = -val } switch state { case 3: btn, val = val, 0 neg, dig, state = false, false, 4 case 4: x, val = val-1, 0 neg, dig, state = false, false, 5 default: return false, false } case 'm', 'M': if state != 5 { return false, false } if neg { val = -val } y = val - 1 motion = (btn & 32) != 0 btn &^= 32 if b[i] == 'm' { // mouse release, clear all buttons btn |= 3 btn &^= 0x40 t.buttondn = false } else if motion { /* * Some broken terminals appear to send * mouse button one motion events, instead of * encoding 35 (no buttons) into these events. * We resolve these by looking for a non-motion * event first. */ if !t.buttondn { btn |= 3 btn &^= 0x40 } } else { t.buttondn = true } // consume the event bytes for i >= 0 { buf.ReadByte() i-- } *evs = append(*evs, t.buildMouseEvent(x, y, btn)) return true, true } } // incomplete & inconclusve at this point return true, false } // parseXtermMouse is like parseSgrMouse, but it parses a legacy // X11 mouse record. func (t *tScreen) parseXtermMouse(buf *bytes.Buffer, evs *[]Event) (bool, bool) { b := buf.Bytes() state := 0 btn := 0 x := 0 y := 0 for i := range b { switch state { case 0: switch b[i] { case '\x1b': state = 1 case '\x9b': state = 2 default: return false, false } case 1: if b[i] != '[' { return false, false } state = 2 case 2: if b[i] != 'M' { return false, false } state++ case 3: btn = int(b[i]) state++ case 4: x = int(b[i]) - 32 - 1 state++ case 5: y = int(b[i]) - 32 - 1 for i >= 0 { buf.ReadByte() i-- } *evs = append(*evs, t.buildMouseEvent(x, y, btn)) return true, true } } return true, false } func (t *tScreen) parseFunctionKey(buf *bytes.Buffer, evs *[]Event) (bool, bool) { b := buf.Bytes() partial := false for e, k := range t.keycodes { esc := []byte(e) if (len(esc) == 1) && (esc[0] == '\x1b') { continue } if bytes.HasPrefix(b, esc) { // matched var r rune if len(esc) == 1 { r = rune(b[0]) } mod := k.mod if t.escaped { mod |= ModAlt t.escaped = false } *evs = append(*evs, NewEventKey(k.key, r, mod)) for i := 0; i < len(esc); i++ { buf.ReadByte() } return true, true } if bytes.HasPrefix(esc, b) { partial = true } } return partial, false } func (t *tScreen) parseRune(buf *bytes.Buffer, evs *[]Event) (bool, bool) { b := buf.Bytes() if b[0] >= ' ' && b[0] <= 0x7F { // printable ASCII easy to deal with -- no encodings mod := ModNone if t.escaped { mod = ModAlt t.escaped = false } *evs = append(*evs, NewEventKey(KeyRune, rune(b[0]), mod)) buf.ReadByte() return true, true } if b[0] < 0x80 { // Low numbered values are control keys, not runes. return false, false } utfb := make([]byte, 12) for l := 1; l <= len(b); l++ { t.decoder.Reset() nout, nin, e := t.decoder.Transform(utfb, b[:l], true) if e == transform.ErrShortSrc { continue } if nout != 0 { r, _ := utf8.DecodeRune(utfb[:nout]) if r != utf8.RuneError { mod := ModNone if t.escaped { mod = ModAlt t.escaped = false } *evs = append(*evs, NewEventKey(KeyRune, r, mod)) } for nin > 0 { buf.ReadByte() nin-- } return true, true } } // Looks like potential escape return true, false } func (t *tScreen) scanInput(buf *bytes.Buffer, expire bool) { evs := t.collectEventsFromInput(buf, expire) for _, ev := range evs { t.PostEventWait(ev) } } // Return an array of Events extracted from the supplied buffer. This is done // while holding the screen's lock - the events can then be queued for // application processing with the lock released. func (t *tScreen) collectEventsFromInput(buf *bytes.Buffer, expire bool) []Event { res := make([]Event, 0, 20) t.Lock() defer t.Unlock() for { b := buf.Bytes() if len(b) == 0 { buf.Reset() return res } partials := 0 if part, comp := t.parseRune(buf, &res); comp { continue } else if part { partials++ } if part, comp := t.parseFunctionKey(buf, &res); comp { continue } else if part { partials++ } // Only parse mouse records if this term claims to have // mouse support if t.ti.Mouse != "" { if part, comp := t.parseXtermMouse(buf, &res); comp { continue } else if part { partials++ } if part, comp := t.parseSgrMouse(buf, &res); comp { continue } else if part { partials++ } } if partials == 0 || expire { if b[0] == '\x1b' { if len(b) == 1 { res = append(res, NewEventKey(KeyEsc, 0, ModNone)) t.escaped = false } else { t.escaped = true } buf.ReadByte() continue } // Nothing was going to match, or we timed out // waiting for more data -- just deliver the characters // to the app & let them sort it out. Possibly we // should only do this for control characters like ESC. by, _ := buf.ReadByte() mod := ModNone if t.escaped { t.escaped = false mod = ModAlt } res = append(res, NewEventKey(KeyRune, rune(by), mod)) continue } // well we have some partial data, wait until we get // some more break } return res } func (t *tScreen) mainLoop() { buf := &bytes.Buffer{} for { select { case <-t.quit: close(t.indoneq) return case <-t.sigwinch: t.Lock() t.cx = -1 t.cy = -1 t.resize() t.cells.Invalidate() t.draw() t.Unlock() continue case <-t.keytimer.C: // If the timer fired, and the current time // is after the expiration of the escape sequence, // then we assume the escape sequence reached it's // conclusion, and process the chunk independently. // This lets us detect conflicts such as a lone ESC. if buf.Len() > 0 { if time.Now().After(t.keyexpire) { t.scanInput(buf, true) } } if buf.Len() > 0 { if !t.keytimer.Stop() { select { case <-t.keytimer.C: default: } } t.keytimer.Reset(time.Millisecond * 50) } case chunk := <-t.keychan: buf.Write(chunk) t.keyexpire = time.Now().Add(time.Millisecond * 50) t.scanInput(buf, false) if !t.keytimer.Stop() { select { case <-t.keytimer.C: default: } } if buf.Len() > 0 { t.keytimer.Reset(time.Millisecond * 50) } } } } func (t *tScreen) inputLoop() { for { chunk := make([]byte, 128) n, e := t.in.Read(chunk) switch e { case io.EOF: case nil: default: t.PostEvent(NewEventError(e)) return } t.keychan <- chunk[:n] } } func (t *tScreen) Sync() { t.Lock() t.cx = -1 t.cy = -1 if !t.fini { t.resize() t.clear = true t.cells.Invalidate() t.draw() } t.Unlock() } func (t *tScreen) CharacterSet() string { return t.charset } func (t *tScreen) RegisterRuneFallback(orig rune, fallback string) { t.Lock() t.fallback[orig] = fallback t.Unlock() } func (t *tScreen) UnregisterRuneFallback(orig rune) { t.Lock() delete(t.fallback, orig) t.Unlock() } func (t *tScreen) CanDisplay(r rune, checkFallbacks bool) bool { if enc := t.encoder; enc != nil { nb := make([]byte, 6) ob := make([]byte, 6) num := utf8.EncodeRune(ob, r) enc.Reset() dst, _, err := enc.Transform(nb, ob[:num], true) if dst != 0 && err == nil && nb[0] != '\x1A' { return true } } // Terminal fallbacks always permitted, since we assume they are // basically nearly perfect renditions. if _, ok := t.acs[r]; ok { return true } if !checkFallbacks { return false } if _, ok := t.fallback[r]; ok { return true } return false } func (t *tScreen) HasMouse() bool { return len(t.mouse) != 0 } func (t *tScreen) HasKey(k Key) bool { if k == KeyRune { return true } return t.keyexist[k] } func (t *tScreen) Resize(int, int, int, int) {} tcell-1.3.0/tscreen_bsd.go000066400000000000000000000052741354173511300154530ustar00rootroot00000000000000// +build freebsd netbsd openbsd dragonfly // Copyright 2019 The TCell Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use file except in compliance with the License. // You may obtain a copy of the license at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package tcell import ( "os" "os/signal" "syscall" "unsafe" ) type termiosPrivate syscall.Termios func (t *tScreen) termioInit() error { var e error var newtios termiosPrivate var fd uintptr var tios uintptr var ioc uintptr t.tiosp = &termiosPrivate{} if t.in, e = os.OpenFile("/dev/tty", os.O_RDONLY, 0); e != nil { goto failed } if t.out, e = os.OpenFile("/dev/tty", os.O_WRONLY, 0); e != nil { goto failed } tios = uintptr(unsafe.Pointer(t.tiosp)) ioc = uintptr(syscall.TIOCGETA) fd = uintptr(t.out.Fd()) if _, _, e1 := syscall.Syscall6(syscall.SYS_IOCTL, fd, ioc, tios, 0, 0, 0); e1 != 0 { e = e1 goto failed } newtios = *t.tiosp newtios.Iflag &^= syscall.IGNBRK | syscall.BRKINT | syscall.PARMRK | syscall.ISTRIP | syscall.INLCR | syscall.IGNCR | syscall.ICRNL | syscall.IXON newtios.Oflag &^= syscall.OPOST newtios.Lflag &^= syscall.ECHO | syscall.ECHONL | syscall.ICANON | syscall.ISIG | syscall.IEXTEN newtios.Cflag &^= syscall.CSIZE | syscall.PARENB newtios.Cflag |= syscall.CS8 tios = uintptr(unsafe.Pointer(&newtios)) ioc = uintptr(syscall.TIOCSETA) if _, _, e1 := syscall.Syscall6(syscall.SYS_IOCTL, fd, ioc, tios, 0, 0, 0); e1 != 0 { e = e1 goto failed } signal.Notify(t.sigwinch, syscall.SIGWINCH) if w, h, e := t.getWinSize(); e == nil && w != 0 && h != 0 { t.cells.Resize(w, h) } return nil failed: if t.in != nil { t.in.Close() } if t.out != nil { t.out.Close() } return e } func (t *tScreen) termioFini() { signal.Stop(t.sigwinch) <-t.indoneq if t.out != nil { fd := uintptr(t.out.Fd()) ioc := uintptr(syscall.TIOCSETAF) tios := uintptr(unsafe.Pointer(t.tiosp)) syscall.Syscall6(syscall.SYS_IOCTL, fd, ioc, tios, 0, 0, 0) t.out.Close() } if t.in != nil { t.in.Close() } } func (t *tScreen) getWinSize() (int, int, error) { fd := uintptr(t.out.Fd()) dim := [4]uint16{} dimp := uintptr(unsafe.Pointer(&dim)) ioc := uintptr(syscall.TIOCGWINSZ) if _, _, err := syscall.Syscall6(syscall.SYS_IOCTL, fd, ioc, dimp, 0, 0, 0); err != 0 { return -1, -1, err } return int(dim[1]), int(dim[0]), nil } tcell-1.3.0/tscreen_darwin.go000066400000000000000000000071441354173511300161650ustar00rootroot00000000000000// +build darwin // Copyright 2019 The TCell Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use file except in compliance with the License. // You may obtain a copy of the license at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package tcell // The Darwin system is *almost* a real BSD system, but it suffers from // a brain damaged TTY driver. This TTY driver does not actually // wake up in poll() or similar calls, which means that we cannot reliably // shut down the terminal without resorting to obscene custom C code // and a dedicated poller thread. // // So instead, we do a best effort, and simply try to do the close in the // background. Probably this will cause a leak of two goroutines and // maybe also the file descriptor, meaning that applications on Darwin // can't reinitialize the screen, but that's probably a very rare behavior, // and accepting that is the best of some very poor alternative options. // // Maybe someday Apple will fix there tty driver, but its been broken for // a long time (probably forever) so holding one's breath is contraindicated. import ( "os" "os/signal" "syscall" "unsafe" ) type termiosPrivate syscall.Termios func (t *tScreen) termioInit() error { var e error var newtios termiosPrivate var fd uintptr var tios uintptr var ioc uintptr t.tiosp = &termiosPrivate{} if t.in, e = os.OpenFile("/dev/tty", os.O_RDONLY, 0); e != nil { goto failed } if t.out, e = os.OpenFile("/dev/tty", os.O_WRONLY, 0); e != nil { goto failed } tios = uintptr(unsafe.Pointer(t.tiosp)) ioc = uintptr(syscall.TIOCGETA) fd = uintptr(t.out.Fd()) if _, _, e1 := syscall.Syscall6(syscall.SYS_IOCTL, fd, ioc, tios, 0, 0, 0); e1 != 0 { e = e1 goto failed } newtios = *t.tiosp newtios.Iflag &^= syscall.IGNBRK | syscall.BRKINT | syscall.PARMRK | syscall.ISTRIP | syscall.INLCR | syscall.IGNCR | syscall.ICRNL | syscall.IXON newtios.Oflag &^= syscall.OPOST newtios.Lflag &^= syscall.ECHO | syscall.ECHONL | syscall.ICANON | syscall.ISIG | syscall.IEXTEN newtios.Cflag &^= syscall.CSIZE | syscall.PARENB newtios.Cflag |= syscall.CS8 tios = uintptr(unsafe.Pointer(&newtios)) ioc = uintptr(syscall.TIOCSETA) if _, _, e1 := syscall.Syscall6(syscall.SYS_IOCTL, fd, ioc, tios, 0, 0, 0); e1 != 0 { e = e1 goto failed } signal.Notify(t.sigwinch, syscall.SIGWINCH) if w, h, e := t.getWinSize(); e == nil && w != 0 && h != 0 { t.cells.Resize(w, h) } return nil failed: if t.in != nil { t.in.Close() } if t.out != nil { t.out.Close() } return e } func (t *tScreen) termioFini() { signal.Stop(t.sigwinch) <-t.indoneq if t.out != nil { fd := uintptr(t.out.Fd()) ioc := uintptr(syscall.TIOCSETAF) tios := uintptr(unsafe.Pointer(t.tiosp)) syscall.Syscall6(syscall.SYS_IOCTL, fd, ioc, tios, 0, 0, 0) t.out.Close() } // See above -- we background this call which might help, but // really the tty is probably open. go func() { if t.in != nil { t.in.Close() } }() } func (t *tScreen) getWinSize() (int, int, error) { fd := uintptr(t.out.Fd()) dim := [4]uint16{} dimp := uintptr(unsafe.Pointer(&dim)) ioc := uintptr(syscall.TIOCGWINSZ) if _, _, err := syscall.Syscall6(syscall.SYS_IOCTL, fd, ioc, dimp, 0, 0, 0); err != 0 { return -1, -1, err } return int(dim[1]), int(dim[0]), nil } tcell-1.3.0/tscreen_linux.go000066400000000000000000000051341354173511300160350ustar00rootroot00000000000000// +build linux // Copyright 2019 The TCell Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use file except in compliance with the License. // You may obtain a copy of the license at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package tcell import ( "os" "os/signal" "syscall" "golang.org/x/sys/unix" ) type termiosPrivate struct { tio *unix.Termios } func (t *tScreen) termioInit() error { var e error var raw *unix.Termios var tio *unix.Termios if t.in, e = os.OpenFile("/dev/tty", os.O_RDONLY, 0); e != nil { goto failed } if t.out, e = os.OpenFile("/dev/tty", os.O_WRONLY, 0); e != nil { goto failed } tio, e = unix.IoctlGetTermios(int(t.out.Fd()), unix.TCGETS) if e != nil { goto failed } t.tiosp = &termiosPrivate{tio: tio} // make a local copy, to make it raw raw = &unix.Termios{ Cflag: tio.Cflag, Oflag: tio.Oflag, Iflag: tio.Iflag, Lflag: tio.Lflag, Cc: tio.Cc, } raw.Iflag &^= (unix.IGNBRK | unix.BRKINT | unix.PARMRK | unix.ISTRIP | unix.INLCR | unix.IGNCR | unix.ICRNL | unix.IXON) raw.Oflag &^= unix.OPOST raw.Lflag &^= (unix.ECHO | unix.ECHONL | unix.ICANON | unix.ISIG | unix.IEXTEN) raw.Cflag &^= (unix.CSIZE | unix.PARENB) raw.Cflag |= unix.CS8 // This is setup for blocking reads. In the past we attempted to // use non-blocking reads, but now a separate input loop and timer // copes with the problems we had on some systems (BSD/Darwin) // where close hung forever. raw.Cc[unix.VMIN] = 1 raw.Cc[unix.VTIME] = 0 e = unix.IoctlSetTermios(int(t.out.Fd()), unix.TCSETS, raw) if e != nil { goto failed } signal.Notify(t.sigwinch, syscall.SIGWINCH) if w, h, e := t.getWinSize(); e == nil && w != 0 && h != 0 { t.cells.Resize(w, h) } return nil failed: if t.in != nil { t.in.Close() } if t.out != nil { t.out.Close() } return e } func (t *tScreen) termioFini() { signal.Stop(t.sigwinch) <-t.indoneq if t.out != nil && t.tiosp != nil { unix.IoctlSetTermios(int(t.out.Fd()), unix.TCSETSF, t.tiosp.tio) t.out.Close() } if t.in != nil { t.in.Close() } } func (t *tScreen) getWinSize() (int, int, error) { wsz, err := unix.IoctlGetWinsize(int(t.out.Fd()), unix.TIOCGWINSZ) if err != nil { return -1, -1, err } return int(wsz.Col), int(wsz.Row), nil } tcell-1.3.0/tscreen_solaris.go000066400000000000000000000051151354173511300163510ustar00rootroot00000000000000// +build solaris // Copyright 2019 The TCell Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use file except in compliance with the License. // You may obtain a copy of the license at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package tcell import ( "os" "os/signal" "syscall" "golang.org/x/sys/unix" ) type termiosPrivate struct { tio *unix.Termios } func (t *tScreen) termioInit() error { var e error var raw *unix.Termios var tio *unix.Termios if t.in, e = os.OpenFile("/dev/tty", os.O_RDONLY, 0); e != nil { goto failed } if t.out, e = os.OpenFile("/dev/tty", os.O_WRONLY, 0); e != nil { goto failed } tio, e = unix.IoctlGetTermios(int(t.out.Fd()), unix.TCGETS) if e != nil { goto failed } t.tiosp = &termiosPrivate{tio: tio} // make a local copy, to make it raw raw = &unix.Termios{ Cflag: tio.Cflag, Oflag: tio.Oflag, Iflag: tio.Iflag, Lflag: tio.Lflag, Cc: tio.Cc, } raw.Iflag &^= (unix.IGNBRK | unix.BRKINT | unix.PARMRK | unix.INLCR | unix.IGNCR | unix.ICRNL | unix.IXON) raw.Oflag &^= unix.OPOST raw.Lflag &^= (unix.ECHO | unix.ECHONL | unix.ICANON | unix.ISIG | unix.IEXTEN) raw.Cflag &^= (unix.CSIZE | unix.PARENB) raw.Cflag |= unix.CS8 // This is setup for blocking reads. In the past we attempted to // use non-blocking reads, but now a separate input loop and timer // copes with the problems we had on some systems (BSD/Darwin) // where close hung forever. raw.Cc[unix.VMIN] = 1 raw.Cc[unix.VTIME] = 0 e = unix.IoctlSetTermios(int(t.out.Fd()), unix.TCSETS, raw) if e != nil { goto failed } signal.Notify(t.sigwinch, syscall.SIGWINCH) if w, h, e := t.getWinSize(); e == nil && w != 0 && h != 0 { t.cells.Resize(w, h) } return nil failed: if t.in != nil { t.in.Close() } if t.out != nil { t.out.Close() } return e } func (t *tScreen) termioFini() { signal.Stop(t.sigwinch) <-t.indoneq if t.out != nil && t.tiosp != nil { unix.IoctlSetTermios(int(t.out.Fd()), unix.TCSETSF, t.tiosp.tio) t.out.Close() } if t.in != nil { t.in.Close() } } func (t *tScreen) getWinSize() (int, int, error) { wsz, err := unix.IoctlGetWinsize(int(t.out.Fd()), unix.TIOCGWINSZ) if err != nil { return -1, -1, err } return int(wsz.Col), int(wsz.Row), nil } tcell-1.3.0/tscreen_stub.go000066400000000000000000000015711354173511300156540ustar00rootroot00000000000000// +build nacl plan9 // Copyright 2015 The TCell Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use file except in compliance with the License. // You may obtain a copy of the license at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package tcell // This stub file is for systems that have no termios. type termiosPrivate struct{} func (t *tScreen) termioInit() error { return ErrNoScreen } func (t *tScreen) termioFini() { } func (t *tScreen) getWinSize() (int, int, error) { return 0, 0, ErrNoScreen } tcell-1.3.0/tscreen_windows.go000066400000000000000000000021641354173511300163700ustar00rootroot00000000000000// +build windows // Copyright 2015 The TCell Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use file except in compliance with the License. // You may obtain a copy of the license at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package tcell // On Windows we don't have support for termios. We probably could, and // may should, in a cygwin type environment. Its not clear how to make // this all work nicely with both cygwin and Windows console, so we // decline to do so here. func (t *tScreen) termioInit() error { return ErrNoScreen } func (t *tScreen) termioFini() { return } func (t *tScreen) getWinSize() (int, int, error) { return 0, 0, ErrNoScreen } func (t *tScreen) getCharset() string { return "UTF-16LE" } type termiosPrivate struct{} tcell-1.3.0/views/000077500000000000000000000000001354173511300137565ustar00rootroot00000000000000tcell-1.3.0/views/README.md000066400000000000000000000004271354173511300152400ustar00rootroot00000000000000## tcell views This package provides some enhanced functionality on top of base tcell. In particular, support for logical views, and a few different kinds of widgets like title bars, and scrollable areas, are provided. These make up a higher level interface than tcell itself. tcell-1.3.0/views/_demos/000077500000000000000000000000001354173511300152245ustar00rootroot00000000000000tcell-1.3.0/views/_demos/cellview.go000066400000000000000000000111311354173511300173620ustar00rootroot00000000000000// Copyright 2016 The Tcell Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use file except in compliance with the License. // You may obtain a copy of the license at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package main import ( "fmt" "os" "github.com/gdamore/tcell" "github.com/gdamore/tcell/views" ) var app = &views.Application{} var window = &mainWindow{} type model struct { x int y int endx int endy int hide bool enab bool loc string } func (m *model) GetBounds() (int, int) { return m.endx, m.endy } func (m *model) MoveCursor(offx, offy int) { m.x += offx m.y += offy m.limitCursor() } func (m *model) limitCursor() { if m.x < 0 { m.x = 0 } if m.x > m.endx-1 { m.x = m.endx - 1 } if m.y < 0 { m.y = 0 } if m.y > m.endy-1 { m.y = m.endy - 1 } m.loc = fmt.Sprintf("Cursor is %d,%d", m.x, m.y) } func (m *model) GetCursor() (int, int, bool, bool) { return m.x, m.y, m.enab, !m.hide } func (m *model) SetCursor(x int, y int) { m.x = x m.y = y m.limitCursor() } func (m *model) GetCell(x, y int) (rune, tcell.Style, []rune, int) { dig := []rune{'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'} var ch rune style := tcell.StyleDefault if x >= 60 || y >= 15 { return ch, style, nil, 1 } colors := []tcell.Color{ tcell.ColorWhite, tcell.ColorGreen, tcell.ColorMaroon, tcell.ColorNavy, tcell.ColorOlive, } if y == 0 && x < len(m.loc) { style = style. Foreground(tcell.ColorWhite). Background(tcell.ColorLime) ch = rune(m.loc[x]) } else { ch = dig[(x)%len(dig)] style = style. Foreground(colors[(y)%len(colors)]). Background(tcell.ColorBlack) } return ch, style, nil, 1 } type mainWindow struct { main *views.CellView keybar *views.SimpleStyledText status *views.SimpleStyledTextBar model *model views.Panel } func (a *mainWindow) HandleEvent(ev tcell.Event) bool { switch ev := ev.(type) { case *tcell.EventKey: switch ev.Key() { case tcell.KeyCtrlL: app.Refresh() return true case tcell.KeyRune: switch ev.Rune() { case 'Q', 'q': app.Quit() return true case 'S', 's': a.model.hide = false a.updateKeys() return true case 'H', 'h': a.model.hide = true a.updateKeys() return true case 'E', 'e': a.model.enab = true a.updateKeys() return true case 'D', 'd': a.model.enab = false a.updateKeys() return true } } } return a.Panel.HandleEvent(ev) } func (a *mainWindow) Draw() { a.status.SetLeft(a.model.loc) a.Panel.Draw() } func (a *mainWindow) updateKeys() { m := a.model w := "[%AQ%N] Quit" if !m.enab { w += " [%AE%N] Enable cursor" } else { w += " [%AD%N] Disable cursor" if !m.hide { w += " [%AH%N] Hide cursor" } else { w += " [%AS%N] Show cursor" } } a.keybar.SetMarkup(w) app.Update() } func main() { window.model = &model{endx: 60, endy: 15} title := views.NewTextBar() title.SetStyle(tcell.StyleDefault. Background(tcell.ColorTeal). Foreground(tcell.ColorWhite)) title.SetCenter("CellView Test", tcell.StyleDefault) title.SetRight("Example v1.0", tcell.StyleDefault) window.keybar = views.NewSimpleStyledText() window.keybar.RegisterStyle('N', tcell.StyleDefault. Background(tcell.ColorSilver). Foreground(tcell.ColorBlack)) window.keybar.RegisterStyle('A', tcell.StyleDefault. Background(tcell.ColorSilver). Foreground(tcell.ColorRed)) window.status = views.NewSimpleStyledTextBar() window.status.SetStyle(tcell.StyleDefault. Background(tcell.ColorBlue). Foreground(tcell.ColorYellow)) window.status.RegisterLeftStyle('N', tcell.StyleDefault. Background(tcell.ColorYellow). Foreground(tcell.ColorBlack)) window.status.SetLeft("My status is here.") window.status.SetRight("%UCellView%N demo!") window.status.SetCenter("Cen%ST%Ner") window.main = views.NewCellView() window.main.SetModel(window.model) window.main.SetStyle(tcell.StyleDefault. Background(tcell.ColorBlack)) window.SetMenu(window.keybar) window.SetTitle(title) window.SetContent(window.main) window.SetStatus(window.status) window.updateKeys() app.SetStyle(tcell.StyleDefault. Foreground(tcell.ColorWhite). Background(tcell.ColorBlack)) app.SetRootWidget(window) if e := app.Run(); e != nil { fmt.Fprintln(os.Stderr, e.Error()) os.Exit(1) } } tcell-1.3.0/views/_demos/hbox.go000066400000000000000000000042141354173511300165140ustar00rootroot00000000000000// Copyright 2015 The Tops'l Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use file except in compliance with the License. // You may obtain a copy of the license at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package main import ( "fmt" "os" "github.com/gdamore/tcell" "github.com/gdamore/tcell/views" ) type boxL struct { views.BoxLayout } var app = &views.Application{} var box = &boxL{} func (m *boxL) HandleEvent(ev tcell.Event) bool { switch ev := ev.(type) { case *tcell.EventKey: if ev.Key() == tcell.KeyEscape { app.Quit() return true } } return m.BoxLayout.HandleEvent(ev) } func main() { title := &views.TextBar{} title.SetStyle(tcell.StyleDefault. Background(tcell.ColorYellow). Foreground(tcell.ColorBlack)) title.SetCenter("Horizontal Boxes", tcell.StyleDefault) title.SetLeft("ESC to exit", tcell.StyleDefault. Background(tcell.ColorBlue). Foreground(tcell.ColorWhite)) title.SetRight("==>X", tcell.StyleDefault) inner := views.NewBoxLayout(views.Horizontal) l := views.NewText() m := views.NewText() r := views.NewText() l.SetText("Left (0.0)") m.SetText("Middle (0.7)") r.SetText("Right (0.3)") l.SetStyle(tcell.StyleDefault.Foreground(tcell.ColorWhite). Background(tcell.ColorRed)) m.SetStyle(tcell.StyleDefault.Foreground(tcell.ColorWhite). Background(tcell.ColorLime)) r.SetStyle(tcell.StyleDefault.Foreground(tcell.ColorWhite). Background(tcell.ColorBlue)) l.SetAlignment(views.AlignBegin) m.SetAlignment(views.AlignMiddle) r.SetAlignment(views.AlignEnd) inner.AddWidget(l, 0) inner.AddWidget(m, 0.7) inner.AddWidget(r, 0.3) box.SetOrientation(views.Vertical) box.AddWidget(title, 0) box.AddWidget(inner, 1) app.SetRootWidget(box) if e := app.Run(); e != nil { fmt.Fprintln(os.Stderr, e.Error()) os.Exit(1) } } tcell-1.3.0/views/_demos/vbox.go000066400000000000000000000040241354173511300165310ustar00rootroot00000000000000// Copyright 2015 The Tops'l Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use file except in compliance with the License. // You may obtain a copy of the license at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package main import ( "fmt" "os" "github.com/gdamore/tcell" "github.com/gdamore/tcell/views" ) type boxL struct { views.BoxLayout } var box = &boxL{} var app = &views.Application{} func (m *boxL) HandleEvent(ev tcell.Event) bool { switch ev := ev.(type) { case *tcell.EventKey: if ev.Key() == tcell.KeyEscape { app.Quit() return true } } return m.BoxLayout.HandleEvent(ev) } func main() { title := views.NewTextBar() title.SetStyle(tcell.StyleDefault. Foreground(tcell.ColorBlack). Background(tcell.ColorYellow)) title.SetCenter("Vertical Layout", tcell.StyleDefault) top := views.NewText() mid := views.NewText() bot := views.NewText() top.SetText("Top-Right (0.0)\nLine Two") mid.SetText("Center (0.7)") bot.SetText("Bottom-Left (0.3)") top.SetStyle(tcell.StyleDefault.Foreground(tcell.ColorWhite). Background(tcell.ColorRed)) mid.SetStyle(tcell.StyleDefault.Foreground(tcell.ColorWhite). Background(tcell.ColorLime)) bot.SetStyle(tcell.StyleDefault.Foreground(tcell.ColorWhite). Background(tcell.ColorBlue)) top.SetAlignment(views.VAlignTop | views.HAlignRight) mid.SetAlignment(views.VAlignCenter | views.HAlignCenter) bot.SetAlignment(views.VAlignBottom | views.HAlignLeft) box.SetOrientation(views.Vertical) box.AddWidget(title, 0) box.AddWidget(top, 0) box.AddWidget(mid, 0.7) box.AddWidget(bot, 0.3) app.SetRootWidget(box) if e := app.Run(); e != nil { fmt.Fprintln(os.Stderr, e.Error()) os.Exit(1) } } tcell-1.3.0/views/app.go000066400000000000000000000106651354173511300150750ustar00rootroot00000000000000// Copyright 2018 The Tcell Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use file except in compliance with the License. // You may obtain a copy of the license at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package views import ( "sync" "github.com/gdamore/tcell" ) // Application represents an event-driven application running on a screen. type Application struct { widget Widget screen tcell.Screen style tcell.Style err error wg sync.WaitGroup } // SetRootWidget sets the primary (root, main) Widget to be displayed. func (app *Application) SetRootWidget(widget Widget) { app.widget = widget } // initialize initializes the application. It will normally attempt to // allocate a default screen if one is not already established. func (app *Application) initialize() error { if app.screen == nil { if app.screen, app.err = tcell.NewScreen(); app.err != nil { return app.err } app.screen.SetStyle(app.style) } return nil } // Quit causes the application to shutdown gracefully. It does not wait // for the application to exit, but returns immediately. func (app *Application) Quit() { ev := &eventAppQuit{} ev.SetEventNow() if scr := app.screen; scr != nil { go func() { scr.PostEventWait(ev) }() } } // Refresh causes the application forcibly redraw everything. Use this // to clear up screen corruption, etc. func (app *Application) Refresh() { ev := &eventAppRefresh{} ev.SetEventNow() if scr := app.screen; scr != nil { go func() { scr.PostEventWait(ev) }() } } // Update asks the application to draw any screen updates that have not // been drawn yet. func (app *Application) Update() { ev := &eventAppUpdate{} ev.SetEventNow() if scr := app.screen; scr != nil { go func() { scr.PostEventWait(ev) }() } } // PostFunc posts a function to be executed in the context of the // application's event loop. Functions that need to update displayed // state, etc. can do this to avoid holding locks. func (app *Application) PostFunc(fn func()) { ev := &eventAppFunc{fn: fn} ev.SetEventNow() if scr := app.screen; scr != nil { go func() { scr.PostEventWait(ev) }() } } // SetScreen sets the screen to use for the application. This must be // done before the application starts to run or is initialized. func (app *Application) SetScreen(scr tcell.Screen) { if app.screen == nil { app.screen = scr app.err = nil } } // SetStyle sets the default style (background) to be used for Widgets // that have not specified any other style. func (app *Application) SetStyle(style tcell.Style) { app.style = style if app.screen != nil { app.screen.SetStyle(style) } } func (app *Application) run() { screen := app.screen widget := app.widget if widget == nil { app.wg.Done() return } if screen == nil { if e := app.initialize(); e != nil { app.wg.Done() return } screen = app.screen } defer func() { screen.Fini() app.wg.Done() }() screen.Init() screen.Clear() widget.SetView(screen) loop: for { if widget = app.widget; widget == nil { break } widget.Draw() screen.Show() ev := screen.PollEvent() switch nev := ev.(type) { case *eventAppQuit: break loop case *eventAppUpdate: screen.Show() case *eventAppRefresh: screen.Sync() case *eventAppFunc: nev.fn() case *tcell.EventResize: screen.Sync() widget.Resize() default: widget.HandleEvent(ev) } } } // Start starts the application loop, initializing the screen // and starting the Event loop. The application will run in a goroutine // until Quit is called. func (app *Application) Start() { app.wg.Add(1) go app.run() } // Wait waits until the application finishes. func (app *Application) Wait() error { app.wg.Wait() return app.err } // Run runs the application, waiting until the application loop exits. // It is equivalent to app.Start() followed by app.Wait() func (app *Application) Run() error { app.Start() return app.Wait() } type eventAppUpdate struct { tcell.EventTime } type eventAppQuit struct { tcell.EventTime } type eventAppRefresh struct { tcell.EventTime } type eventAppFunc struct { tcell.EventTime fn func() } tcell-1.3.0/views/boxlayout.go000066400000000000000000000154761354173511300163500ustar00rootroot00000000000000// Copyright 2016 The Tcell Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use file except in compliance with the License. // You may obtain a copy of the license at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package views import ( "github.com/gdamore/tcell" ) // BoxLayout is a container Widget that lays out its child widgets in // either a horizontal row or a vertical column. type BoxLayout struct { view View orient Orientation style tcell.Style // backing style cells []*boxLayoutCell width int height int changed bool WidgetWatchers } type boxLayoutCell struct { widget Widget fill float64 // fill factor - 0.0 means no expansion pad int // count of padding spaces (stretch) frac float64 // calculated residual spacing, used internally view *ViewPort } func (b *BoxLayout) hLayout() { w, h := b.view.Size() totf := 0.0 for _, c := range b.cells { x, y := c.widget.Size() totf += c.fill b.width += x if y > b.height { b.height = y } c.pad = 0 c.frac = 0 } extra := w - b.width if extra < 0 { extra = 0 } resid := extra if totf == 0 { resid = 0 } for _, c := range b.cells { if c.fill > 0 { c.frac = float64(extra) * c.fill / totf c.pad = int(c.frac) c.frac -= float64(c.pad) resid -= c.pad } } // Distribute any left over padding. We try to give it to the // the cells with the highest residual fraction. It should be // the case that no single cell gets more than one more cell. for resid > 0 { var best *boxLayoutCell for _, c := range b.cells { if c.fill == 0 { continue } if best == nil || c.frac > best.frac { best = c } } best.pad++ best.frac = 0 resid-- } x, y, xinc := 0, 0, 0 for _, c := range b.cells { cw, _ := c.widget.Size() xinc = cw + c.pad cw += c.pad c.view.Resize(x, y, cw, h) c.widget.Resize() x += xinc } } func (b *BoxLayout) vLayout() { w, h := b.view.Size() totf := 0.0 for _, c := range b.cells { x, y := c.widget.Size() b.height += y totf += c.fill if x > b.width { b.width = x } c.pad = 0 c.frac = 0 } extra := h - b.height if extra < 0 { extra = 0 } resid := extra if totf == 0 { resid = 0 } for _, c := range b.cells { if c.fill > 0 { c.frac = float64(extra) * c.fill / totf c.pad = int(c.frac) c.frac -= float64(c.pad) resid -= c.pad } } // Distribute any left over padding. We try to give it to the // the cells with the highest residual fraction. It should be // the case that no single cell gets more than one more cell. for resid > 0 { var best *boxLayoutCell for _, c := range b.cells { if c.fill == 0 { continue } if best == nil || c.frac > best.frac { best = c } } best.pad++ best.frac = 0 resid-- } x, y, yinc := 0, 0, 0 for _, c := range b.cells { _, ch := c.widget.Size() yinc = ch + c.pad ch += c.pad c.view.Resize(x, y, w, ch) c.widget.Resize() y += yinc } } func (b *BoxLayout) layout() { if b.view == nil { return } b.width, b.height = 0, 0 switch b.orient { case Horizontal: b.hLayout() case Vertical: b.vLayout() default: panic("Bad orientation") } b.changed = false } // Resize adjusts the layout when the underlying View changes size. func (b *BoxLayout) Resize() { b.layout() // Now also let the children know we resized. for i := range b.cells { b.cells[i].widget.Resize() } b.PostEventWidgetResize(b) } // Draw is called to update the displayed content. func (b *BoxLayout) Draw() { if b.view == nil { return } if b.changed { b.layout() } b.view.Fill(' ', b.style) for i := range b.cells { b.cells[i].widget.Draw() } } // Size returns the preferred size in character cells (width, height). func (b *BoxLayout) Size() (int, int) { return b.width, b.height } // SetView sets the View object used for the text bar. func (b *BoxLayout) SetView(view View) { b.changed = true b.view = view for _, c := range b.cells { c.view.SetView(view) } } // HandleEvent implements a tcell.EventHandler. The only events // we care about are Widget change events from our children. We // watch for those so that if the child changes, we can arrange // to update our layout. func (b *BoxLayout) HandleEvent(ev tcell.Event) bool { switch ev.(type) { case *EventWidgetContent: // This can only have come from one of our children. b.changed = true b.PostEventWidgetContent(b) return true } for _, c := range b.cells { if c.widget.HandleEvent(ev) { return true } } return false } // AddWidget adds a widget to the end of the BoxLayout. func (b *BoxLayout) AddWidget(widget Widget, fill float64) { c := &boxLayoutCell{ widget: widget, fill: fill, view: NewViewPort(b.view, 0, 0, 0, 0), } widget.SetView(c.view) b.cells = append(b.cells, c) b.changed = true widget.Watch(b) b.layout() b.PostEventWidgetContent(b) } // InsertWidget inserts a widget at the given offset. Offset 0 is the // front. If the index is longer than the number of widgets, then it // just gets appended to the end. func (b *BoxLayout) InsertWidget(index int, widget Widget, fill float64) { c := &boxLayoutCell{ widget: widget, fill: fill, view: NewViewPort(b.view, 0, 0, 0, 0), } c.widget.SetView(c.view) if index < 0 { index = 0 } if index > len(b.cells) { index = len(b.cells) } b.cells = append(b.cells, c) copy(b.cells[index+1:], b.cells[index:]) b.cells[index] = c widget.Watch(b) b.layout() b.PostEventWidgetContent(b) } // RemoveWidget removes a Widget from the layout. func (b *BoxLayout) RemoveWidget(widget Widget) { changed := false for i := 0; i < len(b.cells); i++ { if b.cells[i].widget == widget { b.cells = append(b.cells[:i], b.cells[i+1:]...) changed = true } } if !changed { return } b.changed = true widget.Unwatch(b) b.layout() b.PostEventWidgetContent(b) } // Widgets returns the list of Widgets for this BoxLayout. func (b *BoxLayout) Widgets() []Widget { w := make([]Widget, 0, len(b.cells)) for _, c := range b.cells { w = append(w, c.widget) } return w } // SetOrientation sets the orientation as either Horizontal or Vertical. func (b *BoxLayout) SetOrientation(orient Orientation) { if b.orient != orient { b.orient = orient b.changed = true b.PostEventWidgetContent(b) } } // SetStyle sets the style used. func (b *BoxLayout) SetStyle(style tcell.Style) { b.style = style b.PostEventWidgetContent(b) } // NewBoxLayout creates an empty BoxLayout. func NewBoxLayout(orient Orientation) *BoxLayout { return &BoxLayout{orient: orient} } tcell-1.3.0/views/cellarea.go000066400000000000000000000150561354173511300160640ustar00rootroot00000000000000// Copyright 2016 The Tcell Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use file except in compliance with the License. // You may obtain a copy of the license at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package views import ( "sync" "github.com/gdamore/tcell" ) // CellModel models the content of a CellView. The dimensions used within // a CellModel are always logical, and have origin 0, 0. type CellModel interface { GetCell(x, y int) (rune, tcell.Style, []rune, int) GetBounds() (int, int) SetCursor(int, int) GetCursor() (int, int, bool, bool) MoveCursor(offx, offy int) } // CellView is a flexible view of a CellModel, offering both cursor // management and a panning. type CellView struct { port *ViewPort view View content Widget contentV *ViewPort cursorX int cursorY int style tcell.Style lines []string model CellModel once sync.Once WidgetWatchers } // Draw draws the content. func (a *CellView) Draw() { port := a.port model := a.model port.Fill(' ', a.style) if a.view == nil { return } if model == nil { return } vw, vh := a.view.Size() for y := 0; y < vh; y++ { for x := 0; x < vw; x++ { a.view.SetContent(x, y, ' ', nil, a.style) } } ex, ey := model.GetBounds() vx, vy := port.Size() if ex < vx { ex = vx } if ey < vy { ey = vy } cx, cy, en, sh := a.model.GetCursor() for y := 0; y < ey; y++ { for x := 0; x < ex; x++ { ch, style, comb, wid := model.GetCell(x, y) if ch == 0 { ch = ' ' style = a.style } if en && x == cx && y == cy && sh { style = style.Reverse(true) } port.SetContent(x, y, ch, comb, style) x += wid - 1 } } } func (a *CellView) keyUp() { if _, _, en, _ := a.model.GetCursor(); !en { a.port.ScrollUp(1) return } a.model.MoveCursor(0, -1) a.MakeCursorVisible() } func (a *CellView) keyDown() { if _, _, en, _ := a.model.GetCursor(); !en { a.port.ScrollDown(1) return } a.model.MoveCursor(0, 1) a.MakeCursorVisible() } func (a *CellView) keyLeft() { if _, _, en, _ := a.model.GetCursor(); !en { a.port.ScrollLeft(1) return } a.model.MoveCursor(-1, 0) a.MakeCursorVisible() } func (a *CellView) keyRight() { if _, _, en, _ := a.model.GetCursor(); !en { a.port.ScrollRight(1) return } a.model.MoveCursor(+1, 0) a.MakeCursorVisible() } func (a *CellView) keyPgUp() { _, vy := a.port.Size() if _, _, en, _ := a.model.GetCursor(); !en { a.port.ScrollUp(vy) return } a.model.MoveCursor(0, -vy) a.MakeCursorVisible() } func (a *CellView) keyPgDn() { _, vy := a.port.Size() if _, _, en, _ := a.model.GetCursor(); !en { a.port.ScrollDown(vy) return } a.model.MoveCursor(0, +vy) a.MakeCursorVisible() } func (a *CellView) keyHome() { vx, vy := a.model.GetBounds() if _, _, en, _ := a.model.GetCursor(); !en { a.port.ScrollUp(vy) a.port.ScrollLeft(vx) return } a.model.SetCursor(0, 0) a.MakeCursorVisible() } func (a *CellView) keyEnd() { vx, vy := a.model.GetBounds() if _, _, en, _ := a.model.GetCursor(); !en { a.port.ScrollDown(vy) a.port.ScrollRight(vx) return } a.model.SetCursor(vx, vy) a.MakeCursorVisible() } // MakeCursorVisible ensures that the cursor is visible, panning the ViewPort // as necessary, if the cursor is enabled. func (a *CellView) MakeCursorVisible() { if a.model == nil { return } x, y, enabled, _ := a.model.GetCursor() if enabled { a.MakeVisible(x, y) } } // HandleEvent handles events. In particular, it handles certain key events // to move the cursor or pan the view. func (a *CellView) HandleEvent(e tcell.Event) bool { if a.model == nil { return false } switch e := e.(type) { case *tcell.EventKey: switch e.Key() { case tcell.KeyUp, tcell.KeyCtrlP: a.keyUp() return true case tcell.KeyDown, tcell.KeyCtrlN: a.keyDown() return true case tcell.KeyRight, tcell.KeyCtrlF: a.keyRight() return true case tcell.KeyLeft, tcell.KeyCtrlB: a.keyLeft() return true case tcell.KeyPgDn: a.keyPgDn() return true case tcell.KeyPgUp: a.keyPgUp() return true case tcell.KeyEnd: a.keyEnd() return true case tcell.KeyHome: a.keyHome() return true } } return false } // Size returns the content size, based on the model. func (a *CellView) Size() (int, int) { // We always return a minimum of two rows, and two columns. w, h := a.model.GetBounds() // Clip to a 2x2 minimum square; we can scroll within that. if w > 2 { w = 2 } if h > 2 { h = 2 } return w, h } // SetModel sets the model for this CellView. func (a *CellView) SetModel(model CellModel) { w, h := model.GetBounds() model.SetCursor(0, 0) a.model = model a.port.SetContentSize(w, h, true) a.port.ValidateView() a.PostEventWidgetContent(a) } // SetView sets the View context. func (a *CellView) SetView(view View) { port := a.port port.SetView(view) a.view = view if view == nil { return } width, height := view.Size() a.port.Resize(0, 0, width, height) if a.model != nil { w, h := a.model.GetBounds() a.port.SetContentSize(w, h, true) } a.Resize() } // Resize is called when the View is resized. It will ensure that the // cursor is visible, if present. func (a *CellView) Resize() { // We might want to reflow text width, height := a.view.Size() a.port.Resize(0, 0, width, height) a.port.ValidateView() a.MakeCursorVisible() } // SetCursor sets the the cursor position. func (a *CellView) SetCursor(x, y int) { a.cursorX = x a.cursorY = y a.model.SetCursor(x, y) } // SetCursorX sets the the cursor column. func (a *CellView) SetCursorX(x int) { a.SetCursor(x, a.cursorY) } // SetCursorY sets the the cursor row. func (a *CellView) SetCursorY(y int) { a.SetCursor(a.cursorX, y) } // MakeVisible makes the given coordinates visible, if they are not already. // It does this by moving the ViewPort for the CellView. func (a *CellView) MakeVisible(x, y int) { a.port.MakeVisible(x, y) } // SetStyle sets the the default fill style. func (a *CellView) SetStyle(s tcell.Style) { a.style = s } // Init initializes a new CellView for use. func (a *CellView) Init() { a.once.Do(func() { a.port = NewViewPort(nil, 0, 0, 0, 0) a.style = tcell.StyleDefault }) } // NewCellView creates a CellView. func NewCellView() *CellView { cv := &CellView{} cv.Init() return cv } tcell-1.3.0/views/constants.go000066400000000000000000000032431354173511300163230ustar00rootroot00000000000000// Copyright 2015 The Tops'l Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use file except in compliance with the License. // You may obtain a copy of the license at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package views // Alignment represents the alignment of an object, and consists of // either or both of horizontal and vertical alignment. type Alignment int const ( // HAlignLeft indicates alignment on the left edge. HAlignLeft Alignment = 1 << iota // HAlignCenter indicates horizontally centered. HAlignCenter // HAlignRight indicates alignment on the right edge. HAlignRight // VAlignTop indicates alignment on the top edge. VAlignTop // VAlignCenter indicates vertically centered. VAlignCenter // VAlignBottom indicates alignment on the bottom edge. VAlignBottom ) const ( // AlignBegin indicates alignment at the top left corner. AlignBegin = HAlignLeft | VAlignTop // AlignEnd indicates alignment at the bottom right corner. AlignEnd = HAlignRight | VAlignBottom // AlignMiddle indicates full centering. AlignMiddle = HAlignCenter | VAlignCenter ) // Orientation represents the direction of a widget or layout. type Orientation int const ( // Horizontal indicates left to right orientation. Horizontal = iota // Vertical indicates top to bottom orientation. Vertical ) tcell-1.3.0/views/panel.go000066400000000000000000000047551354173511300154170ustar00rootroot00000000000000// Copyright 2015 The Tops'l Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use file except in compliance with the License. // You may obtain a copy of the license at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package views // Panel is a modified Layout that includes a primary content pane, // prefixed with an optional title, and an optional menubar, and then // suffixed by an optional status. // // Only the content pane is resizable. The panel will be formatted // like this: // // +---------- // | title // | menu // | content.... // | // | status // +---------- // // Each of these components may be any valid widget; their names are // only meant to be indicative of conventional use, not prescriptive. type Panel struct { title Widget menu Widget content Widget status Widget inited bool BoxLayout } // Draw draws the Panel. func (p *Panel) Draw() { p.BoxLayout.SetOrientation(Vertical) p.BoxLayout.Draw() } // SetTitle sets the Widget to display in the title area. func (p *Panel) SetTitle(w Widget) { if p.title != nil { p.RemoveWidget(p.title) } p.InsertWidget(0, w, 0.0) p.title = w } // SetMenu sets the Widget to display in the menu area, which is // just below the title. func (p *Panel) SetMenu(w Widget) { index := 0 if p.title != nil { index++ } if p.menu != nil { p.RemoveWidget(p.menu) } p.InsertWidget(index, w, 0.0) p.menu = w } // SetContent sets the Widget to display in the content area. func (p *Panel) SetContent(w Widget) { index := 0 if p.title != nil { index++ } if p.menu != nil { index++ } if p.content != nil { p.RemoveWidget(p.content) } p.InsertWidget(index, w, 1.0) p.content = w } // SetStatus sets the Widget to display in the status area, which is at // the bottom of the panel. func (p *Panel) SetStatus(w Widget) { index := 0 if p.title != nil { index++ } if p.menu != nil { index++ } if p.content != nil { index++ } if p.status != nil { p.RemoveWidget(p.status) } p.InsertWidget(index, w, 0.0) p.status = w } // NewPanel creates a new Panel. A zero valued panel can be created too. func NewPanel() *Panel { return &Panel{} } tcell-1.3.0/views/spacer.go000066400000000000000000000027771354173511300155770ustar00rootroot00000000000000// Copyright 2015 The Tcell Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use file except in compliance with the License. // You may obtain a copy of the license at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package views import ( "github.com/gdamore/tcell" ) // Spacer is a Widget that occupies no visible real-estate. It is useful to // add this to layouts when expansion space is required. It expands as needed // with blank space. type Spacer struct { WidgetWatchers } // Draw is called to update the displayed content. func (*Spacer) Draw() {} // Size always returns 0, 0, since no size is ever *requird* to display nothing. func (*Spacer) Size() (int, int) { return 0, 0 } // SetView sets the View object used for the text bar. func (*Spacer) SetView(View) {} // HandleEvent implements a tcell.EventHandler, but does nothing. func (*Spacer) HandleEvent(tcell.Event) bool { return false } // Resize is called when our View changes sizes. func (s *Spacer) Resize() { s.PostEventWidgetResize(s) } // NewSpacer creates an empty Spacer. It's probably easier just to declare it // directly. func NewSpacer() *Spacer { return &Spacer{} } tcell-1.3.0/views/sstext.go000066400000000000000000000073031354173511300156420ustar00rootroot00000000000000// Copyright 2016 The Tcell Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use file except in compliance with the License. // You may obtain a copy of the license at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package views import ( "github.com/gdamore/tcell" "unicode" ) // SimpleStyledText is a form of Text that offers highlighting of the text // using simple in-line markup. Its intention is to make it easier to mark // up hot // keys for menubars, etc. type SimpleStyledText struct { styles map[rune]tcell.Style markup []rune Text } // SetMarkup sets the text used for the string. It applies markup as follows // (modeled on tcsh style prompt markup): // // * %% - emit a single % in current style // * %N - normal style // * %A - alternate style // * %S - start standout (reverse) style // * %B - start bold style // * %U - start underline style // // Other styles can be set using %, if styles are registered. // Upper case characters and punctuation are reserved for use by the system. // Lower case are available for use by the user. (Users may define mappings // for upper case letters to override system defined styles.) // // Note that for simplicity, combining styles is not supported. By default // the alternate style is the same as standout (reverse) mode. // // Arguably we could have used Markdown syntax instead, but properly doing all // of Markdown is not trivial, and these escape sequences make it clearer that // we are not even attempting to do that. func (t *SimpleStyledText) SetMarkup(s string) { markup := []rune(s) styl := make([]tcell.Style, 0, len(markup)) text := make([]rune, 0, len(markup)) style := t.styles['N'] esc := false for _, r := range markup { if esc { esc = false switch r { case '%': text = append(text, '%') styl = append(styl, style) default: style = t.styles[r] } continue } switch r { case '%': esc = true continue default: text = append(text, r) styl = append(styl, style) } } t.Text.SetText(string(text)) for i, s := range styl { t.SetStyleAt(i, s) } t.markup = markup } // Registers a style for the given rune. This style will be used for // text marked with %. See SetMarkup() for more detail. Note that // this must be done before using any of the styles with SetMarkup(). // Only letters may be used when registering styles, and be advised that // the system may have predefined uses for upper case letters. func (t *SimpleStyledText) RegisterStyle(r rune, style tcell.Style) { if r == 'N' { t.Text.SetStyle(style) } if unicode.IsLetter(r) { t.styles[r] = style } } // LookupStyle returns the style registered for the given rune. // Returns tcell.StyleDefault if no style was previously registered // for the rune. func (t *SimpleStyledText) LookupStyle(r rune) tcell.Style { return t.styles[r] } // Markup returns the text that was set, including markup. func (t *SimpleStyledText) Markup() string { return string(t.markup) } // NewSimpleStyledText creates an empty Text. func NewSimpleStyledText() *SimpleStyledText { ss := &SimpleStyledText{} // Create map and establish default styles. ss.styles = make(map[rune]tcell.Style) ss.styles['N'] = tcell.StyleDefault ss.styles['S'] = tcell.StyleDefault.Reverse(true) ss.styles['U'] = tcell.StyleDefault.Underline(true) ss.styles['B'] = tcell.StyleDefault.Bold(true) return ss } tcell-1.3.0/views/sstextbar.go000066400000000000000000000060101354173511300163210ustar00rootroot00000000000000// Copyright 2016 The Tcell Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use file except in compliance with the License. // You may obtain a copy of the license at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package views import ( "sync" "github.com/gdamore/tcell" ) // SimpleStyledTextBar is a Widget that provides a single line of text, but // with distinct left, center, and right areas. Each of the areas can be // styled differently, and can contain internal style markup. // They align to the left, center, and right respectively. // This is basically a convenience type on top SimpleStyledText and BoxLayout. type SimpleStyledTextBar struct { left *SimpleStyledText right *SimpleStyledText center *SimpleStyledText once sync.Once BoxLayout } // SetRight sets the right text for the textbar. // It is always right-aligned. func (s *SimpleStyledTextBar) SetRight(m string) { s.initialize() s.right.SetMarkup(m) } // SetLeft sets the left text for the textbar. // It is always left-aligned. func (s *SimpleStyledTextBar) SetLeft(m string) { s.initialize() s.left.SetMarkup(m) } // SetCenter sets the center text for the textbar. // It is always centered. func (s *SimpleStyledTextBar) SetCenter(m string) { s.initialize() s.center.SetMarkup(m) } func (s *SimpleStyledTextBar) RegisterRightStyle(r rune, style tcell.Style) { s.initialize() s.right.RegisterStyle(r, style) } func (s *SimpleStyledTextBar) RegisterLeftStyle(r rune, style tcell.Style) { s.initialize() s.left.RegisterStyle(r, style) } func (s *SimpleStyledTextBar) RegisterCenterStyle(r rune, style tcell.Style) { s.initialize() s.center.RegisterStyle(r, style) } func (s *SimpleStyledTextBar) Size() (int, int) { s.initialize() w, h := s.BoxLayout.Size() if h < 1 { h = 1 } if w < 1 { w = 1 } return w, h } func (s *SimpleStyledTextBar) initialize() { s.once.Do(func() { s.center = NewSimpleStyledText() s.left = NewSimpleStyledText() s.right = NewSimpleStyledText() s.center.SetAlignment(VAlignTop | HAlignCenter) s.left.SetAlignment(VAlignTop | HAlignLeft) s.right.SetAlignment(VAlignTop | HAlignRight) s.BoxLayout.SetOrientation(Horizontal) s.BoxLayout.AddWidget(s.left, 0.0) s.BoxLayout.AddWidget(NewSpacer(), 1.0) s.BoxLayout.AddWidget(s.center, 0.0) s.BoxLayout.AddWidget(NewSpacer(), 1.0) s.BoxLayout.AddWidget(s.right, 0.0) }) } // Init prepares the widget for use, ensuring resources needed are // allocated, etc. func (s *SimpleStyledTextBar) Init() { s.initialize() } // NewSimpleStyledTextBar creates an empty, initialized TextBar. func NewSimpleStyledTextBar() *SimpleStyledTextBar { s := &SimpleStyledTextBar{} s.initialize() return s } tcell-1.3.0/views/text.go000066400000000000000000000144201354173511300152720ustar00rootroot00000000000000// Copyright 2015 The Tcell Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use file except in compliance with the License. // You may obtain a copy of the license at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package views import ( "github.com/mattn/go-runewidth" "github.com/gdamore/tcell" ) // Text is a Widget with containing a block of text, which can optionally // be styled. type Text struct { view View align Alignment style tcell.Style text []rune widths []int styles []tcell.Style lengths []int width int height int WidgetWatchers } func (t *Text) clear() { v := t.view w, h := v.Size() v.Clear() for y := 0; y < h; y++ { for x := 0; x < w; x++ { v.SetContent(x, y, ' ', nil, t.style) } } } // calcY figures the initial Y offset. Alignment is top by default. func (t *Text) calcY(height int) int { if t.align&VAlignCenter != 0 { return (height - len(t.lengths)) / 2 } if t.align&VAlignBottom != 0 { return height - len(t.lengths) } return 0 } // calcX figures the initial X offset for the given line. // Alignment is left by default. func (t *Text) calcX(width, line int) int { if t.align&HAlignCenter != 0 { return (width - t.lengths[line]) / 2 } if t.align&HAlignRight != 0 { return width - t.lengths[line] } return 0 } // Draw draws the Text. func (t *Text) Draw() { v := t.view if v == nil { return } width, height := v.Size() if width == 0 || height == 0 { return } t.clear() // Note that we might wind up with a negative X if the width // is larger than the length. That's OK, and correct even. // The view will clip it properly in that case. // We align to the left & top by default. y := t.calcY(height) r := rune(0) w := 0 x := 0 var styl tcell.Style var comb []rune line := 0 newline := true for i, l := range t.text { if newline { x = t.calcX(width, line) newline = false } if l == '\n' { if w != 0 { v.SetContent(x, y, r, comb, styl) } newline = true w = 0 comb = nil line++ y++ continue } if t.widths[i] == 0 { comb = append(comb, l) continue } if w != 0 { v.SetContent(x, y, r, comb, styl) x += w } r = l w = t.widths[i] styl = t.styles[i] comb = nil } if w != 0 { v.SetContent(x, y, r, comb, styl) } } // Size returns the width and height in character cells of the Text. func (t *Text) Size() (int, int) { if len(t.text) != 0 { return t.width, t.height } return 0, 0 } // SetAlignment sets the alignment. Negative values // indicate right justification, positive values are left, // and zero indicates center aligned. func (t *Text) SetAlignment(align Alignment) { if align != t.align { t.align = align t.PostEventWidgetContent(t) } } // Alignment returns the alignment of the Text. func (t *Text) Alignment() Alignment { return t.align } // SetView sets the View object used for the text bar. func (t *Text) SetView(view View) { t.view = view } // HandleEvent implements a tcell.EventHandler, but does nothing. func (t *Text) HandleEvent(tcell.Event) bool { return false } // SetText sets the text used for the string. Any previously set // styles on individual rune indices are reset, and the default style // for the widget is set. func (t *Text) SetText(s string) { t.width = 0 t.text = []rune(s) if len(t.widths) < len(t.text) { t.widths = make([]int, len(t.text)) } else { t.widths = t.widths[0:len(t.text)] } if len(t.styles) < len(t.text) { t.styles = make([]tcell.Style, len(t.text)) } else { t.styles = t.styles[0:len(t.text)] } t.lengths = []int{} length := 0 for i, r := range t.text { t.widths[i] = runewidth.RuneWidth(r) t.styles[i] = t.style if r == '\n' { t.lengths = append(t.lengths, length) if length > t.width { t.width = length length = 0 } } else if t.widths[i] == 0 && length == 0 { // If first character on line is combining, inject // a leading space. (Shame on the caller!) t.widths = append(t.widths, 0) copy(t.widths[i+1:], t.widths[i:]) t.widths[i] = 1 t.text = append(t.text, ' ') copy(t.text[i+1:], t.text[i:]) t.text[i] = ' ' t.styles = append(t.styles, t.style) copy(t.styles[i+1:], t.styles[i:]) t.styles[i] = t.style length++ } else { length += t.widths[i] } } if length > 0 { t.lengths = append(t.lengths, length) if length > t.width { t.width = length } } t.height = len(t.lengths) t.PostEventWidgetContent(t) } // Text returns the text that was set. func (t *Text) Text() string { return string(t.text) } // SetStyle sets the style used. This applies to every cell in the // in the text. func (t *Text) SetStyle(style tcell.Style) { t.style = style for i := 0; i < len(t.text); i++ { if t.widths[i] != 0 { t.styles[i] = t.style } } t.PostEventWidgetContent(t) } // Style returns the previously set default style. Note that // individual characters may have different styles. func (t *Text) Style() tcell.Style { return t.style } // SetStyleAt sets the style at the given rune index. Note that for // strings containing combining characters, it is not possible to // change the style at the position of the combining character, but // those positions *do* count for calculating the index. A lot of // complexity can be avoided by avoiding the use of combining characters. func (t *Text) SetStyleAt(pos int, style tcell.Style) { if pos < 0 || pos >= len(t.text) || t.widths[pos] < 1 { return } t.styles[pos] = style t.PostEventWidgetContent(t) } // StyleAt gets the style at the given rune index. If an invalid // index is given, or the index is a combining character, then // tcell.StyleDefault is returned. func (t *Text) StyleAt(pos int) tcell.Style { if pos < 0 || pos >= len(t.text) || t.widths[pos] < 1 { return tcell.StyleDefault } return t.styles[pos] } // Resize is called when our View changes sizes. func (t *Text) Resize() { t.PostEventWidgetResize(t) } // NewText creates an empty Text. func NewText() *Text { return &Text{} } tcell-1.3.0/views/textarea.go000066400000000000000000000064531354173511300161320ustar00rootroot00000000000000// Copyright 2016 The Tcell Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use file except in compliance with the License. // You may obtain a copy of the license at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package views import ( "strings" "sync" "github.com/gdamore/tcell" ) // TextArea is a pannable 2 dimensional text widget. It wraps both // the view and the model for text in a single, convenient widget. // Text is provided as an array of strings, each of which represents // a single line to display. All text in the TextArea has the same // style. An optional soft cursor is available. type TextArea struct { model *linesModel once sync.Once CellView } type linesModel struct { lines []string width int height int x int y int hide bool cursor bool style tcell.Style } func (m *linesModel) GetCell(x, y int) (rune, tcell.Style, []rune, int) { var ch rune if x < 0 || y < 0 || y >= len(m.lines) || x >= len(m.lines[y]) { return ch, m.style, nil, 1 } // XXX: extend this to support combining and full width chars return rune(m.lines[y][x]), m.style, nil, 1 } func (m *linesModel) GetBounds() (int, int) { return m.width, m.height } func (m *linesModel) limitCursor() { if m.x > m.width-1 { m.x = m.width - 1 } if m.y > m.height-1 { m.y = m.height - 1 } if m.x < 0 { m.x = 0 } if m.y < 0 { m.y = 0 } } func (m *linesModel) SetCursor(x, y int) { m.x = x m.y = y m.limitCursor() } func (m *linesModel) MoveCursor(x, y int) { m.x += x m.y += y m.limitCursor() } func (m *linesModel) GetCursor() (int, int, bool, bool) { return m.x, m.y, m.cursor, !m.hide } // SetLines sets the content text to display. func (ta *TextArea) SetLines(lines []string) { ta.Init() m := ta.model m.width = 0 m.height = len(lines) m.lines = append([]string{}, lines...) for _, l := range lines { if len(l) > m.width { m.width = len(l) } } ta.CellView.SetModel(m) } func (ta *TextArea) SetStyle(style tcell.Style) { ta.model.style = style ta.CellView.SetStyle(style) } // EnableCursor enables a soft cursor in the TextArea. func (ta *TextArea) EnableCursor(on bool) { ta.Init() ta.model.cursor = on } // HideCursor hides or shows the cursor in the TextArea. // If on is true, the cursor is hidden. Note that a cursor is only // shown if it is enabled. func (ta *TextArea) HideCursor(on bool) { ta.Init() ta.model.hide = on } // SetContent is used to set the textual content, passed as a // single string. Lines within the string are delimited by newlines. func (ta *TextArea) SetContent(text string) { ta.Init() lines := strings.Split(strings.Trim(text, "\n"), "\n") ta.SetLines(lines) } // Init initializes the TextArea. func (ta *TextArea) Init() { ta.once.Do(func() { lm := &linesModel{lines: []string{}, width: 0} ta.model = lm ta.CellView.Init() ta.CellView.SetModel(lm) }) } // NewTextArea creates a blank TextArea. func NewTextArea() *TextArea { ta := &TextArea{} ta.Init() return ta } tcell-1.3.0/views/textbar.go000066400000000000000000000105441354173511300157620ustar00rootroot00000000000000// Copyright 2015 The Tcell Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use file except in compliance with the License. // You may obtain a copy of the license at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package views import ( "sync" "github.com/gdamore/tcell" ) // TextBar is a Widget that provides a single line of text, but with // distinct left, center, and right areas. Each of the areas can be styled // differently, and they align to the left, center, and right respectively. // This is basically a convenience type on top Text and BoxLayout. type TextBar struct { changed bool style tcell.Style left Text right Text center Text view View lview ViewPort rview ViewPort cview ViewPort once sync.Once WidgetWatchers } // SetCenter sets the center text for the textbar. The text is // always center aligned. func (t *TextBar) SetCenter(s string, style tcell.Style) { t.initialize() if style == tcell.StyleDefault { style = t.style } t.center.SetText(s) t.center.SetStyle(style) } // SetLeft sets the left text for the textbar. It is always left-aligned. func (t *TextBar) SetLeft(s string, style tcell.Style) { t.initialize() if style == tcell.StyleDefault { style = t.style } t.left.SetText(s) t.left.SetStyle(style) } // SetRight sets the right text for the textbar. It is always right-aligned. func (t *TextBar) SetRight(s string, style tcell.Style) { t.initialize() if style == tcell.StyleDefault { style = t.style } t.right.SetText(s) t.right.SetStyle(style) } // SetStyle is used to set a default style to use for the textbar, including // areas where no text is present. Note that this will not change the text // already displayed, so call this before changing or setting text. func (t *TextBar) SetStyle(style tcell.Style) { t.initialize() t.style = style } func (t *TextBar) initialize() { t.once.Do(func() { t.center.SetView(&t.cview) t.left.SetView(&t.lview) t.right.SetView(&t.rview) t.center.SetAlignment(VAlignTop | HAlignCenter) t.left.SetAlignment(VAlignTop | HAlignLeft) t.right.SetAlignment(VAlignTop | HAlignRight) t.center.Watch(t) t.left.Watch(t) t.right.Watch(t) }) } func (t *TextBar) layout() { w, _ := t.view.Size() ww, wh := t.left.Size() t.lview.Resize(0, 0, ww, wh) ww, wh = t.center.Size() t.cview.Resize((w-ww)/2, 0, ww, wh) ww, wh = t.right.Size() t.rview.Resize(w-ww, 0, ww, wh) t.changed = false } // SetView sets the View drawing context for this TextBar. func (t *TextBar) SetView(view View) { t.initialize() t.view = view t.lview.SetView(view) t.rview.SetView(view) t.cview.SetView(view) t.changed = true } // Draw draws the TextBar into its View context. func (t *TextBar) Draw() { t.initialize() if t.changed { t.layout() } w, h := t.view.Size() for y := 0; y < h; y++ { for x := 0; x < w; x++ { t.view.SetContent(x, y, ' ', nil, t.style) } } // Draw in reverse order -- if we clip, we will clip at the // right side. t.right.Draw() t.center.Draw() t.left.Draw() } // Resize is called when the TextBar's View changes size, and // updates the layout. func (t *TextBar) Resize() { t.initialize() t.layout() t.left.Resize() t.center.Resize() t.right.Resize() t.PostEventWidgetResize(t) } // Size implements the Size method for Widget, returning the width // and height in character cells. func (t *TextBar) Size() (int, int) { w, h := 0, 0 ww, wh := t.left.Size() w += ww if wh > h { h = wh } ww, wh = t.center.Size() w += ww if wh > h { h = wh } ww, wh = t.right.Size() w += ww if wh > h { h = wh } return w, h } // HandleEvent handles incoming events. The only events handled are // those for the Text objects; when those change, the TextBar adjusts // the layout to accommodate. func (t *TextBar) HandleEvent(ev tcell.Event) bool { switch ev.(type) { case *EventWidgetContent: t.changed = true return true } return false } // NewTextBar creates an empty, initialized TextBar. func NewTextBar() *TextBar { t := &TextBar{} t.initialize() return t } tcell-1.3.0/views/view.go000066400000000000000000000220321354173511300152560ustar00rootroot00000000000000// Copyright 2016 The Tcell Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use file except in compliance with the License. // You may obtain a copy of the license at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package views import ( "github.com/gdamore/tcell" ) // View represents a logical view on an area. It will have some underlying // physical area as well, generally. Views are operated on by Widgets. type View interface { // SetContent is used to update the content of the View at the given // location. This will generally be called by the Draw() method of // a Widget. SetContent(x int, y int, ch rune, comb []rune, style tcell.Style) // Size represents the visible size. The actual content may be // larger or smaller. Size() (int, int) // Resize tells the View that its visible dimensions have changed. // It also tells it that it has a new offset relative to any parent // view. Resize(x, y, width, height int) // Fill fills the displayed content with the given rune and style. Fill(rune, tcell.Style) // Clear clears the content. Often just Fill(' ', tcell.StyleDefault) Clear() } // ViewPort is an implementation of a View, that provides a smaller logical // view of larger content area. For example, a scrollable window of text, // the visible window would be the ViewPort, on the underlying content. // ViewPorts have a two dimensional size, and a two dimensional offset. // // In some ways, as the underlying content is not kept persistently by the // view port, it can be thought perhaps a little more precisely as a clipping // region. type ViewPort struct { physx int // Anchor to the real world, usually 0 physy int // Again, anchor to the real world, usually 3 viewx int // Logical offset of the view viewy int // Logical offset of the view limx int // Content limits -- can't right scroll past this limy int // Content limits -- can't down scroll past this width int // View width height int // View height locked bool // if true, don't autogrow v View } // Clear clears the displayed content, filling it with spaces of default // text attributes. func (v *ViewPort) Clear() { v.Fill(' ', tcell.StyleDefault) } // Fill fills the displayed view port with the given character and style. func (v *ViewPort) Fill(ch rune, style tcell.Style) { if v.v != nil { for y := 0; y < v.height; y++ { for x := 0; x < v.width; x++ { v.v.SetContent(x+v.physx, y+v.physy, ch, nil, style) } } } } // Size returns the visible size of the ViewPort in character cells. func (v *ViewPort) Size() (int, int) { return v.width, v.height } // Reset resets the record of content, and also resets the offset back // to the origin. It doesn't alter the dimensions of the view port, nor // the physical location relative to its parent. func (v *ViewPort) Reset() { v.limx = 0 v.limy = 0 v.viewx = 0 v.viewy = 0 } // SetContent is used to place data at the given cell location. Note that // since the ViewPort doesn't retain this data, if the location is outside // of the visible area, it is simply discarded. // // Generally, this is called during the Draw() phase by the object that // represents the content. func (v *ViewPort) SetContent(x, y int, ch rune, comb []rune, s tcell.Style) { if v.v == nil { return } if x > v.limx && !v.locked { v.limx = x } if y > v.limy && !v.locked { v.limy = y } if x < v.viewx || y < v.viewy { return } if x >= (v.viewx + v.width) { return } if y >= (v.viewy + v.height) { return } v.v.SetContent(x-v.viewx+v.physx, y-v.viewy+v.physy, ch, comb, s) } // MakeVisible moves the ViewPort the minimum necessary to make the given // point visible. This should be called before any content is changed with // SetContent, since otherwise it may be possible to move the location onto // a region whose contents have been discarded. func (v *ViewPort) MakeVisible(x, y int) { if x < v.limx && x >= v.viewx+v.width { v.viewx = x - (v.width - 1) } if x >= 0 && x < v.viewx { v.viewx = x } if y < v.limy && y >= v.viewy+v.height { v.viewy = y - (v.height - 1) } if y >= 0 && y < v.viewy { v.viewy = y } v.ValidateView() } // ValidateViewY ensures that the Y offset of the view port is limited so that // it cannot scroll away from the content. func (v *ViewPort) ValidateViewY() { if v.viewy >= v.limy-v.height { v.viewy = (v.limy - v.height) } if v.viewy < 0 { v.viewy = 0 } } // ValidateViewX ensures that the X offset of the view port is limited so that // it cannot scroll away from the content. func (v *ViewPort) ValidateViewX() { if v.viewx >= v.limx-v.width { v.viewx = (v.limx - v.width) } if v.viewx < 0 { v.viewx = 0 } } // ValidateView does both ValidateViewX and ValidateViewY, ensuring both // offsets are valid. func (v *ViewPort) ValidateView() { v.ValidateViewX() v.ValidateViewY() } // Center centers the point, if possible, in the View. func (v *ViewPort) Center(x, y int) { if x < 0 || y < 0 || x >= v.limx || y >= v.limy || v.v == nil { return } v.viewx = x - (v.width / 2) v.viewy = y - (v.height / 2) v.ValidateView() } // ScrollUp moves the view up, showing lower numbered rows of content. func (v *ViewPort) ScrollUp(rows int) { v.viewy -= rows v.ValidateViewY() } // ScrollDown moves the view down, showingh higher numbered rows of content. func (v *ViewPort) ScrollDown(rows int) { v.viewy += rows v.ValidateViewY() } // ScrollLeft moves the view to the left. func (v *ViewPort) ScrollLeft(cols int) { v.viewx -= cols v.ValidateViewX() } // ScrollRight moves the view to the left. func (v *ViewPort) ScrollRight(cols int) { v.viewx += cols v.ValidateViewX() } // SetSize is used to set the visible size of the view. Enclosing views or // layout managers can use this to inform the View of its correct visible size. func (v *ViewPort) SetSize(width, height int) { v.height = height v.width = width v.ValidateView() } // GetVisible returns the upper left and lower right coordinates of the visible // content. That is, it will return x1, y1, x2, y2 where the upper left cell // is position x1, y1, and the lower right is x2, y2. These coordinates are // in the space of the content, that is the content area uses coordinate 0,0 // as its first cell position. func (v *ViewPort) GetVisible() (int, int, int, int) { return v.viewx, v.viewy, v.viewx + v.width - 1, v.viewy + v.height - 1 } // GetPhysical returns the upper left and lower right coordinates of the visible // content in the coordinate space of the parent. This is may be the physical // coordinates of the screen, if the screen is the view's parent. func (v *ViewPort) GetPhysical() (int, int, int, int) { return v.physx, v.physy, v.physx + v.width - 1, v.physy + v.height - 1 } // SetContentSize sets the size of the content area; this is used to limit // scrolling and view moment. If locked is true, then the content size will // not automatically grow even if content is placed outside of this area // with the SetContent() method. If false, and content is drawn outside // of the existing size, then the size will automatically grow to include // the new content. func (v *ViewPort) SetContentSize(width, height int, locked bool) { v.limx = width v.limy = height v.locked = locked v.ValidateView() } // GetContentSize returns the size of content as width, height in character // cells. func (v *ViewPort) GetContentSize() (int, int) { return v.limx, v.limy } // Resize is called by the enclosing view to change the size of the ViewPort, // usually in response to a window resize event. The x, y refer are the // ViewPort's location relative to the parent View. A negative value for either // width or height will cause the ViewPort to expand to fill to the end of parent // View in the relevant dimension. func (v *ViewPort) Resize(x, y, width, height int) { if v.v == nil { return } px, py := v.v.Size() if x >= 0 && x < px { v.physx = x } if y >= 0 && y < py { v.physy = y } if width < 0 { width = px - x } if height < 0 { height = py - y } if width <= x+px { v.width = width } if height <= y+py { v.height = height } } // SetView is called during setup, to provide the parent View. func (v *ViewPort) SetView(view View) { v.v = view } // NewViewPort returns a new ViewPort (and hence also a View). // The x and y coordinates are an offset relative to the parent. // The origin 0,0 represents the upper left. The width and height // indicate a width and height. If the value -1 is supplied, then the // dimension is calculated from the parent. func NewViewPort(view View, x, y, width, height int) *ViewPort { v := &ViewPort{v: view} // initial (and possibly poor) assumptions -- all visible // cells are addressible, but none beyond that. v.limx = width v.limy = height v.Resize(x, y, width, height) return v } tcell-1.3.0/views/widget.go000066400000000000000000000120671354173511300155760ustar00rootroot00000000000000// Copyright 2015 The Tcell Authors // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use file except in compliance with the License. // You may obtain a copy of the license at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package views import ( "github.com/gdamore/tcell" ) // Widget is the base object that all onscreen elements implement. type Widget interface { // Draw is called to inform the widget to draw itself. A containing // Widget will generally call this during the application draw loop. Draw() // Resize is called in response to a resize of the View. Unlike with // other events, Resize performed by parents first, and they must // then call their children. This is because the children need to // see the updated sizes from the parents before they are called. // In general this is done *after* the views have updated. Resize() // HandleEvent is called to ask the widget to handle any events. // If the widget has consumed the event, it should return true. // Generally, events are handled by the lower layers first, that // is for example, a button may have a chance to handle an event // before the enclosing window or panel. // // Its expected that Resize events are consumed by the outermost // Widget, and the turned into a Resize() call. HandleEvent(ev tcell.Event) bool // SetView is used by callers to set the visual context of the // Widget. The Widget should use the View as a context for // drawing. SetView(view View) // Size returns the size of the widget (content size) as width, height // in columns. Layout managers should attempt to ensure that at least // this much space is made available to the View for this Widget. Extra // space may be allocated on as an needed basis. Size() (int, int) // Watch is used to register an interest in this widget's events. // The handler will receive EventWidget events for this widget. // The order of event delivery when there are multiple watchers is // not specified, and may change from one event to the next. Watch(handler tcell.EventHandler) // Unwatch is used to urnegister an interest in this widget's events. Unwatch(handler tcell.EventHandler) } // EventWidget is an event delivered by a specific widget. type EventWidget interface { Widget() Widget tcell.Event } type widgetEvent struct { widget Widget tcell.EventTime } func (wev *widgetEvent) Widget() Widget { return wev.widget } func (wev *widgetEvent) SetWidget(widget Widget) { wev.widget = widget } // WidgetWatchers provides a common implementation for base Widget // Watch and Unwatch interfaces, suitable for embedding in more concrete // widget implementations. type WidgetWatchers struct { watchers map[tcell.EventHandler]struct{} } // Watch monitors this WidgetWatcher, causing the handler to be fired // with EventWidget as they are occur on the watched Widget. func (ww *WidgetWatchers) Watch(handler tcell.EventHandler) { if ww.watchers == nil { ww.watchers = make(map[tcell.EventHandler]struct{}) } ww.watchers[handler] = struct{}{} } // Unwatch stops monitoring this WidgetWatcher. The handler will no longer // be fired for Widget events. func (ww *WidgetWatchers) Unwatch(handler tcell.EventHandler) { if ww.watchers != nil { delete(ww.watchers, handler) } } // PostEvent delivers the EventWidget to all registered watchers. It is // to be called by the Widget implementation. func (ww *WidgetWatchers) PostEvent(wev EventWidget) { for watcher := range ww.watchers { // Deliver events to all listeners, ignoring return value. watcher.HandleEvent(wev) } } // PostEventWidgetContent is called by the Widget when its content is // changed, delivering EventWidgetContent to all watchers. func (ww *WidgetWatchers) PostEventWidgetContent(w Widget) { ev := &EventWidgetContent{} ev.SetWidget(w) ev.SetEventNow() ww.PostEvent(ev) } // PostEventWidgetResize is called by the Widget when the underlying View // has resized, delivering EventWidgetResize to all watchers. func (ww *WidgetWatchers) PostEventWidgetResize(w Widget) { ev := &EventWidgetResize{} ev.SetWidget(w) ev.SetEventNow() ww.PostEvent(ev) } // PostEventWidgetMove is called by the Widget when it is moved to a new // location, delivering EventWidgetMove to all watchers. func (ww *WidgetWatchers) PostEventWidgetMove(w Widget) { ev := &EventWidgetMove{} ev.SetWidget(w) ev.SetEventNow() ww.PostEvent(ev) } // XXX: WidgetExposed, Hidden? // XXX: WidgetExposed, Hidden? // EventWidgetContent is fired whenever a widget's content changes. type EventWidgetContent struct { widgetEvent } // EventWidgetResize is fired whenever a widget is resized. type EventWidgetResize struct { widgetEvent } // EventWidgetMove is fired whenver a widget changes location. type EventWidgetMove struct { widgetEvent }