Files
TheaninovOS/desktops/hyprland/ags/modules/sessionscreen.js
2023-11-15 16:09:26 +01:00

175 lines
5.1 KiB
JavaScript

// This is for the cool memory indicator on the sidebar
// For the right pill of the bar, see system.js
const {Gdk, Gtk} = imports.gi
const GObject = imports.gi.GObject
const Lang = imports.lang
import {App, Service, Utils, Widget} from "../imports.js"
const {exec, execAsync} = Utils
const SessionButton = (name, icon, command, props = {}) => {
const buttonDescription = Widget.Revealer({
valign: "end",
transitionDuration: 200,
transition: "slide_down",
revealChild: false,
child: Widget.Label({
className: "txt-smaller session-button-desc",
label: name,
}),
})
return Widget.Button({
onClicked: command,
className: "session-button",
child: Widget.Overlay({
className: "session-button-box",
child: Widget.Label({
vexpand: true,
className: "icon-material",
label: icon,
}),
overlays: [buttonDescription],
}),
onHover: button => {
const display = Gdk.Display.get_default()
const cursor = Gdk.Cursor.new_from_name(display, "pointer")
button.get_window().set_cursor(cursor)
buttonDescription.revealChild = true
},
onHoverLost: button => {
const display = Gdk.Display.get_default()
const cursor = Gdk.Cursor.new_from_name(display, "default")
button.get_window().set_cursor(cursor)
buttonDescription.revealChild = false
},
connections: [
[
"focus-in-event",
self => {
buttonDescription.revealChild = true
self.toggleClassName("session-button-focused", true)
},
],
[
"focus-out-event",
self => {
buttonDescription.revealChild = false
self.toggleClassName("session-button-focused", false)
},
],
],
...props,
})
}
export default () => {
// lock, logout, sleep
const lockButton = SessionButton("Lock", "lock", () => {
App.closeWindow("session")
execAsync("gtklock")
})
const logoutButton = SessionButton("Logout", "logout", () => {
App.closeWindow("session")
execAsync(["bash", "-c", "loginctl terminate-user $USER"])
})
const sleepButton = SessionButton("Sleep", "sleep", () => {
App.closeWindow("session")
execAsync("systemctl suspend")
})
// hibernate, shutdown, reboot
const hibernateButton = SessionButton("Hibernate", "downloading", () => {
App.closeWindow("session")
execAsync("systemctl hibernate")
})
const shutdownButton = SessionButton("Shutdown", "power_settings_new", () => {
App.closeWindow("session")
execAsync("systemctl poweroff")
})
const rebootButton = SessionButton("Reboot", "restart_alt", () => {
App.closeWindow("session")
execAsync("systemctl reboot")
})
const cancelButton = SessionButton("Cancel", "close", () => App.closeWindow("session"), {
className: "session-button-cancel",
})
return Widget.Box({
className: "session-bg",
style: `
min-width: ${SCREEN_WIDTH * 2}px;
min-height: ${SCREEN_HEIGHT * 2}px;
`, // Hack to draw over reserved bar space
vertical: true,
children: [
Widget.EventBox({
onPrimaryClick: () => App.closeWindow("session"),
onSecondaryClick: () => App.closeWindow("session"),
onMiddleClick: () => App.closeWindow("session"),
}),
Widget.Box({
halign: "center",
vexpand: true,
vertical: true,
children: [
Widget.Box({
valign: "center",
vertical: true,
className: "spacing-v-15",
children: [
Widget.Box({
vertical: true,
style: "margin-bottom: 0.682rem;",
children: [
Widget.Label({
className: "txt-title txt",
label: "Session",
}),
Widget.Label({
justify: Gtk.Justification.CENTER,
className: "txt-small txt",
label: "Use arrow keys to navigate.\nEnter to select, Esc to cancel.",
}),
],
}),
Widget.Box({
halign: "center",
className: "spacing-h-15",
children: [
// lock, logout, sleep
lockButton,
logoutButton,
sleepButton,
],
}),
Widget.Box({
halign: "center",
className: "spacing-h-15",
children: [
// hibernate, shutdown, reboot
hibernateButton,
shutdownButton,
rebootButton,
],
}),
Widget.Box({
halign: "center",
className: "spacing-h-15",
children: [
// hibernate, shutdown, reboot
cancelButton,
],
}),
],
}),
],
}),
],
connections: [
[
App,
(_b, name, visible) => {
if (visible) lockButton.grab_focus() // Lock is the default option
},
],
],
})
}