126 lines
3.3 KiB
JavaScript
126 lines
3.3 KiB
JavaScript
import Hyprland from 'resource:///com/github/Aylur/ags/service/hyprland.js';
|
|
|
|
import { Button, EventBox } from 'resource:///com/github/Aylur/ags/widget.js';
|
|
|
|
import Cairo from 'cairo';
|
|
const { Gtk, Gdk } = imports.gi;
|
|
|
|
import { updateClients } from './clients.js';
|
|
|
|
const TARGET = [Gtk.TargetEntry.new('text/plain', Gtk.TargetFlags.SAME_APP, 0)];
|
|
const display = Gdk.Display.get_default();
|
|
|
|
/**
|
|
* @typedef {import('types/widgets/button').default} Button
|
|
* @typedef {import('types/widgets/button').ButtonProps} ButtonProps
|
|
* @typedef {import('types/widgets/eventbox').EventBoxProps=} EventBoxProps
|
|
* @typedef {import('types/widgets/box').default} Box
|
|
*/
|
|
|
|
|
|
/** @param {Button} widget */
|
|
const createSurfaceFromWidget = (widget) => {
|
|
const alloc = widget.get_allocation();
|
|
const surface = new Cairo.ImageSurface(
|
|
Cairo.Format.ARGB32,
|
|
alloc.width,
|
|
alloc.height,
|
|
);
|
|
const cr = new Cairo.Context(surface);
|
|
|
|
cr.setSourceRGBA(255, 255, 255, 0);
|
|
cr.rectangle(0, 0, alloc.width, alloc.height);
|
|
cr.fill();
|
|
widget.draw(cr);
|
|
|
|
return surface;
|
|
};
|
|
|
|
let hidden = 0;
|
|
|
|
/** @params {EventBoxProps} props */
|
|
export const WorkspaceDrop = ({ ...props }) => EventBox({
|
|
...props,
|
|
setup: (self) => {
|
|
self.drag_dest_set(Gtk.DestDefaults.ALL, TARGET, Gdk.DragAction.COPY);
|
|
|
|
self.on('drag-data-received', (_, _c, _x, _y, data) => {
|
|
// @ts-expect-error
|
|
let id = self.get_parent()?.attribute.id;
|
|
|
|
if (id < -1) {
|
|
// @ts-expect-error
|
|
id = self.get_parent()?.attribute.name;
|
|
}
|
|
|
|
else if (id === -1) {
|
|
id = `special:${++hidden}`;
|
|
}
|
|
|
|
else if (id === 1000) {
|
|
id = 'empty';
|
|
}
|
|
|
|
Hyprland.sendMessage('dispatch ' +
|
|
`movetoworkspacesilent ${id},address:${data.get_text()}`)
|
|
.catch(print);
|
|
});
|
|
},
|
|
});
|
|
|
|
/**
|
|
* @param {ButtonProps & {
|
|
* address: string
|
|
* mainBox: Box
|
|
* }} o
|
|
*/
|
|
export const WindowButton = ({
|
|
address,
|
|
mainBox,
|
|
...props
|
|
}) => Button({
|
|
...props,
|
|
|
|
setup: (self) => {
|
|
self.drag_source_set(
|
|
Gdk.ModifierType.BUTTON1_MASK,
|
|
TARGET,
|
|
Gdk.DragAction.COPY,
|
|
);
|
|
|
|
self
|
|
.on('drag-data-get', (_w, _c, data) => {
|
|
data.set_text(address, address.length);
|
|
})
|
|
|
|
.on('drag-begin', (_, context) => {
|
|
Gtk.drag_set_icon_surface(
|
|
context,
|
|
createSurfaceFromWidget(self),
|
|
);
|
|
// @ts-expect-error
|
|
self.get_parent()?.set_reveal_child(false);
|
|
})
|
|
|
|
.on('drag-end', () => {
|
|
self.get_parent()?.destroy();
|
|
|
|
updateClients(mainBox);
|
|
})
|
|
|
|
// OnHover
|
|
.on('enter-notify-event', () => {
|
|
self.window.set_cursor(Gdk.Cursor.new_from_name(
|
|
display,
|
|
'pointer',
|
|
));
|
|
self.toggleClassName('hover', true);
|
|
})
|
|
|
|
// OnHoverLost
|
|
.on('leave-notify-event', () => {
|
|
self.window.set_cursor(null);
|
|
self.toggleClassName('hover', false);
|
|
});
|
|
},
|
|
});
|