slomo toggle

This commit is contained in:
Liam Galvin 2018-08-13 09:35:32 +01:00
parent daf32ef9ca
commit 76d846bcfe
12 changed files with 126 additions and 42 deletions

View File

@ -66,6 +66,7 @@ Ensure you have your latest graphics card drivers installed before use.
| Operation | Key(s) | | Operation | Key(s) |
|--------------------|---------------------| |--------------------|---------------------|
| Paste | ctrl + shift + v | Paste | ctrl + shift + v
| Toggle slomo | ctrl + shift + ;
| Interrupt (SIGINT) | ctrl + c | Interrupt (SIGINT) | ctrl + c
## Configuration ## Configuration

View File

@ -342,8 +342,8 @@ func (buffer *Buffer) Clear() {
// creates if necessary // creates if necessary
func (buffer *Buffer) getCurrentLine() *Line { func (buffer *Buffer) getCurrentLine() *Line {
if buffer.cursorY >= buffer.ViewHeight() { if buffer.cursorY >= buffer.ViewHeight() { // @todo is this okay?
panic(fmt.Sprintf("cursor is outside of view: y=%d h=%d", buffer.cursorY, buffer.viewHeight)) return &buffer.lines[len(buffer.lines)-1]
} }
if len(buffer.lines) < int(buffer.ViewHeight()) { if len(buffer.lines) < int(buffer.ViewHeight()) {

BIN
fonts/DejaVuSansMono.ttf Normal file

Binary file not shown.

View File

@ -17,7 +17,7 @@ import (
type GUI struct { type GUI struct {
window *glfw.Window window *glfw.Window
logger *zap.SugaredLogger logger *zap.SugaredLogger
config config.Config config *config.Config
terminal *terminal.Terminal terminal *terminal.Terminal
width int //window width in pixels width int //window width in pixels
height int //window height in pixels height int //window height in pixels
@ -27,7 +27,7 @@ type GUI struct {
colourAttr uint32 colourAttr uint32
} }
func New(config config.Config, terminal *terminal.Terminal, logger *zap.SugaredLogger) *GUI { func New(config *config.Config, terminal *terminal.Terminal, logger *zap.SugaredLogger) *GUI {
//logger. //logger.
return &GUI{ return &GUI{

View File

@ -23,6 +23,8 @@ func (gui *GUI) key(w *glfw.Window, key glfw.Key, scancode int, action glfw.Acti
if buf, err := gui.window.GetClipboardString(); err == nil { if buf, err := gui.window.GetClipboardString(); err == nil {
_ = gui.terminal.Write([]byte(buf)) _ = gui.terminal.Write([]byte(buf))
} }
case glfw.KeySemicolon:
gui.config.Slomo = !gui.config.Slomo
} }
} else { } else {
// ctrl + // ctrl +

View File

@ -38,10 +38,10 @@ func (gui *GUI) mouseButtonCallback(w *glfw.Window, button glfw.MouseButton, act
*/ */
if action == glfw.Press { if action == glfw.Press {
b := rune(button & 0xff) b := rune(byte(button & 0xff))
x := rune((gui.terminal.ActiveBuffer().CursorColumn() + 31) & 0xff) x := rune(byte((gui.terminal.ActiveBuffer().CursorColumn() + 31) & 0xff))
y := rune((gui.terminal.ActiveBuffer().CursorLine() + 31) & 0xff) y := rune(byte((gui.terminal.ActiveBuffer().CursorLine() + 31) & 0xff))
packet := fmt.Sprintf("\x1b[%cb%cx%cyM", b, x, y) packet := fmt.Sprintf("\x1b[%c%c%cM", b, x, y)
gui.terminal.Write([]byte(packet)) gui.terminal.Write([]byte(packet))
} }
case terminal.MouseModeVT200: // normal case terminal.MouseModeVT200: // normal
@ -93,9 +93,9 @@ func (gui *GUI) mouseButtonCallback(w *glfw.Window, button glfw.MouseButton, act
if mod&glfw.ModControl > 0 { if mod&glfw.ModControl > 0 {
b |= 16 b |= 16
} }
x := rune((gui.terminal.ActiveBuffer().CursorColumn() + 31) & 0xff) x := rune(byte((gui.terminal.ActiveBuffer().CursorColumn() + 31) & 0xff))
y := rune((gui.terminal.ActiveBuffer().CursorLine() + 31) & 0xff) y := rune(byte((gui.terminal.ActiveBuffer().CursorLine() + 31) & 0xff))
packet := fmt.Sprintf("\x1b[%cb%cx%cyM", b, x, y) packet := fmt.Sprintf("\x1b[%c%c%cM", b, x, y)
gui.terminal.Write([]byte(packet)) gui.terminal.Write([]byte(packet))
case terminal.MouseModeVT200Highlight: case terminal.MouseModeVT200Highlight:

View File

@ -31,7 +31,7 @@ type OpenGLRenderer struct {
termRows uint termRows uint
cellPositions map[[2]uint][2]float32 cellPositions map[[2]uint][2]float32
rectangles map[[2]uint]*rectangle rectangles map[[2]uint]*rectangle
config config.Config config *config.Config
colourAttr uint32 colourAttr uint32
program uint32 program uint32
} }
@ -117,7 +117,7 @@ func (rect *rectangle) Free() {
gl.DeleteBuffers(1, &rect.cv) gl.DeleteBuffers(1, &rect.cv)
} }
func NewOpenGLRenderer(config config.Config, font *glfont.Font, fontScale int32, areaX int, areaY int, areaWidth int, areaHeight int, colourAttr uint32, program uint32) *OpenGLRenderer { func NewOpenGLRenderer(config *config.Config, font *glfont.Font, fontScale int32, areaX int, areaY int, areaWidth int, areaHeight int, colourAttr uint32, program uint32) *OpenGLRenderer {
r := &OpenGLRenderer{ r := &OpenGLRenderer{
areaWidth: areaWidth, areaWidth: areaWidth,
areaHeight: areaHeight, areaHeight: areaHeight,

14
main.go
View File

@ -13,11 +13,11 @@ import (
"go.uber.org/zap" "go.uber.org/zap"
) )
func getConfig() config.Config { func getConfig() *config.Config {
ignore := false ignore := false
flag.BoolVar(&ignore, "ignore-config", ignore, "Ignore user config files and use defauls") flag.BoolVar(&ignore, "ignore-config", ignore, "Ignore user config files and use defauls")
if ignore { if ignore {
return config.DefaultConfig return &config.DefaultConfig
} }
conf := loadConfigFile() conf := loadConfigFile()
@ -30,11 +30,11 @@ func getConfig() config.Config {
return conf return conf
} }
func loadConfigFile() config.Config { func loadConfigFile() *config.Config {
home := os.Getenv("HOME") home := os.Getenv("HOME")
if home == "" { if home == "" {
return config.DefaultConfig return &config.DefaultConfig
} }
places := []string{ places := []string{
@ -45,7 +45,7 @@ func loadConfigFile() config.Config {
for _, place := range places { for _, place := range places {
if b, err := ioutil.ReadFile(place); err == nil { if b, err := ioutil.ReadFile(place); err == nil {
if c, err := config.Parse(b); err == nil { if c, err := config.Parse(b); err == nil {
return *c return c
} else { } else {
fmt.Printf("Invalid config at %s: %s\n", place, err) fmt.Printf("Invalid config at %s: %s\n", place, err)
} }
@ -59,10 +59,10 @@ func loadConfigFile() config.Config {
fmt.Printf("Failed to encode config file: %s\n", err) fmt.Printf("Failed to encode config file: %s\n", err)
} }
} }
return config.DefaultConfig return &config.DefaultConfig
} }
func getLogger(conf config.Config) (*zap.SugaredLogger, error) { func getLogger(conf *config.Config) (*zap.SugaredLogger, error) {
var logger *zap.Logger var logger *zap.Logger
var err error var err error

96
shit.sh Executable file
View File

@ -0,0 +1,96 @@
#!/bin/bash
# Tom Hale, 2016. MIT Licence.
# Print out 256 colours, with each number printed in its corresponding colour
# See http://askubuntu.com/questions/821157/print-a-256-color-test-pattern-in-the-terminal/821163#821163
set -eu # Fail on errors or undeclared variables
printable_colours=256
# Return a colour that contrasts with the given colour
# Bash only does integer division, so keep it integral
function contrast_colour {
local r g b luminance
colour="$1"
if (( colour < 16 )); then # Initial 16 ANSI colours
(( colour == 0 )) && printf "15" || printf "0"
return
fi
# Greyscale # rgb_R = rgb_G = rgb_B = (number - 232) * 10 + 8
if (( colour > 231 )); then # Greyscale ramp
(( colour < 244 )) && printf "15" || printf "0"
return
fi
# All other colours:
# 6x6x6 colour cube = 16 + 36*R + 6*G + B # Where RGB are [0..5]
# See http://stackoverflow.com/a/27165165/5353461
# r=$(( (colour-16) / 36 ))
g=$(( ((colour-16) % 36) / 6 ))
# b=$(( (colour-16) % 6 ))
# If luminance is bright, print number in black, white otherwise.
# Green contributes 587/1000 to human perceived luminance - ITU R-REC-BT.601
(( g > 2)) && printf "0" || printf "15"
return
# Uncomment the below for more precise luminance calculations
# # Calculate percieved brightness
# # See https://www.w3.org/TR/AERT#color-contrast
# # and http://www.itu.int/rec/R-REC-BT.601
# # Luminance is in range 0..5000 as each value is 0..5
# luminance=$(( (r * 299) + (g * 587) + (b * 114) ))
# (( $luminance > 2500 )) && printf "0" || printf "15"
}
# Print a coloured block with the number of that colour
function print_colour {
local colour="$1" contrast
contrast=$(contrast_colour "$1")
printf "\e[48;5;%sm" "$colour" # Start block of colour
printf "\e[38;5;%sm%3d" "$contrast" "$colour" # In contrast, print number
printf "\e[0m " # Reset colour
}
# Starting at $1, print a run of $2 colours
function print_run {
local i
for (( i = "$1"; i < "$1" + "$2" && i < printable_colours; i++ )) do
print_colour "$i"
done
printf " "
}
# Print blocks of colours
function print_blocks {
local start="$1" i
local end="$2" # inclusive
local block_cols="$3"
local block_rows="$4"
local blocks_per_line="$5"
local block_length=$((block_cols * block_rows))
# Print sets of blocks
for (( i = start; i <= end; i += (blocks_per_line-1) * block_length )) do
printf "\n" # Space before each set of blocks
# For each block row
for (( row = 0; row < block_rows; row++ )) do
# Print block columns for all blocks on the line
for (( block = 0; block < blocks_per_line; block++ )) do
print_run $(( i + (block * block_length) )) "$block_cols"
done
(( i += block_cols )) # Prepare to print the next row
printf "\n"
done
done
}
print_run 0 16 # The first 16 colours are spread over the whole spectrum
printf "\n"
print_blocks 16 231 6 6 3 # 6x6x6 colour cube between 16 and 231 inclusive
print_blocks 232 255 12 2 1 # Not 50, but 24 Shades of Grey

View File

@ -88,7 +88,7 @@ func csiSetMode(modeStr string, enabled bool, terminal *Terminal) error {
} else { } else {
terminal.UseMainBuffer() terminal.UseMainBuffer()
} }
case "?1000": case "?1000", "?10061000": // ?10061000 seen from xterm
// enable mouse tracking // enable mouse tracking
if enabled { if enabled {
terminal.SetMouseMode(MouseModeVT200) terminal.SetMouseMode(MouseModeVT200)

View File

@ -2,6 +2,7 @@ package terminal
import ( import (
"context" "context"
"time"
) )
// Wish list here: http://invisible-island.net/xterm/ctlseqs/ctlseqs.html // Wish list here: http://invisible-island.net/xterm/ctlseqs/ctlseqs.html
@ -30,8 +31,9 @@ func (terminal *Terminal) processInput(ctx context.Context, pty chan rune) {
default: default:
} }
//if terminal.config.slomo if terminal.config.Slomo {
//time.Sleep(time.Millisecond * 100) time.Sleep(time.Millisecond * 100)
}
b := <-pty b := <-pty

View File

@ -39,7 +39,7 @@ type Terminal struct {
logger *zap.SugaredLogger logger *zap.SugaredLogger
title string title string
size Winsize size Winsize
config config.Config config *config.Config
titleHandlers []chan bool titleHandlers []chan bool
pauseChan chan bool pauseChan chan bool
resumeChan chan bool resumeChan chan bool
@ -65,7 +65,7 @@ type Position struct {
Col int Col int
} }
func New(pty *os.File, logger *zap.SugaredLogger, config config.Config) *Terminal { func New(pty *os.File, logger *zap.SugaredLogger, config *config.Config) *Terminal {
return &Terminal{ return &Terminal{
buffers: []*buffer.Buffer{ buffers: []*buffer.Buffer{
@ -246,20 +246,3 @@ func (terminal *Terminal) SetSize(newCols uint, newLines uint) error {
return nil return nil
} }
/*
------------------ ->
ssssssssssssssssss
ssssPPPPPPPPPPPPPP
xxxxxxxxx
xxxxxxxxxxxxxxxxxx
--------------------------
ssssssssssssssssss
SsssPPPPPPPPPPPPPP
xxxxxxxxx
xxxxxxxxxxxxxxxxxx
*/