mirror of
https://git.sr.ht/~eliasnaur/gio
synced 2026-07-07 18:35:34 +00:00
app: [API] refactor app.ViewEvent to support wayland
This commit changes the definition of app.ViewEvent on Unix systems to be an interface implemented by two different concrete types: X11ViewEvent and WaylandViewEvent. Each provides the necessary fields for custom rendering on its display protocol. This is a breaking change for all users of app.ViewEvent on Linux/BSD, as it now is an interface instead of a concrete type. Signed-off-by: Chris Waldon <christopher.waldon.dev@gmail.com>
This commit is contained in:
+21
-3
@@ -10,13 +10,33 @@ import (
|
|||||||
"unsafe"
|
"unsafe"
|
||||||
)
|
)
|
||||||
|
|
||||||
type ViewEvent struct {
|
// ViewEvent provides handles to the underlying window objects for the
|
||||||
|
// current display protocol.
|
||||||
|
type ViewEvent interface {
|
||||||
|
implementsViewEvent()
|
||||||
|
ImplementsEvent()
|
||||||
|
}
|
||||||
|
|
||||||
|
type X11ViewEvent struct {
|
||||||
// Display is a pointer to the X11 Display created by XOpenDisplay.
|
// Display is a pointer to the X11 Display created by XOpenDisplay.
|
||||||
Display unsafe.Pointer
|
Display unsafe.Pointer
|
||||||
// Window is the X11 window ID as returned by XCreateWindow.
|
// Window is the X11 window ID as returned by XCreateWindow.
|
||||||
Window uintptr
|
Window uintptr
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (X11ViewEvent) implementsViewEvent() {}
|
||||||
|
func (X11ViewEvent) ImplementsEvent() {}
|
||||||
|
|
||||||
|
type WaylandViewEvent struct {
|
||||||
|
// Display is the *wl_display returned by wl_display_connect.
|
||||||
|
Display unsafe.Pointer
|
||||||
|
// Surface is the *wl_surface returned by wl_compositor_create_surface.
|
||||||
|
Surface unsafe.Pointer
|
||||||
|
}
|
||||||
|
|
||||||
|
func (WaylandViewEvent) implementsViewEvent() {}
|
||||||
|
func (WaylandViewEvent) ImplementsEvent() {}
|
||||||
|
|
||||||
func osMain() {
|
func osMain() {
|
||||||
select {}
|
select {}
|
||||||
}
|
}
|
||||||
@@ -46,5 +66,3 @@ func newWindow(window *callbacks, options []Option) error {
|
|||||||
}
|
}
|
||||||
return errors.New("app: no window driver available")
|
return errors.New("app: no window driver available")
|
||||||
}
|
}
|
||||||
|
|
||||||
func (_ ViewEvent) ImplementsEvent() {}
|
|
||||||
|
|||||||
+10
-4
@@ -248,12 +248,19 @@ func newWLWindow(callbacks *callbacks, options []Option) error {
|
|||||||
defer w.destroy()
|
defer w.destroy()
|
||||||
|
|
||||||
w.w.SetDriver(w)
|
w.w.SetDriver(w)
|
||||||
|
|
||||||
// Finish and commit setup from createNativeWindow.
|
// Finish and commit setup from createNativeWindow.
|
||||||
w.Configure(options)
|
w.Configure(options)
|
||||||
C.wl_surface_commit(w.surf)
|
C.wl_surface_commit(w.surf)
|
||||||
if err := w.loop(); err != nil {
|
|
||||||
panic(err)
|
w.w.Event(WaylandViewEvent{
|
||||||
}
|
Display: unsafe.Pointer(w.display()),
|
||||||
|
Surface: unsafe.Pointer(w.surf),
|
||||||
|
})
|
||||||
|
defer w.w.Event(WaylandViewEvent{})
|
||||||
|
|
||||||
|
err := w.loop()
|
||||||
|
w.w.Event(system.DestroyEvent{Err: err})
|
||||||
}()
|
}()
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
@@ -1308,7 +1315,6 @@ func (w *window) loop() error {
|
|||||||
default:
|
default:
|
||||||
}
|
}
|
||||||
if w.dead {
|
if w.dead {
|
||||||
w.w.Event(system.DestroyEvent{})
|
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
w.draw()
|
w.draw()
|
||||||
|
|||||||
+2
-2
@@ -813,10 +813,10 @@ func newX11Window(gioWin *callbacks, options []Option) error {
|
|||||||
// make the window visible on the screen
|
// make the window visible on the screen
|
||||||
C.XMapWindow(dpy, win)
|
C.XMapWindow(dpy, win)
|
||||||
w.Configure(options)
|
w.Configure(options)
|
||||||
w.w.Event(ViewEvent{Display: unsafe.Pointer(dpy), Window: uintptr(win)})
|
w.w.Event(X11ViewEvent{Display: unsafe.Pointer(dpy), Window: uintptr(win)})
|
||||||
w.setStage(system.StageRunning)
|
w.setStage(system.StageRunning)
|
||||||
w.loop()
|
w.loop()
|
||||||
w.w.Event(ViewEvent{})
|
w.w.Event(X11ViewEvent{})
|
||||||
w.destroy()
|
w.destroy()
|
||||||
}()
|
}()
|
||||||
return nil
|
return nil
|
||||||
|
|||||||
Reference in New Issue
Block a user