mirror of
https://git.sr.ht/~eliasnaur/gio
synced 2026-07-01 23:55:39 +00:00
1d4bf04aa1
NSOpenGLContextView couples the window manager logic tightly with OpenGL. Use generic NSViews, and attach NSOpenGLContext just like the other platforms. This change prepares for supporting GPU contexts created by clients as well as a future Metal port. Signed-off-by: Elias Naur <mail@eliasnaur.com>
139 lines
2.7 KiB
Go
139 lines
2.7 KiB
Go
// SPDX-License-Identifier: Unlicense OR MIT
|
|
|
|
// package wm implements platform specific windows
|
|
// and GPU contexts.
|
|
package wm
|
|
|
|
import (
|
|
"errors"
|
|
"image/color"
|
|
|
|
"gioui.org/gpu"
|
|
"gioui.org/io/event"
|
|
"gioui.org/io/pointer"
|
|
"gioui.org/io/system"
|
|
"gioui.org/unit"
|
|
)
|
|
|
|
type Size struct {
|
|
Width unit.Value
|
|
Height unit.Value
|
|
}
|
|
|
|
type Options struct {
|
|
Size *Size
|
|
MinSize *Size
|
|
MaxSize *Size
|
|
Title *string
|
|
WindowMode *WindowMode
|
|
StatusColor *color.NRGBA
|
|
NavigationColor *color.NRGBA
|
|
Orientation *Orientation
|
|
}
|
|
|
|
type WindowMode uint8
|
|
|
|
const (
|
|
Windowed WindowMode = iota
|
|
Fullscreen
|
|
)
|
|
|
|
type Orientation uint8
|
|
|
|
const (
|
|
AnyOrientation Orientation = iota
|
|
LandscapeOrientation
|
|
PortraitOrientation
|
|
)
|
|
|
|
type FrameEvent struct {
|
|
system.FrameEvent
|
|
|
|
Sync bool
|
|
}
|
|
|
|
type Callbacks interface {
|
|
SetDriver(d Driver)
|
|
Event(e event.Event)
|
|
// Func runs a function during an Event. This is required for platforms
|
|
// that require coordination between the rendering goroutine and the system
|
|
// main thread.
|
|
Func(f func())
|
|
}
|
|
|
|
type Context interface {
|
|
API() gpu.API
|
|
Present() error
|
|
MakeCurrent() error
|
|
Release()
|
|
Lock()
|
|
Unlock()
|
|
}
|
|
|
|
// ErrDeviceLost is returned from Context.Present when
|
|
// the underlying GPU device is gone and should be
|
|
// recreated.
|
|
var ErrDeviceLost = errors.New("GPU device lost")
|
|
|
|
// Driver is the interface for the platform implementation
|
|
// of a window.
|
|
type Driver interface {
|
|
// SetAnimating sets the animation flag. When the window is animating,
|
|
// FrameEvents are delivered as fast as the display can handle them.
|
|
SetAnimating(anim bool)
|
|
// ShowTextInput updates the virtual keyboard state.
|
|
ShowTextInput(show bool)
|
|
NewContext() (Context, error)
|
|
|
|
// ReadClipboard requests the clipboard content.
|
|
ReadClipboard()
|
|
// WriteClipboard requests a clipboard write.
|
|
WriteClipboard(s string)
|
|
|
|
// Option processes option changes.
|
|
Option(opts *Options)
|
|
|
|
// SetCursor updates the current cursor to name.
|
|
SetCursor(name pointer.CursorName)
|
|
|
|
// Close the window.
|
|
Close()
|
|
}
|
|
|
|
type windowRendezvous struct {
|
|
in chan windowAndOptions
|
|
out chan windowAndOptions
|
|
errs chan error
|
|
}
|
|
|
|
type windowAndOptions struct {
|
|
window Callbacks
|
|
opts *Options
|
|
}
|
|
|
|
func newWindowRendezvous() *windowRendezvous {
|
|
wr := &windowRendezvous{
|
|
in: make(chan windowAndOptions),
|
|
out: make(chan windowAndOptions),
|
|
errs: make(chan error),
|
|
}
|
|
go func() {
|
|
var main windowAndOptions
|
|
var out chan windowAndOptions
|
|
for {
|
|
select {
|
|
case w := <-wr.in:
|
|
var err error
|
|
if main.window != nil {
|
|
err = errors.New("multiple windows are not supported")
|
|
}
|
|
wr.errs <- err
|
|
main = w
|
|
out = wr.out
|
|
case out <- main:
|
|
}
|
|
}
|
|
}()
|
|
return wr
|
|
}
|