feat(ags pointers): make list of widgets that don't close others when clicked on
All checks were successful
Discord / discord commits (push) Has been skipped

This commit is contained in:
matt1432 2024-01-16 11:26:35 -05:00
parent 0b3861a867
commit 2f4781e60e
2 changed files with 55 additions and 31 deletions

View file

@ -117,8 +117,8 @@ class Pointers extends Service {
(Array.from(App.windows) as Array<[string, AgsWindow]>) (Array.from(App.windows) as Array<[string, AgsWindow]>)
.some((w) => { .some((w) => {
const closable = w[1].attribute?.close_on_unfocus && const closable = w[1].attribute?.close_on_unfocus &&
!(w[1].attribute?.close_on_unfocus === 'none' || !(w[1].attribute.close_on_unfocus === 'none' ||
w[1].attribute?.close_on_unfocus === 'stay'); w[1].attribute.close_on_unfocus === 'stay');
return w[1].visible && closable; return w[1].visible && closable;
}); });
@ -137,7 +137,7 @@ class Pointers extends Service {
const toClose = (Array.from(App.windows) as Array<[string, AgsWindow]>) const toClose = (Array.from(App.windows) as Array<[string, AgsWindow]>)
.some((w) => { .some((w) => {
const closable = (w[1].attribute?.close_on_unfocus && const closable = (w[1].attribute?.close_on_unfocus &&
w[1].attribute?.close_on_unfocus === clickStage); w[1].attribute.close_on_unfocus === clickStage);
return w[1].visible && closable; return w[1].visible && closable;
}); });
@ -153,38 +153,61 @@ class Pointers extends Service {
const pos = JSON.parse(res) as CursorPos; const pos = JSON.parse(res) as CursorPos;
Object.values(layers).forEach((key) => { Object.values(layers).forEach((key) => {
const bar = key.levels['3']?.find( const overlayLayer = key.levels['3'];
(n) => n.namespace === 'bar',
) ||
// Return an empty Layer if bar doesn't exist
{ address: '', x: 0, y: 0, w: 0, h: 0, namespace: '' };
const widgets = key.levels['3']?.filter( if (overlayLayer) {
(n) => { const noCloseWidgetsNames = ['bar', 'osk'];
const getNoCloseWidgets = (names: Array<string>) => {
const arr = [] as Array<Layer>;
names.forEach((name) => {
arr.push(
overlayLayer.find(
(n) => n.namespace === name,
) ||
// Return an empty Layer if widget doesn't exist
{
address: '',
x: 0, y: 0, w: 0, h: 0,
namespace: '',
},
);
});
return arr;
};
const clickIsOnWidget = (w: Layer) => {
return pos.x > w.x && pos.x < w.x + w.w &&
pos.y > w.y && pos.y < w.y + w.h;
};
const noCloseWidgets =
getNoCloseWidgets(noCloseWidgetsNames);
const widgets = overlayLayer.filter((n) => {
const window = const window =
(App.getWindow(n.namespace) as AgsWindow); (App.getWindow(n.namespace) as AgsWindow);
return window?.attribute?.close_on_unfocus && return window &&
window?.attribute window.attribute?.close_on_unfocus &&
?.close_on_unfocus === clickStage; window.attribute?.close_on_unfocus ===
}, clickStage;
); });
if (pos.x > bar?.x && pos.x < bar?.x + bar?.w && if (noCloseWidgets.some(clickIsOnWidget)) {
pos.y > bar?.y && pos.y < bar?.y + bar?.h) { // Don't handle clicks when on certain widgets
}
// Don't handle clicks when on bar else {
// TODO: make this configurable widgets?.forEach(
} (w) => {
else { if (!(pos.x > w.x && pos.x < w.x + w.w &&
widgets?.forEach( pos.y > w.y && pos.y < w.y + w.h)) {
(w) => { App.closeWindow(w.namespace);
if (!(pos.x > w.x && pos.x < w.x + w.w && }
pos.y > w.y && pos.y < w.y + w.h)) { },
App.closeWindow(w.namespace); );
} }
},
);
} }
}); });
}).catch(print); }).catch(print);

View file

@ -14,6 +14,7 @@ export default () => {
const window = Window({ const window = Window({
name: 'osk', name: 'osk',
visible: false, visible: false,
layer: 'overlay',
anchor: ['left', 'bottom', 'right'], anchor: ['left', 'bottom', 'right'],
setup: (self) => { setup: (self) => {