app,app/internal/wm: create contexts on the main thread

Instead of handing the internal/wm driver a method to run code on the
(blocked) main thread, just run the necessary driver methods on the main
thread.

Signed-off-by: Elias Naur <mail@eliasnaur.com>
This commit is contained in:
Elias Naur
2021-08-12 15:21:37 +02:00
parent 811e2b53e0
commit 23640ec38f
3 changed files with 4 additions and 14 deletions
+1 -5
View File
@@ -40,11 +40,7 @@ func newContext(w *window) (*context, error) {
if ctx == 0 {
return nil, errors.New("gl: failed to create NSOpenGLContext")
}
// [NSOpenGLContext setView] must run on the main thread. Fortunately,
// newContext is only called during a [NSView draw] on the main thread.
w.w.Run(func() {
C.gio_setContextView(ctx, view)
})
C.gio_setContextView(ctx, view)
c := &context{
ctx: ctx,
view: view,
-4
View File
@@ -60,10 +60,6 @@ type FrameEvent struct {
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.
Run(f func())
}
type Context interface {
+3 -5
View File
@@ -145,7 +145,9 @@ func (w *Window) validateAndProcess(driver wm.Driver, frameStart time.Time, size
if w.loop == nil && !w.nocontext {
var err error
if w.ctx == nil {
w.ctx, err = driver.NewContext()
w.driverRun(func(_ wm.Driver) {
w.ctx, err = driver.NewContext()
})
if err != nil {
return err
}
@@ -395,10 +397,6 @@ loop:
}
}
func (c *callbacks) Run(f func()) {
c.w.Run(f)
}
func (w *Window) waitAck() {
// Send a dummy event; when it gets through we
// know the application has processed the previous event.