diff options
Diffstat (limited to 'raveos-hyprland-theme/theme-data/DankMaterialShell/core/internal/notify/notify.go')
| -rw-r--r-- | raveos-hyprland-theme/theme-data/DankMaterialShell/core/internal/notify/notify.go | 185 |
1 files changed, 0 insertions, 185 deletions
diff --git a/raveos-hyprland-theme/theme-data/DankMaterialShell/core/internal/notify/notify.go b/raveos-hyprland-theme/theme-data/DankMaterialShell/core/internal/notify/notify.go deleted file mode 100644 index 1e42b16..0000000 --- a/raveos-hyprland-theme/theme-data/DankMaterialShell/core/internal/notify/notify.go +++ /dev/null @@ -1,185 +0,0 @@ -package notify - -import ( - "fmt" - "os" - "os/exec" - "path/filepath" - "strconv" - "strings" - "syscall" - - "github.com/godbus/dbus/v5" -) - -const ( - notifyDest = "org.freedesktop.Notifications" - notifyPath = "/org/freedesktop/Notifications" - notifyInterface = "org.freedesktop.Notifications" - - maxSummaryLen = 29 - maxBodyLen = 80 -) - -type Notification struct { - AppName string - Icon string - Summary string - Body string - FilePath string - Timeout int32 -} - -func Send(n Notification) error { - conn, err := dbus.SessionBus() - if err != nil { - return fmt.Errorf("dbus session failed: %w", err) - } - - if n.AppName == "" { - n.AppName = "DMS" - } - if n.Timeout == 0 { - n.Timeout = 5000 - } - - if len(n.Summary) > maxSummaryLen { - n.Summary = n.Summary[:maxSummaryLen-3] + "..." - } - if len(n.Body) > maxBodyLen { - n.Body = n.Body[:maxBodyLen-3] + "..." - } - - var actions []string - if n.FilePath != "" { - actions = []string{ - "open", "Open", - "folder", "Open Folder", - } - } - - hints := map[string]dbus.Variant{} - if n.FilePath != "" { - imgPath := n.FilePath - if !strings.HasPrefix(imgPath, "file://") { - imgPath = "file://" + imgPath - } - hints["image_path"] = dbus.MakeVariant(imgPath) - } - - obj := conn.Object(notifyDest, notifyPath) - call := obj.Call( - notifyInterface+".Notify", - 0, - n.AppName, - uint32(0), - n.Icon, - n.Summary, - n.Body, - actions, - hints, - n.Timeout, - ) - - if call.Err != nil { - return fmt.Errorf("notify call failed: %w", call.Err) - } - - var notificationID uint32 - if err := call.Store(¬ificationID); err != nil { - return fmt.Errorf("failed to get notification id: %w", err) - } - - if len(actions) > 0 && n.FilePath != "" { - spawnActionListener(notificationID, n.FilePath) - } - - return nil -} - -func spawnActionListener(notificationID uint32, filePath string) { - exe, err := os.Executable() - if err != nil { - return - } - - cmd := exec.Command(exe, "notify-action-generic", fmt.Sprintf("%d", notificationID), filePath) - cmd.SysProcAttr = &syscall.SysProcAttr{ - Setsid: true, - } - cmd.Start() -} - -func RunActionListener(args []string) { - if len(args) < 2 { - return - } - - notificationID, err := strconv.ParseUint(args[0], 10, 32) - if err != nil { - return - } - - filePath := args[1] - - conn, err := dbus.SessionBus() - if err != nil { - return - } - - if err := conn.AddMatchSignal( - dbus.WithMatchObjectPath(notifyPath), - dbus.WithMatchInterface(notifyInterface), - ); err != nil { - return - } - - signals := make(chan *dbus.Signal, 10) - conn.Signal(signals) - - for sig := range signals { - switch sig.Name { - case notifyInterface + ".ActionInvoked": - if len(sig.Body) < 2 { - continue - } - id, ok := sig.Body[0].(uint32) - if !ok || id != uint32(notificationID) { - continue - } - action, ok := sig.Body[1].(string) - if !ok { - continue - } - handleAction(action, filePath) - return - - case notifyInterface + ".NotificationClosed": - if len(sig.Body) < 1 { - continue - } - id, ok := sig.Body[0].(uint32) - if !ok || id != uint32(notificationID) { - continue - } - return - } - } -} - -func handleAction(action, filePath string) { - switch action { - case "open", "default": - openPath(filePath) - case "folder": - openPath(filepath.Dir(filePath)) - } -} - -func openPath(path string) { - cmd := exec.Command("xdg-open", path) - cmd.SysProcAttr = &syscall.SysProcAttr{ - Setsid: true, - } - cmd.Start() -} |