diff --git a/config/LauncherConfig.qml b/config/LauncherConfig.qml index 987e634e..ea3c364f 100644 --- a/config/LauncherConfig.qml +++ b/config/LauncherConfig.qml @@ -4,6 +4,7 @@ JsonObject { property int maxShown: 8 property int maxWallpapers: 9 // Warning: even numbers look bad property string actionPrefix: ">" + property bool enableDangerousActions: false // Allow actions that can cause losing data, like shutdown, reboot and logout property JsonObject sizes: JsonObject { property int itemWidth: 600 diff --git a/modules/launcher/Actions.qml b/modules/launcher/Actions.qml index beb77a56..ae732dbf 100644 --- a/modules/launcher/Actions.qml +++ b/modules/launcher/Actions.qml @@ -67,6 +67,39 @@ Singleton { Colours.setMode("dark"); } }, + Action { + name: qsTr("Shutdown") + desc: qsTr("Shutdown the system") + icon: "power_settings_new" + disabled: !Config.launcher.enableDangerousActions + + function onClicked(list: AppList): void { + list.visibilities.launcher = false; + shutdown.running = true; + } + }, + Action { + name: qsTr("Reboot") + desc: qsTr("Reboot the system") + icon: "cached" + disabled: !Config.launcher.enableDangerousActions + + function onClicked(list: AppList): void { + list.visibilities.launcher = false; + reboot.running = true; + } + }, + Action { + name: qsTr("Logout") + desc: qsTr("Log out of the current session") + icon: "exit_to_app" + disabled: !Config.launcher.enableDangerousActions + + function onClicked(list: AppList): void { + list.visibilities.launcher = false; + logout.running = true; + } + }, Action { name: qsTr("Lock") desc: qsTr("Lock the current session") @@ -89,7 +122,7 @@ Singleton { } ] - readonly property list preppedActions: list.map(a => ({ + readonly property list preppedActions: list.filter(a => !a.disabled).map(a => ({ name: Fuzzy.prepare(a.name), desc: Fuzzy.prepare(a.desc), action: a @@ -107,6 +140,24 @@ Singleton { list.search.text = `${Config.launcher.actionPrefix}${text} `; } + Process { + id: shutdown + + command: ["systemctl", "poweroff"] + } + + Process { + id: reboot + + command: ["systemctl", "reboot"] + } + + Process { + id: logout + + command: ["sh", "-c", "(uwsm stop | grep -q 'Compositor is not running' && loginctl terminate-user $USER) || uwsm stop"] + } + Process { id: lock @@ -123,6 +174,8 @@ Singleton { required property string name required property string desc required property string icon + property bool disabled + property string disabledReason function onClicked(list: AppList): void { }