mirror of https://github.com/liamg/aminal.git
Changing to Go modules
Changes to Go modules, removes vendored files, and runs Go format across all Go source files.
This commit is contained in:
parent
8a56135a39
commit
73ee2bef97
|
@ -1,178 +0,0 @@
|
|||
# This file is autogenerated, do not edit; changes may be undone by the next 'dep ensure'.
|
||||
|
||||
|
||||
[[projects]]
|
||||
name = "github.com/BurntSushi/toml"
|
||||
packages = ["."]
|
||||
revision = "3012a1dbe2e4bd1391d42b32f0577cb7bbc7f005"
|
||||
version = "v0.3.1"
|
||||
|
||||
[[projects]]
|
||||
branch = "master"
|
||||
name = "github.com/BurntSushi/xgb"
|
||||
packages = [".","shm","xinerama","xproto"]
|
||||
revision = "27f122750802c950b2c869a5b63dafcf590ced95"
|
||||
|
||||
[[projects]]
|
||||
branch = "master"
|
||||
name = "github.com/MaxRis/w32"
|
||||
packages = ["."]
|
||||
revision = "4f5cfb03fabf8c92e8de36012c944d10a5a49b19"
|
||||
|
||||
[[projects]]
|
||||
branch = "master"
|
||||
name = "github.com/carlogit/phash"
|
||||
packages = ["."]
|
||||
revision = "c146ed9f2a2728f6f272bc08ff707dc742758e7e"
|
||||
|
||||
[[projects]]
|
||||
name = "github.com/davecgh/go-spew"
|
||||
packages = ["spew"]
|
||||
revision = "8991bc29aa16c548c550c7ff78260e27b9ab7c73"
|
||||
version = "v1.1.1"
|
||||
|
||||
[[projects]]
|
||||
name = "github.com/disintegration/imaging"
|
||||
packages = ["."]
|
||||
revision = "0bd5694c78c9c3d9a3cd06a706a8f3c59296a9ac"
|
||||
version = "v1.5.0"
|
||||
|
||||
[[projects]]
|
||||
branch = "master"
|
||||
name = "github.com/gen2brain/shm"
|
||||
packages = ["."]
|
||||
revision = "6c18ff7f8b90f16464293a114ffb31be502d54e5"
|
||||
|
||||
[[projects]]
|
||||
branch = "master"
|
||||
name = "github.com/go-gl/gl"
|
||||
packages = ["all-core/gl"]
|
||||
revision = "55b76b7df9d25d70b63e31a767f47158292b85d8"
|
||||
|
||||
[[projects]]
|
||||
branch = "master"
|
||||
name = "github.com/go-gl/glfw"
|
||||
packages = ["v3.2/glfw"]
|
||||
revision = "14db69009976890a990c14b47a04a91621597f9b"
|
||||
source = "github.com/MaxRis/glfw"
|
||||
|
||||
[[projects]]
|
||||
name = "github.com/gobuffalo/envy"
|
||||
packages = ["."]
|
||||
revision = "b29bf6b8134f3398b9333ba1893c58620152edb0"
|
||||
version = "v1.6.9"
|
||||
|
||||
[[projects]]
|
||||
branch = "master"
|
||||
name = "github.com/gobuffalo/packd"
|
||||
packages = ["."]
|
||||
revision = "a1fb7d1c9873c1dae25b15ece2fceaaf445a24eb"
|
||||
|
||||
[[projects]]
|
||||
name = "github.com/gobuffalo/packr"
|
||||
packages = ["."]
|
||||
revision = "7c2dcc2885cf30cb864d25bb1a5f50e0f5c99acd"
|
||||
version = "v1.21.3"
|
||||
|
||||
[[projects]]
|
||||
branch = "master"
|
||||
name = "github.com/gobuffalo/syncx"
|
||||
packages = ["."]
|
||||
revision = "558ac7de985fc4f4057bff27c7bdf99e92fe0750"
|
||||
|
||||
[[projects]]
|
||||
branch = "master"
|
||||
name = "github.com/golang/freetype"
|
||||
packages = [".","raster","truetype"]
|
||||
revision = "e2365dfdc4a05e4b8299a783240d4a7d5a65d4e4"
|
||||
|
||||
[[projects]]
|
||||
name = "github.com/joho/godotenv"
|
||||
packages = ["."]
|
||||
revision = "23d116af351c84513e1946b527c88823e476be13"
|
||||
version = "v1.3.0"
|
||||
|
||||
[[projects]]
|
||||
branch = "master"
|
||||
name = "github.com/kbinani/screenshot"
|
||||
packages = [".","internal/util","internal/xwindow"]
|
||||
revision = "762b39512ae8e34f0c05518c8c2058c48a6efc8d"
|
||||
|
||||
[[projects]]
|
||||
name = "github.com/kr/pty"
|
||||
packages = ["."]
|
||||
revision = "db8e3cd836b82e82e0a9c8edc6896967dd31374f"
|
||||
version = "v1.1.3"
|
||||
|
||||
[[projects]]
|
||||
branch = "master"
|
||||
name = "github.com/lxn/win"
|
||||
packages = ["."]
|
||||
revision = "a7f87360b10eafe73bd3ff01db16976fe7560fbf"
|
||||
|
||||
[[projects]]
|
||||
branch = "master"
|
||||
name = "github.com/markbates/oncer"
|
||||
packages = ["."]
|
||||
revision = "05fccaae8fc423476d98fd4c3e4699ba0fbbde48"
|
||||
|
||||
[[projects]]
|
||||
branch = "master"
|
||||
name = "github.com/mcuadros/go-version"
|
||||
packages = ["."]
|
||||
revision = "6d5863ca60fa6fe914b5fd43ed8533d7567c5b0b"
|
||||
|
||||
[[projects]]
|
||||
name = "github.com/pkg/errors"
|
||||
packages = ["."]
|
||||
revision = "645ef00459ed84a119197bfb8d8205042c6df63d"
|
||||
version = "v0.8.0"
|
||||
|
||||
[[projects]]
|
||||
name = "github.com/pmezard/go-difflib"
|
||||
packages = ["difflib"]
|
||||
revision = "792786c7400a136282c1664665ae0a8db921c6c2"
|
||||
version = "v1.0.0"
|
||||
|
||||
[[projects]]
|
||||
branch = "master"
|
||||
name = "github.com/riywo/loginshell"
|
||||
packages = ["."]
|
||||
revision = "c2f4167b23039c6289b5a488080176426ec5dad9"
|
||||
|
||||
[[projects]]
|
||||
name = "github.com/stretchr/testify"
|
||||
packages = ["assert","require"]
|
||||
revision = "f35b8ab0b5a2cef36673838d662e249dd9c94686"
|
||||
version = "v1.2.2"
|
||||
|
||||
[[projects]]
|
||||
name = "go.uber.org/atomic"
|
||||
packages = ["."]
|
||||
revision = "1ea20fb1cbb1cc08cbd0d913a96dead89aa18289"
|
||||
version = "v1.3.2"
|
||||
|
||||
[[projects]]
|
||||
name = "go.uber.org/multierr"
|
||||
packages = ["."]
|
||||
revision = "3c4937480c32f4c13a875a1829af76c98ca3d40a"
|
||||
version = "v1.1.0"
|
||||
|
||||
[[projects]]
|
||||
name = "go.uber.org/zap"
|
||||
packages = [".","buffer","internal/bufferpool","internal/color","internal/exit","zapcore"]
|
||||
revision = "ff33455a0e382e8a81d14dd7c922020b6b5e7982"
|
||||
version = "v1.9.1"
|
||||
|
||||
[[projects]]
|
||||
branch = "master"
|
||||
name = "golang.org/x/image"
|
||||
packages = ["bmp","font","math/fixed","tiff","tiff/lzw"]
|
||||
revision = "cd38e8056d9b27bb2f265effa37fb0ea6b8a7f0f"
|
||||
|
||||
[solve-meta]
|
||||
analyzer-name = "dep"
|
||||
analyzer-version = 1
|
||||
inputs-digest = "22e69f28abe89638a4422ba911ebac3118b459cbc965bf4229b658ab51506d27"
|
||||
solver-name = "gps-cdcl"
|
||||
solver-version = 1
|
63
Gopkg.toml
63
Gopkg.toml
|
@ -1,63 +0,0 @@
|
|||
|
||||
# Gopkg.toml example
|
||||
#
|
||||
# Refer to https://github.com/golang/dep/blob/master/docs/Gopkg.toml.md
|
||||
# for detailed Gopkg.toml documentation.
|
||||
#
|
||||
# required = ["github.com/user/thing/cmd/thing"]
|
||||
# ignored = ["github.com/user/project/pkgX", "bitbucket.org/user/project/pkgA/pkgY"]
|
||||
#
|
||||
# [[constraint]]
|
||||
# name = "github.com/user/project"
|
||||
# version = "1.0.0"
|
||||
#
|
||||
# [[constraint]]
|
||||
# name = "github.com/user/project2"
|
||||
# branch = "dev"
|
||||
# source = "github.com/myfork/project2"
|
||||
#
|
||||
# [[override]]
|
||||
# name = "github.com/x/y"
|
||||
# version = "2.4.0"
|
||||
|
||||
|
||||
[[constraint]]
|
||||
name = "github.com/BurntSushi/toml"
|
||||
version = "0.3.1"
|
||||
|
||||
[[constraint]]
|
||||
branch = "master"
|
||||
name = "github.com/go-gl/gl"
|
||||
|
||||
[[constraint]]
|
||||
branch = "master"
|
||||
name = "github.com/go-gl/glfw"
|
||||
source = "github.com/MaxRis/glfw"
|
||||
|
||||
[[constraint]]
|
||||
name = "github.com/gobuffalo/packr"
|
||||
version = "1.21.3"
|
||||
|
||||
[[constraint]]
|
||||
branch = "master"
|
||||
name = "github.com/golang/freetype"
|
||||
|
||||
[[constraint]]
|
||||
name = "github.com/kr/pty"
|
||||
version = "1.1.3"
|
||||
|
||||
[[constraint]]
|
||||
branch = "master"
|
||||
name = "github.com/riywo/loginshell"
|
||||
|
||||
[[constraint]]
|
||||
name = "github.com/stretchr/testify"
|
||||
version = "1.2.2"
|
||||
|
||||
[[constraint]]
|
||||
name = "go.uber.org/zap"
|
||||
version = "1.9.1"
|
||||
|
||||
[[constraint]]
|
||||
branch = "master"
|
||||
name = "golang.org/x/image"
|
|
@ -63,7 +63,6 @@ func NewBuffer(terminalState *TerminalState) *Buffer {
|
|||
}
|
||||
|
||||
func (buffer *Buffer) GetURLAtPosition(col uint16, viewRow uint16) string {
|
||||
|
||||
row := buffer.convertViewLineToRawLine((viewRow)) - uint64(buffer.terminalState.scrollLinesFromBottom)
|
||||
|
||||
cell := buffer.GetRawCell(col, row)
|
||||
|
@ -226,7 +225,6 @@ func (buffer *Buffer) StartSelection(col uint16, viewRow uint16, mode SelectionM
|
|||
}
|
||||
|
||||
func (buffer *Buffer) ExtendSelection(col uint16, viewRow uint16, complete bool) {
|
||||
|
||||
if buffer.isSelectionComplete {
|
||||
return
|
||||
}
|
||||
|
@ -410,7 +408,6 @@ func (buffer *Buffer) GetCell(viewCol uint16, viewRow uint16) *Cell {
|
|||
}
|
||||
|
||||
func (buffer *Buffer) GetRawCell(viewCol uint16, rawLine uint64) *Cell {
|
||||
|
||||
if viewCol < 0 || rawLine < 0 || int(rawLine) >= len(buffer.lines) {
|
||||
return nil
|
||||
}
|
||||
|
@ -500,7 +497,6 @@ func (buffer *Buffer) deleteLine() {
|
|||
}
|
||||
|
||||
func (buffer *Buffer) insertLine() {
|
||||
|
||||
defer buffer.emitDisplayChange()
|
||||
|
||||
if !buffer.InScrollableRegion() {
|
||||
|
@ -543,7 +539,6 @@ func (buffer *Buffer) insertLine() {
|
|||
}
|
||||
|
||||
func (buffer *Buffer) InsertBlankCharacters(count int) {
|
||||
|
||||
index := int(buffer.RawLine())
|
||||
for i := 0; i < count; i++ {
|
||||
cells := buffer.lines[index].cells
|
||||
|
@ -552,7 +547,6 @@ func (buffer *Buffer) InsertBlankCharacters(count int) {
|
|||
}
|
||||
|
||||
func (buffer *Buffer) InsertLines(count int) {
|
||||
|
||||
if buffer.HasScrollableRegion() && !buffer.InScrollableRegion() {
|
||||
// should have no effect outside of scrollable region
|
||||
return
|
||||
|
@ -563,11 +557,9 @@ func (buffer *Buffer) InsertLines(count int) {
|
|||
for i := 0; i < count; i++ {
|
||||
buffer.insertLine()
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
func (buffer *Buffer) DeleteLines(count int) {
|
||||
|
||||
if buffer.HasScrollableRegion() && !buffer.InScrollableRegion() {
|
||||
// should have no effect outside of scrollable region
|
||||
return
|
||||
|
@ -578,11 +570,9 @@ func (buffer *Buffer) DeleteLines(count int) {
|
|||
for i := 0; i < count; i++ {
|
||||
buffer.deleteLine()
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
func (buffer *Buffer) Index() {
|
||||
|
||||
// This sequence causes the active position to move downward one line without changing the column position.
|
||||
// If the active position is at the bottom margin, a scroll up is performed."
|
||||
|
||||
|
@ -612,7 +602,6 @@ func (buffer *Buffer) Index() {
|
|||
}
|
||||
|
||||
func (buffer *Buffer) ReverseIndex() {
|
||||
|
||||
defer buffer.emitDisplayChange()
|
||||
|
||||
if uint(buffer.terminalState.cursorY) == buffer.terminalState.topMargin {
|
||||
|
@ -699,7 +688,6 @@ func (buffer *Buffer) inDoWrap() bool {
|
|||
}
|
||||
|
||||
func (buffer *Buffer) Backspace() {
|
||||
|
||||
if buffer.terminalState.cursorX == 0 {
|
||||
line := buffer.getCurrentLine()
|
||||
if line.wrapped {
|
||||
|
@ -716,7 +704,6 @@ func (buffer *Buffer) Backspace() {
|
|||
}
|
||||
|
||||
func (buffer *Buffer) CarriageReturn() {
|
||||
|
||||
for {
|
||||
line := buffer.getCurrentLine()
|
||||
if line == nil {
|
||||
|
@ -746,7 +733,6 @@ func (buffer *Buffer) NewLine() {
|
|||
}
|
||||
|
||||
func (buffer *Buffer) NewLineEx(forceCursorToMargin bool) {
|
||||
|
||||
if buffer.terminalState.IsNewLineMode() || forceCursorToMargin {
|
||||
buffer.terminalState.cursorX = 0
|
||||
}
|
||||
|
@ -766,7 +752,6 @@ func (buffer *Buffer) IsNewLineMode() bool {
|
|||
}
|
||||
|
||||
func (buffer *Buffer) MovePosition(x int16, y int16) {
|
||||
|
||||
var toX uint16
|
||||
var toY uint16
|
||||
|
||||
|
@ -804,7 +789,7 @@ func (buffer *Buffer) SetPosition(col uint16, line uint16) {
|
|||
|
||||
if useCol >= buffer.ViewWidth() {
|
||||
useCol = buffer.ViewWidth() - 1
|
||||
//logrus.Errorf("Cannot set cursor position: column %d is outside of the current view width (%d columns)", col, buffer.ViewWidth())
|
||||
// logrus.Errorf("Cannot set cursor position: column %d is outside of the current view width (%d columns)", col, buffer.ViewWidth())
|
||||
}
|
||||
|
||||
buffer.terminalState.cursorX = useCol
|
||||
|
@ -839,7 +824,6 @@ func (buffer *Buffer) getCurrentLine() *Line {
|
|||
}
|
||||
|
||||
func (buffer *Buffer) getViewLine(index uint16) *Line {
|
||||
|
||||
if index >= buffer.ViewHeight() { // @todo is this okay?#
|
||||
return &buffer.lines[len(buffer.lines)-1]
|
||||
}
|
||||
|
@ -889,7 +873,6 @@ func (buffer *Buffer) EraseLineFromCursor() {
|
|||
for i := 0; i < max; i++ {
|
||||
line.Append(buffer.terminalState.DefaultCell(true))
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
func (buffer *Buffer) EraseDisplay() {
|
||||
|
@ -967,7 +950,6 @@ func (buffer *Buffer) EraseDisplayToCursor() {
|
|||
}
|
||||
|
||||
func (buffer *Buffer) ResizeView(width uint16, height uint16) {
|
||||
|
||||
defer buffer.emitDisplayChange()
|
||||
|
||||
if buffer.terminalState.viewHeight == 0 {
|
||||
|
@ -1020,7 +1002,7 @@ func (buffer *Buffer) ResizeView(width uint16, height uint16) {
|
|||
//line.Cleanse()
|
||||
for offset := 1; i+offset < len(buffer.lines); offset++ {
|
||||
nextLine := &buffer.lines[i+offset]
|
||||
//nextLine.Cleanse()
|
||||
// nextLine.Cleanse()
|
||||
if !nextLine.wrapped { // if the next line wasn't wrapped, we don't need to move characters back to this line
|
||||
break
|
||||
}
|
||||
|
|
|
@ -69,7 +69,6 @@ func TestBufferCreation(t *testing.T) {
|
|||
}
|
||||
|
||||
func TestBufferWriteIncrementsCursorCorrectly(t *testing.T) {
|
||||
|
||||
b := NewBuffer(NewTerminalState(5, 4, CellAttributes{}, 1000))
|
||||
|
||||
/*01234
|
||||
|
@ -113,7 +112,6 @@ func TestBufferWriteIncrementsCursorCorrectly(t *testing.T) {
|
|||
require.Equal(t, 2, len(lines))
|
||||
assert.Equal(t, "xxxxx", lines[0].String())
|
||||
assert.Equal(t, "xx", lines[1].String())
|
||||
|
||||
}
|
||||
|
||||
func TestWritingNewLineAsFirstRuneOnWrappedLine(t *testing.T) {
|
||||
|
@ -138,7 +136,6 @@ func TestWritingNewLineAsFirstRuneOnWrappedLine(t *testing.T) {
|
|||
require.Equal(t, 3, len(b.lines))
|
||||
assert.Equal(t, "abc", b.lines[0].String())
|
||||
assert.Equal(t, "def", b.lines[1].String())
|
||||
|
||||
}
|
||||
|
||||
func TestWritingNewLineAsSecondRuneOnWrappedLine(t *testing.T) {
|
||||
|
@ -170,7 +167,6 @@ func TestWritingNewLineAsSecondRuneOnWrappedLine(t *testing.T) {
|
|||
}
|
||||
|
||||
func TestSetPosition(t *testing.T) {
|
||||
|
||||
b := NewBuffer(NewTerminalState(120, 80, CellAttributes{}, 1000))
|
||||
assert.Equal(t, 0, int(b.CursorColumn()))
|
||||
assert.Equal(t, 0, int(b.CursorLine()))
|
||||
|
@ -183,7 +179,6 @@ func TestSetPosition(t *testing.T) {
|
|||
b.SetPosition(120, 90)
|
||||
assert.Equal(t, 119, int(b.CursorColumn()))
|
||||
assert.Equal(t, 79, int(b.CursorLine()))
|
||||
|
||||
}
|
||||
|
||||
func TestMovePosition(t *testing.T) {
|
||||
|
@ -208,7 +203,6 @@ func TestMovePosition(t *testing.T) {
|
|||
}
|
||||
|
||||
func TestVisibleLines(t *testing.T) {
|
||||
|
||||
b := NewBuffer(NewTerminalState(80, 10, CellAttributes{}, 1000))
|
||||
b.Write([]rune("hello 1")...)
|
||||
b.CarriageReturn()
|
||||
|
@ -255,7 +249,6 @@ func TestVisibleLines(t *testing.T) {
|
|||
require.Equal(t, 10, len(lines))
|
||||
assert.Equal(t, "hello 5", lines[0].String())
|
||||
assert.Equal(t, "hello 14", lines[9].String())
|
||||
|
||||
}
|
||||
|
||||
func TestClearWithoutFullView(t *testing.T) {
|
||||
|
@ -391,7 +384,6 @@ func TestGetCellWithBadCursor(t *testing.T) {
|
|||
b.Write([]rune("Hello\r\nthere\r\nsomething...")...)
|
||||
require.Nil(t, b.GetCell(8, 3))
|
||||
require.Nil(t, b.GetCell(90, 0))
|
||||
|
||||
}
|
||||
|
||||
func TestCursorAttr(t *testing.T) {
|
||||
|
@ -481,6 +473,7 @@ func TestEraseLineAfterCursor(t *testing.T) {
|
|||
assert.Equal(t, "hello, this is a test", b.lines[0].String())
|
||||
assert.Equal(t, "dele", b.lines[1].String())
|
||||
}
|
||||
|
||||
func TestEraseDisplay(t *testing.T) {
|
||||
b := NewBuffer(NewTerminalState(80, 5, CellAttributes{}, 1000))
|
||||
b.Write([]rune("hello")...)
|
||||
|
@ -497,6 +490,7 @@ func TestEraseDisplay(t *testing.T) {
|
|||
assert.Equal(t, "", line.String())
|
||||
}
|
||||
}
|
||||
|
||||
func TestEraseDisplayToCursor(t *testing.T) {
|
||||
b := NewBuffer(NewTerminalState(80, 5, CellAttributes{}, 1000))
|
||||
b.Write([]rune("hello")...)
|
||||
|
@ -512,7 +506,6 @@ func TestEraseDisplayToCursor(t *testing.T) {
|
|||
assert.Equal(t, "", lines[0].String())
|
||||
assert.Equal(t, "", lines[1].String())
|
||||
assert.Equal(t, "\x00\x00\x00\x00g", lines[2].String())
|
||||
|
||||
}
|
||||
|
||||
func TestEraseDisplayFromCursor(t *testing.T) {
|
||||
|
@ -531,6 +524,7 @@ func TestEraseDisplayFromCursor(t *testing.T) {
|
|||
assert.Equal(t, "asd", lines[1].String())
|
||||
assert.Equal(t, "", lines[2].String())
|
||||
}
|
||||
|
||||
func TestBackspace(t *testing.T) {
|
||||
b := NewBuffer(NewTerminalState(80, 5, CellAttributes{}, 1000))
|
||||
b.Write([]rune("hello")...)
|
||||
|
|
|
@ -26,9 +26,7 @@ func (cell *Cell) Image() *image.RGBA {
|
|||
}
|
||||
|
||||
func (cell *Cell) SetImage(img *image.RGBA) {
|
||||
|
||||
cell.image = img
|
||||
|
||||
}
|
||||
|
||||
func (cell *Cell) Attr() CellAttributes {
|
||||
|
|
|
@ -8,7 +8,6 @@ import (
|
|||
)
|
||||
|
||||
func (buffer *Buffer) GetHintAtPosition(col uint16, viewRow uint16) *hints.Hint {
|
||||
|
||||
row := buffer.convertViewLineToRawLine(viewRow) - uint64(buffer.terminalState.scrollLinesFromBottom)
|
||||
|
||||
cell := buffer.GetRawCell(col, row)
|
||||
|
@ -47,5 +46,4 @@ func (buffer *Buffer) GetHintAtPosition(col uint16, viewRow uint16) *hints.Hint
|
|||
line := buffer.lines[row]
|
||||
|
||||
return hints.Get(strings.Trim(candidate, " "), line.String(), sx, viewRow)
|
||||
|
||||
}
|
||||
|
|
|
@ -21,7 +21,7 @@ func (line *Line) Cells() []Cell {
|
|||
}
|
||||
|
||||
func (line *Line) ReverseVideo() {
|
||||
for i, _ := range line.cells {
|
||||
for i := range line.cells {
|
||||
line.cells[i].attr.ReverseVideo()
|
||||
}
|
||||
}
|
||||
|
|
|
@ -7,7 +7,6 @@ import (
|
|||
)
|
||||
|
||||
func TestLine(t *testing.T) {
|
||||
|
||||
line := newLine()
|
||||
line.cells = []Cell{
|
||||
{r: 'h'},
|
||||
|
@ -25,5 +24,4 @@ func TestLine(t *testing.T) {
|
|||
|
||||
line.setWrapped(false)
|
||||
assert.False(t, line.wrapped)
|
||||
|
||||
}
|
||||
|
|
|
@ -73,7 +73,6 @@ func getConfig() *config.Config {
|
|||
}
|
||||
|
||||
func loadConfigFile() *config.Config {
|
||||
|
||||
usr, err := user.Current()
|
||||
if err != nil {
|
||||
fmt.Printf("Failed to get current user information: %s\n", err)
|
||||
|
@ -108,11 +107,11 @@ func loadConfigFile() *config.Config {
|
|||
if b, err := config.DefaultConfig.Encode(); err != nil {
|
||||
fmt.Printf("Failed to encode config file: %s\n", err)
|
||||
} else {
|
||||
err = os.MkdirAll(filepath.Dir(places[0]), 0744)
|
||||
err = os.MkdirAll(filepath.Dir(places[0]), 0o744)
|
||||
if err != nil {
|
||||
fmt.Printf("Failed to create config file directory: %s\n", err)
|
||||
} else {
|
||||
if err = ioutil.WriteFile(places[0], b, 0644); err != nil {
|
||||
if err = ioutil.WriteFile(places[0], b, 0o644); err != nil {
|
||||
fmt.Printf("Failed to encode config file: %s\n", err)
|
||||
}
|
||||
}
|
||||
|
|
|
@ -15,7 +15,6 @@ func strToColourNoErr(hexStr string) Colour {
|
|||
}
|
||||
|
||||
func strToColour(hexStr string) (Colour, error) {
|
||||
|
||||
c := [3]float32{0, 0, 0}
|
||||
|
||||
if strings.HasPrefix(hexStr, "#") {
|
||||
|
|
|
@ -21,8 +21,8 @@ func TestColourTomlEncoding(t *testing.T) {
|
|||
require.Nil(t, err)
|
||||
assert.Equal(t, `colour = "#ff7f00"
|
||||
`, buf.String())
|
||||
|
||||
}
|
||||
|
||||
func TestColourTomlUnmarshalling(t *testing.T) {
|
||||
target := struct {
|
||||
Purple Colour `toml:"colour"`
|
||||
|
|
|
@ -4,7 +4,7 @@ import (
|
|||
"fmt"
|
||||
"strings"
|
||||
|
||||
"github.com/go-gl/glfw/v3.2/glfw"
|
||||
"github.com/go-gl/glfw/v3.3/glfw"
|
||||
)
|
||||
|
||||
type KeyCombination struct {
|
||||
|
@ -30,7 +30,6 @@ var modMap = map[KeyMod]glfw.ModifierKey{
|
|||
|
||||
// keyStr e.g. "ctrl + alt + a"
|
||||
func parseKeyCombination(keyStr string) (*KeyCombination, error) {
|
||||
|
||||
var mods glfw.ModifierKey
|
||||
var key rune
|
||||
|
||||
|
|
|
@ -3,13 +3,12 @@ package config
|
|||
import (
|
||||
"testing"
|
||||
|
||||
"github.com/go-gl/glfw/v3.2/glfw"
|
||||
"github.com/go-gl/glfw/v3.3/glfw"
|
||||
"github.com/stretchr/testify/assert"
|
||||
"github.com/stretchr/testify/require"
|
||||
)
|
||||
|
||||
func TestKeyCombinations(t *testing.T) {
|
||||
|
||||
combi, err := parseKeyCombination("ctrl + alt + a")
|
||||
require.Nil(t, err)
|
||||
require.NotNil(t, combi)
|
||||
|
@ -23,5 +22,4 @@ func TestKeyCombinations(t *testing.T) {
|
|||
assert.False(t, combi.Match(glfw.ModAlt, 'd'))
|
||||
assert.False(t, combi.Match(0, 'e'))
|
||||
assert.False(t, combi.Match(glfw.ModControl^glfw.ModAlt^glfw.ModShift, 'f'))
|
||||
|
||||
}
|
||||
|
|
|
@ -37,9 +37,8 @@ type color struct {
|
|||
a float32
|
||||
}
|
||||
|
||||
//LoadFont loads the specified font at the given scale.
|
||||
// LoadFont loads the specified font at the given scale.
|
||||
func LoadFont(reader io.Reader, scale float32, windowWidth int, windowHeight int) (*Font, error) {
|
||||
|
||||
// Configure the default font vertex and fragment shaders
|
||||
program, err := newProgram(vertexFontShader, fragmentFontShader)
|
||||
if err != nil {
|
||||
|
@ -49,7 +48,7 @@ func LoadFont(reader io.Reader, scale float32, windowWidth int, windowHeight int
|
|||
// Activate corresponding render state
|
||||
gl.UseProgram(program)
|
||||
|
||||
//set screen resolution
|
||||
// set screen resolution
|
||||
resUniform := gl.GetUniformLocation(program, gl.Str("resolution\x00"))
|
||||
gl.Uniform2f(resUniform, float32(windowWidth), float32(windowHeight))
|
||||
gl.UseProgram(0)
|
||||
|
@ -72,7 +71,7 @@ func (f *Font) Free() {
|
|||
f.program = 0
|
||||
}
|
||||
|
||||
//SetColor allows you to set the text color to be used when you draw the text
|
||||
// SetColor allows you to set the text color to be used when you draw the text
|
||||
func (f *Font) SetColor(red float32, green float32, blue float32, alpha float32) {
|
||||
f.color.r = red
|
||||
f.color.g = green
|
||||
|
@ -85,7 +84,7 @@ func (f *Font) UpdateResolution(windowWidth int, windowHeight int) {
|
|||
resUniform := gl.GetUniformLocation(f.program, gl.Str("resolution\x00"))
|
||||
gl.Uniform2f(resUniform, float32(windowWidth), float32(windowHeight))
|
||||
gl.UseProgram(0)
|
||||
//f.characters = map[rune]*character{}
|
||||
// f.characters = map[rune]*character{}
|
||||
}
|
||||
|
||||
func (f *Font) LineHeight() float32 {
|
||||
|
@ -96,26 +95,25 @@ func (f *Font) LinePadding() float32 {
|
|||
return f.linePadding
|
||||
}
|
||||
|
||||
//Printf draws a string to the screen, takes a list of arguments like printf
|
||||
// Printf draws a string to the screen, takes a list of arguments like printf
|
||||
func (f *Font) Print(x, y float32, text string) error {
|
||||
|
||||
indices := []rune(text)
|
||||
|
||||
if len(indices) == 0 {
|
||||
return nil
|
||||
}
|
||||
|
||||
//setup blending mode
|
||||
// setup blending mode
|
||||
gl.Enable(gl.BLEND)
|
||||
gl.BlendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA)
|
||||
|
||||
// Activate corresponding render state
|
||||
gl.UseProgram(f.program)
|
||||
//set text color
|
||||
// set text color
|
||||
gl.Uniform4f(gl.GetUniformLocation(f.program, gl.Str("textColor\x00")), f.color.r, f.color.g, f.color.b, f.color.a)
|
||||
//set screen resolution
|
||||
//resUniform := gl.GetUniformLocation(f.program, gl.Str("resolution\x00"))
|
||||
//gl.Uniform2f(resUniform, float32(2560), float32(1440))
|
||||
// set screen resolution
|
||||
// resUniform := gl.GetUniformLocation(f.program, gl.Str("resolution\x00"))
|
||||
// gl.Uniform2f(resUniform, float32(2560), float32(1440))
|
||||
|
||||
gl.ActiveTexture(gl.TEXTURE0)
|
||||
gl.BindVertexArray(f.vao)
|
||||
|
@ -123,29 +121,29 @@ func (f *Font) Print(x, y float32, text string) error {
|
|||
// Iterate through all characters in string
|
||||
for i := range indices {
|
||||
|
||||
//get rune
|
||||
// get rune
|
||||
runeIndex := indices[i]
|
||||
|
||||
//find rune in fontChar list
|
||||
// find rune in fontChar list
|
||||
ch, err := f.GetRune(runeIndex)
|
||||
if err != nil {
|
||||
return err // @todo ignore errors?
|
||||
}
|
||||
|
||||
//calculate position and size for current rune
|
||||
// calculate position and size for current rune
|
||||
xpos := x + float32(ch.bearingH)
|
||||
ypos := y - float32(+ch.height-ch.bearingV)
|
||||
w := float32(ch.width)
|
||||
h := float32(ch.height)
|
||||
|
||||
//set quad positions
|
||||
var x1 = xpos
|
||||
var x2 = xpos + w
|
||||
var y1 = ypos
|
||||
var y2 = ypos + h
|
||||
// set quad positions
|
||||
x1 := xpos
|
||||
x2 := xpos + w
|
||||
y1 := ypos
|
||||
y2 := ypos + h
|
||||
|
||||
//setup quad array
|
||||
var vertices = []float32{
|
||||
// setup quad array
|
||||
vertices := []float32{
|
||||
// X, Y, Z, U, V
|
||||
// Front
|
||||
x1, y1, 0.0, 0.0,
|
||||
|
@ -153,14 +151,15 @@ func (f *Font) Print(x, y float32, text string) error {
|
|||
x1, y2, 0.0, 1.0,
|
||||
x1, y2, 0.0, 1.0,
|
||||
x2, y1, 1.0, 0.0,
|
||||
x2, y2, 1.0, 1.0}
|
||||
x2, y2, 1.0, 1.0,
|
||||
}
|
||||
|
||||
// Render glyph texture over quad
|
||||
gl.BindTexture(gl.TEXTURE_2D, ch.textureID)
|
||||
// Update content of VBO memory
|
||||
gl.BindBuffer(gl.ARRAY_BUFFER, f.vbo)
|
||||
|
||||
//BufferSubData(target Enum, offset int, data []byte)
|
||||
// BufferSubData(target Enum, offset int, data []byte)
|
||||
gl.BufferSubData(gl.ARRAY_BUFFER, 0, len(vertices)*4, gl.Ptr(vertices)) // Be sure to use glBufferSubData and not glBufferData
|
||||
// Render quad
|
||||
gl.DrawArrays(gl.TRIANGLES, 0, 24)
|
||||
|
@ -171,7 +170,7 @@ func (f *Font) Print(x, y float32, text string) error {
|
|||
|
||||
}
|
||||
|
||||
//clear opengl textures and programs
|
||||
// clear opengl textures and programs
|
||||
gl.BindVertexArray(0)
|
||||
gl.BindTexture(gl.TEXTURE_2D, 0)
|
||||
gl.UseProgram(0)
|
||||
|
@ -180,9 +179,8 @@ func (f *Font) Print(x, y float32, text string) error {
|
|||
return nil
|
||||
}
|
||||
|
||||
//Width returns the width of a piece of text in pixels
|
||||
// Width returns the width of a piece of text in pixels
|
||||
func (f *Font) Size(text string) (float32, float32) {
|
||||
|
||||
var width float32
|
||||
var height float32
|
||||
|
||||
|
@ -195,10 +193,10 @@ func (f *Font) Size(text string) (float32, float32) {
|
|||
// Iterate through all characters in string
|
||||
for i := range indices {
|
||||
|
||||
//get rune
|
||||
// get rune
|
||||
runeIndex := indices[i]
|
||||
|
||||
//find rune in fontChar list
|
||||
// find rune in fontChar list
|
||||
ch, err := f.GetRune(runeIndex)
|
||||
if err != nil {
|
||||
continue
|
||||
|
@ -232,7 +230,6 @@ func (f *Font) MaxY() float32 {
|
|||
}
|
||||
|
||||
func (f *Font) GetRune(r rune) (*character, error) {
|
||||
|
||||
cc, ok := f.characters[r]
|
||||
if ok {
|
||||
return cc, nil
|
||||
|
@ -248,37 +245,37 @@ func (f *Font) GetRune(r rune) (*character, error) {
|
|||
gh := int32((gBnd.Max.Y - gBnd.Min.Y) >> 6)
|
||||
gw := int32((gBnd.Max.X - gBnd.Min.X) >> 6)
|
||||
|
||||
//if gylph has no diamensions set to a max value
|
||||
// if gylph has no diamensions set to a max value
|
||||
if gw == 0 || gh == 0 {
|
||||
gBnd = f.ttf.Bounds(fixed.Int26_6(f.scale))
|
||||
gw = int32((gBnd.Max.X - gBnd.Min.X) >> 6)
|
||||
gh = int32((gBnd.Max.Y - gBnd.Min.Y) >> 6)
|
||||
|
||||
//above can sometimes yield 0 for font smaller than 48pt, 1 is minimum
|
||||
// above can sometimes yield 0 for font smaller than 48pt, 1 is minimum
|
||||
if gw == 0 || gh == 0 {
|
||||
gw = 1
|
||||
gh = 1
|
||||
}
|
||||
}
|
||||
|
||||
//The glyph's ascent and descent equal -bounds.Min.Y and +bounds.Max.Y.
|
||||
// The glyph's ascent and descent equal -bounds.Min.Y and +bounds.Max.Y.
|
||||
gAscent := int(-gBnd.Min.Y) >> 6
|
||||
gdescent := int(gBnd.Max.Y) >> 6
|
||||
|
||||
//set w,h and adv, bearing V and bearing H in char
|
||||
// set w,h and adv, bearing V and bearing H in char
|
||||
char.width = int(gw)
|
||||
char.height = int(gh)
|
||||
char.advance = int(gAdv)
|
||||
char.bearingV = gdescent
|
||||
char.bearingH = (int(gBnd.Min.X) >> 6)
|
||||
|
||||
//create image to draw glyph
|
||||
// create image to draw glyph
|
||||
fg, bg := image.White, image.Black
|
||||
rect := image.Rect(0, 0, int(gw), int(gh))
|
||||
rgba := image.NewRGBA(rect)
|
||||
draw.Draw(rgba, rgba.Bounds(), bg, image.ZP, draw.Src)
|
||||
|
||||
//create a freetype context for drawing
|
||||
// create a freetype context for drawing
|
||||
c := freetype.NewContext()
|
||||
c.SetDPI(DPI)
|
||||
c.SetFont(f.ttf)
|
||||
|
@ -288,7 +285,7 @@ func (f *Font) GetRune(r rune) (*character, error) {
|
|||
c.SetSrc(fg)
|
||||
c.SetHinting(font.HintingFull)
|
||||
|
||||
//set the glyph dot
|
||||
// set the glyph dot
|
||||
px := 0 - (int(gBnd.Min.X) >> 6)
|
||||
py := (gAscent)
|
||||
pt := freetype.Pt(px, py)
|
||||
|
|
|
@ -1,13 +1,13 @@
|
|||
package glfont
|
||||
|
||||
import (
|
||||
"github.com/go-gl/gl/all-core/gl"
|
||||
|
||||
"fmt"
|
||||
"strings"
|
||||
|
||||
"github.com/go-gl/gl/all-core/gl"
|
||||
)
|
||||
|
||||
//newProgram links the frag and vertex shader programs
|
||||
// newProgram links the frag and vertex shader programs
|
||||
func newProgram(vertexShaderSource, fragmentShaderSource string) (uint32, error) {
|
||||
vertexShader, err := compileShader(vertexShaderSource, gl.VERTEX_SHADER)
|
||||
if err != nil {
|
||||
|
@ -43,7 +43,7 @@ func newProgram(vertexShaderSource, fragmentShaderSource string) (uint32, error)
|
|||
return program, nil
|
||||
}
|
||||
|
||||
//compileShader compiles the shader program
|
||||
// compileShader compiles the shader program
|
||||
func compileShader(source string, shaderType uint32) (uint32, error) {
|
||||
shader := gl.CreateShader(shaderType)
|
||||
|
||||
|
|
|
@ -11,31 +11,31 @@ import (
|
|||
|
||||
type character struct {
|
||||
textureID uint32 // ID handle of the glyph texture
|
||||
width int //glyph width
|
||||
height int //glyph height
|
||||
advance int //glyph advance
|
||||
bearingH int //glyph bearing horizontal
|
||||
bearingV int //glyph bearing vertical
|
||||
width int // glyph width
|
||||
height int // glyph height
|
||||
advance int // glyph advance
|
||||
bearingH int // glyph bearing horizontal
|
||||
bearingV int // glyph bearing vertical
|
||||
}
|
||||
|
||||
//LoadTrueTypeFont builds a set of textures based on a ttf files glyphs
|
||||
// LoadTrueTypeFont builds a set of textures based on a ttf files glyphs
|
||||
func LoadTrueTypeFont(program uint32, r io.Reader, scale float32) (*Font, error) {
|
||||
data, err := ioutil.ReadAll(r)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
//make Font struct type
|
||||
// make Font struct type
|
||||
f := new(Font)
|
||||
f.scale = scale
|
||||
f.characters = map[rune]*character{}
|
||||
f.program = program //set shader program
|
||||
f.program = program // set shader program
|
||||
// Read the truetype font.
|
||||
f.ttf, err = truetype.Parse(data)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
f.SetColor(1.0, 1.0, 1.0, 1.0) //set default white
|
||||
f.SetColor(1.0, 1.0, 1.0, 1.0) // set default white
|
||||
|
||||
_, h := f.MaxSize()
|
||||
f.lineHeight = h
|
||||
|
@ -63,7 +63,7 @@ func LoadTrueTypeFont(program uint32, r io.Reader, scale float32) (*Font, error)
|
|||
gl.BindBuffer(gl.ARRAY_BUFFER, 0)
|
||||
gl.BindVertexArray(0)
|
||||
|
||||
//create new face to measure glyph dimensions
|
||||
// create new face to measure glyph dimensions
|
||||
f.ttfFace = truetype.NewFace(f.ttf, &truetype.Options{
|
||||
Size: float64(f.scale),
|
||||
DPI: DPI,
|
||||
|
|
|
@ -0,0 +1,28 @@
|
|||
module github.com/liamg/aminal
|
||||
|
||||
go 1.16
|
||||
|
||||
require (
|
||||
github.com/BurntSushi/toml v0.3.1
|
||||
github.com/MaxRis/w32 v0.0.0-20180517000239-4f5cfb03fabf
|
||||
github.com/carlogit/phash v0.0.0-20150602001824-c146ed9f2a27
|
||||
github.com/creack/pty v1.1.11 // indirect
|
||||
github.com/disintegration/imaging v1.5.0 // indirect
|
||||
github.com/go-gl/gl v0.0.0-20210501111010-69f74958bac0
|
||||
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20210410170116-ea3d685f79fb
|
||||
github.com/gobuffalo/envy v1.9.0 // indirect
|
||||
github.com/gobuffalo/packd v1.0.0 // indirect
|
||||
github.com/gobuffalo/packr v1.30.1
|
||||
github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0
|
||||
github.com/kbinani/screenshot v0.0.0-20210326165202-b96eb3309bb0
|
||||
github.com/kr/pty v1.1.8
|
||||
github.com/mcuadros/go-version v0.0.0-20190830083331-035f6764e8d2
|
||||
github.com/pkg/errors v0.9.1 // indirect
|
||||
github.com/riywo/loginshell v0.0.0-20200815045211-7d26008be1ab
|
||||
github.com/rogpeppe/go-internal v1.8.0 // indirect
|
||||
github.com/stretchr/testify v1.7.0
|
||||
go.uber.org/multierr v1.7.0 // indirect
|
||||
go.uber.org/zap v1.16.0
|
||||
golang.org/x/image v0.0.0-20210504121937-7319ad40d33e
|
||||
golang.org/x/sys v0.0.0-20210507161434-a76c4d0a0096 // indirect
|
||||
)
|
|
@ -0,0 +1,145 @@
|
|||
github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ=
|
||||
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
|
||||
github.com/BurntSushi/xgb v0.0.0-20210121224620-deaf085860bc h1:7D+Bh06CRPCJO3gr2F7h1sriovOZ8BMhca2Rg85c2nk=
|
||||
github.com/BurntSushi/xgb v0.0.0-20210121224620-deaf085860bc/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo=
|
||||
github.com/MaxRis/w32 v0.0.0-20180517000239-4f5cfb03fabf h1:5GK1kUZ3zfsAKqry3g+4mLoSjdDRLBeZ/93sjJKK8kA=
|
||||
github.com/MaxRis/w32 v0.0.0-20180517000239-4f5cfb03fabf/go.mod h1:x98UOhbCFpRd9Te4gC5ZALNfXcG8F5ra+A7E/UDWSG8=
|
||||
github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8=
|
||||
github.com/carlogit/phash v0.0.0-20150602001824-c146ed9f2a27 h1:RPG5nj+GqMUgPM4K9J2zQAG9VT+oKzPwwKh2h2DEnks=
|
||||
github.com/carlogit/phash v0.0.0-20150602001824-c146ed9f2a27/go.mod h1:xCFI2ljT+6HBbz0SUGapJTvkfWsyYBth61TYSjBIEjU=
|
||||
github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE=
|
||||
github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk=
|
||||
github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
|
||||
github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE=
|
||||
github.com/creack/pty v1.1.7/go.mod h1:lj5s0c3V2DBrqTV7llrYr5NG6My20zk30Fl46Y7DoTY=
|
||||
github.com/creack/pty v1.1.11 h1:07n33Z8lZxZ2qwegKbObQohDhXDQxiMMz1NOUGYlesw=
|
||||
github.com/creack/pty v1.1.11/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E=
|
||||
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
||||
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||
github.com/disintegration/imaging v1.5.0 h1:uYqUhwNmLU4K1FN44vhqS4TZJRAA4RhBINgbQlKyGi0=
|
||||
github.com/disintegration/imaging v1.5.0/go.mod h1:9B/deIUIrliYkyMTuXJd6OUFLcrZ2tf+3Qlwnaf/CjU=
|
||||
github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
|
||||
github.com/gen2brain/shm v0.0.0-20200228170931-49f9650110c5 h1:Y5Q2mEwfzjMt5+3u70Gtw93ZOu2UuPeeeTBDntF7FoY=
|
||||
github.com/gen2brain/shm v0.0.0-20200228170931-49f9650110c5/go.mod h1:uF6rMu/1nvu+5DpiRLwusA6xB8zlkNoGzKn8lmYONUo=
|
||||
github.com/go-gl/gl v0.0.0-20210501111010-69f74958bac0 h1:7xNa69TzlTrKtlBtE4yyNRFP9oqAneXAs9oKJkVOECs=
|
||||
github.com/go-gl/gl v0.0.0-20210501111010-69f74958bac0/go.mod h1:wjpnOv6ONl2SuJSxqCPVaPZibGFdSci9HFocT9qtVYM=
|
||||
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20210410170116-ea3d685f79fb h1:T6gaWBvRzJjuOrdCtg8fXXjKai2xSDqWTcKFUPuw8Tw=
|
||||
github.com/go-gl/glfw/v3.3/glfw v0.0.0-20210410170116-ea3d685f79fb/go.mod h1:tQ2UAYgL5IevRw8kRxooKSPJfGvJ9fJQFa0TUsXzTg8=
|
||||
github.com/gobuffalo/envy v1.7.0/go.mod h1:n7DRkBerg/aorDM8kbduw5dN3oXGswK5liaSCx4T5NI=
|
||||
github.com/gobuffalo/envy v1.9.0 h1:eZR0DuEgVLfeIb1zIKt3bT4YovIMf9O9LXQeCZLXpqE=
|
||||
github.com/gobuffalo/envy v1.9.0/go.mod h1:FurDp9+EDPE4aIUS3ZLyD+7/9fpx7YRt/ukY6jIHf0w=
|
||||
github.com/gobuffalo/logger v1.0.0/go.mod h1:2zbswyIUa45I+c+FLXuWl9zSWEiVuthsk8ze5s8JvPs=
|
||||
github.com/gobuffalo/packd v0.3.0/go.mod h1:zC7QkmNkYVGKPw4tHpBQ+ml7W/3tIebgeo1b36chA3Q=
|
||||
github.com/gobuffalo/packd v1.0.0 h1:6ERZvJHfe24rfFmA9OaoKBdC7+c9sydrytMg8SdFGBM=
|
||||
github.com/gobuffalo/packd v1.0.0/go.mod h1:6VTc4htmJRFB7u1m/4LeMTWjFoYrUiBkU9Fdec9hrhI=
|
||||
github.com/gobuffalo/packr v1.30.1 h1:hu1fuVR3fXEZR7rXNW3h8rqSML8EVAf6KNm0NKO/wKg=
|
||||
github.com/gobuffalo/packr v1.30.1/go.mod h1:ljMyFO2EcrnzsHsN99cvbq055Y9OhRrIaviy289eRuk=
|
||||
github.com/gobuffalo/packr/v2 v2.5.1/go.mod h1:8f9c96ITobJlPzI44jj+4tHnEKNt0xXWSVlXRN9X1Iw=
|
||||
github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 h1:DACJavvAHhabrF08vX0COfcOBJRhZ8lUbR+ZWIs0Y5g=
|
||||
github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k=
|
||||
github.com/google/renameio v0.1.0/go.mod h1:KWCgfxg9yswjAJkECMjeO8J8rahYeXnNhOm40UhjYkI=
|
||||
github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ=
|
||||
github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8=
|
||||
github.com/joho/godotenv v1.3.0 h1:Zjp+RcGpHhGlrMbJzXTrZZPrWj+1vfm90La1wgB6Bhc=
|
||||
github.com/joho/godotenv v1.3.0/go.mod h1:7hK45KPybAkOC6peb+G5yklZfMxEjkZhHbwpqxOKXbg=
|
||||
github.com/karrick/godirwalk v1.10.12/go.mod h1:RoGL9dQei4vP9ilrpETWE8CLOZ1kiN0LhBygSwrAsHA=
|
||||
github.com/kbinani/screenshot v0.0.0-20210326165202-b96eb3309bb0 h1:lICR2wyk9J6T709NawrhNTDi9DjMIbQqdlPT/EE0xBI=
|
||||
github.com/kbinani/screenshot v0.0.0-20210326165202-b96eb3309bb0/go.mod h1:ZceVWGtzUZmxyN+/1I+oG31oOm1dOA2QUNbua9TLVdE=
|
||||
github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck=
|
||||
github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
|
||||
github.com/konsorten/go-windows-terminal-sequences v1.0.2/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
|
||||
github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI=
|
||||
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
|
||||
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
|
||||
github.com/kr/pty v1.1.8 h1:AkaSdXYQOWeaO3neb8EM634ahkXXe3jYbVh/F9lq+GI=
|
||||
github.com/kr/pty v1.1.8/go.mod h1:O1sed60cT9XZ5uDucP5qwvh+TE3NnUj51EiZO/lmSfw=
|
||||
github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE=
|
||||
github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI=
|
||||
github.com/lxn/win v0.0.0-20210218163916-a377121e959e h1:H+t6A/QJMbhCSEH5rAuRxh+CtW96g0Or0Fxa9IKr4uc=
|
||||
github.com/lxn/win v0.0.0-20210218163916-a377121e959e/go.mod h1:KxxjdtRkfNoYDCUP5ryK7XJJNTnpC8atvtmTheChOtk=
|
||||
github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ=
|
||||
github.com/mcuadros/go-version v0.0.0-20190830083331-035f6764e8d2 h1:YocNLcTBdEdvY3iDK6jfWXvEaM5OCKkjxPKoJRdB3Gg=
|
||||
github.com/mcuadros/go-version v0.0.0-20190830083331-035f6764e8d2/go.mod h1:76rfSfYPWj01Z85hUf/ituArm797mNKcvINh1OlsZKo=
|
||||
github.com/mitchellh/go-homedir v1.1.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0=
|
||||
github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y=
|
||||
github.com/pelletier/go-toml v1.2.0/go.mod h1:5z9KED0ma1S8pY6P1sdut58dfprrGBbd/94hg7ilaic=
|
||||
github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA=
|
||||
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
|
||||
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
|
||||
github.com/pkg/errors v0.9.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/riywo/loginshell v0.0.0-20200815045211-7d26008be1ab h1:ZjX6I48eZSFetPb41dHudEyVr5v953N15TsNZXlkcWY=
|
||||
github.com/riywo/loginshell v0.0.0-20200815045211-7d26008be1ab/go.mod h1:/PfPXh0EntGc3QAAyUaviy4S9tzy4Zp0e2ilq4voC6E=
|
||||
github.com/rogpeppe/go-internal v1.1.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
|
||||
github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4=
|
||||
github.com/rogpeppe/go-internal v1.3.2/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc=
|
||||
github.com/rogpeppe/go-internal v1.8.0 h1:FCbCCtXNOY3UtUuHUYaghJg4y7Fd14rXifAYUAtL9R8=
|
||||
github.com/rogpeppe/go-internal v1.8.0/go.mod h1:WmiCO8CzOY8rg0OYDC4/i/2WRWAB6poM+XZ2dLUbcbE=
|
||||
github.com/russross/blackfriday v1.5.2/go.mod h1:JO/DiYxRf+HjHt06OyowR9PTA263kcR/rfWxYHBV53g=
|
||||
github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
|
||||
github.com/spf13/afero v1.1.2/go.mod h1:j4pytiNVoe2o6bmDsKpLACNPDBIoEAkihy7loJ1B0CQ=
|
||||
github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE=
|
||||
github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU=
|
||||
github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo=
|
||||
github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4=
|
||||
github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s=
|
||||
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||
github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
|
||||
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
|
||||
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
|
||||
github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY=
|
||||
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
||||
github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0=
|
||||
github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q=
|
||||
go.uber.org/atomic v1.6.0/go.mod h1:sABNBOSYdrvTF6hTgEIbc7YasKWGhgEQZyfxyTvoXHQ=
|
||||
go.uber.org/atomic v1.7.0 h1:ADUqmZGgLDDfbSL9ZmPxKTybcoEYHgpYfELNoN+7hsw=
|
||||
go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
|
||||
go.uber.org/multierr v1.5.0/go.mod h1:FeouvMocqHpRaaGuG9EjoKcStLC43Zu/fmqdUMPcKYU=
|
||||
go.uber.org/multierr v1.7.0 h1:zaiO/rmgFjbmCXdSYJWQcdvOCsthmdaHfr3Gm2Kx4Ec=
|
||||
go.uber.org/multierr v1.7.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak=
|
||||
go.uber.org/tools v0.0.0-20190618225709-2cfd321de3ee/go.mod h1:vJERXedbb3MVM5f9Ejo0C68/HhF8uaILCdgjnY+goOA=
|
||||
go.uber.org/zap v1.16.0 h1:uFRZXykJGK9lLY4HtgSw44DnIcAM+kRBP7x5m+NpAOM=
|
||||
go.uber.org/zap v1.16.0/go.mod h1:MA8QOfq0BHJwdXa996Y4dYkAqRKB8/1K1QMMZVaNZjQ=
|
||||
golang.org/x/crypto v0.0.0-20181203042331-505ab145d0a9/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
|
||||
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
||||
golang.org/x/crypto v0.0.0-20190510104115-cbcb75029529/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||
golang.org/x/crypto v0.0.0-20190621222207-cc06ce4a13d4/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||
golang.org/x/image v0.0.0-20210504121937-7319ad40d33e h1:PzJMNfFQx+QO9hrC1GwZ4BoPGeNGhfeQEgcQFArEjPk=
|
||||
golang.org/x/image v0.0.0-20210504121937-7319ad40d33e/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0=
|
||||
golang.org/x/lint v0.0.0-20190930215403-16217165b5de h1:5hukYrvBGR8/eNkX5mdUezrA6JiaEZDtJb9Ei+1LlBs=
|
||||
golang.org/x/lint v0.0.0-20190930215403-16217165b5de/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc=
|
||||
golang.org/x/mod v0.0.0-20190513183733-4bf6d317e70e/go.mod h1:mXi4GBBbnImb6dmsKGUJ2LatrhH/nqhxcFungHvyanc=
|
||||
golang.org/x/net v0.0.0-20190311183353-d8887717615a/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sys v0.0.0-20181205085412-a5c9d58dba9a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20190515120540-06a5c4944438/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20201018230417-eeed37f84f13/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20210507161434-a76c4d0a0096 h1:5PbJGn5Sp3GEUjJ61aYbUP6RIo3Z3r2E4Tv9y2z8UHo=
|
||||
golang.org/x/sys v0.0.0-20210507161434-a76c4d0a0096/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||
golang.org/x/tools v0.0.0-20190311212946-11955173bddd/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs=
|
||||
golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
|
||||
golang.org/x/tools v0.0.0-20190624180213-70d37148ca0c/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc=
|
||||
golang.org/x/tools v0.0.0-20191029041327-9cc4af7d6b2c/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
||||
golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5 h1:hKsoRgsbwY1NafxrwTs+k64bikrLBkAgPir1TNCj3Zs=
|
||||
golang.org/x/tools v0.0.0-20191029190741-b9c20aec41a5/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
|
||||
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127 h1:qIbj1fsPNlZgppZ+VLlY7N33q108Sa+fhmuc+sWQYwY=
|
||||
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||
gopkg.in/errgo.v2 v2.1.0/go.mod h1:hNsd1EY+bozCKY1Ytp96fpM3vjJbqLJn88ws8XvfDNI=
|
||||
gopkg.in/yaml.v2 v2.2.2 h1:ZCJp+EgiOT7lHqUV2J862kp8Qj64Jo6az82+3Td9dZw=
|
||||
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
|
||||
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||
gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b h1:h8qDotaEPuJATrMmW04NCwg7v22aHH28wwpauUhK9Oo=
|
||||
gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||
honnef.co/go/tools v0.0.1-2019.2.3 h1:3JgtbtFHMiCmsznwGVTUWbgGov+pVqnlf1dEJTNAXeM=
|
||||
honnef.co/go/tools v0.0.1-2019.2.3/go.mod h1:a3bituU0lyd329TUQxRnasdCoJDkEUEAqEt0JzvZhAg=
|
|
@ -26,7 +26,7 @@ func actionCopy(gui *GUI) {
|
|||
}
|
||||
|
||||
func actionPaste(gui *GUI) {
|
||||
if s, err := gui.window.GetClipboardString(); err == nil {
|
||||
if s := gui.window.GetClipboardString(); s != "" {
|
||||
_ = gui.terminal.Paste([]byte(s))
|
||||
}
|
||||
}
|
||||
|
|
|
@ -12,9 +12,11 @@ void cocoa_update_nsgl_context(void* id) {
|
|||
}
|
||||
*/
|
||||
import "C"
|
||||
|
||||
import (
|
||||
"github.com/go-gl/glfw/v3.2/glfw"
|
||||
"unsafe"
|
||||
|
||||
"github.com/go-gl/glfw/v3.3/glfw"
|
||||
)
|
||||
|
||||
var nsglContextUpdateCounter int
|
||||
|
|
|
@ -16,7 +16,6 @@ func newAnnotation(it *hints.Hint) *annotation {
|
|||
}
|
||||
|
||||
func (a *annotation) render(gui *GUI) {
|
||||
|
||||
gl.Clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT | gl.STENCIL_BUFFER_BIT)
|
||||
|
||||
lines := gui.terminal.GetVisibleLines()
|
||||
|
@ -42,5 +41,4 @@ func (a *annotation) render(gui *GUI) {
|
|||
}
|
||||
|
||||
gui.textbox(a.hint.StartX+1, a.hint.StartY+3, a.hint.Description, a.hint.ForegroundColour, a.hint.BackgroundColour)
|
||||
|
||||
}
|
||||
|
|
|
@ -40,7 +40,6 @@ func (fm *FontMap) UpdateResolution(w int, h int) {
|
|||
}
|
||||
|
||||
func (fm *FontMap) DefaultFont() *glfont.Font {
|
||||
|
||||
return fm.defaultFont
|
||||
}
|
||||
|
||||
|
|
|
@ -24,7 +24,6 @@ func (gui *GUI) getPackedFont(name string) (*glfont.Font, error) {
|
|||
}
|
||||
|
||||
func (gui *GUI) loadFonts() error {
|
||||
|
||||
// from https://github.com/ryanoasis/nerd-fonts/tree/master/patched-fonts/Hack
|
||||
|
||||
defaultFont, err := gui.getPackedFont("Hack Regular Nerd Font Complete.ttf")
|
||||
|
|
25
gui/gui.go
25
gui/gui.go
|
@ -10,11 +10,10 @@ import (
|
|||
"strings"
|
||||
"sync"
|
||||
"time"
|
||||
|
||||
"unsafe"
|
||||
|
||||
"github.com/go-gl/gl/all-core/gl"
|
||||
"github.com/go-gl/glfw/v3.2/glfw"
|
||||
"github.com/go-gl/glfw/v3.3/glfw"
|
||||
"github.com/kbinani/screenshot"
|
||||
"github.com/liamg/aminal/buffer"
|
||||
"github.com/liamg/aminal/config"
|
||||
|
@ -29,8 +28,8 @@ type GUI struct {
|
|||
logger *zap.SugaredLogger
|
||||
config *config.Config
|
||||
terminal *terminal.Terminal
|
||||
width int //window width in pixels
|
||||
height int //window height in pixels
|
||||
width int // window width in pixels
|
||||
height int // window height in pixels
|
||||
appliedWidth int
|
||||
appliedHeight int
|
||||
resizeCache *ResizeCache // resize cache formed by resizeToTerminal()
|
||||
|
@ -173,7 +172,6 @@ func (gui *GUI) scale() float32 {
|
|||
|
||||
// can only be called on OS thread
|
||||
func (gui *GUI) resizeToTerminal(newCols uint, newRows uint) {
|
||||
|
||||
if gui.window.GetAttrib(glfw.Iconified) != 0 {
|
||||
return
|
||||
}
|
||||
|
@ -234,7 +232,6 @@ func (gui *GUI) getCursorFg(cell *buffer.Cell) (fg [3]float32) {
|
|||
|
||||
// can only be called on OS thread
|
||||
func (gui *GUI) resize(w *glfw.Window, width int, height int) {
|
||||
|
||||
if gui.window.GetAttrib(glfw.Iconified) != 0 {
|
||||
return
|
||||
}
|
||||
|
@ -297,7 +294,6 @@ func (gui *GUI) Close() {
|
|||
}
|
||||
|
||||
func (gui *GUI) Render() error {
|
||||
|
||||
gui.logger.Debugf("Creating window...")
|
||||
var err error
|
||||
gui.window, err = gui.createWindow()
|
||||
|
@ -467,7 +463,6 @@ Buffer Size: %d lines
|
|||
|
||||
gui.logger.Debugf("Stopping render...")
|
||||
return nil
|
||||
|
||||
}
|
||||
|
||||
func (gui *GUI) redraw() {
|
||||
|
@ -517,7 +512,6 @@ func (gui *GUI) redraw() {
|
|||
}
|
||||
}
|
||||
for y := 0; y < lineCount; y++ {
|
||||
|
||||
if y < len(lines) {
|
||||
|
||||
var builder strings.Builder
|
||||
|
@ -570,11 +564,9 @@ func (gui *GUI) redraw() {
|
|||
gui.renderer.DrawCellText(builder.String(), uint(col), uint(y), alpha, colour, bold)
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
// underlines
|
||||
for y := 0; y < lineCount; y++ {
|
||||
|
||||
if y < len(lines) {
|
||||
|
||||
span := 0
|
||||
|
@ -599,7 +591,6 @@ func (gui *GUI) redraw() {
|
|||
gui.renderer.DrawUnderline(span, uint(x-span), uint(y), colour)
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
gui.renderOverlay()
|
||||
}
|
||||
|
@ -648,7 +639,6 @@ func (gui *GUI) createWindow() (*glfw.Window, error) {
|
|||
}
|
||||
|
||||
func (gui *GUI) createWindowWithOpenGLVersion(major int, minor int) (*glfw.Window, error) {
|
||||
|
||||
glfw.WindowHint(glfw.ContextVersionMajor, major)
|
||||
glfw.WindowHint(glfw.ContextVersionMinor, minor)
|
||||
|
||||
|
@ -715,7 +705,6 @@ func (gui *GUI) createProgram() (uint32, error) {
|
|||
}
|
||||
|
||||
func (gui *GUI) launchTarget(target string) {
|
||||
|
||||
err := platform.LaunchTarget(target)
|
||||
if err != nil {
|
||||
gui.logger.Errorf("Failed to launch target %s: %s", target, err)
|
||||
|
@ -731,8 +720,10 @@ func (gui *GUI) Screenshot(path string) {
|
|||
x, y := gui.window.GetPos()
|
||||
w, h := gui.window.GetSize()
|
||||
|
||||
img, err := screenshot.CaptureRect(image.Rectangle{Min: image.Point{X: x, Y: y},
|
||||
Max: image.Point{X: x + w, Y: y + h}})
|
||||
img, err := screenshot.CaptureRect(image.Rectangle{
|
||||
Min: image.Point{X: x, Y: y},
|
||||
Max: image.Point{X: x + w, Y: y + h},
|
||||
})
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
|
@ -745,6 +736,6 @@ func (gui *GUI) windowPosChangeCallback(w *glfw.Window, xpos int, ypos int) {
|
|||
gui.SetDPIScale()
|
||||
}
|
||||
|
||||
func (gui *GUI) monitorChangeCallback(monitor *glfw.Monitor, event glfw.MonitorEvent) {
|
||||
func (gui *GUI) monitorChangeCallback(_ *glfw.Monitor, _ glfw.PeripheralEvent) {
|
||||
gui.SetDPIScale()
|
||||
}
|
||||
|
|
|
@ -4,7 +4,7 @@ import (
|
|||
"fmt"
|
||||
"strings"
|
||||
|
||||
"github.com/go-gl/glfw/v3.2/glfw"
|
||||
"github.com/go-gl/glfw/v3.3/glfw"
|
||||
)
|
||||
|
||||
// send typed runes straight through to the pty
|
||||
|
@ -23,7 +23,6 @@ func modsPressed(pressed glfw.ModifierKey, mods ...glfw.ModifierKey) bool {
|
|||
}
|
||||
|
||||
func getModStr(mods glfw.ModifierKey) string {
|
||||
|
||||
switch true {
|
||||
case modsPressed(mods, glfw.ModControl, glfw.ModShift, glfw.ModAlt):
|
||||
return "8"
|
||||
|
@ -45,7 +44,6 @@ func getModStr(mods glfw.ModifierKey) string {
|
|||
}
|
||||
|
||||
func (gui *GUI) key(w *glfw.Window, key glfw.Key, scancode int, action glfw.Action, mods glfw.ModifierKey) {
|
||||
|
||||
if action == glfw.Repeat || action == glfw.Press {
|
||||
|
||||
if gui.overlay != nil {
|
||||
|
@ -227,7 +225,7 @@ func (gui *GUI) key(w *glfw.Window, key glfw.Key, scancode int, action glfw.Acti
|
|||
if modsPressed(mods, glfw.ModAlt) {
|
||||
gui.terminal.Write([]byte{0x17}) // ctrl-w/delete word
|
||||
} else {
|
||||
gui.terminal.Write([]byte{0x7f}) //0x7f is DEL
|
||||
gui.terminal.Write([]byte{0x7f}) // 0x7f is DEL
|
||||
}
|
||||
case glfw.KeyUp:
|
||||
if modStr != "" {
|
||||
|
@ -304,5 +302,4 @@ func (gui *GUI) key(w *glfw.Window, key glfw.Key, scancode int, action glfw.Acti
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
12
gui/mouse.go
12
gui/mouse.go
|
@ -3,16 +3,14 @@ package gui
|
|||
import (
|
||||
"fmt"
|
||||
"math"
|
||||
|
||||
"time"
|
||||
|
||||
"github.com/go-gl/glfw/v3.2/glfw"
|
||||
"github.com/go-gl/glfw/v3.3/glfw"
|
||||
"github.com/liamg/aminal/buffer"
|
||||
"github.com/liamg/aminal/terminal"
|
||||
)
|
||||
|
||||
func (gui *GUI) glfwScrollCallback(w *glfw.Window, xoff float64, yoff float64) {
|
||||
|
||||
if yoff > 0 {
|
||||
gui.terminal.ScreenScrollUp(1)
|
||||
} else {
|
||||
|
@ -37,7 +35,6 @@ func (gui *GUI) getArrowCursor() *glfw.Cursor {
|
|||
}
|
||||
|
||||
func (gui *GUI) mouseMoveCallback(w *glfw.Window, px float64, py float64) {
|
||||
|
||||
x, y := gui.convertMouseCoordinates(px, py)
|
||||
|
||||
if gui.mouseDown {
|
||||
|
@ -123,7 +120,6 @@ func btnCode(button glfw.MouseButton, release bool, mod glfw.ModifierKey) (b byt
|
|||
}
|
||||
|
||||
func (gui *GUI) mouseButtonCallback(w *glfw.Window, button glfw.MouseButton, action glfw.Action, mod glfw.ModifierKey) {
|
||||
|
||||
if gui.overlay != nil {
|
||||
if button == glfw.MouseButtonRight && action == glfw.Release {
|
||||
gui.setOverlay(nil)
|
||||
|
@ -155,8 +151,7 @@ func (gui *GUI) mouseButtonCallback(w *glfw.Window, button glfw.MouseButton, act
|
|||
|
||||
case glfw.MouseButtonRight:
|
||||
if gui.config.CopyAndPasteWithMouse && action == glfw.Press && gui.terminal.GetMouseMode() == terminal.MouseModeNone {
|
||||
str, err := gui.window.GetClipboardString()
|
||||
if err == nil {
|
||||
if str := gui.window.GetClipboardString(); str != "" {
|
||||
activeBuffer := gui.terminal.ActiveBuffer()
|
||||
activeBuffer.ClearSelection()
|
||||
_ = gui.terminal.Paste([]byte(str))
|
||||
|
@ -178,7 +173,7 @@ func (gui *GUI) mouseButtonCallback(w *glfw.Window, button glfw.MouseButton, act
|
|||
// handle clicks locally
|
||||
|
||||
return
|
||||
case terminal.MouseModeX10: //X10 compatibility mode
|
||||
case terminal.MouseModeX10: // X10 compatibility mode
|
||||
|
||||
/*
|
||||
X10 compatibility mode sends an escape sequence only on button press, encoding the location and the mouse button pressed.
|
||||
|
@ -252,7 +247,6 @@ func (gui *GUI) mouseButtonCallback(w *glfw.Window, button glfw.MouseButton, act
|
|||
default:
|
||||
panic("Unsupported mouse mode")
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
func (gui *GUI) handleSelectionButtonPress(x uint16, y uint16) {
|
||||
|
|
|
@ -2,8 +2,7 @@
|
|||
|
||||
package gui
|
||||
|
||||
import "github.com/go-gl/glfw/v3.2/glfw"
|
||||
import "github.com/go-gl/glfw/v3.3/glfw"
|
||||
|
||||
func UpdateNSGLContext(window *glfw.Window) {
|
||||
|
||||
}
|
||||
|
|
|
@ -47,7 +47,6 @@ func (r *OpenGLRenderer) CellHeight() float32 {
|
|||
}
|
||||
|
||||
func (r *OpenGLRenderer) newRectangleEx(x float32, y float32, width float32, height float32, colourAttr uint32) *rectangle {
|
||||
|
||||
rect := &rectangle{}
|
||||
|
||||
halfAreaWidth := float32(r.areaWidth / 2)
|
||||
|
@ -204,7 +203,6 @@ func (r *OpenGLRenderer) DrawCursor(col uint, row uint, colour config.Colour) {
|
|||
}
|
||||
|
||||
func (r *OpenGLRenderer) DrawCellBg(cell buffer.Cell, col uint, row uint, colour *config.Colour, force bool) {
|
||||
|
||||
var bg [3]float32
|
||||
|
||||
if colour != nil {
|
||||
|
@ -220,12 +218,11 @@ func (r *OpenGLRenderer) DrawCellBg(cell buffer.Cell, col uint, row uint, colour
|
|||
|
||||
rect.Free()
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// DrawUnderline draws a line under 'span' characters starting at (col, row)
|
||||
func (r *OpenGLRenderer) DrawUnderline(span int, col uint, row uint, colour [3]float32) {
|
||||
//calculate coordinates
|
||||
// calculate coordinates
|
||||
x := float32(float32(col) * r.cellWidth)
|
||||
y := (float32(row+1))*r.cellHeight + r.fontMap.DefaultFont().MinY()*0.25
|
||||
|
||||
|
@ -242,7 +239,6 @@ func (r *OpenGLRenderer) DrawUnderline(span int, col uint, row uint, colour [3]f
|
|||
}
|
||||
|
||||
func (r *OpenGLRenderer) DrawCellText(text string, col uint, row uint, alpha float32, colour [3]float32, bold bool) {
|
||||
|
||||
var f *glfont.Font
|
||||
if bold {
|
||||
f = r.fontMap.BoldFont()
|
||||
|
@ -259,7 +255,6 @@ func (r *OpenGLRenderer) DrawCellText(text string, col uint, row uint, alpha flo
|
|||
}
|
||||
|
||||
func (r *OpenGLRenderer) DrawCellImage(cell buffer.Cell, col uint, row uint) {
|
||||
|
||||
img := cell.Image()
|
||||
|
||||
if img == nil {
|
||||
|
@ -302,8 +297,8 @@ func (r *OpenGLRenderer) DrawCellImage(cell buffer.Cell, col uint, row uint) {
|
|||
r.textureMap[img] = tex
|
||||
}
|
||||
|
||||
var w = float32(img.Bounds().Size().X)
|
||||
var h = float32(img.Bounds().Size().Y)
|
||||
w := float32(img.Bounds().Size().X)
|
||||
h := float32(img.Bounds().Size().Y)
|
||||
|
||||
var readFboId uint32
|
||||
gl.GenFramebuffers(1, &readFboId)
|
||||
|
|
|
@ -7,7 +7,6 @@ import (
|
|||
)
|
||||
|
||||
func (gui *GUI) textbox(col uint16, row uint16, text string, fg [3]float32, bg [3]float32) {
|
||||
|
||||
lines := []string{}
|
||||
line := ""
|
||||
word := ""
|
||||
|
@ -55,7 +54,7 @@ func (gui *GUI) textbox(col uint16, row uint16, text string, fg [3]float32, bg [
|
|||
return false
|
||||
}
|
||||
|
||||
var done = false
|
||||
done := false
|
||||
|
||||
DONE:
|
||||
for _, c := range text {
|
||||
|
@ -94,5 +93,4 @@ DONE:
|
|||
y := float32(row+1+uint16(i))*gui.renderer.cellHeight + f.MinY()
|
||||
f.Print(x, y, fmt.Sprintf(" %s", line))
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -2,10 +2,11 @@ package main
|
|||
|
||||
import (
|
||||
"fmt"
|
||||
"github.com/kbinani/screenshot"
|
||||
"image"
|
||||
"image/png"
|
||||
"os"
|
||||
|
||||
"github.com/kbinani/screenshot"
|
||||
)
|
||||
|
||||
// save *image.RGBA to filePath with PNG format.
|
||||
|
|
|
@ -71,7 +71,7 @@ func Capture(x, y, width, height int) (img *image.RGBA, e error) {
|
|||
|
||||
if useShm {
|
||||
shmSize := intersect.Dx() * intersect.Dy() * 4
|
||||
shmId, err := shm.Get(shm.IPC_PRIVATE, shmSize, shm.IPC_CREAT|0777)
|
||||
shmId, err := shm.Get(shm.IPC_PRIVATE, shmSize, shm.IPC_CREAT|0o777)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
|
|
@ -11,7 +11,7 @@ void* CompatCGDisplayCreateImageForRect(CGDirectDisplayID display, CGRect rect)
|
|||
}
|
||||
|
||||
void CompatCGImageRelease(void* image) {
|
||||
CGImageRelease(image);
|
||||
CGImageRelease(image);
|
||||
}
|
||||
|
||||
void* CompatCGImageCreateCopyWithColorSpace(void* image, CGColorSpaceRef space) {
|
||||
|
|
|
@ -1,8 +1,9 @@
|
|||
package screenshot
|
||||
|
||||
import (
|
||||
"github.com/kbinani/screenshot/internal/xwindow"
|
||||
"image"
|
||||
|
||||
"github.com/kbinani/screenshot/internal/xwindow"
|
||||
)
|
||||
|
||||
// Capture returns screen capture of specified desktop region.
|
||||
|
|
|
@ -2,11 +2,12 @@ package screenshot
|
|||
|
||||
import (
|
||||
"errors"
|
||||
"github.com/kbinani/screenshot/internal/util"
|
||||
win "github.com/lxn/win"
|
||||
"image"
|
||||
"syscall"
|
||||
"unsafe"
|
||||
|
||||
"github.com/kbinani/screenshot/internal/util"
|
||||
win "github.com/lxn/win"
|
||||
)
|
||||
|
||||
var (
|
||||
|
|
|
@ -11,8 +11,10 @@ import (
|
|||
"unsafe"
|
||||
)
|
||||
|
||||
const KEY_READ REGSAM = 0x20019
|
||||
const KEY_WRITE REGSAM = 0x20006
|
||||
const (
|
||||
KEY_READ REGSAM = 0x20019
|
||||
KEY_WRITE REGSAM = 0x20006
|
||||
)
|
||||
|
||||
const (
|
||||
HKEY_CLASSES_ROOT HKEY = 0x80000000
|
||||
|
|
|
@ -6,9 +6,11 @@
|
|||
|
||||
package win
|
||||
|
||||
const DTM_FIRST = 0x1000
|
||||
const DTN_FIRST = ^uint32(739) // -740
|
||||
const DTN_FIRST2 = ^uint32(752) // -753
|
||||
const (
|
||||
DTM_FIRST = 0x1000
|
||||
DTN_FIRST = ^uint32(739) // -740
|
||||
DTN_FIRST2 = ^uint32(752) // -753
|
||||
)
|
||||
|
||||
const (
|
||||
GDTR_MIN = 0x0001
|
||||
|
|
|
@ -141,9 +141,7 @@ var (
|
|||
gdiplusStartup uintptr
|
||||
)
|
||||
|
||||
var (
|
||||
token uintptr
|
||||
)
|
||||
var token uintptr
|
||||
|
||||
func init() {
|
||||
// Library
|
||||
|
|
|
@ -72,7 +72,7 @@ const (
|
|||
LB_MULTIPLEADDSTRING = 0x01B1
|
||||
)
|
||||
|
||||
//Listbox Notification Codes
|
||||
// Listbox Notification Codes
|
||||
const (
|
||||
LBN_ERRSPACE = -2
|
||||
LBN_SELCHANGE = 1
|
||||
|
@ -81,6 +81,7 @@ const (
|
|||
LBN_SETFOCUS = 4
|
||||
LBN_KILLFOCUS = 5
|
||||
)
|
||||
|
||||
const (
|
||||
LB_ERR = -1
|
||||
LB_ERRSPACE = -2
|
||||
|
|
|
@ -55,10 +55,12 @@ const (
|
|||
OLECLOSE_PROMPTSAVE = 2
|
||||
)
|
||||
|
||||
type IID syscall.GUID
|
||||
type CLSID syscall.GUID
|
||||
type REFIID *IID
|
||||
type REFCLSID *CLSID
|
||||
type (
|
||||
IID syscall.GUID
|
||||
CLSID syscall.GUID
|
||||
REFIID *IID
|
||||
REFCLSID *CLSID
|
||||
)
|
||||
|
||||
var (
|
||||
IID_IClassFactory = IID{0x00000001, 0x0000, 0x0000, [8]byte{0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46}}
|
||||
|
|
|
@ -59,9 +59,7 @@ const (
|
|||
DISPID_NEWWINDOW3 DISPID = 273
|
||||
)
|
||||
|
||||
var (
|
||||
IID_IDispatch = IID{0x00020400, 0x0000, 0x0000, [8]byte{0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46}}
|
||||
)
|
||||
var IID_IDispatch = IID{0x00020400, 0x0000, 0x0000, [8]byte{0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46}}
|
||||
|
||||
const (
|
||||
DISP_E_MEMBERNOTFOUND = 0x80020003
|
||||
|
@ -169,7 +167,7 @@ type SAFEARRAY struct {
|
|||
Rgsabound [1]SAFEARRAYBOUND
|
||||
}
|
||||
|
||||
//type BSTR *uint16
|
||||
// type BSTR *uint16
|
||||
|
||||
func StringToBSTR(value string) *uint16 /*BSTR*/ {
|
||||
// IMPORTANT: Don't forget to free the BSTR value when no longer needed!
|
||||
|
|
|
@ -11,8 +11,10 @@ import (
|
|||
"unsafe"
|
||||
)
|
||||
|
||||
type CSIDL uint32
|
||||
type HDROP HANDLE
|
||||
type (
|
||||
CSIDL uint32
|
||||
HDROP HANDLE
|
||||
)
|
||||
|
||||
const (
|
||||
CSIDL_DESKTOP = 0x00
|
||||
|
|
|
@ -16,7 +16,7 @@ var (
|
|||
IID_ITaskbarList3 = IID{0xea1afb91, 0x9e28, 0x4b86, [8]byte{0x90, 0xe9, 0x9e, 0x9f, 0x8a, 0x5e, 0xef, 0xaf}}
|
||||
)
|
||||
|
||||
//TBPFLAG
|
||||
// TBPFLAG
|
||||
const (
|
||||
TBPF_NOPROGRESS = 0
|
||||
TBPF_INDETERMINATE = 0x1
|
||||
|
|
|
@ -6,8 +6,10 @@
|
|||
|
||||
package win
|
||||
|
||||
const TCM_FIRST = 0x1300
|
||||
const TCN_FIRST = -550
|
||||
const (
|
||||
TCM_FIRST = 0x1300
|
||||
TCN_FIRST = -550
|
||||
)
|
||||
|
||||
const (
|
||||
TCS_SCROLLOPPOSITE = 0x0001
|
||||
|
|
|
@ -172,17 +172,17 @@ const (
|
|||
BS_AUTOCHECKBOX = 3
|
||||
BS_AUTORADIOBUTTON = 9
|
||||
BS_BITMAP = 128
|
||||
BS_BOTTOM = 0X800
|
||||
BS_CENTER = 0X300
|
||||
BS_BOTTOM = 0x800
|
||||
BS_CENTER = 0x300
|
||||
BS_CHECKBOX = 2
|
||||
BS_DEFPUSHBUTTON = 1
|
||||
BS_GROUPBOX = 7
|
||||
BS_ICON = 64
|
||||
BS_LEFT = 256
|
||||
BS_LEFTTEXT = 32
|
||||
BS_MULTILINE = 0X2000
|
||||
BS_NOTIFY = 0X4000
|
||||
BS_OWNERDRAW = 0XB
|
||||
BS_MULTILINE = 0x2000
|
||||
BS_NOTIFY = 0x4000
|
||||
BS_OWNERDRAW = 0xB
|
||||
BS_PUSHBUTTON = 0
|
||||
BS_PUSHLIKE = 4096
|
||||
BS_RADIOBUTTON = 4
|
||||
|
@ -190,10 +190,10 @@ const (
|
|||
BS_RIGHTBUTTON = 32
|
||||
BS_SPLITBUTTON = 0x0000000c
|
||||
BS_TEXT = 0
|
||||
BS_TOP = 0X400
|
||||
BS_TOP = 0x400
|
||||
BS_USERBUTTON = 8
|
||||
BS_VCENTER = 0XC00
|
||||
BS_FLAT = 0X8000
|
||||
BS_VCENTER = 0xC00
|
||||
BS_FLAT = 0x8000
|
||||
)
|
||||
|
||||
const (
|
||||
|
@ -610,61 +610,61 @@ const (
|
|||
|
||||
// Window style constants
|
||||
const (
|
||||
WS_OVERLAPPED = 0X00000000
|
||||
WS_POPUP = 0X80000000
|
||||
WS_CHILD = 0X40000000
|
||||
WS_MINIMIZE = 0X20000000
|
||||
WS_VISIBLE = 0X10000000
|
||||
WS_DISABLED = 0X08000000
|
||||
WS_CLIPSIBLINGS = 0X04000000
|
||||
WS_CLIPCHILDREN = 0X02000000
|
||||
WS_MAXIMIZE = 0X01000000
|
||||
WS_CAPTION = 0X00C00000
|
||||
WS_BORDER = 0X00800000
|
||||
WS_DLGFRAME = 0X00400000
|
||||
WS_VSCROLL = 0X00200000
|
||||
WS_HSCROLL = 0X00100000
|
||||
WS_SYSMENU = 0X00080000
|
||||
WS_THICKFRAME = 0X00040000
|
||||
WS_GROUP = 0X00020000
|
||||
WS_TABSTOP = 0X00010000
|
||||
WS_MINIMIZEBOX = 0X00020000
|
||||
WS_MAXIMIZEBOX = 0X00010000
|
||||
WS_TILED = 0X00000000
|
||||
WS_ICONIC = 0X20000000
|
||||
WS_SIZEBOX = 0X00040000
|
||||
WS_OVERLAPPEDWINDOW = 0X00000000 | 0X00C00000 | 0X00080000 | 0X00040000 | 0X00020000 | 0X00010000
|
||||
WS_POPUPWINDOW = 0X80000000 | 0X00800000 | 0X00080000
|
||||
WS_CHILDWINDOW = 0X40000000
|
||||
WS_OVERLAPPED = 0x00000000
|
||||
WS_POPUP = 0x80000000
|
||||
WS_CHILD = 0x40000000
|
||||
WS_MINIMIZE = 0x20000000
|
||||
WS_VISIBLE = 0x10000000
|
||||
WS_DISABLED = 0x08000000
|
||||
WS_CLIPSIBLINGS = 0x04000000
|
||||
WS_CLIPCHILDREN = 0x02000000
|
||||
WS_MAXIMIZE = 0x01000000
|
||||
WS_CAPTION = 0x00C00000
|
||||
WS_BORDER = 0x00800000
|
||||
WS_DLGFRAME = 0x00400000
|
||||
WS_VSCROLL = 0x00200000
|
||||
WS_HSCROLL = 0x00100000
|
||||
WS_SYSMENU = 0x00080000
|
||||
WS_THICKFRAME = 0x00040000
|
||||
WS_GROUP = 0x00020000
|
||||
WS_TABSTOP = 0x00010000
|
||||
WS_MINIMIZEBOX = 0x00020000
|
||||
WS_MAXIMIZEBOX = 0x00010000
|
||||
WS_TILED = 0x00000000
|
||||
WS_ICONIC = 0x20000000
|
||||
WS_SIZEBOX = 0x00040000
|
||||
WS_OVERLAPPEDWINDOW = 0x00000000 | 0x00C00000 | 0x00080000 | 0x00040000 | 0x00020000 | 0x00010000
|
||||
WS_POPUPWINDOW = 0x80000000 | 0x00800000 | 0x00080000
|
||||
WS_CHILDWINDOW = 0x40000000
|
||||
)
|
||||
|
||||
// Extended window style constants
|
||||
const (
|
||||
WS_EX_DLGMODALFRAME = 0X00000001
|
||||
WS_EX_NOPARENTNOTIFY = 0X00000004
|
||||
WS_EX_TOPMOST = 0X00000008
|
||||
WS_EX_ACCEPTFILES = 0X00000010
|
||||
WS_EX_TRANSPARENT = 0X00000020
|
||||
WS_EX_MDICHILD = 0X00000040
|
||||
WS_EX_TOOLWINDOW = 0X00000080
|
||||
WS_EX_WINDOWEDGE = 0X00000100
|
||||
WS_EX_CLIENTEDGE = 0X00000200
|
||||
WS_EX_CONTEXTHELP = 0X00000400
|
||||
WS_EX_RIGHT = 0X00001000
|
||||
WS_EX_LEFT = 0X00000000
|
||||
WS_EX_RTLREADING = 0X00002000
|
||||
WS_EX_LTRREADING = 0X00000000
|
||||
WS_EX_LEFTSCROLLBAR = 0X00004000
|
||||
WS_EX_RIGHTSCROLLBAR = 0X00000000
|
||||
WS_EX_CONTROLPARENT = 0X00010000
|
||||
WS_EX_STATICEDGE = 0X00020000
|
||||
WS_EX_APPWINDOW = 0X00040000
|
||||
WS_EX_OVERLAPPEDWINDOW = 0X00000100 | 0X00000200
|
||||
WS_EX_PALETTEWINDOW = 0X00000100 | 0X00000080 | 0X00000008
|
||||
WS_EX_LAYERED = 0X00080000
|
||||
WS_EX_NOINHERITLAYOUT = 0X00100000
|
||||
WS_EX_LAYOUTRTL = 0X00400000
|
||||
WS_EX_NOACTIVATE = 0X08000000
|
||||
WS_EX_DLGMODALFRAME = 0x00000001
|
||||
WS_EX_NOPARENTNOTIFY = 0x00000004
|
||||
WS_EX_TOPMOST = 0x00000008
|
||||
WS_EX_ACCEPTFILES = 0x00000010
|
||||
WS_EX_TRANSPARENT = 0x00000020
|
||||
WS_EX_MDICHILD = 0x00000040
|
||||
WS_EX_TOOLWINDOW = 0x00000080
|
||||
WS_EX_WINDOWEDGE = 0x00000100
|
||||
WS_EX_CLIENTEDGE = 0x00000200
|
||||
WS_EX_CONTEXTHELP = 0x00000400
|
||||
WS_EX_RIGHT = 0x00001000
|
||||
WS_EX_LEFT = 0x00000000
|
||||
WS_EX_RTLREADING = 0x00002000
|
||||
WS_EX_LTRREADING = 0x00000000
|
||||
WS_EX_LEFTSCROLLBAR = 0x00004000
|
||||
WS_EX_RIGHTSCROLLBAR = 0x00000000
|
||||
WS_EX_CONTROLPARENT = 0x00010000
|
||||
WS_EX_STATICEDGE = 0x00020000
|
||||
WS_EX_APPWINDOW = 0x00040000
|
||||
WS_EX_OVERLAPPEDWINDOW = 0x00000100 | 0x00000200
|
||||
WS_EX_PALETTEWINDOW = 0x00000100 | 0x00000080 | 0x00000008
|
||||
WS_EX_LAYERED = 0x00080000
|
||||
WS_EX_NOINHERITLAYOUT = 0x00100000
|
||||
WS_EX_LAYOUTRTL = 0x00400000
|
||||
WS_EX_NOACTIVATE = 0x08000000
|
||||
)
|
||||
|
||||
// Window message constants
|
||||
|
@ -736,7 +736,7 @@ const (
|
|||
WM_INITDIALOG = 272
|
||||
WM_INITMENU = 278
|
||||
WM_INITMENUPOPUP = 279
|
||||
WM_INPUT = 0X00FF
|
||||
WM_INPUT = 0x00FF
|
||||
WM_INPUTLANGCHANGE = 81
|
||||
WM_INPUTLANGCHANGEREQUEST = 80
|
||||
WM_KEYDOWN = 256
|
||||
|
@ -755,16 +755,16 @@ const (
|
|||
WM_MDISETMENU = 560
|
||||
WM_MDITILE = 550
|
||||
WM_MEASUREITEM = 44
|
||||
WM_GETOBJECT = 0X003D
|
||||
WM_CHANGEUISTATE = 0X0127
|
||||
WM_UPDATEUISTATE = 0X0128
|
||||
WM_QUERYUISTATE = 0X0129
|
||||
WM_UNINITMENUPOPUP = 0X0125
|
||||
WM_GETOBJECT = 0x003D
|
||||
WM_CHANGEUISTATE = 0x0127
|
||||
WM_UPDATEUISTATE = 0x0128
|
||||
WM_QUERYUISTATE = 0x0129
|
||||
WM_UNINITMENUPOPUP = 0x0125
|
||||
WM_MENURBUTTONUP = 290
|
||||
WM_MENUCOMMAND = 0X0126
|
||||
WM_MENUGETOBJECT = 0X0124
|
||||
WM_MENUDRAG = 0X0123
|
||||
WM_APPCOMMAND = 0X0319
|
||||
WM_MENUCOMMAND = 0x0126
|
||||
WM_MENUGETOBJECT = 0x0124
|
||||
WM_MENUDRAG = 0x0123
|
||||
WM_APPCOMMAND = 0x0319
|
||||
WM_MENUCHAR = 288
|
||||
WM_MENUSELECT = 287
|
||||
WM_MOVE = 3
|
||||
|
@ -783,8 +783,8 @@ const (
|
|||
WM_NCXBUTTONDOWN = 171
|
||||
WM_NCXBUTTONUP = 172
|
||||
WM_NCXBUTTONDBLCLK = 173
|
||||
WM_NCMOUSEHOVER = 0X02A0
|
||||
WM_NCMOUSELEAVE = 0X02A2
|
||||
WM_NCMOUSEHOVER = 0x02A0
|
||||
WM_NCMOUSELEAVE = 0x02A2
|
||||
WM_NCMOUSEMOVE = 160
|
||||
WM_NCPAINT = 133
|
||||
WM_NCRBUTTONDBLCLK = 166
|
||||
|
@ -870,8 +870,8 @@ const (
|
|||
WM_XBUTTONUP = 524
|
||||
WM_XBUTTONDBLCLK = 525
|
||||
WM_MOUSELAST = 525
|
||||
WM_MOUSEHOVER = 0X2A1
|
||||
WM_MOUSELEAVE = 0X2A3
|
||||
WM_MOUSEHOVER = 0x2A1
|
||||
WM_MOUSELEAVE = 0x2A3
|
||||
WM_CLIPBOARDUPDATE = 0x031D
|
||||
)
|
||||
|
||||
|
|
|
@ -10,7 +10,6 @@ func init() {
|
|||
}
|
||||
|
||||
func hintColours(word string, context string, wordX uint16, wordY uint16) *Hint {
|
||||
|
||||
item := NewHint(word, context, wordX, wordY)
|
||||
|
||||
if isColour(word) {
|
||||
|
|
|
@ -111,7 +111,6 @@ func init() {
|
|||
}
|
||||
|
||||
func hintPerms(word string, context string, wordX uint16, wordY uint16) *Hint {
|
||||
|
||||
item := NewHint(word, context, wordX, wordY)
|
||||
|
||||
if wordX == 0 {
|
||||
|
|
|
@ -8,7 +8,6 @@ import (
|
|||
)
|
||||
|
||||
func getLogger(conf *config.Config) (*zap.SugaredLogger, error) {
|
||||
|
||||
var logger *zap.Logger
|
||||
var err error
|
||||
if conf.DebugMode {
|
||||
|
|
5
main.go
5
main.go
|
@ -2,12 +2,13 @@ package main
|
|||
|
||||
import (
|
||||
"fmt"
|
||||
"os"
|
||||
"runtime"
|
||||
|
||||
"github.com/liamg/aminal/gui"
|
||||
"github.com/liamg/aminal/platform"
|
||||
"github.com/liamg/aminal/terminal"
|
||||
"github.com/riywo/loginshell"
|
||||
"os"
|
||||
"runtime"
|
||||
)
|
||||
|
||||
type callback func(terminal *terminal.Terminal, g *gui.GUI)
|
||||
|
|
13
main_test.go
13
main_test.go
|
@ -16,8 +16,10 @@ import (
|
|||
"github.com/carlogit/phash"
|
||||
)
|
||||
|
||||
var termRef *terminal.Terminal
|
||||
var guiRef *gui.GUI
|
||||
var (
|
||||
termRef *terminal.Terminal
|
||||
guiRef *gui.GUI
|
||||
)
|
||||
|
||||
func terminate(msg string) int {
|
||||
defer fmt.Print(msg)
|
||||
|
@ -94,7 +96,6 @@ func runMain(f func()) {
|
|||
|
||||
func TestCursorMovement(t *testing.T) {
|
||||
runMain(func() {
|
||||
|
||||
testFunc := func(term *terminal.Terminal, g *gui.GUI) {
|
||||
termRef = term
|
||||
guiRef = g
|
||||
|
@ -125,7 +126,6 @@ func TestCursorMovement(t *testing.T) {
|
|||
|
||||
func TestScreenFeatures(t *testing.T) {
|
||||
runMain(func() {
|
||||
|
||||
testFunc := func(term *terminal.Terminal, g *gui.GUI) {
|
||||
termRef = term
|
||||
guiRef = g
|
||||
|
@ -148,8 +148,8 @@ func TestScreenFeatures(t *testing.T) {
|
|||
validateScreen("test-screen-features-10.png")
|
||||
|
||||
// 11th screen test is not passing https://github.com/liamg/aminal/issues/207
|
||||
//g.Screenshot("vttest/test-screen-features-11.png")
|
||||
//compareImages("vttest/test-screen-features-11.png", "vttest/test-screen-features-11.png")
|
||||
// g.Screenshot("vttest/test-screen-features-11.png")
|
||||
// compareImages("vttest/test-screen-features-11.png", "vttest/test-screen-features-11.png")
|
||||
|
||||
enter(term)
|
||||
sleep()
|
||||
|
@ -168,7 +168,6 @@ func TestScreenFeatures(t *testing.T) {
|
|||
|
||||
func TestSixel(t *testing.T) {
|
||||
runMain(func() {
|
||||
|
||||
testFunc := func(term *terminal.Terminal, g *gui.GUI) {
|
||||
termRef = term
|
||||
guiRef = g
|
||||
|
|
|
@ -61,7 +61,6 @@ func (matrix *AutoMatrix) setAtLine(value rune, x int, line []rune) []rune {
|
|||
|
||||
// SetAt sets a value at (x, y) growing the matrix as necessary
|
||||
func (matrix *AutoMatrix) SetAt(value rune, x int, y int) {
|
||||
|
||||
if y >= len(matrix.lines) {
|
||||
matrix.lines = append(matrix.lines, make([][]rune, y-len(matrix.lines)+1)...)
|
||||
}
|
||||
|
|
|
@ -21,8 +21,8 @@ type unixPty struct {
|
|||
type winsize struct {
|
||||
Height uint16
|
||||
Width uint16
|
||||
x uint16 //ignored, but necessary for ioctl calls
|
||||
y uint16 //ignored, but necessary for ioctl calls
|
||||
x uint16 // ignored, but necessary for ioctl calls
|
||||
y uint16 // ignored, but necessary for ioctl calls
|
||||
}
|
||||
|
||||
func (p *unixPty) Read(b []byte) (int, error) {
|
||||
|
|
|
@ -1,19 +0,0 @@
|
|||
# This is the official list of 'w32' authors for copyright purposes.
|
||||
|
||||
# Names should be added to this file as
|
||||
# Name or Organization <email address>
|
||||
# The email address is not required for organizations.
|
||||
|
||||
# Please keep the list sorted.
|
||||
|
||||
# Contributors
|
||||
# ============
|
||||
|
||||
Allen Dang <allengnr@gmail.com>
|
||||
Benny Siegert <bsiegert@gmail.com>
|
||||
Bruno Bigras <bigras.bruno@gmail.com>
|
||||
Daniel Joos
|
||||
Gerald Rosenberg <gerald.rosenberg@gmail.com>
|
||||
Liam Bowen <liambowen@gmail.com>
|
||||
Michael Henke
|
||||
Paul Maddox <paul.maddox@gmail.com>
|
|
@ -1,23 +0,0 @@
|
|||
Copyright (c) 2010-2012 The w32 Authors. All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions
|
||||
are met:
|
||||
1. Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
2. Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in the
|
||||
documentation and/or other materials provided with the distribution.
|
||||
3. The names of the authors may not be used to endorse or promote products
|
||||
derived from this software without specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE AUTHORS ``AS IS'' AND ANY EXPRESS OR
|
||||
IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
||||
OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
|
||||
IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||
NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
|
||||
THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
@ -1,33 +0,0 @@
|
|||
About w32
|
||||
==========
|
||||
|
||||
w32 is a wrapper of windows apis for the Go Programming Language.
|
||||
|
||||
It wraps win32 apis to "Go style" to make them easier to use.
|
||||
|
||||
Setup
|
||||
=====
|
||||
|
||||
1. Make sure you have a working Go installation and build environment,
|
||||
see this go-nuts post for details:
|
||||
http://groups.google.com/group/golang-nuts/msg/5c87630a84f4fd0c
|
||||
|
||||
Updated versions of the Windows Go build are available here:
|
||||
http://code.google.com/p/gomingw/downloads/list
|
||||
|
||||
2. Create a "gopath" directory if you do not have one yet and set the
|
||||
GOPATH variable accordingly. For example:
|
||||
mkdir -p go-externals/src
|
||||
export GOPATH=${PWD}/go-externals
|
||||
|
||||
3. go get github.com/AllenDang/w32
|
||||
|
||||
4. go install github.com/AllenDang/w32...
|
||||
|
||||
Contribute
|
||||
==========
|
||||
|
||||
Contributions in form of design, code, documentation, bug reporting or other
|
||||
ways you see fit are very welcome.
|
||||
|
||||
Thank You!
|
|
@ -1,389 +0,0 @@
|
|||
// Copyright 2010-2012 The W32 Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
package w32
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
"syscall"
|
||||
"unsafe"
|
||||
)
|
||||
|
||||
var (
|
||||
modadvapi32 = syscall.NewLazyDLL("advapi32.dll")
|
||||
|
||||
// procRegSetKeyValue = modadvapi32.NewProc("RegSetKeyValueW")
|
||||
procCloseEventLog = modadvapi32.NewProc("CloseEventLog")
|
||||
procCloseServiceHandle = modadvapi32.NewProc("CloseServiceHandle")
|
||||
procControlService = modadvapi32.NewProc("ControlService")
|
||||
procControlTrace = modadvapi32.NewProc("ControlTraceW")
|
||||
procInitializeSecurityDescriptor = modadvapi32.NewProc("InitializeSecurityDescriptor")
|
||||
procOpenEventLog = modadvapi32.NewProc("OpenEventLogW")
|
||||
procOpenSCManager = modadvapi32.NewProc("OpenSCManagerW")
|
||||
procOpenService = modadvapi32.NewProc("OpenServiceW")
|
||||
procReadEventLog = modadvapi32.NewProc("ReadEventLogW")
|
||||
procRegCloseKey = modadvapi32.NewProc("RegCloseKey")
|
||||
procRegCreateKeyEx = modadvapi32.NewProc("RegCreateKeyExW")
|
||||
procRegEnumKeyEx = modadvapi32.NewProc("RegEnumKeyExW")
|
||||
procRegGetValue = modadvapi32.NewProc("RegGetValueW")
|
||||
procRegOpenKeyEx = modadvapi32.NewProc("RegOpenKeyExW")
|
||||
procRegSetValueEx = modadvapi32.NewProc("RegSetValueExW")
|
||||
procSetSecurityDescriptorDacl = modadvapi32.NewProc("SetSecurityDescriptorDacl")
|
||||
procStartService = modadvapi32.NewProc("StartServiceW")
|
||||
procStartTrace = modadvapi32.NewProc("StartTraceW")
|
||||
)
|
||||
|
||||
var (
|
||||
SystemTraceControlGuid = GUID{
|
||||
0x9e814aad,
|
||||
0x3204,
|
||||
0x11d2,
|
||||
[8]byte{0x9a, 0x82, 0x00, 0x60, 0x08, 0xa8, 0x69, 0x39},
|
||||
}
|
||||
)
|
||||
|
||||
func RegCreateKey(hKey HKEY, subKey string) HKEY {
|
||||
var result HKEY
|
||||
ret, _, _ := procRegCreateKeyEx.Call(
|
||||
uintptr(hKey),
|
||||
uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(subKey))),
|
||||
uintptr(0),
|
||||
uintptr(0),
|
||||
uintptr(0),
|
||||
uintptr(KEY_ALL_ACCESS),
|
||||
uintptr(0),
|
||||
uintptr(unsafe.Pointer(&result)),
|
||||
uintptr(0))
|
||||
_ = ret
|
||||
return result
|
||||
}
|
||||
|
||||
func RegOpenKeyEx(hKey HKEY, subKey string, samDesired uint32) HKEY {
|
||||
var result HKEY
|
||||
ret, _, _ := procRegOpenKeyEx.Call(
|
||||
uintptr(hKey),
|
||||
uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(subKey))),
|
||||
uintptr(0),
|
||||
uintptr(samDesired),
|
||||
uintptr(unsafe.Pointer(&result)))
|
||||
|
||||
if ret != ERROR_SUCCESS {
|
||||
panic(fmt.Sprintf("RegOpenKeyEx(%d, %s, %d) failed", hKey, subKey, samDesired))
|
||||
}
|
||||
return result
|
||||
}
|
||||
|
||||
func RegCloseKey(hKey HKEY) error {
|
||||
var err error
|
||||
ret, _, _ := procRegCloseKey.Call(
|
||||
uintptr(hKey))
|
||||
|
||||
if ret != ERROR_SUCCESS {
|
||||
err = errors.New("RegCloseKey failed")
|
||||
}
|
||||
return err
|
||||
}
|
||||
|
||||
func RegGetRaw(hKey HKEY, subKey string, value string) []byte {
|
||||
var bufLen uint32
|
||||
var valptr unsafe.Pointer
|
||||
if len(value) > 0 {
|
||||
valptr = unsafe.Pointer(syscall.StringToUTF16Ptr(value))
|
||||
}
|
||||
procRegGetValue.Call(
|
||||
uintptr(hKey),
|
||||
uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(subKey))),
|
||||
uintptr(valptr),
|
||||
uintptr(RRF_RT_ANY),
|
||||
0,
|
||||
0,
|
||||
uintptr(unsafe.Pointer(&bufLen)))
|
||||
|
||||
if bufLen == 0 {
|
||||
return nil
|
||||
}
|
||||
|
||||
buf := make([]byte, bufLen)
|
||||
ret, _, _ := procRegGetValue.Call(
|
||||
uintptr(hKey),
|
||||
uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(subKey))),
|
||||
uintptr(valptr),
|
||||
uintptr(RRF_RT_ANY),
|
||||
0,
|
||||
uintptr(unsafe.Pointer(&buf[0])),
|
||||
uintptr(unsafe.Pointer(&bufLen)))
|
||||
|
||||
if ret != ERROR_SUCCESS {
|
||||
return nil
|
||||
}
|
||||
|
||||
return buf
|
||||
}
|
||||
|
||||
func RegSetBinary(hKey HKEY, subKey string, value []byte) (errno int) {
|
||||
var lptr, vptr unsafe.Pointer
|
||||
if len(subKey) > 0 {
|
||||
lptr = unsafe.Pointer(syscall.StringToUTF16Ptr(subKey))
|
||||
}
|
||||
if len(value) > 0 {
|
||||
vptr = unsafe.Pointer(&value[0])
|
||||
}
|
||||
ret, _, _ := procRegSetValueEx.Call(
|
||||
uintptr(hKey),
|
||||
uintptr(lptr),
|
||||
uintptr(0),
|
||||
uintptr(REG_BINARY),
|
||||
uintptr(vptr),
|
||||
uintptr(len(value)))
|
||||
|
||||
return int(ret)
|
||||
}
|
||||
|
||||
func RegGetString(hKey HKEY, subKey string, value string) string {
|
||||
var bufLen uint32
|
||||
procRegGetValue.Call(
|
||||
uintptr(hKey),
|
||||
uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(subKey))),
|
||||
uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(value))),
|
||||
uintptr(RRF_RT_REG_SZ),
|
||||
0,
|
||||
0,
|
||||
uintptr(unsafe.Pointer(&bufLen)))
|
||||
|
||||
if bufLen == 0 {
|
||||
return ""
|
||||
}
|
||||
|
||||
buf := make([]uint16, bufLen)
|
||||
ret, _, _ := procRegGetValue.Call(
|
||||
uintptr(hKey),
|
||||
uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(subKey))),
|
||||
uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(value))),
|
||||
uintptr(RRF_RT_REG_SZ),
|
||||
0,
|
||||
uintptr(unsafe.Pointer(&buf[0])),
|
||||
uintptr(unsafe.Pointer(&bufLen)))
|
||||
|
||||
if ret != ERROR_SUCCESS {
|
||||
return ""
|
||||
}
|
||||
|
||||
return syscall.UTF16ToString(buf)
|
||||
}
|
||||
|
||||
/*
|
||||
func RegSetKeyValue(hKey HKEY, subKey string, valueName string, dwType uint32, data uintptr, cbData uint16) (errno int) {
|
||||
ret, _, _ := procRegSetKeyValue.Call(
|
||||
uintptr(hKey),
|
||||
uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(subKey))),
|
||||
uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(valueName))),
|
||||
uintptr(dwType),
|
||||
data,
|
||||
uintptr(cbData))
|
||||
|
||||
return int(ret)
|
||||
}
|
||||
*/
|
||||
|
||||
func RegEnumKeyEx(hKey HKEY, index uint32) string {
|
||||
var bufLen uint32 = 255
|
||||
buf := make([]uint16, bufLen)
|
||||
procRegEnumKeyEx.Call(
|
||||
uintptr(hKey),
|
||||
uintptr(index),
|
||||
uintptr(unsafe.Pointer(&buf[0])),
|
||||
uintptr(unsafe.Pointer(&bufLen)),
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0)
|
||||
return syscall.UTF16ToString(buf)
|
||||
}
|
||||
|
||||
func OpenEventLog(servername string, sourcename string) HANDLE {
|
||||
ret, _, _ := procOpenEventLog.Call(
|
||||
uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(servername))),
|
||||
uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(sourcename))))
|
||||
|
||||
return HANDLE(ret)
|
||||
}
|
||||
|
||||
func ReadEventLog(eventlog HANDLE, readflags, recordoffset uint32, buffer []byte, numberofbytestoread uint32, bytesread, minnumberofbytesneeded *uint32) bool {
|
||||
ret, _, _ := procReadEventLog.Call(
|
||||
uintptr(eventlog),
|
||||
uintptr(readflags),
|
||||
uintptr(recordoffset),
|
||||
uintptr(unsafe.Pointer(&buffer[0])),
|
||||
uintptr(numberofbytestoread),
|
||||
uintptr(unsafe.Pointer(bytesread)),
|
||||
uintptr(unsafe.Pointer(minnumberofbytesneeded)))
|
||||
|
||||
return ret != 0
|
||||
}
|
||||
|
||||
func CloseEventLog(eventlog HANDLE) bool {
|
||||
ret, _, _ := procCloseEventLog.Call(
|
||||
uintptr(eventlog))
|
||||
|
||||
return ret != 0
|
||||
}
|
||||
|
||||
func OpenSCManager(lpMachineName, lpDatabaseName string, dwDesiredAccess uint32) (HANDLE, error) {
|
||||
var p1, p2 uintptr
|
||||
if len(lpMachineName) > 0 {
|
||||
p1 = uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(lpMachineName)))
|
||||
}
|
||||
if len(lpDatabaseName) > 0 {
|
||||
p2 = uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(lpDatabaseName)))
|
||||
}
|
||||
ret, _, _ := procOpenSCManager.Call(
|
||||
p1,
|
||||
p2,
|
||||
uintptr(dwDesiredAccess))
|
||||
|
||||
if ret == 0 {
|
||||
return 0, syscall.GetLastError()
|
||||
}
|
||||
|
||||
return HANDLE(ret), nil
|
||||
}
|
||||
|
||||
func CloseServiceHandle(hSCObject HANDLE) error {
|
||||
ret, _, _ := procCloseServiceHandle.Call(uintptr(hSCObject))
|
||||
if ret == 0 {
|
||||
return syscall.GetLastError()
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
func OpenService(hSCManager HANDLE, lpServiceName string, dwDesiredAccess uint32) (HANDLE, error) {
|
||||
ret, _, _ := procOpenService.Call(
|
||||
uintptr(hSCManager),
|
||||
uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(lpServiceName))),
|
||||
uintptr(dwDesiredAccess))
|
||||
|
||||
if ret == 0 {
|
||||
return 0, syscall.GetLastError()
|
||||
}
|
||||
|
||||
return HANDLE(ret), nil
|
||||
}
|
||||
|
||||
func StartService(hService HANDLE, lpServiceArgVectors []string) error {
|
||||
l := len(lpServiceArgVectors)
|
||||
var ret uintptr
|
||||
if l == 0 {
|
||||
ret, _, _ = procStartService.Call(
|
||||
uintptr(hService),
|
||||
0,
|
||||
0)
|
||||
} else {
|
||||
lpArgs := make([]uintptr, l)
|
||||
for i := 0; i < l; i++ {
|
||||
lpArgs[i] = uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(lpServiceArgVectors[i])))
|
||||
}
|
||||
|
||||
ret, _, _ = procStartService.Call(
|
||||
uintptr(hService),
|
||||
uintptr(l),
|
||||
uintptr(unsafe.Pointer(&lpArgs[0])))
|
||||
}
|
||||
|
||||
if ret == 0 {
|
||||
return syscall.GetLastError()
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func ControlService(hService HANDLE, dwControl uint32, lpServiceStatus *SERVICE_STATUS) bool {
|
||||
if lpServiceStatus == nil {
|
||||
panic("ControlService:lpServiceStatus cannot be nil")
|
||||
}
|
||||
|
||||
ret, _, _ := procControlService.Call(
|
||||
uintptr(hService),
|
||||
uintptr(dwControl),
|
||||
uintptr(unsafe.Pointer(lpServiceStatus)))
|
||||
|
||||
return ret != 0
|
||||
}
|
||||
|
||||
func ControlTrace(hTrace TRACEHANDLE, lpSessionName string, props *EVENT_TRACE_PROPERTIES, dwControl uint32) (success bool, e error) {
|
||||
|
||||
ret, _, _ := procControlTrace.Call(
|
||||
uintptr(unsafe.Pointer(hTrace)),
|
||||
uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(lpSessionName))),
|
||||
uintptr(unsafe.Pointer(props)),
|
||||
uintptr(dwControl))
|
||||
|
||||
if ret == ERROR_SUCCESS {
|
||||
return true, nil
|
||||
}
|
||||
e = errors.New(fmt.Sprintf("error: 0x%x", ret))
|
||||
return
|
||||
}
|
||||
|
||||
func StartTrace(lpSessionName string, props *EVENT_TRACE_PROPERTIES) (hTrace TRACEHANDLE, e error) {
|
||||
|
||||
ret, _, _ := procStartTrace.Call(
|
||||
uintptr(unsafe.Pointer(&hTrace)),
|
||||
uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(lpSessionName))),
|
||||
uintptr(unsafe.Pointer(props)))
|
||||
|
||||
if ret == ERROR_SUCCESS {
|
||||
return
|
||||
}
|
||||
e = errors.New(fmt.Sprintf("error: 0x%x", ret))
|
||||
return
|
||||
}
|
||||
|
||||
// http://msdn.microsoft.com/en-us/library/windows/desktop/aa378863(v=vs.85).aspx
|
||||
func InitializeSecurityDescriptor(rev uint16) (pSecurityDescriptor *SECURITY_DESCRIPTOR, e error) {
|
||||
|
||||
pSecurityDescriptor = &SECURITY_DESCRIPTOR{}
|
||||
|
||||
ret, _, _ := procInitializeSecurityDescriptor.Call(
|
||||
uintptr(unsafe.Pointer(pSecurityDescriptor)),
|
||||
uintptr(rev),
|
||||
)
|
||||
|
||||
if ret != 0 {
|
||||
return
|
||||
}
|
||||
e = syscall.GetLastError()
|
||||
return
|
||||
}
|
||||
|
||||
// http://msdn.microsoft.com/en-us/library/windows/desktop/aa379583(v=vs.85).aspx
|
||||
func SetSecurityDescriptorDacl(pSecurityDescriptor *SECURITY_DESCRIPTOR, pDacl *ACL) (e error) {
|
||||
|
||||
if pSecurityDescriptor == nil {
|
||||
return errors.New("null descriptor")
|
||||
}
|
||||
|
||||
var ret uintptr
|
||||
if pDacl == nil {
|
||||
ret, _, _ = procSetSecurityDescriptorDacl.Call(
|
||||
uintptr(unsafe.Pointer(pSecurityDescriptor)),
|
||||
uintptr(1), // DaclPresent
|
||||
uintptr(0), // pDacl
|
||||
uintptr(0), // DaclDefaulted
|
||||
)
|
||||
} else {
|
||||
ret, _, _ = procSetSecurityDescriptorDacl.Call(
|
||||
uintptr(unsafe.Pointer(pSecurityDescriptor)),
|
||||
uintptr(1), // DaclPresent
|
||||
uintptr(unsafe.Pointer(pDacl)),
|
||||
uintptr(0), //DaclDefaulted
|
||||
)
|
||||
}
|
||||
|
||||
if ret != 0 {
|
||||
return
|
||||
}
|
||||
e = syscall.GetLastError()
|
||||
return
|
||||
}
|
|
@ -1,300 +0,0 @@
|
|||
package w32
|
||||
|
||||
// Registry predefined keys
|
||||
const (
|
||||
HKEY_CLASSES_ROOT HKEY = 0x80000000
|
||||
HKEY_CURRENT_USER HKEY = 0x80000001
|
||||
HKEY_LOCAL_MACHINE HKEY = 0x80000002
|
||||
HKEY_USERS HKEY = 0x80000003
|
||||
HKEY_PERFORMANCE_DATA HKEY = 0x80000004
|
||||
HKEY_CURRENT_CONFIG HKEY = 0x80000005
|
||||
HKEY_DYN_DATA HKEY = 0x80000006
|
||||
)
|
||||
|
||||
// Registry Key Security and Access Rights
|
||||
const (
|
||||
KEY_ALL_ACCESS = 0xF003F
|
||||
KEY_CREATE_SUB_KEY = 0x0004
|
||||
KEY_ENUMERATE_SUB_KEYS = 0x0008
|
||||
KEY_NOTIFY = 0x0010
|
||||
KEY_QUERY_VALUE = 0x0001
|
||||
KEY_SET_VALUE = 0x0002
|
||||
KEY_READ = 0x20019
|
||||
KEY_WRITE = 0x20006
|
||||
)
|
||||
|
||||
const (
|
||||
NFR_ANSI = 1
|
||||
NFR_UNICODE = 2
|
||||
NF_QUERY = 3
|
||||
NF_REQUERY = 4
|
||||
)
|
||||
|
||||
// Registry value types
|
||||
const (
|
||||
RRF_RT_REG_NONE = 0x00000001
|
||||
RRF_RT_REG_SZ = 0x00000002
|
||||
RRF_RT_REG_EXPAND_SZ = 0x00000004
|
||||
RRF_RT_REG_BINARY = 0x00000008
|
||||
RRF_RT_REG_DWORD = 0x00000010
|
||||
RRF_RT_REG_MULTI_SZ = 0x00000020
|
||||
RRF_RT_REG_QWORD = 0x00000040
|
||||
RRF_RT_DWORD = (RRF_RT_REG_BINARY | RRF_RT_REG_DWORD)
|
||||
RRF_RT_QWORD = (RRF_RT_REG_BINARY | RRF_RT_REG_QWORD)
|
||||
RRF_RT_ANY = 0x0000ffff
|
||||
RRF_NOEXPAND = 0x10000000
|
||||
RRF_ZEROONFAILURE = 0x20000000
|
||||
REG_PROCESS_APPKEY = 0x00000001
|
||||
REG_MUI_STRING_TRUNCATE = 0x00000001
|
||||
)
|
||||
|
||||
// Service Control Manager object specific access types
|
||||
const (
|
||||
SC_MANAGER_CONNECT = 0x0001
|
||||
SC_MANAGER_CREATE_SERVICE = 0x0002
|
||||
SC_MANAGER_ENUMERATE_SERVICE = 0x0004
|
||||
SC_MANAGER_LOCK = 0x0008
|
||||
SC_MANAGER_QUERY_LOCK_STATUS = 0x0010
|
||||
SC_MANAGER_MODIFY_BOOT_CONFIG = 0x0020
|
||||
SC_MANAGER_ALL_ACCESS = STANDARD_RIGHTS_REQUIRED | SC_MANAGER_CONNECT | SC_MANAGER_CREATE_SERVICE | SC_MANAGER_ENUMERATE_SERVICE | SC_MANAGER_LOCK | SC_MANAGER_QUERY_LOCK_STATUS | SC_MANAGER_MODIFY_BOOT_CONFIG
|
||||
)
|
||||
|
||||
// Service Types (Bit Mask)
|
||||
const (
|
||||
SERVICE_KERNEL_DRIVER = 0x00000001
|
||||
SERVICE_FILE_SYSTEM_DRIVER = 0x00000002
|
||||
SERVICE_ADAPTER = 0x00000004
|
||||
SERVICE_RECOGNIZER_DRIVER = 0x00000008
|
||||
SERVICE_DRIVER = SERVICE_KERNEL_DRIVER | SERVICE_FILE_SYSTEM_DRIVER | SERVICE_RECOGNIZER_DRIVER
|
||||
SERVICE_WIN32_OWN_PROCESS = 0x00000010
|
||||
SERVICE_WIN32_SHARE_PROCESS = 0x00000020
|
||||
SERVICE_WIN32 = SERVICE_WIN32_OWN_PROCESS | SERVICE_WIN32_SHARE_PROCESS
|
||||
SERVICE_INTERACTIVE_PROCESS = 0x00000100
|
||||
SERVICE_TYPE_ALL = SERVICE_WIN32 | SERVICE_ADAPTER | SERVICE_DRIVER | SERVICE_INTERACTIVE_PROCESS
|
||||
)
|
||||
|
||||
// Service State -- for CurrentState
|
||||
const (
|
||||
SERVICE_STOPPED = 0x00000001
|
||||
SERVICE_START_PENDING = 0x00000002
|
||||
SERVICE_STOP_PENDING = 0x00000003
|
||||
SERVICE_RUNNING = 0x00000004
|
||||
SERVICE_CONTINUE_PENDING = 0x00000005
|
||||
SERVICE_PAUSE_PENDING = 0x00000006
|
||||
SERVICE_PAUSED = 0x00000007
|
||||
)
|
||||
|
||||
// Controls Accepted (Bit Mask)
|
||||
const (
|
||||
SERVICE_ACCEPT_STOP = 0x00000001
|
||||
SERVICE_ACCEPT_PAUSE_CONTINUE = 0x00000002
|
||||
SERVICE_ACCEPT_SHUTDOWN = 0x00000004
|
||||
SERVICE_ACCEPT_PARAMCHANGE = 0x00000008
|
||||
SERVICE_ACCEPT_NETBINDCHANGE = 0x00000010
|
||||
SERVICE_ACCEPT_HARDWAREPROFILECHANGE = 0x00000020
|
||||
SERVICE_ACCEPT_POWEREVENT = 0x00000040
|
||||
SERVICE_ACCEPT_SESSIONCHANGE = 0x00000080
|
||||
SERVICE_ACCEPT_PRESHUTDOWN = 0x00000100
|
||||
SERVICE_ACCEPT_TIMECHANGE = 0x00000200
|
||||
SERVICE_ACCEPT_TRIGGEREVENT = 0x00000400
|
||||
)
|
||||
|
||||
// Service object specific access type
|
||||
const (
|
||||
SERVICE_QUERY_CONFIG = 0x0001
|
||||
SERVICE_CHANGE_CONFIG = 0x0002
|
||||
SERVICE_QUERY_STATUS = 0x0004
|
||||
SERVICE_ENUMERATE_DEPENDENTS = 0x0008
|
||||
SERVICE_START = 0x0010
|
||||
SERVICE_STOP = 0x0020
|
||||
SERVICE_PAUSE_CONTINUE = 0x0040
|
||||
SERVICE_INTERROGATE = 0x0080
|
||||
SERVICE_USER_DEFINED_CONTROL = 0x0100
|
||||
|
||||
SERVICE_ALL_ACCESS = STANDARD_RIGHTS_REQUIRED |
|
||||
SERVICE_QUERY_CONFIG |
|
||||
SERVICE_CHANGE_CONFIG |
|
||||
SERVICE_QUERY_STATUS |
|
||||
SERVICE_ENUMERATE_DEPENDENTS |
|
||||
SERVICE_START |
|
||||
SERVICE_STOP |
|
||||
SERVICE_PAUSE_CONTINUE |
|
||||
SERVICE_INTERROGATE |
|
||||
SERVICE_USER_DEFINED_CONTROL
|
||||
)
|
||||
|
||||
const (
|
||||
KERNEL_LOGGER_NAME = "NT Kernel Logger"
|
||||
)
|
||||
|
||||
// WNODE flags, for ETW (Event Tracing for Windows) / WMI
|
||||
const (
|
||||
WNODE_FLAG_ALL_DATA = 0x00000001
|
||||
WNODE_FLAG_SINGLE_INSTANCE = 0x00000002
|
||||
WNODE_FLAG_SINGLE_ITEM = 0x00000004
|
||||
WNODE_FLAG_EVENT_ITEM = 0x00000008
|
||||
WNODE_FLAG_FIXED_INSTANCE_SIZE = 0x00000010
|
||||
WNODE_FLAG_TOO_SMALL = 0x00000020
|
||||
WNODE_FLAG_INSTANCES_SAME = 0x00000040
|
||||
WNODE_FLAG_STATIC_INSTANCE_NAMES = 0x00000080
|
||||
WNODE_FLAG_INTERNAL = 0x00000100
|
||||
WNODE_FLAG_USE_TIMESTAMP = 0x00000200
|
||||
WNODE_FLAG_PERSIST_EVENT = 0x00000400
|
||||
WNODE_FLAG_EVENT_REFERENCE = 0x00002000
|
||||
WNODE_FLAG_ANSI_INSTANCENAMES = 0x00004000
|
||||
WNODE_FLAG_METHOD_ITEM = 0x00008000
|
||||
WNODE_FLAG_PDO_INSTANCE_NAMES = 0x00010000
|
||||
WNODE_FLAG_TRACED_GUID = 0x00020000
|
||||
WNODE_FLAG_LOG_WNODE = 0x00040000
|
||||
WNODE_FLAG_USE_GUID_PTR = 0x00080000
|
||||
WNODE_FLAG_USE_MOF_PTR = 0x00100000
|
||||
WNODE_FLAG_NO_HEADER = 0x00200000
|
||||
WNODE_FLAG_SEVERITY_MASK = 0xff000000
|
||||
)
|
||||
|
||||
// ETW flags and types etc
|
||||
const (
|
||||
EVENT_TRACE_TYPE_INFO = 0x00
|
||||
EVENT_TRACE_TYPE_START = 0x01
|
||||
EVENT_TRACE_TYPE_END = 0x02
|
||||
EVENT_TRACE_TYPE_STOP = 0x02
|
||||
EVENT_TRACE_TYPE_DC_START = 0x03
|
||||
EVENT_TRACE_TYPE_DC_END = 0x04
|
||||
EVENT_TRACE_TYPE_EXTENSION = 0x05
|
||||
EVENT_TRACE_TYPE_REPLY = 0x06
|
||||
EVENT_TRACE_TYPE_DEQUEUE = 0x07
|
||||
EVENT_TRACE_TYPE_RESUME = 0x07
|
||||
EVENT_TRACE_TYPE_CHECKPOINT = 0x08
|
||||
EVENT_TRACE_TYPE_SUSPEND = 0x08
|
||||
EVENT_TRACE_TYPE_WINEVT_SEND = 0x09
|
||||
EVENT_TRACE_TYPE_WINEVT_RECEIVE = 0XF0
|
||||
TRACE_LEVEL_NONE = 0
|
||||
TRACE_LEVEL_CRITICAL = 1
|
||||
TRACE_LEVEL_FATAL = 1
|
||||
TRACE_LEVEL_ERROR = 2
|
||||
TRACE_LEVEL_WARNING = 3
|
||||
TRACE_LEVEL_INFORMATION = 4
|
||||
TRACE_LEVEL_VERBOSE = 5
|
||||
TRACE_LEVEL_RESERVED6 = 6
|
||||
TRACE_LEVEL_RESERVED7 = 7
|
||||
TRACE_LEVEL_RESERVED8 = 8
|
||||
TRACE_LEVEL_RESERVED9 = 9
|
||||
EVENT_TRACE_TYPE_LOAD = 0x0A
|
||||
EVENT_TRACE_TYPE_IO_READ = 0x0A
|
||||
EVENT_TRACE_TYPE_IO_WRITE = 0x0B
|
||||
EVENT_TRACE_TYPE_IO_READ_INIT = 0x0C
|
||||
EVENT_TRACE_TYPE_IO_WRITE_INIT = 0x0D
|
||||
EVENT_TRACE_TYPE_IO_FLUSH = 0x0E
|
||||
EVENT_TRACE_TYPE_IO_FLUSH_INIT = 0x0F
|
||||
EVENT_TRACE_TYPE_MM_TF = 0x0A
|
||||
EVENT_TRACE_TYPE_MM_DZF = 0x0B
|
||||
EVENT_TRACE_TYPE_MM_COW = 0x0C
|
||||
EVENT_TRACE_TYPE_MM_GPF = 0x0D
|
||||
EVENT_TRACE_TYPE_MM_HPF = 0x0E
|
||||
EVENT_TRACE_TYPE_MM_AV = 0x0F
|
||||
EVENT_TRACE_TYPE_SEND = 0x0A
|
||||
EVENT_TRACE_TYPE_RECEIVE = 0x0B
|
||||
EVENT_TRACE_TYPE_CONNECT = 0x0C
|
||||
EVENT_TRACE_TYPE_DISCONNECT = 0x0D
|
||||
EVENT_TRACE_TYPE_RETRANSMIT = 0x0E
|
||||
EVENT_TRACE_TYPE_ACCEPT = 0x0F
|
||||
EVENT_TRACE_TYPE_RECONNECT = 0x10
|
||||
EVENT_TRACE_TYPE_CONNFAIL = 0x11
|
||||
EVENT_TRACE_TYPE_COPY_TCP = 0x12
|
||||
EVENT_TRACE_TYPE_COPY_ARP = 0x13
|
||||
EVENT_TRACE_TYPE_ACKFULL = 0x14
|
||||
EVENT_TRACE_TYPE_ACKPART = 0x15
|
||||
EVENT_TRACE_TYPE_ACKDUP = 0x16
|
||||
EVENT_TRACE_TYPE_GUIDMAP = 0x0A
|
||||
EVENT_TRACE_TYPE_CONFIG = 0x0B
|
||||
EVENT_TRACE_TYPE_SIDINFO = 0x0C
|
||||
EVENT_TRACE_TYPE_SECURITY = 0x0D
|
||||
EVENT_TRACE_TYPE_REGCREATE = 0x0A
|
||||
EVENT_TRACE_TYPE_REGOPEN = 0x0B
|
||||
EVENT_TRACE_TYPE_REGDELETE = 0x0C
|
||||
EVENT_TRACE_TYPE_REGQUERY = 0x0D
|
||||
EVENT_TRACE_TYPE_REGSETVALUE = 0x0E
|
||||
EVENT_TRACE_TYPE_REGDELETEVALUE = 0x0F
|
||||
EVENT_TRACE_TYPE_REGQUERYVALUE = 0x10
|
||||
EVENT_TRACE_TYPE_REGENUMERATEKEY = 0x11
|
||||
EVENT_TRACE_TYPE_REGENUMERATEVALUEKEY = 0x12
|
||||
EVENT_TRACE_TYPE_REGQUERYMULTIPLEVALUE = 0x13
|
||||
EVENT_TRACE_TYPE_REGSETINFORMATION = 0x14
|
||||
EVENT_TRACE_TYPE_REGFLUSH = 0x15
|
||||
EVENT_TRACE_TYPE_REGKCBCREATE = 0x16
|
||||
EVENT_TRACE_TYPE_REGKCBDELETE = 0x17
|
||||
EVENT_TRACE_TYPE_REGKCBRUNDOWNBEGIN = 0x18
|
||||
EVENT_TRACE_TYPE_REGKCBRUNDOWNEND = 0x19
|
||||
EVENT_TRACE_TYPE_REGVIRTUALIZE = 0x1A
|
||||
EVENT_TRACE_TYPE_REGCLOSE = 0x1B
|
||||
EVENT_TRACE_TYPE_REGSETSECURITY = 0x1C
|
||||
EVENT_TRACE_TYPE_REGQUERYSECURITY = 0x1D
|
||||
EVENT_TRACE_TYPE_REGCOMMIT = 0x1E
|
||||
EVENT_TRACE_TYPE_REGPREPARE = 0x1F
|
||||
EVENT_TRACE_TYPE_REGROLLBACK = 0x20
|
||||
EVENT_TRACE_TYPE_REGMOUNTHIVE = 0x21
|
||||
EVENT_TRACE_TYPE_CONFIG_CPU = 0x0A
|
||||
EVENT_TRACE_TYPE_CONFIG_PHYSICALDISK = 0x0B
|
||||
EVENT_TRACE_TYPE_CONFIG_LOGICALDISK = 0x0C
|
||||
EVENT_TRACE_TYPE_CONFIG_NIC = 0x0D
|
||||
EVENT_TRACE_TYPE_CONFIG_VIDEO = 0x0E
|
||||
EVENT_TRACE_TYPE_CONFIG_SERVICES = 0x0F
|
||||
EVENT_TRACE_TYPE_CONFIG_POWER = 0x10
|
||||
EVENT_TRACE_TYPE_CONFIG_NETINFO = 0x11
|
||||
EVENT_TRACE_TYPE_CONFIG_IRQ = 0x15
|
||||
EVENT_TRACE_TYPE_CONFIG_PNP = 0x16
|
||||
EVENT_TRACE_TYPE_CONFIG_IDECHANNEL = 0x17
|
||||
EVENT_TRACE_TYPE_CONFIG_PLATFORM = 0x19
|
||||
EVENT_TRACE_FLAG_PROCESS = 0x00000001
|
||||
EVENT_TRACE_FLAG_THREAD = 0x00000002
|
||||
EVENT_TRACE_FLAG_IMAGE_LOAD = 0x00000004
|
||||
EVENT_TRACE_FLAG_DISK_IO = 0x00000100
|
||||
EVENT_TRACE_FLAG_DISK_FILE_IO = 0x00000200
|
||||
EVENT_TRACE_FLAG_MEMORY_PAGE_FAULTS = 0x00001000
|
||||
EVENT_TRACE_FLAG_MEMORY_HARD_FAULTS = 0x00002000
|
||||
EVENT_TRACE_FLAG_NETWORK_TCPIP = 0x00010000
|
||||
EVENT_TRACE_FLAG_REGISTRY = 0x00020000
|
||||
EVENT_TRACE_FLAG_DBGPRINT = 0x00040000
|
||||
EVENT_TRACE_FLAG_PROCESS_COUNTERS = 0x00000008
|
||||
EVENT_TRACE_FLAG_CSWITCH = 0x00000010
|
||||
EVENT_TRACE_FLAG_DPC = 0x00000020
|
||||
EVENT_TRACE_FLAG_INTERRUPT = 0x00000040
|
||||
EVENT_TRACE_FLAG_SYSTEMCALL = 0x00000080
|
||||
EVENT_TRACE_FLAG_DISK_IO_INIT = 0x00000400
|
||||
EVENT_TRACE_FLAG_ALPC = 0x00100000
|
||||
EVENT_TRACE_FLAG_SPLIT_IO = 0x00200000
|
||||
EVENT_TRACE_FLAG_DRIVER = 0x00800000
|
||||
EVENT_TRACE_FLAG_PROFILE = 0x01000000
|
||||
EVENT_TRACE_FLAG_FILE_IO = 0x02000000
|
||||
EVENT_TRACE_FLAG_FILE_IO_INIT = 0x04000000
|
||||
EVENT_TRACE_FLAG_DISPATCHER = 0x00000800
|
||||
EVENT_TRACE_FLAG_VIRTUAL_ALLOC = 0x00004000
|
||||
EVENT_TRACE_FLAG_EXTENSION = 0x80000000
|
||||
EVENT_TRACE_FLAG_FORWARD_WMI = 0x40000000
|
||||
EVENT_TRACE_FLAG_ENABLE_RESERVE = 0x20000000
|
||||
EVENT_TRACE_FILE_MODE_NONE = 0x00000000
|
||||
EVENT_TRACE_FILE_MODE_SEQUENTIAL = 0x00000001
|
||||
EVENT_TRACE_FILE_MODE_CIRCULAR = 0x00000002
|
||||
EVENT_TRACE_FILE_MODE_APPEND = 0x00000004
|
||||
EVENT_TRACE_REAL_TIME_MODE = 0x00000100
|
||||
EVENT_TRACE_DELAY_OPEN_FILE_MODE = 0x00000200
|
||||
EVENT_TRACE_BUFFERING_MODE = 0x00000400
|
||||
EVENT_TRACE_PRIVATE_LOGGER_MODE = 0x00000800
|
||||
EVENT_TRACE_ADD_HEADER_MODE = 0x00001000
|
||||
EVENT_TRACE_USE_GLOBAL_SEQUENCE = 0x00004000
|
||||
EVENT_TRACE_USE_LOCAL_SEQUENCE = 0x00008000
|
||||
EVENT_TRACE_RELOG_MODE = 0x00010000
|
||||
EVENT_TRACE_USE_PAGED_MEMORY = 0x01000000
|
||||
EVENT_TRACE_FILE_MODE_NEWFILE = 0x00000008
|
||||
EVENT_TRACE_FILE_MODE_PREALLOCATE = 0x00000020
|
||||
EVENT_TRACE_NONSTOPPABLE_MODE = 0x00000040
|
||||
EVENT_TRACE_SECURE_MODE = 0x00000080
|
||||
EVENT_TRACE_USE_KBYTES_FOR_SIZE = 0x00002000
|
||||
EVENT_TRACE_PRIVATE_IN_PROC = 0x00020000
|
||||
EVENT_TRACE_MODE_RESERVED = 0x00100000
|
||||
EVENT_TRACE_NO_PER_PROCESSOR_BUFFERING = 0x10000000
|
||||
EVENT_TRACE_CONTROL_QUERY = 0
|
||||
EVENT_TRACE_CONTROL_STOP = 1
|
||||
EVENT_TRACE_CONTROL_UPDATE = 2
|
||||
EVENT_TRACE_CONTROL_FLUSH = 3
|
||||
)
|
|
@ -1,41 +0,0 @@
|
|||
package w32
|
||||
|
||||
import (
|
||||
"testing"
|
||||
)
|
||||
|
||||
func TestInitializeSecurityDescriptor(t *testing.T) {
|
||||
sd, err := InitializeSecurityDescriptor(1)
|
||||
if err != nil {
|
||||
t.Errorf("Failed: %v", err)
|
||||
}
|
||||
t.Logf("SD:\n%#v\n", *sd)
|
||||
}
|
||||
|
||||
func TestSetSecurityDescriptorDacl(t *testing.T) {
|
||||
|
||||
sd, err := InitializeSecurityDescriptor(1)
|
||||
if err != nil {
|
||||
t.Errorf("Failed to initialize: %v", err)
|
||||
}
|
||||
err = SetSecurityDescriptorDacl(sd, nil)
|
||||
if err != nil {
|
||||
t.Errorf("Failed to set NULL DACL: %v", err)
|
||||
}
|
||||
t.Logf("[OK] Set NULL DACL")
|
||||
|
||||
empty := &ACL{
|
||||
AclRevision: 4,
|
||||
Sbz1: 0,
|
||||
AclSize: 4,
|
||||
AceCount: 0,
|
||||
Sbz2: 0,
|
||||
}
|
||||
err = SetSecurityDescriptorDacl(sd, empty)
|
||||
if err != nil {
|
||||
t.Errorf("Failed to set empty DACL: %v", err)
|
||||
}
|
||||
t.Logf("[OK] Set empty DACL")
|
||||
t.Logf("SD:\n%#v\n", *sd)
|
||||
|
||||
}
|
|
@ -1,122 +0,0 @@
|
|||
package w32
|
||||
|
||||
// http://msdn.microsoft.com/en-us/library/windows/desktop/aa374931(v=vs.85).aspx
|
||||
type ACL struct {
|
||||
AclRevision byte
|
||||
Sbz1 byte
|
||||
AclSize uint16
|
||||
AceCount uint16
|
||||
Sbz2 uint16
|
||||
}
|
||||
|
||||
// http://msdn.microsoft.com/en-us/library/windows/desktop/aa379561(v=vs.85).aspx
|
||||
|
||||
type SECURITY_DESCRIPTOR_CONTROL uint16
|
||||
|
||||
type SECURITY_DESCRIPTOR struct {
|
||||
Revision byte
|
||||
Sbz1 byte
|
||||
Control SECURITY_DESCRIPTOR_CONTROL
|
||||
Owner uintptr
|
||||
Group uintptr
|
||||
Sacl *ACL
|
||||
Dacl *ACL
|
||||
}
|
||||
|
||||
type SID_IDENTIFIER_AUTHORITY struct {
|
||||
Value [6]byte
|
||||
}
|
||||
|
||||
// typedef struct _SID // 4 elements, 0xC bytes (sizeof)
|
||||
// {
|
||||
// /*0x000*/ UINT8 Revision;
|
||||
// /*0x001*/ UINT8 SubAuthorityCount;
|
||||
// /*0x002*/ struct _SID_IDENTIFIER_AUTHORITY IdentifierAuthority; // 1 elements, 0x6 bytes (sizeof)
|
||||
// /*0x008*/ ULONG32 SubAuthority[1];
|
||||
// }SID, *PSID;
|
||||
type SID struct {
|
||||
Revision byte
|
||||
SubAuthorityCount byte
|
||||
IdentifierAuthority SID_IDENTIFIER_AUTHORITY
|
||||
SubAuthority uint32
|
||||
}
|
||||
|
||||
// http://msdn.microsoft.com/en-us/library/windows/desktop/aa363646.aspx
|
||||
type EVENTLOGRECORD struct {
|
||||
Length uint32
|
||||
Reserved uint32
|
||||
RecordNumber uint32
|
||||
TimeGenerated uint32
|
||||
TimeWritten uint32
|
||||
EventID uint32
|
||||
EventType uint16
|
||||
NumStrings uint16
|
||||
EventCategory uint16
|
||||
ReservedFlags uint16
|
||||
ClosingRecordNumber uint32
|
||||
StringOffset uint32
|
||||
UserSidLength uint32
|
||||
UserSidOffset uint32
|
||||
DataLength uint32
|
||||
DataOffset uint32
|
||||
}
|
||||
|
||||
// http://msdn.microsoft.com/en-us/library/windows/desktop/ms685996.aspx
|
||||
type SERVICE_STATUS struct {
|
||||
DwServiceType uint32
|
||||
DwCurrentState uint32
|
||||
DwControlsAccepted uint32
|
||||
DwWin32ExitCode uint32
|
||||
DwServiceSpecificExitCode uint32
|
||||
DwCheckPoint uint32
|
||||
DwWaitHint uint32
|
||||
}
|
||||
|
||||
// http://msdn.microsoft.com/en-us/library/windows/desktop/aa364160(v=vs.85).aspx
|
||||
type WNODE_HEADER struct {
|
||||
BufferSize uint32
|
||||
ProviderId uint32
|
||||
HistoricalContext uint64
|
||||
KernelHandle HANDLE
|
||||
Guid GUID
|
||||
ClientContext uint32
|
||||
Flags uint32
|
||||
}
|
||||
|
||||
// These partially compensate for the anonymous unions we removed, but there
|
||||
// are no setters.
|
||||
func (w WNODE_HEADER) TimeStamp() uint64 {
|
||||
// TODO: Cast to the stupid LARGE_INTEGER struct which is, itself, nasty
|
||||
// and union-y
|
||||
return uint64(w.KernelHandle)
|
||||
}
|
||||
|
||||
func (w WNODE_HEADER) Version() uint32 {
|
||||
return uint32(w.HistoricalContext >> 32)
|
||||
}
|
||||
|
||||
func (w WNODE_HEADER) Linkage() uint32 {
|
||||
return uint32(w.HistoricalContext)
|
||||
}
|
||||
|
||||
// http://msdn.microsoft.com/en-us/library/windows/desktop/aa363784(v=vs.85).aspx
|
||||
type EVENT_TRACE_PROPERTIES struct {
|
||||
Wnode WNODE_HEADER
|
||||
BufferSize uint32
|
||||
MinimumBuffers uint32
|
||||
MaximumBuffers uint32
|
||||
MaximumFileSize uint32
|
||||
LogFileMode uint32
|
||||
FlushTimer uint32
|
||||
EnableFlags uint32
|
||||
AgeLimit int32
|
||||
NumberOfBuffers uint32
|
||||
FreeBuffers uint32
|
||||
EventsLost uint32
|
||||
BuffersWritten uint32
|
||||
LogBuffersLost uint32
|
||||
RealTimeBuffersLost uint32
|
||||
LoggerThreadId HANDLE
|
||||
LogFileNameOffset uint32
|
||||
LoggerNameOffset uint32
|
||||
}
|
|
@ -1,304 +0,0 @@
|
|||
// Copyright 2010-2012 The W32 Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
package w32
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
// "github.com/davecgh/go-spew/spew"
|
||||
"syscall"
|
||||
"unsafe"
|
||||
)
|
||||
|
||||
var (
|
||||
modntdll = syscall.NewLazyDLL("ntdll.dll")
|
||||
|
||||
procAlpcGetMessageAttribute = modntdll.NewProc("AlpcGetMessageAttribute")
|
||||
procNtAlpcAcceptConnectPort = modntdll.NewProc("NtAlpcAcceptConnectPort")
|
||||
procNtAlpcCancelMessage = modntdll.NewProc("NtAlpcCancelMessage")
|
||||
procNtAlpcConnectPort = modntdll.NewProc("NtAlpcConnectPort")
|
||||
procNtAlpcCreatePort = modntdll.NewProc("NtAlpcCreatePort")
|
||||
procNtAlpcDisconnectPort = modntdll.NewProc("NtAlpcDisconnectPort")
|
||||
procNtAlpcSendWaitReceivePort = modntdll.NewProc("NtAlpcSendWaitReceivePort")
|
||||
procRtlCreateUnicodeStringFromAsciiz = modntdll.NewProc("RtlCreateUnicodeStringFromAsciiz")
|
||||
)
|
||||
|
||||
//func RtlCreateUnicodeStringFromAsciiz(s string) (us UNICODE_STRING, e error) {
|
||||
//
|
||||
// cs := C.CString(s)
|
||||
// defer C.free(unsafe.Pointer(cs))
|
||||
//
|
||||
// ret, _, lastErr := procRtlCreateUnicodeStringFromAsciiz.Call(
|
||||
// uintptr(unsafe.Pointer(&us)),
|
||||
// uintptr(unsafe.Pointer(cs)),
|
||||
// )
|
||||
//
|
||||
// if ret != 1 { // ret is a BOOL ( I think )
|
||||
// e = lastErr
|
||||
// }
|
||||
//
|
||||
// return
|
||||
//}
|
||||
|
||||
//func newUnicodeString(s string) (us UNICODE_STRING, e error) {
|
||||
// // TODO probably not the most efficient way to do this, but I couldn't
|
||||
// // work out how to manually initialize the UNICODE_STRING struct in a way
|
||||
// // that the ALPC subsystem liked.
|
||||
// us, e = RtlCreateUnicodeStringFromAsciiz(s)
|
||||
// return
|
||||
//}
|
||||
|
||||
// (this is a macro)
|
||||
// VOID InitializeObjectAttributes(
|
||||
// [out] POBJECT_ATTRIBUTES InitializedAttributes,
|
||||
// [in] PUNICODE_STRING ObjectName,
|
||||
// [in] ULONG Attributes,
|
||||
// [in] HANDLE RootDirectory,
|
||||
// [in, optional] PSECURITY_DESCRIPTOR SecurityDescriptor
|
||||
// )
|
||||
//func InitializeObjectAttributes(
|
||||
// name string,
|
||||
// attributes uint32,
|
||||
// rootDir HANDLE,
|
||||
// pSecurityDescriptor *SECURITY_DESCRIPTOR,
|
||||
//) (oa OBJECT_ATTRIBUTES, e error) {
|
||||
//
|
||||
// oa = OBJECT_ATTRIBUTES{
|
||||
// RootDirectory: rootDir,
|
||||
// Attributes: attributes,
|
||||
// SecurityDescriptor: pSecurityDescriptor,
|
||||
// }
|
||||
// oa.Length = uint32(unsafe.Sizeof(oa))
|
||||
//
|
||||
// if len(name) > 0 {
|
||||
// us, err := newUnicodeString(name)
|
||||
// if err != nil {
|
||||
// e = err
|
||||
// return
|
||||
// }
|
||||
// oa.ObjectName = &us
|
||||
// }
|
||||
//
|
||||
// return
|
||||
//}
|
||||
|
||||
// NTSTATUS
|
||||
// NtAlpcCreatePort(
|
||||
// __out PHANDLE PortHandle,
|
||||
// __in POBJECT_ATTRIBUTES ObjectAttributes,
|
||||
// __in_opt PALPC_PORT_ATTRIBUTES PortAttributes
|
||||
// );
|
||||
func NtAlpcCreatePort(pObjectAttributes *OBJECT_ATTRIBUTES, pPortAttributes *ALPC_PORT_ATTRIBUTES) (hPort HANDLE, e error) {
|
||||
|
||||
ret, _, _ := procNtAlpcCreatePort.Call(
|
||||
uintptr(unsafe.Pointer(&hPort)),
|
||||
uintptr(unsafe.Pointer(pObjectAttributes)),
|
||||
uintptr(unsafe.Pointer(pPortAttributes)),
|
||||
)
|
||||
|
||||
if ret != ERROR_SUCCESS {
|
||||
return hPort, fmt.Errorf("0x%x", ret)
|
||||
}
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
// NTSTATUS
|
||||
// NtAlpcConnectPort(
|
||||
// __out PHANDLE PortHandle,
|
||||
// __in PUNICODE_STRING PortName,
|
||||
// __in POBJECT_ATTRIBUTES ObjectAttributes,
|
||||
// __in_opt PALPC_PORT_ATTRIBUTES PortAttributes,
|
||||
// __in ULONG Flags,
|
||||
// __in_opt PSID RequiredServerSid,
|
||||
// __inout PPORT_MESSAGE ConnectionMessage,
|
||||
// __inout_opt PULONG BufferLength,
|
||||
// __inout_opt PALPC_MESSAGE_ATTRIBUTES OutMessageAttributes,
|
||||
// __inout_opt PALPC_MESSAGE_ATTRIBUTES InMessageAttributes,
|
||||
// __in_opt PLARGE_INTEGER Timeout
|
||||
// );
|
||||
//func NtAlpcConnectPort(
|
||||
// destPort string,
|
||||
// pClientObjAttrs *OBJECT_ATTRIBUTES,
|
||||
// pClientAlpcPortAttrs *ALPC_PORT_ATTRIBUTES,
|
||||
// flags uint32,
|
||||
// pRequiredServerSid *SID,
|
||||
// pConnMsg *AlpcShortMessage,
|
||||
// pBufLen *uint32,
|
||||
// pOutMsgAttrs *ALPC_MESSAGE_ATTRIBUTES,
|
||||
// pInMsgAttrs *ALPC_MESSAGE_ATTRIBUTES,
|
||||
// timeout *int64,
|
||||
//) (hPort HANDLE, e error) {
|
||||
//
|
||||
// destPortU, e := newUnicodeString(destPort)
|
||||
// if e != nil {
|
||||
// return
|
||||
// }
|
||||
//
|
||||
// ret, _, _ := procNtAlpcConnectPort.Call(
|
||||
// uintptr(unsafe.Pointer(&hPort)),
|
||||
// uintptr(unsafe.Pointer(&destPortU)),
|
||||
// uintptr(unsafe.Pointer(pClientObjAttrs)),
|
||||
// uintptr(unsafe.Pointer(pClientAlpcPortAttrs)),
|
||||
// uintptr(flags),
|
||||
// uintptr(unsafe.Pointer(pRequiredServerSid)),
|
||||
// uintptr(unsafe.Pointer(pConnMsg)),
|
||||
// uintptr(unsafe.Pointer(pBufLen)),
|
||||
// uintptr(unsafe.Pointer(pOutMsgAttrs)),
|
||||
// uintptr(unsafe.Pointer(pInMsgAttrs)),
|
||||
// uintptr(unsafe.Pointer(timeout)),
|
||||
// )
|
||||
//
|
||||
// if ret != ERROR_SUCCESS {
|
||||
// e = fmt.Errorf("0x%x", ret)
|
||||
// }
|
||||
// return
|
||||
//}
|
||||
|
||||
// NTSTATUS
|
||||
// NtAlpcAcceptConnectPort(
|
||||
// __out PHANDLE PortHandle,
|
||||
// __in HANDLE ConnectionPortHandle,
|
||||
// __in ULONG Flags,
|
||||
// __in POBJECT_ATTRIBUTES ObjectAttributes,
|
||||
// __in PALPC_PORT_ATTRIBUTES PortAttributes,
|
||||
// __in_opt PVOID PortContext,
|
||||
// __in PPORT_MESSAGE ConnectionRequest,
|
||||
// __inout_opt PALPC_MESSAGE_ATTRIBUTES ConnectionMessageAttributes,
|
||||
// __in BOOLEAN AcceptConnection
|
||||
// );
|
||||
func NtAlpcAcceptConnectPort(
|
||||
hSrvConnPort HANDLE,
|
||||
flags uint32,
|
||||
pObjAttr *OBJECT_ATTRIBUTES,
|
||||
pPortAttr *ALPC_PORT_ATTRIBUTES,
|
||||
pContext *AlpcPortContext,
|
||||
pConnReq *AlpcShortMessage,
|
||||
pConnMsgAttrs *ALPC_MESSAGE_ATTRIBUTES,
|
||||
accept uintptr,
|
||||
) (hPort HANDLE, e error) {
|
||||
|
||||
ret, _, _ := procNtAlpcAcceptConnectPort.Call(
|
||||
uintptr(unsafe.Pointer(&hPort)),
|
||||
uintptr(hSrvConnPort),
|
||||
uintptr(flags),
|
||||
uintptr(unsafe.Pointer(pObjAttr)),
|
||||
uintptr(unsafe.Pointer(pPortAttr)),
|
||||
uintptr(unsafe.Pointer(pContext)),
|
||||
uintptr(unsafe.Pointer(pConnReq)),
|
||||
uintptr(unsafe.Pointer(pConnMsgAttrs)),
|
||||
accept,
|
||||
)
|
||||
|
||||
if ret != ERROR_SUCCESS {
|
||||
e = fmt.Errorf("0x%x", ret)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// NTSTATUS
|
||||
// NtAlpcSendWaitReceivePort(
|
||||
// __in HANDLE PortHandle,
|
||||
// __in ULONG Flags,
|
||||
// __in_opt PPORT_MESSAGE SendMessage,
|
||||
// __in_opt PALPC_MESSAGE_ATTRIBUTES SendMessageAttributes,
|
||||
// __inout_opt PPORT_MESSAGE ReceiveMessage,
|
||||
// __inout_opt PULONG BufferLength,
|
||||
// __inout_opt PALPC_MESSAGE_ATTRIBUTES ReceiveMessageAttributes,
|
||||
// __in_opt PLARGE_INTEGER Timeout
|
||||
// );
|
||||
func NtAlpcSendWaitReceivePort(
|
||||
hPort HANDLE,
|
||||
flags uint32,
|
||||
sendMsg *AlpcShortMessage, // Should actually point to PORT_MESSAGE + payload
|
||||
sendMsgAttrs *ALPC_MESSAGE_ATTRIBUTES,
|
||||
recvMsg *AlpcShortMessage,
|
||||
recvBufLen *uint32,
|
||||
recvMsgAttrs *ALPC_MESSAGE_ATTRIBUTES,
|
||||
timeout *int64, // use native int64
|
||||
) (e error) {
|
||||
|
||||
ret, _, _ := procNtAlpcSendWaitReceivePort.Call(
|
||||
uintptr(hPort),
|
||||
uintptr(flags),
|
||||
uintptr(unsafe.Pointer(sendMsg)),
|
||||
uintptr(unsafe.Pointer(sendMsgAttrs)),
|
||||
uintptr(unsafe.Pointer(recvMsg)),
|
||||
uintptr(unsafe.Pointer(recvBufLen)),
|
||||
uintptr(unsafe.Pointer(recvMsgAttrs)),
|
||||
uintptr(unsafe.Pointer(timeout)),
|
||||
)
|
||||
|
||||
if ret != ERROR_SUCCESS {
|
||||
e = fmt.Errorf("0x%x", ret)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// NTSYSAPI
|
||||
// PVOID
|
||||
// NTAPI
|
||||
// AlpcGetMessageAttribute(
|
||||
// __in PALPC_MESSAGE_ATTRIBUTES Buffer,
|
||||
// __in ULONG AttributeFlag
|
||||
// );
|
||||
|
||||
// This basically returns a pointer to the correct struct for whichever
|
||||
// message attribute you asked for. In Go terms, it returns unsafe.Pointer
|
||||
// which you should then cast. Example:
|
||||
|
||||
// ptr := AlpcGetMessageAttribute(&recvMsgAttrs, ALPC_MESSAGE_CONTEXT_ATTRIBUTE)
|
||||
// if ptr != nil {
|
||||
// context := (*ALPC_CONTEXT_ATTR)(ptr)
|
||||
// }
|
||||
func AlpcGetMessageAttribute(buf *ALPC_MESSAGE_ATTRIBUTES, attr uint32) unsafe.Pointer {
|
||||
|
||||
ret, _, _ := procAlpcGetMessageAttribute.Call(
|
||||
uintptr(unsafe.Pointer(buf)),
|
||||
uintptr(attr),
|
||||
)
|
||||
return unsafe.Pointer(ret)
|
||||
}
|
||||
|
||||
// NTSYSCALLAPI
|
||||
// NTSTATUS
|
||||
// NTAPI
|
||||
// NtAlpcCancelMessage(
|
||||
// __in HANDLE PortHandle,
|
||||
// __in ULONG Flags,
|
||||
// __in PALPC_CONTEXT_ATTR MessageContext
|
||||
// );
|
||||
func NtAlpcCancelMessage(hPort HANDLE, flags uint32, pMsgContext *ALPC_CONTEXT_ATTR) (e error) {
|
||||
|
||||
ret, _, _ := procNtAlpcCancelMessage.Call(
|
||||
uintptr(hPort),
|
||||
uintptr(flags),
|
||||
uintptr(unsafe.Pointer(pMsgContext)),
|
||||
)
|
||||
|
||||
if ret != ERROR_SUCCESS {
|
||||
e = fmt.Errorf("0x%x", ret)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// NTSYSCALLAPI
|
||||
// NTSTATUS
|
||||
// NTAPI
|
||||
// NtAlpcDisconnectPort(
|
||||
// __in HANDLE PortHandle,
|
||||
// __in ULONG Flags
|
||||
// );
|
||||
func NtAlpcDisconnectPort(hPort HANDLE, flags uint32) (e error) {
|
||||
|
||||
ret, _, _ := procNtAlpcDisconnectPort.Call(
|
||||
uintptr(hPort),
|
||||
uintptr(flags),
|
||||
)
|
||||
|
||||
if ret != ERROR_SUCCESS {
|
||||
e = fmt.Errorf("0x%x", ret)
|
||||
}
|
||||
return
|
||||
}
|
|
@ -1,64 +0,0 @@
|
|||
package w32
|
||||
|
||||
const (
|
||||
ALPC_PORFLG_ALLOW_LPC_REQUESTS = 0x20000
|
||||
ALPC_PORFLG_SYSTEM_PROCESS = 0x100000
|
||||
ALPC_PORFLG_WAITABLE_PORT = 0x40000
|
||||
)
|
||||
|
||||
const (
|
||||
ALPC_MSGFLG_REPLY_MESSAGE = 0x1
|
||||
ALPC_MSGFLG_LPC_MODE = 0x2 // ?
|
||||
ALPC_MSGFLG_RELEASE_MESSAGE = 0x10000 // dbg
|
||||
ALPC_MSGFLG_SYNC_REQUEST = 0x20000 // dbg
|
||||
ALPC_MSGFLG_WAIT_USER_MODE = 0x100000
|
||||
ALPC_MSGFLG_WAIT_ALERTABLE = 0x200000
|
||||
ALPC_MSGFLG_WOW64_CALL = 0x80000000 // dbg
|
||||
)
|
||||
const (
|
||||
ALPC_MESSAGE_SECURITY_ATTRIBUTE = 0x80000000
|
||||
ALPC_MESSAGE_VIEW_ATTRIBUTE = 0x40000000
|
||||
ALPC_MESSAGE_CONTEXT_ATTRIBUTE = 0x20000000
|
||||
ALPC_MESSAGE_HANDLE_ATTRIBUTE = 0x10000000
|
||||
)
|
||||
|
||||
const (
|
||||
OBJ_INHERIT = 0x00000002
|
||||
OBJ_PERMANENT = 0x00000010
|
||||
OBJ_EXCLUSIVE = 0x00000020
|
||||
OBJ_CASE_INSENSITIVE = 0x00000040
|
||||
OBJ_OPENIF = 0x00000080
|
||||
OBJ_OPENLINK = 0x00000100
|
||||
OBJ_KERNEL_HANDLE = 0x00000200
|
||||
)
|
||||
|
||||
const (
|
||||
LPC_REQUEST = 1
|
||||
LPC_REPLY = 2
|
||||
LPC_DATAGRAM = 3
|
||||
LPC_LOST_REPLY = 4
|
||||
LPC_PORT_CLOSED = 5
|
||||
LPC_CLIENT_DIED = 6
|
||||
LPC_EXCEPTION = 7
|
||||
LPC_DEBUG_EVENT = 8
|
||||
LPC_ERROR_EVENT = 9
|
||||
LPC_CONNECTION_REQUEST = 10
|
||||
LPC_CONTINUATION_REQUIRED = 0x2000
|
||||
)
|
||||
|
||||
const (
|
||||
SecurityAnonymous uint32 = 1
|
||||
SecurityIdentification uint32 = 2
|
||||
SecurityImpersonation uint32 = 3
|
||||
SecurityDelegation uint32 = 4
|
||||
)
|
||||
|
||||
const (
|
||||
SECURITY_DYNAMIC_TRACKING byte = 1
|
||||
SECURITY_STATIC_TRACKING byte = 0
|
||||
)
|
||||
|
||||
const (
|
||||
ALPC_SYNC_OBJECT_TYPE uint32 = 2
|
||||
ALPC_THREAD_OBJECT_TYPE uint32 = 4
|
||||
)
|
|
@ -1,137 +0,0 @@
|
|||
package w32
|
||||
|
||||
import (
|
||||
"testing"
|
||||
)
|
||||
|
||||
var testPortName = "\\TestAlpcPort"
|
||||
|
||||
var basicPortAttr = ALPC_PORT_ATTRIBUTES{
|
||||
MaxMessageLength: uint64(SHORT_MESSAGE_MAX_SIZE),
|
||||
SecurityQos: SECURITY_QUALITY_OF_SERVICE{
|
||||
Length: SECURITY_QOS_SIZE,
|
||||
ContextTrackingMode: SECURITY_DYNAMIC_TRACKING,
|
||||
EffectiveOnly: 1,
|
||||
ImpersonationLevel: SecurityAnonymous,
|
||||
},
|
||||
Flags: ALPC_PORFLG_ALLOW_LPC_REQUESTS,
|
||||
DupObjectTypes: ALPC_SYNC_OBJECT_TYPE,
|
||||
}
|
||||
|
||||
func ObjectAttributes(name string) (oa OBJECT_ATTRIBUTES, e error) {
|
||||
|
||||
sd, e := InitializeSecurityDescriptor(1)
|
||||
if e != nil {
|
||||
return
|
||||
}
|
||||
|
||||
e = SetSecurityDescriptorDacl(sd, nil)
|
||||
if e != nil {
|
||||
return
|
||||
}
|
||||
|
||||
oa, e = InitializeObjectAttributes(name, 0, 0, sd)
|
||||
return
|
||||
}
|
||||
|
||||
func Send(
|
||||
hPort HANDLE,
|
||||
msg *AlpcShortMessage,
|
||||
flags uint32,
|
||||
pMsgAttrs *ALPC_MESSAGE_ATTRIBUTES,
|
||||
timeout *int64,
|
||||
) (e error) {
|
||||
|
||||
e = NtAlpcSendWaitReceivePort(hPort, flags, msg, pMsgAttrs, nil, nil, nil, timeout)
|
||||
return
|
||||
|
||||
}
|
||||
|
||||
func Recv(
|
||||
hPort HANDLE,
|
||||
pMsg *AlpcShortMessage,
|
||||
pMsgAttrs *ALPC_MESSAGE_ATTRIBUTES,
|
||||
timeout *int64,
|
||||
) (bufLen uint32, e error) {
|
||||
|
||||
bufLen = uint32(pMsg.TotalLength)
|
||||
e = NtAlpcSendWaitReceivePort(hPort, 0, nil, nil, pMsg, &bufLen, pMsgAttrs, timeout)
|
||||
return
|
||||
|
||||
}
|
||||
|
||||
// Convenience method to create an ALPC port with a NULL DACL. Requires an
|
||||
// absolute port name ( where / is the root of the kernel object directory )
|
||||
func CreatePort(name string) (hPort HANDLE, e error) {
|
||||
|
||||
oa, e := ObjectAttributes(name)
|
||||
if e != nil {
|
||||
return
|
||||
}
|
||||
|
||||
hPort, e = NtAlpcCreatePort(&oa, &basicPortAttr)
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
func ConnectPort(serverName, clientName string, pConnMsg *AlpcShortMessage) (hPort HANDLE, e error) {
|
||||
|
||||
oa, e := InitializeObjectAttributes(clientName, 0, 0, nil)
|
||||
if e != nil {
|
||||
return
|
||||
}
|
||||
|
||||
hPort, e = NtAlpcConnectPort(
|
||||
serverName,
|
||||
&oa,
|
||||
&basicPortAttr,
|
||||
ALPC_PORFLG_ALLOW_LPC_REQUESTS,
|
||||
nil,
|
||||
pConnMsg,
|
||||
nil,
|
||||
nil,
|
||||
nil,
|
||||
nil,
|
||||
)
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
func Accept(
|
||||
hSrv HANDLE,
|
||||
context *AlpcPortContext,
|
||||
pConnReq *AlpcShortMessage,
|
||||
accept bool,
|
||||
) (hPort HANDLE, e error) {
|
||||
|
||||
oa, _ := InitializeObjectAttributes("", 0, 0, nil)
|
||||
|
||||
var accepted uintptr
|
||||
if accept {
|
||||
accepted++
|
||||
}
|
||||
|
||||
hPort, e = NtAlpcAcceptConnectPort(
|
||||
hSrv,
|
||||
0,
|
||||
&oa,
|
||||
&basicPortAttr,
|
||||
context,
|
||||
pConnReq,
|
||||
nil,
|
||||
accepted,
|
||||
)
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
func TestNtAlpcCreatePort(t *testing.T) {
|
||||
|
||||
hPort, err := CreatePort(testPortName)
|
||||
|
||||
if err != nil {
|
||||
t.Errorf("failed to create ALPC port %v: %v", testPortName, err)
|
||||
} else {
|
||||
t.Logf("[OK] Created ALPC port %v with handle 0x%x", testPortName, hPort)
|
||||
}
|
||||
}
|
|
@ -1,181 +0,0 @@
|
|||
package w32
|
||||
|
||||
import (
|
||||
"errors"
|
||||
)
|
||||
|
||||
// nt!_ALPC_MESSAGE_ATTRIBUTES
|
||||
// +0x000 AllocatedAttributes : Uint4B
|
||||
// +0x004 ValidAttributes : Uint4B
|
||||
type ALPC_MESSAGE_ATTRIBUTES struct {
|
||||
AllocatedAttributes uint32
|
||||
ValidAttributes uint32
|
||||
}
|
||||
|
||||
type ALPC_CONTEXT_ATTR struct {
|
||||
PortContext *AlpcPortContext
|
||||
MessageContext uintptr
|
||||
Sequence uint32
|
||||
MessageId uint32
|
||||
CallbackId uint32
|
||||
}
|
||||
|
||||
type ALPC_HANDLE_ATTR struct {
|
||||
Flags uint32
|
||||
Handle HANDLE
|
||||
ObjectType uint32
|
||||
DesiredAccess uint32
|
||||
}
|
||||
|
||||
// nt!_CLIENT_ID
|
||||
// +0x000 UniqueProcess : Ptr64 Void
|
||||
// +0x008 UniqueThread : Ptr64 Void
|
||||
type CLIENT_ID struct {
|
||||
UniqueProcess uintptr
|
||||
UniqueThread uintptr
|
||||
}
|
||||
|
||||
// nt!_UNICODE_STRING
|
||||
// +0x000 Length : Uint2B
|
||||
// +0x002 MaximumLength : Uint2B
|
||||
// +0x008 Buffer : Ptr64 Uint2B
|
||||
type UNICODE_STRING struct {
|
||||
Length uint16
|
||||
MaximumLength uint16
|
||||
_ [4]byte // align to 0x08
|
||||
Buffer *uint16
|
||||
}
|
||||
|
||||
// nt!_OBJECT_ATTRIBUTES
|
||||
// +0x000 Length : Uint4B
|
||||
// +0x008 RootDirectory : Ptr64 Void
|
||||
// +0x010 ObjectName : Ptr64 _UNICODE_STRING
|
||||
// +0x018 Attributes : Uint4B
|
||||
// +0x020 SecurityDescriptor : Ptr64 Void
|
||||
// +0x028 SecurityQualityOfService : Ptr64 Void
|
||||
type OBJECT_ATTRIBUTES struct {
|
||||
Length uint32
|
||||
_ [4]byte // align to 0x08
|
||||
RootDirectory HANDLE
|
||||
ObjectName *UNICODE_STRING
|
||||
Attributes uint32
|
||||
_ [4]byte // align to 0x20
|
||||
SecurityDescriptor *SECURITY_DESCRIPTOR
|
||||
SecurityQualityOfService *SECURITY_QUALITY_OF_SERVICE
|
||||
}
|
||||
|
||||
// cf: http://j00ru.vexillium.org/?p=502 for legacy RPC
|
||||
// nt!_PORT_MESSAGE
|
||||
// +0x000 u1 : <unnamed-tag>
|
||||
// +0x004 u2 : <unnamed-tag>
|
||||
// +0x008 ClientId : _CLIENT_ID
|
||||
// +0x008 DoNotUseThisField : Float
|
||||
// +0x018 MessageId : Uint4B
|
||||
// +0x020 ClientViewSize : Uint8B
|
||||
// +0x020 CallbackId : Uint4B
|
||||
type PORT_MESSAGE struct {
|
||||
DataLength uint16 // These are the two unnamed unions
|
||||
TotalLength uint16 // without Length and ZeroInit
|
||||
Type uint16
|
||||
DataInfoOffset uint16
|
||||
ClientId CLIENT_ID
|
||||
MessageId uint32
|
||||
_ [4]byte // align up to 0x20
|
||||
ClientViewSize uint64
|
||||
}
|
||||
|
||||
func (pm PORT_MESSAGE) CallbackId() uint32 {
|
||||
return uint32(pm.ClientViewSize >> 32)
|
||||
}
|
||||
|
||||
func (pm PORT_MESSAGE) DoNotUseThisField() float64 {
|
||||
panic("WE TOLD YOU NOT TO USE THIS FIELD")
|
||||
}
|
||||
|
||||
const PORT_MESSAGE_SIZE = 0x28
|
||||
|
||||
// http://www.nirsoft.net/kernel_struct/vista/SECURITY_QUALITY_OF_SERVICE.html
|
||||
type SECURITY_QUALITY_OF_SERVICE struct {
|
||||
Length uint32
|
||||
ImpersonationLevel uint32
|
||||
ContextTrackingMode byte
|
||||
EffectiveOnly byte
|
||||
_ [2]byte // align to 12 bytes
|
||||
}
|
||||
|
||||
const SECURITY_QOS_SIZE = 12
|
||||
|
||||
// nt!_ALPC_PORT_ATTRIBUTES
|
||||
// +0x000 Flags : Uint4B
|
||||
// +0x004 SecurityQos : _SECURITY_QUALITY_OF_SERVICE
|
||||
// +0x010 MaxMessageLength : Uint8B
|
||||
// +0x018 MemoryBandwidth : Uint8B
|
||||
// +0x020 MaxPoolUsage : Uint8B
|
||||
// +0x028 MaxSectionSize : Uint8B
|
||||
// +0x030 MaxViewSize : Uint8B
|
||||
// +0x038 MaxTotalSectionSize : Uint8B
|
||||
// +0x040 DupObjectTypes : Uint4B
|
||||
// +0x044 Reserved : Uint4B
|
||||
type ALPC_PORT_ATTRIBUTES struct {
|
||||
Flags uint32
|
||||
SecurityQos SECURITY_QUALITY_OF_SERVICE
|
||||
MaxMessageLength uint64 // must be filled out
|
||||
MemoryBandwidth uint64
|
||||
MaxPoolUsage uint64
|
||||
MaxSectionSize uint64
|
||||
MaxViewSize uint64
|
||||
MaxTotalSectionSize uint64
|
||||
DupObjectTypes uint32
|
||||
Reserved uint32
|
||||
}
|
||||
|
||||
const SHORT_MESSAGE_MAX_SIZE uint16 = 65535 // MAX_USHORT
|
||||
const SHORT_MESSAGE_MAX_PAYLOAD uint16 = SHORT_MESSAGE_MAX_SIZE - PORT_MESSAGE_SIZE
|
||||
|
||||
// LPC uses the first 4 bytes of the payload as an LPC Command, but this is
|
||||
// NOT represented here, to allow the use of raw ALPC. For legacy LPC, callers
|
||||
// must include the command as part of their payload.
|
||||
type AlpcShortMessage struct {
|
||||
PORT_MESSAGE
|
||||
Data [SHORT_MESSAGE_MAX_PAYLOAD]byte
|
||||
}
|
||||
|
||||
func NewAlpcShortMessage() AlpcShortMessage {
|
||||
sm := AlpcShortMessage{}
|
||||
sm.TotalLength = SHORT_MESSAGE_MAX_SIZE
|
||||
return sm
|
||||
}
|
||||
|
||||
func (sm *AlpcShortMessage) SetData(d []byte) (e error) {
|
||||
|
||||
copy(sm.Data[:], d)
|
||||
if len(d) > int(SHORT_MESSAGE_MAX_PAYLOAD) {
|
||||
e = errors.New("data too big - truncated")
|
||||
sm.DataLength = SHORT_MESSAGE_MAX_PAYLOAD
|
||||
sm.TotalLength = SHORT_MESSAGE_MAX_SIZE
|
||||
return
|
||||
}
|
||||
sm.TotalLength = uint16(PORT_MESSAGE_SIZE + len(d))
|
||||
sm.DataLength = uint16(len(d))
|
||||
return
|
||||
|
||||
}
|
||||
|
||||
// TODO - is this still useful?
|
||||
func (sm *AlpcShortMessage) GetData() []byte {
|
||||
if int(sm.DataLength) > int(SHORT_MESSAGE_MAX_PAYLOAD) {
|
||||
return sm.Data[:] // truncate
|
||||
}
|
||||
return sm.Data[:sm.DataLength]
|
||||
}
|
||||
|
||||
func (sm *AlpcShortMessage) Reset() {
|
||||
// zero the PORT_MESSAGE header
|
||||
sm.PORT_MESSAGE = PORT_MESSAGE{}
|
||||
sm.TotalLength = SHORT_MESSAGE_MAX_SIZE
|
||||
sm.DataLength = 0
|
||||
}
|
||||
|
||||
type AlpcPortContext struct {
|
||||
Handle HANDLE
|
||||
}
|
|
@ -1,109 +0,0 @@
|
|||
// Copyright 2010-2012 The W32 Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
package w32
|
||||
|
||||
import (
|
||||
"syscall"
|
||||
"unsafe"
|
||||
)
|
||||
|
||||
var (
|
||||
modcomctl32 = syscall.NewLazyDLL("comctl32.dll")
|
||||
|
||||
procInitCommonControlsEx = modcomctl32.NewProc("InitCommonControlsEx")
|
||||
procImageList_Create = modcomctl32.NewProc("ImageList_Create")
|
||||
procImageList_Destroy = modcomctl32.NewProc("ImageList_Destroy")
|
||||
procImageList_GetImageCount = modcomctl32.NewProc("ImageList_GetImageCount")
|
||||
procImageList_SetImageCount = modcomctl32.NewProc("ImageList_SetImageCount")
|
||||
procImageList_Add = modcomctl32.NewProc("ImageList_Add")
|
||||
procImageList_ReplaceIcon = modcomctl32.NewProc("ImageList_ReplaceIcon")
|
||||
procImageList_Remove = modcomctl32.NewProc("ImageList_Remove")
|
||||
procTrackMouseEvent = modcomctl32.NewProc("_TrackMouseEvent")
|
||||
)
|
||||
|
||||
func InitCommonControlsEx(lpInitCtrls *INITCOMMONCONTROLSEX) bool {
|
||||
ret, _, _ := procInitCommonControlsEx.Call(
|
||||
uintptr(unsafe.Pointer(lpInitCtrls)))
|
||||
|
||||
return ret != 0
|
||||
}
|
||||
|
||||
func ImageList_Create(cx, cy int, flags uint, cInitial, cGrow int) HIMAGELIST {
|
||||
ret, _, _ := procImageList_Create.Call(
|
||||
uintptr(cx),
|
||||
uintptr(cy),
|
||||
uintptr(flags),
|
||||
uintptr(cInitial),
|
||||
uintptr(cGrow))
|
||||
|
||||
if ret == 0 {
|
||||
panic("Create image list failed")
|
||||
}
|
||||
|
||||
return HIMAGELIST(ret)
|
||||
}
|
||||
|
||||
func ImageList_Destroy(himl HIMAGELIST) bool {
|
||||
ret, _, _ := procImageList_Destroy.Call(
|
||||
uintptr(himl))
|
||||
|
||||
return ret != 0
|
||||
}
|
||||
|
||||
func ImageList_GetImageCount(himl HIMAGELIST) int {
|
||||
ret, _, _ := procImageList_GetImageCount.Call(
|
||||
uintptr(himl))
|
||||
|
||||
return int(ret)
|
||||
}
|
||||
|
||||
func ImageList_SetImageCount(himl HIMAGELIST, uNewCount uint) bool {
|
||||
ret, _, _ := procImageList_SetImageCount.Call(
|
||||
uintptr(himl),
|
||||
uintptr(uNewCount))
|
||||
|
||||
return ret != 0
|
||||
}
|
||||
|
||||
func ImageList_Add(himl HIMAGELIST, hbmImage, hbmMask HBITMAP) int {
|
||||
ret, _, _ := procImageList_Add.Call(
|
||||
uintptr(himl),
|
||||
uintptr(hbmImage),
|
||||
uintptr(hbmMask))
|
||||
|
||||
return int(ret)
|
||||
}
|
||||
|
||||
func ImageList_ReplaceIcon(himl HIMAGELIST, i int, hicon HICON) int {
|
||||
ret, _, _ := procImageList_ReplaceIcon.Call(
|
||||
uintptr(himl),
|
||||
uintptr(i),
|
||||
uintptr(hicon))
|
||||
|
||||
return int(ret)
|
||||
}
|
||||
|
||||
func ImageList_AddIcon(himl HIMAGELIST, hicon HICON) int {
|
||||
return ImageList_ReplaceIcon(himl, -1, hicon)
|
||||
}
|
||||
|
||||
func ImageList_Remove(himl HIMAGELIST, i int) bool {
|
||||
ret, _, _ := procImageList_Remove.Call(
|
||||
uintptr(himl),
|
||||
uintptr(i))
|
||||
|
||||
return ret != 0
|
||||
}
|
||||
|
||||
func ImageList_RemoveAll(himl HIMAGELIST) bool {
|
||||
return ImageList_Remove(himl, -1)
|
||||
}
|
||||
|
||||
func TrackMouseEvent(tme *TRACKMOUSEEVENT) bool {
|
||||
ret, _, _ := procTrackMouseEvent.Call(
|
||||
uintptr(unsafe.Pointer(tme)))
|
||||
|
||||
return ret != 0
|
||||
}
|
|
@ -1,38 +0,0 @@
|
|||
// Copyright 2010-2012 The W32 Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
package w32
|
||||
|
||||
import (
|
||||
"syscall"
|
||||
"unsafe"
|
||||
)
|
||||
|
||||
var (
|
||||
modcomdlg32 = syscall.NewLazyDLL("comdlg32.dll")
|
||||
|
||||
procGetSaveFileName = modcomdlg32.NewProc("GetSaveFileNameW")
|
||||
procGetOpenFileName = modcomdlg32.NewProc("GetOpenFileNameW")
|
||||
procCommDlgExtendedError = modcomdlg32.NewProc("CommDlgExtendedError")
|
||||
)
|
||||
|
||||
func GetOpenFileName(ofn *OPENFILENAME) bool {
|
||||
ret, _, _ := procGetOpenFileName.Call(
|
||||
uintptr(unsafe.Pointer(ofn)))
|
||||
|
||||
return ret != 0
|
||||
}
|
||||
|
||||
func GetSaveFileName(ofn *OPENFILENAME) bool {
|
||||
ret, _, _ := procGetSaveFileName.Call(
|
||||
uintptr(unsafe.Pointer(ofn)))
|
||||
|
||||
return ret != 0
|
||||
}
|
||||
|
||||
func CommDlgExtendedError() uint {
|
||||
ret, _, _ := procCommDlgExtendedError.Call()
|
||||
|
||||
return uint(ret)
|
||||
}
|
File diff suppressed because it is too large
Load Diff
|
@ -1,152 +0,0 @@
|
|||
// Copyright 2010-2012 The W32 Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
package w32
|
||||
|
||||
import (
|
||||
"syscall"
|
||||
"unsafe"
|
||||
)
|
||||
|
||||
var (
|
||||
kernel32 = syscall.NewLazyDLL("kernel32.dll")
|
||||
|
||||
procCreateProcessW = kernel32.NewProc("CreateProcessW")
|
||||
procTerminateProcess = kernel32.NewProc("TerminateProcess")
|
||||
procGetExitCodeProcess = kernel32.NewProc("GetExitCodeProcess")
|
||||
procWaitForSingleObject = kernel32.NewProc("WaitForSingleObject")
|
||||
)
|
||||
|
||||
// WINBASEAPI WINBOOL WINAPI
|
||||
// CreateProcessW (
|
||||
// LPCWSTR lpApplicationName,
|
||||
// LPWSTR lpCommandLine,
|
||||
// LPSECURITY_ATTRIBUTES lpProcessAttributes,
|
||||
// LPSECURITY_ATTRIBUTES lpThreadAttributes
|
||||
// WINBOOL bInheritHandles
|
||||
// DWORD dwCreationFlags
|
||||
// LPVOID lpEnvironment
|
||||
// LPCWSTR lpCurrentDirectory
|
||||
// LPSTARTUPINFOW lpStartupInfo
|
||||
// LPPROCESS_INFORMATION lpProcessInformation
|
||||
//);
|
||||
func CreateProcessW(
|
||||
lpApplicationName, lpCommandLine string,
|
||||
lpProcessAttributes, lpThreadAttributes *SECURITY_ATTRIBUTES,
|
||||
bInheritHandles BOOL,
|
||||
dwCreationFlags uint32,
|
||||
lpEnvironment unsafe.Pointer,
|
||||
lpCurrentDirectory string,
|
||||
lpStartupInfo *STARTUPINFOW,
|
||||
lpProcessInformation *PROCESS_INFORMATION,
|
||||
) (e error) {
|
||||
|
||||
var lpAN, lpCL, lpCD *uint16
|
||||
if len(lpApplicationName) > 0 {
|
||||
lpAN, e = syscall.UTF16PtrFromString(lpApplicationName)
|
||||
if e != nil {
|
||||
return
|
||||
}
|
||||
}
|
||||
if len(lpCommandLine) > 0 {
|
||||
lpCL, e = syscall.UTF16PtrFromString(lpCommandLine)
|
||||
if e != nil {
|
||||
return
|
||||
}
|
||||
}
|
||||
if len(lpCurrentDirectory) > 0 {
|
||||
lpCD, e = syscall.UTF16PtrFromString(lpCurrentDirectory)
|
||||
if e != nil {
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
ret, _, lastErr := procCreateProcessW.Call(
|
||||
uintptr(unsafe.Pointer(lpAN)),
|
||||
uintptr(unsafe.Pointer(lpCL)),
|
||||
uintptr(unsafe.Pointer(lpProcessAttributes)),
|
||||
uintptr(unsafe.Pointer(lpProcessInformation)),
|
||||
uintptr(bInheritHandles),
|
||||
uintptr(dwCreationFlags),
|
||||
uintptr(lpEnvironment),
|
||||
uintptr(unsafe.Pointer(lpCD)),
|
||||
uintptr(unsafe.Pointer(lpStartupInfo)),
|
||||
uintptr(unsafe.Pointer(lpProcessInformation)),
|
||||
)
|
||||
|
||||
if ret == 0 {
|
||||
e = lastErr
|
||||
}
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
func CreateProcessQuick(cmd string) (pi PROCESS_INFORMATION, e error) {
|
||||
si := &STARTUPINFOW{}
|
||||
e = CreateProcessW(
|
||||
"",
|
||||
cmd,
|
||||
nil,
|
||||
nil,
|
||||
0,
|
||||
0,
|
||||
unsafe.Pointer(nil),
|
||||
"",
|
||||
si,
|
||||
&pi,
|
||||
)
|
||||
return
|
||||
}
|
||||
|
||||
func TerminateProcess(hProcess HANDLE, exitCode uint32) (e error) {
|
||||
ret, _, lastErr := procTerminateProcess.Call(
|
||||
uintptr(hProcess),
|
||||
uintptr(exitCode),
|
||||
)
|
||||
|
||||
if ret == 0 {
|
||||
e = lastErr
|
||||
}
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
func GetExitCodeProcess(hProcess HANDLE) (code uintptr, e error) {
|
||||
ret, _, lastErr := procGetExitCodeProcess.Call(
|
||||
uintptr(hProcess),
|
||||
uintptr(unsafe.Pointer(&code)),
|
||||
)
|
||||
|
||||
if ret == 0 {
|
||||
e = lastErr
|
||||
}
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
// DWORD WINAPI WaitForSingleObject(
|
||||
// _In_ HANDLE hHandle,
|
||||
// _In_ DWORD dwMilliseconds
|
||||
// );
|
||||
|
||||
func WaitForSingleObject(hHandle HANDLE, msecs uint32) (ok bool, e error) {
|
||||
|
||||
ret, _, lastErr := procWaitForSingleObject.Call(
|
||||
uintptr(hHandle),
|
||||
uintptr(msecs),
|
||||
)
|
||||
|
||||
if ret == WAIT_OBJECT_0 {
|
||||
ok = true
|
||||
return
|
||||
}
|
||||
|
||||
// don't set e for timeouts, or it will be ERROR_SUCCESS which is
|
||||
// confusing
|
||||
if ret != WAIT_TIMEOUT {
|
||||
e = lastErr
|
||||
}
|
||||
return
|
||||
|
||||
}
|
|
@ -1,9 +0,0 @@
|
|||
package w32
|
||||
|
||||
const (
|
||||
WAIT_ABANDONED = 0x00000080
|
||||
WAIT_OBJECT_0 = 0x00000000
|
||||
WAIT_TIMEOUT = 0x00000102
|
||||
WAIT_FAILED = 0xFFFFFFFF
|
||||
INFINITE = 0xFFFFFFFF
|
||||
)
|
|
@ -1,47 +0,0 @@
|
|||
package w32
|
||||
|
||||
import (
|
||||
"testing"
|
||||
)
|
||||
|
||||
var testProcess = "notepad.exe"
|
||||
var wantCode = uint32(42)
|
||||
|
||||
func TestCreateProcess(t *testing.T) {
|
||||
|
||||
pi, err := CreateProcessQuick(testProcess)
|
||||
if err != nil {
|
||||
t.Errorf("[!!] Failed to create %s: %s", testProcess, err)
|
||||
} else {
|
||||
t.Logf("[OK] Created process %s with handle 0x%x, PID %d", testProcess, pi.Process, pi.ProcessId)
|
||||
}
|
||||
|
||||
err = TerminateProcess(pi.Process, wantCode)
|
||||
if err != nil {
|
||||
t.Errorf("[!!]Failed to terminate %s: %s", testProcess, err)
|
||||
} else {
|
||||
t.Logf("[OK] Called TerminateProcess on PID %d", pi.ProcessId)
|
||||
}
|
||||
|
||||
err = WaitForSingleObject(pi.Process, 1000) // 1000ms
|
||||
if err != nil {
|
||||
t.Errorf("[!!] failed in WaitForSingleObject: %s", err)
|
||||
} else {
|
||||
t.Logf("[OK] WaitForSingleObject returned...")
|
||||
}
|
||||
|
||||
// make sure we see the magic exit code we asked for
|
||||
code, err := GetExitCodeProcess(pi.Process)
|
||||
if err != nil {
|
||||
t.Errorf("[!!] Failed to get exit code for PID %d: %s", pi.ProcessId, err)
|
||||
} else {
|
||||
t.Logf("[OK] PID %d Exited with code %d", pi.ProcessId, code)
|
||||
}
|
||||
if code != 42 {
|
||||
t.Errorf("[!!] Unexpected exit code for PID %d - want %d, got %d", pi.ProcessId, wantCode, code)
|
||||
}
|
||||
|
||||
CloseHandle(pi.Process)
|
||||
CloseHandle(pi.Thread)
|
||||
|
||||
}
|
|
@ -1,68 +0,0 @@
|
|||
package w32
|
||||
|
||||
// typedef struct _PROCESS_INFORMATION {
|
||||
// HANDLE hProcess;
|
||||
// HANDLE hThread;
|
||||
// DWORD dwProcessId;
|
||||
// DWORD dwThreadId;
|
||||
// } PROCESS_INFORMATION, *PPROCESS_INFORMATION, *LPPROCESS_INFORMATION;
|
||||
|
||||
type PROCESS_INFORMATION struct {
|
||||
Process HANDLE
|
||||
Thread HANDLE
|
||||
ProcessId uint32
|
||||
ThreadId uint32
|
||||
}
|
||||
|
||||
// typedef struct _STARTUPINFOW {
|
||||
// DWORD cb;
|
||||
// LPWSTR lpReserved;
|
||||
// LPWSTR lpDesktop;
|
||||
// LPWSTR lpTitle;
|
||||
// DWORD dwX;
|
||||
// DWORD dwY;
|
||||
// DWORD dwXSize;
|
||||
// DWORD dwYSize;
|
||||
// DWORD dwXCountChars;
|
||||
// DWORD dwYCountChars;
|
||||
// DWORD dwFillAttribute;
|
||||
// DWORD dwFlags;
|
||||
// WORD wShowWindow;
|
||||
// WORD cbReserved2;
|
||||
// LPBYTE lpReserved2;
|
||||
// HANDLE hStdInput;
|
||||
// HANDLE hStdOutput;
|
||||
// HANDLE hStdError;
|
||||
// } STARTUPINFOW, *LPSTARTUPINFOW;
|
||||
|
||||
type STARTUPINFOW struct {
|
||||
cb uint32
|
||||
_ *uint16
|
||||
Desktop *uint16
|
||||
Title *uint16
|
||||
X uint32
|
||||
Y uint32
|
||||
XSize uint32
|
||||
YSize uint32
|
||||
XCountChars uint32
|
||||
YCountChars uint32
|
||||
FillAttribute uint32
|
||||
Flags uint32
|
||||
ShowWindow uint16
|
||||
_ uint16
|
||||
_ *uint8
|
||||
StdInput HANDLE
|
||||
StdOutput HANDLE
|
||||
StdError HANDLE
|
||||
}
|
||||
|
||||
// combase!_SECURITY_ATTRIBUTES
|
||||
// +0x000 nLength : Uint4B
|
||||
// +0x008 lpSecurityDescriptor : Ptr64 Void
|
||||
// +0x010 bInheritHandle : Int4B
|
||||
|
||||
type SECURITY_ATTRIBUTES struct {
|
||||
Length uint32
|
||||
SecurityDescriptor uintptr
|
||||
InheritHandle BOOL
|
||||
}
|
|
@ -1,254 +0,0 @@
|
|||
// Copyright 2010-2012 The W32 Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
package w32
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"syscall"
|
||||
"unsafe"
|
||||
)
|
||||
|
||||
// DEFINED IN THE DWM API BUT NOT IMPLEMENTED BY MS:
|
||||
// DwmAttachMilContent
|
||||
// DwmDetachMilContent
|
||||
// DwmEnableComposition
|
||||
// DwmGetGraphicsStreamClient
|
||||
// DwmGetGraphicsStreamTransformHint
|
||||
|
||||
var (
|
||||
moddwmapi = syscall.NewLazyDLL("dwmapi.dll")
|
||||
|
||||
procDwmDefWindowProc = moddwmapi.NewProc("DwmDefWindowProc")
|
||||
procDwmEnableBlurBehindWindow = moddwmapi.NewProc("DwmEnableBlurBehindWindow")
|
||||
procDwmEnableMMCSS = moddwmapi.NewProc("DwmEnableMMCSS")
|
||||
procDwmExtendFrameIntoClientArea = moddwmapi.NewProc("DwmExtendFrameIntoClientArea")
|
||||
procDwmFlush = moddwmapi.NewProc("DwmFlush")
|
||||
procDwmGetColorizationColor = moddwmapi.NewProc("DwmGetColorizationColor")
|
||||
procDwmGetCompositionTimingInfo = moddwmapi.NewProc("DwmGetCompositionTimingInfo")
|
||||
procDwmGetTransportAttributes = moddwmapi.NewProc("DwmGetTransportAttributes")
|
||||
procDwmGetWindowAttribute = moddwmapi.NewProc("DwmGetWindowAttribute")
|
||||
procDwmInvalidateIconicBitmaps = moddwmapi.NewProc("DwmInvalidateIconicBitmaps")
|
||||
procDwmIsCompositionEnabled = moddwmapi.NewProc("DwmIsCompositionEnabled")
|
||||
procDwmModifyPreviousDxFrameDuration = moddwmapi.NewProc("DwmModifyPreviousDxFrameDuration")
|
||||
procDwmQueryThumbnailSourceSize = moddwmapi.NewProc("DwmQueryThumbnailSourceSize")
|
||||
procDwmRegisterThumbnail = moddwmapi.NewProc("DwmRegisterThumbnail")
|
||||
procDwmRenderGesture = moddwmapi.NewProc("DwmRenderGesture")
|
||||
procDwmSetDxFrameDuration = moddwmapi.NewProc("DwmSetDxFrameDuration")
|
||||
procDwmSetIconicLivePreviewBitmap = moddwmapi.NewProc("DwmSetIconicLivePreviewBitmap")
|
||||
procDwmSetIconicThumbnail = moddwmapi.NewProc("DwmSetIconicThumbnail")
|
||||
procDwmSetPresentParameters = moddwmapi.NewProc("DwmSetPresentParameters")
|
||||
procDwmSetWindowAttribute = moddwmapi.NewProc("DwmSetWindowAttribute")
|
||||
procDwmShowContact = moddwmapi.NewProc("DwmShowContact")
|
||||
procDwmTetherContact = moddwmapi.NewProc("DwmTetherContact")
|
||||
procDwmTransitionOwnedWindow = moddwmapi.NewProc("DwmTransitionOwnedWindow")
|
||||
procDwmUnregisterThumbnail = moddwmapi.NewProc("DwmUnregisterThumbnail")
|
||||
procDwmUpdateThumbnailProperties = moddwmapi.NewProc("DwmUpdateThumbnailProperties")
|
||||
)
|
||||
|
||||
func DwmDefWindowProc(hWnd HWND, msg uint, wParam, lParam uintptr) (bool, uint) {
|
||||
var result uint
|
||||
ret, _, _ := procDwmDefWindowProc.Call(
|
||||
uintptr(hWnd),
|
||||
uintptr(msg),
|
||||
wParam,
|
||||
lParam,
|
||||
uintptr(unsafe.Pointer(&result)))
|
||||
return ret != 0, result
|
||||
}
|
||||
|
||||
func DwmEnableBlurBehindWindow(hWnd HWND, pBlurBehind *DWM_BLURBEHIND) HRESULT {
|
||||
ret, _, _ := procDwmEnableBlurBehindWindow.Call(
|
||||
uintptr(hWnd),
|
||||
uintptr(unsafe.Pointer(pBlurBehind)))
|
||||
return HRESULT(ret)
|
||||
}
|
||||
|
||||
func DwmEnableMMCSS(fEnableMMCSS bool) HRESULT {
|
||||
ret, _, _ := procDwmEnableMMCSS.Call(
|
||||
uintptr(BoolToBOOL(fEnableMMCSS)))
|
||||
return HRESULT(ret)
|
||||
}
|
||||
|
||||
func DwmExtendFrameIntoClientArea(hWnd HWND, pMarInset *MARGINS) HRESULT {
|
||||
ret, _, _ := procDwmExtendFrameIntoClientArea.Call(
|
||||
uintptr(hWnd),
|
||||
uintptr(unsafe.Pointer(pMarInset)))
|
||||
return HRESULT(ret)
|
||||
}
|
||||
|
||||
func DwmFlush() HRESULT {
|
||||
ret, _, _ := procDwmFlush.Call()
|
||||
return HRESULT(ret)
|
||||
}
|
||||
|
||||
func DwmGetColorizationColor(pcrColorization *uint32, pfOpaqueBlend *BOOL) HRESULT {
|
||||
ret, _, _ := procDwmGetColorizationColor.Call(
|
||||
uintptr(unsafe.Pointer(pcrColorization)),
|
||||
uintptr(unsafe.Pointer(pfOpaqueBlend)))
|
||||
return HRESULT(ret)
|
||||
}
|
||||
|
||||
func DwmGetCompositionTimingInfo(hWnd HWND, pTimingInfo *DWM_TIMING_INFO) HRESULT {
|
||||
ret, _, _ := procDwmGetCompositionTimingInfo.Call(
|
||||
uintptr(hWnd),
|
||||
uintptr(unsafe.Pointer(pTimingInfo)))
|
||||
return HRESULT(ret)
|
||||
}
|
||||
|
||||
func DwmGetTransportAttributes(pfIsRemoting *BOOL, pfIsConnected *BOOL, pDwGeneration *uint32) HRESULT {
|
||||
ret, _, _ := procDwmGetTransportAttributes.Call(
|
||||
uintptr(unsafe.Pointer(pfIsRemoting)),
|
||||
uintptr(unsafe.Pointer(pfIsConnected)),
|
||||
uintptr(unsafe.Pointer(pDwGeneration)))
|
||||
return HRESULT(ret)
|
||||
}
|
||||
|
||||
// TODO: verify handling of variable arguments
|
||||
func DwmGetWindowAttribute(hWnd HWND, dwAttribute uint32) (pAttribute interface{}, result HRESULT) {
|
||||
var pvAttribute, pvAttrSize uintptr
|
||||
switch dwAttribute {
|
||||
case DWMWA_NCRENDERING_ENABLED:
|
||||
v := new(BOOL)
|
||||
pAttribute = v
|
||||
pvAttribute = uintptr(unsafe.Pointer(v))
|
||||
pvAttrSize = unsafe.Sizeof(*v)
|
||||
case DWMWA_CAPTION_BUTTON_BOUNDS, DWMWA_EXTENDED_FRAME_BOUNDS:
|
||||
v := new(RECT)
|
||||
pAttribute = v
|
||||
pvAttribute = uintptr(unsafe.Pointer(v))
|
||||
pvAttrSize = unsafe.Sizeof(*v)
|
||||
case DWMWA_CLOAKED:
|
||||
panic(fmt.Sprintf("DwmGetWindowAttribute(%d) is not currently supported.", dwAttribute))
|
||||
default:
|
||||
panic(fmt.Sprintf("DwmGetWindowAttribute(%d) is not valid.", dwAttribute))
|
||||
}
|
||||
|
||||
ret, _, _ := procDwmGetWindowAttribute.Call(
|
||||
uintptr(hWnd),
|
||||
uintptr(dwAttribute),
|
||||
pvAttribute,
|
||||
pvAttrSize)
|
||||
result = HRESULT(ret)
|
||||
return
|
||||
}
|
||||
|
||||
func DwmInvalidateIconicBitmaps(hWnd HWND) HRESULT {
|
||||
ret, _, _ := procDwmInvalidateIconicBitmaps.Call(
|
||||
uintptr(hWnd))
|
||||
return HRESULT(ret)
|
||||
}
|
||||
|
||||
func DwmIsCompositionEnabled(pfEnabled *BOOL) HRESULT {
|
||||
ret, _, _ := procDwmIsCompositionEnabled.Call(
|
||||
uintptr(unsafe.Pointer(pfEnabled)))
|
||||
return HRESULT(ret)
|
||||
}
|
||||
|
||||
func DwmModifyPreviousDxFrameDuration(hWnd HWND, cRefreshes int, fRelative bool) HRESULT {
|
||||
ret, _, _ := procDwmModifyPreviousDxFrameDuration.Call(
|
||||
uintptr(hWnd),
|
||||
uintptr(cRefreshes),
|
||||
uintptr(BoolToBOOL(fRelative)))
|
||||
return HRESULT(ret)
|
||||
}
|
||||
|
||||
func DwmQueryThumbnailSourceSize(hThumbnail HTHUMBNAIL, pSize *SIZE) HRESULT {
|
||||
ret, _, _ := procDwmQueryThumbnailSourceSize.Call(
|
||||
uintptr(hThumbnail),
|
||||
uintptr(unsafe.Pointer(pSize)))
|
||||
return HRESULT(ret)
|
||||
}
|
||||
|
||||
func DwmRegisterThumbnail(hWndDestination HWND, hWndSource HWND, phThumbnailId *HTHUMBNAIL) HRESULT {
|
||||
ret, _, _ := procDwmRegisterThumbnail.Call(
|
||||
uintptr(hWndDestination),
|
||||
uintptr(hWndSource),
|
||||
uintptr(unsafe.Pointer(phThumbnailId)))
|
||||
return HRESULT(ret)
|
||||
}
|
||||
|
||||
func DwmRenderGesture(gt GESTURE_TYPE, cContacts uint, pdwPointerID *uint32, pPoints *POINT) {
|
||||
procDwmRenderGesture.Call(
|
||||
uintptr(gt),
|
||||
uintptr(cContacts),
|
||||
uintptr(unsafe.Pointer(pdwPointerID)),
|
||||
uintptr(unsafe.Pointer(pPoints)))
|
||||
return
|
||||
}
|
||||
|
||||
func DwmSetDxFrameDuration(hWnd HWND, cRefreshes int) HRESULT {
|
||||
ret, _, _ := procDwmSetDxFrameDuration.Call(
|
||||
uintptr(hWnd),
|
||||
uintptr(cRefreshes))
|
||||
return HRESULT(ret)
|
||||
}
|
||||
|
||||
func DwmSetIconicLivePreviewBitmap(hWnd HWND, hbmp HBITMAP, pptClient *POINT, dwSITFlags uint32) HRESULT {
|
||||
ret, _, _ := procDwmSetIconicLivePreviewBitmap.Call(
|
||||
uintptr(hWnd),
|
||||
uintptr(hbmp),
|
||||
uintptr(unsafe.Pointer(pptClient)),
|
||||
uintptr(dwSITFlags))
|
||||
return HRESULT(ret)
|
||||
}
|
||||
|
||||
func DwmSetIconicThumbnail(hWnd HWND, hbmp HBITMAP, dwSITFlags uint32) HRESULT {
|
||||
ret, _, _ := procDwmSetIconicThumbnail.Call(
|
||||
uintptr(hWnd),
|
||||
uintptr(hbmp),
|
||||
uintptr(dwSITFlags))
|
||||
return HRESULT(ret)
|
||||
}
|
||||
|
||||
func DwmSetPresentParameters(hWnd HWND, pPresentParams *DWM_PRESENT_PARAMETERS) HRESULT {
|
||||
ret, _, _ := procDwmSetPresentParameters.Call(
|
||||
uintptr(hWnd),
|
||||
uintptr(unsafe.Pointer(pPresentParams)))
|
||||
return HRESULT(ret)
|
||||
}
|
||||
|
||||
func DwmSetWindowAttribute(hWnd HWND, dwAttribute uint32, pvAttribute LPCVOID, cbAttribute uint32) HRESULT {
|
||||
ret, _, _ := procDwmSetWindowAttribute.Call(
|
||||
uintptr(hWnd),
|
||||
uintptr(dwAttribute),
|
||||
uintptr(pvAttribute),
|
||||
uintptr(cbAttribute))
|
||||
return HRESULT(ret)
|
||||
}
|
||||
|
||||
func DwmShowContact(dwPointerID uint32, eShowContact DWM_SHOWCONTACT) {
|
||||
procDwmShowContact.Call(
|
||||
uintptr(dwPointerID),
|
||||
uintptr(eShowContact))
|
||||
return
|
||||
}
|
||||
|
||||
func DwmTetherContact(dwPointerID uint32, fEnable bool, ptTether POINT) {
|
||||
procDwmTetherContact.Call(
|
||||
uintptr(dwPointerID),
|
||||
uintptr(BoolToBOOL(fEnable)),
|
||||
uintptr(unsafe.Pointer(&ptTether)))
|
||||
return
|
||||
}
|
||||
|
||||
func DwmTransitionOwnedWindow(hWnd HWND, target DWMTRANSITION_OWNEDWINDOW_TARGET) {
|
||||
procDwmTransitionOwnedWindow.Call(
|
||||
uintptr(hWnd),
|
||||
uintptr(target))
|
||||
return
|
||||
}
|
||||
|
||||
func DwmUnregisterThumbnail(hThumbnailId HTHUMBNAIL) HRESULT {
|
||||
ret, _, _ := procDwmUnregisterThumbnail.Call(
|
||||
uintptr(hThumbnailId))
|
||||
return HRESULT(ret)
|
||||
}
|
||||
|
||||
func DwmUpdateThumbnailProperties(hThumbnailId HTHUMBNAIL, ptnProperties *DWM_THUMBNAIL_PROPERTIES) HRESULT {
|
||||
ret, _, _ := procDwmUpdateThumbnailProperties.Call(
|
||||
uintptr(hThumbnailId),
|
||||
uintptr(unsafe.Pointer(ptnProperties)))
|
||||
return HRESULT(ret)
|
||||
}
|
|
@ -1,174 +0,0 @@
|
|||
// Copyright 2010-2012 The W32 Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
package w32
|
||||
|
||||
// #include <stdlib.h>
|
||||
//import (
|
||||
// "C"
|
||||
//)
|
||||
|
||||
// Based on C code found here https://gist.github.com/juntalis/4366916
|
||||
// Original code license:
|
||||
/*
|
||||
* fork.c
|
||||
* Experimental fork() on Windows. Requires NT 6 subsystem or
|
||||
* newer.
|
||||
*
|
||||
* Copyright (c) 2012 William Pitcock <nenolod@dereferenced.org>
|
||||
*
|
||||
* Permission to use, copy, modify, and/or distribute this software for any
|
||||
* purpose with or without fee is hereby granted, provided that the above
|
||||
* copyright notice and this permission notice appear in all copies.
|
||||
*
|
||||
* This software is provided 'as is' and without any warranty, express or
|
||||
* implied. In no event shall the authors be liable for any damages arising
|
||||
* from the use of this software.
|
||||
*/
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"syscall"
|
||||
"unsafe"
|
||||
)
|
||||
|
||||
var (
|
||||
ntdll = syscall.NewLazyDLL("ntdll.dll")
|
||||
|
||||
procRtlCloneUserProcess = ntdll.NewProc("RtlCloneUserProcess")
|
||||
procAllocConsole = modkernel32.NewProc("AllocConsole")
|
||||
procOpenProcess = modkernel32.NewProc("OpenProcess")
|
||||
procOpenThread = modkernel32.NewProc("OpenThread")
|
||||
procResumeThread = modkernel32.NewProc("ResumeThread")
|
||||
)
|
||||
|
||||
func OpenProcess(desiredAccess int, inheritHandle bool, processId uintptr) (h HANDLE, e error) {
|
||||
inherit := uintptr(0)
|
||||
if inheritHandle {
|
||||
inherit = 1
|
||||
}
|
||||
|
||||
ret, _, lastErr := procOpenProcess.Call(
|
||||
uintptr(desiredAccess),
|
||||
inherit,
|
||||
uintptr(processId),
|
||||
)
|
||||
|
||||
if ret == 0 {
|
||||
e = lastErr
|
||||
}
|
||||
|
||||
h = HANDLE(ret)
|
||||
return
|
||||
}
|
||||
|
||||
func OpenThread(desiredAccess int, inheritHandle bool, threadId uintptr) (h HANDLE, e error) {
|
||||
inherit := uintptr(0)
|
||||
if inheritHandle {
|
||||
inherit = 1
|
||||
}
|
||||
|
||||
ret, _, lastErr := procOpenThread.Call(
|
||||
uintptr(desiredAccess),
|
||||
inherit,
|
||||
uintptr(threadId),
|
||||
)
|
||||
|
||||
if ret == 0 {
|
||||
e = lastErr
|
||||
}
|
||||
|
||||
h = HANDLE(ret)
|
||||
return
|
||||
}
|
||||
|
||||
// DWORD WINAPI ResumeThread(
|
||||
// _In_ HANDLE hThread
|
||||
// );
|
||||
func ResumeThread(ht HANDLE) (e error) {
|
||||
|
||||
ret, _, lastErr := procResumeThread.Call(
|
||||
uintptr(ht),
|
||||
)
|
||||
if ret == ^uintptr(0) { // -1
|
||||
e = lastErr
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// BOOL WINAPI AllocConsole(void);
|
||||
func AllocConsole() (e error) {
|
||||
ret, _, lastErr := procAllocConsole.Call()
|
||||
if ret != ERROR_SUCCESS {
|
||||
e = lastErr
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
// NTSYSAPI
|
||||
// NTSTATUS
|
||||
// NTAPI RtlCloneUserProcess (
|
||||
// _In_ ULONG ProcessFlags,
|
||||
// _In_opt_ PSECURITY_DESCRIPTOR ProcessSecurityDescriptor,
|
||||
// _In_opt_ PSECURITY_DESCRIPTOR ThreadSecurityDescriptor,
|
||||
// _In_opt_ HANDLE DebugPort,
|
||||
// _Out_ PRTL_USER_PROCESS_INFORMATION ProcessInformation
|
||||
// )
|
||||
|
||||
func RtlCloneUserProcess(
|
||||
ProcessFlags uint32,
|
||||
ProcessSecurityDescriptor, ThreadSecurityDescriptor *SECURITY_DESCRIPTOR, // in advapi32_typedef.go
|
||||
DebugPort HANDLE,
|
||||
ProcessInformation *RTL_USER_PROCESS_INFORMATION,
|
||||
) (status uintptr) {
|
||||
|
||||
status, _, _ = procRtlCloneUserProcess.Call(
|
||||
uintptr(ProcessFlags),
|
||||
uintptr(unsafe.Pointer(ProcessSecurityDescriptor)),
|
||||
uintptr(unsafe.Pointer(ThreadSecurityDescriptor)),
|
||||
uintptr(DebugPort),
|
||||
uintptr(unsafe.Pointer(ProcessInformation)),
|
||||
)
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
// Fork creates a clone of the current process using the undocumented
|
||||
// RtlCloneUserProcess call in ntdll, similar to unix fork(). The
|
||||
// return value in the parent is the child PID. In the child it is 0.
|
||||
func Fork() (pid uintptr, e error) {
|
||||
|
||||
pi := &RTL_USER_PROCESS_INFORMATION{}
|
||||
|
||||
ret := RtlCloneUserProcess(
|
||||
RTL_CLONE_PROCESS_FLAGS_CREATE_SUSPENDED|RTL_CLONE_PROCESS_FLAGS_INHERIT_HANDLES,
|
||||
nil,
|
||||
nil,
|
||||
HANDLE(0),
|
||||
pi,
|
||||
)
|
||||
|
||||
switch ret {
|
||||
case RTL_CLONE_PARENT:
|
||||
pid = pi.ClientId.UniqueProcess
|
||||
ht, err := OpenThread(THREAD_ALL_ACCESS, false, pi.ClientId.UniqueThread)
|
||||
if err != nil {
|
||||
e = fmt.Errorf("OpenThread: %s", err)
|
||||
}
|
||||
err = ResumeThread(ht)
|
||||
if err != nil {
|
||||
e = fmt.Errorf("ResumeThread: %s", err)
|
||||
}
|
||||
CloseHandle(ht)
|
||||
case RTL_CLONE_CHILD:
|
||||
pid = 0
|
||||
err := AllocConsole()
|
||||
if err != nil {
|
||||
e = fmt.Errorf("AllocConsole: %s", err)
|
||||
}
|
||||
default:
|
||||
e = fmt.Errorf("0x%x", ret)
|
||||
}
|
||||
return
|
||||
}
|
|
@ -1,26 +0,0 @@
|
|||
package w32
|
||||
|
||||
const (
|
||||
RTL_CLONE_PROCESS_FLAGS_CREATE_SUSPENDED = 0x00000001
|
||||
RTL_CLONE_PROCESS_FLAGS_INHERIT_HANDLES = 0x00000002
|
||||
RTL_CLONE_PROCESS_FLAGS_NO_SYNCHRONIZE = 0x00000004
|
||||
|
||||
RTL_CLONE_PARENT = 0
|
||||
RTL_CLONE_CHILD = 297
|
||||
|
||||
THREAD_TERMINATE = 0x0001
|
||||
THREAD_SUSPEND_RESUME = 0x0002
|
||||
THREAD_GET_CONTEXT = 0x0008
|
||||
THREAD_SET_CONTEXT = 0x0010
|
||||
THREAD_SET_INFORMATION = 0x0020
|
||||
THREAD_QUERY_INFORMATION = 0x0040
|
||||
THREAD_SET_THREAD_TOKEN = 0x0080
|
||||
THREAD_IMPERSONATE = 0x0100
|
||||
THREAD_DIRECT_IMPERSONATION = 0x0200
|
||||
THREAD_SET_LIMITED_INFORMATION = 0x0400
|
||||
THREAD_QUERY_LIMITED_INFORMATION = 0x0800
|
||||
THREAD_ALL_ACCESS = STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0xffff
|
||||
|
||||
PROCESS_SET_SESSIONID = 0x0004
|
||||
PROCESS_ALL_ACCESS = STANDARD_RIGHTS_REQUIRED | SYNCHRONIZE | 0xffff
|
||||
)
|
|
@ -1,50 +0,0 @@
|
|||
package w32
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"io/ioutil"
|
||||
"os"
|
||||
"path"
|
||||
"strconv"
|
||||
"testing"
|
||||
"time"
|
||||
)
|
||||
|
||||
var forkFn = path.Join(os.TempDir(), "forktest.pid")
|
||||
|
||||
func TestFork(t *testing.T) {
|
||||
|
||||
ppid := os.Getpid()
|
||||
t.Logf("[OK] I am PID %d", ppid)
|
||||
pid, err := Fork()
|
||||
if err != nil {
|
||||
t.Fatalf("[!!] Failed to fork. PID: %d: %s", pid, err)
|
||||
}
|
||||
|
||||
if pid == 0 {
|
||||
// We can't log anything here because our stdout doesn't point
|
||||
// to the same console as our parent.
|
||||
//
|
||||
// This process won't show up in Task Manager, and os.Getpid() won't
|
||||
// work, I guess because we haven't told CSRSS we exist.
|
||||
f, _ := os.Create(forkFn)
|
||||
f.WriteString(fmt.Sprintf("%d", ppid))
|
||||
f.Close()
|
||||
} else {
|
||||
t.Logf("[OK] Forked child with PID %d", pid)
|
||||
t.Logf("[OK] Sleeping, then trying to read checkfile.")
|
||||
time.Sleep(2 * time.Second)
|
||||
raw, err := ioutil.ReadFile(forkFn)
|
||||
if err != nil {
|
||||
t.Fatalf("[!!] Failed to read PID checkfile: %s", err)
|
||||
}
|
||||
if string(raw) == strconv.Itoa(ppid) {
|
||||
t.Logf("[OK] Found PID checkfile - PID matches!")
|
||||
} else {
|
||||
t.Errorf("[!] Child reported PID %q vs %q!", string(raw), strconv.Itoa(ppid))
|
||||
}
|
||||
os.Remove(forkFn)
|
||||
|
||||
}
|
||||
|
||||
}
|
|
@ -1,89 +0,0 @@
|
|||
package w32
|
||||
|
||||
// combase!_SECTION_IMAGE_INFORMATION
|
||||
// +0x000 TransferAddress : Ptr64 Void
|
||||
// +0x008 ZeroBits : Uint4B
|
||||
// +0x010 MaximumStackSize : Uint8B
|
||||
// +0x018 CommittedStackSize : Uint8B
|
||||
// +0x020 SubSystemType : Uint4B
|
||||
// +0x024 SubSystemMinorVersion : Uint2B
|
||||
// +0x026 SubSystemMajorVersion : Uint2B
|
||||
// +0x024 SubSystemVersion : Uint4B
|
||||
// +0x028 MajorOperatingSystemVersion : Uint2B
|
||||
// +0x02a MinorOperatingSystemVersion : Uint2B
|
||||
// +0x028 OperatingSystemVersion : Uint4B
|
||||
// +0x02c ImageCharacteristics : Uint2B
|
||||
// +0x02e DllCharacteristics : Uint2B
|
||||
// +0x030 Machine : Uint2B
|
||||
// +0x032 ImageContainsCode : UChar
|
||||
// +0x033 ImageFlags : UChar
|
||||
// +0x033 ComPlusNativeReady : Pos 0, 1 Bit
|
||||
// +0x033 ComPlusILOnly : Pos 1, 1 Bit
|
||||
// +0x033 ImageDynamicallyRelocated : Pos 2, 1 Bit
|
||||
// +0x033 ImageMappedFlat : Pos 3, 1 Bit
|
||||
// +0x033 BaseBelow4gb : Pos 4, 1 Bit
|
||||
// +0x033 ComPlusPrefer32bit : Pos 5, 1 Bit
|
||||
// +0x033 Reserved : Pos 6, 2 Bits
|
||||
// +0x034 LoaderFlags : Uint4B
|
||||
// +0x038 ImageFileSize : Uint4B
|
||||
// +0x03c CheckSum : Uint4B
|
||||
type SECTION_IMAGE_INFORMATION struct {
|
||||
TransferAddress uintptr
|
||||
ZeroBits uint32
|
||||
MaximumStackSize uint64
|
||||
CommittedStackSize uint64
|
||||
SubSystemType uint32
|
||||
SubSystemMinorVersion uint16
|
||||
SubSystemMajorVersion uint16
|
||||
SubSystemVersion uint32
|
||||
MajorOperatingSystemVersion uint16
|
||||
MinorOperatingSystemVersion uint16
|
||||
OperatingSystemVersion uint32
|
||||
ImageCharacteristics uint16
|
||||
DllCharacteristics uint16
|
||||
Machine uint16
|
||||
ImageContainsCode uint8
|
||||
ImageFlags uint8
|
||||
ComPlusFlags uint8
|
||||
LoaderFlags uint32
|
||||
ImageFileSize uint32
|
||||
CheckSum uint32
|
||||
}
|
||||
|
||||
func (si *SECTION_IMAGE_INFORMATION) ComPlusNativeReady() bool {
|
||||
return (si.ComPlusFlags & (1 << 0)) == 1
|
||||
}
|
||||
|
||||
func (si *SECTION_IMAGE_INFORMATION) ComPlusILOnly() bool {
|
||||
return (si.ComPlusFlags & (1 << 1)) == 1
|
||||
}
|
||||
|
||||
func (si *SECTION_IMAGE_INFORMATION) ImageDynamicallyRelocated() bool {
|
||||
return (si.ComPlusFlags & (1 << 2)) == 1
|
||||
}
|
||||
|
||||
func (si *SECTION_IMAGE_INFORMATION) ImageMappedFlat() bool {
|
||||
return (si.ComPlusFlags & (1 << 3)) == 1
|
||||
}
|
||||
|
||||
func (si *SECTION_IMAGE_INFORMATION) BaseBelow4gb() bool {
|
||||
return (si.ComPlusFlags & (1 << 4)) == 1
|
||||
}
|
||||
|
||||
func (si *SECTION_IMAGE_INFORMATION) ComPlusPrefer32bit() bool {
|
||||
return (si.ComPlusFlags & (1 << 5)) == 1
|
||||
}
|
||||
|
||||
// combase!_RTL_USER_PROCESS_INFORMATION
|
||||
// +0x000 Length : Uint4B
|
||||
// +0x008 Process : Ptr64 Void
|
||||
// +0x010 Thread : Ptr64 Void
|
||||
// +0x018 ClientId : _CLIENT_ID
|
||||
// +0x028 ImageInformation : _SECTION_IMAGE_INFORMATION
|
||||
type RTL_USER_PROCESS_INFORMATION struct {
|
||||
Length uint32
|
||||
Process HANDLE
|
||||
Thread HANDLE
|
||||
ClientId CLIENT_ID
|
||||
ImageInformation SECTION_IMAGE_INFORMATION
|
||||
}
|
|
@ -1,543 +0,0 @@
|
|||
// Copyright 2010-2012 The W32 Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
package w32
|
||||
|
||||
import (
|
||||
"syscall"
|
||||
"unsafe"
|
||||
)
|
||||
|
||||
var (
|
||||
modgdi32 = syscall.NewLazyDLL("gdi32.dll")
|
||||
|
||||
procGetDeviceCaps = modgdi32.NewProc("GetDeviceCaps")
|
||||
procGetCurrentObject = modgdi32.NewProc("GetCurrentObject")
|
||||
procDeleteObject = modgdi32.NewProc("DeleteObject")
|
||||
procCreateFontIndirect = modgdi32.NewProc("CreateFontIndirectW")
|
||||
procAbortDoc = modgdi32.NewProc("AbortDoc")
|
||||
procBitBlt = modgdi32.NewProc("BitBlt")
|
||||
procPatBlt = modgdi32.NewProc("PatBlt")
|
||||
procCloseEnhMetaFile = modgdi32.NewProc("CloseEnhMetaFile")
|
||||
procCopyEnhMetaFile = modgdi32.NewProc("CopyEnhMetaFileW")
|
||||
procCreateBrushIndirect = modgdi32.NewProc("CreateBrushIndirect")
|
||||
procCreateCompatibleDC = modgdi32.NewProc("CreateCompatibleDC")
|
||||
procCreateDC = modgdi32.NewProc("CreateDCW")
|
||||
procCreateCompatibleBitmap = modgdi32.NewProc("CreateCompatibleBitmap")
|
||||
procCreateDIBSection = modgdi32.NewProc("CreateDIBSection")
|
||||
procCreateEnhMetaFile = modgdi32.NewProc("CreateEnhMetaFileW")
|
||||
procCreateIC = modgdi32.NewProc("CreateICW")
|
||||
procDeleteDC = modgdi32.NewProc("DeleteDC")
|
||||
procDeleteEnhMetaFile = modgdi32.NewProc("DeleteEnhMetaFile")
|
||||
procEllipse = modgdi32.NewProc("Ellipse")
|
||||
procEndDoc = modgdi32.NewProc("EndDoc")
|
||||
procEndPage = modgdi32.NewProc("EndPage")
|
||||
procExtCreatePen = modgdi32.NewProc("ExtCreatePen")
|
||||
procGetEnhMetaFile = modgdi32.NewProc("GetEnhMetaFileW")
|
||||
procGetEnhMetaFileHeader = modgdi32.NewProc("GetEnhMetaFileHeader")
|
||||
procGetObject = modgdi32.NewProc("GetObjectW")
|
||||
procGetStockObject = modgdi32.NewProc("GetStockObject")
|
||||
procGetTextExtentExPoint = modgdi32.NewProc("GetTextExtentExPointW")
|
||||
procGetTextExtentPoint32 = modgdi32.NewProc("GetTextExtentPoint32W")
|
||||
procGetTextMetrics = modgdi32.NewProc("GetTextMetricsW")
|
||||
procLineTo = modgdi32.NewProc("LineTo")
|
||||
procMoveToEx = modgdi32.NewProc("MoveToEx")
|
||||
procPlayEnhMetaFile = modgdi32.NewProc("PlayEnhMetaFile")
|
||||
procRectangle = modgdi32.NewProc("Rectangle")
|
||||
procResetDC = modgdi32.NewProc("ResetDCW")
|
||||
procSelectObject = modgdi32.NewProc("SelectObject")
|
||||
procSetBkMode = modgdi32.NewProc("SetBkMode")
|
||||
procSetBrushOrgEx = modgdi32.NewProc("SetBrushOrgEx")
|
||||
procSetStretchBltMode = modgdi32.NewProc("SetStretchBltMode")
|
||||
procSetTextColor = modgdi32.NewProc("SetTextColor")
|
||||
procSetBkColor = modgdi32.NewProc("SetBkColor")
|
||||
procStartDoc = modgdi32.NewProc("StartDocW")
|
||||
procStartPage = modgdi32.NewProc("StartPage")
|
||||
procStretchBlt = modgdi32.NewProc("StretchBlt")
|
||||
procSetDIBitsToDevice = modgdi32.NewProc("SetDIBitsToDevice")
|
||||
procChoosePixelFormat = modgdi32.NewProc("ChoosePixelFormat")
|
||||
procDescribePixelFormat = modgdi32.NewProc("DescribePixelFormat")
|
||||
procGetEnhMetaFilePixelFormat = modgdi32.NewProc("GetEnhMetaFilePixelFormat")
|
||||
procGetPixelFormat = modgdi32.NewProc("GetPixelFormat")
|
||||
procSetPixelFormat = modgdi32.NewProc("SetPixelFormat")
|
||||
procSwapBuffers = modgdi32.NewProc("SwapBuffers")
|
||||
)
|
||||
|
||||
func GetDeviceCaps(hdc HDC, index int) int {
|
||||
ret, _, _ := procGetDeviceCaps.Call(
|
||||
uintptr(hdc),
|
||||
uintptr(index))
|
||||
|
||||
return int(ret)
|
||||
}
|
||||
|
||||
func GetCurrentObject(hdc HDC, uObjectType uint32) HGDIOBJ {
|
||||
ret, _, _ := procGetCurrentObject.Call(
|
||||
uintptr(hdc),
|
||||
uintptr(uObjectType))
|
||||
|
||||
return HGDIOBJ(ret)
|
||||
}
|
||||
|
||||
func DeleteObject(hObject HGDIOBJ) bool {
|
||||
ret, _, _ := procDeleteObject.Call(
|
||||
uintptr(hObject))
|
||||
|
||||
return ret != 0
|
||||
}
|
||||
|
||||
func CreateFontIndirect(logFont *LOGFONT) HFONT {
|
||||
ret, _, _ := procCreateFontIndirect.Call(
|
||||
uintptr(unsafe.Pointer(logFont)))
|
||||
|
||||
return HFONT(ret)
|
||||
}
|
||||
|
||||
func AbortDoc(hdc HDC) int {
|
||||
ret, _, _ := procAbortDoc.Call(
|
||||
uintptr(hdc))
|
||||
|
||||
return int(ret)
|
||||
}
|
||||
|
||||
func BitBlt(hdcDest HDC, nXDest, nYDest, nWidth, nHeight int, hdcSrc HDC, nXSrc, nYSrc int, dwRop uint) {
|
||||
ret, _, _ := procBitBlt.Call(
|
||||
uintptr(hdcDest),
|
||||
uintptr(nXDest),
|
||||
uintptr(nYDest),
|
||||
uintptr(nWidth),
|
||||
uintptr(nHeight),
|
||||
uintptr(hdcSrc),
|
||||
uintptr(nXSrc),
|
||||
uintptr(nYSrc),
|
||||
uintptr(dwRop))
|
||||
|
||||
if ret == 0 {
|
||||
panic("BitBlt failed")
|
||||
}
|
||||
}
|
||||
|
||||
func PatBlt(hdc HDC, nXLeft, nYLeft, nWidth, nHeight int, dwRop uint) {
|
||||
ret, _, _ := procPatBlt.Call(
|
||||
uintptr(hdc),
|
||||
uintptr(nXLeft),
|
||||
uintptr(nYLeft),
|
||||
uintptr(nWidth),
|
||||
uintptr(nHeight),
|
||||
uintptr(dwRop))
|
||||
|
||||
if ret == 0 {
|
||||
panic("PatBlt failed")
|
||||
}
|
||||
}
|
||||
|
||||
func CloseEnhMetaFile(hdc HDC) HENHMETAFILE {
|
||||
ret, _, _ := procCloseEnhMetaFile.Call(
|
||||
uintptr(hdc))
|
||||
|
||||
return HENHMETAFILE(ret)
|
||||
}
|
||||
|
||||
func CopyEnhMetaFile(hemfSrc HENHMETAFILE, lpszFile *uint16) HENHMETAFILE {
|
||||
ret, _, _ := procCopyEnhMetaFile.Call(
|
||||
uintptr(hemfSrc),
|
||||
uintptr(unsafe.Pointer(lpszFile)))
|
||||
|
||||
return HENHMETAFILE(ret)
|
||||
}
|
||||
|
||||
func CreateBrushIndirect(lplb *LOGBRUSH) HBRUSH {
|
||||
ret, _, _ := procCreateBrushIndirect.Call(
|
||||
uintptr(unsafe.Pointer(lplb)))
|
||||
|
||||
return HBRUSH(ret)
|
||||
}
|
||||
|
||||
func CreateCompatibleDC(hdc HDC) HDC {
|
||||
ret, _, _ := procCreateCompatibleDC.Call(
|
||||
uintptr(hdc))
|
||||
|
||||
if ret == 0 {
|
||||
panic("Create compatible DC failed")
|
||||
}
|
||||
|
||||
return HDC(ret)
|
||||
}
|
||||
|
||||
func CreateDC(lpszDriver, lpszDevice, lpszOutput *uint16, lpInitData *DEVMODE) HDC {
|
||||
ret, _, _ := procCreateDC.Call(
|
||||
uintptr(unsafe.Pointer(lpszDriver)),
|
||||
uintptr(unsafe.Pointer(lpszDevice)),
|
||||
uintptr(unsafe.Pointer(lpszOutput)),
|
||||
uintptr(unsafe.Pointer(lpInitData)))
|
||||
|
||||
return HDC(ret)
|
||||
}
|
||||
|
||||
func CreateCompatibleBitmap(hdc HDC, width, height uint) HBITMAP {
|
||||
ret, _, _ := procCreateCompatibleBitmap.Call(
|
||||
uintptr(hdc),
|
||||
uintptr(width),
|
||||
uintptr(height))
|
||||
|
||||
return HBITMAP(ret)
|
||||
}
|
||||
|
||||
func CreateDIBSection(hdc HDC, pbmi *BITMAPINFO, iUsage uint, ppvBits *unsafe.Pointer, hSection HANDLE, dwOffset uint) HBITMAP {
|
||||
ret, _, _ := procCreateDIBSection.Call(
|
||||
uintptr(hdc),
|
||||
uintptr(unsafe.Pointer(pbmi)),
|
||||
uintptr(iUsage),
|
||||
uintptr(unsafe.Pointer(ppvBits)),
|
||||
uintptr(hSection),
|
||||
uintptr(dwOffset))
|
||||
|
||||
return HBITMAP(ret)
|
||||
}
|
||||
|
||||
func CreateEnhMetaFile(hdcRef HDC, lpFilename *uint16, lpRect *RECT, lpDescription *uint16) HDC {
|
||||
ret, _, _ := procCreateEnhMetaFile.Call(
|
||||
uintptr(hdcRef),
|
||||
uintptr(unsafe.Pointer(lpFilename)),
|
||||
uintptr(unsafe.Pointer(lpRect)),
|
||||
uintptr(unsafe.Pointer(lpDescription)))
|
||||
|
||||
return HDC(ret)
|
||||
}
|
||||
|
||||
func CreateIC(lpszDriver, lpszDevice, lpszOutput *uint16, lpdvmInit *DEVMODE) HDC {
|
||||
ret, _, _ := procCreateIC.Call(
|
||||
uintptr(unsafe.Pointer(lpszDriver)),
|
||||
uintptr(unsafe.Pointer(lpszDevice)),
|
||||
uintptr(unsafe.Pointer(lpszOutput)),
|
||||
uintptr(unsafe.Pointer(lpdvmInit)))
|
||||
|
||||
return HDC(ret)
|
||||
}
|
||||
|
||||
func DeleteDC(hdc HDC) bool {
|
||||
ret, _, _ := procDeleteDC.Call(
|
||||
uintptr(hdc))
|
||||
|
||||
return ret != 0
|
||||
}
|
||||
|
||||
func DeleteEnhMetaFile(hemf HENHMETAFILE) bool {
|
||||
ret, _, _ := procDeleteEnhMetaFile.Call(
|
||||
uintptr(hemf))
|
||||
|
||||
return ret != 0
|
||||
}
|
||||
|
||||
func Ellipse(hdc HDC, nLeftRect, nTopRect, nRightRect, nBottomRect int) bool {
|
||||
ret, _, _ := procEllipse.Call(
|
||||
uintptr(hdc),
|
||||
uintptr(nLeftRect),
|
||||
uintptr(nTopRect),
|
||||
uintptr(nRightRect),
|
||||
uintptr(nBottomRect))
|
||||
|
||||
return ret != 0
|
||||
}
|
||||
|
||||
func EndDoc(hdc HDC) int {
|
||||
ret, _, _ := procEndDoc.Call(
|
||||
uintptr(hdc))
|
||||
|
||||
return int(ret)
|
||||
}
|
||||
|
||||
func EndPage(hdc HDC) int {
|
||||
ret, _, _ := procEndPage.Call(
|
||||
uintptr(hdc))
|
||||
|
||||
return int(ret)
|
||||
}
|
||||
|
||||
func ExtCreatePen(dwPenStyle, dwWidth uint, lplb *LOGBRUSH, dwStyleCount uint, lpStyle *uint) HPEN {
|
||||
ret, _, _ := procExtCreatePen.Call(
|
||||
uintptr(dwPenStyle),
|
||||
uintptr(dwWidth),
|
||||
uintptr(unsafe.Pointer(lplb)),
|
||||
uintptr(dwStyleCount),
|
||||
uintptr(unsafe.Pointer(lpStyle)))
|
||||
|
||||
return HPEN(ret)
|
||||
}
|
||||
|
||||
func GetEnhMetaFile(lpszMetaFile *uint16) HENHMETAFILE {
|
||||
ret, _, _ := procGetEnhMetaFile.Call(
|
||||
uintptr(unsafe.Pointer(lpszMetaFile)))
|
||||
|
||||
return HENHMETAFILE(ret)
|
||||
}
|
||||
|
||||
func GetEnhMetaFileHeader(hemf HENHMETAFILE, cbBuffer uint, lpemh *ENHMETAHEADER) uint {
|
||||
ret, _, _ := procGetEnhMetaFileHeader.Call(
|
||||
uintptr(hemf),
|
||||
uintptr(cbBuffer),
|
||||
uintptr(unsafe.Pointer(lpemh)))
|
||||
|
||||
return uint(ret)
|
||||
}
|
||||
|
||||
func GetObject(hgdiobj HGDIOBJ, cbBuffer uintptr, lpvObject unsafe.Pointer) int {
|
||||
ret, _, _ := procGetObject.Call(
|
||||
uintptr(hgdiobj),
|
||||
uintptr(cbBuffer),
|
||||
uintptr(lpvObject))
|
||||
|
||||
return int(ret)
|
||||
}
|
||||
|
||||
func GetStockObject(fnObject int) HGDIOBJ {
|
||||
ret, _, _ := procGetStockObject.Call(
|
||||
uintptr(fnObject))
|
||||
|
||||
return HGDIOBJ(ret)
|
||||
}
|
||||
|
||||
func GetTextExtentExPoint(hdc HDC, lpszStr *uint16, cchString, nMaxExtent int, lpnFit, alpDx *int, lpSize *SIZE) bool {
|
||||
ret, _, _ := procGetTextExtentExPoint.Call(
|
||||
uintptr(hdc),
|
||||
uintptr(unsafe.Pointer(lpszStr)),
|
||||
uintptr(cchString),
|
||||
uintptr(nMaxExtent),
|
||||
uintptr(unsafe.Pointer(lpnFit)),
|
||||
uintptr(unsafe.Pointer(alpDx)),
|
||||
uintptr(unsafe.Pointer(lpSize)))
|
||||
|
||||
return ret != 0
|
||||
}
|
||||
|
||||
func GetTextExtentPoint32(hdc HDC, lpString *uint16, c int, lpSize *SIZE) bool {
|
||||
ret, _, _ := procGetTextExtentPoint32.Call(
|
||||
uintptr(hdc),
|
||||
uintptr(unsafe.Pointer(lpString)),
|
||||
uintptr(c),
|
||||
uintptr(unsafe.Pointer(lpSize)))
|
||||
|
||||
return ret != 0
|
||||
}
|
||||
|
||||
func GetTextMetrics(hdc HDC, lptm *TEXTMETRIC) bool {
|
||||
ret, _, _ := procGetTextMetrics.Call(
|
||||
uintptr(hdc),
|
||||
uintptr(unsafe.Pointer(lptm)))
|
||||
|
||||
return ret != 0
|
||||
}
|
||||
|
||||
func LineTo(hdc HDC, nXEnd, nYEnd int) bool {
|
||||
ret, _, _ := procLineTo.Call(
|
||||
uintptr(hdc),
|
||||
uintptr(nXEnd),
|
||||
uintptr(nYEnd))
|
||||
|
||||
return ret != 0
|
||||
}
|
||||
|
||||
func MoveToEx(hdc HDC, x, y int, lpPoint *POINT) bool {
|
||||
ret, _, _ := procMoveToEx.Call(
|
||||
uintptr(hdc),
|
||||
uintptr(x),
|
||||
uintptr(y),
|
||||
uintptr(unsafe.Pointer(lpPoint)))
|
||||
|
||||
return ret != 0
|
||||
}
|
||||
|
||||
func PlayEnhMetaFile(hdc HDC, hemf HENHMETAFILE, lpRect *RECT) bool {
|
||||
ret, _, _ := procPlayEnhMetaFile.Call(
|
||||
uintptr(hdc),
|
||||
uintptr(hemf),
|
||||
uintptr(unsafe.Pointer(lpRect)))
|
||||
|
||||
return ret != 0
|
||||
}
|
||||
|
||||
func Rectangle(hdc HDC, nLeftRect, nTopRect, nRightRect, nBottomRect int) bool {
|
||||
ret, _, _ := procRectangle.Call(
|
||||
uintptr(hdc),
|
||||
uintptr(nLeftRect),
|
||||
uintptr(nTopRect),
|
||||
uintptr(nRightRect),
|
||||
uintptr(nBottomRect))
|
||||
|
||||
return ret != 0
|
||||
}
|
||||
|
||||
func ResetDC(hdc HDC, lpInitData *DEVMODE) HDC {
|
||||
ret, _, _ := procResetDC.Call(
|
||||
uintptr(hdc),
|
||||
uintptr(unsafe.Pointer(lpInitData)))
|
||||
|
||||
return HDC(ret)
|
||||
}
|
||||
|
||||
func SelectObject(hdc HDC, hgdiobj HGDIOBJ) HGDIOBJ {
|
||||
ret, _, _ := procSelectObject.Call(
|
||||
uintptr(hdc),
|
||||
uintptr(hgdiobj))
|
||||
|
||||
if ret == 0 {
|
||||
panic("SelectObject failed")
|
||||
}
|
||||
|
||||
return HGDIOBJ(ret)
|
||||
}
|
||||
|
||||
func SetBkMode(hdc HDC, iBkMode int) int {
|
||||
ret, _, _ := procSetBkMode.Call(
|
||||
uintptr(hdc),
|
||||
uintptr(iBkMode))
|
||||
|
||||
if ret == 0 {
|
||||
panic("SetBkMode failed")
|
||||
}
|
||||
|
||||
return int(ret)
|
||||
}
|
||||
|
||||
func SetBrushOrgEx(hdc HDC, nXOrg, nYOrg int, lppt *POINT) bool {
|
||||
ret, _, _ := procSetBrushOrgEx.Call(
|
||||
uintptr(hdc),
|
||||
uintptr(nXOrg),
|
||||
uintptr(nYOrg),
|
||||
uintptr(unsafe.Pointer(lppt)))
|
||||
|
||||
return ret != 0
|
||||
}
|
||||
|
||||
func SetStretchBltMode(hdc HDC, iStretchMode int) int {
|
||||
ret, _, _ := procSetStretchBltMode.Call(
|
||||
uintptr(hdc),
|
||||
uintptr(iStretchMode))
|
||||
|
||||
return int(ret)
|
||||
}
|
||||
|
||||
func SetTextColor(hdc HDC, crColor COLORREF) COLORREF {
|
||||
ret, _, _ := procSetTextColor.Call(
|
||||
uintptr(hdc),
|
||||
uintptr(crColor))
|
||||
|
||||
if ret == CLR_INVALID {
|
||||
panic("SetTextColor failed")
|
||||
}
|
||||
|
||||
return COLORREF(ret)
|
||||
}
|
||||
|
||||
func SetBkColor(hdc HDC, crColor COLORREF) COLORREF {
|
||||
ret, _, _ := procSetBkColor.Call(
|
||||
uintptr(hdc),
|
||||
uintptr(crColor))
|
||||
|
||||
if ret == CLR_INVALID {
|
||||
panic("SetBkColor failed")
|
||||
}
|
||||
|
||||
return COLORREF(ret)
|
||||
}
|
||||
|
||||
func StartDoc(hdc HDC, lpdi *DOCINFO) int {
|
||||
ret, _, _ := procStartDoc.Call(
|
||||
uintptr(hdc),
|
||||
uintptr(unsafe.Pointer(lpdi)))
|
||||
|
||||
return int(ret)
|
||||
}
|
||||
|
||||
func StartPage(hdc HDC) int {
|
||||
ret, _, _ := procStartPage.Call(
|
||||
uintptr(hdc))
|
||||
|
||||
return int(ret)
|
||||
}
|
||||
|
||||
func StretchBlt(hdcDest HDC, nXOriginDest, nYOriginDest, nWidthDest, nHeightDest int, hdcSrc HDC, nXOriginSrc, nYOriginSrc, nWidthSrc, nHeightSrc int, dwRop uint) {
|
||||
ret, _, _ := procStretchBlt.Call(
|
||||
uintptr(hdcDest),
|
||||
uintptr(nXOriginDest),
|
||||
uintptr(nYOriginDest),
|
||||
uintptr(nWidthDest),
|
||||
uintptr(nHeightDest),
|
||||
uintptr(hdcSrc),
|
||||
uintptr(nXOriginSrc),
|
||||
uintptr(nYOriginSrc),
|
||||
uintptr(nWidthSrc),
|
||||
uintptr(nHeightSrc),
|
||||
uintptr(dwRop))
|
||||
|
||||
if ret == 0 {
|
||||
panic("StretchBlt failed")
|
||||
}
|
||||
}
|
||||
|
||||
func SetDIBitsToDevice(hdc HDC, xDest, yDest, dwWidth, dwHeight, xSrc, ySrc int, uStartScan, cScanLines uint, lpvBits []byte, lpbmi *BITMAPINFO, fuColorUse uint) int {
|
||||
ret, _, _ := procSetDIBitsToDevice.Call(
|
||||
uintptr(hdc),
|
||||
uintptr(xDest),
|
||||
uintptr(yDest),
|
||||
uintptr(dwWidth),
|
||||
uintptr(dwHeight),
|
||||
uintptr(xSrc),
|
||||
uintptr(ySrc),
|
||||
uintptr(uStartScan),
|
||||
uintptr(cScanLines),
|
||||
uintptr(unsafe.Pointer(&lpvBits[0])),
|
||||
uintptr(unsafe.Pointer(lpbmi)),
|
||||
uintptr(fuColorUse))
|
||||
|
||||
return int(ret)
|
||||
}
|
||||
|
||||
func ChoosePixelFormat(hdc HDC, pfd *PIXELFORMATDESCRIPTOR) int {
|
||||
ret, _, _ := procChoosePixelFormat.Call(
|
||||
uintptr(hdc),
|
||||
uintptr(unsafe.Pointer(pfd)),
|
||||
)
|
||||
return int(ret)
|
||||
}
|
||||
|
||||
func DescribePixelFormat(hdc HDC, iPixelFormat int, nBytes uint, pfd *PIXELFORMATDESCRIPTOR) int {
|
||||
ret, _, _ := procDescribePixelFormat.Call(
|
||||
uintptr(hdc),
|
||||
uintptr(iPixelFormat),
|
||||
uintptr(nBytes),
|
||||
uintptr(unsafe.Pointer(pfd)),
|
||||
)
|
||||
return int(ret)
|
||||
}
|
||||
|
||||
func GetEnhMetaFilePixelFormat(hemf HENHMETAFILE, cbBuffer uint32, pfd *PIXELFORMATDESCRIPTOR) uint {
|
||||
ret, _, _ := procGetEnhMetaFilePixelFormat.Call(
|
||||
uintptr(hemf),
|
||||
uintptr(cbBuffer),
|
||||
uintptr(unsafe.Pointer(pfd)),
|
||||
)
|
||||
return uint(ret)
|
||||
}
|
||||
|
||||
func GetPixelFormat(hdc HDC) int {
|
||||
ret, _, _ := procGetPixelFormat.Call(
|
||||
uintptr(hdc),
|
||||
)
|
||||
return int(ret)
|
||||
}
|
||||
|
||||
func SetPixelFormat(hdc HDC, iPixelFormat int, pfd *PIXELFORMATDESCRIPTOR) bool {
|
||||
ret, _, _ := procSetPixelFormat.Call(
|
||||
uintptr(hdc),
|
||||
uintptr(iPixelFormat),
|
||||
uintptr(unsafe.Pointer(pfd)),
|
||||
)
|
||||
return ret == TRUE
|
||||
}
|
||||
|
||||
func SwapBuffers(hdc HDC) bool {
|
||||
ret, _, _ := procSwapBuffers.Call(uintptr(hdc))
|
||||
return ret == TRUE
|
||||
}
|
|
@ -1,175 +0,0 @@
|
|||
// Copyright 2010-2012 The W32 Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
package w32
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
"syscall"
|
||||
"unsafe"
|
||||
)
|
||||
|
||||
const (
|
||||
Ok = 0
|
||||
GenericError = 1
|
||||
InvalidParameter = 2
|
||||
OutOfMemory = 3
|
||||
ObjectBusy = 4
|
||||
InsufficientBuffer = 5
|
||||
NotImplemented = 6
|
||||
Win32Error = 7
|
||||
WrongState = 8
|
||||
Aborted = 9
|
||||
FileNotFound = 10
|
||||
ValueOverflow = 11
|
||||
AccessDenied = 12
|
||||
UnknownImageFormat = 13
|
||||
FontFamilyNotFound = 14
|
||||
FontStyleNotFound = 15
|
||||
NotTrueTypeFont = 16
|
||||
UnsupportedGdiplusVersion = 17
|
||||
GdiplusNotInitialized = 18
|
||||
PropertyNotFound = 19
|
||||
PropertyNotSupported = 20
|
||||
ProfileNotFound = 21
|
||||
)
|
||||
|
||||
func GetGpStatus(s int32) string {
|
||||
switch s {
|
||||
case Ok:
|
||||
return "Ok"
|
||||
case GenericError:
|
||||
return "GenericError"
|
||||
case InvalidParameter:
|
||||
return "InvalidParameter"
|
||||
case OutOfMemory:
|
||||
return "OutOfMemory"
|
||||
case ObjectBusy:
|
||||
return "ObjectBusy"
|
||||
case InsufficientBuffer:
|
||||
return "InsufficientBuffer"
|
||||
case NotImplemented:
|
||||
return "NotImplemented"
|
||||
case Win32Error:
|
||||
return "Win32Error"
|
||||
case WrongState:
|
||||
return "WrongState"
|
||||
case Aborted:
|
||||
return "Aborted"
|
||||
case FileNotFound:
|
||||
return "FileNotFound"
|
||||
case ValueOverflow:
|
||||
return "ValueOverflow"
|
||||
case AccessDenied:
|
||||
return "AccessDenied"
|
||||
case UnknownImageFormat:
|
||||
return "UnknownImageFormat"
|
||||
case FontFamilyNotFound:
|
||||
return "FontFamilyNotFound"
|
||||
case FontStyleNotFound:
|
||||
return "FontStyleNotFound"
|
||||
case NotTrueTypeFont:
|
||||
return "NotTrueTypeFont"
|
||||
case UnsupportedGdiplusVersion:
|
||||
return "UnsupportedGdiplusVersion"
|
||||
case GdiplusNotInitialized:
|
||||
return "GdiplusNotInitialized"
|
||||
case PropertyNotFound:
|
||||
return "PropertyNotFound"
|
||||
case PropertyNotSupported:
|
||||
return "PropertyNotSupported"
|
||||
case ProfileNotFound:
|
||||
return "ProfileNotFound"
|
||||
}
|
||||
return "Unknown Status Value"
|
||||
}
|
||||
|
||||
var (
|
||||
token uintptr
|
||||
|
||||
modgdiplus = syscall.NewLazyDLL("gdiplus.dll")
|
||||
|
||||
procGdipCreateBitmapFromFile = modgdiplus.NewProc("GdipCreateBitmapFromFile")
|
||||
procGdipCreateBitmapFromHBITMAP = modgdiplus.NewProc("GdipCreateBitmapFromHBITMAP")
|
||||
procGdipCreateHBITMAPFromBitmap = modgdiplus.NewProc("GdipCreateHBITMAPFromBitmap")
|
||||
procGdipCreateBitmapFromResource = modgdiplus.NewProc("GdipCreateBitmapFromResource")
|
||||
procGdipCreateBitmapFromStream = modgdiplus.NewProc("GdipCreateBitmapFromStream")
|
||||
procGdipDisposeImage = modgdiplus.NewProc("GdipDisposeImage")
|
||||
procGdiplusShutdown = modgdiplus.NewProc("GdiplusShutdown")
|
||||
procGdiplusStartup = modgdiplus.NewProc("GdiplusStartup")
|
||||
)
|
||||
|
||||
func GdipCreateBitmapFromFile(filename string) (*uintptr, error) {
|
||||
var bitmap *uintptr
|
||||
ret, _, _ := procGdipCreateBitmapFromFile.Call(
|
||||
uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(filename))),
|
||||
uintptr(unsafe.Pointer(&bitmap)))
|
||||
|
||||
if ret != Ok {
|
||||
return nil, errors.New(fmt.Sprintf("GdipCreateBitmapFromFile failed with status '%s' for file '%s'", GetGpStatus(int32(ret)), filename))
|
||||
}
|
||||
|
||||
return bitmap, nil
|
||||
}
|
||||
|
||||
func GdipCreateBitmapFromResource(instance HINSTANCE, resId *uint16) (*uintptr, error) {
|
||||
var bitmap *uintptr
|
||||
ret, _, _ := procGdipCreateBitmapFromResource.Call(
|
||||
uintptr(instance),
|
||||
uintptr(unsafe.Pointer(resId)),
|
||||
uintptr(unsafe.Pointer(&bitmap)))
|
||||
|
||||
if ret != Ok {
|
||||
return nil, errors.New(fmt.Sprintf("GdiCreateBitmapFromResource failed with status '%s'", GetGpStatus(int32(ret))))
|
||||
}
|
||||
|
||||
return bitmap, nil
|
||||
}
|
||||
|
||||
func GdipCreateBitmapFromStream(stream *IStream) (*uintptr, error) {
|
||||
var bitmap *uintptr
|
||||
ret, _, _ := procGdipCreateBitmapFromStream.Call(
|
||||
uintptr(unsafe.Pointer(stream)),
|
||||
uintptr(unsafe.Pointer(&bitmap)))
|
||||
|
||||
if ret != Ok {
|
||||
return nil, errors.New(fmt.Sprintf("GdipCreateBitmapFromStream failed with status '%s'", GetGpStatus(int32(ret))))
|
||||
}
|
||||
|
||||
return bitmap, nil
|
||||
}
|
||||
|
||||
func GdipCreateHBITMAPFromBitmap(bitmap *uintptr, background uint32) (HBITMAP, error) {
|
||||
var hbitmap HBITMAP
|
||||
ret, _, _ := procGdipCreateHBITMAPFromBitmap.Call(
|
||||
uintptr(unsafe.Pointer(bitmap)),
|
||||
uintptr(unsafe.Pointer(&hbitmap)),
|
||||
uintptr(background))
|
||||
|
||||
if ret != Ok {
|
||||
return 0, errors.New(fmt.Sprintf("GdipCreateHBITMAPFromBitmap failed with status '%s'", GetGpStatus(int32(ret))))
|
||||
}
|
||||
|
||||
return hbitmap, nil
|
||||
}
|
||||
|
||||
func GdipDisposeImage(image *uintptr) {
|
||||
procGdipDisposeImage.Call(uintptr(unsafe.Pointer(image)))
|
||||
}
|
||||
|
||||
func GdiplusShutdown() {
|
||||
procGdiplusShutdown.Call(token)
|
||||
}
|
||||
|
||||
func GdiplusStartup(input *GdiplusStartupInput, output *GdiplusStartupOutput) {
|
||||
ret, _, _ := procGdiplusStartup.Call(
|
||||
uintptr(unsafe.Pointer(&token)),
|
||||
uintptr(unsafe.Pointer(input)),
|
||||
uintptr(unsafe.Pointer(output)))
|
||||
|
||||
if ret != Ok {
|
||||
panic("GdiplusStartup failed with status " + GetGpStatus(int32(ret)))
|
||||
}
|
||||
}
|
|
@ -1,43 +0,0 @@
|
|||
// Copyright 2010-2012 The W32 Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
package w32
|
||||
|
||||
import (
|
||||
"unsafe"
|
||||
)
|
||||
|
||||
type pIDispatchVtbl struct {
|
||||
pQueryInterface uintptr
|
||||
pAddRef uintptr
|
||||
pRelease uintptr
|
||||
pGetTypeInfoCount uintptr
|
||||
pGetTypeInfo uintptr
|
||||
pGetIDsOfNames uintptr
|
||||
pInvoke uintptr
|
||||
}
|
||||
|
||||
type IDispatch struct {
|
||||
lpVtbl *pIDispatchVtbl
|
||||
}
|
||||
|
||||
func (this *IDispatch) QueryInterface(id *GUID) *IDispatch {
|
||||
return ComQueryInterface((*IUnknown)(unsafe.Pointer(this)), id)
|
||||
}
|
||||
|
||||
func (this *IDispatch) AddRef() int32 {
|
||||
return ComAddRef((*IUnknown)(unsafe.Pointer(this)))
|
||||
}
|
||||
|
||||
func (this *IDispatch) Release() int32 {
|
||||
return ComRelease((*IUnknown)(unsafe.Pointer(this)))
|
||||
}
|
||||
|
||||
func (this *IDispatch) GetIDsOfName(names []string) []int32 {
|
||||
return ComGetIDsOfName(this, names)
|
||||
}
|
||||
|
||||
func (this *IDispatch) Invoke(dispid int32, dispatch int16, params ...interface{}) *VARIANT {
|
||||
return ComInvoke(this, dispid, dispatch, params...)
|
||||
}
|
|
@ -1,31 +0,0 @@
|
|||
// Copyright 2010-2012 The W32 Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
package w32
|
||||
|
||||
import (
|
||||
"unsafe"
|
||||
)
|
||||
|
||||
type pIStreamVtbl struct {
|
||||
pQueryInterface uintptr
|
||||
pAddRef uintptr
|
||||
pRelease uintptr
|
||||
}
|
||||
|
||||
type IStream struct {
|
||||
lpVtbl *pIStreamVtbl
|
||||
}
|
||||
|
||||
func (this *IStream) QueryInterface(id *GUID) *IDispatch {
|
||||
return ComQueryInterface((*IUnknown)(unsafe.Pointer(this)), id)
|
||||
}
|
||||
|
||||
func (this *IStream) AddRef() int32 {
|
||||
return ComAddRef((*IUnknown)(unsafe.Pointer(this)))
|
||||
}
|
||||
|
||||
func (this *IStream) Release() int32 {
|
||||
return ComRelease((*IUnknown)(unsafe.Pointer(this)))
|
||||
}
|
|
@ -1,27 +0,0 @@
|
|||
// Copyright 2010-2012 The W32 Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
package w32
|
||||
|
||||
type pIUnknownVtbl struct {
|
||||
pQueryInterface uintptr
|
||||
pAddRef uintptr
|
||||
pRelease uintptr
|
||||
}
|
||||
|
||||
type IUnknown struct {
|
||||
lpVtbl *pIUnknownVtbl
|
||||
}
|
||||
|
||||
func (this *IUnknown) QueryInterface(id *GUID) *IDispatch {
|
||||
return ComQueryInterface(this, id)
|
||||
}
|
||||
|
||||
func (this *IUnknown) AddRef() int32 {
|
||||
return ComAddRef(this)
|
||||
}
|
||||
|
||||
func (this *IUnknown) Release() int32 {
|
||||
return ComRelease(this)
|
||||
}
|
|
@ -1,388 +0,0 @@
|
|||
// Copyright 2010-2012 The W32 Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
package w32
|
||||
|
||||
import (
|
||||
"syscall"
|
||||
"unsafe"
|
||||
)
|
||||
|
||||
var (
|
||||
modkernel32 = syscall.NewLazyDLL("kernel32.dll")
|
||||
|
||||
procGetModuleHandle = modkernel32.NewProc("GetModuleHandleW")
|
||||
procMulDiv = modkernel32.NewProc("MulDiv")
|
||||
procGetConsoleWindow = modkernel32.NewProc("GetConsoleWindow")
|
||||
procGetCurrentThread = modkernel32.NewProc("GetCurrentThread")
|
||||
procGetLogicalDrives = modkernel32.NewProc("GetLogicalDrives")
|
||||
procGetUserDefaultLCID = modkernel32.NewProc("GetUserDefaultLCID")
|
||||
procLstrlen = modkernel32.NewProc("lstrlenW")
|
||||
procLstrcpy = modkernel32.NewProc("lstrcpyW")
|
||||
procGlobalAlloc = modkernel32.NewProc("GlobalAlloc")
|
||||
procGlobalFree = modkernel32.NewProc("GlobalFree")
|
||||
procGlobalLock = modkernel32.NewProc("GlobalLock")
|
||||
procGlobalUnlock = modkernel32.NewProc("GlobalUnlock")
|
||||
procMoveMemory = modkernel32.NewProc("RtlMoveMemory")
|
||||
procFindResource = modkernel32.NewProc("FindResourceW")
|
||||
procSizeofResource = modkernel32.NewProc("SizeofResource")
|
||||
procLockResource = modkernel32.NewProc("LockResource")
|
||||
procLoadResource = modkernel32.NewProc("LoadResource")
|
||||
procGetLastError = modkernel32.NewProc("GetLastError")
|
||||
// procOpenProcess = modkernel32.NewProc("OpenProcess")
|
||||
// procTerminateProcess = modkernel32.NewProc("TerminateProcess")
|
||||
procCloseHandle = modkernel32.NewProc("CloseHandle")
|
||||
procCreateToolhelp32Snapshot = modkernel32.NewProc("CreateToolhelp32Snapshot")
|
||||
procModule32First = modkernel32.NewProc("Module32FirstW")
|
||||
procModule32Next = modkernel32.NewProc("Module32NextW")
|
||||
procGetSystemTimes = modkernel32.NewProc("GetSystemTimes")
|
||||
procGetConsoleScreenBufferInfo = modkernel32.NewProc("GetConsoleScreenBufferInfo")
|
||||
procSetConsoleTextAttribute = modkernel32.NewProc("SetConsoleTextAttribute")
|
||||
procGetDiskFreeSpaceEx = modkernel32.NewProc("GetDiskFreeSpaceExW")
|
||||
procGetProcessTimes = modkernel32.NewProc("GetProcessTimes")
|
||||
procSetSystemTime = modkernel32.NewProc("SetSystemTime")
|
||||
procGetSystemTime = modkernel32.NewProc("GetSystemTime")
|
||||
procVirtualAllocEx = modkernel32.NewProc("VirtualAllocEx")
|
||||
procVirtualFreeEx = modkernel32.NewProc("VirtualFreeEx")
|
||||
procWriteProcessMemory = modkernel32.NewProc("WriteProcessMemory")
|
||||
procReadProcessMemory = modkernel32.NewProc("ReadProcessMemory")
|
||||
procQueryPerformanceCounter = modkernel32.NewProc("QueryPerformanceCounter")
|
||||
procQueryPerformanceFrequency = modkernel32.NewProc("QueryPerformanceFrequency")
|
||||
)
|
||||
|
||||
func GetModuleHandle(modulename string) HINSTANCE {
|
||||
var mn uintptr
|
||||
if modulename == "" {
|
||||
mn = 0
|
||||
} else {
|
||||
mn = uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(modulename)))
|
||||
}
|
||||
ret, _, _ := procGetModuleHandle.Call(mn)
|
||||
return HINSTANCE(ret)
|
||||
}
|
||||
|
||||
func MulDiv(number, numerator, denominator int) int {
|
||||
ret, _, _ := procMulDiv.Call(
|
||||
uintptr(number),
|
||||
uintptr(numerator),
|
||||
uintptr(denominator))
|
||||
|
||||
return int(ret)
|
||||
}
|
||||
|
||||
func GetConsoleWindow() HWND {
|
||||
ret, _, _ := procGetConsoleWindow.Call()
|
||||
|
||||
return HWND(ret)
|
||||
}
|
||||
|
||||
func GetCurrentThread() HANDLE {
|
||||
ret, _, _ := procGetCurrentThread.Call()
|
||||
|
||||
return HANDLE(ret)
|
||||
}
|
||||
|
||||
func GetLogicalDrives() uint32 {
|
||||
ret, _, _ := procGetLogicalDrives.Call()
|
||||
|
||||
return uint32(ret)
|
||||
}
|
||||
|
||||
func GetUserDefaultLCID() uint32 {
|
||||
ret, _, _ := procGetUserDefaultLCID.Call()
|
||||
|
||||
return uint32(ret)
|
||||
}
|
||||
|
||||
func Lstrlen(lpString *uint16) int {
|
||||
ret, _, _ := procLstrlen.Call(uintptr(unsafe.Pointer(lpString)))
|
||||
|
||||
return int(ret)
|
||||
}
|
||||
|
||||
func Lstrcpy(buf []uint16, lpString *uint16) {
|
||||
procLstrcpy.Call(
|
||||
uintptr(unsafe.Pointer(&buf[0])),
|
||||
uintptr(unsafe.Pointer(lpString)))
|
||||
}
|
||||
|
||||
func GlobalAlloc(uFlags uint, dwBytes uint32) HGLOBAL {
|
||||
ret, _, _ := procGlobalAlloc.Call(
|
||||
uintptr(uFlags),
|
||||
uintptr(dwBytes))
|
||||
|
||||
if ret == 0 {
|
||||
panic("GlobalAlloc failed")
|
||||
}
|
||||
|
||||
return HGLOBAL(ret)
|
||||
}
|
||||
|
||||
func GlobalFree(hMem HGLOBAL) {
|
||||
ret, _, _ := procGlobalFree.Call(uintptr(hMem))
|
||||
|
||||
if ret != 0 {
|
||||
panic("GlobalFree failed")
|
||||
}
|
||||
}
|
||||
|
||||
func GlobalLock(hMem HGLOBAL) unsafe.Pointer {
|
||||
ret, _, _ := procGlobalLock.Call(uintptr(hMem))
|
||||
|
||||
if ret == 0 {
|
||||
panic("GlobalLock failed")
|
||||
}
|
||||
|
||||
return unsafe.Pointer(ret)
|
||||
}
|
||||
|
||||
func GlobalUnlock(hMem HGLOBAL) bool {
|
||||
ret, _, _ := procGlobalUnlock.Call(uintptr(hMem))
|
||||
|
||||
return ret != 0
|
||||
}
|
||||
|
||||
func MoveMemory(destination, source unsafe.Pointer, length uint32) {
|
||||
procMoveMemory.Call(
|
||||
uintptr(unsafe.Pointer(destination)),
|
||||
uintptr(source),
|
||||
uintptr(length))
|
||||
}
|
||||
|
||||
func FindResource(hModule HMODULE, lpName, lpType *uint16) (HRSRC, error) {
|
||||
ret, _, _ := procFindResource.Call(
|
||||
uintptr(hModule),
|
||||
uintptr(unsafe.Pointer(lpName)),
|
||||
uintptr(unsafe.Pointer(lpType)))
|
||||
|
||||
if ret == 0 {
|
||||
return 0, syscall.GetLastError()
|
||||
}
|
||||
|
||||
return HRSRC(ret), nil
|
||||
}
|
||||
|
||||
func SizeofResource(hModule HMODULE, hResInfo HRSRC) uint32 {
|
||||
ret, _, _ := procSizeofResource.Call(
|
||||
uintptr(hModule),
|
||||
uintptr(hResInfo))
|
||||
|
||||
if ret == 0 {
|
||||
panic("SizeofResource failed")
|
||||
}
|
||||
|
||||
return uint32(ret)
|
||||
}
|
||||
|
||||
func LockResource(hResData HGLOBAL) unsafe.Pointer {
|
||||
ret, _, _ := procLockResource.Call(uintptr(hResData))
|
||||
|
||||
if ret == 0 {
|
||||
panic("LockResource failed")
|
||||
}
|
||||
|
||||
return unsafe.Pointer(ret)
|
||||
}
|
||||
|
||||
func LoadResource(hModule HMODULE, hResInfo HRSRC) HGLOBAL {
|
||||
ret, _, _ := procLoadResource.Call(
|
||||
uintptr(hModule),
|
||||
uintptr(hResInfo))
|
||||
|
||||
if ret == 0 {
|
||||
panic("LoadResource failed")
|
||||
}
|
||||
|
||||
return HGLOBAL(ret)
|
||||
}
|
||||
|
||||
func GetLastError() uint32 {
|
||||
ret, _, _ := procGetLastError.Call()
|
||||
return uint32(ret)
|
||||
}
|
||||
|
||||
// func OpenProcess(desiredAccess uint32, inheritHandle bool, processId uint32) HANDLE {
|
||||
// inherit := 0
|
||||
// if inheritHandle {
|
||||
// inherit = 1
|
||||
// }
|
||||
|
||||
// ret, _, _ := procOpenProcess.Call(
|
||||
// uintptr(desiredAccess),
|
||||
// uintptr(inherit),
|
||||
// uintptr(processId))
|
||||
// return HANDLE(ret)
|
||||
// }
|
||||
|
||||
// func TerminateProcess(hProcess HANDLE, uExitCode uint) bool {
|
||||
// ret, _, _ := procTerminateProcess.Call(
|
||||
// uintptr(hProcess),
|
||||
// uintptr(uExitCode))
|
||||
// return ret != 0
|
||||
// }
|
||||
|
||||
func CloseHandle(object HANDLE) bool {
|
||||
ret, _, _ := procCloseHandle.Call(
|
||||
uintptr(object))
|
||||
return ret != 0
|
||||
}
|
||||
|
||||
func CreateToolhelp32Snapshot(flags, processId uint32) HANDLE {
|
||||
ret, _, _ := procCreateToolhelp32Snapshot.Call(
|
||||
uintptr(flags),
|
||||
uintptr(processId))
|
||||
|
||||
if ret <= 0 {
|
||||
return HANDLE(0)
|
||||
}
|
||||
|
||||
return HANDLE(ret)
|
||||
}
|
||||
|
||||
func Module32First(snapshot HANDLE, me *MODULEENTRY32) bool {
|
||||
ret, _, _ := procModule32First.Call(
|
||||
uintptr(snapshot),
|
||||
uintptr(unsafe.Pointer(me)))
|
||||
|
||||
return ret != 0
|
||||
}
|
||||
|
||||
func Module32Next(snapshot HANDLE, me *MODULEENTRY32) bool {
|
||||
ret, _, _ := procModule32Next.Call(
|
||||
uintptr(snapshot),
|
||||
uintptr(unsafe.Pointer(me)))
|
||||
|
||||
return ret != 0
|
||||
}
|
||||
|
||||
func GetSystemTimes(lpIdleTime, lpKernelTime, lpUserTime *FILETIME) bool {
|
||||
ret, _, _ := procGetSystemTimes.Call(
|
||||
uintptr(unsafe.Pointer(lpIdleTime)),
|
||||
uintptr(unsafe.Pointer(lpKernelTime)),
|
||||
uintptr(unsafe.Pointer(lpUserTime)))
|
||||
|
||||
return ret != 0
|
||||
}
|
||||
|
||||
func GetProcessTimes(hProcess HANDLE, lpCreationTime, lpExitTime, lpKernelTime, lpUserTime *FILETIME) bool {
|
||||
ret, _, _ := procGetProcessTimes.Call(
|
||||
uintptr(hProcess),
|
||||
uintptr(unsafe.Pointer(lpCreationTime)),
|
||||
uintptr(unsafe.Pointer(lpExitTime)),
|
||||
uintptr(unsafe.Pointer(lpKernelTime)),
|
||||
uintptr(unsafe.Pointer(lpUserTime)))
|
||||
|
||||
return ret != 0
|
||||
}
|
||||
|
||||
func GetConsoleScreenBufferInfo(hConsoleOutput HANDLE) *CONSOLE_SCREEN_BUFFER_INFO {
|
||||
var csbi CONSOLE_SCREEN_BUFFER_INFO
|
||||
ret, _, _ := procGetConsoleScreenBufferInfo.Call(
|
||||
uintptr(hConsoleOutput),
|
||||
uintptr(unsafe.Pointer(&csbi)))
|
||||
if ret == 0 {
|
||||
return nil
|
||||
}
|
||||
return &csbi
|
||||
}
|
||||
|
||||
func SetConsoleTextAttribute(hConsoleOutput HANDLE, wAttributes uint16) bool {
|
||||
ret, _, _ := procSetConsoleTextAttribute.Call(
|
||||
uintptr(hConsoleOutput),
|
||||
uintptr(wAttributes))
|
||||
return ret != 0
|
||||
}
|
||||
|
||||
func GetDiskFreeSpaceEx(dirName string) (r bool,
|
||||
freeBytesAvailable, totalNumberOfBytes, totalNumberOfFreeBytes uint64) {
|
||||
ret, _, _ := procGetDiskFreeSpaceEx.Call(
|
||||
uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(dirName))),
|
||||
uintptr(unsafe.Pointer(&freeBytesAvailable)),
|
||||
uintptr(unsafe.Pointer(&totalNumberOfBytes)),
|
||||
uintptr(unsafe.Pointer(&totalNumberOfFreeBytes)))
|
||||
return ret != 0,
|
||||
freeBytesAvailable, totalNumberOfBytes, totalNumberOfFreeBytes
|
||||
}
|
||||
|
||||
func GetSystemTime() *SYSTEMTIME {
|
||||
var time SYSTEMTIME
|
||||
procGetSystemTime.Call(
|
||||
uintptr(unsafe.Pointer(&time)))
|
||||
return &time
|
||||
}
|
||||
|
||||
func SetSystemTime(time *SYSTEMTIME) bool {
|
||||
ret, _, _ := procSetSystemTime.Call(
|
||||
uintptr(unsafe.Pointer(time)))
|
||||
return ret != 0
|
||||
}
|
||||
|
||||
func VirtualAllocEx(hProcess HANDLE, lpAddress, dwSize uintptr, flAllocationType, flProtect uint32) uintptr {
|
||||
ret, _, _ := procVirtualAllocEx.Call(
|
||||
uintptr(hProcess),
|
||||
lpAddress,
|
||||
dwSize,
|
||||
uintptr(flAllocationType),
|
||||
uintptr(flProtect),
|
||||
)
|
||||
|
||||
return ret
|
||||
}
|
||||
|
||||
func VirtualFreeEx(hProcess HANDLE, lpAddress, dwSize uintptr, dwFreeType uint32) bool {
|
||||
ret, _, _ := procVirtualFreeEx.Call(
|
||||
uintptr(hProcess),
|
||||
lpAddress,
|
||||
dwSize,
|
||||
uintptr(dwFreeType),
|
||||
)
|
||||
|
||||
return ret != 0
|
||||
}
|
||||
|
||||
func WriteProcessMemory(hProcess HANDLE, lpBaseAddress, lpBuffer, nSize uintptr) (int, bool) {
|
||||
var nBytesWritten int
|
||||
ret, _, _ := procWriteProcessMemory.Call(
|
||||
uintptr(hProcess),
|
||||
lpBaseAddress,
|
||||
lpBuffer,
|
||||
nSize,
|
||||
uintptr(unsafe.Pointer(&nBytesWritten)),
|
||||
)
|
||||
|
||||
return nBytesWritten, ret != 0
|
||||
}
|
||||
|
||||
func ReadProcessMemory(hProcess HANDLE, lpBaseAddress, nSize uintptr) (lpBuffer []uint16, lpNumberOfBytesRead int, ok bool) {
|
||||
|
||||
var nBytesRead int
|
||||
buf := make([]uint16, nSize)
|
||||
ret, _, _ := procReadProcessMemory.Call(
|
||||
uintptr(hProcess),
|
||||
lpBaseAddress,
|
||||
uintptr(unsafe.Pointer(&buf[0])),
|
||||
nSize,
|
||||
uintptr(unsafe.Pointer(&nBytesRead)),
|
||||
)
|
||||
|
||||
return buf, nBytesRead, ret != 0
|
||||
}
|
||||
|
||||
func QueryPerformanceCounter() uint64 {
|
||||
result := uint64(0)
|
||||
procQueryPerformanceCounter.Call(
|
||||
uintptr(unsafe.Pointer(&result)),
|
||||
)
|
||||
|
||||
return result
|
||||
}
|
||||
|
||||
func QueryPerformanceFrequency() uint64 {
|
||||
result := uint64(0)
|
||||
procQueryPerformanceFrequency.Call(
|
||||
uintptr(unsafe.Pointer(&result)),
|
||||
)
|
||||
|
||||
return result
|
||||
}
|
|
@ -1,63 +0,0 @@
|
|||
// Copyright 2010-2012 The W32 Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
package w32
|
||||
|
||||
import (
|
||||
"syscall"
|
||||
"unsafe"
|
||||
)
|
||||
|
||||
var (
|
||||
modole32 = syscall.NewLazyDLL("ole32.dll")
|
||||
|
||||
procCoInitializeEx = modole32.NewProc("CoInitializeEx")
|
||||
procCoInitialize = modole32.NewProc("CoInitialize")
|
||||
procCoUninitialize = modole32.NewProc("CoUninitialize")
|
||||
procCreateStreamOnHGlobal = modole32.NewProc("CreateStreamOnHGlobal")
|
||||
)
|
||||
|
||||
func CoInitializeEx(coInit uintptr) HRESULT {
|
||||
ret, _, _ := procCoInitializeEx.Call(
|
||||
0,
|
||||
coInit)
|
||||
|
||||
switch uint32(ret) {
|
||||
case E_INVALIDARG:
|
||||
panic("CoInitializeEx failed with E_INVALIDARG")
|
||||
case E_OUTOFMEMORY:
|
||||
panic("CoInitializeEx failed with E_OUTOFMEMORY")
|
||||
case E_UNEXPECTED:
|
||||
panic("CoInitializeEx failed with E_UNEXPECTED")
|
||||
}
|
||||
|
||||
return HRESULT(ret)
|
||||
}
|
||||
|
||||
func CoInitialize() {
|
||||
procCoInitialize.Call(0)
|
||||
}
|
||||
|
||||
func CoUninitialize() {
|
||||
procCoUninitialize.Call()
|
||||
}
|
||||
|
||||
func CreateStreamOnHGlobal(hGlobal HGLOBAL, fDeleteOnRelease bool) *IStream {
|
||||
stream := new(IStream)
|
||||
ret, _, _ := procCreateStreamOnHGlobal.Call(
|
||||
uintptr(hGlobal),
|
||||
uintptr(BoolToBOOL(fDeleteOnRelease)),
|
||||
uintptr(unsafe.Pointer(&stream)))
|
||||
|
||||
switch uint32(ret) {
|
||||
case E_INVALIDARG:
|
||||
panic("CreateStreamOnHGlobal failed with E_INVALIDARG")
|
||||
case E_OUTOFMEMORY:
|
||||
panic("CreateStreamOnHGlobal failed with E_OUTOFMEMORY")
|
||||
case E_UNEXPECTED:
|
||||
panic("CreateStreamOnHGlobal failed with E_UNEXPECTED")
|
||||
}
|
||||
|
||||
return stream
|
||||
}
|
|
@ -1,48 +0,0 @@
|
|||
// Copyright 2010-2012 The W32 Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
package w32
|
||||
|
||||
import (
|
||||
"syscall"
|
||||
"unsafe"
|
||||
)
|
||||
|
||||
var (
|
||||
modoleaut32 = syscall.NewLazyDLL("oleaut32")
|
||||
|
||||
procVariantInit = modoleaut32.NewProc("VariantInit")
|
||||
procSysAllocString = modoleaut32.NewProc("SysAllocString")
|
||||
procSysFreeString = modoleaut32.NewProc("SysFreeString")
|
||||
procSysStringLen = modoleaut32.NewProc("SysStringLen")
|
||||
procCreateDispTypeInfo = modoleaut32.NewProc("CreateDispTypeInfo")
|
||||
procCreateStdDispatch = modoleaut32.NewProc("CreateStdDispatch")
|
||||
)
|
||||
|
||||
func VariantInit(v *VARIANT) {
|
||||
hr, _, _ := procVariantInit.Call(uintptr(unsafe.Pointer(v)))
|
||||
if hr != 0 {
|
||||
panic("Invoke VariantInit error.")
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
func SysAllocString(v string) (ss *int16) {
|
||||
pss, _, _ := procSysAllocString.Call(uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(v))))
|
||||
ss = (*int16)(unsafe.Pointer(pss))
|
||||
return
|
||||
}
|
||||
|
||||
func SysFreeString(v *int16) {
|
||||
hr, _, _ := procSysFreeString.Call(uintptr(unsafe.Pointer(v)))
|
||||
if hr != 0 {
|
||||
panic("Invoke SysFreeString error.")
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
func SysStringLen(v *int16) uint {
|
||||
l, _, _ := procSysStringLen.Call(uintptr(unsafe.Pointer(v)))
|
||||
return uint(l)
|
||||
}
|
|
@ -1,72 +0,0 @@
|
|||
// Copyright 2010-2012 The W32 Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
package w32
|
||||
|
||||
import (
|
||||
"syscall"
|
||||
"unsafe"
|
||||
)
|
||||
|
||||
var (
|
||||
modopengl32 = syscall.NewLazyDLL("opengl32.dll")
|
||||
|
||||
procwglCreateContext = modopengl32.NewProc("wglCreateContext")
|
||||
procwglCreateLayerContext = modopengl32.NewProc("wglCreateLayerContext")
|
||||
procwglDeleteContext = modopengl32.NewProc("wglDeleteContext")
|
||||
procwglGetProcAddress = modopengl32.NewProc("wglGetProcAddress")
|
||||
procwglMakeCurrent = modopengl32.NewProc("wglMakeCurrent")
|
||||
procwglShareLists = modopengl32.NewProc("wglShareLists")
|
||||
)
|
||||
|
||||
func WglCreateContext(hdc HDC) HGLRC {
|
||||
ret, _, _ := procwglCreateContext.Call(
|
||||
uintptr(hdc),
|
||||
)
|
||||
|
||||
return HGLRC(ret)
|
||||
}
|
||||
|
||||
func WglCreateLayerContext(hdc HDC, iLayerPlane int) HGLRC {
|
||||
ret, _, _ := procwglCreateLayerContext.Call(
|
||||
uintptr(hdc),
|
||||
uintptr(iLayerPlane),
|
||||
)
|
||||
|
||||
return HGLRC(ret)
|
||||
}
|
||||
|
||||
func WglDeleteContext(hglrc HGLRC) bool {
|
||||
ret, _, _ := procwglDeleteContext.Call(
|
||||
uintptr(hglrc),
|
||||
)
|
||||
|
||||
return ret == TRUE
|
||||
}
|
||||
|
||||
func WglGetProcAddress(szProc string) uintptr {
|
||||
ret, _, _ := procwglGetProcAddress.Call(
|
||||
uintptr(unsafe.Pointer(syscall.StringBytePtr(szProc))),
|
||||
)
|
||||
|
||||
return ret
|
||||
}
|
||||
|
||||
func WglMakeCurrent(hdc HDC, hglrc HGLRC) bool {
|
||||
ret, _, _ := procwglMakeCurrent.Call(
|
||||
uintptr(hdc),
|
||||
uintptr(hglrc),
|
||||
)
|
||||
|
||||
return ret == TRUE
|
||||
}
|
||||
|
||||
func WglShareLists(hglrc1, hglrc2 HGLRC) bool {
|
||||
ret, _, _ := procwglShareLists.Call(
|
||||
uintptr(hglrc1),
|
||||
uintptr(hglrc2),
|
||||
)
|
||||
|
||||
return ret == TRUE
|
||||
}
|
|
@ -1,25 +0,0 @@
|
|||
// Copyright 2010-2012 The W32 Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
package w32
|
||||
|
||||
import (
|
||||
"syscall"
|
||||
"unsafe"
|
||||
)
|
||||
|
||||
var (
|
||||
modpsapi = syscall.NewLazyDLL("psapi.dll")
|
||||
|
||||
procEnumProcesses = modpsapi.NewProc("EnumProcesses")
|
||||
)
|
||||
|
||||
func EnumProcesses(processIds []uint32, cb uint32, bytesReturned *uint32) bool {
|
||||
ret, _, _ := procEnumProcesses.Call(
|
||||
uintptr(unsafe.Pointer(&processIds[0])),
|
||||
uintptr(cb),
|
||||
uintptr(unsafe.Pointer(bytesReturned)))
|
||||
|
||||
return ret != 0
|
||||
}
|
|
@ -1,153 +0,0 @@
|
|||
// Copyright 2010-2012 The W32 Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
package w32
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"fmt"
|
||||
"syscall"
|
||||
"unsafe"
|
||||
)
|
||||
|
||||
var (
|
||||
modshell32 = syscall.NewLazyDLL("shell32.dll")
|
||||
|
||||
procSHBrowseForFolder = modshell32.NewProc("SHBrowseForFolderW")
|
||||
procSHGetPathFromIDList = modshell32.NewProc("SHGetPathFromIDListW")
|
||||
procDragAcceptFiles = modshell32.NewProc("DragAcceptFiles")
|
||||
procDragQueryFile = modshell32.NewProc("DragQueryFileW")
|
||||
procDragQueryPoint = modshell32.NewProc("DragQueryPoint")
|
||||
procDragFinish = modshell32.NewProc("DragFinish")
|
||||
procShellExecute = modshell32.NewProc("ShellExecuteW")
|
||||
procExtractIcon = modshell32.NewProc("ExtractIconW")
|
||||
)
|
||||
|
||||
func SHBrowseForFolder(bi *BROWSEINFO) uintptr {
|
||||
ret, _, _ := procSHBrowseForFolder.Call(uintptr(unsafe.Pointer(bi)))
|
||||
|
||||
return ret
|
||||
}
|
||||
|
||||
func SHGetPathFromIDList(idl uintptr) string {
|
||||
buf := make([]uint16, 1024)
|
||||
procSHGetPathFromIDList.Call(
|
||||
idl,
|
||||
uintptr(unsafe.Pointer(&buf[0])))
|
||||
|
||||
return syscall.UTF16ToString(buf)
|
||||
}
|
||||
|
||||
func DragAcceptFiles(hwnd HWND, accept bool) {
|
||||
procDragAcceptFiles.Call(
|
||||
uintptr(hwnd),
|
||||
uintptr(BoolToBOOL(accept)))
|
||||
}
|
||||
|
||||
func DragQueryFile(hDrop HDROP, iFile uint) (fileName string, fileCount uint) {
|
||||
ret, _, _ := procDragQueryFile.Call(
|
||||
uintptr(hDrop),
|
||||
uintptr(iFile),
|
||||
0,
|
||||
0)
|
||||
|
||||
fileCount = uint(ret)
|
||||
|
||||
if iFile != 0xFFFFFFFF {
|
||||
buf := make([]uint16, fileCount+1)
|
||||
|
||||
ret, _, _ := procDragQueryFile.Call(
|
||||
uintptr(hDrop),
|
||||
uintptr(iFile),
|
||||
uintptr(unsafe.Pointer(&buf[0])),
|
||||
uintptr(fileCount+1))
|
||||
|
||||
if ret == 0 {
|
||||
panic("Invoke DragQueryFile error.")
|
||||
}
|
||||
|
||||
fileName = syscall.UTF16ToString(buf)
|
||||
}
|
||||
|
||||
return
|
||||
}
|
||||
|
||||
func DragQueryPoint(hDrop HDROP) (x, y int, isClientArea bool) {
|
||||
var pt POINT
|
||||
ret, _, _ := procDragQueryPoint.Call(
|
||||
uintptr(hDrop),
|
||||
uintptr(unsafe.Pointer(&pt)))
|
||||
|
||||
return int(pt.X), int(pt.Y), (ret == 1)
|
||||
}
|
||||
|
||||
func DragFinish(hDrop HDROP) {
|
||||
procDragFinish.Call(uintptr(hDrop))
|
||||
}
|
||||
|
||||
func ShellExecute(hwnd HWND, lpOperation, lpFile, lpParameters, lpDirectory string, nShowCmd int) error {
|
||||
var op, param, directory uintptr
|
||||
if len(lpOperation) != 0 {
|
||||
op = uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(lpOperation)))
|
||||
}
|
||||
if len(lpParameters) != 0 {
|
||||
param = uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(lpParameters)))
|
||||
}
|
||||
if len(lpDirectory) != 0 {
|
||||
directory = uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(lpDirectory)))
|
||||
}
|
||||
|
||||
ret, _, _ := procShellExecute.Call(
|
||||
uintptr(hwnd),
|
||||
op,
|
||||
uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(lpFile))),
|
||||
param,
|
||||
directory,
|
||||
uintptr(nShowCmd))
|
||||
|
||||
errorMsg := ""
|
||||
if ret != 0 && ret <= 32 {
|
||||
switch int(ret) {
|
||||
case ERROR_FILE_NOT_FOUND:
|
||||
errorMsg = "The specified file was not found."
|
||||
case ERROR_PATH_NOT_FOUND:
|
||||
errorMsg = "The specified path was not found."
|
||||
case ERROR_BAD_FORMAT:
|
||||
errorMsg = "The .exe file is invalid (non-Win32 .exe or error in .exe image)."
|
||||
case SE_ERR_ACCESSDENIED:
|
||||
errorMsg = "The operating system denied access to the specified file."
|
||||
case SE_ERR_ASSOCINCOMPLETE:
|
||||
errorMsg = "The file name association is incomplete or invalid."
|
||||
case SE_ERR_DDEBUSY:
|
||||
errorMsg = "The DDE transaction could not be completed because other DDE transactions were being processed."
|
||||
case SE_ERR_DDEFAIL:
|
||||
errorMsg = "The DDE transaction failed."
|
||||
case SE_ERR_DDETIMEOUT:
|
||||
errorMsg = "The DDE transaction could not be completed because the request timed out."
|
||||
case SE_ERR_DLLNOTFOUND:
|
||||
errorMsg = "The specified DLL was not found."
|
||||
case SE_ERR_NOASSOC:
|
||||
errorMsg = "There is no application associated with the given file name extension. This error will also be returned if you attempt to print a file that is not printable."
|
||||
case SE_ERR_OOM:
|
||||
errorMsg = "There was not enough memory to complete the operation."
|
||||
case SE_ERR_SHARE:
|
||||
errorMsg = "A sharing violation occurred."
|
||||
default:
|
||||
errorMsg = fmt.Sprintf("Unknown error occurred with error code %v", ret)
|
||||
}
|
||||
} else {
|
||||
return nil
|
||||
}
|
||||
|
||||
return errors.New(errorMsg)
|
||||
}
|
||||
|
||||
func ExtractIcon(lpszExeFileName string, nIconIndex int) HICON {
|
||||
ret, _, _ := procExtractIcon.Call(
|
||||
0,
|
||||
uintptr(unsafe.Pointer(syscall.StringToUTF16Ptr(lpszExeFileName))),
|
||||
uintptr(nIconIndex))
|
||||
|
||||
return HICON(ret)
|
||||
}
|
|
@ -1,891 +0,0 @@
|
|||
// Copyright 2010-2012 The W32 Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
package w32
|
||||
|
||||
import (
|
||||
"unsafe"
|
||||
)
|
||||
|
||||
// From MSDN: Windows Data Types
|
||||
// http://msdn.microsoft.com/en-us/library/s3f49ktz.aspx
|
||||
// http://msdn.microsoft.com/en-us/library/windows/desktop/aa383751.aspx
|
||||
// ATOM WORD
|
||||
// BOOL int32
|
||||
// BOOLEAN byte
|
||||
// BYTE byte
|
||||
// CCHAR int8
|
||||
// CHAR int8
|
||||
// COLORREF DWORD
|
||||
// DWORD uint32
|
||||
// DWORDLONG ULONGLONG
|
||||
// DWORD_PTR ULONG_PTR
|
||||
// DWORD32 uint32
|
||||
// DWORD64 uint64
|
||||
// FLOAT float32
|
||||
// HACCEL HANDLE
|
||||
// HALF_PTR struct{} // ???
|
||||
// HANDLE PVOID
|
||||
// HBITMAP HANDLE
|
||||
// HBRUSH HANDLE
|
||||
// HCOLORSPACE HANDLE
|
||||
// HCONV HANDLE
|
||||
// HCONVLIST HANDLE
|
||||
// HCURSOR HANDLE
|
||||
// HDC HANDLE
|
||||
// HDDEDATA HANDLE
|
||||
// HDESK HANDLE
|
||||
// HDROP HANDLE
|
||||
// HDWP HANDLE
|
||||
// HENHMETAFILE HANDLE
|
||||
// HFILE HANDLE
|
||||
// HFONT HANDLE
|
||||
// HGDIOBJ HANDLE
|
||||
// HGLOBAL HANDLE
|
||||
// HHOOK HANDLE
|
||||
// HICON HANDLE
|
||||
// HINSTANCE HANDLE
|
||||
// HKEY HANDLE
|
||||
// HKL HANDLE
|
||||
// HLOCAL HANDLE
|
||||
// HMENU HANDLE
|
||||
// HMETAFILE HANDLE
|
||||
// HMODULE HANDLE
|
||||
// HPALETTE HANDLE
|
||||
// HPEN HANDLE
|
||||
// HRESULT int32
|
||||
// HRGN HANDLE
|
||||
// HSZ HANDLE
|
||||
// HWINSTA HANDLE
|
||||
// HWND HANDLE
|
||||
// INT int32
|
||||
// INT_PTR uintptr
|
||||
// INT8 int8
|
||||
// INT16 int16
|
||||
// INT32 int32
|
||||
// INT64 int64
|
||||
// LANGID WORD
|
||||
// LCID DWORD
|
||||
// LCTYPE DWORD
|
||||
// LGRPID DWORD
|
||||
// LONG int32
|
||||
// LONGLONG int64
|
||||
// LONG_PTR uintptr
|
||||
// LONG32 int32
|
||||
// LONG64 int64
|
||||
// LPARAM LONG_PTR
|
||||
// LPBOOL *BOOL
|
||||
// LPBYTE *BYTE
|
||||
// LPCOLORREF *COLORREF
|
||||
// LPCSTR *int8
|
||||
// LPCTSTR LPCWSTR
|
||||
// LPCVOID unsafe.Pointer
|
||||
// LPCWSTR *WCHAR
|
||||
// LPDWORD *DWORD
|
||||
// LPHANDLE *HANDLE
|
||||
// LPINT *INT
|
||||
// LPLONG *LONG
|
||||
// LPSTR *CHAR
|
||||
// LPTSTR LPWSTR
|
||||
// LPVOID unsafe.Pointer
|
||||
// LPWORD *WORD
|
||||
// LPWSTR *WCHAR
|
||||
// LRESULT LONG_PTR
|
||||
// PBOOL *BOOL
|
||||
// PBOOLEAN *BOOLEAN
|
||||
// PBYTE *BYTE
|
||||
// PCHAR *CHAR
|
||||
// PCSTR *CHAR
|
||||
// PCTSTR PCWSTR
|
||||
// PCWSTR *WCHAR
|
||||
// PDWORD *DWORD
|
||||
// PDWORDLONG *DWORDLONG
|
||||
// PDWORD_PTR *DWORD_PTR
|
||||
// PDWORD32 *DWORD32
|
||||
// PDWORD64 *DWORD64
|
||||
// PFLOAT *FLOAT
|
||||
// PHALF_PTR *HALF_PTR
|
||||
// PHANDLE *HANDLE
|
||||
// PHKEY *HKEY
|
||||
// PINT_PTR *INT_PTR
|
||||
// PINT8 *INT8
|
||||
// PINT16 *INT16
|
||||
// PINT32 *INT32
|
||||
// PINT64 *INT64
|
||||
// PLCID *LCID
|
||||
// PLONG *LONG
|
||||
// PLONGLONG *LONGLONG
|
||||
// PLONG_PTR *LONG_PTR
|
||||
// PLONG32 *LONG32
|
||||
// PLONG64 *LONG64
|
||||
// POINTER_32 struct{} // ???
|
||||
// POINTER_64 struct{} // ???
|
||||
// POINTER_SIGNED uintptr
|
||||
// POINTER_UNSIGNED uintptr
|
||||
// PSHORT *SHORT
|
||||
// PSIZE_T *SIZE_T
|
||||
// PSSIZE_T *SSIZE_T
|
||||
// PSTR *CHAR
|
||||
// PTBYTE *TBYTE
|
||||
// PTCHAR *TCHAR
|
||||
// PTSTR PWSTR
|
||||
// PUCHAR *UCHAR
|
||||
// PUHALF_PTR *UHALF_PTR
|
||||
// PUINT *UINT
|
||||
// PUINT_PTR *UINT_PTR
|
||||
// PUINT8 *UINT8
|
||||
// PUINT16 *UINT16
|
||||
// PUINT32 *UINT32
|
||||
// PUINT64 *UINT64
|
||||
// PULONG *ULONG
|
||||
// PULONGLONG *ULONGLONG
|
||||
// PULONG_PTR *ULONG_PTR
|
||||
// PULONG32 *ULONG32
|
||||
// PULONG64 *ULONG64
|
||||
// PUSHORT *USHORT
|
||||
// PVOID unsafe.Pointer
|
||||
// PWCHAR *WCHAR
|
||||
// PWORD *WORD
|
||||
// PWSTR *WCHAR
|
||||
// QWORD uint64
|
||||
// SC_HANDLE HANDLE
|
||||
// SC_LOCK LPVOID
|
||||
// SERVICE_STATUS_HANDLE HANDLE
|
||||
// SHORT int16
|
||||
// SIZE_T ULONG_PTR
|
||||
// SSIZE_T LONG_PTR
|
||||
// TBYTE WCHAR
|
||||
// TCHAR WCHAR
|
||||
// UCHAR uint8
|
||||
// UHALF_PTR struct{} // ???
|
||||
// UINT uint32
|
||||
// UINT_PTR uintptr
|
||||
// UINT8 uint8
|
||||
// UINT16 uint16
|
||||
// UINT32 uint32
|
||||
// UINT64 uint64
|
||||
// ULONG uint32
|
||||
// ULONGLONG uint64
|
||||
// ULONG_PTR uintptr
|
||||
// ULONG32 uint32
|
||||
// ULONG64 uint64
|
||||
// USHORT uint16
|
||||
// USN LONGLONG
|
||||
// WCHAR uint16
|
||||
// WORD uint16
|
||||
// WPARAM UINT_PTR
|
||||
type (
|
||||
ATOM uint16
|
||||
BOOL int32
|
||||
COLORREF uint32
|
||||
DWM_FRAME_COUNT uint64
|
||||
DWORD uint32
|
||||
HACCEL HANDLE
|
||||
HANDLE uintptr
|
||||
HBITMAP HANDLE
|
||||
HBRUSH HANDLE
|
||||
HCURSOR HANDLE
|
||||
HDC HANDLE
|
||||
HDROP HANDLE
|
||||
HDWP HANDLE
|
||||
HENHMETAFILE HANDLE
|
||||
HFONT HANDLE
|
||||
HGDIOBJ HANDLE
|
||||
HGLOBAL HANDLE
|
||||
HGLRC HANDLE
|
||||
HHOOK HANDLE
|
||||
HICON HANDLE
|
||||
HIMAGELIST HANDLE
|
||||
HINSTANCE HANDLE
|
||||
HKEY HANDLE
|
||||
HKL HANDLE
|
||||
HMENU HANDLE
|
||||
HMODULE HANDLE
|
||||
HMONITOR HANDLE
|
||||
HPEN HANDLE
|
||||
HRESULT int32
|
||||
HRGN HANDLE
|
||||
HRSRC HANDLE
|
||||
HTHUMBNAIL HANDLE
|
||||
HWND HANDLE
|
||||
LPARAM uintptr
|
||||
LPCVOID unsafe.Pointer
|
||||
LRESULT uintptr
|
||||
PVOID unsafe.Pointer
|
||||
QPC_TIME uint64
|
||||
ULONG_PTR uintptr
|
||||
WPARAM uintptr
|
||||
TRACEHANDLE uintptr
|
||||
)
|
||||
|
||||
// http://msdn.microsoft.com/en-us/library/windows/desktop/dd162805.aspx
|
||||
type POINT struct {
|
||||
X, Y int32
|
||||
}
|
||||
|
||||
// http://msdn.microsoft.com/en-us/library/windows/desktop/dd162897.aspx
|
||||
type RECT struct {
|
||||
Left, Top, Right, Bottom int32
|
||||
}
|
||||
|
||||
// http://msdn.microsoft.com/en-us/library/windows/desktop/ms633577.aspx
|
||||
type WNDCLASSEX struct {
|
||||
Size uint32
|
||||
Style uint32
|
||||
WndProc uintptr
|
||||
ClsExtra int32
|
||||
WndExtra int32
|
||||
Instance HINSTANCE
|
||||
Icon HICON
|
||||
Cursor HCURSOR
|
||||
Background HBRUSH
|
||||
MenuName *uint16
|
||||
ClassName *uint16
|
||||
IconSm HICON
|
||||
}
|
||||
|
||||
// http://msdn.microsoft.com/en-us/library/windows/desktop/ms644958.aspx
|
||||
type MSG struct {
|
||||
Hwnd HWND
|
||||
Message uint32
|
||||
WParam uintptr
|
||||
LParam uintptr
|
||||
Time uint32
|
||||
Pt POINT
|
||||
}
|
||||
|
||||
// http://msdn.microsoft.com/en-us/library/windows/desktop/dd145037.aspx
|
||||
type LOGFONT struct {
|
||||
Height int32
|
||||
Width int32
|
||||
Escapement int32
|
||||
Orientation int32
|
||||
Weight int32
|
||||
Italic byte
|
||||
Underline byte
|
||||
StrikeOut byte
|
||||
CharSet byte
|
||||
OutPrecision byte
|
||||
ClipPrecision byte
|
||||
Quality byte
|
||||
PitchAndFamily byte
|
||||
FaceName [LF_FACESIZE]uint16
|
||||
}
|
||||
|
||||
// http://msdn.microsoft.com/en-us/library/windows/desktop/ms646839.aspx
|
||||
type OPENFILENAME struct {
|
||||
StructSize uint32
|
||||
Owner HWND
|
||||
Instance HINSTANCE
|
||||
Filter *uint16
|
||||
CustomFilter *uint16
|
||||
MaxCustomFilter uint32
|
||||
FilterIndex uint32
|
||||
File *uint16
|
||||
MaxFile uint32
|
||||
FileTitle *uint16
|
||||
MaxFileTitle uint32
|
||||
InitialDir *uint16
|
||||
Title *uint16
|
||||
Flags uint32
|
||||
FileOffset uint16
|
||||
FileExtension uint16
|
||||
DefExt *uint16
|
||||
CustData uintptr
|
||||
FnHook uintptr
|
||||
TemplateName *uint16
|
||||
PvReserved unsafe.Pointer
|
||||
DwReserved uint32
|
||||
FlagsEx uint32
|
||||
}
|
||||
|
||||
// http://msdn.microsoft.com/en-us/library/windows/desktop/bb773205.aspx
|
||||
type BROWSEINFO struct {
|
||||
Owner HWND
|
||||
Root *uint16
|
||||
DisplayName *uint16
|
||||
Title *uint16
|
||||
Flags uint32
|
||||
CallbackFunc uintptr
|
||||
LParam uintptr
|
||||
Image int32
|
||||
}
|
||||
|
||||
// http://msdn.microsoft.com/en-us/library/windows/desktop/aa373931.aspx
|
||||
type GUID struct {
|
||||
Data1 uint32
|
||||
Data2 uint16
|
||||
Data3 uint16
|
||||
Data4 [8]byte
|
||||
}
|
||||
|
||||
// http://msdn.microsoft.com/en-us/library/windows/desktop/ms221627.aspx
|
||||
type VARIANT struct {
|
||||
VT uint16 // 2
|
||||
WReserved1 uint16 // 4
|
||||
WReserved2 uint16 // 6
|
||||
WReserved3 uint16 // 8
|
||||
Val int64 // 16
|
||||
}
|
||||
|
||||
// http://msdn.microsoft.com/en-us/library/windows/desktop/ms221416.aspx
|
||||
type DISPPARAMS struct {
|
||||
Rgvarg uintptr
|
||||
RgdispidNamedArgs uintptr
|
||||
CArgs uint32
|
||||
CNamedArgs uint32
|
||||
}
|
||||
|
||||
// http://msdn.microsoft.com/en-us/library/windows/desktop/ms221133.aspx
|
||||
type EXCEPINFO struct {
|
||||
WCode uint16
|
||||
WReserved uint16
|
||||
BstrSource *uint16
|
||||
BstrDescription *uint16
|
||||
BstrHelpFile *uint16
|
||||
DwHelpContext uint32
|
||||
PvReserved uintptr
|
||||
PfnDeferredFillIn uintptr
|
||||
Scode int32
|
||||
}
|
||||
|
||||
// http://msdn.microsoft.com/en-us/library/windows/desktop/dd145035.aspx
|
||||
type LOGBRUSH struct {
|
||||
LbStyle uint32
|
||||
LbColor COLORREF
|
||||
LbHatch uintptr
|
||||
}
|
||||
|
||||
// http://msdn.microsoft.com/en-us/library/windows/desktop/dd183565.aspx
|
||||
type DEVMODE struct {
|
||||
DmDeviceName [CCHDEVICENAME]uint16
|
||||
DmSpecVersion uint16
|
||||
DmDriverVersion uint16
|
||||
DmSize uint16
|
||||
DmDriverExtra uint16
|
||||
DmFields uint32
|
||||
DmOrientation int16
|
||||
DmPaperSize int16
|
||||
DmPaperLength int16
|
||||
DmPaperWidth int16
|
||||
DmScale int16
|
||||
DmCopies int16
|
||||
DmDefaultSource int16
|
||||
DmPrintQuality int16
|
||||
DmColor int16
|
||||
DmDuplex int16
|
||||
DmYResolution int16
|
||||
DmTTOption int16
|
||||
DmCollate int16
|
||||
DmFormName [CCHFORMNAME]uint16
|
||||
DmLogPixels uint16
|
||||
DmBitsPerPel uint32
|
||||
DmPelsWidth uint32
|
||||
DmPelsHeight uint32
|
||||
DmDisplayFlags uint32
|
||||
DmDisplayFrequency uint32
|
||||
DmICMMethod uint32
|
||||
DmICMIntent uint32
|
||||
DmMediaType uint32
|
||||
DmDitherType uint32
|
||||
DmReserved1 uint32
|
||||
DmReserved2 uint32
|
||||
DmPanningWidth uint32
|
||||
DmPanningHeight uint32
|
||||
}
|
||||
|
||||
// http://msdn.microsoft.com/en-us/library/windows/desktop/dd183376.aspx
|
||||
type BITMAPINFOHEADER struct {
|
||||
BiSize uint32
|
||||
BiWidth int32
|
||||
BiHeight int32
|
||||
BiPlanes uint16
|
||||
BiBitCount uint16
|
||||
BiCompression uint32
|
||||
BiSizeImage uint32
|
||||
BiXPelsPerMeter int32
|
||||
BiYPelsPerMeter int32
|
||||
BiClrUsed uint32
|
||||
BiClrImportant uint32
|
||||
}
|
||||
|
||||
// http://msdn.microsoft.com/en-us/library/windows/desktop/dd162938.aspx
|
||||
type RGBQUAD struct {
|
||||
RgbBlue byte
|
||||
RgbGreen byte
|
||||
RgbRed byte
|
||||
RgbReserved byte
|
||||
}
|
||||
|
||||
// http://msdn.microsoft.com/en-us/library/windows/desktop/dd183375.aspx
|
||||
type BITMAPINFO struct {
|
||||
BmiHeader BITMAPINFOHEADER
|
||||
BmiColors *RGBQUAD
|
||||
}
|
||||
|
||||
// http://msdn.microsoft.com/en-us/library/windows/desktop/dd183371.aspx
|
||||
type BITMAP struct {
|
||||
BmType int32
|
||||
BmWidth int32
|
||||
BmHeight int32
|
||||
BmWidthBytes int32
|
||||
BmPlanes uint16
|
||||
BmBitsPixel uint16
|
||||
BmBits unsafe.Pointer
|
||||
}
|
||||
|
||||
// http://msdn.microsoft.com/en-us/library/windows/desktop/dd183567.aspx
|
||||
type DIBSECTION struct {
|
||||
DsBm BITMAP
|
||||
DsBmih BITMAPINFOHEADER
|
||||
DsBitfields [3]uint32
|
||||
DshSection HANDLE
|
||||
DsOffset uint32
|
||||
}
|
||||
|
||||
// http://msdn.microsoft.com/en-us/library/windows/desktop/dd162607.aspx
|
||||
type ENHMETAHEADER struct {
|
||||
IType uint32
|
||||
NSize uint32
|
||||
RclBounds RECT
|
||||
RclFrame RECT
|
||||
DSignature uint32
|
||||
NVersion uint32
|
||||
NBytes uint32
|
||||
NRecords uint32
|
||||
NHandles uint16
|
||||
SReserved uint16
|
||||
NDescription uint32
|
||||
OffDescription uint32
|
||||
NPalEntries uint32
|
||||
SzlDevice SIZE
|
||||
SzlMillimeters SIZE
|
||||
CbPixelFormat uint32
|
||||
OffPixelFormat uint32
|
||||
BOpenGL uint32
|
||||
SzlMicrometers SIZE
|
||||
}
|
||||
|
||||
// http://msdn.microsoft.com/en-us/library/windows/desktop/dd145106.aspx
|
||||
type SIZE struct {
|
||||
CX, CY int32
|
||||
}
|
||||
|
||||
// http://msdn.microsoft.com/en-us/library/windows/desktop/dd145132.aspx
|
||||
type TEXTMETRIC struct {
|
||||
TmHeight int32
|
||||
TmAscent int32
|
||||
TmDescent int32
|
||||
TmInternalLeading int32
|
||||
TmExternalLeading int32
|
||||
TmAveCharWidth int32
|
||||
TmMaxCharWidth int32
|
||||
TmWeight int32
|
||||
TmOverhang int32
|
||||
TmDigitizedAspectX int32
|
||||
TmDigitizedAspectY int32
|
||||
TmFirstChar uint16
|
||||
TmLastChar uint16
|
||||
TmDefaultChar uint16
|
||||
TmBreakChar uint16
|
||||
TmItalic byte
|
||||
TmUnderlined byte
|
||||
TmStruckOut byte
|
||||
TmPitchAndFamily byte
|
||||
TmCharSet byte
|
||||
}
|
||||
|
||||
// http://msdn.microsoft.com/en-us/library/windows/desktop/dd183574.aspx
|
||||
type DOCINFO struct {
|
||||
CbSize int32
|
||||
LpszDocName *uint16
|
||||
LpszOutput *uint16
|
||||
LpszDatatype *uint16
|
||||
FwType uint32
|
||||
}
|
||||
|
||||
// http://msdn.microsoft.com/en-us/library/windows/desktop/bb775514.aspx
|
||||
type NMHDR struct {
|
||||
HwndFrom HWND
|
||||
IdFrom uintptr
|
||||
Code uint32
|
||||
}
|
||||
|
||||
// http://msdn.microsoft.com/en-us/library/windows/desktop/bb774743.aspx
|
||||
type LVCOLUMN struct {
|
||||
Mask uint32
|
||||
Fmt int32
|
||||
Cx int32
|
||||
PszText *uint16
|
||||
CchTextMax int32
|
||||
ISubItem int32
|
||||
IImage int32
|
||||
IOrder int32
|
||||
}
|
||||
|
||||
// http://msdn.microsoft.com/en-us/library/windows/desktop/bb774760.aspx
|
||||
type LVITEM struct {
|
||||
Mask uint32
|
||||
IItem int32
|
||||
ISubItem int32
|
||||
State uint32
|
||||
StateMask uint32
|
||||
PszText *uint16
|
||||
CchTextMax int32
|
||||
IImage int32
|
||||
LParam uintptr
|
||||
IIndent int32
|
||||
IGroupId int32
|
||||
CColumns uint32
|
||||
PuColumns uint32
|
||||
}
|
||||
|
||||
// http://msdn.microsoft.com/en-us/library/windows/desktop/bb774754.aspx
|
||||
type LVHITTESTINFO struct {
|
||||
Pt POINT
|
||||
Flags uint32
|
||||
IItem int32
|
||||
ISubItem int32
|
||||
IGroup int32
|
||||
}
|
||||
|
||||
// http://msdn.microsoft.com/en-us/library/windows/desktop/bb774771.aspx
|
||||
type NMITEMACTIVATE struct {
|
||||
Hdr NMHDR
|
||||
IItem int32
|
||||
ISubItem int32
|
||||
UNewState uint32
|
||||
UOldState uint32
|
||||
UChanged uint32
|
||||
PtAction POINT
|
||||
LParam uintptr
|
||||
UKeyFlags uint32
|
||||
}
|
||||
|
||||
// http://msdn.microsoft.com/en-us/library/windows/desktop/bb774773.aspx
|
||||
type NMLISTVIEW struct {
|
||||
Hdr NMHDR
|
||||
IItem int32
|
||||
ISubItem int32
|
||||
UNewState uint32
|
||||
UOldState uint32
|
||||
UChanged uint32
|
||||
PtAction POINT
|
||||
LParam uintptr
|
||||
}
|
||||
|
||||
// http://msdn.microsoft.com/en-us/library/windows/desktop/bb774780.aspx
|
||||
type NMLVDISPINFO struct {
|
||||
Hdr NMHDR
|
||||
Item LVITEM
|
||||
}
|
||||
|
||||
// http://msdn.microsoft.com/en-us/library/windows/desktop/bb775507.aspx
|
||||
type INITCOMMONCONTROLSEX struct {
|
||||
DwSize uint32
|
||||
DwICC uint32
|
||||
}
|
||||
|
||||
// http://msdn.microsoft.com/en-us/library/windows/desktop/bb760256.aspx
|
||||
type TOOLINFO struct {
|
||||
CbSize uint32
|
||||
UFlags uint32
|
||||
Hwnd HWND
|
||||
UId uintptr
|
||||
Rect RECT
|
||||
Hinst HINSTANCE
|
||||
LpszText *uint16
|
||||
LParam uintptr
|
||||
LpReserved unsafe.Pointer
|
||||
}
|
||||
|
||||
// http://msdn.microsoft.com/en-us/library/windows/desktop/ms645604.aspx
|
||||
type TRACKMOUSEEVENT struct {
|
||||
CbSize uint32
|
||||
DwFlags uint32
|
||||
HwndTrack HWND
|
||||
DwHoverTime uint32
|
||||
}
|
||||
|
||||
// http://msdn.microsoft.com/en-us/library/windows/desktop/ms534067.aspx
|
||||
type GdiplusStartupInput struct {
|
||||
GdiplusVersion uint32
|
||||
DebugEventCallback uintptr
|
||||
SuppressBackgroundThread BOOL
|
||||
SuppressExternalCodecs BOOL
|
||||
}
|
||||
|
||||
// http://msdn.microsoft.com/en-us/library/windows/desktop/ms534068.aspx
|
||||
type GdiplusStartupOutput struct {
|
||||
NotificationHook uintptr
|
||||
NotificationUnhook uintptr
|
||||
}
|
||||
|
||||
// http://msdn.microsoft.com/en-us/library/windows/desktop/dd162768.aspx
|
||||
type PAINTSTRUCT struct {
|
||||
Hdc HDC
|
||||
FErase BOOL
|
||||
RcPaint RECT
|
||||
FRestore BOOL
|
||||
FIncUpdate BOOL
|
||||
RgbReserved [32]byte
|
||||
}
|
||||
|
||||
// http://msdn.microsoft.com/en-us/library/windows/desktop/ms684225.aspx
|
||||
type MODULEENTRY32 struct {
|
||||
Size uint32
|
||||
ModuleID uint32
|
||||
ProcessID uint32
|
||||
GlblcntUsage uint32
|
||||
ProccntUsage uint32
|
||||
ModBaseAddr *uint8
|
||||
ModBaseSize uint32
|
||||
HModule HMODULE
|
||||
SzModule [MAX_MODULE_NAME32 + 1]uint16
|
||||
SzExePath [MAX_PATH]uint16
|
||||
}
|
||||
|
||||
// http://msdn.microsoft.com/en-us/library/windows/desktop/ms724284.aspx
|
||||
type FILETIME struct {
|
||||
DwLowDateTime uint32
|
||||
DwHighDateTime uint32
|
||||
}
|
||||
|
||||
// http://msdn.microsoft.com/en-us/library/windows/desktop/ms682119.aspx
|
||||
type COORD struct {
|
||||
X, Y int16
|
||||
}
|
||||
|
||||
// http://msdn.microsoft.com/en-us/library/windows/desktop/ms686311.aspx
|
||||
type SMALL_RECT struct {
|
||||
Left, Top, Right, Bottom int16
|
||||
}
|
||||
|
||||
// http://msdn.microsoft.com/en-us/library/windows/desktop/ms682093.aspx
|
||||
type CONSOLE_SCREEN_BUFFER_INFO struct {
|
||||
DwSize COORD
|
||||
DwCursorPosition COORD
|
||||
WAttributes uint16
|
||||
SrWindow SMALL_RECT
|
||||
DwMaximumWindowSize COORD
|
||||
}
|
||||
|
||||
// http://msdn.microsoft.com/en-us/library/windows/desktop/bb773244.aspx
|
||||
type MARGINS struct {
|
||||
CxLeftWidth, CxRightWidth, CyTopHeight, CyBottomHeight int32
|
||||
}
|
||||
|
||||
// http://msdn.microsoft.com/en-us/library/windows/desktop/aa969500.aspx
|
||||
type DWM_BLURBEHIND struct {
|
||||
DwFlags uint32
|
||||
fEnable BOOL
|
||||
hRgnBlur HRGN
|
||||
fTransitionOnMaximized BOOL
|
||||
}
|
||||
|
||||
// http://msdn.microsoft.com/en-us/library/windows/desktop/aa969501.aspx
|
||||
type DWM_PRESENT_PARAMETERS struct {
|
||||
cbSize uint32
|
||||
fQueue BOOL
|
||||
cRefreshStart DWM_FRAME_COUNT
|
||||
cBuffer uint32
|
||||
fUseSourceRate BOOL
|
||||
rateSource UNSIGNED_RATIO
|
||||
cRefreshesPerFrame uint32
|
||||
eSampling DWM_SOURCE_FRAME_SAMPLING
|
||||
}
|
||||
|
||||
// http://msdn.microsoft.com/en-us/library/windows/desktop/aa969502.aspx
|
||||
type DWM_THUMBNAIL_PROPERTIES struct {
|
||||
dwFlags uint32
|
||||
rcDestination RECT
|
||||
rcSource RECT
|
||||
opacity byte
|
||||
fVisible BOOL
|
||||
fSourceClientAreaOnly BOOL
|
||||
}
|
||||
|
||||
// http://msdn.microsoft.com/en-us/library/windows/desktop/aa969503.aspx
|
||||
type DWM_TIMING_INFO struct {
|
||||
cbSize uint32
|
||||
rateRefresh UNSIGNED_RATIO
|
||||
qpcRefreshPeriod QPC_TIME
|
||||
rateCompose UNSIGNED_RATIO
|
||||
qpcVBlank QPC_TIME
|
||||
cRefresh DWM_FRAME_COUNT
|
||||
cDXRefresh uint32
|
||||
qpcCompose QPC_TIME
|
||||
cFrame DWM_FRAME_COUNT
|
||||
cDXPresent uint32
|
||||
cRefreshFrame DWM_FRAME_COUNT
|
||||
cFrameSubmitted DWM_FRAME_COUNT
|
||||
cDXPresentSubmitted uint32
|
||||
cFrameConfirmed DWM_FRAME_COUNT
|
||||
cDXPresentConfirmed uint32
|
||||
cRefreshConfirmed DWM_FRAME_COUNT
|
||||
cDXRefreshConfirmed uint32
|
||||
cFramesLate DWM_FRAME_COUNT
|
||||
cFramesOutstanding uint32
|
||||
cFrameDisplayed DWM_FRAME_COUNT
|
||||
qpcFrameDisplayed QPC_TIME
|
||||
cRefreshFrameDisplayed DWM_FRAME_COUNT
|
||||
cFrameComplete DWM_FRAME_COUNT
|
||||
qpcFrameComplete QPC_TIME
|
||||
cFramePending DWM_FRAME_COUNT
|
||||
qpcFramePending QPC_TIME
|
||||
cFramesDisplayed DWM_FRAME_COUNT
|
||||
cFramesComplete DWM_FRAME_COUNT
|
||||
cFramesPending DWM_FRAME_COUNT
|
||||
cFramesAvailable DWM_FRAME_COUNT
|
||||
cFramesDropped DWM_FRAME_COUNT
|
||||
cFramesMissed DWM_FRAME_COUNT
|
||||
cRefreshNextDisplayed DWM_FRAME_COUNT
|
||||
cRefreshNextPresented DWM_FRAME_COUNT
|
||||
cRefreshesDisplayed DWM_FRAME_COUNT
|
||||
cRefreshesPresented DWM_FRAME_COUNT
|
||||
cRefreshStarted DWM_FRAME_COUNT
|
||||
cPixelsReceived uint64
|
||||
cPixelsDrawn uint64
|
||||
cBuffersEmpty DWM_FRAME_COUNT
|
||||
}
|
||||
|
||||
// http://msdn.microsoft.com/en-us/library/windows/desktop/dd389402.aspx
|
||||
type MilMatrix3x2D struct {
|
||||
S_11, S_12, S_21, S_22 float64
|
||||
DX, DY float64
|
||||
}
|
||||
|
||||
// http://msdn.microsoft.com/en-us/library/windows/desktop/aa969505.aspx
|
||||
type UNSIGNED_RATIO struct {
|
||||
uiNumerator uint32
|
||||
uiDenominator uint32
|
||||
}
|
||||
|
||||
// http://msdn.microsoft.com/en-us/library/windows/desktop/ms632603.aspx
|
||||
type CREATESTRUCT struct {
|
||||
CreateParams uintptr
|
||||
Instance HINSTANCE
|
||||
Menu HMENU
|
||||
Parent HWND
|
||||
Cy, Cx int32
|
||||
Y, X int32
|
||||
Style int32
|
||||
Name *uint16
|
||||
Class *uint16
|
||||
dwExStyle uint32
|
||||
}
|
||||
|
||||
// http://msdn.microsoft.com/en-us/library/windows/desktop/dd145065.aspx
|
||||
type MONITORINFO struct {
|
||||
CbSize uint32
|
||||
RcMonitor RECT
|
||||
RcWork RECT
|
||||
DwFlags uint32
|
||||
}
|
||||
|
||||
// http://msdn.microsoft.com/en-us/library/windows/desktop/dd145066.aspx
|
||||
type MONITORINFOEX struct {
|
||||
MONITORINFO
|
||||
SzDevice [CCHDEVICENAME]uint16
|
||||
}
|
||||
|
||||
// http://msdn.microsoft.com/en-us/library/windows/desktop/dd368826.aspx
|
||||
type PIXELFORMATDESCRIPTOR struct {
|
||||
Size uint16
|
||||
Version uint16
|
||||
DwFlags uint32
|
||||
IPixelType byte
|
||||
ColorBits byte
|
||||
RedBits, RedShift byte
|
||||
GreenBits, GreenShift byte
|
||||
BlueBits, BlueShift byte
|
||||
AlphaBits, AlphaShift byte
|
||||
AccumBits byte
|
||||
AccumRedBits byte
|
||||
AccumGreenBits byte
|
||||
AccumBlueBits byte
|
||||
AccumAlphaBits byte
|
||||
DepthBits, StencilBits byte
|
||||
AuxBuffers byte
|
||||
ILayerType byte
|
||||
Reserved byte
|
||||
DwLayerMask uint32
|
||||
DwVisibleMask uint32
|
||||
DwDamageMask uint32
|
||||
}
|
||||
|
||||
// http://msdn.microsoft.com/en-us/library/windows/desktop/ms646270(v=vs.85).aspx
|
||||
type INPUT struct {
|
||||
Type uint32
|
||||
Mi MOUSEINPUT
|
||||
Ki KEYBDINPUT
|
||||
Hi HARDWAREINPUT
|
||||
}
|
||||
|
||||
// http://msdn.microsoft.com/en-us/library/windows/desktop/ms646273(v=vs.85).aspx
|
||||
type MOUSEINPUT struct {
|
||||
Dx int32
|
||||
Dy int32
|
||||
MouseData uint32
|
||||
DwFlags uint32
|
||||
Time uint32
|
||||
DwExtraInfo uintptr
|
||||
}
|
||||
|
||||
// http://msdn.microsoft.com/en-us/library/windows/desktop/ms646271(v=vs.85).aspx
|
||||
type KEYBDINPUT struct {
|
||||
WVk uint16
|
||||
WScan uint16
|
||||
DwFlags uint32
|
||||
Time uint32
|
||||
DwExtraInfo uintptr
|
||||
}
|
||||
|
||||
// http://msdn.microsoft.com/en-us/library/windows/desktop/ms646269(v=vs.85).aspx
|
||||
type HARDWAREINPUT struct {
|
||||
UMsg uint32
|
||||
WParamL uint16
|
||||
WParamH uint16
|
||||
}
|
||||
|
||||
type KbdInput struct {
|
||||
typ uint32
|
||||
ki KEYBDINPUT
|
||||
}
|
||||
|
||||
type MouseInput struct {
|
||||
typ uint32
|
||||
mi MOUSEINPUT
|
||||
}
|
||||
|
||||
type HardwareInput struct {
|
||||
typ uint32
|
||||
hi HARDWAREINPUT
|
||||
}
|
||||
|
||||
// http://msdn.microsoft.com/en-us/library/windows/desktop/ms724950(v=vs.85).aspx
|
||||
type SYSTEMTIME struct {
|
||||
Year uint16
|
||||
Month uint16
|
||||
DayOfWeek uint16
|
||||
Day uint16
|
||||
Hour uint16
|
||||
Minute uint16
|
||||
Second uint16
|
||||
Milliseconds uint16
|
||||
}
|
||||
|
||||
// http://msdn.microsoft.com/en-us/library/windows/desktop/ms644967(v=vs.85).aspx
|
||||
type KBDLLHOOKSTRUCT struct {
|
||||
VkCode DWORD
|
||||
ScanCode DWORD
|
||||
Flags DWORD
|
||||
Time DWORD
|
||||
DwExtraInfo ULONG_PTR
|
||||
}
|
||||
|
||||
type HOOKPROC func(int, WPARAM, LPARAM) LRESULT
|
||||
|
||||
// https://msdn.microsoft.com/en-us/library/windows/desktop/ms633498(v=vs.85).aspx
|
||||
type WNDENUMPROC func(HWND, LPARAM) LRESULT
|
File diff suppressed because it is too large
Load Diff
|
@ -1,201 +0,0 @@
|
|||
// Copyright 2010-2012 The W32 Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
package w32
|
||||
|
||||
import (
|
||||
"syscall"
|
||||
"unicode/utf16"
|
||||
"unsafe"
|
||||
)
|
||||
|
||||
func MakeIntResource(id uint16) *uint16 {
|
||||
return (*uint16)(unsafe.Pointer(uintptr(id)))
|
||||
}
|
||||
|
||||
func LOWORD(dw uint32) uint16 {
|
||||
return uint16(dw)
|
||||
}
|
||||
|
||||
func HIWORD(dw uint32) uint16 {
|
||||
return uint16(dw >> 16 & 0xffff)
|
||||
}
|
||||
|
||||
func BoolToBOOL(value bool) BOOL {
|
||||
if value {
|
||||
return 1
|
||||
}
|
||||
|
||||
return 0
|
||||
}
|
||||
|
||||
func UTF16PtrToString(cstr *uint16) string {
|
||||
if cstr != nil {
|
||||
us := make([]uint16, 0, 256)
|
||||
for p := uintptr(unsafe.Pointer(cstr)); ; p += 2 {
|
||||
u := *(*uint16)(unsafe.Pointer(p))
|
||||
if u == 0 {
|
||||
return string(utf16.Decode(us))
|
||||
}
|
||||
us = append(us, u)
|
||||
}
|
||||
}
|
||||
|
||||
return ""
|
||||
}
|
||||
|
||||
func ComAddRef(unknown *IUnknown) int32 {
|
||||
ret, _, _ := syscall.Syscall(unknown.lpVtbl.pAddRef, 1,
|
||||
uintptr(unsafe.Pointer(unknown)),
|
||||
0,
|
||||
0)
|
||||
return int32(ret)
|
||||
}
|
||||
|
||||
func ComRelease(unknown *IUnknown) int32 {
|
||||
ret, _, _ := syscall.Syscall(unknown.lpVtbl.pRelease, 1,
|
||||
uintptr(unsafe.Pointer(unknown)),
|
||||
0,
|
||||
0)
|
||||
return int32(ret)
|
||||
}
|
||||
|
||||
func ComQueryInterface(unknown *IUnknown, id *GUID) *IDispatch {
|
||||
var disp *IDispatch
|
||||
hr, _, _ := syscall.Syscall(unknown.lpVtbl.pQueryInterface, 3,
|
||||
uintptr(unsafe.Pointer(unknown)),
|
||||
uintptr(unsafe.Pointer(id)),
|
||||
uintptr(unsafe.Pointer(&disp)))
|
||||
if hr != 0 {
|
||||
panic("Invoke QieryInterface error.")
|
||||
}
|
||||
return disp
|
||||
}
|
||||
|
||||
func ComGetIDsOfName(disp *IDispatch, names []string) []int32 {
|
||||
wnames := make([]*uint16, len(names))
|
||||
dispid := make([]int32, len(names))
|
||||
for i := 0; i < len(names); i++ {
|
||||
wnames[i] = syscall.StringToUTF16Ptr(names[i])
|
||||
}
|
||||
hr, _, _ := syscall.Syscall6(disp.lpVtbl.pGetIDsOfNames, 6,
|
||||
uintptr(unsafe.Pointer(disp)),
|
||||
uintptr(unsafe.Pointer(IID_NULL)),
|
||||
uintptr(unsafe.Pointer(&wnames[0])),
|
||||
uintptr(len(names)),
|
||||
uintptr(GetUserDefaultLCID()),
|
||||
uintptr(unsafe.Pointer(&dispid[0])))
|
||||
if hr != 0 {
|
||||
panic("Invoke GetIDsOfName error.")
|
||||
}
|
||||
return dispid
|
||||
}
|
||||
|
||||
func ComInvoke(disp *IDispatch, dispid int32, dispatch int16, params ...interface{}) (result *VARIANT) {
|
||||
var dispparams DISPPARAMS
|
||||
|
||||
if dispatch&DISPATCH_PROPERTYPUT != 0 {
|
||||
dispnames := [1]int32{DISPID_PROPERTYPUT}
|
||||
dispparams.RgdispidNamedArgs = uintptr(unsafe.Pointer(&dispnames[0]))
|
||||
dispparams.CNamedArgs = 1
|
||||
}
|
||||
var vargs []VARIANT
|
||||
if len(params) > 0 {
|
||||
vargs = make([]VARIANT, len(params))
|
||||
for i, v := range params {
|
||||
//n := len(params)-i-1
|
||||
n := len(params) - i - 1
|
||||
VariantInit(&vargs[n])
|
||||
switch v.(type) {
|
||||
case bool:
|
||||
if v.(bool) {
|
||||
vargs[n] = VARIANT{VT_BOOL, 0, 0, 0, 0xffff}
|
||||
} else {
|
||||
vargs[n] = VARIANT{VT_BOOL, 0, 0, 0, 0}
|
||||
}
|
||||
case *bool:
|
||||
vargs[n] = VARIANT{VT_BOOL | VT_BYREF, 0, 0, 0, int64(uintptr(unsafe.Pointer(v.(*bool))))}
|
||||
case byte:
|
||||
vargs[n] = VARIANT{VT_I1, 0, 0, 0, int64(v.(byte))}
|
||||
case *byte:
|
||||
vargs[n] = VARIANT{VT_I1 | VT_BYREF, 0, 0, 0, int64(uintptr(unsafe.Pointer(v.(*byte))))}
|
||||
case int16:
|
||||
vargs[n] = VARIANT{VT_I2, 0, 0, 0, int64(v.(int16))}
|
||||
case *int16:
|
||||
vargs[n] = VARIANT{VT_I2 | VT_BYREF, 0, 0, 0, int64(uintptr(unsafe.Pointer(v.(*int16))))}
|
||||
case uint16:
|
||||
vargs[n] = VARIANT{VT_UI2, 0, 0, 0, int64(v.(int16))}
|
||||
case *uint16:
|
||||
vargs[n] = VARIANT{VT_UI2 | VT_BYREF, 0, 0, 0, int64(uintptr(unsafe.Pointer(v.(*uint16))))}
|
||||
case int, int32:
|
||||
vargs[n] = VARIANT{VT_UI4, 0, 0, 0, int64(v.(int))}
|
||||
case *int, *int32:
|
||||
vargs[n] = VARIANT{VT_I4 | VT_BYREF, 0, 0, 0, int64(uintptr(unsafe.Pointer(v.(*int))))}
|
||||
case uint, uint32:
|
||||
vargs[n] = VARIANT{VT_UI4, 0, 0, 0, int64(v.(uint))}
|
||||
case *uint, *uint32:
|
||||
vargs[n] = VARIANT{VT_UI4 | VT_BYREF, 0, 0, 0, int64(uintptr(unsafe.Pointer(v.(*uint))))}
|
||||
case int64:
|
||||
vargs[n] = VARIANT{VT_I8, 0, 0, 0, v.(int64)}
|
||||
case *int64:
|
||||
vargs[n] = VARIANT{VT_I8 | VT_BYREF, 0, 0, 0, int64(uintptr(unsafe.Pointer(v.(*int64))))}
|
||||
case uint64:
|
||||
vargs[n] = VARIANT{VT_UI8, 0, 0, 0, int64(v.(uint64))}
|
||||
case *uint64:
|
||||
vargs[n] = VARIANT{VT_UI8 | VT_BYREF, 0, 0, 0, int64(uintptr(unsafe.Pointer(v.(*uint64))))}
|
||||
case float32:
|
||||
vargs[n] = VARIANT{VT_R4, 0, 0, 0, int64(v.(float32))}
|
||||
case *float32:
|
||||
vargs[n] = VARIANT{VT_R4 | VT_BYREF, 0, 0, 0, int64(uintptr(unsafe.Pointer(v.(*float32))))}
|
||||
case float64:
|
||||
vargs[n] = VARIANT{VT_R8, 0, 0, 0, int64(v.(float64))}
|
||||
case *float64:
|
||||
vargs[n] = VARIANT{VT_R8 | VT_BYREF, 0, 0, 0, int64(uintptr(unsafe.Pointer(v.(*float64))))}
|
||||
case string:
|
||||
vargs[n] = VARIANT{VT_BSTR, 0, 0, 0, int64(uintptr(unsafe.Pointer(SysAllocString(v.(string)))))}
|
||||
case *string:
|
||||
vargs[n] = VARIANT{VT_BSTR | VT_BYREF, 0, 0, 0, int64(uintptr(unsafe.Pointer(v.(*string))))}
|
||||
case *IDispatch:
|
||||
vargs[n] = VARIANT{VT_DISPATCH, 0, 0, 0, int64(uintptr(unsafe.Pointer(v.(*IDispatch))))}
|
||||
case **IDispatch:
|
||||
vargs[n] = VARIANT{VT_DISPATCH | VT_BYREF, 0, 0, 0, int64(uintptr(unsafe.Pointer(v.(**IDispatch))))}
|
||||
case nil:
|
||||
vargs[n] = VARIANT{VT_NULL, 0, 0, 0, 0}
|
||||
case *VARIANT:
|
||||
vargs[n] = VARIANT{VT_VARIANT | VT_BYREF, 0, 0, 0, int64(uintptr(unsafe.Pointer(v.(*VARIANT))))}
|
||||
default:
|
||||
panic("unknown type")
|
||||
}
|
||||
}
|
||||
dispparams.Rgvarg = uintptr(unsafe.Pointer(&vargs[0]))
|
||||
dispparams.CArgs = uint32(len(params))
|
||||
}
|
||||
|
||||
var ret VARIANT
|
||||
var excepInfo EXCEPINFO
|
||||
VariantInit(&ret)
|
||||
hr, _, _ := syscall.Syscall9(disp.lpVtbl.pInvoke, 8,
|
||||
uintptr(unsafe.Pointer(disp)),
|
||||
uintptr(dispid),
|
||||
uintptr(unsafe.Pointer(IID_NULL)),
|
||||
uintptr(GetUserDefaultLCID()),
|
||||
uintptr(dispatch),
|
||||
uintptr(unsafe.Pointer(&dispparams)),
|
||||
uintptr(unsafe.Pointer(&ret)),
|
||||
uintptr(unsafe.Pointer(&excepInfo)),
|
||||
0)
|
||||
if hr != 0 {
|
||||
if excepInfo.BstrDescription != nil {
|
||||
bs := UTF16PtrToString(excepInfo.BstrDescription)
|
||||
panic(bs)
|
||||
}
|
||||
}
|
||||
for _, varg := range vargs {
|
||||
if varg.VT == VT_BSTR && varg.Val != 0 {
|
||||
SysFreeString(((*int16)(unsafe.Pointer(uintptr(varg.Val)))))
|
||||
}
|
||||
}
|
||||
result = &ret
|
||||
return
|
||||
}
|
|
@ -1,13 +0,0 @@
|
|||
// Copyright 2010-2012 The W32 Authors. All rights reserved.
|
||||
// Use of this source code is governed by a BSD-style
|
||||
// license that can be found in the LICENSE file.
|
||||
|
||||
package w32
|
||||
|
||||
var (
|
||||
IID_NULL = &GUID{0x00000000, 0x0000, 0x0000, [8]byte{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}
|
||||
IID_IUnknown = &GUID{0x00000000, 0x0000, 0x0000, [8]byte{0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46}}
|
||||
IID_IDispatch = &GUID{0x00020400, 0x0000, 0x0000, [8]byte{0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46}}
|
||||
IID_IConnectionPointContainer = &GUID{0xB196B284, 0xBAB4, 0x101A, [8]byte{0xB6, 0x9C, 0x00, 0xAA, 0x00, 0x34, 0x1D, 0x07}}
|
||||
IID_IConnectionPoint = &GUID{0xB196B286, 0xBAB4, 0x101A, [8]byte{0xB6, 0x9C, 0x00, 0xAA, 0x00, 0x34, 0x1D, 0x07}}
|
||||
)
|
|
@ -163,6 +163,7 @@ package platform
|
|||
//
|
||||
// int hr_succeeded( DWORD hResult );
|
||||
import "C"
|
||||
|
||||
import (
|
||||
"errors"
|
||||
"os"
|
||||
|
|
|
@ -17,7 +17,6 @@ type Sixel struct {
|
|||
type colour [3]uint8
|
||||
|
||||
func decompress(data string) string {
|
||||
|
||||
output := ""
|
||||
|
||||
inMarker := false
|
||||
|
@ -49,7 +48,6 @@ func decompress(data string) string {
|
|||
|
||||
// pass in everything after ESC+P and before ST
|
||||
func ParseString(data string) (*Sixel, error) {
|
||||
|
||||
data = decompress(data)
|
||||
|
||||
inHeader := true
|
||||
|
@ -151,7 +149,7 @@ func ParseString(data string) (*Sixel, error) {
|
|||
six.setPixel(x, y+uint(bit), selectedColour, ratio)
|
||||
} else if !remainMode {
|
||||
// @todo use background colour here
|
||||
//six.setPixel(x, y+uint(bit), selectedColour)
|
||||
// six.setPixel(x, y+uint(bit), selectedColour)
|
||||
}
|
||||
}
|
||||
x++
|
||||
|
@ -162,7 +160,6 @@ func ParseString(data string) (*Sixel, error) {
|
|||
}
|
||||
|
||||
func (six *Sixel) setPixel(x, y uint, c colour, vhRatio uint) {
|
||||
|
||||
if six.px == nil {
|
||||
six.px = map[uint]map[uint]colour{}
|
||||
}
|
||||
|
@ -184,7 +181,6 @@ func (six *Sixel) setPixel(x, y uint, c colour, vhRatio uint) {
|
|||
}
|
||||
six.px[x][ay+i] = c
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
func (six *Sixel) RGBA() *image.RGBA {
|
||||
|
|
|
@ -8,8 +8,7 @@ import (
|
|||
|
||||
// from https://en.wikipedia.org/wiki/Sixel
|
||||
func TestParsing(t *testing.T) {
|
||||
|
||||
//raw := `q"1;1;16;16#0;2;0;0;0#1;2;94;75;22#2;2;97;78;31#3;2;97;82;35#4;2;97;82;44#5;2;94;78;25#6;2;91;78;41#7;2;69;60;38#8;2;56;50;35#9;2;63;56;35#10;2;41;38;31#0NB@@!8?@@BN$#1oCA?@!6?@?ACo$#3?O??A?!4@?A??O$#4?_w{{!6}{{w_$#5?G#2CA?@!4?@?AC#5G-#1{_#6K!4?__!4?K#1_{$#5B#4FRrrrz^^zrrrRF#5B$#3?G_#7CCGC??CGCC#3_G$#2?O#9?G!8?G#2?O$#8!4?GC!4?CG-#0NKGG!8?GGKN$#1?BFE!8KEFB$#3???@!8?@$#4!4?@@!4?@@$#5!4?A!6?A$#2!5?A!4?A$#7!6?A??A$#10!6?!4@$#6!7?AA`
|
||||
// raw := `q"1;1;16;16#0;2;0;0;0#1;2;94;75;22#2;2;97;78;31#3;2;97;82;35#4;2;97;82;44#5;2;94;78;25#6;2;91;78;41#7;2;69;60;38#8;2;56;50;35#9;2;63;56;35#10;2;41;38;31#0NB@@!8?@@BN$#1oCA?@!6?@?ACo$#3?O??A?!4@?A??O$#4?_w{{!6}{{w_$#5?G#2CA?@!4?@?AC#5G-#1{_#6K!4?__!4?K#1_{$#5B#4FRrrrz^^zrrrRF#5B$#3?G_#7CCGC??CGCC#3_G$#2?O#9?G!8?G#2?O$#8!4?GC!4?CG-#0NKGG!8?GGKN$#1?BFE!8KEFB$#3???@!8?@$#4!4?@@!4?@@$#5!4?A!6?A$#2!5?A!4?A$#7!6?A??A$#10!6?!4@$#6!7?AA`
|
||||
raw := `q
|
||||
#0;2;0;0;0#1;2;100;100;0#2;2;0;100;0
|
||||
#1~~@@vv@@~~@@~~$
|
||||
|
@ -20,5 +19,4 @@ func TestParsing(t *testing.T) {
|
|||
|
||||
img := six.RGBA()
|
||||
require.NotNil(t, img)
|
||||
|
||||
}
|
||||
|
|
|
@ -15,7 +15,7 @@ var ansiSequenceMap = map[rune]escapeSequenceHandler{
|
|||
'H': tabSetHandler, // HTS
|
||||
'M': reverseIndexHandler,
|
||||
'P': sixelHandler,
|
||||
'c': risHandler, //RIS
|
||||
'c': risHandler, // RIS
|
||||
'#': screenStateHandler,
|
||||
'(': scs0Handler, // select character set into G0
|
||||
')': scs1Handler, // select character set into G1
|
||||
|
@ -65,7 +65,7 @@ func ansiHandler(pty chan rune, terminal *Terminal) error {
|
|||
|
||||
handler, ok := ansiSequenceMap[b]
|
||||
if ok {
|
||||
//terminal.logger.Debugf("Handling ansi sequence %c", b)
|
||||
// terminal.logger.Debugf("Handling ansi sequence %c", b)
|
||||
return handler(pty, terminal)
|
||||
}
|
||||
|
||||
|
|
|
@ -112,7 +112,6 @@ func csiHandler(pty chan rune, terminal *Terminal) error {
|
|||
}
|
||||
|
||||
func csiSendDeviceAttributesHandler(params []string, terminal *Terminal) error {
|
||||
|
||||
// we are VT100
|
||||
// for DA1 we'll respond ?1;2
|
||||
// for DA2 we'll respond >0;0;0
|
||||
|
@ -129,7 +128,6 @@ func csiSendDeviceAttributesHandler(params []string, terminal *Terminal) error {
|
|||
}
|
||||
|
||||
func csiDeviceStatusReportHandler(params []string, terminal *Terminal) error {
|
||||
|
||||
if len(params) == 0 {
|
||||
return fmt.Errorf("Missing Device Status Report identifier")
|
||||
}
|
||||
|
@ -206,7 +204,6 @@ func csiCursorBackwardHandler(params []string, terminal *Terminal) error {
|
|||
}
|
||||
|
||||
func csiCursorNextLineHandler(params []string, terminal *Terminal) error {
|
||||
|
||||
distance := 1
|
||||
if len(params) > 0 {
|
||||
var err error
|
||||
|
@ -222,7 +219,6 @@ func csiCursorNextLineHandler(params []string, terminal *Terminal) error {
|
|||
}
|
||||
|
||||
func csiCursorPrecedingLineHandler(params []string, terminal *Terminal) error {
|
||||
|
||||
distance := 1
|
||||
if len(params) > 0 {
|
||||
var err error
|
||||
|
@ -497,14 +493,13 @@ func csiEraseInDisplayHandler(params []string, terminal *Terminal) error {
|
|||
|
||||
// CSI Ps K
|
||||
func csiEraseInLineHandler(params []string, terminal *Terminal) error {
|
||||
|
||||
n := "0"
|
||||
if len(params) > 0 {
|
||||
n = params[0]
|
||||
}
|
||||
|
||||
switch n {
|
||||
case "0", "": //erase adter cursor
|
||||
case "0", "": // erase adter cursor
|
||||
terminal.ActiveBuffer().EraseLineFromCursor()
|
||||
case "1": // erase to cursor inclusive
|
||||
terminal.ActiveBuffer().EraseLineToCursor()
|
||||
|
|
|
@ -48,7 +48,6 @@ func csiSetModes(modes []string, enabled bool, terminal *Terminal) error {
|
|||
}
|
||||
|
||||
func csiSetMode(modeStr string, enabled bool, terminal *Terminal) error {
|
||||
|
||||
/*
|
||||
Mouse support
|
||||
|
||||
|
@ -104,7 +103,7 @@ func csiSetMode(modeStr string, enabled bool, terminal *Terminal) error {
|
|||
terminal.SetOriginMode(enabled)
|
||||
case "?7":
|
||||
// auto-wrap mode
|
||||
//DECAWM
|
||||
// DECAWM
|
||||
terminal.SetAutoWrap(enabled)
|
||||
case "?9":
|
||||
if enabled {
|
||||
|
|
|
@ -6,7 +6,6 @@ import (
|
|||
)
|
||||
|
||||
func oscHandler(pty chan rune, terminal *Terminal) error {
|
||||
|
||||
params := []string{}
|
||||
param := ""
|
||||
|
||||
|
|
|
@ -80,7 +80,7 @@ func (terminal *Terminal) processRune(b rune) {
|
|||
terminal.isDirty = true
|
||||
return
|
||||
}
|
||||
//terminal.logger.Debugf("Received character 0x%X: %q", b, string(b))
|
||||
// terminal.logger.Debugf("Received character 0x%X: %q", b, string(b))
|
||||
terminal.ActiveBuffer().Write(terminal.translateRune(b))
|
||||
terminal.isDirty = true
|
||||
}
|
||||
|
@ -98,7 +98,6 @@ func (terminal *Terminal) translateRune(b rune) rune {
|
|||
}
|
||||
|
||||
func (terminal *Terminal) processInput(pty chan rune) {
|
||||
|
||||
// https://en.wikipedia.org/wiki/ANSI_escape_code
|
||||
|
||||
var b rune
|
||||
|
@ -112,7 +111,7 @@ func (terminal *Terminal) processInput(pty chan rune) {
|
|||
b = <-pty
|
||||
|
||||
if b == 0x1b {
|
||||
//terminal.logger.Debugf("Handling escape sequence: 0x%x", b)
|
||||
// terminal.logger.Debugf("Handling escape sequence: 0x%x", b)
|
||||
if err := ansiHandler(pty, terminal); err != nil {
|
||||
terminal.logger.Errorf("Error handling escape sequence: %s", err)
|
||||
}
|
||||
|
|
|
@ -10,7 +10,6 @@ import (
|
|||
)
|
||||
|
||||
func sgrSequenceHandler(params []string, terminal *Terminal) error {
|
||||
|
||||
if len(params) == 0 {
|
||||
params = []string{"0"}
|
||||
}
|
||||
|
@ -141,13 +140,12 @@ func sgrSequenceHandler(params []string, terminal *Terminal) error {
|
|||
}
|
||||
}
|
||||
|
||||
//terminal.logger.Debugf("SGR control sequence: (ESC[%s%sm)", param, intermediate)
|
||||
// terminal.logger.Debugf("SGR control sequence: (ESC[%s%sm)", param, intermediate)
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (terminal *Terminal) getANSIColour(params []string) (config.Colour, error) {
|
||||
|
||||
if len(params) > 2 {
|
||||
switch params[1] {
|
||||
case "5":
|
||||
|
@ -206,11 +204,9 @@ func (terminal *Terminal) getANSIColour(params []string) (config.Colour, error)
|
|||
}
|
||||
|
||||
return [3]float32{}, fmt.Errorf("Unknown ANSI colour format identifier")
|
||||
|
||||
}
|
||||
|
||||
func (terminal *Terminal) get8BitSGRColour(colNum uint8) [3]float32 {
|
||||
|
||||
// https://en.wikipedia.org/wiki/ANSI_escape_code#8-bit
|
||||
|
||||
switch colNum {
|
||||
|
|
|
@ -120,7 +120,6 @@ func sixelHandler(pty chan rune, terminal *Terminal) error {
|
|||
filteredData := filter(newData)
|
||||
|
||||
six, err := sixel.ParseString(string(filteredData))
|
||||
|
||||
if err != nil {
|
||||
return fmt.Errorf("Failed to parse sixel data: %s", err)
|
||||
}
|
||||
|
|
|
@ -18,8 +18,10 @@ const (
|
|||
InternalBuffer uint8 = 2
|
||||
)
|
||||
|
||||
type MouseMode uint
|
||||
type MouseExtMode uint
|
||||
type (
|
||||
MouseMode uint
|
||||
MouseExtMode uint
|
||||
)
|
||||
|
||||
const (
|
||||
MouseModeNone MouseMode = iota
|
||||
|
@ -67,8 +69,8 @@ type Modes struct {
|
|||
type Winsize struct {
|
||||
Height uint16
|
||||
Width uint16
|
||||
x uint16 //ignored, but necessary for ioctl calls
|
||||
y uint16 //ignored, but necessary for ioctl calls
|
||||
x uint16 // ignored, but necessary for ioctl calls
|
||||
y uint16 // ignored, but necessary for ioctl calls
|
||||
}
|
||||
|
||||
func New(pty platform.Pty, logger *zap.SugaredLogger, config *config.Config) *Terminal {
|
||||
|
@ -93,7 +95,6 @@ func New(pty platform.Pty, logger *zap.SugaredLogger, config *config.Config) *Te
|
|||
}
|
||||
t.activeBuffer = t.buffers[0]
|
||||
return t
|
||||
|
||||
}
|
||||
|
||||
func (terminal *Terminal) SetProgram(program uint32) {
|
||||
|
@ -218,6 +219,7 @@ func (terminal *Terminal) ScreenScrollUp(lines uint16) {
|
|||
func (terminal *Terminal) ScrollPageDown() {
|
||||
terminal.ScreenScrollDown(terminal.terminalState.ViewHeight())
|
||||
}
|
||||
|
||||
func (terminal *Terminal) ScrollPageUp() {
|
||||
terminal.ScreenScrollUp(terminal.terminalState.ViewHeight())
|
||||
}
|
||||
|
@ -315,7 +317,6 @@ func (terminal *Terminal) WriteReturn() error {
|
|||
}
|
||||
|
||||
func (terminal *Terminal) Paste(data []byte) error {
|
||||
|
||||
if terminal.bracketedPasteMode {
|
||||
data = []byte(fmt.Sprintf("\x1b[200~%s\x1b[201~", string(data)))
|
||||
}
|
||||
|
@ -325,7 +326,6 @@ func (terminal *Terminal) Paste(data []byte) error {
|
|||
|
||||
// Read needs to be run on a goroutine, as it continually reads output to set on the terminal
|
||||
func (terminal *Terminal) Read() error {
|
||||
|
||||
buffer := make(chan rune, 0xffff)
|
||||
|
||||
reader := bufio.NewReader(terminal.pty)
|
||||
|
@ -342,7 +342,7 @@ func (terminal *Terminal) Read() error {
|
|||
buffer <- r
|
||||
}
|
||||
|
||||
//clean exit
|
||||
// clean exit
|
||||
return nil
|
||||
}
|
||||
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue