From 8f142e4b91cb8b4778c8f893c65b4b87377f6244 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Miroslav=20=C5=A0ediv=C3=BD?= Date: Thu, 25 Feb 2021 14:03:57 +0100 Subject: [PATCH] GetCursorImage returns image structure. --- internal/desktop/xorg/xorg.go | 28 ++++++++++++++++++++++------ internal/types/desktop.go | 2 +- internal/utils/cursor.go | 22 +--------------------- 3 files changed, 24 insertions(+), 28 deletions(-) diff --git a/internal/desktop/xorg/xorg.go b/internal/desktop/xorg/xorg.go index 039dccc5..cccd5d87 100644 --- a/internal/desktop/xorg/xorg.go +++ b/internal/desktop/xorg/xorg.go @@ -243,17 +243,33 @@ func GetCursorImage() *types.CursorImage { cur := C.XGetCursorImage() defer C.XFree(unsafe.Pointer(cur)) - width := uint16(cur.width) - height := uint16(cur.height) + width := int(cur.width) + height := int(cur.height) + + // Xlib stores 32-bit data in longs, even if longs are 64-bits long. + pixels := C.GoBytes(unsafe.Pointer(cur.pixels), C.int(width*height*8)) + + img := image.NewRGBA(image.Rect(0, 0, width, height)) + for row := 0; row < height; row++ { + for col := 0; col < width; col++ { + pos := ((row * height) + col) * 8 + + img.SetRGBA(col, row, color.RGBA{ + A: pixels[pos+3], + R: pixels[pos+2], + G: pixels[pos+1], + B: pixels[pos+0], + }) + } + } return &types.CursorImage{ - Width: width, - Height: height, + Width: uint16(width), + Height: uint16(height), Xhot: uint16(cur.xhot), Yhot: uint16(cur.yhot), Serial: uint64(cur.cursor_serial), - // Xlib stores 32-bit data in longs, even if longs are 64-bits long. - Pixels: C.GoBytes(unsafe.Pointer(cur.pixels), C.int(width*height*8)), + Image: img, } } diff --git a/internal/types/desktop.go b/internal/types/desktop.go index 7d49f8e2..bccfbc04 100644 --- a/internal/types/desktop.go +++ b/internal/types/desktop.go @@ -10,7 +10,7 @@ type CursorImage struct { Xhot uint16 Yhot uint16 Serial uint64 - Pixels []byte + Image *image.RGBA } type ScreenSize struct { diff --git a/internal/utils/cursor.go b/internal/utils/cursor.go index 528ac488..ebd806dd 100644 --- a/internal/utils/cursor.go +++ b/internal/utils/cursor.go @@ -3,34 +3,14 @@ package utils import ( "bytes" "encoding/base64" - "image" - "image/color" "image/png" "demodesk/neko/internal/types" ) func GetCursorImage(cursor *types.CursorImage) ([]byte, error) { - width := int(cursor.Width) - height := int(cursor.Height) - pixels := cursor.Pixels - - img := image.NewRGBA(image.Rect(0, 0, width, height)) - for row := 0; row < height; row++ { - for col := 0; col < width; col++ { - pos := ((row * height) + col) * 8 - - img.SetRGBA(col, row, color.RGBA{ - A: pixels[pos+3], - R: pixels[pos+2], - G: pixels[pos+1], - B: pixels[pos+0], - }) - } - } - out := new(bytes.Buffer) - err := png.Encode(out, img) + err := png.Encode(out, cursor.Image) if err != nil { return nil, err }