forked from joejulian/gio
4a1b4c2642
Custom rendering applications need to be prepared to handle empty view events, as an empty view event is sent during window shutdown. However, the current implementation requires applications to write a platform-specific helper function for each supported platform in order to check whether a received view event is empty. This commit provides a safe, convenient, cross-platform method that applications can use to detect this special view event and respond to it. Signed-off-by: Chris Waldon <christopher.waldon.dev@gmail.com>
100 lines
3.1 KiB
Go
100 lines
3.1 KiB
Go
// SPDX-License-Identifier: Unlicense OR MIT
|
|
|
|
//go:build (linux && !android) || freebsd || openbsd
|
|
// +build linux,!android freebsd openbsd
|
|
|
|
package app
|
|
|
|
import (
|
|
"errors"
|
|
"unsafe"
|
|
|
|
"gioui.org/io/pointer"
|
|
)
|
|
|
|
type X11ViewEvent struct {
|
|
// Display is a pointer to the X11 Display created by XOpenDisplay.
|
|
Display unsafe.Pointer
|
|
// Window is the X11 window ID as returned by XCreateWindow.
|
|
Window uintptr
|
|
}
|
|
|
|
func (X11ViewEvent) implementsViewEvent() {}
|
|
func (X11ViewEvent) ImplementsEvent() {}
|
|
func (x X11ViewEvent) Valid() bool {
|
|
return x != (X11ViewEvent{})
|
|
}
|
|
|
|
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 (w WaylandViewEvent) Valid() bool {
|
|
return w != (WaylandViewEvent{})
|
|
}
|
|
|
|
func osMain() {
|
|
select {}
|
|
}
|
|
|
|
type windowDriver func(*callbacks, []Option) error
|
|
|
|
// Instead of creating files with build tags for each combination of wayland +/- x11
|
|
// let each driver initialize these variables with their own version of createWindow.
|
|
var wlDriver, x11Driver windowDriver
|
|
|
|
func newWindow(window *callbacks, options []Option) {
|
|
var errFirst error
|
|
for _, d := range []windowDriver{wlDriver, x11Driver} {
|
|
if d == nil {
|
|
continue
|
|
}
|
|
err := d(window, options)
|
|
if err == nil {
|
|
return
|
|
}
|
|
if errFirst == nil {
|
|
errFirst = err
|
|
}
|
|
}
|
|
if errFirst == nil {
|
|
errFirst = errors.New("app: no window driver available")
|
|
}
|
|
window.ProcessEvent(DestroyEvent{Err: errFirst})
|
|
}
|
|
|
|
// xCursor contains mapping from pointer.Cursor to XCursor.
|
|
var xCursor = [...]string{
|
|
pointer.CursorDefault: "left_ptr",
|
|
pointer.CursorNone: "",
|
|
pointer.CursorText: "xterm",
|
|
pointer.CursorVerticalText: "vertical-text",
|
|
pointer.CursorPointer: "hand2",
|
|
pointer.CursorCrosshair: "crosshair",
|
|
pointer.CursorAllScroll: "fleur",
|
|
pointer.CursorColResize: "sb_h_double_arrow",
|
|
pointer.CursorRowResize: "sb_v_double_arrow",
|
|
pointer.CursorGrab: "hand1",
|
|
pointer.CursorGrabbing: "move",
|
|
pointer.CursorNotAllowed: "crossed_circle",
|
|
pointer.CursorWait: "watch",
|
|
pointer.CursorProgress: "left_ptr_watch",
|
|
pointer.CursorNorthWestResize: "top_left_corner",
|
|
pointer.CursorNorthEastResize: "top_right_corner",
|
|
pointer.CursorSouthWestResize: "bottom_left_corner",
|
|
pointer.CursorSouthEastResize: "bottom_right_corner",
|
|
pointer.CursorNorthSouthResize: "sb_v_double_arrow",
|
|
pointer.CursorEastWestResize: "sb_h_double_arrow",
|
|
pointer.CursorWestResize: "left_side",
|
|
pointer.CursorEastResize: "right_side",
|
|
pointer.CursorNorthResize: "top_side",
|
|
pointer.CursorSouthResize: "bottom_side",
|
|
pointer.CursorNorthEastSouthWestResize: "fd_double_arrow",
|
|
pointer.CursorNorthWestSouthEastResize: "bd_double_arrow",
|
|
}
|