summaryrefslogtreecommitdiffstats
path: root/home-configuration/config/quickshell/modules/notifications/NotificationFocus.qml
blob: af52eaaab18dd6e9ad16d62920ee6359e4aa4ed8 (plain)
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
import QtQuick
import Quickshell
import Quickshell.Io
import "../../config.js" as Config

Item {
    id: root

    property string pendingApp: ""

    Process {
        id: windowsProcess

        command: ["niri", "msg", "-j", "windows"]

        stdout: StdioCollector {
            id: windowsOutput

            onStreamFinished: {
                var windows

                try {
                    windows = JSON.parse(this.text)
                } catch (error) {
                    console.error(
                        "Failed to parse niri windows:",
                        error
                    )

                    root.pendingApp = ""
                    return
                }

                var app = root.pendingApp.toLowerCase()
                root.pendingApp = ""

                if (Config.notificationVesktopNames.indexOf(app) !== -1) {
                    for (var i = 0; i < windows.length; i++) {
                        var niriWindow = windows[i]
                        var appId = (niriWindow.app_id || "").toLowerCase()

                        if (appId === Config.notificationVesktopAppId) {
                            console.log(
                                "FOCUSING VESKTOP WINDOW:",
                                niriWindow.id,
                                niriWindow.title
                            )

                            focusProcess.exec([
                                "niri",
                                "msg",
                                "action",
                                "focus-window",
                                "--id",
                                String(niriWindow.id)
                            ])

                            return
                        }
                    }

                    console.log(
                        "No matching Niri window found for:",
                        app
                    )

                    return
                }

                for (var j = 0; j < windows.length; j++) {
                    var window = windows[j]
                    var windowAppId = (window.app_id || "").toLowerCase()

                    if (
                        windowAppId === app ||
                        windowAppId === app + ".desktop"
                    ) {
                        console.log(
                            "FOCUSING WINDOW:",
                            window.id,
                            window.app_id,
                            window.title
                        )

                        focusProcess.exec([
                            "niri",
                            "msg",
                            "action",
                            "focus-window",
                            "--id",
                            String(window.id)
                        ])

                        return
                    }
                }

                console.log(
                    "No matching Niri window found for:",
                    app
                )
            }
        }
    }

    Process {
        id: focusProcess
    }

    function focusSource(notification) {
        if (!notification)
            return

        root.pendingApp = notification.appName

        windowsProcess.exec([
            "niri",
            "msg",
            "-j",
            "windows"
        ])
    }
}