From dddfb7317b6a504c3eba32a188968cea7c7a0866 Mon Sep 17 00:00:00 2001 From: Hajime Hoshi Date: Tue, 2 Jan 2024 22:22:19 +0900 Subject: [PATCH] internal/cocoa: integrate internal/graphicsdriver/metal/ns and internal/cocoa --- internal/cocoa/api_cocoa_darwin.go | 8 ++ internal/graphicsdriver/metal/ns/ns_darwin.go | 73 ------------------- internal/graphicsdriver/metal/view_macos.go | 8 +- 3 files changed, 13 insertions(+), 76 deletions(-) delete mode 100644 internal/graphicsdriver/metal/ns/ns_darwin.go diff --git a/internal/cocoa/api_cocoa_darwin.go b/internal/cocoa/api_cocoa_darwin.go index 96a32394d..859ac3c36 100644 --- a/internal/cocoa/api_cocoa_darwin.go +++ b/internal/cocoa/api_cocoa_darwin.go @@ -183,6 +183,14 @@ func (v NSView) Frame() NSRect { return rect } +func (v NSView) SetLayer(layer uintptr) { + v.Send(objc.RegisterName("setLayer:"), layer) +} + +func (v NSView) SetWantsLayer(wantsLayer bool) { + v.Send(objc.RegisterName("setWantsLayer:"), wantsLayer) +} + // NSInvocation is being used to call functions that can't be called directly with purego.SyscallN. // See the downsides of that function for what it cannot do. type NSInvocation struct { diff --git a/internal/graphicsdriver/metal/ns/ns_darwin.go b/internal/graphicsdriver/metal/ns/ns_darwin.go deleted file mode 100644 index 1d693fd97..000000000 --- a/internal/graphicsdriver/metal/ns/ns_darwin.go +++ /dev/null @@ -1,73 +0,0 @@ -// Copyright 2018 The Ebiten Authors -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -// Package ns provides access to Apple's AppKit API (https://developer.apple.com/documentation/appkit). -// -// This package is in very early stages of development. -// It's a minimal implementation with scope limited to -// supporting the movingtriangle example. -package ns - -import ( - "github.com/ebitengine/purego/objc" - "github.com/hajimehoshi/ebiten/v2/internal/graphicsdriver/metal/ca" -) - -// Window is a window that an app displays on the screen. -// -// Reference: https://developer.apple.com/documentation/appkit/nswindow. -type Window struct { - window uintptr -} - -// NewWindow returns a Window that wraps an existing NSWindow * pointer. -func NewWindow(window uintptr) Window { - return Window{window} -} - -// ContentView returns the window's content view, the highest accessible View -// in the window's view hierarchy. -// -// Reference: https://developer.apple.com/documentation/appkit/nswindow/1419160-contentview. -func (w Window) ContentView() View { - return View{objc.ID(w.window).Send(objc.RegisterName("contentView"))} -} - -// View is the infrastructure for drawing, printing, and handling events in an app. -// -// Reference: https://developer.apple.com/documentation/appkit/nsview. -type View struct { - view objc.ID -} - -// SetLayer sets v.layer to l. -// -// Reference: https://developer.apple.com/documentation/appkit/nsview/1483298-layer. -func (v View) SetLayer(l ca.Layer) { - v.view.Send(objc.RegisterName("setLayer:"), uintptr(l.Layer())) -} - -// SetWantsLayer sets v.wantsLayer to wantsLayer. -// -// Reference: https://developer.apple.com/documentation/appkit/nsview/1483695-wantslayer. -func (v View) SetWantsLayer(wantsLayer bool) { - v.view.Send(objc.RegisterName("setWantsLayer:"), wantsLayer) -} - -// IsInFullScreenMode returns a boolean value indicating whether the view is in full screen mode. -// -// Reference: https://developer.apple.com/documentation/appkit/nsview/1483337-infullscreenmode. -func (v View) IsInFullScreenMode() bool { - return v.view.Send(objc.RegisterName("isInFullScreenMode")) != 0 -} diff --git a/internal/graphicsdriver/metal/view_macos.go b/internal/graphicsdriver/metal/view_macos.go index d37d8cb86..cb8fa41fc 100644 --- a/internal/graphicsdriver/metal/view_macos.go +++ b/internal/graphicsdriver/metal/view_macos.go @@ -17,8 +17,10 @@ package metal import ( + "github.com/ebitengine/purego/objc" + + "github.com/hajimehoshi/ebiten/v2/internal/cocoa" "github.com/hajimehoshi/ebiten/v2/internal/graphicsdriver/metal/mtl" - "github.com/hajimehoshi/ebiten/v2/internal/graphicsdriver/metal/ns" ) func (v *view) setWindow(window uintptr) { @@ -37,8 +39,8 @@ func (v *view) update() { } // TODO: Should this be called on the main thread? - cocoaWindow := ns.NewWindow(v.window) - cocoaWindow.ContentView().SetLayer(v.ml) + cocoaWindow := cocoa.NSWindow{ID: objc.ID(v.window)} + cocoaWindow.ContentView().SetLayer(uintptr(v.ml.Layer())) cocoaWindow.ContentView().SetWantsLayer(true) v.windowChanged = false }