mirror of
https://github.com/hajimehoshi/ebiten.git
synced 2024-12-26 03:38:55 +01:00
parent
be771268ed
commit
5dc293fe4f
4
go.mod
4
go.mod
@ -3,8 +3,8 @@ module github.com/hajimehoshi/ebiten/v2
|
|||||||
go 1.18
|
go 1.18
|
||||||
|
|
||||||
require (
|
require (
|
||||||
github.com/ebitengine/oto/v3 v3.1.0-alpha.2.0.20230907160415-270e2cbf1b2a
|
github.com/ebitengine/oto/v3 v3.1.0-alpha.2.0.20230909164631-3369785c90ea
|
||||||
github.com/ebitengine/purego v0.5.0-alpha.2
|
github.com/ebitengine/purego v0.5.0-alpha.2.0.20230909154830-63192295690d
|
||||||
github.com/go-text/typesetting v0.0.0-20230905121921-abdbcca6e0eb
|
github.com/go-text/typesetting v0.0.0-20230905121921-abdbcca6e0eb
|
||||||
github.com/hajimehoshi/bitmapfont/v3 v3.0.0
|
github.com/hajimehoshi/bitmapfont/v3 v3.0.0
|
||||||
github.com/hajimehoshi/go-mp3 v0.3.4
|
github.com/hajimehoshi/go-mp3 v0.3.4
|
||||||
|
8
go.sum
8
go.sum
@ -1,7 +1,7 @@
|
|||||||
github.com/ebitengine/oto/v3 v3.1.0-alpha.2.0.20230907160415-270e2cbf1b2a h1:Oagu27Kc7g00dvG0Hv89cgJG5ZvY6tDJL0KnIEyeISs=
|
github.com/ebitengine/oto/v3 v3.1.0-alpha.2.0.20230909164631-3369785c90ea h1:KM0GTGD2heyFImodvmPjJyxkXadH7agMpAkPukYp2tk=
|
||||||
github.com/ebitengine/oto/v3 v3.1.0-alpha.2.0.20230907160415-270e2cbf1b2a/go.mod h1:33ZrprO86svDJzUiIGDPMY47Nn0iquc7CVzjNZ5X7XY=
|
github.com/ebitengine/oto/v3 v3.1.0-alpha.2.0.20230909164631-3369785c90ea/go.mod h1:ofLbkwlSk+3/3OiYtDXBSf8SDPKVxXxRtA47yu4j6AY=
|
||||||
github.com/ebitengine/purego v0.5.0-alpha.2 h1:LKY/juINoHspp9sRqRAmIw1VoaHaPqD8KbKgbYAECCE=
|
github.com/ebitengine/purego v0.5.0-alpha.2.0.20230909154830-63192295690d h1:N+CZYJ1d76GVNdM14ToK7Plieyn4AZI6/qhmFiFFUx0=
|
||||||
github.com/ebitengine/purego v0.5.0-alpha.2/go.mod h1:ah1In8AOtksoNK6yk5z1HTJeUkC1Ez4Wk2idgGslMwQ=
|
github.com/ebitengine/purego v0.5.0-alpha.2.0.20230909154830-63192295690d/go.mod h1:ah1In8AOtksoNK6yk5z1HTJeUkC1Ez4Wk2idgGslMwQ=
|
||||||
github.com/go-text/typesetting v0.0.0-20230905121921-abdbcca6e0eb h1:4GpJirtA8yY24aqbU3uppiXGYiVpWfLIrqc2NNKKk9s=
|
github.com/go-text/typesetting v0.0.0-20230905121921-abdbcca6e0eb h1:4GpJirtA8yY24aqbU3uppiXGYiVpWfLIrqc2NNKKk9s=
|
||||||
github.com/go-text/typesetting v0.0.0-20230905121921-abdbcca6e0eb/go.mod h1:evDBbvNR/KaVFZ2ZlDSOWWXIUKq0wCOEtzLxRM8SG3k=
|
github.com/go-text/typesetting v0.0.0-20230905121921-abdbcca6e0eb/go.mod h1:evDBbvNR/KaVFZ2ZlDSOWWXIUKq0wCOEtzLxRM8SG3k=
|
||||||
github.com/go-text/typesetting-utils v0.0.0-20230616150549-2a7df14b6a22 h1:LBQTFxP2MfsyEDqSKmUBZaDuDHN1vpqDyOZjcqS7MYI=
|
github.com/go-text/typesetting-utils v0.0.0-20230616150549-2a7df14b6a22 h1:LBQTFxP2MfsyEDqSKmUBZaDuDHN1vpqDyOZjcqS7MYI=
|
||||||
|
@ -18,6 +18,7 @@ package ui
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"reflect"
|
||||||
"unsafe"
|
"unsafe"
|
||||||
|
|
||||||
"github.com/ebitengine/purego/objc"
|
"github.com/ebitengine/purego/objc"
|
||||||
@ -29,129 +30,122 @@ import (
|
|||||||
"github.com/hajimehoshi/ebiten/v2/internal/graphicsdriver/opengl"
|
"github.com/hajimehoshi/ebiten/v2/internal/graphicsdriver/opengl"
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var class_EbitengineWindowDelegate objc.Class
|
||||||
class_EbitengineWindowDelegate objc.Class
|
|
||||||
)
|
|
||||||
|
|
||||||
type windowDelegate struct {
|
|
||||||
isa objc.Class `objc:"EbitengineWindowDelegate : NSObject <NSWindowDelegate>"`
|
|
||||||
origDelegate objc.ID
|
|
||||||
origResizable bool
|
|
||||||
}
|
|
||||||
|
|
||||||
func (w *windowDelegate) pushResizableState(win objc.ID) {
|
|
||||||
window := cocoa.NSWindow{ID: win}
|
|
||||||
w.origResizable = window.StyleMask()&cocoa.NSWindowStyleMaskResizable != 0
|
|
||||||
if !w.origResizable {
|
|
||||||
window.SetStyleMask(window.StyleMask() | cocoa.NSWindowStyleMaskResizable)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (w *windowDelegate) popResizableState(win objc.ID) {
|
|
||||||
if !w.origResizable {
|
|
||||||
window := cocoa.NSWindow{ID: win}
|
|
||||||
window.SetStyleMask(window.StyleMask() & ^uint(cocoa.NSWindowStyleMaskResizable))
|
|
||||||
}
|
|
||||||
w.origResizable = false
|
|
||||||
}
|
|
||||||
|
|
||||||
func (w *windowDelegate) InitWithOrigDelegate(cmd objc.SEL, origDelegate objc.ID) objc.ID {
|
|
||||||
self := objc.ID(unsafe.Pointer(w)).SendSuper(sel_init)
|
|
||||||
if self != 0 {
|
|
||||||
w = *(**windowDelegate)(unsafe.Pointer(&self))
|
|
||||||
w.origDelegate = origDelegate
|
|
||||||
}
|
|
||||||
return self
|
|
||||||
}
|
|
||||||
|
|
||||||
// The method set of origDelegate must sync with GLFWWindowDelegate's implementation.
|
|
||||||
// See cocoa_window.m in GLFW.
|
|
||||||
|
|
||||||
func (w *windowDelegate) WindowShouldClose(cmd objc.SEL, notification objc.ID) bool {
|
|
||||||
return w.origDelegate.Send(cmd, notification) != 0
|
|
||||||
}
|
|
||||||
|
|
||||||
func (w *windowDelegate) WindowDidResize(cmd objc.SEL, notification objc.ID) {
|
|
||||||
w.origDelegate.Send(cmd, notification)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (w *windowDelegate) WindowDidMove(cmd objc.SEL, notification objc.ID) {
|
|
||||||
w.origDelegate.Send(cmd, notification)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (w *windowDelegate) WindowDidMiniaturize(cmd objc.SEL, notification objc.ID) {
|
|
||||||
w.origDelegate.Send(cmd, notification)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (w *windowDelegate) WindowDidDeminiaturize(cmd objc.SEL, notification objc.ID) {
|
|
||||||
w.origDelegate.Send(cmd, notification)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (w *windowDelegate) WindowDidBecomeKey(cmd objc.SEL, notification objc.ID) {
|
|
||||||
w.origDelegate.Send(cmd, notification)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (w *windowDelegate) WindowDidResignKey(cmd objc.SEL, notification objc.ID) {
|
|
||||||
w.origDelegate.Send(cmd, notification)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (w *windowDelegate) WindowDidChangeOcclusionState(cmd objc.SEL, notification objc.ID) {
|
|
||||||
w.origDelegate.Send(cmd, notification)
|
|
||||||
}
|
|
||||||
|
|
||||||
func (w *windowDelegate) WindowWillEnterFullScreen(cmd objc.SEL, notification objc.ID) {
|
|
||||||
w.pushResizableState(cocoa.NSNotification{ID: notification}.Object())
|
|
||||||
}
|
|
||||||
|
|
||||||
func (w *windowDelegate) WindowDidEnterFullScreen(cmd objc.SEL, notification objc.ID) {
|
|
||||||
w.popResizableState(cocoa.NSNotification{ID: notification}.Object())
|
|
||||||
}
|
|
||||||
|
|
||||||
func (w *windowDelegate) WindowWillExitFullScreen(cmd objc.SEL, notification objc.ID) {
|
|
||||||
w.pushResizableState(cocoa.NSNotification{ID: notification}.Object())
|
|
||||||
}
|
|
||||||
|
|
||||||
func (w *windowDelegate) WindowDidExitFullScreen(cmd objc.SEL, notification objc.ID) {
|
|
||||||
w.popResizableState(cocoa.NSNotification{ID: notification}.Object())
|
|
||||||
// Do not call setFrame here (#2295). setFrame here causes unexpected results.
|
|
||||||
}
|
|
||||||
|
|
||||||
func (w *windowDelegate) Selector(cmd string) objc.SEL {
|
|
||||||
switch cmd {
|
|
||||||
case "InitWithOrigDelegate":
|
|
||||||
return sel_initWithOrigDelegate
|
|
||||||
case "WindowShouldClose":
|
|
||||||
return sel_windowShouldClose
|
|
||||||
case "WindowDidResize":
|
|
||||||
return sel_windowDidResize
|
|
||||||
case "WindowDidMove":
|
|
||||||
return sel_windowDidMove
|
|
||||||
case "WindowDidMiniaturize":
|
|
||||||
return sel_windowDidMiniaturize
|
|
||||||
case "WindowDidDeminiaturize":
|
|
||||||
return sel_windowDidDeminiaturize
|
|
||||||
case "WindowDidBecomeKey":
|
|
||||||
return sel_windowDidBecomeKey
|
|
||||||
case "WindowDidResignKey":
|
|
||||||
return sel_windowDidResignKey
|
|
||||||
case "WindowDidChangeOcclusionState":
|
|
||||||
return sel_windowDidChangeOcclusionState
|
|
||||||
case "WindowWillEnterFullScreen":
|
|
||||||
return sel_windowWillEnterFullScreen
|
|
||||||
case "WindowDidEnterFullScreen":
|
|
||||||
return sel_windowDidEnterFullScreen
|
|
||||||
case "WindowWillExitFullScreen":
|
|
||||||
return sel_windowWillExitFullScreen
|
|
||||||
case "WindowDidExitFullScreen":
|
|
||||||
return sel_windowDidExitFullScreen
|
|
||||||
default:
|
|
||||||
return 0
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
var err error
|
var err error
|
||||||
class_EbitengineWindowDelegate, err = objc.RegisterClass(&windowDelegate{})
|
pushResizableState := func(id, win objc.ID) {
|
||||||
|
window := cocoa.NSWindow{ID: win}
|
||||||
|
id.Send(sel_setOrigResizable, window.StyleMask()&cocoa.NSWindowStyleMaskResizable != 0)
|
||||||
|
if !objc.Send[bool](id, sel_origResizable) {
|
||||||
|
window.SetStyleMask(window.StyleMask() | cocoa.NSWindowStyleMaskResizable)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
popResizableState := func(id, win objc.ID) {
|
||||||
|
if !objc.Send[bool](id, sel_origResizable) {
|
||||||
|
window := cocoa.NSWindow{ID: win}
|
||||||
|
window.SetStyleMask(window.StyleMask() & ^uint(cocoa.NSWindowStyleMaskResizable))
|
||||||
|
}
|
||||||
|
id.Send(sel_setOrigResizable, false)
|
||||||
|
}
|
||||||
|
class_EbitengineWindowDelegate, err = objc.RegisterClass(
|
||||||
|
"EbitengineWindowDelegate",
|
||||||
|
objc.GetClass("NSObject"),
|
||||||
|
[]*objc.Protocol{objc.GetProtocol("NSWindowDelegate")},
|
||||||
|
[]objc.FieldDef{
|
||||||
|
{
|
||||||
|
Name: "origDelegate",
|
||||||
|
Type: reflect.TypeOf(objc.ID(0)),
|
||||||
|
Attribute: objc.ReadWrite,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Name: "origResizable",
|
||||||
|
Type: reflect.TypeOf(true),
|
||||||
|
Attribute: objc.ReadWrite,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
[]objc.MethodDef{
|
||||||
|
{
|
||||||
|
Cmd: sel_initWithOrigDelegate,
|
||||||
|
Fn: func(id objc.ID, cmd objc.SEL, origDelegate objc.ID) objc.ID {
|
||||||
|
self := id.SendSuper(sel_init)
|
||||||
|
if self != 0 {
|
||||||
|
id.Send(sel_setOrigDelegate, origDelegate)
|
||||||
|
}
|
||||||
|
return self
|
||||||
|
},
|
||||||
|
},
|
||||||
|
// The method set of origDelegate must sync with GLFWWindowDelegate's implementation.
|
||||||
|
// See cocoa_window.m in GLFW.
|
||||||
|
{
|
||||||
|
Cmd: sel_windowShouldClose,
|
||||||
|
Fn: func(id objc.ID, cmd objc.SEL, notification objc.ID) bool {
|
||||||
|
return id.Send(sel_origDelegate).Send(cmd, notification) != 0
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Cmd: sel_windowDidResize,
|
||||||
|
Fn: func(id objc.ID, cmd objc.SEL, notification objc.ID) {
|
||||||
|
id.Send(sel_origDelegate).Send(cmd, notification)
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Cmd: sel_windowDidMove,
|
||||||
|
Fn: func(id objc.ID, cmd objc.SEL, notification objc.ID) {
|
||||||
|
id.Send(sel_origDelegate).Send(cmd, notification)
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Cmd: sel_windowDidMiniaturize,
|
||||||
|
Fn: func(id objc.ID, cmd objc.SEL, notification objc.ID) {
|
||||||
|
id.Send(sel_origDelegate).Send(cmd, notification)
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Cmd: sel_windowDidBecomeKey,
|
||||||
|
Fn: func(id objc.ID, cmd objc.SEL, notification objc.ID) {
|
||||||
|
id.Send(sel_origDelegate).Send(cmd, notification)
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Cmd: sel_windowDidResignKey,
|
||||||
|
Fn: func(id objc.ID, cmd objc.SEL, notification objc.ID) {
|
||||||
|
id.Send(sel_origDelegate).Send(cmd, notification)
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Cmd: sel_windowDidChangeOcclusionState,
|
||||||
|
Fn: func(id objc.ID, cmd objc.SEL, notification objc.ID) {
|
||||||
|
id.Send(sel_origDelegate).Send(cmd, notification)
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Cmd: sel_windowWillEnterFullScreen,
|
||||||
|
Fn: func(id objc.ID, cmd objc.SEL, notification objc.ID) {
|
||||||
|
pushResizableState(id, cocoa.NSNotification{ID: notification}.Object())
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Cmd: sel_windowDidEnterFullScreen,
|
||||||
|
Fn: func(id objc.ID, cmd objc.SEL, notification objc.ID) {
|
||||||
|
popResizableState(id, cocoa.NSNotification{ID: notification}.Object())
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Cmd: sel_windowWillExitFullScreen,
|
||||||
|
Fn: func(id objc.ID, cmd objc.SEL, notification objc.ID) {
|
||||||
|
pushResizableState(id, cocoa.NSNotification{ID: notification}.Object())
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
Cmd: sel_windowDidExitFullScreen,
|
||||||
|
Fn: func(id objc.ID, cmd objc.SEL, notification objc.ID) {
|
||||||
|
popResizableState(id, cocoa.NSNotification{ID: notification}.Object())
|
||||||
|
// Do not call setFrame here (#2295). setFrame here causes unexpected results.
|
||||||
|
},
|
||||||
|
},
|
||||||
|
},
|
||||||
|
)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
@ -218,14 +212,15 @@ var (
|
|||||||
|
|
||||||
var (
|
var (
|
||||||
sel_alloc = objc.RegisterName("alloc")
|
sel_alloc = objc.RegisterName("alloc")
|
||||||
sel_class = objc.RegisterName("class")
|
|
||||||
sel_collectionBehavior = objc.RegisterName("collectionBehavior")
|
sel_collectionBehavior = objc.RegisterName("collectionBehavior")
|
||||||
sel_delegate = objc.RegisterName("delegate")
|
sel_delegate = objc.RegisterName("delegate")
|
||||||
sel_init = objc.RegisterName("init")
|
sel_init = objc.RegisterName("init")
|
||||||
sel_initWithOrigDelegate = objc.RegisterName("initWithOrigDelegate:")
|
sel_initWithOrigDelegate = objc.RegisterName("initWithOrigDelegate:")
|
||||||
sel_mouseLocation = objc.RegisterName("mouseLocation")
|
sel_mouseLocation = objc.RegisterName("mouseLocation")
|
||||||
sel_performSelector = objc.RegisterName("performSelector:")
|
sel_origDelegate = objc.RegisterName("origDelegate")
|
||||||
sel_set = objc.RegisterName("set")
|
sel_setOrigDelegate = objc.RegisterName("setOrigDelegate:")
|
||||||
|
sel_origResizable = objc.RegisterName("isOrigResizable")
|
||||||
|
sel_setOrigResizable = objc.RegisterName("setOrigResizable:")
|
||||||
sel_setCollectionBehavior = objc.RegisterName("setCollectionBehavior:")
|
sel_setCollectionBehavior = objc.RegisterName("setCollectionBehavior:")
|
||||||
sel_setDelegate = objc.RegisterName("setDelegate:")
|
sel_setDelegate = objc.RegisterName("setDelegate:")
|
||||||
sel_toggleFullScreen = objc.RegisterName("toggleFullScreen:")
|
sel_toggleFullScreen = objc.RegisterName("toggleFullScreen:")
|
||||||
|
Loading…
Reference in New Issue
Block a user