io/pointer: [API] make cursor name into a byte

Add most of the common cursors defined by different systems.

Normalize cursor names to match CSS.

This is API change: some cursor names have changed, and the
underlying type is no longer a string.

Signed-off-by: Egon Elbre <egonelbre@gmail.com>
This commit is contained in:
Egon Elbre
2022-02-25 16:08:09 +02:00
committed by Elias Naur
parent a401d7aaff
commit 4172566aad
14 changed files with 356 additions and 197 deletions
+30 -19
View File
@@ -1350,26 +1350,37 @@ func (w *window) Wakeup() {
})
}
var androidCursor = [...]uint16{
pointer.CursorDefault: 1000, // TYPE_ARROW
pointer.CursorNone: 0,
pointer.CursorText: 1008, // TYPE_TEXT
pointer.CursorVerticalText: 1009, // TYPE_VERTICAL_TEXT
pointer.CursorPointer: 1002, // TYPE_HAND
pointer.CursorCrosshair: 1007, // TYPE_CROSSHAIR
pointer.CursorAllScroll: 1013, // TYPE_ALL_SCROLL
pointer.CursorColResize: 1014, // TYPE_HORIZONTAL_DOUBLE_ARROW
pointer.CursorRowResize: 1015, // TYPE_VERTICAL_DOUBLE_ARROW
pointer.CursorGrab: 1020, // TYPE_GRAB
pointer.CursorGrabbing: 1021, // TYPE_GRABBING
pointer.CursorNotAllowed: 1012, // TYPE_NO_DROP
pointer.CursorWait: 1004, // TYPE_WAIT
pointer.CursorProgress: 1000, // TYPE_ARROW
pointer.CursorNorthWestResize: 1017, // TYPE_TOP_LEFT_DIAGONAL_DOUBLE_ARROW
pointer.CursorNorthEastResize: 1016, // TYPE_TOP_RIGHT_DIAGONAL_DOUBLE_ARROW
pointer.CursorSouthWestResize: 1016, // TYPE_TOP_RIGHT_DIAGONAL_DOUBLE_ARROW
pointer.CursorSouthEastResize: 1017, // TYPE_TOP_LEFT_DIAGONAL_DOUBLE_ARROW
pointer.CursorNorthSouthResize: 1015, // TYPE_VERTICAL_DOUBLE_ARROW
pointer.CursorEastWestResize: 1014, // TYPE_HORIZONTAL_DOUBLE_ARROW
pointer.CursorWestResize: 1014, // TYPE_HORIZONTAL_DOUBLE_ARROW
pointer.CursorEastResize: 1014, // TYPE_HORIZONTAL_DOUBLE_ARROW
pointer.CursorNorthResize: 1015, // TYPE_VERTICAL_DOUBLE_ARROW
pointer.CursorSouthResize: 1015, // TYPE_VERTICAL_DOUBLE_ARROW
pointer.CursorNorthEastSouthWestResize: 1016, // TYPE_TOP_RIGHT_DIAGONAL_DOUBLE_ARROW
pointer.CursorNorthWestSouthEastResize: 1017, // TYPE_TOP_LEFT_DIAGONAL_DOUBLE_ARROW
}
func setCursor(env *C.JNIEnv, view C.jobject, name pointer.CursorName) {
var curID int
switch name {
default:
fallthrough
case pointer.CursorDefault:
curID = 1000 // TYPE_ARROW
case pointer.CursorText:
curID = 1008 // TYPE_TEXT
case pointer.CursorPointer:
curID = 1002 // TYPE_HAND
case pointer.CursorCrossHair:
curID = 1007 // TYPE_CROSSHAIR
case pointer.CursorColResize:
curID = 1014 // TYPE_HORIZONTAL_DOUBLE_ARROW
case pointer.CursorRowResize:
curID = 1015 // TYPE_VERTICAL_DOUBLE_ARROW
case pointer.CursorNone:
curID = 0 // TYPE_NULL
}
curID := androidCursor[name]
callVoidMethod(env, view, gioView.setCursor, jvalue(curID))
}
+31 -38
View File
@@ -212,56 +212,49 @@ func gio_onFrameCallback(dl C.CFTypeRef) {
}
}
var macosCursorID = [...]byte{
pointer.CursorDefault: 0,
pointer.CursorNone: 1,
pointer.CursorText: 2,
pointer.CursorVerticalText: 3,
pointer.CursorPointer: 4,
pointer.CursorCrosshair: 5,
pointer.CursorAllScroll: 6,
pointer.CursorColResize: 7,
pointer.CursorRowResize: 8,
pointer.CursorGrab: 9,
pointer.CursorGrabbing: 10,
pointer.CursorNotAllowed: 11,
pointer.CursorWait: 12,
pointer.CursorProgress: 13,
pointer.CursorNorthWestResize: 14,
pointer.CursorNorthEastResize: 15,
pointer.CursorSouthWestResize: 16,
pointer.CursorSouthEastResize: 17,
pointer.CursorNorthSouthResize: 18,
pointer.CursorEastWestResize: 19,
pointer.CursorWestResize: 20,
pointer.CursorEastResize: 21,
pointer.CursorNorthResize: 22,
pointer.CursorSouthResize: 23,
pointer.CursorNorthEastSouthWestResize: 24,
pointer.CursorNorthWestSouthEastResize: 25,
}
// windowSetCursor updates the cursor from the current one to a new one
// and returns the new one.
func windowSetCursor(from, to pointer.CursorName) pointer.CursorName {
if from == to {
return to
}
var curID int
switch to {
default:
to = pointer.CursorDefault
fallthrough
case pointer.CursorDefault:
curID = 1
case pointer.CursorText:
curID = 2
case pointer.CursorPointer:
curID = 3
case pointer.CursorCrossHair:
curID = 4
case pointer.CursorColResize:
curID = 5
case pointer.CursorRowResize:
curID = 6
case pointer.CursorGrab:
curID = 7
case pointer.CursorTopLeftResize:
curID = 8
case pointer.CursorTopRightResize:
curID = 9
case pointer.CursorBottomLeftResize:
curID = 10
case pointer.CursorBottomRightResize:
curID = 11
case pointer.CursorLeftResize:
curID = 12
case pointer.CursorRightResize:
curID = 13
case pointer.CursorTopResize:
curID = 14
case pointer.CursorBottomResize:
curID = 15
case pointer.CursorNone:
if to == pointer.CursorNone {
C.gio_hideCursor()
return to
}
if from == pointer.CursorNone {
C.gio_showCursor()
}
C.gio_setCursor(C.NSUInteger(curID))
C.gio_setCursor(C.NSUInteger(macosCursorID[to]))
return to
}
+30 -1
View File
@@ -545,9 +545,38 @@ func (w *window) Perform(system.Action) {}
func (w *window) Raise() {}
var webCursor = [...]string{
pointer.CursorDefault: "default",
pointer.CursorNone: "none",
pointer.CursorText: "text",
pointer.CursorVerticalText: "vertical-text",
pointer.CursorPointer: "pointer",
pointer.CursorCrosshair: "crosshair",
pointer.CursorAllScroll: "all-scroll",
pointer.CursorColResize: "col-resize",
pointer.CursorRowResize: "row-resize",
pointer.CursorGrab: "grab",
pointer.CursorGrabbing: "grabbing",
pointer.CursorNotAllowed: "not-allowed",
pointer.CursorWait: "wait",
pointer.CursorProgress: "progress",
pointer.CursorNorthWestResize: "nw-resize",
pointer.CursorNorthEastResize: "ne-resize",
pointer.CursorSouthWestResize: "sw-resize",
pointer.CursorSouthEastResize: "se-resize",
pointer.CursorNorthSouthResize: "ns-resize",
pointer.CursorEastWestResize: "ew-resize",
pointer.CursorWestResize: "w-resize",
pointer.CursorEastResize: "e-resize",
pointer.CursorNorthResize: "n-resize",
pointer.CursorSouthResize: "s-resize",
pointer.CursorNorthEastSouthWestResize: "nesw-resize",
pointer.CursorNorthWestSouthEastResize: "nwse-resize",
}
func (w *window) SetCursor(name pointer.CursorName) {
style := w.cnv.Get("style")
style.Set("cursor", string(name))
style.Set("cursor", webCursor[name])
}
func (w *window) Wakeup() {
+50 -15
View File
@@ -248,51 +248,86 @@ void gio_trySetPrivateCursor(SEL cursorName, NSCursor* fallback) {
void gio_setCursor(NSUInteger curID) {
@autoreleasepool {
switch (curID) {
case 1: // pointer.CursorDefault
case 0: // pointer.CursorDefault
[NSCursor.arrowCursor set];
break;
// case 1: // pointer.CursorNone
case 2: // pointer.CursorText
[NSCursor.IBeamCursor set];
break;
case 3: // pointer.CursorPointer
case 3: // pointer.CursorVerticalText
[NSCursor.IBeamCursorForVerticalLayout set];
break;
case 4: // pointer.CursorPointer
[NSCursor.pointingHandCursor set];
break;
case 4: // pointer.CursorCrossHair
case 5: // pointer.CursorCrosshair
[NSCursor.crosshairCursor set];
break;
case 5: // pointer.CursorColResize
case 6: // pointer.CursorAllScroll
// For some reason, using _moveCursor fails on Monterey.
// gio_trySetPrivateCursor(@selector(_moveCursor), NSCursor.arrowCursor);
[NSCursor.arrowCursor set];
break;
case 7: // pointer.CursorColResize
[NSCursor.resizeLeftRightCursor set];
break;
case 6: // pointer.CursorRowResize
case 8: // pointer.CursorRowResize
[NSCursor.resizeUpDownCursor set];
break;
case 7: // pointer.CursorGrab
[NSCursor.openHandCursor set];
case 9: // pointer.CursorGrab
// [NSCursor.openHandCursor set];
gio_trySetPrivateCursor(@selector(openHandCursor), NSCursor.arrowCursor);
break;
case 8: // pointer.CursorTopLeftResize
case 10: // pointer.CursorGrabbing
// [NSCursor.closedHandCursor set];
gio_trySetPrivateCursor(@selector(closedHandCursor), NSCursor.arrowCursor);
break;
case 11: // pointer.CursorNotAllowed
[NSCursor.operationNotAllowedCursor set];
break;
case 12: // pointer.CursorWait
gio_trySetPrivateCursor(@selector(busyButClickableCursor), NSCursor.arrowCursor);
break;
case 13: // pointer.CursorProgress
gio_trySetPrivateCursor(@selector(busyButClickableCursor), NSCursor.arrowCursor);
break;
case 14: // pointer.CursorNorthWestResize
gio_trySetPrivateCursor(@selector(_windowResizeNorthWestCursor), NSCursor.resizeUpDownCursor);
break;
case 9: // pointer.CursorTopRightResize
case 15: // pointer.CursorNorthEastResize
gio_trySetPrivateCursor(@selector(_windowResizeNorthEastCursor), NSCursor.resizeUpDownCursor);
break;
case 10: // pointer.CursorBottomLeftResize
case 16: // pointer.CursorSouthWestResize
gio_trySetPrivateCursor(@selector(_windowResizeSouthWestCursor), NSCursor.resizeUpDownCursor);
break;
case 11: // pointer.CursorBottomRightResize
case 17: // pointer.CursorSouthEastResize
gio_trySetPrivateCursor(@selector(_windowResizeSouthEastCursor), NSCursor.resizeUpDownCursor);
break;
case 12: // pointer.CursorLeftResize
case 18: // pointer.CursorNorthSouthResize
[NSCursor.resizeUpDownCursor set];
break;
case 19: // pointer.CursorEastWestResize
[NSCursor.resizeLeftRightCursor set];
break;
case 20: // pointer.CursorWestResize
[NSCursor.resizeLeftCursor set];
break;
case 13: // pointer.CursorRightResize
case 21: // pointer.CursorEastResize
[NSCursor.resizeRightCursor set];
break;
case 14: // pointer.CursorTopResize
case 22: // pointer.CursorNorthResize
[NSCursor.resizeUpCursor set];
break;
case 15: // pointer.CursorBottomResize
case 23: // pointer.CursorSouthResize
[NSCursor.resizeDownCursor set];
break;
case 24: // pointer.CursorNorthEastSouthWestResize
gio_trySetPrivateCursor(@selector(_windowResizeNorthEastSouthWestCursor), NSCursor.resizeUpDownCursor);
break;
case 25: // pointer.CursorNorthWestSouthEastResize
gio_trySetPrivateCursor(@selector(_windowResizeNorthWestSouthEastCursor), NSCursor.resizeUpDownCursor);
break;
default:
[NSCursor.arrowCursor set];
break;
+32
View File
@@ -8,6 +8,8 @@ package app
import (
"errors"
"unsafe"
"gioui.org/io/pointer"
)
// ViewEvent provides handles to the underlying window objects for the
@@ -66,3 +68,33 @@ func newWindow(window *callbacks, options []Option) error {
}
return errors.New("app: no window driver available")
}
// xCursor contains mapping from pointer.CursorName to XCursor.
var xCursor = [...]string{
pointer.CursorDefault: "left_ptr",
pointer.CursorNone: "",
pointer.CursorText: "xterm",
pointer.CursorVerticalText: "vertical-text",
pointer.CursorPointer: "hand2",
pointer.CursorCrosshair: "crosshair",
pointer.CursorAllScroll: "fleur",
pointer.CursorColResize: "sb_h_double_arrow",
pointer.CursorRowResize: "sb_v_double_arrow",
pointer.CursorGrab: "hand1",
pointer.CursorGrabbing: "move",
pointer.CursorNotAllowed: "crossed_circle",
pointer.CursorWait: "watch",
pointer.CursorProgress: "left_ptr_watch",
pointer.CursorNorthWestResize: "top_left_corner",
pointer.CursorNorthEastResize: "top_right_corner",
pointer.CursorSouthWestResize: "bottom_left_corner",
pointer.CursorSouthEastResize: "bottom_right_corner",
pointer.CursorNorthSouthResize: "sb_v_double_arrow",
pointer.CursorEastWestResize: "sb_h_double_arrow",
pointer.CursorWestResize: "left_side",
pointer.CursorEastResize: "right_side",
pointer.CursorNorthResize: "top_side",
pointer.CursorSouthResize: "bottom_side",
pointer.CursorNorthEastSouthWestResize: "fd_double_arrow",
pointer.CursorNorthWestSouthEastResize: "bd_double_arrow",
}
+3 -35
View File
@@ -1095,41 +1095,9 @@ func (w *window) SetCursor(name pointer.CursorName) {
C.wl_pointer_set_cursor(ptr, w.serial, nil, 0, 0)
return
}
switch name {
default:
fallthrough
case pointer.CursorDefault:
name = "left_ptr"
case pointer.CursorText:
name = "xterm"
case pointer.CursorPointer:
name = "hand1"
case pointer.CursorCrossHair:
name = "crosshair"
case pointer.CursorRowResize:
name = "top_side"
case pointer.CursorColResize:
name = "left_side"
case pointer.CursorGrab:
name = "hand1"
case pointer.CursorTopLeftResize:
name = "top_left_corner"
case pointer.CursorTopRightResize:
name = "top_right_corner"
case pointer.CursorBottomLeftResize:
name = "bottom_left_corner"
case pointer.CursorBottomRightResize:
name = "bottom_right_corner"
case pointer.CursorLeftResize:
name = "right_side"
case pointer.CursorRightResize:
name = "left_side"
case pointer.CursorTopResize:
name = "top_side"
case pointer.CursorBottomResize:
name = "bottom_side"
}
cname := C.CString(string(name))
xcursor := xCursor[name]
cname := C.CString(xcursor)
defer C.free(unsafe.Pointer(cname))
c := C.wl_cursor_theme_get_cursor(w.cursor.theme, cname)
if c == nil {
+32 -32
View File
@@ -715,45 +715,45 @@ func (w *window) SetCursor(name pointer.CursorName) {
}
}
// windowsCursor contains mapping from CursorName to an IDC.
var windowsCursor = [...]uint16{
pointer.CursorDefault: windows.IDC_ARROW,
pointer.CursorNone: 0,
pointer.CursorText: windows.IDC_IBEAM,
pointer.CursorVerticalText: windows.IDC_IBEAM,
pointer.CursorPointer: windows.IDC_HAND,
pointer.CursorCrosshair: windows.IDC_CROSS,
pointer.CursorAllScroll: windows.IDC_SIZEALL,
pointer.CursorColResize: windows.IDC_SIZEWE,
pointer.CursorRowResize: windows.IDC_SIZENS,
pointer.CursorGrab: windows.IDC_SIZEALL,
pointer.CursorGrabbing: windows.IDC_SIZEALL,
pointer.CursorNotAllowed: windows.IDC_NO,
pointer.CursorWait: windows.IDC_WAIT,
pointer.CursorProgress: windows.IDC_APPSTARTING,
pointer.CursorNorthWestResize: windows.IDC_SIZENWSE,
pointer.CursorNorthEastResize: windows.IDC_SIZENESW,
pointer.CursorSouthWestResize: windows.IDC_SIZENESW,
pointer.CursorSouthEastResize: windows.IDC_SIZENWSE,
pointer.CursorNorthSouthResize: windows.IDC_SIZENS,
pointer.CursorEastWestResize: windows.IDC_SIZEWE,
pointer.CursorWestResize: windows.IDC_SIZEWE,
pointer.CursorEastResize: windows.IDC_SIZEWE,
pointer.CursorNorthResize: windows.IDC_SIZENS,
pointer.CursorSouthResize: windows.IDC_SIZENS,
pointer.CursorNorthEastSouthWestResize: windows.IDC_SIZENESW,
pointer.CursorNorthWestSouthEastResize: windows.IDC_SIZENWSE,
}
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.CursorGrab:
curID = windows.IDC_SIZEALL
case pointer.CursorTopLeftResize:
curID = windows.IDC_SIZENWSE
case pointer.CursorTopRightResize:
curID = windows.IDC_SIZENESW
case pointer.CursorBottomLeftResize:
curID = windows.IDC_SIZENESW
case pointer.CursorBottomRightResize:
curID = windows.IDC_SIZENWSE
case pointer.CursorLeftResize:
curID = windows.IDC_SIZEWE
case pointer.CursorRightResize:
curID = windows.IDC_SIZEWE
case pointer.CursorTopResize:
curID = windows.IDC_SIZENS
case pointer.CursorBottomResize:
curID = windows.IDC_SIZENS
case pointer.CursorNone:
return 0, nil
default:
return windows.LoadCursor(windowsCursor[name])
}
return windows.LoadCursor(curID)
}
func (w *window) ShowTextInput(show bool) {}
+4 -8
View File
@@ -296,18 +296,14 @@ func (w *x11Window) Raise() {
}
func (w *x11Window) SetCursor(name pointer.CursorName) {
switch name {
case pointer.CursorNone:
if name == pointer.CursorNone {
w.cursor = name
C.XFixesHideCursor(w.x, w.xw)
return
case pointer.CursorGrab:
name = "hand1"
}
if w.cursor == pointer.CursorNone {
C.XFixesShowCursor(w.x, w.xw)
}
cname := C.CString(string(name))
xcursor := xCursor[name]
cname := C.CString(xcursor)
defer C.free(unsafe.Pointer(cname))
c := C.XcursorLibraryLoadCursor(w.x, cname)
if c == 0 {