feat(ags): use experimental clipboard manager
This commit is contained in:
parent
5fd6448ba2
commit
f4618c3271
10 changed files with 243 additions and 112 deletions
modules/ags/config/ts/clipboard
110
modules/ags/config/ts/clipboard/main.ts
Normal file
110
modules/ags/config/ts/clipboard/main.ts
Normal file
|
@ -0,0 +1,110 @@
|
|||
const { Box, Icon, Label, ListBox, Scrollable } = Widget;
|
||||
const { execAsync } = Utils;
|
||||
|
||||
import Gtk from 'gi://Gtk?version=3.0';
|
||||
|
||||
import CursorBox from '../misc/cursorbox.ts';
|
||||
import PopupWindow from '../misc/popup.ts';
|
||||
|
||||
|
||||
const N_ITEMS = 30;
|
||||
|
||||
export default () => {
|
||||
const list = ListBox();
|
||||
|
||||
list.set_sort_func((row1, row2) => {
|
||||
const getKey = (r: Gtk.ListBoxRow) => parseInt(r.get_child()?.name ?? '');
|
||||
|
||||
return getKey(row2) - getKey(row1);
|
||||
});
|
||||
|
||||
const updateItems = () => {
|
||||
(list.get_children() as Gtk.ListBoxRow[]).forEach((r) => {
|
||||
r.changed();
|
||||
});
|
||||
};
|
||||
|
||||
const makeItem = (key: string, val: string) => {
|
||||
const widget = CursorBox({
|
||||
class_name: 'item',
|
||||
name: key,
|
||||
|
||||
on_primary_click_release: () => {
|
||||
execAsync([
|
||||
'bash', '-c', `cliphist list | grep ${key} | cliphist decode | wl-copy`,
|
||||
]).then(() => {
|
||||
App.closeWindow('win-clipboard');
|
||||
});
|
||||
},
|
||||
|
||||
child: Box({
|
||||
children: [
|
||||
val.startsWith('img:') ?
|
||||
Icon({
|
||||
icon: val.replace('img:', ''),
|
||||
size: 100 * 2,
|
||||
}) :
|
||||
|
||||
Label({
|
||||
label: val,
|
||||
truncate: 'end',
|
||||
max_width_chars: 100,
|
||||
}),
|
||||
],
|
||||
}),
|
||||
});
|
||||
|
||||
list.add(widget);
|
||||
widget.show_all();
|
||||
updateItems();
|
||||
};
|
||||
|
||||
// Decode old item:
|
||||
const decodeItem = (index: string) => {
|
||||
execAsync([
|
||||
'bash', '-c', `cliphist list | grep ${index} | cliphist decode`,
|
||||
]).then((out) => {
|
||||
makeItem(index, out);
|
||||
});
|
||||
};
|
||||
|
||||
const on_open = () => {
|
||||
execAsync('clipboard-manager').then((out) => {
|
||||
list.get_children()?.forEach((ch) => {
|
||||
ch.destroy();
|
||||
});
|
||||
|
||||
const items = out.split('\n');
|
||||
|
||||
for (let i = 0; i < N_ITEMS; ++i) {
|
||||
if (items[i].includes('img')) {
|
||||
makeItem((items[i].match('[0-9]+') ?? [''])[0], items[i]);
|
||||
}
|
||||
else {
|
||||
decodeItem(items[i]);
|
||||
}
|
||||
}
|
||||
}).catch(console.log);
|
||||
};
|
||||
|
||||
on_open();
|
||||
|
||||
return PopupWindow({
|
||||
name: 'clipboard',
|
||||
on_open,
|
||||
|
||||
child: Box({
|
||||
class_name: 'clipboard',
|
||||
children: [
|
||||
Scrollable({
|
||||
hscroll: 'never',
|
||||
vscroll: 'automatic',
|
||||
child: Box({
|
||||
vertical: true,
|
||||
children: [list],
|
||||
}),
|
||||
}),
|
||||
],
|
||||
}),
|
||||
});
|
||||
};
|
Loading…
Add table
Add a link
Reference in a new issue