diff --git a/.config/ags/modules/.miscutils/mathfuncs.js b/.config/ags/modules/.miscutils/mathfuncs.js index 966eede6..7a7c1da6 100644 --- a/.config/ags/modules/.miscutils/mathfuncs.js +++ b/.config/ags/modules/.miscutils/mathfuncs.js @@ -7,4 +7,10 @@ export function truncateToPrecision(value, precision) { const factor = Math.pow(10, precision); const result = Math.round(value * factor) / factor; return result; +} + +export function distance(x1, y1, x2, y2) { + const distanceX = Math.abs(x1 - x2); + const distanceY = Math.abs(y1 - y2); + return Math.sqrt(distanceX * distanceX + distanceY * distanceY) } \ No newline at end of file diff --git a/.config/ags/modules/bar/normal/spaceleft.js b/.config/ags/modules/bar/normal/spaceleft.js index 7bfb40d3..377d64cd 100644 --- a/.config/ags/modules/bar/normal/spaceleft.js +++ b/.config/ags/modules/bar/normal/spaceleft.js @@ -2,6 +2,9 @@ import App from 'resource:///com/github/Aylur/ags/app.js'; import Widget from 'resource:///com/github/Aylur/ags/widget.js'; import Brightness from '../../../services/brightness.js'; import Indicator from '../../../services/indicator.js'; +import { distance } from '../../.miscutils/mathfuncs.js'; + +const OSD_DISMISS_DISTANCE = 10; const WindowTitle = async () => { try { @@ -41,18 +44,28 @@ const WindowTitle = async () => { export default async (monitor = 0) => { const optionalWindowTitleInstance = await WindowTitle(); + let scrollCursorX, scrollCursorY; return Widget.EventBox({ - onScrollUp: () => { + onScrollUp: (self, event) => { + let _; + [_, scrollCursorX, scrollCursorY] = event.get_coords(); Indicator.popup(1); // Since the brightness and speaker are both on the same window Brightness[monitor].screen_value += 0.05; }, - onScrollDown: () => { + onScrollDown: (self, event) => { + let _; + [_, scrollCursorX, scrollCursorY] = event.get_coords(); Indicator.popup(1); // Since the brightness and speaker are both on the same window Brightness[monitor].screen_value -= 0.05; }, onPrimaryClick: () => { App.toggleWindow('sideleft'); }, + setup: (self) => self.on('motion-notify-event', (self, event) => { + const [_, cursorX, cursorY] = event.get_coords(); + if (distance(cursorX, cursorY, scrollCursorX, scrollCursorY) >= OSD_DISMISS_DISTANCE) + Indicator.popup(-1); + }), child: Widget.Box({ homogeneous: false, children: [ diff --git a/.config/ags/modules/bar/normal/spaceright.js b/.config/ags/modules/bar/normal/spaceright.js index 62666389..dd23de33 100644 --- a/.config/ags/modules/bar/normal/spaceright.js +++ b/.config/ags/modules/bar/normal/spaceright.js @@ -8,6 +8,9 @@ const { execAsync } = Utils; import Indicator from '../../../services/indicator.js'; import { StatusIcons } from '../../.commonwidgets/statusicons.js'; import { Tray } from "./tray.js"; +import { distance } from '../../.miscutils/mathfuncs.js'; + +const OSD_DISMISS_DISTANCE = 10; const SeparatorDot = () => Widget.Revealer({ transition: 'slide_left', @@ -39,7 +42,7 @@ export default (monitor = 0) => { } }), }, monitor); - const SpaceRightDefaultClicks = (child) => Widget.EventBox({ + const SpaceRightInteractions = (child) => Widget.EventBox({ onHover: () => { barStatusIcons.toggleClassName('bar-statusicons-hover', true) }, onHoverLost: () => { barStatusIcons.toggleClassName('bar-statusicons-hover', false) }, onPrimaryClick: () => App.toggleWindow('sideright'), @@ -48,11 +51,13 @@ export default (monitor = 0) => { setup: (self) => self.on('button-press-event', (self, event) => { if (event.get_button()[1] === 8) execAsync('playerctl previous').catch(print) + }).on('motion-notify-event', (self, event) => { + Indicator.popup(-1); }), child: child, }); - const emptyArea = SpaceRightDefaultClicks(Widget.Box({ hexpand: true, })); - const indicatorArea = SpaceRightDefaultClicks(Widget.Box({ + const emptyArea = SpaceRightInteractions(Widget.Box({ hexpand: true, })); + const indicatorArea = SpaceRightInteractions(Widget.Box({ children: [ SeparatorDot(), barStatusIcons @@ -68,23 +73,33 @@ export default (monitor = 0) => { ], }); + let scrollCursorX, scrollCursorY; return Widget.EventBox({ - onScrollUp: () => { + onScrollUp: (self, event) => { if (!Audio.speaker) return; + let _; + [_, scrollCursorX, scrollCursorY] = event.get_coords(); if (Audio.speaker.volume <= 0.09) Audio.speaker.volume += 0.01; else Audio.speaker.volume += 0.03; Indicator.popup(1); }, - onScrollDown: () => { + onScrollDown: (self, event) => { if (!Audio.speaker) return; + let _; + [_, scrollCursorX, scrollCursorY] = event.get_coords(); if (Audio.speaker.volume <= 0.09) Audio.speaker.volume -= 0.01; else Audio.speaker.volume -= 0.03; Indicator.popup(1); }, + setup: (self) => self.on('motion-notify-event', (self, event) => { + const [_, cursorX, cursorY] = event.get_coords(); + if (distance(cursorX, cursorY, scrollCursorX, scrollCursorY) >= OSD_DISMISS_DISTANCE) + Indicator.popup(-1); + }), child: Widget.Box({ children: [ actualContent, - SpaceRightDefaultClicks(Widget.Box({ className: 'bar-corner-spacing' })), + SpaceRightInteractions(Widget.Box({ className: 'bar-corner-spacing' })), ] }) });