wlogout: add example
							
								
								
									
										7
									
								
								wlogout/README.md
									
										
									
									
									
										Normal file
									
								
							
							
						
						| 
						 | 
					@ -0,0 +1,7 @@
 | 
				
			||||||
 | 
					# Wlogout clone
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					This is a mostly faithful clone of [wlogout](https://github.com/ArtsyMacaw/wlogout).
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					You can run the example with `quickshell -c shell.qml`.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
							
								
								
									
										106
									
								
								wlogout/WLogout.qml
									
										
									
									
									
										Normal file
									
								
							
							
						
						| 
						 | 
					@ -0,0 +1,106 @@
 | 
				
			||||||
 | 
					import QtQuick
 | 
				
			||||||
 | 
					import QtQuick.Layouts
 | 
				
			||||||
 | 
					import Quickshell
 | 
				
			||||||
 | 
					import Quickshell.Io
 | 
				
			||||||
 | 
					import Quickshell.Wayland
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					Variants {
 | 
				
			||||||
 | 
						id: root
 | 
				
			||||||
 | 
						property color backgroundColor: "#e60c0c0c"
 | 
				
			||||||
 | 
						property color buttonColor: "#1e1e1e"
 | 
				
			||||||
 | 
						property color buttonHoverColor: "#3700b3"
 | 
				
			||||||
 | 
						default property list<WlButton> buttons
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						variants: Quickshell.screens.map(screen => ({ screen }))
 | 
				
			||||||
 | 
						PanelWindow {
 | 
				
			||||||
 | 
							id: w
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							exclusionMode: ExclusionMode.Ignore
 | 
				
			||||||
 | 
							WlrLayershell.layer: Layer.Overlay
 | 
				
			||||||
 | 
							WlrLayershell.keyboardFocus: KeyboardFocus.Exclusive
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							color: "transparent"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							contentItem {
 | 
				
			||||||
 | 
								focus: true
 | 
				
			||||||
 | 
								Keys.onPressed: event => {
 | 
				
			||||||
 | 
									if (event.key == Qt.Key_Escape) Qt.quit();
 | 
				
			||||||
 | 
									else {
 | 
				
			||||||
 | 
										for (let i = 0; i < buttons.length; i++) {
 | 
				
			||||||
 | 
											let button = buttons[i];
 | 
				
			||||||
 | 
											if (event.key == button.keybind) button.exec();
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							anchors {
 | 
				
			||||||
 | 
								top: true
 | 
				
			||||||
 | 
								left: true
 | 
				
			||||||
 | 
								bottom: true
 | 
				
			||||||
 | 
								right: true
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							Rectangle {
 | 
				
			||||||
 | 
								color: backgroundColor;
 | 
				
			||||||
 | 
								anchors.fill: parent
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
								MouseArea {
 | 
				
			||||||
 | 
									anchors.fill: parent
 | 
				
			||||||
 | 
									onClicked: Qt.quit()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
									GridLayout {
 | 
				
			||||||
 | 
										anchors.centerIn: parent
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
										width: parent.width * 0.75
 | 
				
			||||||
 | 
										height: parent.height * 0.75
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
										columns: 3
 | 
				
			||||||
 | 
										columnSpacing: 0
 | 
				
			||||||
 | 
										rowSpacing: 0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
										Repeater {
 | 
				
			||||||
 | 
											model: buttons
 | 
				
			||||||
 | 
											delegate: Rectangle {
 | 
				
			||||||
 | 
												required property WlButton modelData;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
												Layout.fillWidth: true
 | 
				
			||||||
 | 
												Layout.fillHeight: true
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
												color: ma.containsMouse ? buttonHoverColor : buttonColor
 | 
				
			||||||
 | 
												border.color: "black"
 | 
				
			||||||
 | 
												border.width: ma.containsMouse ? 0 : 1
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
												MouseArea {
 | 
				
			||||||
 | 
													id: ma
 | 
				
			||||||
 | 
													anchors.fill: parent
 | 
				
			||||||
 | 
													hoverEnabled: true
 | 
				
			||||||
 | 
													onClicked: modelData.exec()
 | 
				
			||||||
 | 
												}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
												Image {
 | 
				
			||||||
 | 
													id: icon
 | 
				
			||||||
 | 
													anchors.centerIn: parent
 | 
				
			||||||
 | 
													source: `icons/${modelData.icon}.png`
 | 
				
			||||||
 | 
													width: parent.width * 0.25
 | 
				
			||||||
 | 
													height: parent.width * 0.25
 | 
				
			||||||
 | 
												}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
												Text {
 | 
				
			||||||
 | 
													anchors {
 | 
				
			||||||
 | 
														top: icon.bottom
 | 
				
			||||||
 | 
														topMargin: 20
 | 
				
			||||||
 | 
														horizontalCenter: parent.horizontalCenter
 | 
				
			||||||
 | 
													}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
													text: modelData.text
 | 
				
			||||||
 | 
													font.pointSize: 20
 | 
				
			||||||
 | 
													color: "white"
 | 
				
			||||||
 | 
												}
 | 
				
			||||||
 | 
											}
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										21
									
								
								wlogout/WlButton.qml
									
										
									
									
									
										Normal file
									
								
							
							
						
						| 
						 | 
					@ -0,0 +1,21 @@
 | 
				
			||||||
 | 
					import QtQuick
 | 
				
			||||||
 | 
					import Quickshell.Io
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					QtObject {
 | 
				
			||||||
 | 
						required property string command
 | 
				
			||||||
 | 
						required property string text
 | 
				
			||||||
 | 
						required property string icon
 | 
				
			||||||
 | 
						property var keybind: null
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						id: button
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						readonly property var process: Process {
 | 
				
			||||||
 | 
							command: ["sh", "-c", button.command]
 | 
				
			||||||
 | 
							manageLifetime: false
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						function exec() {
 | 
				
			||||||
 | 
							process.running = true;
 | 
				
			||||||
 | 
							Qt.quit();
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										
											BIN
										
									
								
								wlogout/icons/hibernate.png
									
										
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 18 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								wlogout/icons/lock.png
									
										
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 7.9 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								wlogout/icons/logout.png
									
										
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 6.2 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								wlogout/icons/reboot.png
									
										
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 16 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								wlogout/icons/shutdown.png
									
										
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 15 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								wlogout/icons/suspend.png
									
										
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 17 KiB  | 
							
								
								
									
										
											BIN
										
									
								
								wlogout/image.png
									
										
									
									
									
										Normal file
									
								
							
							
						
						| 
		 After Width: | Height: | Size: 110 KiB  | 
							
								
								
									
										48
									
								
								wlogout/shell.qml
									
										
									
									
									
										Normal file
									
								
							
							
						
						| 
						 | 
					@ -0,0 +1,48 @@
 | 
				
			||||||
 | 
					import QtQuick
 | 
				
			||||||
 | 
					import Quickshell
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					ShellRoot {
 | 
				
			||||||
 | 
						WLogout {
 | 
				
			||||||
 | 
							WlButton {
 | 
				
			||||||
 | 
								command: "loginctl lock-screen"
 | 
				
			||||||
 | 
								keybind: Qt.Key_K
 | 
				
			||||||
 | 
								text: "Lock"
 | 
				
			||||||
 | 
								icon: "lock"
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							WlButton {
 | 
				
			||||||
 | 
								command: "loginctl terminate-user $USER"
 | 
				
			||||||
 | 
								keybind: Qt.Key_E
 | 
				
			||||||
 | 
								text: "Logout"
 | 
				
			||||||
 | 
								icon: "logout"
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							WlButton {
 | 
				
			||||||
 | 
								command: "systemctl suspend"
 | 
				
			||||||
 | 
								keybind: Qt.Key_U
 | 
				
			||||||
 | 
								text: "Suspend"
 | 
				
			||||||
 | 
								icon: "suspend"
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							WlButton {
 | 
				
			||||||
 | 
								command: "systemctl hibernate"
 | 
				
			||||||
 | 
								keybind: Qt.Key_H
 | 
				
			||||||
 | 
								text: "Hibernate"
 | 
				
			||||||
 | 
								icon: "hibernate"
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							WlButton {
 | 
				
			||||||
 | 
								command: "systemctl poweroff"
 | 
				
			||||||
 | 
								keybind: Qt.Key_K
 | 
				
			||||||
 | 
								text: "Shutdown"
 | 
				
			||||||
 | 
								icon: "shutdown"
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							WlButton {
 | 
				
			||||||
 | 
								command: "systemctl reboot"
 | 
				
			||||||
 | 
								keybind: Qt.Key_R
 | 
				
			||||||
 | 
								text: "Reboot"
 | 
				
			||||||
 | 
								icon: "reboot"
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||