115 lines
3.5 KiB
JavaScript
115 lines
3.5 KiB
JavaScript
import Widget from 'resource:///com/github/Aylur/ags/widget.js';
|
|
import Hyprland from 'resource:///com/github/Aylur/ags/service/hyprland.js';
|
|
|
|
|
|
const prefix = "100" // Identifier for minimized workspace
|
|
|
|
function getMinimizedWS(maximizedWS){
|
|
return parseInt(prefix + maximizedWS)
|
|
}
|
|
|
|
function getMaximizedWS(minimizedWS){
|
|
return parseInt(minimizedWS.toString().substring(prefix.length))
|
|
}
|
|
|
|
function isMinimized(ws){
|
|
ws = ws.toString()
|
|
if (ws.length > 3 || ws.slice(0, prefix.length) == prefix){
|
|
return true
|
|
}
|
|
else{
|
|
return false
|
|
}
|
|
}
|
|
|
|
|
|
const focusClient = (client) => {
|
|
|
|
// If minimized
|
|
if (isMinimized(client.workspace.id)){
|
|
var maximizedWS = getMaximizedWS(client.workspace.id)
|
|
Hyprland.messageAsync(`dispatch movetoworkspacesilent ${maximizedWS},address:${client.address}`)
|
|
// Focus window
|
|
//Hyprland.messageAsync(`dispatch focuswindow address:${client.address}`)
|
|
Hyprland.messageAsync(`dispatch alterzorder top,address:${client.address}`)
|
|
}
|
|
|
|
// If maximized
|
|
else{
|
|
var minimizedWS = getMinimizedWS(client.workspace.id)
|
|
Hyprland.messageAsync(`dispatch movetoworkspacesilent ${minimizedWS},address:${client.address}`)
|
|
}
|
|
|
|
}
|
|
|
|
const Client = (client = null) => Widget.Box({
|
|
// Attributes
|
|
attribute: {
|
|
returnWS: client.workspace,
|
|
},
|
|
})
|
|
|
|
|
|
const appButton = (client = null) => Widget.Button({
|
|
class_name: "dock-button",
|
|
tooltip_text: client.title,
|
|
on_primary_click: () => focusClient(client),
|
|
child: Widget.Box({
|
|
vertical: true,
|
|
children: [
|
|
Widget.Box({
|
|
children: [
|
|
Widget.Box({
|
|
class_name: "dock-app-indicator",
|
|
vpack: "center",
|
|
setup: (self) => {
|
|
self.hook(Hyprland, () => {
|
|
//self.toggleClassName("dock-button-current", Hyprland.active.client.address === client.address)
|
|
self.toggleClassName("dock-app-indicator-active", Hyprland.active.client.address === client.address)
|
|
}, 'event')
|
|
}
|
|
}),
|
|
/*
|
|
Widget.Icon({
|
|
class_name: 'client-icon',
|
|
css: 'font-size: 3rem;',
|
|
icon: client.class,
|
|
}),
|
|
*/
|
|
],
|
|
}),
|
|
Widget.Label({
|
|
label: client.class,
|
|
truncate: 'end',
|
|
maxWidthChars: 8,
|
|
})
|
|
],
|
|
}),
|
|
});
|
|
|
|
const clientList = Widget.Scrollable({
|
|
hscroll: "never",
|
|
child: Widget.Box({
|
|
class_name: "dock-container",
|
|
css: "min-height: 6rem;",
|
|
css: "min-width: 6rem;",
|
|
vertical: true,
|
|
}).hook(Hyprland, self => {
|
|
//check if ws is empty
|
|
self.children = Hyprland.clients.filter(client => client.class != "" && (client.workspace.id === Hyprland.active.workspace.id || client.workspace.id === getMinimizedWS(Hyprland.active.workspace.id))).map(client => {
|
|
return appButton(client)
|
|
})
|
|
})
|
|
})
|
|
|
|
export const Dock = (monitor = 0) => Widget.Window({
|
|
name: `Dock`, // name has to be unique
|
|
monitor,
|
|
visible: false,
|
|
//margins: [4,64,4,64],
|
|
//margins: [8,8,8,8],
|
|
anchor: ['bottom', 'left', 'top'],
|
|
exclusivity: 'exclusive',
|
|
child: clientList,
|
|
});
|