app: add support for system cursors

Signed-off-by: pierre <pierre.curto@gmail.com>
This commit is contained in:
pierre
2020-12-02 16:50:56 +01:00
committed by Elias Naur
parent 951d45a2c6
commit 69cc2c795c
15 changed files with 297 additions and 18 deletions
+39 -3
View File
@@ -45,6 +45,7 @@ type window struct {
height int
stage system.Stage
pointerBtns pointer.Buttons
cursor syscall.Handle
mu sync.Mutex
animating bool
@@ -105,6 +106,9 @@ func NewWindow(window Callbacks, opts *Options) error {
windows.ShowWindow(w.hwnd, windows.SW_SHOWDEFAULT)
windows.SetForegroundWindow(w.hwnd)
windows.SetFocus(w.hwnd)
// Since the window class for the cursor is null,
// set it here to show the cursor.
w.SetCursor(pointer.CursorDefault)
if err := w.loop(); err != nil {
panic(err)
}
@@ -120,17 +124,16 @@ func initResources() error {
return err
}
resources.handle = hInst
curs, err := windows.LoadCursor(windows.IDC_ARROW)
c, err := loadCursor(pointer.CursorDefault)
if err != nil {
return err
}
resources.cursor = curs
resources.cursor = c
wcls := windows.WndClassEx{
CbSize: uint32(unsafe.Sizeof(windows.WndClassEx{})),
Style: windows.CS_HREDRAW | windows.CS_VREDRAW | windows.CS_OWNDC,
LpfnWndProc: syscall.NewCallback(windowProc),
HInstance: hInst,
HCursor: curs,
LpszClassName: syscall.StringToUTF16Ptr("GioWindow"),
}
cls, err := windows.RegisterClassEx(&wcls)
@@ -299,6 +302,8 @@ func windowProc(hwnd syscall.Handle, msg uint32, wParam, lParam uintptr) uintptr
Y: w.minmax.maxHeight + w.deltas.height,
}
}
case windows.WM_SETCURSOR:
windows.SetCursor(w.cursor)
}
return windows.DefWindowProc(hwnd, msg, wParam, lParam)
@@ -552,6 +557,37 @@ func (w *window) writeClipboard(s string) error {
return nil
}
func (w *window) SetCursor(name pointer.CursorName) {
c, err := loadCursor(name)
if err != nil {
c = resources.cursor
}
w.cursor = c
}
func loadCursor(name pointer.CursorName) (syscall.Handle, error) {
var curID uint16
switch name {
default:
fallthrough
case pointer.CursorDefault:
return resources.cursor, nil
case pointer.CursorText:
curID = windows.IDC_IBEAM
case pointer.CursorPointer:
curID = windows.IDC_HAND
case pointer.CursorCrossHair:
curID = windows.IDC_CROSS
case pointer.CursorColResize:
curID = windows.IDC_SIZEWE
case pointer.CursorRowResize:
curID = windows.IDC_SIZENS
case pointer.CursorNone:
return 0, nil
}
return windows.LoadCursor(curID)
}
func (w *window) ShowTextInput(show bool) {}
func (w *window) HDC() syscall.Handle {