diff options
Diffstat (limited to 'raveos-hyprland-theme/theme-data/DankMaterialShell/core/internal/server/apppicker')
3 files changed, 107 insertions, 0 deletions
diff --git a/raveos-hyprland-theme/theme-data/DankMaterialShell/core/internal/server/apppicker/handlers.go b/raveos-hyprland-theme/theme-data/DankMaterialShell/core/internal/server/apppicker/handlers.go new file mode 100644 index 0000000..007ab3e --- /dev/null +++ b/raveos-hyprland-theme/theme-data/DankMaterialShell/core/internal/server/apppicker/handlers.go @@ -0,0 +1,51 @@ +package apppicker + +import ( + "net" + + "github.com/AvengeMedia/DankMaterialShell/core/internal/log" + "github.com/AvengeMedia/DankMaterialShell/core/internal/server/models" +) + +func HandleRequest(conn net.Conn, req models.Request, manager *Manager) { + switch req.Method { + case "apppicker.open", "browser.open": + handleOpen(conn, req, manager) + default: + models.RespondError(conn, req.ID, "unknown method") + } +} + +func handleOpen(conn net.Conn, req models.Request, manager *Manager) { + log.Infof("AppPicker: Received %s request with params: %+v", req.Method, req.Params) + + target, ok := models.Get[string](req, "target") + if !ok { + target, ok = models.Get[string](req, "url") + if !ok { + log.Warnf("AppPicker: Invalid target parameter in request") + models.RespondError(conn, req.ID, "invalid target parameter") + return + } + } + + event := OpenEvent{ + Target: target, + RequestType: models.GetOr(req, "requestType", "url"), + MimeType: models.GetOr(req, "mimeType", ""), + } + + if categories, ok := models.Get[[]any](req, "categories"); ok { + event.Categories = make([]string, 0, len(categories)) + for _, cat := range categories { + if catStr, ok := cat.(string); ok { + event.Categories = append(event.Categories, catStr) + } + } + } + + log.Infof("AppPicker: Broadcasting event: %+v", event) + manager.RequestOpen(event) + models.Respond(conn, req.ID, "ok") + log.Infof("AppPicker: Request handled successfully") +} diff --git a/raveos-hyprland-theme/theme-data/DankMaterialShell/core/internal/server/apppicker/manager.go b/raveos-hyprland-theme/theme-data/DankMaterialShell/core/internal/server/apppicker/manager.go new file mode 100644 index 0000000..bde0846 --- /dev/null +++ b/raveos-hyprland-theme/theme-data/DankMaterialShell/core/internal/server/apppicker/manager.go @@ -0,0 +1,48 @@ +package apppicker + +import ( + "sync" + + "github.com/AvengeMedia/DankMaterialShell/core/pkg/syncmap" +) + +type Manager struct { + subscribers syncmap.Map[string, chan OpenEvent] + closeOnce sync.Once +} + +func NewManager() *Manager { + return &Manager{} +} + +func (m *Manager) Subscribe(id string) chan OpenEvent { + ch := make(chan OpenEvent, 16) + m.subscribers.Store(id, ch) + return ch +} + +func (m *Manager) Unsubscribe(id string) { + if val, ok := m.subscribers.LoadAndDelete(id); ok { + close(val) + } +} + +func (m *Manager) RequestOpen(event OpenEvent) { + m.subscribers.Range(func(key string, ch chan OpenEvent) bool { + select { + case ch <- event: + default: + } + return true + }) +} + +func (m *Manager) Close() { + m.closeOnce.Do(func() { + m.subscribers.Range(func(key string, ch chan OpenEvent) bool { + close(ch) + m.subscribers.Delete(key) + return true + }) + }) +} diff --git a/raveos-hyprland-theme/theme-data/DankMaterialShell/core/internal/server/apppicker/models.go b/raveos-hyprland-theme/theme-data/DankMaterialShell/core/internal/server/apppicker/models.go new file mode 100644 index 0000000..8861461 --- /dev/null +++ b/raveos-hyprland-theme/theme-data/DankMaterialShell/core/internal/server/apppicker/models.go @@ -0,0 +1,8 @@ +package apppicker + +type OpenEvent struct { + Target string `json:"target"` + MimeType string `json:"mimeType,omitempty"` + Categories []string `json:"categories,omitempty"` + RequestType string `json:"requestType"` +} |