forked from unix-streamdeck/streamdeckd
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathdbus.go
124 lines (109 loc) · 2.9 KB
/
dbus.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
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
package main
import (
"encoding/json"
"errors"
"github.com/godbus/dbus/v5"
"github.com/unix-streamdeck/api"
"github.com/unix-streamdeck/streamdeckd/handlers"
"log"
)
var conn *dbus.Conn
var sDbus *StreamDeckDBus
var sDInfo []api.StreamDeckInfo
type StreamDeckDBus struct {
}
func (s StreamDeckDBus) GetDeckInfo() (string, *dbus.Error) {
infoString, err := json.Marshal(sDInfo)
if err != nil {
return "", dbus.MakeFailedError(err)
}
return string(infoString), nil
}
func (StreamDeckDBus) GetConfig() (string, *dbus.Error) {
configString, err := json.Marshal(config)
if err != nil {
return "", dbus.MakeFailedError(err)
}
return string(configString), nil
}
func (StreamDeckDBus) ReloadConfig() *dbus.Error {
err := ReloadConfig()
if err != nil {
return dbus.MakeFailedError(err)
}
return nil
}
func (StreamDeckDBus) SetPage(serial string, page int) *dbus.Error {
for s := range devs {
if devs[s].Deck.Serial == serial {
dev := devs[s]
SetPage(dev, page)
return nil
}
}
return dbus.MakeFailedError(errors.New("Device with Serial: " + serial + " could not be found"))
}
func (StreamDeckDBus) SetConfig(configString string) *dbus.Error {
err := SetConfig(configString)
if err != nil {
return dbus.MakeFailedError(err)
}
return nil
}
func (StreamDeckDBus) CommitConfig() *dbus.Error {
err := SaveConfig()
if err != nil {
return dbus.MakeFailedError(err)
}
return nil
}
func (StreamDeckDBus) GetModules() (string, *dbus.Error) {
var modules []api.Module
for _, module := range handlers.AvailableModules() {
modules = append(modules, api.Module{Name: module.Name, IconFields: module.IconFields, KeyFields: module.KeyFields, IsIcon: module.NewIcon != nil, IsKey: module.NewKey != nil})
}
modulesString, err := json.Marshal(modules)
if err != nil {
return "", dbus.MakeFailedError(err)
}
return string(modulesString), nil
}
func (StreamDeckDBus) PressButton(serial string, keyIndex int) *dbus.Error {
dev, ok := devs[serial]
if !ok || !dev.IsOpen{
return dbus.MakeFailedError(errors.New("Can't find connected device: " + serial))
}
HandleInput(dev, &dev.Config[dev.Page][keyIndex], dev.Page)
return nil
}
func InitDBUS() error {
var err error
conn, err = dbus.SessionBus()
if err != nil {
log.Println(err)
return err
}
defer conn.Close()
sDbus = &StreamDeckDBus{}
conn.ExportAll(sDbus, "/com/unixstreamdeck/streamdeckd", "com.unixstreamdeck.streamdeckd")
reply, err := conn.RequestName("com.unixstreamdeck.streamdeckd",
dbus.NameFlagDoNotQueue)
if err != nil {
log.Println(err)
return err
}
if reply != dbus.RequestNameReplyPrimaryOwner {
return errors.New("DBus: Name already taken")
}
select {}
}
func EmitPage(dev *VirtualDev, page int) {
if conn != nil {
conn.Emit("/com/unixstreamdeck/streamdeckd", "com.unixstreamdeck.streamdeckd.Page", dev.Deck.Serial, page)
}
for i := range sDInfo {
if sDInfo[i].Serial == dev.Deck.Serial {
sDInfo[i].Page = page
}
}
}