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; }