// 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; import App from 'resource:///com/github/Aylur/ags/app.js'; import Widget from 'resource:///com/github/Aylur/ags/widget.js'; import * as Utils from 'resource:///com/github/Aylur/ags/utils.js'; import { monitors } from '../.commondata/hyprlanddata.js'; const { exec, execAsync } = Utils; const SessionButton = (name, icon, command, props = {}, colorid = 0) => { const buttonDescription = Widget.Revealer({ vpack: 'end', transitionDuration: userOptions.animations.durationSmall, transition: 'slide_down', revealChild: false, child: Widget.Label({ className: 'txt-smaller session-button-desc', label: name, }), }); return Widget.Button({ onClicked: command, className: `session-button session-color-${colorid}`, 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; }, setup: (self) => self .on('focus-in-event', (self) => { buttonDescription.revealChild = true; self.toggleClassName('session-button-focused', true); }) .on('focus-out-event', (self) => { buttonDescription.revealChild = false; self.toggleClassName('session-button-focused', false); }) , ...props, }); } export default ({ id = 0 }) => { // lock, logout, sleep const lockButton = SessionButton('Lock', 'lock', () => { closeWindowOnAllMonitors('session'); execAsync(['loginctl', 'lock-session']).catch(print) }, {}, 1); const logoutButton = SessionButton('Logout', 'logout', () => { closeWindowOnAllMonitors('session'); execAsync(['bash', '-c', 'pkill Hyprland || pkill sway || pkill niri || loginctl terminate-user $USER']).catch(print) }, {}, 2); const sleepButton = SessionButton('Sleep', 'sleep', () => { closeWindowOnAllMonitors('session'); execAsync(['bash', '-c', 'systemctl suspend || loginctl suspend']).catch(print) }, {}, 3); // hibernate, shutdown, reboot const hibernateButton = SessionButton('Hibernate', 'downloading', () => { closeWindowOnAllMonitors('session'); execAsync(['bash', '-c', 'systemctl hibernate || loginctl hibernate']).catch(print) }, {}, 4); const shutdownButton = SessionButton('Shutdown', 'power_settings_new', () => { closeWindowOnAllMonitors('session'); execAsync(['bash', '-c', 'systemctl poweroff || loginctl poweroff']).catch(print) }, {}, 5); const rebootButton = SessionButton('Reboot', 'restart_alt', () => { closeWindowOnAllMonitors('session'); execAsync(['bash', '-c', 'systemctl reboot || loginctl reboot']).catch(print) }, {}, 6); const cancelButton = SessionButton('Cancel', 'close', () => closeWindowOnAllMonitors('session'), { className: 'session-button-cancel' }, 7); const sessionDescription = Widget.Box({ vertical: true, css: '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.' }), ] }); const SessionButtonRow = (children) => Widget.Box({ hpack: 'center', className: 'spacing-h-15', children: children, }); const sessionButtonRows = [ SessionButtonRow([lockButton, logoutButton, sleepButton]), SessionButtonRow([hibernateButton, shutdownButton, rebootButton]), SessionButtonRow([cancelButton]), ] return Widget.Box({ className: 'session-bg', css: ` min-width: ${monitors[id].width}px; min-height: ${monitors[id].height}px; `, // idk why but height = screen height doesn't fill vertical: true, children: [ Widget.EventBox({ onPrimaryClick: () => closeWindowOnAllMonitors('session'), onSecondaryClick: () => closeWindowOnAllMonitors('session'), onMiddleClick: () => closeWindowOnAllMonitors('session'), }), Widget.Box({ hpack: 'center', vexpand: true, vertical: true, children: [ Widget.Box({ vpack: 'center', vertical: true, className: 'spacing-v-15', children: [ sessionDescription, ...sessionButtonRows, ] }) ] }) ], setup: (self) => self .hook(App, (_b, name, visible) => { if (visible) lockButton.grab_focus(); // Lock is the default option }) , }); }