86 lines
2.4 KiB
TypeScript
86 lines
2.4 KiB
TypeScript
import { exec } from "astal";
|
|
import { Gtk } from "astal/gtk4";
|
|
|
|
const PowerMenu = (): Gtk.Popover => {
|
|
const popover = new Gtk.Popover({ cssClasses: ["PowerMenu"] });
|
|
|
|
const powerMenuBox = () => {
|
|
return (
|
|
<box>
|
|
<button
|
|
cssClasses={["power-button"]}
|
|
child={
|
|
<image iconName={"system-shutdown-symbolic"}></image>
|
|
}
|
|
onClicked={() => exec("/bin/sh -c 'shutdown now'")}
|
|
></button>
|
|
<button
|
|
cssClasses={["power-button"]}
|
|
child={<image iconName={"system-reboot-symbolic"}></image>}
|
|
onClicked={() => exec("/bin/sh -c 'reboot'")}
|
|
></button>
|
|
<button
|
|
cssClasses={["power-button"]}
|
|
child={<image iconName={"system-suspend-symbolic"}></image>}
|
|
onClicked={() => exec("/bin/sh -c 'systemctl suspend'")}
|
|
></button>
|
|
</box>
|
|
);
|
|
};
|
|
|
|
popover.set_child(powerMenuBox());
|
|
return popover;
|
|
};
|
|
|
|
const Power = () => {
|
|
const pm = PowerMenu();
|
|
return (
|
|
<button
|
|
widthRequest={0}
|
|
hexpand={false}
|
|
vexpand={false}
|
|
cssClasses={["power-menu-button"]}
|
|
child={
|
|
<box>
|
|
<image iconName={"system-shutdown-symbolic"}></image>
|
|
{pm}
|
|
</box>
|
|
}
|
|
onClicked={() => pm.popup()}
|
|
/>
|
|
);
|
|
};
|
|
|
|
const UserMenu = (): Gtk.Popover => {
|
|
const popover = new Gtk.Popover();
|
|
|
|
const powerMenuBox = () => {
|
|
return (
|
|
<box>
|
|
<button
|
|
cssClasses={["power-button"]}
|
|
child={
|
|
<image iconName={"system-lock-screen-symbolic"}></image>
|
|
}
|
|
onClicked={() => exec("/bin/sh -c 'hyprlock'")}
|
|
></button>
|
|
<button
|
|
cssClasses={["power-button"]}
|
|
child={<image iconName={"system-log-out-symbolic"}></image>}
|
|
onClicked={() =>
|
|
exec("/bin/sh -c 'hyprctl dispatch exit 0'")
|
|
}
|
|
></button>
|
|
</box>
|
|
);
|
|
};
|
|
|
|
popover.set_child(powerMenuBox());
|
|
return popover;
|
|
};
|
|
|
|
export default {
|
|
Power,
|
|
UserMenu
|
|
};
|