-
Notifications
You must be signed in to change notification settings - Fork 22
/
backend.go
93 lines (77 loc) · 2.11 KB
/
backend.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
package wlroots
/*
* This an unstable interface of wlroots. No guarantees are made regarding the
* future consistency of this API.
*/
import (
"errors"
"unsafe"
)
// #cgo pkg-config: wlroots wayland-server
// #cgo CFLAGS: -D_GNU_SOURCE -DWLR_USE_UNSTABLE
// #include <wlr/backend.h>
// #include <wlr/render/allocator.h>
// #include <wlr/render/wlr_renderer.h>
import "C"
type Backend struct {
p *C.struct_wlr_backend
}
func (b Backend) Destroy() {
C.wlr_backend_destroy(b.p)
}
func (b Backend) OnDestroy(cb func(Backend)) {
man.add(unsafe.Pointer(b.p), &b.p.events.destroy, func(unsafe.Pointer) {
cb(b)
})
}
func (b Backend) Start() error {
if !C.wlr_backend_start(b.p) {
return errors.New("can't start backend")
}
return nil
}
func (b Backend) OnNewOutput(cb func(Output)) {
man.add(unsafe.Pointer(b.p), &b.p.events.new_output, func(data unsafe.Pointer) {
output := wrapOutput(data)
man.track(unsafe.Pointer(output.p), &output.p.events.destroy)
cb(output)
})
}
func (b Backend) OnNewInput(cb func(InputDevice)) {
man.add(unsafe.Pointer(b.p), &b.p.events.new_input, func(data unsafe.Pointer) {
dev := wrapInputDevice(data)
man.add(unsafe.Pointer(dev.p), &dev.p.events.destroy, func(data unsafe.Pointer) {
// delete the wlr_input_device
man.delete(unsafe.Pointer(dev.p))
})
cb(dev)
})
}
func (b Backend) AllocatorAutocreate(r Renderer) (Allocator, error) {
p := C.wlr_allocator_autocreate(b.p, r.p)
if p == nil {
return Allocator{}, errors.New("failed to wlr_allocator")
}
man.track(unsafe.Pointer(p), &p.events.destroy)
return Allocator{p: p}, nil
}
func (b Backend) NewAllocator(r Renderer) (Allocator, error) {
return b.AllocatorAutocreate(r)
}
func (b Backend) RendererAutoCreate() (Renderer, error) {
p := C.wlr_renderer_autocreate(b.p)
if p == nil {
return Renderer{}, errors.New("failed to create wlr_renderer")
}
man.track(unsafe.Pointer(p), &p.events.destroy)
return Renderer{p: p}, nil
}
func (b Backend) NewRenderer() (Renderer, error) {
return b.RendererAutoCreate()
}
type Allocator struct {
p *C.struct_wlr_allocator
}
func (s Allocator) Nil() bool {
return s.p == nil
}