73 lines
2.2 KiB
JavaScript
73 lines
2.2 KiB
JavaScript
import App from 'resource:///com/github/Aylur/ags/app.js';
|
|
import { EventBox } from 'resource:///com/github/Aylur/ags/widget.js';
|
|
import { execAsync } from 'resource:///com/github/Aylur/ags/utils.js';
|
|
|
|
import Gtk from 'gi://Gtk';
|
|
import Gdk from 'gi://Gdk';
|
|
import Cairo from 'cairo';
|
|
|
|
import Button from '../misc/cursorbox.js';
|
|
import { updateClients } from './clients.js';
|
|
|
|
const TARGET = [Gtk.TargetEntry.new('text/plain', Gtk.TargetFlags.SAME_APP, 0)];
|
|
|
|
|
|
function 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;
|
|
export const WorkspaceDrop = props => EventBox({
|
|
...props,
|
|
connections: [['drag-data-received', (self, _c, _x, _y, data) => {
|
|
let id = self.get_parent()._id;
|
|
|
|
if (id < -1)
|
|
id = self.get_parent()._name;
|
|
|
|
else if (id === -1)
|
|
id = `special:${++hidden}`;
|
|
|
|
else if (id === 1000)
|
|
id = 'empty';
|
|
|
|
execAsync(`hyprctl dispatch movetoworkspacesilent ${id},address:${data.get_text()}`)
|
|
.catch(print);
|
|
}]],
|
|
setup: self => {
|
|
self.drag_dest_set(Gtk.DestDefaults.ALL, TARGET, Gdk.DragAction.COPY);
|
|
},
|
|
});
|
|
|
|
export const WindowButton = ({ address, ...props } = {}) => Button({
|
|
isButton: true,
|
|
...props,
|
|
setup: self => {
|
|
self.drag_source_set(Gdk.ModifierType.BUTTON1_MASK, TARGET, Gdk.DragAction.COPY);
|
|
self.connect('drag-data-get', (_w, _c, data) => {
|
|
data.set_text(address, address.length);
|
|
});
|
|
self.connect('drag-begin', (_, context) => {
|
|
Gtk.drag_set_icon_surface(context, createSurfaceFromWidget(self));
|
|
self.get_parent().revealChild = false;
|
|
});
|
|
self.connect('drag-end', () => {
|
|
self.get_parent().destroy();
|
|
|
|
const mainBox = App.getWindow('overview').getChild();
|
|
updateClients(mainBox.child);
|
|
});
|
|
},
|
|
});
|