import options from 'src/options';
import { forceUpdater, getWorkspacesToRender, initWorkspaceEvents, workspaceRules } from './helpers';
import { getAppIcon, getWsColor, renderClassnames, renderLabel } from './helpers/utils';
import { ApplicationIcons, WorkspaceIconMap } from 'src/lib/types/workspace';
import { bind, Variable } from 'astal';
import AstalHyprland from 'gi://AstalHyprland?version=0.1';
import { Gtk } from 'astal/gtk3';
import { isPrimaryClick } from 'src/lib/utils';
const hyprlandService = AstalHyprland.get_default();
const {
workspaces,
monitorSpecific,
workspaceMask,
spacing,
ignored,
showAllActive,
show_icons,
show_numbered,
numbered_active_indicator,
workspaceIconMap,
showWsIcons,
showApplicationIcons,
applicationIconOncePerWorkspace,
applicationIconMap,
applicationIconEmptyWorkspace,
applicationIconFallback,
} = options.bar.workspaces;
const { available, active, occupied } = options.bar.workspaces.icons;
const { matugen } = options.theme;
const { smartHighlight } = options.theme.bar.buttons.workspaces;
initWorkspaceEvents();
export const WorkspaceModule = ({ monitor }: WorkspaceModuleProps): JSX.Element => {
const boxChildren = Variable.derive(
[
bind(monitorSpecific),
bind(hyprlandService, 'workspaces'),
bind(workspaceMask),
bind(workspaces),
bind(show_icons),
bind(available),
bind(active),
bind(occupied),
bind(show_numbered),
bind(numbered_active_indicator),
bind(spacing),
bind(workspaceIconMap),
bind(showWsIcons),
bind(showApplicationIcons),
bind(applicationIconOncePerWorkspace),
bind(applicationIconMap),
bind(applicationIconEmptyWorkspace),
bind(applicationIconFallback),
bind(matugen),
bind(smartHighlight),
bind(hyprlandService, 'clients'),
bind(hyprlandService, 'monitors'),
bind(ignored),
bind(showAllActive),
bind(hyprlandService, 'focusedWorkspace'),
bind(workspaceRules),
bind(forceUpdater),
],
(
isMonitorSpecific: boolean,
workspaceList: AstalHyprland.Workspace[],
workspaceMaskFlag: boolean,
totalWorkspaces: number,
displayIcons: boolean,
availableStatus: string,
activeStatus: string,
occupiedStatus: string,
displayNumbered: boolean,
numberedActiveIndicator: string,
spacingValue: number,
workspaceIconMapping: WorkspaceIconMap,
displayWorkspaceIcons: boolean,
displayApplicationIcons: boolean,
appIconOncePerWorkspace: boolean,
applicationIconMapping: ApplicationIcons,
applicationIconEmptyWorkspace: string,
applicationIconFallback: string,
matugenEnabled: boolean,
smartHighlightEnabled: boolean,
clients: AstalHyprland.Client[],
monitorList: AstalHyprland.Monitor[],
) => {
const workspacesToRender = getWorkspacesToRender(
totalWorkspaces,
workspaceList,
workspaceRules.get(),
monitor,
isMonitorSpecific,
monitorList,
);
return workspacesToRender.map((wsId, index) => {
const appIcons = displayApplicationIcons
? getAppIcon(wsId, appIconOncePerWorkspace, {
iconMap: applicationIconMapping,
defaultIcon: applicationIconFallback,
emptyIcon: applicationIconEmptyWorkspace,
})
: '';
return (
);
});
},
);
return (
{
boxChildren.drop();
}}
>
{boxChildren()}
);
};
interface WorkspaceModuleProps {
monitor: number;
}