2023-10-31 08:32:40 -04:00
|
|
|
import Applications from 'resource:///com/github/Aylur/ags/service/applications.js';
|
2023-11-13 13:19:14 -05:00
|
|
|
import Hyprland from 'resource:///com/github/Aylur/ags/service/hyprland.js';
|
2023-11-03 15:28:08 -04:00
|
|
|
import Notifications from 'resource:///com/github/Aylur/ags/service/notifications.js';
|
2023-11-21 01:29:46 -05:00
|
|
|
import Variable from 'resource:///com/github/Aylur/ags/variable.js';
|
|
|
|
|
2023-10-31 08:32:40 -04:00
|
|
|
import { Box, Icon, Label, Button } from 'resource:///com/github/Aylur/ags/widget.js';
|
2023-11-13 13:19:14 -05:00
|
|
|
import { lookUpIcon } from 'resource:///com/github/Aylur/ags/utils.js';
|
2023-10-02 12:06:35 -04:00
|
|
|
|
|
|
|
import GLib from 'gi://GLib';
|
2023-09-11 13:59:51 -04:00
|
|
|
|
2023-11-21 01:29:46 -05:00
|
|
|
const setTime = (time) => {
|
2023-10-20 23:11:21 -04:00
|
|
|
return GLib.DateTime
|
|
|
|
.new_from_unix_local(time)
|
|
|
|
.format('%H:%M');
|
2023-10-17 13:47:02 -04:00
|
|
|
};
|
|
|
|
|
2023-11-21 01:29:46 -05:00
|
|
|
const getDragState = (box) => box.get_parent().get_parent()
|
2023-10-20 23:11:21 -04:00
|
|
|
.get_parent().get_parent().get_parent()._dragging;
|
2023-10-17 13:47:02 -04:00
|
|
|
|
2023-10-16 18:43:12 -04:00
|
|
|
import Gesture from './gesture.js';
|
2023-10-20 23:11:21 -04:00
|
|
|
import EventBox from '../misc/cursorbox.js';
|
2023-09-11 13:59:51 -04:00
|
|
|
|
2023-10-02 12:06:35 -04:00
|
|
|
|
2023-11-21 01:29:46 -05:00
|
|
|
const NotificationIcon = (notif) => {
|
|
|
|
let iconCmd = () => { /**/ };
|
2023-10-20 23:11:21 -04:00
|
|
|
|
|
|
|
if (Applications.query(notif.appEntry).length > 0) {
|
|
|
|
const app = Applications.query(notif.appEntry)[0];
|
|
|
|
|
|
|
|
let wmClass = app.app.get_string('StartupWMClass');
|
2023-11-21 01:29:46 -05:00
|
|
|
|
|
|
|
if (app.app.get_filename().includes('discord')) {
|
2023-10-20 23:11:21 -04:00
|
|
|
wmClass = 'discord';
|
2023-11-21 01:29:46 -05:00
|
|
|
}
|
2023-10-20 23:11:21 -04:00
|
|
|
|
|
|
|
if (wmClass != null) {
|
2023-11-21 01:29:46 -05:00
|
|
|
iconCmd = (box) => {
|
2023-10-20 23:11:21 -04:00
|
|
|
if (!getDragState(box)) {
|
2023-11-13 13:19:14 -05:00
|
|
|
if (wmClass === 'thunderbird') {
|
2023-11-21 01:29:46 -05:00
|
|
|
Hyprland.sendMessage('dispatch ' +
|
|
|
|
'togglespecialworkspace thunder');
|
2023-11-13 13:19:14 -05:00
|
|
|
}
|
|
|
|
else if (wmClass === 'Spotify') {
|
2023-11-21 01:29:46 -05:00
|
|
|
Hyprland.sendMessage('dispatch ' +
|
|
|
|
'togglespecialworkspace spot');
|
2023-11-13 13:19:14 -05:00
|
|
|
}
|
|
|
|
else {
|
2023-11-21 01:29:46 -05:00
|
|
|
Hyprland.sendMessage('j/clients').then((out) => {
|
2023-11-13 13:19:14 -05:00
|
|
|
out = JSON.parse(out);
|
|
|
|
const classes = [];
|
2023-11-21 01:29:46 -05:00
|
|
|
|
2023-11-13 13:19:14 -05:00
|
|
|
for (const key of out) {
|
2023-11-21 01:29:46 -05:00
|
|
|
if (key.class) {
|
2023-11-13 13:19:14 -05:00
|
|
|
classes.push(key.class);
|
2023-11-21 01:29:46 -05:00
|
|
|
}
|
2023-11-13 13:19:14 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
if (classes.includes(wmClass)) {
|
2023-11-21 01:29:46 -05:00
|
|
|
Hyprland.sendMessage('dispatch ' +
|
|
|
|
`focuswindow ^(${wmClass})`);
|
2023-11-13 13:19:14 -05:00
|
|
|
}
|
|
|
|
else {
|
|
|
|
Hyprland.sendMessage('[[BATCH]] ' +
|
|
|
|
'dispatch workspace empty; ' +
|
|
|
|
`dispatch exec sh -c ${app.executable}
|
|
|
|
`);
|
|
|
|
}
|
|
|
|
});
|
|
|
|
}
|
2023-10-20 23:11:21 -04:00
|
|
|
|
|
|
|
globalThis.closeAll();
|
|
|
|
}
|
|
|
|
};
|
|
|
|
}
|
|
|
|
}
|
2023-09-15 15:49:43 -04:00
|
|
|
|
2023-10-20 23:11:21 -04:00
|
|
|
if (notif.image) {
|
|
|
|
return EventBox({
|
|
|
|
onPrimaryClickRelease: iconCmd,
|
2023-11-21 01:29:46 -05:00
|
|
|
|
2023-10-20 23:11:21 -04:00
|
|
|
child: Box({
|
2023-11-06 20:10:12 -05:00
|
|
|
vpack: 'start',
|
2023-10-20 23:11:21 -04:00
|
|
|
hexpand: false,
|
|
|
|
className: 'icon img',
|
2023-11-06 20:10:12 -05:00
|
|
|
css: `
|
|
|
|
background-image: url("${notif.image}");
|
|
|
|
background-size: contain;
|
|
|
|
background-repeat: no-repeat;
|
|
|
|
background-position: center;
|
|
|
|
min-width: 78px;
|
|
|
|
min-height: 78px;
|
|
|
|
`,
|
2023-10-20 23:11:21 -04:00
|
|
|
}),
|
|
|
|
});
|
|
|
|
}
|
2023-09-15 15:49:43 -04:00
|
|
|
|
2023-10-20 23:11:21 -04:00
|
|
|
let icon = 'dialog-information-symbolic';
|
2023-11-21 01:29:46 -05:00
|
|
|
|
|
|
|
if (lookUpIcon(notif.appIcon)) {
|
2023-10-20 23:11:21 -04:00
|
|
|
icon = notif.appIcon;
|
2023-11-21 01:29:46 -05:00
|
|
|
}
|
2023-10-17 13:47:02 -04:00
|
|
|
|
|
|
|
|
2023-11-21 01:29:46 -05:00
|
|
|
if (lookUpIcon(notif.appEntry)) {
|
2023-10-20 23:11:21 -04:00
|
|
|
icon = notif.appEntry;
|
2023-11-21 01:29:46 -05:00
|
|
|
}
|
2023-10-20 23:11:21 -04:00
|
|
|
|
2023-09-15 15:49:43 -04:00
|
|
|
|
|
|
|
return EventBox({
|
2023-10-20 23:11:21 -04:00
|
|
|
onPrimaryClickRelease: iconCmd,
|
2023-11-21 01:29:46 -05:00
|
|
|
|
2023-10-20 23:11:21 -04:00
|
|
|
child: Box({
|
2023-11-06 20:10:12 -05:00
|
|
|
vpack: 'start',
|
2023-10-20 23:11:21 -04:00
|
|
|
hexpand: false,
|
|
|
|
className: 'icon',
|
2023-11-21 01:29:46 -05:00
|
|
|
css: `
|
|
|
|
min-width: 78px;
|
|
|
|
min-height: 78px;
|
|
|
|
`,
|
2023-10-20 23:11:21 -04:00
|
|
|
children: [Icon({
|
|
|
|
icon, size: 58,
|
2023-11-06 20:10:12 -05:00
|
|
|
hpack: 'center',
|
2023-10-20 23:11:21 -04:00
|
|
|
hexpand: true,
|
2023-11-06 20:10:12 -05:00
|
|
|
vpack: 'center',
|
2023-10-20 23:11:21 -04:00
|
|
|
vexpand: true,
|
|
|
|
})],
|
|
|
|
}),
|
2023-09-11 13:59:51 -04:00
|
|
|
});
|
|
|
|
};
|
|
|
|
|
2023-11-03 15:28:08 -04:00
|
|
|
// Make a variable to connect to for Widgets
|
|
|
|
// to know when there are notifs or not
|
|
|
|
export const HasNotifs = Variable(false);
|
|
|
|
|
|
|
|
export const Notification = ({
|
2023-10-28 13:04:35 -04:00
|
|
|
notif,
|
2023-11-03 15:28:08 -04:00
|
|
|
slideIn = 'Left',
|
2023-11-21 01:29:46 -05:00
|
|
|
command = () => { /**/ },
|
2023-10-28 13:04:35 -04:00
|
|
|
} = {}) => {
|
2023-11-21 01:29:46 -05:00
|
|
|
if (!notif) {
|
2023-11-03 15:28:08 -04:00
|
|
|
return;
|
2023-11-21 01:29:46 -05:00
|
|
|
}
|
2023-11-03 15:28:08 -04:00
|
|
|
|
2023-10-20 23:11:21 -04:00
|
|
|
const BlockedApps = [
|
|
|
|
'Spotify',
|
|
|
|
];
|
|
|
|
|
2023-11-21 01:29:46 -05:00
|
|
|
if (BlockedApps.find((app) => app === notif.appName)) {
|
2023-10-20 23:11:21 -04:00
|
|
|
notif.close();
|
2023-11-21 01:29:46 -05:00
|
|
|
|
2023-10-20 23:11:21 -04:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2023-11-21 01:29:46 -05:00
|
|
|
HasNotifs.value = Notifications.notifications.length > 0;
|
|
|
|
|
2023-11-03 15:28:08 -04:00
|
|
|
// Init notif
|
|
|
|
const notifWidget = Gesture({
|
2023-11-06 20:10:12 -05:00
|
|
|
command,
|
2023-11-03 15:28:08 -04:00
|
|
|
slideIn,
|
2023-11-06 20:10:12 -05:00
|
|
|
id: notif.id,
|
2023-11-03 15:28:08 -04:00
|
|
|
});
|
|
|
|
|
|
|
|
// Add body to notif
|
|
|
|
notifWidget.child.add(Box({
|
|
|
|
className: `notification ${notif.urgency}`,
|
|
|
|
vexpand: false,
|
2023-11-21 01:29:46 -05:00
|
|
|
|
2023-11-03 15:28:08 -04:00
|
|
|
// Notification
|
2023-10-20 23:11:21 -04:00
|
|
|
child: Box({
|
2023-11-03 15:28:08 -04:00
|
|
|
vertical: true,
|
|
|
|
children: [
|
2023-11-21 01:29:46 -05:00
|
|
|
|
2023-11-03 15:28:08 -04:00
|
|
|
// Content
|
|
|
|
Box({
|
|
|
|
children: [
|
|
|
|
NotificationIcon(notif),
|
|
|
|
Box({
|
|
|
|
hexpand: true,
|
|
|
|
vertical: true,
|
|
|
|
children: [
|
2023-11-21 01:29:46 -05:00
|
|
|
|
2023-11-03 15:28:08 -04:00
|
|
|
// Top of Content
|
|
|
|
Box({
|
|
|
|
children: [
|
2023-11-21 01:29:46 -05:00
|
|
|
|
|
|
|
// Title
|
2023-11-03 15:28:08 -04:00
|
|
|
Label({
|
|
|
|
className: 'title',
|
|
|
|
xalign: 0,
|
|
|
|
justification: 'left',
|
|
|
|
hexpand: true,
|
|
|
|
maxWidthChars: 24,
|
|
|
|
truncate: 'end',
|
|
|
|
wrap: true,
|
|
|
|
label: notif.summary,
|
2023-11-21 01:29:46 -05:00
|
|
|
useMarkup: notif.summary
|
|
|
|
.startsWith('<'),
|
2023-11-03 15:28:08 -04:00
|
|
|
}),
|
2023-11-21 01:29:46 -05:00
|
|
|
|
|
|
|
// Time
|
2023-11-03 15:28:08 -04:00
|
|
|
Label({
|
|
|
|
className: 'time',
|
2023-11-06 20:10:12 -05:00
|
|
|
vpack: 'start',
|
2023-11-03 15:28:08 -04:00
|
|
|
label: setTime(notif.time),
|
|
|
|
}),
|
2023-11-21 01:29:46 -05:00
|
|
|
|
|
|
|
// Close button
|
2023-11-03 15:28:08 -04:00
|
|
|
EventBox({
|
|
|
|
child: Button({
|
|
|
|
className: 'close-button',
|
2023-11-06 20:10:12 -05:00
|
|
|
vpack: 'start',
|
2023-11-03 15:28:08 -04:00
|
|
|
onClicked: () => notif.close(),
|
2023-11-21 01:29:46 -05:00
|
|
|
child: Icon('window-close' +
|
|
|
|
'-symbolic'),
|
2023-10-20 23:11:21 -04:00
|
|
|
}),
|
2023-11-03 15:28:08 -04:00
|
|
|
}),
|
|
|
|
],
|
|
|
|
}),
|
2023-11-21 01:29:46 -05:00
|
|
|
|
|
|
|
// Description
|
2023-11-03 15:28:08 -04:00
|
|
|
Label({
|
|
|
|
className: 'description',
|
|
|
|
hexpand: true,
|
|
|
|
useMarkup: true,
|
|
|
|
xalign: 0,
|
|
|
|
justification: 'left',
|
|
|
|
label: notif.body,
|
|
|
|
wrap: true,
|
|
|
|
}),
|
|
|
|
],
|
|
|
|
}),
|
|
|
|
],
|
|
|
|
}),
|
2023-11-21 01:29:46 -05:00
|
|
|
|
2023-11-03 15:28:08 -04:00
|
|
|
// Actions
|
|
|
|
Box({
|
|
|
|
className: 'actions',
|
2023-11-21 01:29:46 -05:00
|
|
|
children: notif.actions.map((action) => Button({
|
2023-11-03 15:28:08 -04:00
|
|
|
className: 'action-button',
|
|
|
|
onClicked: () => notif.invoke(action.id),
|
|
|
|
hexpand: true,
|
|
|
|
child: Label(action.label),
|
|
|
|
})),
|
|
|
|
}),
|
|
|
|
],
|
2023-10-20 23:11:21 -04:00
|
|
|
}),
|
2023-11-03 15:28:08 -04:00
|
|
|
}));
|
2023-11-21 01:29:46 -05:00
|
|
|
|
2023-11-03 15:28:08 -04:00
|
|
|
return notifWidget;
|
2023-09-19 10:22:08 -04:00
|
|
|
};
|