blob: 996fd41bd82c0bcbdf97dbd834ea64f5a391ae09 (
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
124
125
126
127
128
129
130
131
132
 | import Quickshell
import Quickshell.Wayland
import Quickshell.Io
import Quickshell.Services.Pam
import Quickshell.Services.Mpris
import Custom as Custom
import qs.Services
import QtQml
Scope {
  id: lockscreen
  property string currentText: ""
  PamContext {
    id: pam
    property list<var> messages: []
    config: "quickshell"
    onCompleted: result => {
      if (result === PamResult.Success) {
	lock.locked = false;
      }
    }
    onPamMessage: {
      messages = Array.from(messages).concat([{ "text": pam.message, "error": pam.messageIsError }])
    }
    onActiveChanged: {
      messages = [];
    }
  }
  IpcHandler {
    target: "Lockscreen"
    function setLocked(locked: bool): void { lock.locked = locked; }
    function getLocked(): bool { return lock.locked; }
  }
  Connections {
    target: Custom.Systemd
    function onSleep(before: bool) {
      console.log(`received prepare for sleep ${before}`);
      if (before)
        lock.locked = true;
    }
    function onLock() { lock.locked = true; }
    function onUnlock() { lock.locked = false; }
  }
  IdleMonitor {
    id: idleMonitor
    enabled: !lock.secure
    timeout: 600
    respectInhibitors: true
    onIsIdleChanged: {
      if (idleMonitor.isIdle)
        lock.locked = true;
    }
  }
  Custom.SystemdInhibitor {
    enabled: !lock.secure
    what: Custom.SystemdInhibitorParams.Sleep
    who: "quickshell"
    why: "Lock session"
    mode: Custom.SystemdInhibitorParams.Delay
  }
  Binding {
    target: NotificationManager
    property: "lockscreenActive"
    value: lock.locked
  }
  WlSessionLock {
    id: lock
    onLockStateChanged: {
      if (!locked && pam.active)
        pam.abort();
      if (locked) {
        NiriService.sendCommand({ "Action": { "PowerOffMonitors": {} } }, _ => {});
        Custom.KeePassXC.lockAllDatabases();
	Array.from(MprisProxy.players).forEach(player => {
	  if (player.canPause && player.isPlaying)
	    player.pause();
        });
	// Custom.Systemd.stopUserUnit("gpg-agent.service", "replace");
	GpgAgent.reloadAgent();
      }
    }
    Component.onCompleted: { (_ => {})(MprisProxy.players); }
    onSecureStateChanged: Custom.Systemd.lockedHint = lock.secure
    WlSessionLockSurface {
      id: lockSurface
      color: "black"
      LockSurface {
        id: surfaceContent
	onResponse: responseText => pam.respond(responseText)
	onAuthRunningChanged: {
	  if (authRunning)
	    pam.start();
	}
	Connections {
	  target: pam
	  function onMessagesChanged() { surfaceContent.messages = pam.messages; }
	  function onResponseRequiredChanged() { surfaceContent.responseRequired = pam.responseRequired; }
	  function onActiveChanged() { surfaceContent.authRunning = pam.active; }
	}
	onCurrentTextChanged: lockscreen.currentText = currentText
	Connections {
	  target: lockscreen
	  function onCurrentTextChanged() { surfaceContent.currentText = lockscreen.currentText; }
	}
	Connections {
	  target: lockSurface
	  function onScreenChanged() { surfaceContent.screen = lockSurface.screen; }
	}
      }
    }
  }
}
 |