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

74 lines
1.8 KiB
JavaScript
Raw Normal View History

import Variable from 'resource:///com/github/Aylur/ags/variable.js';
2023-11-06 21:41:30 -05:00
import { Button, EventBox } from 'resource:///com/github/Aylur/ags/widget.js';
import Gtk from 'gi://Gtk';
2023-09-04 22:27:34 -04:00
// TODO: wrap in another EventBox for disabled cursor
2023-12-18 18:00:30 -05:00
/**
* @typedef {import('types/widget.js').Widget} Widget
* @typedef {Widget & Object} CursorProps
* @property {boolean=} isButton
* @property {function(Widget):void=} onPrimaryClickRelease
*
* @param {CursorProps} obj
*/
export default ({
2023-11-06 18:37:23 -05:00
isButton = false,
2023-12-18 18:00:30 -05:00
onPrimaryClickRelease = (self) => {
self;
},
...props
}) => {
// Make this variable to know if the function should
// be executed depending on where the click is released
const CanRun = Variable(true);
2023-12-18 18:00:30 -05:00
let widgetFunc;
if (isButton) {
widgetFunc = Button;
}
else {
widgetFunc = EventBox;
}
const widget = widgetFunc({
...props,
2023-11-16 15:02:00 -05:00
cursor: 'pointer',
2023-12-18 18:00:30 -05:00
on_primary_click_release: (self) => {
// Every click, do a one shot connect to
// CanRun to wait for location of click
const id = CanRun.connect('changed', () => {
if (CanRun.value) {
onPrimaryClickRelease(self);
}
CanRun.disconnect(id);
});
},
2023-12-18 18:00:30 -05:00
});
const gesture = Gtk.GestureLongPress.new(widget);
2023-12-18 18:00:30 -05:00
// @ts-expect-error
widget.hook(gesture, () => {
const pointer = gesture.get_point(null);
const x = pointer[1];
const y = pointer[2];
if ((!x || !y) || (x === 0 && y === 0)) {
return;
}
CanRun.value = !(
x > widget.get_allocated_width() ||
y > widget.get_allocated_height()
);
}, 'end');
return widget;
};