nixos-configs/devices/wim/config/ags/js/misc/popup.js

117 lines
3.2 KiB
JavaScript
Raw Normal View History

import App from 'resource:///com/github/Aylur/ags/app.js';
2023-12-08 00:01:43 -05:00
import Hyprland from 'resource:///com/github/Aylur/ags/service/hyprland.js';
import { Revealer, Box, Window } from 'resource:///com/github/Aylur/ags/widget.js';
import { timeout } from 'resource:///com/github/Aylur/ags/utils.js';
export default ({
2023-10-30 19:53:50 -04:00
// Revealer props
transition = 'slide_down',
transitionDuration = 500,
// Optional: execute a function whenever
// the window pops up or goes away
onOpen = () => { /**/ },
onClose = () => { /**/ },
2023-10-30 19:53:50 -04:00
// Window props
name,
child,
2023-12-08 00:01:43 -05:00
blur = false,
closeOnUnfocus = 'released',
2023-10-30 19:53:50 -04:00
visible = false,
layer = 'overlay',
...props
}) => {
const window = Window({
name,
2023-10-30 19:53:50 -04:00
layer,
visible: false,
...props,
2023-10-30 19:53:50 -04:00
setup: () => {
2023-12-08 00:01:43 -05:00
// Add way to make window open on startup
2023-10-30 19:53:50 -04:00
const id = App.connect('config-parsed', () => {
if (visible) {
2023-10-30 19:53:50 -04:00
App.openWindow(name);
}
2023-10-30 19:53:50 -04:00
App.disconnect(id);
});
2023-12-08 00:01:43 -05:00
if (blur) {
Hyprland.sendMessage('[[BATCH]] ' +
`keyword layerrule ignorealpha[0.97],${name}; ` +
`keyword layerrule blur,${name}`);
}
2023-10-30 19:53:50 -04:00
},
// Wrapping the revealer inside a box is needed
// to allocate some space for it even when not revealed
child: Box({
css: `
min-height:1px;
min-width:1px;
padding: 1px;
`,
child: Revealer({
transition,
2023-10-30 19:53:50 -04:00
transitionDuration,
connections: [[App, (rev, currentName, isOpen) => {
if (currentName === name) {
rev.revealChild = isOpen;
if (isOpen) {
onOpen(window);
}
else {
timeout(transitionDuration, () => {
onClose(window);
});
}
}
}]],
child: child || Box(),
}),
}),
});
2023-10-30 19:53:50 -04:00
window.setXPos = (
alloc,
side = 'right',
) => {
const width = window.get_display()
.get_monitor_at_point(alloc.x, alloc.y)
.get_geometry().width;
window.margins = [
window.margins[0],
side === 'right' ?
(width - alloc.x - alloc.width) :
window.margins[1],
window.margins[2],
side === 'right' ?
window.margins[3] :
(alloc.x - alloc.width),
];
};
// Make getting the original child passed in this
// function easier when making more code for the widget
window.getChild = () => window.child.children[0].child;
window.setChild = (newChild) => {
window.child.children[0].child = newChild;
window.child.children[0].show_all();
};
2023-10-30 19:53:50 -04:00
// This is for my custom pointers.js
window.closeOnUnfocus = closeOnUnfocus;
2023-10-30 19:53:50 -04:00
return window;
};