Initial commit
This commit is contained in:
commit
fea20558ac
89
application.go
Normal file
89
application.go
Normal file
@ -0,0 +1,89 @@
|
|||||||
|
package stone
|
||||||
|
|
||||||
|
import "time"
|
||||||
|
import "image/color"
|
||||||
|
|
||||||
|
type Application struct {
|
||||||
|
DamageBuffer
|
||||||
|
|
||||||
|
title string
|
||||||
|
backend Backend
|
||||||
|
config Config
|
||||||
|
}
|
||||||
|
|
||||||
|
func (application *Application) SetSize (width, height int) {
|
||||||
|
application.DamageBuffer.SetSize(width, height)
|
||||||
|
// application.updateWindowSize()
|
||||||
|
}
|
||||||
|
|
||||||
|
func (application *Application) SetTitle (title string) {
|
||||||
|
application.title = title
|
||||||
|
application.backend.SetTitle(title)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (application *Application) Run (callback func (application *Application)) {
|
||||||
|
// default values for certain parameters
|
||||||
|
width, height := application.Size()
|
||||||
|
if width < 1 { width = 80 }
|
||||||
|
if height < 1 { height = 20 }
|
||||||
|
application.DamageBuffer.SetSize(width, height)
|
||||||
|
|
||||||
|
// TODO: load these from a file
|
||||||
|
application.config.colors = [4]color.Color {
|
||||||
|
color.RGBA { R: 0x00, G: 0x00, B: 0x00, A: 0xFF },
|
||||||
|
color.RGBA { R: 0xFF, G: 0xFF, B: 0xFF, A: 0xFF },
|
||||||
|
color.RGBA { R: 0x00, G: 0x00, B: 0x00, A: 0xFF },
|
||||||
|
color.RGBA { R: 0xFF, G: 0xFF, B: 0xFF, A: 0xFF },
|
||||||
|
}
|
||||||
|
|
||||||
|
application.backend.Run(callback)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (application *Application) Await (timeout time.Duration) (keepRunning bool) {
|
||||||
|
keepRunning = application.Await(timeout)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func (application *Application) Poll () (keepRunning bool) {
|
||||||
|
keepRunning = application.Poll()
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func (application *Application) Title () (title string) {
|
||||||
|
title = application.title
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func (application *Application) Config () (config *Config) {
|
||||||
|
config = &application.config
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// func (application *Application) Resized () (resized bool) {
|
||||||
|
// resized = application.boundsDirty
|
||||||
|
// return
|
||||||
|
// }
|
||||||
|
|
||||||
|
|
||||||
|
// // updateWindowSize updates the window size according to the buffer size.
|
||||||
|
// func (application *Application) updateWindowSize () {
|
||||||
|
// if application.window == nil { return }
|
||||||
|
// application.window.SetBounds(application.calculateWindowSize())
|
||||||
|
// }
|
||||||
|
|
||||||
|
// updateBufferSize updats the buffer size according to the window size.
|
||||||
|
// func (application *Application) updateBufferSize () {
|
||||||
|
// if application.window == nil {
|
||||||
|
// panic("call to application.updateBufferSize before window exists")
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// windowBounds := application.window.Bounds().Max
|
||||||
|
//
|
||||||
|
// if windowBounds != application.previousBounds {
|
||||||
|
// application.previousBounds = windowBounds
|
||||||
|
// application.boundsDirty = true
|
||||||
|
// application.DamageBuffer.SetSize (
|
||||||
|
// int(windowBounds.X) / application.metrics.cellWidth,
|
||||||
|
// int(windowBounds.Y) / application.metrics.cellHeight)
|
||||||
|
// }
|
||||||
|
// }
|
41
backend.go
Normal file
41
backend.go
Normal file
@ -0,0 +1,41 @@
|
|||||||
|
package stone
|
||||||
|
|
||||||
|
import "time"
|
||||||
|
import "errors"
|
||||||
|
|
||||||
|
type Backend interface {
|
||||||
|
Run (callback func (application *Application)) ()
|
||||||
|
Await (timeout time.Duration) (keepRunning bool)
|
||||||
|
Poll () (keepRunning bool)
|
||||||
|
SetTitle (title string)
|
||||||
|
JustPressed (button Button) (pressed bool)
|
||||||
|
JustReleased (button Button) (released bool)
|
||||||
|
Pressed (button Button) (pressed bool)
|
||||||
|
Repeated (button Button) (repeated bool)
|
||||||
|
Typed () (text string)
|
||||||
|
Resized () (resized bool)
|
||||||
|
}
|
||||||
|
|
||||||
|
type BackendFactory func (application *Application) (backend Backend, err error)
|
||||||
|
|
||||||
|
var factories []BackendFactory
|
||||||
|
|
||||||
|
func RegisterBackend (factory BackendFactory) {
|
||||||
|
factories = append(factories, factory)
|
||||||
|
}
|
||||||
|
|
||||||
|
func instantiateBackend (application *Application) (backend Backend, err error) {
|
||||||
|
// find a suitable backend
|
||||||
|
for _, factory := range factories {
|
||||||
|
backend, err = factory(application)
|
||||||
|
if err == nil && backend != nil { return }
|
||||||
|
}
|
||||||
|
|
||||||
|
// if none were found, but there was no error produced, produce an
|
||||||
|
// error
|
||||||
|
if err == nil {
|
||||||
|
err = errors.New("no available backends")
|
||||||
|
}
|
||||||
|
|
||||||
|
return
|
||||||
|
}
|
146
backends/pixel/pixel.go
Normal file
146
backends/pixel/pixel.go
Normal file
@ -0,0 +1,146 @@
|
|||||||
|
package pixel
|
||||||
|
|
||||||
|
import "time"
|
||||||
|
import "golang.org/x/image/font"
|
||||||
|
import "github.com/faiface/pixel"
|
||||||
|
import "github.com/faiface/pixel/pixelgl"
|
||||||
|
import "golang.org/x/image/font/basicfont"
|
||||||
|
import "git.tebibyte.media/sashakoshka/stone"
|
||||||
|
|
||||||
|
type Backend struct {
|
||||||
|
window *pixelgl.Window
|
||||||
|
boundsDirty bool
|
||||||
|
previousBounds pixel.Vec
|
||||||
|
fontFace font.Face
|
||||||
|
application *stone.Application
|
||||||
|
config *stone.Config
|
||||||
|
|
||||||
|
metrics struct {
|
||||||
|
cellWidth int
|
||||||
|
cellHeight int
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (backend *Backend) Run (callback func (application *stone.Application)) {
|
||||||
|
if backend.fontFace == nil {
|
||||||
|
backend.fontFace = basicfont.Face7x13
|
||||||
|
}
|
||||||
|
|
||||||
|
faceMetrics := backend.fontFace.Metrics()
|
||||||
|
backend.metrics.cellHeight = faceMetrics.Height.Round()
|
||||||
|
// FIXME?: this might not be the best way to get the cell width
|
||||||
|
faceAdvance, ok := backend.fontFace.GlyphAdvance('M')
|
||||||
|
if ok {
|
||||||
|
backend.metrics.cellWidth = faceAdvance.Round()
|
||||||
|
} else {
|
||||||
|
backend.metrics.cellWidth = backend.metrics.cellHeight / 2
|
||||||
|
}
|
||||||
|
|
||||||
|
pixelgl.Run (func () {
|
||||||
|
var err error
|
||||||
|
backend.window, err = pixelgl.NewWindow (pixelgl.WindowConfig {
|
||||||
|
Resizable: true,
|
||||||
|
Undecorated: true,
|
||||||
|
VSync: true,
|
||||||
|
NoIconify: true,
|
||||||
|
Title: backend.application.Title(),
|
||||||
|
Bounds: backend.calculateWindowSize(),
|
||||||
|
})
|
||||||
|
backend.Poll()
|
||||||
|
|
||||||
|
if err != nil { panic(err.Error()) }
|
||||||
|
callback(backend.application)
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
func (backend *Backend) Await (timeout time.Duration) (keepRunning bool) {
|
||||||
|
if backend.window == nil {
|
||||||
|
panic("call to Backend.Await before window exists")
|
||||||
|
}
|
||||||
|
|
||||||
|
backend.draw()
|
||||||
|
backend.window.UpdateInputWait(timeout)
|
||||||
|
backend.processEvents()
|
||||||
|
keepRunning = !backend.window.Closed()
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func (backend *Backend) Poll () (keepRunning bool) {
|
||||||
|
if backend.window == nil {
|
||||||
|
panic("call to Backend.Poll before window exists")
|
||||||
|
}
|
||||||
|
|
||||||
|
backend.draw()
|
||||||
|
backend.window.UpdateInput()
|
||||||
|
backend.processEvents()
|
||||||
|
keepRunning = !backend.window.Closed()
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func (backend *Backend) SetTitle (title string) {
|
||||||
|
if backend.window != nil {
|
||||||
|
backend.window.SetTitle(title)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (backend *Backend) draw () {
|
||||||
|
didDrawing := false
|
||||||
|
|
||||||
|
if backend.boundsDirty {
|
||||||
|
backend.window.Clear (
|
||||||
|
backend.config.Color(stone.ColorApplication))
|
||||||
|
backend.boundsDirty = false
|
||||||
|
didDrawing = true
|
||||||
|
} else {
|
||||||
|
// TODO: clear out dirty cells before drawing them (we don't
|
||||||
|
// want to clear them out if we have already just cleared
|
||||||
|
// everything out)
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: draw dirty cells.
|
||||||
|
width, height := backend.application.Size()
|
||||||
|
for x := 0; x < width; x ++ {
|
||||||
|
for y := 0; y < height; y ++ {
|
||||||
|
clean := backend.application.Clean(x, y)
|
||||||
|
// cell := application.content[index]
|
||||||
|
if clean { continue }
|
||||||
|
|
||||||
|
// draw cell
|
||||||
|
|
||||||
|
didDrawing = true // TODO: set didDrawing up there ^
|
||||||
|
backend.application.MarkClean(x, y)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if didDrawing {
|
||||||
|
backend.window.SwapBuffers()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (backend *Backend) processEvents () {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
func (backend *Backend) calculateWindowSize () (bounds pixel.Rect) {
|
||||||
|
width, height := backend.application.Size()
|
||||||
|
bounds = pixel.R (
|
||||||
|
0, 0,
|
||||||
|
float64(width * backend.metrics.cellWidth),
|
||||||
|
float64(height * backend.metrics.cellHeight))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func factory (application *stone.Application) (output stone.Backend, err error) {
|
||||||
|
backend := &Backend {
|
||||||
|
application: application,
|
||||||
|
config: application.Config(),
|
||||||
|
}
|
||||||
|
output = backend
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func init () {
|
||||||
|
stone.RegisterBackend(factory)
|
||||||
|
}
|
109
buffer.go
Normal file
109
buffer.go
Normal file
@ -0,0 +1,109 @@
|
|||||||
|
package stone
|
||||||
|
|
||||||
|
type Color uint8
|
||||||
|
|
||||||
|
const (
|
||||||
|
ColorBackground Color = 0x0
|
||||||
|
ColorSelection Color = 0x1
|
||||||
|
ColorForeground Color = 0x2
|
||||||
|
ColorApplication Color = 0x3
|
||||||
|
)
|
||||||
|
|
||||||
|
type Style uint8
|
||||||
|
|
||||||
|
const (
|
||||||
|
StyleNormal Style = iota
|
||||||
|
StyleBold Style = iota >> 1
|
||||||
|
StyleItalic
|
||||||
|
StyleBoldItalic Style = StyleBold | StyleItalic
|
||||||
|
)
|
||||||
|
|
||||||
|
type Cell struct {
|
||||||
|
color Color
|
||||||
|
style Style
|
||||||
|
content rune
|
||||||
|
}
|
||||||
|
|
||||||
|
func (cell Cell) Color (color Color) {
|
||||||
|
color = cell.color
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func (cell Cell) Style (style Style) {
|
||||||
|
style = cell.style
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func (cell Cell) Rune (content rune) {
|
||||||
|
content = cell.content
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
type Buffer struct {
|
||||||
|
content []Cell
|
||||||
|
width int
|
||||||
|
height int
|
||||||
|
}
|
||||||
|
|
||||||
|
func (buffer *Buffer) Size () (width, height int) {
|
||||||
|
width = buffer.width
|
||||||
|
height = buffer.height
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func (buffer *Buffer) SetSize (width, height int) {
|
||||||
|
buffer.width = width
|
||||||
|
buffer.height = height
|
||||||
|
buffer.content = make([]Cell, width * height)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (buffer *Buffer) Cell (x, y int) (cell Cell) {
|
||||||
|
cell = buffer.content[x + y * buffer.width]
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func (buffer *Buffer) SetColor (x, y int, color Color) {
|
||||||
|
buffer.content[x + y * buffer.width].color = color
|
||||||
|
}
|
||||||
|
|
||||||
|
func (buffer *Buffer) SetStyle (x, y int, style Style) {
|
||||||
|
buffer.content[x + y * buffer.width].style = style
|
||||||
|
}
|
||||||
|
|
||||||
|
func (buffer *Buffer) SetRune (x, y int, content rune) {
|
||||||
|
buffer.content[x + y * buffer.width].content = content
|
||||||
|
}
|
||||||
|
|
||||||
|
type DamageBuffer struct {
|
||||||
|
Buffer
|
||||||
|
clean []bool
|
||||||
|
}
|
||||||
|
|
||||||
|
func (buffer *DamageBuffer) SetSize (width, height int) {
|
||||||
|
buffer.Buffer.SetSize(width, height)
|
||||||
|
buffer.clean = make([]bool, width * height)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (buffer *DamageBuffer) SetColor (x, y int, color Color) {
|
||||||
|
buffer.Buffer.SetColor(x, y, color)
|
||||||
|
buffer.clean[x + y * buffer.width] = false
|
||||||
|
}
|
||||||
|
|
||||||
|
func (buffer *DamageBuffer) SetStyle (x, y int, style Style) {
|
||||||
|
buffer.Buffer.SetStyle(x, y, style)
|
||||||
|
buffer.clean[x + y * buffer.width] = false
|
||||||
|
}
|
||||||
|
|
||||||
|
func (buffer *DamageBuffer) SetRune (x, y int, content rune) {
|
||||||
|
buffer.Buffer.SetRune(x, y, content)
|
||||||
|
buffer.clean[x + y * buffer.width] = false
|
||||||
|
}
|
||||||
|
|
||||||
|
func (buffer *DamageBuffer) Clean (x, y int) (clean bool) {
|
||||||
|
clean = buffer.clean[x + y * buffer.width]
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func (buffer *DamageBuffer) MarkClean (x, y int) {
|
||||||
|
buffer.clean[x + y * buffer.width] = true
|
||||||
|
}
|
30
config.go
Normal file
30
config.go
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
package stone
|
||||||
|
|
||||||
|
import "image/color"
|
||||||
|
|
||||||
|
type Config struct {
|
||||||
|
colors [4]color.Color
|
||||||
|
padding int
|
||||||
|
fontSize int
|
||||||
|
fontName string
|
||||||
|
}
|
||||||
|
|
||||||
|
func (config *Config) Color (index Color) (value color.Color) {
|
||||||
|
value = config.colors[index]
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func (config *Config) Padding () (padding int) {
|
||||||
|
padding = config.padding
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func (config *Config) FontSize () (fontSize int) {
|
||||||
|
fontSize = config.fontSize
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func (config *Config) FontName () (fontName string) {
|
||||||
|
fontName = config.fontName
|
||||||
|
return
|
||||||
|
}
|
27
examples/hello/main.go
Normal file
27
examples/hello/main.go
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import "git.tebibyte.media/sashakoshka/stone"
|
||||||
|
import _ "git.tebibyte.media/sashakoshka/stone/backends/pixel"
|
||||||
|
|
||||||
|
func main () {
|
||||||
|
application := stone.Application { }
|
||||||
|
application.Run(run)
|
||||||
|
}
|
||||||
|
|
||||||
|
func run (application *stone.Application) {
|
||||||
|
for application.Await(0) {
|
||||||
|
if application.Resized() {
|
||||||
|
application.SetRune(0, 0, 'h')
|
||||||
|
application.SetRune(1, 0, 'e')
|
||||||
|
application.SetRune(2, 0, 'l')
|
||||||
|
application.SetRune(3, 0, 'l')
|
||||||
|
application.SetRune(4, 0, 'o')
|
||||||
|
application.SetRune(5, 0, 'r')
|
||||||
|
application.SetRune(6, 0, 'l')
|
||||||
|
application.SetRune(7, 0, 'd')
|
||||||
|
application.SetRune(8, 0, '!')
|
||||||
|
application.SetRune(4, 4, ':')
|
||||||
|
application.SetRune(5, 4, '3')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
15
go.mod
Normal file
15
go.mod
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
module git.tebibyte.media/sashakoshka/stone
|
||||||
|
|
||||||
|
go 1.19
|
||||||
|
|
||||||
|
require github.com/faiface/pixel v0.10.0
|
||||||
|
|
||||||
|
require (
|
||||||
|
github.com/faiface/glhf v0.0.0-20181018222622-82a6317ac380 // indirect
|
||||||
|
github.com/faiface/mainthread v0.0.0-20171120011319-8b78f0a41ae3 // indirect
|
||||||
|
github.com/go-gl/gl v0.0.0-20190320180904-bf2b1f2f34d7 // indirect
|
||||||
|
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72 // indirect
|
||||||
|
github.com/go-gl/mathgl v0.0.0-20190416160123-c4601bc793c7 // indirect
|
||||||
|
github.com/pkg/errors v0.8.1 // indirect
|
||||||
|
golang.org/x/image v0.0.0-20190523035834-f03afa92d3ff // indirect
|
||||||
|
)
|
26
go.sum
Normal file
26
go.sum
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8=
|
||||||
|
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||||
|
github.com/faiface/glhf v0.0.0-20181018222622-82a6317ac380 h1:FvZ0mIGh6b3kOITxUnxS3tLZMh7yEoHo75v3/AgUqg0=
|
||||||
|
github.com/faiface/glhf v0.0.0-20181018222622-82a6317ac380/go.mod h1:zqnPFFIuYFFxl7uH2gYByJwIVKG7fRqlqQCbzAnHs9g=
|
||||||
|
github.com/faiface/mainthread v0.0.0-20171120011319-8b78f0a41ae3 h1:baVdMKlASEHrj19iqjARrPbaRisD7EuZEVJj6ZMLl1Q=
|
||||||
|
github.com/faiface/mainthread v0.0.0-20171120011319-8b78f0a41ae3/go.mod h1:VEPNJUlxl5KdWjDvz6Q1l+rJlxF2i6xqDeGuGAxa87M=
|
||||||
|
github.com/faiface/pixel v0.10.0 h1:EHm3ZdQw2Ck4y51cZqFfqQpwLqNHOoXwbNEc9Dijql0=
|
||||||
|
github.com/faiface/pixel v0.10.0/go.mod h1:lU0YYcW77vL0F1CG8oX51GXurymL45MXd57otHNLK7A=
|
||||||
|
github.com/go-gl/gl v0.0.0-20190320180904-bf2b1f2f34d7 h1:SCYMcCJ89LjRGwEa0tRluNRiMjZHalQZrVrvTbPh+qw=
|
||||||
|
github.com/go-gl/gl v0.0.0-20190320180904-bf2b1f2f34d7/go.mod h1:482civXOzJJCPzJ4ZOX/pwvXBWSnzD4OKMdH4ClKGbk=
|
||||||
|
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72 h1:b+9H1GAsx5RsjvDFLoS5zkNBzIQMuVKUYQDmxU3N5XE=
|
||||||
|
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20191125211704-12ad95a8df72/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
|
||||||
|
github.com/go-gl/mathgl v0.0.0-20190416160123-c4601bc793c7 h1:THttjeRn1iiz69E875U6gAik8KTWk/JYAHoSVpUxBBI=
|
||||||
|
github.com/go-gl/mathgl v0.0.0-20190416160123-c4601bc793c7/go.mod h1:yhpkQzEiH9yPyxDUGzkmgScbaBVlhC06qodikEM0ZwQ=
|
||||||
|
github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k=
|
||||||
|
github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I=
|
||||||
|
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
||||||
|
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
||||||
|
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||||
|
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||||
|
github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q=
|
||||||
|
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
|
||||||
|
golang.org/x/image v0.0.0-20190321063152-3fc05d484e9f/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
|
||||||
|
golang.org/x/image v0.0.0-20190523035834-f03afa92d3ff h1:+2zgJKVDVAz/BWSsuniCmU1kLCjL88Z8/kv39xCI9NQ=
|
||||||
|
golang.org/x/image v0.0.0-20190523035834-f03afa92d3ff/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js=
|
||||||
|
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
146
input.go
Normal file
146
input.go
Normal file
@ -0,0 +1,146 @@
|
|||||||
|
package stone
|
||||||
|
|
||||||
|
// FIXME: do not require import of glfw. this may require linking it, and also
|
||||||
|
// including the glfw go lib in the binary. horrible. we need to copy the key
|
||||||
|
// codes here ourselves.
|
||||||
|
import "github.com/go-gl/glfw/v3.3/glfw"
|
||||||
|
|
||||||
|
type Button int
|
||||||
|
|
||||||
|
const (
|
||||||
|
MouseButton1 Button = Button(glfw.MouseButton1)
|
||||||
|
MouseButton2 Button = Button(glfw.MouseButton2)
|
||||||
|
MouseButton3 Button = Button(glfw.MouseButton3)
|
||||||
|
MouseButton4 Button = Button(glfw.MouseButton4)
|
||||||
|
MouseButton5 Button = Button(glfw.MouseButton5)
|
||||||
|
MouseButton6 Button = Button(glfw.MouseButton6)
|
||||||
|
MouseButton7 Button = Button(glfw.MouseButton7)
|
||||||
|
MouseButton8 Button = Button(glfw.MouseButton8)
|
||||||
|
MouseButtonLast Button = Button(glfw.MouseButtonLast)
|
||||||
|
MouseButtonLeft Button = Button(glfw.MouseButtonLeft)
|
||||||
|
MouseButtonRight Button = Button(glfw.MouseButtonRight)
|
||||||
|
MouseButtonMiddle Button = Button(glfw.MouseButtonMiddle)
|
||||||
|
|
||||||
|
KeyUnknown Button = Button(glfw.KeyUnknown)
|
||||||
|
KeySpace Button = Button(glfw.KeySpace)
|
||||||
|
KeyApostrophe Button = Button(glfw.KeyApostrophe)
|
||||||
|
KeyComma Button = Button(glfw.KeyComma)
|
||||||
|
KeyMinus Button = Button(glfw.KeyMinus)
|
||||||
|
KeyPeriod Button = Button(glfw.KeyPeriod)
|
||||||
|
KeySlash Button = Button(glfw.KeySlash)
|
||||||
|
Key0 Button = Button(glfw.Key0)
|
||||||
|
Key1 Button = Button(glfw.Key1)
|
||||||
|
Key2 Button = Button(glfw.Key2)
|
||||||
|
Key3 Button = Button(glfw.Key3)
|
||||||
|
Key4 Button = Button(glfw.Key4)
|
||||||
|
Key5 Button = Button(glfw.Key5)
|
||||||
|
Key6 Button = Button(glfw.Key6)
|
||||||
|
Key7 Button = Button(glfw.Key7)
|
||||||
|
Key8 Button = Button(glfw.Key8)
|
||||||
|
Key9 Button = Button(glfw.Key9)
|
||||||
|
KeySemicolon Button = Button(glfw.KeySemicolon)
|
||||||
|
KeyEqual Button = Button(glfw.KeyEqual)
|
||||||
|
KeyA Button = Button(glfw.KeyA)
|
||||||
|
KeyB Button = Button(glfw.KeyB)
|
||||||
|
KeyC Button = Button(glfw.KeyC)
|
||||||
|
KeyD Button = Button(glfw.KeyD)
|
||||||
|
KeyE Button = Button(glfw.KeyE)
|
||||||
|
KeyF Button = Button(glfw.KeyF)
|
||||||
|
KeyG Button = Button(glfw.KeyG)
|
||||||
|
KeyH Button = Button(glfw.KeyH)
|
||||||
|
KeyI Button = Button(glfw.KeyI)
|
||||||
|
KeyJ Button = Button(glfw.KeyJ)
|
||||||
|
KeyK Button = Button(glfw.KeyK)
|
||||||
|
KeyL Button = Button(glfw.KeyL)
|
||||||
|
KeyM Button = Button(glfw.KeyM)
|
||||||
|
KeyN Button = Button(glfw.KeyN)
|
||||||
|
KeyO Button = Button(glfw.KeyO)
|
||||||
|
KeyP Button = Button(glfw.KeyP)
|
||||||
|
KeyQ Button = Button(glfw.KeyQ)
|
||||||
|
KeyR Button = Button(glfw.KeyR)
|
||||||
|
KeyS Button = Button(glfw.KeyS)
|
||||||
|
KeyT Button = Button(glfw.KeyT)
|
||||||
|
KeyU Button = Button(glfw.KeyU)
|
||||||
|
KeyV Button = Button(glfw.KeyV)
|
||||||
|
KeyW Button = Button(glfw.KeyW)
|
||||||
|
KeyX Button = Button(glfw.KeyX)
|
||||||
|
KeyY Button = Button(glfw.KeyY)
|
||||||
|
KeyZ Button = Button(glfw.KeyZ)
|
||||||
|
KeyLeftBracket Button = Button(glfw.KeyLeftBracket)
|
||||||
|
KeyBackslash Button = Button(glfw.KeyBackslash)
|
||||||
|
KeyRightBracket Button = Button(glfw.KeyRightBracket)
|
||||||
|
KeyGraveAccent Button = Button(glfw.KeyGraveAccent)
|
||||||
|
KeyWorld1 Button = Button(glfw.KeyWorld1)
|
||||||
|
KeyWorld2 Button = Button(glfw.KeyWorld2)
|
||||||
|
KeyEscape Button = Button(glfw.KeyEscape)
|
||||||
|
KeyEnter Button = Button(glfw.KeyEnter)
|
||||||
|
KeyTab Button = Button(glfw.KeyTab)
|
||||||
|
KeyBackspace Button = Button(glfw.KeyBackspace)
|
||||||
|
KeyInsert Button = Button(glfw.KeyInsert)
|
||||||
|
KeyDelete Button = Button(glfw.KeyDelete)
|
||||||
|
KeyRight Button = Button(glfw.KeyRight)
|
||||||
|
KeyLeft Button = Button(glfw.KeyLeft)
|
||||||
|
KeyDown Button = Button(glfw.KeyDown)
|
||||||
|
KeyUp Button = Button(glfw.KeyUp)
|
||||||
|
KeyPageUp Button = Button(glfw.KeyPageUp)
|
||||||
|
KeyPageDown Button = Button(glfw.KeyPageDown)
|
||||||
|
KeyHome Button = Button(glfw.KeyHome)
|
||||||
|
KeyEnd Button = Button(glfw.KeyEnd)
|
||||||
|
KeyCapsLock Button = Button(glfw.KeyCapsLock)
|
||||||
|
KeyScrollLock Button = Button(glfw.KeyScrollLock)
|
||||||
|
KeyNumLock Button = Button(glfw.KeyNumLock)
|
||||||
|
KeyPrintScreen Button = Button(glfw.KeyPrintScreen)
|
||||||
|
KeyPause Button = Button(glfw.KeyPause)
|
||||||
|
KeyF1 Button = Button(glfw.KeyF1)
|
||||||
|
KeyF2 Button = Button(glfw.KeyF2)
|
||||||
|
KeyF3 Button = Button(glfw.KeyF3)
|
||||||
|
KeyF4 Button = Button(glfw.KeyF4)
|
||||||
|
KeyF5 Button = Button(glfw.KeyF5)
|
||||||
|
KeyF6 Button = Button(glfw.KeyF6)
|
||||||
|
KeyF7 Button = Button(glfw.KeyF7)
|
||||||
|
KeyF8 Button = Button(glfw.KeyF8)
|
||||||
|
KeyF9 Button = Button(glfw.KeyF9)
|
||||||
|
KeyF10 Button = Button(glfw.KeyF10)
|
||||||
|
KeyF11 Button = Button(glfw.KeyF11)
|
||||||
|
KeyF12 Button = Button(glfw.KeyF12)
|
||||||
|
KeyF13 Button = Button(glfw.KeyF13)
|
||||||
|
KeyF14 Button = Button(glfw.KeyF14)
|
||||||
|
KeyF15 Button = Button(glfw.KeyF15)
|
||||||
|
KeyF16 Button = Button(glfw.KeyF16)
|
||||||
|
KeyF17 Button = Button(glfw.KeyF17)
|
||||||
|
KeyF18 Button = Button(glfw.KeyF18)
|
||||||
|
KeyF19 Button = Button(glfw.KeyF19)
|
||||||
|
KeyF20 Button = Button(glfw.KeyF20)
|
||||||
|
KeyF21 Button = Button(glfw.KeyF21)
|
||||||
|
KeyF22 Button = Button(glfw.KeyF22)
|
||||||
|
KeyF23 Button = Button(glfw.KeyF23)
|
||||||
|
KeyF24 Button = Button(glfw.KeyF24)
|
||||||
|
KeyF25 Button = Button(glfw.KeyF25)
|
||||||
|
KeyKP0 Button = Button(glfw.KeyKP0)
|
||||||
|
KeyKP1 Button = Button(glfw.KeyKP1)
|
||||||
|
KeyKP2 Button = Button(glfw.KeyKP2)
|
||||||
|
KeyKP3 Button = Button(glfw.KeyKP3)
|
||||||
|
KeyKP4 Button = Button(glfw.KeyKP4)
|
||||||
|
KeyKP5 Button = Button(glfw.KeyKP5)
|
||||||
|
KeyKP6 Button = Button(glfw.KeyKP6)
|
||||||
|
KeyKP7 Button = Button(glfw.KeyKP7)
|
||||||
|
KeyKP8 Button = Button(glfw.KeyKP8)
|
||||||
|
KeyKP9 Button = Button(glfw.KeyKP9)
|
||||||
|
KeyKPDecimal Button = Button(glfw.KeyKPDecimal)
|
||||||
|
KeyKPDivide Button = Button(glfw.KeyKPDivide)
|
||||||
|
KeyKPMultiply Button = Button(glfw.KeyKPMultiply)
|
||||||
|
KeyKPSubtract Button = Button(glfw.KeyKPSubtract)
|
||||||
|
KeyKPAdd Button = Button(glfw.KeyKPAdd)
|
||||||
|
KeyKPEnter Button = Button(glfw.KeyKPEnter)
|
||||||
|
KeyKPEqual Button = Button(glfw.KeyKPEqual)
|
||||||
|
KeyLeftShift Button = Button(glfw.KeyLeftShift)
|
||||||
|
KeyLeftControl Button = Button(glfw.KeyLeftControl)
|
||||||
|
KeyLeftAlt Button = Button(glfw.KeyLeftAlt)
|
||||||
|
KeyLeftSuper Button = Button(glfw.KeyLeftSuper)
|
||||||
|
KeyRightShift Button = Button(glfw.KeyRightShift)
|
||||||
|
KeyRightControl Button = Button(glfw.KeyRightControl)
|
||||||
|
KeyRightAlt Button = Button(glfw.KeyRightAlt)
|
||||||
|
KeyRightSuper Button = Button(glfw.KeyRightSuper)
|
||||||
|
KeyMenu Button = Button(glfw.KeyMenu)
|
||||||
|
KeyLast Button = Button(glfw.KeyLast)
|
||||||
|
)
|
Loading…
Reference in New Issue
Block a user