{
  "version": 3,
  "sources": ["../args.ts", "../log.ts", "../configureStore.ts", "../xutils.ts", "../ewmh.ts", "../pointer.ts", "../icccm.ts", "../motif.ts", "../menus.ts", "../exec.ts", "../autocomplete.ts", "../window.ts", "../drag.ts", "../shortcuts.ts", "../assert.ts", "../xdg.ts", "../config.ts", "../systray.ts", "../desktopEntries.ts", "../version.ts", "../csp.ts", "../wm.ts", "../electronLog.ts", "../main.ts", "../index.js"],
  "sourcesContent": ["import yargs from \"yargs\";\nimport { hideBin } from \"yargs/helpers\";\n\ninterface IArgs {\n  config: string | undefined;\n  consoleLogging: boolean;\n  fileLogging: string | undefined;\n}\n\nconst argv = yargs(hideBin(process.argv))\n  .nargs(\"config\", 1)\n  .option(\"config\", {\n    describe: \"Config package specifier to load\",\n  })\n  .boolean(\"console-logging\")\n  .default(\"console-logging\", false)\n  .option(\"console-logging\", {\n    describe: \"Enable console log output\",\n  })\n  .nargs(\"file-logging\", 1)\n  .option(\"file-logging\", {\n    describe: \"Enable logging output to a file\",\n  })\n  .usage(\n    `bond-wm window manager\n\nUsage: $0 [options]`\n  )\n  .help().argv as IArgs;\n\nconsole.log(argv);\n\n/** Gets information about command line args. */\nexport function getArgs(): typeof argv {\n  return argv;\n}\n\n/** True if any form of logging is enabled. */\nexport function loggingEnabled(): boolean {\n  return argv.consoleLogging || !!argv.fileLogging;\n}\n", "import * as fs from \"fs\";\nimport * as util from \"util\";\nimport { getArgs } from \"./args\";\n\nconst { consoleLogging, fileLogging } = getArgs();\n\nconst logFile = fileLogging ? fs.createWriteStream(fileLogging, { flags: \"w\" }) : null;\n\nconst stdout = process.stdout;\nconst stderr = process.stderr;\n\nexport function log(...args: unknown[]): void {\n  if (logFile || consoleLogging) {\n    const logText = formatLogText(args);\n    logFile?.write(logText);\n    if (consoleLogging) {\n      stdout.write(logText);\n    }\n  }\n}\n\nexport function logDir(obj: unknown, options: object): void {\n  if (logFile || consoleLogging) {\n    const logText = util.inspect(obj, { showHidden: false, depth: 3, colors: false, ...options }) + \"\\n\";\n    logFile?.write(logText);\n    if (consoleLogging) {\n      stdout.write(logText);\n    }\n  }\n}\n\nexport function logTrace(message: string): void {\n  if (logFile || consoleLogging) {\n    const logText = formatLogText([message, new Error().stack]);\n    logFile?.write(logText);\n    if (consoleLogging) {\n      stdout.write(logText);\n    }\n  }\n}\n\nexport function logError(...args: unknown[]): void {\n  if (logFile || consoleLogging) {\n    const logText = formatLogText(args);\n    logFile?.write(logText);\n    if (consoleLogging) {\n      stderr.write(logText);\n    }\n  }\n}\n\nfunction formatLogText(args: unknown[]) {\n  return util.format.apply(null, args) + \"\\n\";\n}\n", "import { applyMiddleware, Middleware } from \"redux\";\nimport { configureStore } from \"@reduxjs/toolkit\";\nimport { composeWithStateSync } from \"@wnayes/electron-redux/main\";\nimport {\n  configReducer,\n  desktopReducer,\n  pluginStateReducer,\n  screenReducer,\n  trayReducer,\n  windowReducer,\n} from \"@bond-wm/shared\";\n\nexport type ServerStore = ReturnType<typeof configureWMStore>;\nexport type ServerRootState = ReturnType<ServerStore[\"getState\"]>;\nexport type ServerDispatch = ServerStore[\"dispatch\"];\n\nexport function configureWMStore(middleware: Middleware[]) {\n  const enhancer = composeWithStateSync(applyMiddleware(...middleware));\n\n  const store = configureStore({\n    reducer: {\n      config: configReducer,\n      desktop: desktopReducer,\n      pluginState: pluginStateReducer,\n      screens: screenReducer,\n      tray: trayReducer,\n      windows: windowReducer,\n    },\n\n    // Could try to tune this, but for now just disable it.\n    middleware: (getDefaultMiddleware) =>\n      getDefaultMiddleware({\n        immutableCheck: false,\n        serializableCheck: false,\n      }),\n\n    enhancers: (getDefaultEnhancers) => {\n      return getDefaultEnhancers().concat(enhancer);\n    },\n  });\n  return store;\n}\n", "import { Atom, IXClient, XEventMask, XGetPropertyCallbackProps } from \"@bond-wm/shared\";\nimport { log, logError } from \"./log\";\nimport { ExtraAtoms } from \"./wm\";\n\nexport function internAtomAsync(X: IXClient, name: string): Promise<number> {\n  return new Promise((resolve, reject) => {\n    X.InternAtom(false, name, (err, atom) => {\n      if (err) {\n        reject(err);\n      } else {\n        resolve(atom);\n      }\n    });\n  });\n}\n\nexport async function getPropertyValue<TValue>(\n  X: IXClient,\n  wid: number,\n  nameAtom: Atom,\n  typeAtom: Atom\n): Promise<TValue> {\n  const prop = await getRawPropertyValue(X, wid, nameAtom, typeAtom);\n\n  switch (prop.type) {\n    case X.atoms.STRING:\n      return prop.data.toString() as unknown as TValue;\n\n    case ExtraAtoms.UTF8_STRING:\n      return prop.data.toString() as unknown as TValue;\n\n    case X.atoms.WINDOW:\n      if (prop.data && prop.data.length >= 4) {\n        return prop.data.readInt32LE(0) as unknown as TValue;\n      }\n      return undefined as unknown as TValue;\n\n    default:\n      log(\"Unhandled atom property type\", prop);\n      return undefined as unknown as TValue;\n  }\n}\n\nexport function getRawPropertyValue(\n  X: IXClient,\n  wid: number,\n  nameAtom: Atom,\n  typeAtom: Atom\n): Promise<XGetPropertyCallbackProps> {\n  return new Promise((resolve, reject) => {\n    X.GetProperty(0, wid, nameAtom, typeAtom, 0, 10000000, function (err, prop) {\n      if (err) {\n        reject(err);\n        return;\n      }\n\n      log(\"Got property value response\", prop);\n      resolve(prop);\n    });\n  });\n}\n\nexport function changeWindowEventMask(X: IXClient, wid: number, eventMask: XEventMask): boolean {\n  let failed;\n  log(\"Changing event mask for\", wid, eventMask);\n  X.ChangeWindowAttributes(wid, { eventMask }, (err) => {\n    if (err && err.error === 10) {\n      logError(\n        `Error while changing event mask for for ${wid} to ${eventMask}: Another window manager already running.`,\n        err\n      );\n      failed = true;\n      return;\n    }\n    logError(`Error while changing event mask for for ${wid} to ${eventMask}`, err);\n    failed = true;\n  });\n  return !failed;\n}\n\n/**\n * Converts an array of numbers into a Buffer holding those numbers.\n * @param nums Numbers to put in the buffer (as 32 bit ints)\n * @returns Buffer filled with nums.\n */\nexport function numsToBuffer(nums: number[]): Buffer {\n  const buffer = Buffer.alloc(nums.length * 4);\n  for (let i = 0; i < nums.length; i++) {\n    buffer.writeInt32LE(nums[i], i * 4);\n  }\n  return buffer;\n}\n", "import {\n  WindowType,\n  XWMWindowType,\n  setWindowAlwaysOnTopAction,\n  setWindowFullscreenAction,\n  setWindowUrgentAction,\n} from \"@bond-wm/shared\";\nimport { numsToBuffer } from \"./xutils\";\nimport { Atom, XCB_COPY_FROM_PARENT, XPropMode } from \"@bond-wm/shared\";\nimport { log, logError } from \"./log\";\nimport { IXWMEventConsumer, XWMContext } from \"./wm\";\nimport { getRawPropertyValue, internAtomAsync } from \"./xutils\";\nimport { pid } from \"process\";\nimport { DragModule } from \"./drag\";\nimport { Coords } from \"@bond-wm/shared\";\nimport { IIconInfo, ResizeDirection } from \"@bond-wm/shared\";\n\nenum NetWmStateAction {\n  _NET_WM_STATE_REMOVE = 0,\n  _NET_WM_STATE_ADD = 1,\n  _NET_WM_STATE_TOGGLE = 2,\n}\n\ntype NetWmStateData = [action: NetWmStateAction, firstAtom: Atom, secondAtom: Atom, sourceIndication: number];\n\ntype NetWmMoveResizeData = [\n  xRoot: number,\n  yRoot: number,\n  direction: NetWmMoveResizeType,\n  button: number,\n  sourceIndication: number,\n];\n\nenum NetWmMoveResizeType {\n  _NET_WM_MOVERESIZE_SIZE_TOPLEFT = 0,\n  _NET_WM_MOVERESIZE_SIZE_TOP = 1,\n  _NET_WM_MOVERESIZE_SIZE_TOPRIGHT = 2,\n  _NET_WM_MOVERESIZE_SIZE_RIGHT = 3,\n  _NET_WM_MOVERESIZE_SIZE_BOTTOMRIGHT = 4,\n  _NET_WM_MOVERESIZE_SIZE_BOTTOM = 5,\n  _NET_WM_MOVERESIZE_SIZE_BOTTOMLEFT = 6,\n  _NET_WM_MOVERESIZE_SIZE_LEFT = 7,\n  _NET_WM_MOVERESIZE_MOVE = 8 /* movement only */,\n  _NET_WM_MOVERESIZE_SIZE_KEYBOARD = 9 /* size via keyboard */,\n  _NET_WM_MOVERESIZE_MOVE_KEYBOARD = 10 /* move via keyboard */,\n  _NET_WM_MOVERESIZE_CANCEL = 11 /* cancel operation */,\n}\n\nfunction netWMMoveResizeTypeToInternal(newWmMoveResizeType: NetWmMoveResizeType): ResizeDirection {\n  switch (newWmMoveResizeType) {\n    case NetWmMoveResizeType._NET_WM_MOVERESIZE_SIZE_TOPLEFT:\n      return ResizeDirection.TopLeft;\n    case NetWmMoveResizeType._NET_WM_MOVERESIZE_SIZE_TOP:\n      return ResizeDirection.Top;\n    case NetWmMoveResizeType._NET_WM_MOVERESIZE_SIZE_TOPRIGHT:\n      return ResizeDirection.TopRight;\n    case NetWmMoveResizeType._NET_WM_MOVERESIZE_SIZE_RIGHT:\n      return ResizeDirection.Right;\n    case NetWmMoveResizeType._NET_WM_MOVERESIZE_SIZE_BOTTOMRIGHT:\n      return ResizeDirection.BottomRight;\n    case NetWmMoveResizeType._NET_WM_MOVERESIZE_SIZE_BOTTOM:\n      return ResizeDirection.Bottom;\n    case NetWmMoveResizeType._NET_WM_MOVERESIZE_SIZE_BOTTOMLEFT:\n      return ResizeDirection.BottomLeft;\n    case NetWmMoveResizeType._NET_WM_MOVERESIZE_SIZE_LEFT:\n      return ResizeDirection.Left;\n    default:\n      throw new Error(\"Unexpected resize type\");\n  }\n}\n\nexport interface EWMHModule extends IXWMEventConsumer {\n  getNetWmType(wid: number): Promise<WindowType | null>;\n  getNetWmIcons(wid: number): Promise<IIconInfo[]>;\n}\n\nexport async function createEWMHEventConsumer(\n  { X, store, getWindowIdFromFrameId }: XWMContext,\n  dragModule: DragModule\n): Promise<EWMHModule> {\n  const atoms = {\n    _NET_SUPPORTED: await internAtomAsync(X, \"_NET_SUPPORTED\"),\n    _NET_SUPPORTING_WM_CHECK: await internAtomAsync(X, \"_NET_SUPPORTING_WM_CHECK\"),\n\n    _NET_WM_NAME: await internAtomAsync(X, \"_NET_WM_NAME\"),\n\n    _NET_WM_ICON: await internAtomAsync(X, \"_NET_WM_ICON\"),\n\n    _NET_WM_STATE: await internAtomAsync(X, \"_NET_WM_STATE\"),\n    _NET_WM_STATE_ABOVE: await internAtomAsync(X, \"_NET_WM_STATE_ABOVE\"),\n    _NET_WM_STATE_FULLSCREEN: await internAtomAsync(X, \"_NET_WM_STATE_FULLSCREEN\"),\n    _NET_WM_STATE_DEMANDS_ATTENTION: await internAtomAsync(X, \"_NET_WM_STATE_DEMANDS_ATTENTION\"),\n\n    _NET_WM_WINDOW_TYPE: await internAtomAsync(X, \"_NET_WM_WINDOW_TYPE\"),\n    _NET_WM_WINDOW_TYPE_DESKTOP: await internAtomAsync(X, \"_NET_WM_WINDOW_TYPE_DESKTOP\"),\n    _NET_WM_WINDOW_TYPE_DOCK: await internAtomAsync(X, \"_NET_WM_WINDOW_TYPE_DOCK\"),\n    _NET_WM_WINDOW_TYPE_TOOLBAR: await internAtomAsync(X, \"_NET_WM_WINDOW_TYPE_TOOLBAR\"),\n    _NET_WM_WINDOW_TYPE_MENU: await internAtomAsync(X, \"_NET_WM_WINDOW_TYPE_MENU\"),\n    _NET_WM_WINDOW_TYPE_UTILITY: await internAtomAsync(X, \"_NET_WM_WINDOW_TYPE_UTILITY\"),\n    _NET_WM_WINDOW_TYPE_SPLASH: await internAtomAsync(X, \"_NET_WM_WINDOW_TYPE_SPLASH\"),\n    _NET_WM_WINDOW_TYPE_DIALOG: await internAtomAsync(X, \"_NET_WM_WINDOW_TYPE_DIALOG\"),\n    _NET_WM_WINDOW_TYPE_DROPDOWN_MENU: await internAtomAsync(X, \"_NET_WM_WINDOW_TYPE_DROPDOWN_MENU\"),\n    _NET_WM_WINDOW_TYPE_POPUP_MENU: await internAtomAsync(X, \"_NET_WM_WINDOW_TYPE_POPUP_MENU\"),\n    _NET_WM_WINDOW_TYPE_TOOLTIP: await internAtomAsync(X, \"_NET_WM_WINDOW_TYPE_TOOLTIP\"),\n    _NET_WM_WINDOW_TYPE_NOTIFICATION: await internAtomAsync(X, \"_NET_WM_WINDOW_TYPE_NOTIFICATION\"),\n    _NET_WM_WINDOW_TYPE_COMBO: await internAtomAsync(X, \"_NET_WM_WINDOW_TYPE_COMBO\"),\n    _NET_WM_WINDOW_TYPE_DND: await internAtomAsync(X, \"_NET_WM_WINDOW_TYPE_DND\"),\n    _NET_WM_WINDOW_TYPE_NORMAL: await internAtomAsync(X, \"_NET_WM_WINDOW_TYPE_NORMAL\"),\n\n    _NET_FRAME_EXTENTS: await internAtomAsync(X, \"_NET_FRAME_EXTENTS\"),\n    _NET_WM_PID: await internAtomAsync(X, \"_NET_WM_PID\"),\n    _NET_WM_MOVERESIZE: await internAtomAsync(X, \"_NET_WM_MOVERESIZE\"),\n\n    UTF8_STRING: await internAtomAsync(X, \"UTF8_STRING\"),\n  };\n\n  function updateWindowStateHints(wid: number): void {\n    const win = store.getState().windows[wid];\n    if (!win) {\n      return;\n    }\n\n    const hintAtoms: number[] = [];\n    if (win.alwaysOnTop) {\n      hintAtoms.push(atoms._NET_WM_STATE_ABOVE);\n    }\n    if (win.fullscreen) {\n      hintAtoms.push(atoms._NET_WM_STATE_FULLSCREEN);\n    }\n    if (win.urgent) {\n      hintAtoms.push(atoms._NET_WM_STATE_DEMANDS_ATTENTION);\n    }\n\n    X.ChangeProperty(XPropMode.Replace, wid, atoms._NET_WM_STATE, X.atoms.ATOM, 32, numsToBuffer(hintAtoms));\n  }\n\n  function removeWindowStateHints(wid: number): void {\n    X.DeleteProperty(wid, atoms._NET_WM_STATE, (err) => {\n      if (err) {\n        log(\"Could not delete _NET_WM_STATE\");\n      }\n    });\n  }\n\n  function processWindowStateChange(wid: number, action: NetWmStateAction, atom: Atom): void {\n    let handled = true;\n    switch (atom) {\n      case atoms._NET_WM_STATE_ABOVE:\n        processWindowAboveChange(wid, action);\n        break;\n\n      case atoms._NET_WM_STATE_DEMANDS_ATTENTION:\n        processWindowUrgentChange(wid, action);\n        break;\n\n      case atoms._NET_WM_STATE_FULLSCREEN:\n        processWindowFullscreenChange(wid, action);\n        break;\n\n      default:\n        handled = false;\n        break;\n    }\n\n    if (handled) {\n      updateWindowStateHints(wid);\n    }\n  }\n\n  function processWindowAboveChange(wid: number, action: NetWmStateAction): void {\n    const win = store.getState().windows[wid];\n    if (!win) {\n      return;\n    }\n\n    switch (action) {\n      case NetWmStateAction._NET_WM_STATE_ADD:\n        if (!win.alwaysOnTop) {\n          store.dispatch(setWindowAlwaysOnTopAction({ wid, alwaysOnTop: true }));\n        }\n        break;\n\n      case NetWmStateAction._NET_WM_STATE_REMOVE:\n        if (win.alwaysOnTop) {\n          store.dispatch(setWindowAlwaysOnTopAction({ wid, alwaysOnTop: false }));\n        }\n        break;\n\n      case NetWmStateAction._NET_WM_STATE_TOGGLE:\n        store.dispatch(setWindowAlwaysOnTopAction({ wid, alwaysOnTop: !win.alwaysOnTop }));\n        break;\n    }\n  }\n\n  function processWindowFullscreenChange(wid: number, action: NetWmStateAction): void {\n    const win = store.getState().windows[wid];\n    if (!win) {\n      return;\n    }\n\n    switch (action) {\n      case NetWmStateAction._NET_WM_STATE_ADD:\n        if (!win.fullscreen) {\n          store.dispatch(setWindowFullscreenAction({ wid, fullscreen: true }));\n        }\n        break;\n\n      case NetWmStateAction._NET_WM_STATE_REMOVE:\n        if (win.fullscreen) {\n          store.dispatch(setWindowFullscreenAction({ wid, fullscreen: false }));\n        }\n        break;\n\n      case NetWmStateAction._NET_WM_STATE_TOGGLE:\n        store.dispatch(setWindowFullscreenAction({ wid, fullscreen: !win.fullscreen }));\n        break;\n    }\n  }\n\n  function processWindowUrgentChange(wid: number, action: NetWmStateAction): void {\n    const win = store.getState().windows[wid];\n    if (!win) {\n      return;\n    }\n\n    switch (action) {\n      case NetWmStateAction._NET_WM_STATE_ADD:\n        if (!win.urgent) {\n          store.dispatch(setWindowUrgentAction({ wid, urgent: true }));\n        }\n        break;\n\n      case NetWmStateAction._NET_WM_STATE_REMOVE:\n        if (win.urgent) {\n          store.dispatch(setWindowUrgentAction({ wid, urgent: false }));\n        }\n        break;\n\n      case NetWmStateAction._NET_WM_STATE_TOGGLE:\n        store.dispatch(setWindowUrgentAction({ wid, urgent: !win.urgent }));\n        break;\n    }\n  }\n\n  function getWindowTypeFromAtom(typeAtom: number): WindowType | null {\n    switch (typeAtom) {\n      case atoms._NET_WM_WINDOW_TYPE_DESKTOP:\n        return WindowType.Desktop;\n      case atoms._NET_WM_WINDOW_TYPE_DOCK:\n        return WindowType.Dock;\n      case atoms._NET_WM_WINDOW_TYPE_TOOLBAR:\n        return WindowType.Toolbar;\n      case atoms._NET_WM_WINDOW_TYPE_MENU:\n        return WindowType.Menu;\n      case atoms._NET_WM_WINDOW_TYPE_UTILITY:\n        return WindowType.Utility;\n      case atoms._NET_WM_WINDOW_TYPE_SPLASH:\n        return WindowType.Splash;\n      case atoms._NET_WM_WINDOW_TYPE_DIALOG:\n        return WindowType.Dialog;\n      case atoms._NET_WM_WINDOW_TYPE_DROPDOWN_MENU:\n        return WindowType.DropdownMenu;\n      case atoms._NET_WM_WINDOW_TYPE_POPUP_MENU:\n        return WindowType.PopupMenu;\n      case atoms._NET_WM_WINDOW_TYPE_TOOLTIP:\n        return WindowType.Tooltip;\n      case atoms._NET_WM_WINDOW_TYPE_NOTIFICATION:\n        return WindowType.Notification;\n      case atoms._NET_WM_WINDOW_TYPE_COMBO:\n        return WindowType.Combo;\n      case atoms._NET_WM_WINDOW_TYPE_DND:\n        return WindowType.DragDrop;\n      case atoms._NET_WM_WINDOW_TYPE_NORMAL:\n        return WindowType.Normal;\n      default:\n        return null;\n    }\n  }\n\n  return {\n    onScreenCreated({ root }) {\n      X.ChangeProperty(\n        XPropMode.Replace,\n        root,\n        atoms._NET_SUPPORTED,\n        X.atoms.ATOM,\n        32,\n        numsToBuffer([\n          atoms._NET_SUPPORTED,\n          atoms._NET_SUPPORTING_WM_CHECK,\n          atoms._NET_WM_NAME,\n          atoms._NET_WM_ICON,\n          atoms._NET_WM_STATE,\n          atoms._NET_WM_STATE_ABOVE,\n          atoms._NET_WM_STATE_FULLSCREEN,\n          atoms._NET_FRAME_EXTENTS,\n          atoms._NET_WM_PID,\n          atoms._NET_WM_MOVERESIZE,\n        ])\n      );\n\n      // Part of the spec requires us to create a window and set some properties on it.\n      const wid = X.AllocID();\n      X.CreateWindow(wid, root, -1, -1, 1, 1, 0, XCB_COPY_FROM_PARENT, 0, 0);\n      const widBuffer = numsToBuffer([wid]);\n      X.ChangeProperty(XPropMode.Replace, root, atoms._NET_SUPPORTING_WM_CHECK, X.atoms.WINDOW, 32, widBuffer);\n      X.ChangeProperty(XPropMode.Replace, wid, atoms._NET_SUPPORTING_WM_CHECK, X.atoms.WINDOW, 32, widBuffer);\n      X.ChangeProperty(XPropMode.Replace, wid, atoms._NET_WM_NAME, atoms.UTF8_STRING, 8, \"bond-wm\");\n      X.ChangeProperty(XPropMode.Replace, wid, atoms._NET_WM_PID, X.atoms.CARDINAL, 32, numsToBuffer([pid]));\n    },\n\n    onClientMessage({ wid, windowType, messageType, data }) {\n      switch (messageType) {\n        case atoms._NET_WM_STATE:\n          {\n            if (windowType === XWMWindowType.Client) {\n              const stateData = data as NetWmStateData;\n              processWindowStateChange(wid, stateData[0], stateData[1]);\n              if (stateData[2] !== 0) {\n                processWindowStateChange(wid, stateData[0], stateData[2]);\n              }\n            }\n          }\n          break;\n\n        case atoms._NET_WM_MOVERESIZE:\n          {\n            if (windowType === XWMWindowType.Frame) {\n              const trueWid = getWindowIdFromFrameId(wid);\n              if (typeof trueWid === \"number\") {\n                wid = trueWid;\n              }\n            }\n\n            const moveResizeData = data as NetWmMoveResizeData;\n            if (moveResizeData[2] === NetWmMoveResizeType._NET_WM_MOVERESIZE_CANCEL) {\n              dragModule.endMoveResize(wid);\n              break;\n            }\n\n            const coords: Coords = [moveResizeData[0], moveResizeData[1]];\n\n            switch (moveResizeData[2]) {\n              case NetWmMoveResizeType._NET_WM_MOVERESIZE_MOVE:\n                dragModule.startMove(wid, coords);\n                break;\n\n              case NetWmMoveResizeType._NET_WM_MOVERESIZE_SIZE_TOPLEFT:\n              case NetWmMoveResizeType._NET_WM_MOVERESIZE_SIZE_TOP:\n              case NetWmMoveResizeType._NET_WM_MOVERESIZE_SIZE_TOPRIGHT:\n              case NetWmMoveResizeType._NET_WM_MOVERESIZE_SIZE_RIGHT:\n              case NetWmMoveResizeType._NET_WM_MOVERESIZE_SIZE_BOTTOMRIGHT:\n              case NetWmMoveResizeType._NET_WM_MOVERESIZE_SIZE_BOTTOM:\n              case NetWmMoveResizeType._NET_WM_MOVERESIZE_SIZE_BOTTOMLEFT:\n              case NetWmMoveResizeType._NET_WM_MOVERESIZE_SIZE_LEFT:\n                dragModule.startResize(wid, coords, netWMMoveResizeTypeToInternal(moveResizeData[2]));\n                break;\n            }\n          }\n          break;\n      }\n    },\n\n    onMapNotify({ wid, windowType }) {\n      if (windowType === XWMWindowType.Client) {\n        updateWindowStateHints(wid);\n      }\n    },\n\n    onUnmapNotify({ wid, windowType }) {\n      if (windowType === XWMWindowType.Client) {\n        removeWindowStateHints(wid);\n      }\n    },\n\n    onSetFrameExtents({ wid, frameExtents }) {\n      const extentsInts = Buffer.alloc(16);\n      extentsInts.writeInt32LE(frameExtents.left, 0);\n      extentsInts.writeInt32LE(frameExtents.right, 4);\n      extentsInts.writeInt32LE(frameExtents.top, 8);\n      extentsInts.writeInt32LE(frameExtents.bottom, 12);\n\n      X.ChangeProperty(XPropMode.Replace, wid, atoms._NET_FRAME_EXTENTS, X.atoms.CARDINAL, 32, extentsInts);\n    },\n\n    async getNetWmType(wid: number): Promise<WindowType | null> {\n      const { data } = await getRawPropertyValue(X, wid, atoms._NET_WM_WINDOW_TYPE, X.atoms.ATOM);\n      if (!data) {\n        return null;\n      }\n\n      const types: WindowType[] = [];\n      let i = 0;\n      while (i < data.byteLength) {\n        const typeAtom = data.readInt32LE(i);\n        const type = getWindowTypeFromAtom(typeAtom);\n        if (type !== null) {\n          types.push(type);\n        }\n        i += 4;\n      }\n\n      if (types.length > 1) {\n        log(`Window ${wid} has more than one type: ${types.join(\",\")}`);\n      }\n      return types[0] ?? null;\n    },\n\n    async getNetWmIcons(wid: number): Promise<IIconInfo[]> {\n      const { data } = await getRawPropertyValue(X, wid, atoms._NET_WM_ICON, X.atoms.CARDINAL);\n      if (!data) {\n        return [];\n      }\n\n      const icons: IIconInfo[] = [];\n      const dataLength = data.byteLength;\n      let i = 0;\n      while (i < dataLength) {\n        const info: IIconInfo = {\n          width: data.readInt32LE(i),\n          height: data.readInt32LE(i + 4),\n          data: [],\n        };\n        i += 8;\n        for (let j = 0; j < info.width * info.height; j++) {\n          if (i >= dataLength) {\n            logError(\"Icon data truncated for \" + wid);\n            break;\n          }\n\n          info.data.push(data.readUint32LE(i));\n          i += 4;\n        }\n\n        icons.push(info);\n      }\n\n      return icons;\n    },\n  };\n}\n", "import { geometryContains } from \"@bond-wm/shared\";\nimport { IXClient, XQueryPointerResult } from \"@bond-wm/shared\";\nimport { XWMContext } from \"./wm\";\n\nexport function queryPointer(X: IXClient, relativeWid: number): Promise<XQueryPointerResult> {\n  return new Promise((resolve, reject) => {\n    X.QueryPointer(relativeWid, (err, result) => {\n      if (err) {\n        reject(err);\n      } else {\n        resolve(result);\n      }\n    });\n  });\n}\n\nexport async function getScreenIndexWithCursor(context: XWMContext, relativeWid: number): Promise<number> {\n  const pointerInfo = await queryPointer(context.X, relativeWid);\n  if (!pointerInfo) {\n    return -1;\n  }\n\n  const screens = context.store.getState().screens.filter((s) => s.root === pointerInfo.root);\n  if (!screens.length) {\n    return -1;\n  }\n\n  if (screens.length === 1) {\n    return screens[0].index;\n  }\n\n  // With Xinerama setup, we need to check the pointer coords to determine the screen.\n  for (const screen of screens) {\n    if (geometryContains(screen, pointerInfo.rootX, pointerInfo.rootY)) {\n      return screen.index;\n    }\n  }\n\n  return screens[0].index; // None matched above?\n}\n", "import { IXClient, WMHints, WMSizeHints, XPropMode, XWMWindowType } from \"@bond-wm/shared\";\nimport { log } from \"./log\";\nimport { IXWMEventConsumer, XWMContext } from \"./wm\";\nimport { getPropertyValue, getRawPropertyValue, internAtomAsync } from \"./xutils\";\n\nenum WMStateValue {\n  WithdrawnState = 0,\n  NormalState = 1,\n  IconicState = 3,\n}\n\nconst SIZEOF_WMHints = 32;\nconst SIZEOF_WMSizeHints = 72;\n\nexport async function createICCCMEventConsumer({ X }: XWMContext): Promise<IXWMEventConsumer> {\n  const atoms = {\n    WM_STATE: await internAtomAsync(X, \"WM_STATE\"),\n  };\n\n  function updateWindowState(wid: number): void {\n    const wmStateBuffer = Buffer.alloc(8);\n    wmStateBuffer.writeUInt32LE(WMStateValue.NormalState, 0);\n    wmStateBuffer.writeUInt32LE(0, 4); // icon\n\n    X.ChangeProperty(XPropMode.Replace, wid, atoms.WM_STATE, atoms.WM_STATE, 32, wmStateBuffer);\n  }\n\n  function removeWindowState(wid: number): void {\n    X.DeleteProperty(wid, atoms.WM_STATE, (err) => {\n      if (err) {\n        log(\"Could not delete WM_STATE\");\n      }\n    });\n  }\n\n  return {\n    onMapNotify({ wid, windowType }) {\n      if (windowType === XWMWindowType.Client) {\n        updateWindowState(wid);\n      }\n    },\n\n    onUnmapNotify({ wid, windowType }) {\n      if (windowType === XWMWindowType.Client) {\n        removeWindowState(wid);\n      }\n    },\n  };\n}\n\nexport async function getWMTransientFor(X: IXClient, wid: number): Promise<number | undefined> {\n  return await getPropertyValue<number>(X, wid, X.atoms.WM_TRANSIENT_FOR, X.atoms.WINDOW);\n}\n\n/** Obtains the WM_CLASS X property value for a window. */\nexport async function getWMClass(X: IXClient, wid: number): Promise<[string, string] | undefined> {\n  const { data } = await getRawPropertyValue(X, wid, X.atoms.WM_CLASS, X.atoms.STRING);\n  if (!data) {\n    return undefined;\n  }\n\n  const wmClass: [string, string] = [\"\", \"\"];\n  const firstNullByteIndex = data.indexOf(0);\n  if (firstNullByteIndex > 0) {\n    wmClass[0] = data.toString(\"utf8\", 0, firstNullByteIndex);\n  }\n  if (firstNullByteIndex + 1 < data.length - 1) {\n    wmClass[1] = data.toString(\"utf8\", firstNullByteIndex + 1, data.length - 1);\n  }\n  return wmClass;\n}\n\n/** Obtains the WM_HINTS X property value for a window. */\nexport async function getWMHints(X: IXClient, wid: number): Promise<WMHints | undefined> {\n  const { data } = await getRawPropertyValue(X, wid, X.atoms.WM_HINTS, X.atoms.WM_HINTS);\n\n  if (!data || data.length < SIZEOF_WMHints) {\n    return;\n  }\n\n  const hints: WMHints = {\n    flags: data.readInt32LE(0),\n    input: data.readInt32LE(4),\n    initialState: data.readInt32LE(8),\n    iconPixmap: data.readInt32LE(12),\n    iconWindow: data.readInt32LE(16),\n    iconX: data.readInt32LE(20),\n    iconY: data.readInt32LE(24),\n    iconMask: data.readInt32LE(28),\n  };\n  return hints;\n}\n\nexport async function getNormalHints(X: IXClient, wid: number): Promise<WMSizeHints | undefined> {\n  const { data } = await getRawPropertyValue(X, wid, X.atoms.WM_NORMAL_HINTS, X.atoms.WM_SIZE_HINTS);\n\n  if (!data || data.length < SIZEOF_WMSizeHints) {\n    return;\n  }\n\n  const hints: WMSizeHints = {\n    flags: data.readInt32LE(0),\n    minWidth: data.readInt32LE(20),\n    minHeight: data.readInt32LE(24),\n    maxWidth: data.readInt32LE(28),\n    maxHeight: data.readInt32LE(32),\n    widthIncrement: data.readInt32LE(36),\n    heightIncrement: data.readInt32LE(40),\n    minAspect: [data.readInt32LE(44), data.readInt32LE(48)],\n    maxAspect: [data.readInt32LE(52), data.readInt32LE(56)],\n    baseWidth: data.readInt32LE(60),\n    baseHeight: data.readInt32LE(64),\n    gravity: data.readInt32LE(68),\n  };\n  return hints;\n}\n", "import { XWMContext } from \"./wm\";\nimport { getRawPropertyValue, internAtomAsync } from \"./xutils\";\n\nenum MotifFlags {\n  MWM_HINTS_FUNCTIONS = 1 << 0,\n  MWM_HINTS_DECORATIONS = 1 << 1,\n}\n\nenum MotifFunctions {\n  MWM_FUNC_ALL = 1 << 0,\n  MWM_FUNC_RESIZE = 1 << 1,\n  MWM_FUNC_MOVE = 1 << 2,\n  MWM_FUNC_MINIMIZE = 1 << 3,\n  MWM_FUNC_MAXIMIZE = 1 << 4,\n  MWM_FUNC_CLOSE = 1 << 5,\n}\n\ninterface MotifHints {\n  flags: MotifFlags;\n  functions: MotifFunctions;\n  decorations: boolean;\n  inputMode: unknown;\n  status: unknown;\n}\n\nconst SIZEOF_MotifHints = 20;\n\nexport async function createMotifModule({ X }: XWMContext) {\n  const atoms = {\n    _MOTIF_WM_HINTS: await internAtomAsync(X, \"_MOTIF_WM_HINTS\"),\n  };\n\n  return {\n    async getMotifHints(wid: number): Promise<MotifHints | undefined> {\n      const { data } = await getRawPropertyValue(X, wid, atoms._MOTIF_WM_HINTS, atoms._MOTIF_WM_HINTS);\n\n      if (!data || data.length < SIZEOF_MotifHints) {\n        return;\n      }\n\n      const hints: MotifHints = {\n        flags: data.readInt32LE(0),\n        functions: data.readInt32LE(4),\n        decorations: !!data.readInt32LE(8),\n        inputMode: data.readInt32LE(12),\n        status: data.readInt32LE(16),\n      };\n      return hints;\n    },\n  };\n}\n\nexport function hasMotifDecorations(motifHints: MotifHints | null | undefined): boolean {\n  if (!motifHints) {\n    return true;\n  }\n  if (motifHints.flags & MotifFlags.MWM_HINTS_DECORATIONS) {\n    return motifHints.decorations;\n  }\n  return true;\n}\n", "import { app, BrowserWindow, IpcMainEvent, Menu } from \"electron\";\nimport { ContextMenuKind } from \"@bond-wm/shared\";\nimport { log } from \"./log\";\n\nexport function showContextMenu(event: IpcMainEvent, kind: ContextMenuKind, version: string | undefined): void {\n  log(\"Showing context menu (kind=\" + ContextMenuKind[kind]);\n\n  switch (kind) {\n    case ContextMenuKind.Desktop:\n      showDesktopMenu(event, version);\n      break;\n\n    case ContextMenuKind.Frame:\n      showFrameMenu(event);\n      break;\n  }\n}\n\nfunction showDesktopMenu(event: IpcMainEvent, version: string | undefined) {\n  const browserWindow = BrowserWindow.fromWebContents(event.sender);\n  if (!browserWindow) {\n    return;\n  }\n\n  const desktopMenu = Menu.buildFromTemplate([\n    {\n      label: \"bond-wm\" + (version ? ` \u2014 ${version}` : \"\"),\n      enabled: false,\n    },\n    {\n      type: \"separator\",\n    },\n    {\n      label: \"Reload Desktop\",\n      click: () => {\n        browserWindow.reload();\n      },\n    },\n    {\n      label: \"Desktop Developer Tools\",\n      click: () => {\n        browserWindow.webContents.openDevTools();\n      },\n    },\n    {\n      label: \"Quit\",\n      click: () => {\n        app.quit();\n      },\n    },\n  ]);\n\n  desktopMenu.popup({\n    window: browserWindow,\n  });\n}\n\nfunction showFrameMenu(event: IpcMainEvent) {\n  const browserWindow = BrowserWindow.fromWebContents(event.sender);\n  if (!browserWindow) {\n    return;\n  }\n\n  const frameMenu = Menu.buildFromTemplate([\n    {\n      label: \"Reload Frame\",\n      click: () => {\n        browserWindow.reload();\n      },\n    },\n    {\n      label: \"Frame Developer Tools\",\n      click: () => {\n        browserWindow.webContents.openDevTools({ mode: \"detach\" });\n      },\n    },\n  ]);\n\n  frameMenu.popup({\n    window: browserWindow,\n  });\n}\n", "import { exec } from \"child_process\";\n\nexport function execCommand(command: string, callback: (output: string) => void) {\n  exec(command, (_error, stdout) => {\n    callback(stdout);\n  });\n}\n", "import { ipcMain } from \"electron\";\nimport { execCommand } from \"./exec\";\n\nexport function setupAutocompleteListener(): void {\n  ipcMain.on(\"completion-options-get\", (event) => {\n    getCompletionOptions().then((options) => {\n      event.sender.send(\"completion-options-result\", options);\n    });\n  });\n}\n\nfunction getCompletionOptions(): Promise<string[]> {\n  return new Promise((resolve) => {\n    try {\n      execCommand(\"/usr/bin/env bash -c 'compgen -c'\", (commands) => {\n        resolve(\n          commands\n            .split(\"\\n\")\n            .map((c) => c.trim())\n            .filter((c) => !!c)\n        );\n      });\n    } catch {\n      resolve([]);\n    }\n  });\n}\n", "import { IScreen, IWindow, arraysEqual, intersect, setWindowTagsAction } from \"@bond-wm/shared\";\nimport { ServerStore } from \"./configureStore\";\n\n/** Update the window's tags if the next screen has different tags visible. */\nexport function updateWindowTagsForNextScreen(store: ServerStore, win: IWindow, nextScreen: IScreen): void {\n  const nextScreenTags = nextScreen.currentTags;\n  const tagIntersect = intersect(win.tags, nextScreenTags);\n  if (tagIntersect.length > 0) {\n    if (!arraysEqual(tagIntersect, win.tags)) {\n      store.dispatch(setWindowTagsAction({ wid: win.id, tags: tagIntersect }));\n    }\n  } else if (nextScreenTags.length > 0) {\n    store.dispatch(setWindowTagsAction({ wid: win.id, tags: [nextScreenTags[0]] }));\n  }\n}\n", "import {\n  configureWindowAction,\n  endDragAction,\n  LayoutPluginConfig,\n  setWindowIntoScreenAction,\n  startDragAction,\n  XWMWindowType,\n} from \"@bond-wm/shared\";\nimport { IScreen } from \"@bond-wm/shared\";\nimport { selectWindowMaximizeCanTakeEffect } from \"@bond-wm/shared\";\nimport { Coords, IGeometry } from \"@bond-wm/shared\";\nimport { geometryArea, geometryIntersect } from \"@bond-wm/shared\";\nimport {\n  getAbsoluteWindowGeometry,\n  IWindow,\n  newHeightForWindow,\n  newWidthForWindow,\n  ResizeDirection,\n} from \"@bond-wm/shared\";\nimport { XCB_CURRENT_TIME, XCB_GRAB_MODE_ASYNC, XEventMask } from \"@bond-wm/shared\";\nimport { log, logError } from \"./log\";\nimport { IXWMEventConsumer, XWMContext } from \"./wm\";\nimport { updateWindowTagsForNextScreen } from \"./window\";\n\nexport interface DragModule extends IXWMEventConsumer {\n  startMove(wid: number, coords: Coords): void;\n  startResize(wid: number, coords: Coords, direction: ResizeDirection): void;\n  endMoveResize(wid: number): void;\n}\n\nexport async function createDragModule(\n  { X, store, getFrameIdFromWindowId, getWindowIdFromFrameId }: XWMContext,\n  getLayoutPlugins: (screenIndex: number) => readonly LayoutPluginConfig[] | undefined\n): Promise<DragModule> {\n  function endMoveResize(wid: number): void {\n    const state = store.getState();\n    const win = state.windows[wid];\n    if (!win || !win._dragState) {\n      return;\n    }\n\n    log(\"Ending drag for \" + wid);\n\n    X.UngrabPointer(XCB_CURRENT_TIME);\n    X.UngrabKeyboard(XCB_CURRENT_TIME);\n\n    store.dispatch(endDragAction({ wid }));\n\n    // The window may now be on a different screen visually, so we should update state to match.\n    setWindowIntoBestScreen(state.screens, win);\n  }\n\n  function doGrabsForDrag(wid: number): void {\n    const fid = getFrameIdFromWindowId(wid) ?? wid;\n    X.GrabPointer(\n      fid,\n      false,\n      XEventMask.PointerMotion | XEventMask.ButtonRelease,\n      XCB_GRAB_MODE_ASYNC,\n      XCB_GRAB_MODE_ASYNC,\n      0, // None\n      0, // None\n      XCB_CURRENT_TIME,\n      (err) => {\n        if (err) {\n          logError(err);\n        }\n      }\n    );\n    X.GrabKeyboard(fid, false, XCB_CURRENT_TIME, XCB_GRAB_MODE_ASYNC, XCB_GRAB_MODE_ASYNC);\n  }\n\n  function setWindowIntoBestScreen(screens: IScreen[], win: IWindow): void {\n    const prevWinScreen = screens[win.screenIndex];\n    const bestWinScreen = getBestScreenForWindow(screens, win);\n    if (bestWinScreen && bestWinScreen !== prevWinScreen) {\n      updateWindowTagsForNextScreen(store, win, bestWinScreen);\n\n      store.dispatch(setWindowIntoScreenAction({ wid: win.id, screenIndex: screens.indexOf(bestWinScreen) }));\n\n      // The window coordinates need to be adjusted to be relative to the new screen.\n      store.dispatch(\n        configureWindowAction({\n          wid: win.id,\n          ...win.outer,\n          x: prevWinScreen.x + win.outer.x - bestWinScreen.x,\n          y: prevWinScreen.y + win.outer.y - bestWinScreen.y,\n        })\n      );\n    }\n  }\n\n  function getBestScreenForWindow(screens: IScreen[], win: IWindow): IScreen | null {\n    let bestScreen = null;\n    let bestIntersectArea = Number.MIN_SAFE_INTEGER;\n\n    const winAbsCoords = getAbsoluteWindowGeometry(screens[win.screenIndex], win);\n\n    for (const screen of screens) {\n      const intersect = geometryIntersect(screen, winAbsCoords);\n      if (!intersect) {\n        continue;\n      }\n      const intersectArea = geometryArea(intersect);\n      if (intersectArea > bestIntersectArea) {\n        bestIntersectArea = intersectArea;\n        bestScreen = screen;\n      }\n    }\n    return bestScreen;\n  }\n\n  return {\n    startMove(wid, coords) {\n      const state = store.getState();\n      const win = store.getState().windows[wid];\n      if (\n        !win ||\n        win._dragState ||\n        (win.maximized && selectWindowMaximizeCanTakeEffect(state, getLayoutPlugins(win.screenIndex), wid)) ||\n        win.fullscreen\n      ) {\n        return;\n      }\n\n      log(\"Starting drag for \" + wid, coords);\n\n      store.dispatch(startDragAction({ wid, coords, moving: true }));\n\n      doGrabsForDrag(wid);\n    },\n\n    startResize(wid, coords, direction) {\n      const state = store.getState();\n      const win = store.getState().windows[wid];\n      if (\n        !win ||\n        win._dragState ||\n        (win.maximized && selectWindowMaximizeCanTakeEffect(state, getLayoutPlugins(win.screenIndex), wid)) ||\n        win.fullscreen\n      ) {\n        log(\"Choosing to not start resize for \" + wid, coords, ResizeDirection[direction]);\n        return;\n      }\n\n      log(\"Starting resize for \" + wid, coords, ResizeDirection[direction]);\n\n      store.dispatch(startDragAction({ wid, coords, resize: direction }));\n\n      doGrabsForDrag(wid);\n    },\n\n    endMoveResize,\n\n    onPointerMotion({ wid, windowType, rootx, rooty }) {\n      let fid;\n      if (windowType === XWMWindowType.Frame) {\n        fid = wid;\n        wid = getWindowIdFromFrameId(fid)!;\n      } else if (windowType === XWMWindowType.Client) {\n        fid = getFrameIdFromWindowId(wid);\n      }\n\n      const win = store.getState().windows[wid];\n      if (!win || !win._dragState || !win._dragState.startOuterSize || !win._dragState.startCoordinates) {\n        return;\n      }\n\n      const { startOuterSize, startCoordinates } = win._dragState;\n      const xDiff = rootx - startCoordinates[0];\n      const yDiff = rooty - startCoordinates[1];\n\n      function configureWindow(win: IWindow, newConfig: Partial<IGeometry>): void {\n        store.dispatch(\n          configureWindowAction({\n            wid: win.id,\n            ...startOuterSize,\n            x: typeof newConfig.x === \"number\" ? newConfig.x : undefined,\n            y: typeof newConfig.y === \"number\" ? newConfig.y : undefined,\n            width: typeof newConfig.width === \"number\" ? newWidthForWindow(win, newConfig.width) : undefined,\n            height: typeof newConfig.height === \"number\" ? newHeightForWindow(win, newConfig.height) : undefined,\n          })\n        );\n      }\n\n      if (win._dragState.moving) {\n        configureWindow(win, {\n          x: startOuterSize.x + xDiff,\n          y: startOuterSize.y + yDiff,\n        });\n        return;\n      }\n\n      if (typeof win._dragState.resize === \"number\") {\n        switch (win._dragState.resize) {\n          case ResizeDirection.TopLeft:\n            configureWindow(win, {\n              x: startOuterSize.x + xDiff,\n              y: startOuterSize.y + yDiff,\n              width: startOuterSize.width - xDiff,\n              height: startOuterSize.height - yDiff,\n            });\n            break;\n          case ResizeDirection.Top:\n            configureWindow(win, {\n              y: startOuterSize.y + yDiff,\n              height: startOuterSize.height - yDiff,\n            });\n            break;\n          case ResizeDirection.TopRight:\n            configureWindow(win, {\n              y: startOuterSize.y + yDiff,\n              width: startOuterSize.width + xDiff,\n              height: startOuterSize.height - yDiff,\n            });\n            break;\n          case ResizeDirection.Right:\n            configureWindow(win, {\n              width: startOuterSize.width + xDiff,\n            });\n            break;\n          case ResizeDirection.BottomRight:\n            configureWindow(win, {\n              width: startOuterSize.width + xDiff,\n              height: startOuterSize.height + yDiff,\n            });\n            break;\n          case ResizeDirection.Bottom:\n            configureWindow(win, {\n              height: startOuterSize.height + yDiff,\n            });\n            break;\n          case ResizeDirection.BottomLeft:\n            configureWindow(win, {\n              x: startOuterSize.x + xDiff,\n              width: startOuterSize.width - xDiff,\n              height: startOuterSize.height + yDiff,\n            });\n            break;\n          case ResizeDirection.Left:\n            configureWindow(win, {\n              x: startOuterSize.x + xDiff,\n              width: startOuterSize.width - xDiff,\n            });\n            break;\n        }\n      }\n    },\n\n    onButtonRelease({ wid, windowType }) {\n      let fid;\n      if (windowType === XWMWindowType.Frame) {\n        fid = wid;\n        wid = getWindowIdFromFrameId(fid)!;\n      } else if (windowType === XWMWindowType.Client) {\n        fid = getFrameIdFromWindowId(wid);\n      }\n\n      endMoveResize(wid);\n    },\n\n    onKeyPress({ wid, windowType }) {\n      let fid;\n      if (windowType === XWMWindowType.Frame) {\n        fid = wid;\n        wid = getWindowIdFromFrameId(fid)!;\n      } else if (windowType === XWMWindowType.Client) {\n        fid = getFrameIdFromWindowId(wid);\n      }\n\n      endMoveResize(wid);\n      return false;\n    },\n  };\n}\n", "import { IXDisplay, KeyRegistrationMap, X11_KEY_MODIFIER, XWMEventConsumerKeyPressArgs } from \"@bond-wm/shared\";\nimport { log, logError } from \"./log\";\nimport { IXWMEventConsumer, XWMContext } from \"./wm\";\nimport * as nodeKeySym from \"@bond-wm/keysym\";\n\ninterface KeyRegistrationInfo {\n  originalKeyString: string;\n  callback: (args: XWMEventConsumerKeyPressArgs) => void;\n}\n\nexport interface ShortcutsModule extends IXWMEventConsumer {\n  registerShortcuts(rootWid: number, registeredKeys: KeyRegistrationMap): void;\n  registerShortcut(rootWid: number, keyString: string, callback: (args: XWMEventConsumerKeyPressArgs) => void): void;\n}\n\nexport async function createShortcutsModule({ X, XDisplay }: XWMContext): Promise<ShortcutsModule> {\n  const mapping = await getKeyboardMapping(XDisplay);\n\n  // keycode -> [keysym no modifier, keysym with shift, keysym with AltGr (?), ...others]\n  const keycodeToKeysyms: number[][] = [];\n  const keysymsToKeycode: number[] = [];\n  const keysymsToKeycodeShift: number[] = [];\n  for (let i = 0; i < mapping.length; i++) {\n    const keycode = XDisplay.min_keycode + i;\n    const keysyms = mapping[i];\n    keycodeToKeysyms[keycode] = keysyms;\n    if (keysyms[0] > 0) {\n      keysymsToKeycode[keysyms[0]] = keycode;\n    }\n    if (keysyms[1] > 0) {\n      keysymsToKeycodeShift[keysyms[1]] = keycode;\n    }\n  }\n\n  const processedRegisteredKeys: {\n    [keyModifiers: number]: { [keyCode: number]: KeyRegistrationInfo };\n  } = {};\n\n  function getXModifierForShortcutPiece(piece: string): number | null {\n    switch (piece.toLowerCase()) {\n      case \"shift\":\n        return X11_KEY_MODIFIER.ShiftMask;\n      case \"ctrl\":\n      case \"ctl\":\n      case \"control\":\n        return X11_KEY_MODIFIER.ControlMask;\n      case \"mod4\":\n      case \"win\":\n        return X11_KEY_MODIFIER.Mod4Mask;\n      default:\n        return null;\n    }\n  }\n\n  function registerShortcut(\n    rootWid: number,\n    keyString: string,\n    callback: (args: XWMEventConsumerKeyPressArgs) => void\n  ): void {\n    const pieces = keyString\n      .split(\"+\")\n      .map((s) => s.trim())\n      .filter((s) => !!s);\n    if (pieces.length === 0) {\n      return;\n    }\n\n    let xModifiers = 0;\n    for (let i = 0; i < pieces.length - 1; i++) {\n      const xModifier = getXModifierForShortcutPiece(pieces[i]);\n      if (typeof xModifier === \"number\") {\n        xModifiers |= xModifier;\n      } else {\n        logError(\"Unrecognized key modifier: \" + pieces[i]);\n      }\n    }\n\n    const lastPiece = pieces[pieces.length - 1];\n    if (!lastPiece) {\n      return;\n    }\n\n    // TODO: This is pretty messy / uncertain, just trying pretty much every combination...\n    // Just not sure exactly how shift factors in.\n    const hasShift = !!(xModifiers & X11_KEY_MODIFIER.ShiftMask);\n    let keySym = nodeKeySym.fromName(hasShift ? toUpper(lastPiece) : toLower(lastPiece));\n    if (!keySym) {\n      keySym = nodeKeySym.fromName(lastPiece);\n    }\n    const keySymMap = hasShift ? keysymsToKeycodeShift : keysymsToKeycode;\n    const keySymMapFallback = hasShift ? keysymsToKeycode : keysymsToKeycodeShift;\n    const keycode = keySymMap[keySym?.keysym ?? -1] ?? keySymMapFallback[keySym?.keysym ?? -1];\n    if (keycode > 0) {\n      processedRegisteredKeys[xModifiers] ||= {};\n      if (!processedRegisteredKeys[xModifiers][keycode]) {\n        processedRegisteredKeys[xModifiers][keycode] = {\n          originalKeyString: keyString,\n          callback,\n        };\n        X.GrabKey(rootWid, true, xModifiers, keycode, 1 /* Async */, 1 /* Async */);\n        log(`Registered modifiers: ${xModifiers}, keycode: ${keycode} for ${keyString}`);\n      }\n    } else {\n      logError(\"Could not register \" + keyString);\n    }\n  }\n\n  return {\n    registerShortcuts(rootWid: number, registeredKeys: KeyRegistrationMap): void {\n      for (const keyString in registeredKeys) {\n        registerShortcut(rootWid, keyString, registeredKeys[keyString]);\n      }\n    },\n\n    registerShortcut,\n\n    onKeyPress(args) {\n      const { keycode, modifiers } = args;\n      const keysyms = keycodeToKeysyms[keycode];\n      log(\"keysyms\", keysyms);\n      if (keysyms) {\n        const keysym = keysyms[modifiers & X11_KEY_MODIFIER.ShiftMask ? 1 : 0];\n        if (keysym) {\n          log(\"keysym\", keysym);\n          log(\"fromKeysym\", nodeKeySym.fromKeysym(keysym));\n        }\n      }\n\n      if (processedRegisteredKeys[args.modifiers]) {\n        const info = processedRegisteredKeys[args.modifiers][args.keycode];\n        if (typeof info === \"object\" && typeof info.callback === \"function\") {\n          log(`Running ${info.originalKeyString} shortcut handler`);\n          args.originalKeyString = info.originalKeyString;\n          info.callback(args);\n          return true;\n        }\n      }\n\n      return false;\n    },\n  };\n}\n\nasync function getKeyboardMapping(XDisplay: IXDisplay): Promise<number[][]> {\n  return new Promise((resolve, reject) => {\n    const { min_keycode, max_keycode } = XDisplay;\n    XDisplay.client.GetKeyboardMapping(min_keycode, max_keycode - min_keycode, (err, list) => {\n      if (err) {\n        reject(err);\n        return;\n      }\n      resolve(list);\n    });\n  });\n}\n\n// TODO: Any better way to do this? Probably doesn't work across locales...\nconst _toUpperMap: { [value: string]: string | undefined } = Object.assign(Object.create(null), {\n  \"0\": \")\",\n  \"1\": \"!\",\n  \"2\": \"@\",\n  \"3\": \"#\",\n  \"4\": \"$\",\n  \"5\": \"%\",\n  \"6\": \"^\",\n  \"7\": \"&\",\n  \"8\": \"*\",\n  \"9\": \"(\",\n  \"`\": \"~\",\n});\nconst _toLowerMap: { [value: string]: string | undefined } = Object.create(null);\nfor (const lower in _toUpperMap) {\n  _toLowerMap[_toUpperMap[lower]!] = lower;\n}\n\nfunction toUpper(value: string): string {\n  if (value in _toUpperMap) {\n    return _toUpperMap[value]!;\n  }\n  return value.toUpperCase();\n}\n\nfunction toLower(value: string): string {\n  if (value in _toLowerMap) {\n    return _toLowerMap[value]!;\n  }\n  return value.toLowerCase();\n}\n", "export { strict as assert } from \"assert\";\n", "import { env } from \"node:process\";\nimport { join } from \"node:path\";\nimport { existsSync } from \"node:fs\";\nconst getXdgUserDirs = require(\"xdg-user-dir\");\n\ninterface UserDirs {\n  XDG_DESKTOP_DIR: string;\n  XDG_DOWNLOAD_DIR: string;\n  XDG_TEMPLATES_DIR: string;\n  XDG_PUBLICSHARE_DIR: string;\n  XDG_DOCUMENTS_DIR: string;\n  XDG_MUSIC_DIR: string;\n  XDG_PICTURES_DIR: string;\n  XDG_VIDEOS_DIR: string;\n}\n\nlet _userDirs: UserDirs | null = null;\n\n/**\n * Gets the XDG Config Home directory.\n * Usually ~/.config\n */\nexport function getXDGConfigHome(): string {\n  let XDG_CONFIG_HOME = env[\"XDG_CONFIG_HOME\"];\n  if (!XDG_CONFIG_HOME) {\n    const HOME = env[\"HOME\"] || \"~\";\n    XDG_CONFIG_HOME = join(HOME, \".config\");\n  }\n  return XDG_CONFIG_HOME;\n}\n\n/** Different kinds of XDG user directories. */\nexport enum UserDirectoryKind {\n  Desktop,\n  Documents,\n  Download,\n  Music,\n  Pictures,\n  PublicShare,\n  Templates,\n  Videos,\n}\n\n/**\n * Retrieves an XDG user directory.\n * @returns String directory path, or null if the directory doesn't exist.\n */\nexport async function getXDGUserDirectory(kind: UserDirectoryKind): Promise<string | null> {\n  if (!_userDirs) {\n    _userDirs = await getXdgUserDirs();\n  }\n\n  let dir;\n  switch (kind) {\n    case UserDirectoryKind.Desktop:\n      dir = _userDirs?.XDG_DESKTOP_DIR ?? null;\n      break;\n    case UserDirectoryKind.Documents:\n      dir = _userDirs?.XDG_DOCUMENTS_DIR ?? null;\n      break;\n    case UserDirectoryKind.Download:\n      dir = _userDirs?.XDG_DOWNLOAD_DIR ?? null;\n      break;\n    case UserDirectoryKind.Music:\n      dir = _userDirs?.XDG_MUSIC_DIR ?? null;\n      break;\n    case UserDirectoryKind.Pictures:\n      dir = _userDirs?.XDG_PICTURES_DIR ?? null;\n      break;\n    case UserDirectoryKind.PublicShare:\n      dir = _userDirs?.XDG_PUBLICSHARE_DIR ?? null;\n      break;\n    case UserDirectoryKind.Templates:\n      dir = _userDirs?.XDG_TEMPLATES_DIR ?? null;\n      break;\n    case UserDirectoryKind.Videos:\n      dir = _userDirs?.XDG_VIDEOS_DIR ?? null;\n      break;\n    default:\n      throw new Error(\"Unknown XDG user directory kind\");\n  }\n\n  if (dir && !existsSync(dir)) {\n    dir = null;\n  }\n  return dir;\n}\n", "import { existsSync } from \"node:fs\";\nimport { dirname, join, resolve, sep } from \"node:path\";\nimport { log } from \"./log\";\nimport { setConfigPath, setConfigPathAction } from \"@bond-wm/shared\";\nimport { ServerStore } from \"./configureStore\";\nimport { getArgs } from \"./args\";\nimport { getXDGConfigHome } from \"./xdg\";\n\nexport async function determineConfigPath(store: ServerStore): Promise<string> {\n  let configPath: string | undefined = getArgs().config;\n  if (configPath) {\n    if (configPath.startsWith(\".\")) {\n      configPath = resolve(configPath);\n    } else if (!configPath.startsWith(sep)) {\n      configPath = dirname(require.resolve(`${configPath}/package.json`));\n    }\n    if (!existsSync(configPath)) {\n      throw new Error(`The --config path ${configPath} failed to resolve or does not exist.`);\n    }\n  } else {\n    const XDG_CONFIG_HOME = getXDGConfigHome();\n    log(\"XDG_CONFIG_HOME\", XDG_CONFIG_HOME);\n\n    configPath = join(XDG_CONFIG_HOME, \"bond-wm-config\");\n    if (!existsSync(configPath)) {\n      throw new Error(\"No --config path was specified, and no default config locations existed.\");\n    }\n  }\n\n  setConfigPath(configPath);\n  store.dispatch(setConfigPathAction(configPath));\n  return configPath;\n}\n", "import {\n  ConfigureTrayPayload,\n  addTrayWindowAction,\n  configureTrayWindowAction,\n  removeTrayWindowAction,\n  setTrayBackgroundColorAction,\n} from \"@bond-wm/shared\";\nimport { IGeometry } from \"@bond-wm/shared\";\nimport { numsToBuffer } from \"./xutils\";\nimport { IX11Mod, X11_EVENT_TYPE, XCB_COPY_FROM_PARENT, XPropMode } from \"@bond-wm/shared\";\nimport { log, logError } from \"./log\";\nimport { IXWMEventConsumer, XWMContext } from \"./wm\";\nimport { changeWindowEventMask, internAtomAsync } from \"./xutils\";\nconst x11: IX11Mod = require(\"x11\");\n\nenum SystemTrayOps {\n  SYSTEM_TRAY_REQUEST_DOCK = 0,\n  SYSTEM_TRAY_BEGIN_MESSAGE = 1,\n  SYSTEM_TRAY_CANCEL_MESSAGE = 2,\n}\n\nenum SystemTrayOrientation {\n  _NET_SYSTEM_TRAY_ORIENTATION_HORZ = 0,\n  _NET_SYSTEM_TRAY_ORIENTATION_VERT = 1,\n}\n\nconst TRAY_OWNER_EVENT_MASK = x11.eventMask.SubstructureRedirect;\n\nconst TRAY_WIN_EVENT_MASK = x11.eventMask.StructureNotify | x11.eventMask.PropertyChange | x11.eventMask.EnterWindow;\n\ninterface NotificationState {\n  [trayWid: number]: {\n    [messageId: number]: {\n      text: string;\n      totalSize: number;\n      receivedSize: number;\n    };\n  };\n}\n\n/**\n * System tray implementation.\n * https://specifications.freedesktop.org/systemtray-spec/systemtray-spec-0.2.html\n */\nexport async function createTrayEventConsumer({ X, store, XDisplay }: XWMContext): Promise<IXWMEventConsumer> {\n  const TraySelectionAtom = `_NET_SYSTEM_TRAY_S${X.screenNum}`;\n\n  const atoms = {\n    MANAGER: await internAtomAsync(X, \"MANAGER\"),\n    [TraySelectionAtom]: await internAtomAsync(X, TraySelectionAtom),\n    _NET_SYSTEM_TRAY_OPCODE: await internAtomAsync(X, \"_NET_SYSTEM_TRAY_OPCODE\"),\n    _NET_SYSTEM_TRAY_ORIENTATION: await internAtomAsync(X, \"_NET_SYSTEM_TRAY_ORIENTATION\"),\n    _NET_SYSTEM_TRAY_MESSAGE_DATA: await internAtomAsync(X, \"_NET_SYSTEM_TRAY_MESSAGE_DATA\"),\n  };\n\n  let _registered = false;\n  //let _rootWid: number;\n  let _trayOwnerWid = 0;\n  //let _trayDesktopWid = 0;\n  let _currentColorPixel: number;\n  const frameBrowserWinIdToFrameId: Map<number, number> = new Map();\n\n  const _notificationState: NotificationState = {};\n\n  function isTrayWin(win: number): boolean {\n    return win in store.getState().tray.windows;\n  }\n\n  function dockTrayWindow(trayWid: number) {\n    if (isTrayWin(trayWid)) {\n      return;\n    }\n\n    store.dispatch(addTrayWindowAction({ wid: trayWid }));\n\n    changeWindowEventMask(X, trayWid, TRAY_WIN_EVENT_MASK);\n\n    // X.ChangeSaveSet(XCB_SET_MODE_INSERT, trayWid) ?\n    //X.ReparentWindow(trayWid, _trayOwnerWid, 0, 0);\n    //X.ReparentWindow(trayWid, _trayDesktopWid, 0, 0);\n\n    //const frameWid = X.AllocID();\n    //frameBrowserWinIdToFrameId.set(trayWid, frameWid);\n    // X.CreateWindow(frameWid, _rootWid, -16, -16, 16, 16, 0, XCB_COPY_FROM_PARENT, 1, XDisplay.screen[0].root_visual, {\n    //   colormap: XDisplay.screen[0].default_colormap,\n    //   backgroundPixel: _currentColorPixel,\n    //   borderPixel: 0,\n    // });\n\n    X.ChangeWindowAttributes(trayWid, {\n      backgroundPixel: _currentColorPixel,\n    });\n\n    //X.ReparentWindow(trayWid, frameWid, 0, 0);\n    X.ConfigureWindow(trayWid, { width: 16, height: 16 });\n    //X.MapWindow(frameWid);\n  }\n\n  return {\n    onScreenCreated(args) {\n      if (_registered) {\n        return;\n      }\n      _registered = true;\n      //_rootWid = args.root;\n\n      if (typeof _currentColorPixel !== \"number\") {\n        _currentColorPixel = XDisplay.screen[0].black_pixel;\n      }\n\n      _trayOwnerWid = X.AllocID();\n      X.CreateWindow(\n        _trayOwnerWid,\n        args.root,\n        -1,\n        -1,\n        1,\n        1,\n        0,\n        XCB_COPY_FROM_PARENT,\n        1,\n        XDisplay.screen[0].root_visual,\n        {\n          colormap: XDisplay.screen[0].default_colormap,\n          backgroundPixel: _currentColorPixel,\n          borderPixel: 0,\n        }\n      );\n\n      changeWindowEventMask(X, _trayOwnerWid, TRAY_OWNER_EVENT_MASK);\n\n      X.ChangeProperty(\n        XPropMode.Replace,\n        _trayOwnerWid,\n        atoms._NET_SYSTEM_TRAY_ORIENTATION,\n        X.atoms.INTEGER,\n        32,\n        numsToBuffer([SystemTrayOrientation._NET_SYSTEM_TRAY_ORIENTATION_HORZ])\n      );\n\n      const selection = atoms[TraySelectionAtom];\n\n      const eventData = Buffer.alloc(32);\n      eventData.writeUInt8(X11_EVENT_TYPE.ClientMessage, 0);\n      eventData.writeUInt8(32, 1); // Format\n      eventData.writeUInt32LE(args.root, 4); // Window ID\n      eventData.writeUInt32LE(atoms.MANAGER, 8); // Message Type\n      eventData.writeUInt32LE(0, 12); // data32[0] - timestamp ?\n      eventData.writeUInt32LE(selection, 16); // data32[1] - manager selection atom\n      eventData.writeUInt32LE(_trayOwnerWid, 20); // data32[2] - the window owning the selection\n      eventData.writeUInt32LE(0, 24); // data32[3] - N/A\n      eventData.writeUInt32LE(0, 28); // data32[4] - N/A\n\n      X.SetSelectionOwner(_trayOwnerWid, selection);\n\n      X.SendEvent(args.root, false, 0xffffff, eventData);\n      log(`Registered ${_trayOwnerWid} as tray selection owner for ${TraySelectionAtom}.`);\n\n      // X.ClearArea(_trayOwnerWid, 0, 0, 1, 1, 1);\n\n      // X.MapWindow(_trayOwnerWid);\n    },\n\n    onUnmapNotify(args) {\n      if (isTrayWin(args.wid)) {\n        store.dispatch(removeTrayWindowAction(args.wid));\n\n        const frameId = frameBrowserWinIdToFrameId.get(args.wid);\n        if (typeof frameId === \"number\") {\n          X.DestroyWindow(frameId);\n        }\n      }\n    },\n\n    onClientMessage(args) {\n      if (args.messageType === atoms._NET_SYSTEM_TRAY_OPCODE) {\n        switch (args.data[1]) {\n          case SystemTrayOps.SYSTEM_TRAY_REQUEST_DOCK:\n            {\n              const widToDock = args.data[2];\n              log(`SYSTEM_TRAY_REQUEST_DOCK, widToDock=${widToDock}`);\n              dockTrayWindow(widToDock);\n            }\n            break;\n\n          case SystemTrayOps.SYSTEM_TRAY_BEGIN_MESSAGE:\n            {\n              const trayWid = args.wid;\n              const timeout = args.data[2]; // milliseconds, or zero for infinite.\n              const messageLength = args.data[3];\n              const messageId = args.data[4];\n              log(\n                `SYSTEM_TRAY_BEGIN_MESSAGE, trayWid=${trayWid}, id=${messageId}, len=${messageLength}, timeout=${timeout}`\n              );\n\n              _notificationState[trayWid][messageId] = {\n                text: \"\",\n                totalSize: messageLength,\n                receivedSize: 0,\n              };\n            }\n            break;\n\n          case SystemTrayOps.SYSTEM_TRAY_CANCEL_MESSAGE:\n            {\n              const trayWid = args.wid;\n              const messageId = args.data[2];\n              log(`SYSTEM_TRAY_CANCEL_MESSAGE, trayWid=${trayWid}, id=${messageId}`);\n\n              delete _notificationState[trayWid][messageId];\n\n              // TODO: If already shown, hide it.\n            }\n            break;\n\n          default:\n            log(\"Unhandled system tray op\", args.data[1], SystemTrayOps[args.data[1]]);\n            break;\n        }\n      } else if (args.messageType === atoms._NET_SYSTEM_TRAY_MESSAGE_DATA) {\n        const trayWid = args.wid;\n        let stateEntry;\n        for (const messageId in _notificationState[trayWid]) {\n          if (stateEntry) {\n            logError(`_NET_SYSTEM_TRAY_MESSAGE_DATA: Unexpected: multiple notification entries`);\n          }\n          stateEntry = _notificationState[trayWid][messageId];\n        }\n        if (!stateEntry) {\n          logError(`_NET_SYSTEM_TRAY_MESSAGE_DATA: Unexpected: message data for non-existent notification`);\n          return;\n        }\n        const sizeToRead = Math.min(20, stateEntry.totalSize - stateEntry.receivedSize);\n        const textBuffer = numsToBuffer(args.data);\n        const partialText = textBuffer.toString(\"utf8\", 0, sizeToRead);\n        log(`_NET_SYSTEM_TRAY_MESSAGE_DATA, trayWid=${trayWid}, partial=${partialText}`);\n\n        stateEntry.text += partialText;\n        stateEntry.receivedSize += sizeToRead;\n\n        if (stateEntry.receivedSize === stateEntry.totalSize) {\n          log(`_NET_SYSTEM_TRAY_MESSAGE_DATA, trayWid=${trayWid}, message complete=${stateEntry.text}`);\n        }\n      }\n    },\n\n    onReduxAction(args) {\n      if (configureTrayWindowAction.match(args.action)) {\n        const state = args.getState();\n        const payload = args.action.payload as ConfigureTrayPayload;\n        const wid = payload.wid;\n        const win = state.tray.windows[wid];\n        if (!win) {\n          return;\n        }\n\n        const screen = state.screens[payload.screenIndex];\n\n        const trayConfig: IGeometry = {\n          x: screen.x + payload.x,\n          y: screen.y + payload.y,\n          width: payload.width,\n          height: payload.height,\n        };\n\n        log(`Configuring tray window ${wid}`, trayConfig);\n\n        const frameWid = frameBrowserWinIdToFrameId.get(wid);\n        if (typeof frameWid === \"number\") {\n          X.ConfigureWindow(frameWid, trayConfig);\n          X.ConfigureWindow(wid, {\n            x: 0,\n            y: 0,\n            width: payload.width,\n            height: payload.height,\n          });\n        } else {\n          X.ConfigureWindow(wid, trayConfig);\n        }\n\n        X.MapWindow(wid);\n\n        // Sometimes tray windows that existed prior to the window manager\n        // starting up will be behind the desktop. Raise them just in case.\n        if (typeof frameWid === \"number\") {\n          X.RaiseWindow(frameWid);\n        }\n        X.RaiseWindow(wid);\n      } else if (setTrayBackgroundColorAction.match(args.action)) {\n        const [r, g, b] = args.action.payload;\n        const state = args.getState();\n        X.AllocColor(XDisplay.screen[0].default_colormap, r * 256, g * 256, b * 256, function (err, color) {\n          log(\"Changing tray window bg color\", color);\n\n          _currentColorPixel = color.pixel;\n\n          if (_trayOwnerWid !== 0) {\n            X.ChangeWindowAttributes(_trayOwnerWid, {\n              backgroundPixel: _currentColorPixel,\n            });\n            X.ClearArea(_trayOwnerWid, 0, 0, 1, 1, 1);\n          }\n\n          for (const trayWidStr in state.tray.windows) {\n            const trayWid = parseInt(trayWidStr, 10);\n            const trayInfo = state.tray.windows[trayWidStr];\n            X.ChangeWindowAttributes(trayWid, {\n              backgroundPixel: _currentColorPixel,\n            });\n            X.ClearArea(trayWid, 0, 0, trayInfo.location.width, trayInfo.location.height, 1);\n          }\n\n          frameBrowserWinIdToFrameId.forEach((frameWid, trayWid) => {\n            const trayInfo = state.tray.windows[trayWid];\n            X.ChangeWindowAttributes(frameWid, {\n              backgroundPixel: _currentColorPixel,\n            });\n            X.ClearArea(frameWid, 0, 0, trayInfo.location.width, trayInfo.location.height, 1);\n          });\n        });\n      }\n    },\n  };\n}\n", "import { readFile, readdir } from \"node:fs/promises\";\nimport { existsSync } from \"node:fs\";\nimport { extname, isAbsolute, join } from \"node:path\";\nimport { XWMContext } from \"./wm\";\nimport { UserDirectoryKind, getXDGUserDirectory } from \"./xdg\";\nimport { DesktopEntry, DesktopEntryKind, DesktopEntryMap, setDesktopEntries, setEntries } from \"@bond-wm/shared\";\nimport { log, logError } from \"./log\";\nconst DesktopEntryObject = require(\"freedesktop-desktop-entry\");\nconst FreedesktopIcons = require(\"freedesktop-icons\") as FreedesktopIconsModule;\n\ninterface DesktopEntryObjectShape {\n  JSON: Record<string, DesktopEntryObjectGroup>;\n}\n\ninterface DesktopEntryObjectGroup {\n  entries: DesktopEntryObjectEntries;\n  comment: string;\n  precedingComment: string[];\n}\n\ninterface DesktopEntryObjectEntries {\n  [name: string]: DesktopEntryObjectEntryProperties;\n}\n\ninterface DesktopEntryObjectEntryProperties {\n  value: string;\n  comment: string;\n  precedingComment: string[];\n}\n\ninterface FreedesktopIconsModule {\n  (\n    icons: IconDescription | IconDescription[],\n    themes?: string[] | string,\n    exts?: string[] | string,\n    fallbackPaths?: string[] | string\n  ): Promise<string | null>;\n\n  clearCache(): void;\n}\n\ninterface IconDescription {\n  name: string;\n\n  /* filters each theme's icon directories, case-insensitive */\n  type?: \"fixed\" | \"scalable\" | \"threshold\";\n  context?: string;\n  size?: number;\n  scale?: number;\n}\n\ninterface IDesktopEntryIconData {\n  data: Buffer;\n  mimeType: string;\n}\n\nexport interface DesktopEntriesModule {\n  launchDesktopEntry(entryName: string): void;\n  getDesktopEntryIcon(entryName: string): Promise<IDesktopEntryIconData | null>;\n}\n\nconst DesktopFileDirectories = [\n  \"/usr/share/applications\",\n  \"/usr/local/share/applications\",\n  \"~/.local/share/applications\",\n];\n\nexport async function createDesktopEntriesModule({ store, wmServer }: XWMContext): Promise<DesktopEntriesModule> {\n  const desktopFolder = await getXDGUserDirectory(UserDirectoryKind.Desktop);\n  if (desktopFolder && existsSync(desktopFolder)) {\n    const desktopEntries = await parseDesktopEntries(desktopFolder);\n    store.dispatch(setDesktopEntries(desktopEntries));\n  }\n\n  const allEntries = {};\n  for (const folder of DesktopFileDirectories) {\n    if (!existsSync(folder)) {\n      continue;\n    }\n    const addlEntries = await parseDesktopEntries(folder);\n    if (addlEntries) {\n      Object.assign(allEntries, addlEntries);\n    }\n  }\n  store.dispatch(setEntries(allEntries));\n\n  function getEntryFromStore(entryName: string): DesktopEntry | null | undefined {\n    const state = store.getState().desktop;\n    return state?.desktopEntries[entryName] ?? state?.entries[entryName];\n  }\n\n  const iconDataByName: Map<string, IDesktopEntryIconData | null> = new Map();\n\n  return {\n    launchDesktopEntry(entryName: string): void {\n      log(\"launchDesktopEntry\", entryName);\n\n      const entry = getEntryFromStore(entryName);\n      if (entry) {\n        switch (entry.kind) {\n          case DesktopEntryKind.Application:\n            {\n              const exec = sanitizeExecString(entry.target);\n              if (exec) {\n                wmServer.launchProcess(exec);\n              }\n            }\n            break;\n          default:\n            logError(`Unhandled desktop entry kind: ${entry.kind}`);\n            break;\n        }\n      }\n    },\n\n    async getDesktopEntryIcon(entryName: string): Promise<IDesktopEntryIconData | null> {\n      const entry = getEntryFromStore(entryName);\n      if (!entry || !entry.icon) {\n        return null;\n      }\n\n      if (iconDataByName.has(entry.key)) {\n        return iconDataByName.get(entry.key) ?? null;\n      }\n      const iconData = await parseDesktopEntryIcon(entry.icon);\n      iconDataByName.set(entry.key, iconData);\n      return iconData;\n    },\n  };\n}\n\nasync function parseDesktopEntries(desktopFolder: string): Promise<DesktopEntryMap> {\n  const entries: DesktopEntryMap = {};\n  const files = await readdir(desktopFolder, {});\n\n  for (const fileName of files) {\n    if (!isDesktopFile(fileName)) {\n      continue;\n    }\n    const filePath = join(desktopFolder, fileName);\n    const object = new DesktopEntryObject(filePath) as DesktopEntryObjectShape;\n    const desktopEntryGroup = object.JSON[\"Desktop Entry\"];\n    if (!desktopEntryGroup || !desktopEntryGroup.entries) {\n      continue;\n    }\n    const desktopEntryGroupEntries = desktopEntryGroup.entries;\n    if (\n      isTrueValue(desktopEntryGroupEntries[\"NoDisplay\"]?.value) ||\n      isTrueValue(desktopEntryGroupEntries[\"Hidden\"]?.value)\n    ) {\n      continue;\n    }\n\n    const categoriesValue = desktopEntryGroupEntries[\"Categories\"]?.value;\n\n    const categories = ensureArray(categoriesValue, \"Others\");\n\n    const assignedCategory = categories[0] ?? \"Others\";\n\n    function ensureArray(value: unknown, defaultValue: string): string[] {\n      if (Array.isArray(value)) {\n        return value;\n      }\n      if (typeof value === \"string\") {\n        return [value];\n      }\n      return [defaultValue];\n    }\n\n    const entry: DesktopEntry = {\n      key: fileName,\n      name: desktopEntryGroupEntries[\"Name\"]?.value,\n      kind: parseDesktopEntryKind(desktopEntryGroupEntries[\"Type\"]?.value),\n      icon: desktopEntryGroupEntries[\"Icon\"]?.value,\n      categories: [assignedCategory],\n    };\n    if (!entry.name) {\n      continue;\n    }\n    switch (entry.kind) {\n      case DesktopEntryKind.Application:\n        entry.target = desktopEntryGroupEntries[\"Exec\"]?.value;\n        entry.workingDirectory = desktopEntryGroupEntries[\"Path\"]?.value;\n        break;\n      case DesktopEntryKind.Link:\n        entry.target = desktopEntryGroupEntries[\"URL\"]?.value;\n        break;\n      case DesktopEntryKind.Directory:\n        continue; // Not supporting currently.\n    }\n    entries[fileName] = entry;\n  }\n\n  return entries;\n}\n\nfunction isDesktopFile(fileName: string): boolean {\n  return fileName.endsWith(\".desktop\");\n}\n\nfunction isTrueValue(value: string | null | undefined): boolean {\n  return value === \"true\";\n}\n\nfunction parseDesktopEntryKind(typeString: string): DesktopEntryKind {\n  switch (typeString) {\n    case \"Link\":\n      return DesktopEntryKind.Link;\n    case \"Directory\":\n      return DesktopEntryKind.Directory;\n    case \"Application\":\n    default:\n      return DesktopEntryKind.Application;\n  }\n}\n\nconst IconFallbackPaths = [\"/usr/share/pixmaps\", \"/usr/share/icons\"];\n\nasync function parseDesktopEntryIcon(iconString: string): Promise<IDesktopEntryIconData | null> {\n  if (!iconString) {\n    return null;\n  }\n  if (isAbsolute(iconString)) {\n    return await readIconAsync(iconString);\n  }\n\n  // First probe for SVG alone. The API seems to not return SVG otherwise, preferring 256px png.\n  const svgPath = await FreedesktopIcons(\n    [\n      {\n        name: iconString,\n        type: \"scalable\",\n      },\n    ],\n    undefined,\n    [\"svg\"]\n  );\n  if (svgPath) {\n    return await readIconAsync(svgPath);\n  }\n\n  const pngPath = await FreedesktopIcons(\n    [\n      {\n        name: iconString,\n        size: 48,\n      },\n      { name: iconString },\n    ],\n    undefined,\n    [\"png\"],\n    IconFallbackPaths\n  );\n  if (pngPath) {\n    return await readIconAsync(pngPath);\n  }\n\n  return null;\n}\n\nasync function readIconAsync(iconPath: string): Promise<IDesktopEntryIconData | null> {\n  log(\"Reading icon path: \" + iconPath);\n  switch (extname(iconPath).toLowerCase()) {\n    case \".png\":\n      {\n        const fileBytes = await readFile(iconPath);\n        return {\n          data: fileBytes,\n          mimeType: \"image/png\",\n        };\n        // return \"data:image/png;base64,\" + encodeArrayBufferToBase64(fileBytes);\n      }\n      break;\n    case \".svg\":\n      {\n        const fileBytes = await readFile(iconPath);\n        return {\n          data: fileBytes,\n          mimeType: \"image/svg+xml\",\n        };\n        // return \"data:image/svg+xml;base64,\" + encodeArrayBufferToBase64(fileBytes);\n      }\n      break;\n  }\n  return null;\n}\n\nfunction sanitizeExecString(exec: string | null | undefined): string {\n  if (typeof exec !== \"string\") {\n    return \"\";\n  }\n\n  return exec\n    .replaceAll(\"%u\", \"\")\n    .replaceAll(\"%U\", \"\")\n    .replaceAll(\"%f\", \"\")\n    .replaceAll(\"%F\", \"\")\n    .replaceAll(\"%i\", \"\")\n    .replaceAll(\"%c\", \"\")\n    .replaceAll(\"%k\", \"\")\n    .trim();\n}\n", "import { existsSync, readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { app } from \"electron\";\nimport { logError } from \"./log\";\nimport { setVersionAction } from \"@bond-wm/shared\";\nimport { ServerStore } from \"./configureStore\";\n\ninterface VersionJson {\n  version: string;\n}\n\nexport function readVersionInfo(store: ServerStore): void {\n  const versionJsonPath = join(app.getAppPath(), \"dist\", \"version.json\");\n  if (!existsSync(versionJsonPath)) {\n    logError(`version.json missing at '${versionJsonPath}'`);\n    return;\n  }\n\n  const versionJson: VersionJson = JSON.parse(readFileSync(versionJsonPath, \"utf-8\"));\n\n  store.dispatch(setVersionAction(versionJson.version));\n}\n", "import { session } from \"electron\";\n\n/** Initialize CSP header sending. */\nexport function setupContentSecurityPolicy(): void {\n  // Currently this just helps suppress the devtools warning in the browser windows\n  // by preventing unsafe-eval. It would be nice to build out something more\n  // sophisticated for CSP to make it easy to increase the strictness.\n  session.defaultSession.webRequest.onHeadersReceived((details, callback) => {\n    callback({\n      responseHeaders: {\n        ...details.responseHeaders,\n        \"Content-Security-Policy\": [\"script-src * 'unsafe-inline'\"],\n      },\n    });\n  });\n}\n", "const x11: IX11Mod = require(\"x11\");\n\nimport * as path from \"path\";\nimport * as os from \"os\";\nimport {\n  app,\n  ipcMain,\n  BrowserWindow,\n  HandlerDetails,\n  BrowserWindowConstructorOptions,\n  DidCreateWindowDetails,\n} from \"electron\";\nimport {\n  IBounds,\n  IGeometry,\n  IScreen,\n  IPCMessages,\n  IWindowManagerServer,\n  KeyRegistrationMap,\n  LayoutPluginConfig,\n  WindowType,\n  XWMEventConsumerArgs,\n  XWMEventConsumerArgsWithType,\n  XWMEventConsumerKeyPressArgs,\n  XWMWindowType,\n  geometriesDiffer,\n  getConfig,\n  getConfigWithOverrides,\n  getLayoutPluginName,\n  selectVisibleWindowsFromCurrentTags,\n  setConfig,\n  setConfigAction,\n  X11_EVENT_TYPE,\n  IXEvent,\n  IXConfigureEvent,\n  IXScreen,\n  IXDisplay,\n  IXClient,\n  IXKeyEvent,\n  XCbWithErr,\n  XGeometry,\n  XWindowAttrs,\n  IXPropertyNotifyEvent,\n  XMapState,\n  XCB_EVENT_MASK_NO_EVENT,\n  IX11Mod,\n  IX11Client,\n  XFocusRevertTo,\n  PointerRoot,\n  IXConfigureInfo,\n  CWMaskBits,\n  IClientMessageEvent,\n  Atom,\n  IXMotionNotifyEvent,\n  IXButtonReleaseEvent,\n  WMSizeHints,\n  WMHintsStates,\n  ContextMenuKind,\n  anyIntersect,\n  arraysEqual,\n  fitGeometryWithinAnother,\n  requireXinerama,\n  addWindowAction,\n  configureWindowAction,\n  focusWindowAction,\n  removeWindowAction,\n  setFrameExtentsAction,\n  setWindowFullscreenAction,\n  setWindowIntoScreenAction,\n  setWindowMaximizedAction,\n  setWindowMinimizedAction,\n  setWindowTagsAction,\n  setWindowTitleAction,\n  setWindowVisibleAction,\n  addScreenAction,\n  setScreenCurrentTagsAction,\n  setScreenZoomLevelAction,\n  getWindowMinHeight,\n  getWindowMinWidth,\n  IWindow,\n  windowAcceptsFocus,\n  switchToNextLayout,\n} from \"@bond-wm/shared\";\nimport { spawn } from \"child_process\";\nimport { AsyncReturnType, Writable } from \"type-fest\";\nimport { log, logDir, logError } from \"./log\";\nimport { configureWMStore, ServerRootState, ServerStore } from \"./configureStore\";\nimport { Action, Middleware, UnknownAction, isAction } from \"redux\";\nimport { ViteDevServer, createServer as createViteServer } from \"vite\";\nimport { ViteNodeServer } from \"vite-node/server\";\nimport { ViteNodeRunner } from \"vite-node/client\";\nimport { installSourcemapsSupport } from \"vite-node/source-map\";\nimport { createEWMHEventConsumer } from \"./ewmh\";\nimport { changeWindowEventMask, getPropertyValue, internAtomAsync } from \"./xutils\";\nimport { getScreenIndexWithCursor, queryPointer } from \"./pointer\";\nimport { createICCCMEventConsumer, getNormalHints, getWMClass, getWMHints, getWMTransientFor } from \"./icccm\";\nimport { createMotifModule, hasMotifDecorations } from \"./motif\";\nimport { showContextMenu } from \"./menus\";\nimport { setupAutocompleteListener } from \"./autocomplete\";\nimport { createDragModule } from \"./drag\";\nimport { loggingEnabled } from \"./args\";\nimport { createShortcutsModule } from \"./shortcuts\";\nimport { assert } from \"./assert\";\nimport { determineConfigPath } from \"./config\";\nimport { createTrayEventConsumer } from \"./systray\";\nimport { createDesktopEntriesModule } from \"./desktopEntries\";\nimport { readVersionInfo } from \"./version\";\nimport { fileURLToPath } from \"node:url\";\nimport { dirname } from \"path\";\nimport { setupContentSecurityPolicy } from \"./csp\";\nimport { updateWindowTagsForNextScreen } from \"./window\";\n\n// Path constants\nconst __dirname = dirname(fileURLToPath(import.meta.url));\nconst PRELOAD_JS = path.resolve(path.join(__dirname, \"preload.js\"));\n\n// The values here are arbitrary; we call InternAtom to get the true constants.\nexport const ExtraAtoms = {\n  UTF8_STRING: -1,\n\n  WM_PROTOCOLS: 10000,\n  WM_DELETE_WINDOW: 10001,\n\n  _NET_WM_NAME: 340,\n};\n\nconst NO_EVENT_MASK = x11.eventMask.None;\n\nconst ROOT_WIN_EVENT_MASK =\n  x11.eventMask.SubstructureRedirect |\n  x11.eventMask.SubstructureNotify |\n  x11.eventMask.EnterWindow |\n  x11.eventMask.LeaveWindow |\n  x11.eventMask.StructureNotify |\n  x11.eventMask.ButtonPress |\n  x11.eventMask.ButtonRelease |\n  x11.eventMask.FocusChange |\n  x11.eventMask.PropertyChange;\n\nconst FRAME_WIN_EVENT_MASK =\n  x11.eventMask.StructureNotify |\n  x11.eventMask.EnterWindow |\n  x11.eventMask.LeaveWindow |\n  x11.eventMask.SubstructureRedirect |\n  x11.eventMask.PointerMotion |\n  x11.eventMask.ButtonRelease |\n  x11.eventMask.KeyPress;\n\nconst CLIENT_WIN_EVENT_MASK =\n  x11.eventMask.StructureNotify |\n  x11.eventMask.PropertyChange |\n  x11.eventMask.FocusChange |\n  x11.eventMask.PointerMotion;\n\nexport interface XWMEventConsumerSetFrameExtentsArgs extends XWMEventConsumerArgs {\n  frameExtents: IBounds;\n}\n\nexport interface XWMEventConsumerClientMessageArgs extends XWMEventConsumerArgsWithType {\n  messageType: Atom;\n  data: number[];\n}\n\nexport interface XWMEventConsumerScreenCreatedArgs {\n  /** Root window id. */\n  root: number;\n  /** Window id of the desktop window created for the screen. */\n  desktopWindowId: number;\n}\n\nexport interface XWMEventConsumerReduxActionArgs {\n  action: Action;\n  getState(): ServerRootState;\n}\n\nexport interface XWMEventConsumerPointerMotionArgs extends XWMEventConsumerArgsWithType {\n  rootx: number;\n  rooty: number;\n}\n\nexport interface IXWMEventConsumer {\n  onScreenCreated?(args: XWMEventConsumerScreenCreatedArgs): void;\n  onReduxAction?(args: XWMEventConsumerReduxActionArgs): void;\n\n  onClientMessage?(args: XWMEventConsumerClientMessageArgs): void;\n  onMapNotify?(args: XWMEventConsumerArgsWithType): void;\n  onUnmapNotify?(args: XWMEventConsumerArgsWithType): void;\n  onPointerMotion?(args: XWMEventConsumerPointerMotionArgs): void;\n  onButtonRelease?(args: XWMEventConsumerArgsWithType): void;\n  onKeyPress?(args: XWMEventConsumerKeyPressArgs): boolean;\n\n  onSetFrameExtents?(args: XWMEventConsumerSetFrameExtentsArgs): void;\n}\n\nexport interface XWMContext {\n  X: IXClient;\n  XDisplay: IXDisplay;\n  store: ServerStore;\n  wmServer: IWindowManagerServer;\n\n  getWindowIdFromFrameId(wid: number): number | undefined;\n  getFrameIdFromWindowId(wid: number): number | undefined;\n}\n\nexport function startWindowManager(): Promise<IWindowManagerServer> {\n  return createServer();\n}\n\nexport async function createServer(): Promise<IWindowManagerServer> {\n  let XDisplay: IXDisplay;\n  let X: IXClient;\n\n  const eventConsumers: IXWMEventConsumer[] = [];\n\n  let desktopEntriesModule: AsyncReturnType<typeof createDesktopEntriesModule>;\n  let ewmhModule: AsyncReturnType<typeof createEWMHEventConsumer>;\n  let dragModule: AsyncReturnType<typeof createDragModule>;\n  let motif: AsyncReturnType<typeof createMotifModule>;\n  let shortcuts: AsyncReturnType<typeof createShortcutsModule>;\n\n  const layoutsByScreen: Map<number, readonly LayoutPluginConfig[]> = new Map();\n\n  const knownWids = new Set<number>();\n  const winIdToRootId: { [wid: number]: number } = {};\n\n  const desktopBrowsers: (BrowserWindow | null)[] = [];\n  /** Desktop window handle to index into `desktopBrowsers`. */\n  const desktopBrowserHandles: { [did: number]: number } = {};\n  const screenIndexToDesktopId: { [screenIndex: number]: number } = {};\n\n  const frameBrowserWindows: { [wid: number]: BrowserWindow | undefined } = {};\n  const frameBrowserWinIdToFrameId: { [wid: number]: number | undefined } = {};\n  const frameBrowserFrameIdToWinId: { [fid: number]: number | undefined } = {};\n  let frameBrowserOnDeck: {\n    win: BrowserWindow;\n    fid: number;\n    winLoadPromise: Promise<void>;\n  } | null = null;\n\n  const initializingWins: { [win: number]: boolean } = {};\n\n  let childWindowCounter = 0;\n  const childWindows: Map<string, { wid: number | null; alwaysOnTop: boolean }> = new Map();\n\n  let ignoreEnterLeave = false;\n\n  /**\n   * The last frame extents used for a window.\n   * Since the frame takes a little bit to render, and the extents are usually the same,\n   * we track this and use these extents as default as an optimization.\n   */\n  let lastFrameExtents: IBounds | undefined;\n\n  const store = __setupStore();\n  await readVersionInfo(store);\n\n  const configPath = await determineConfigPath(store);\n\n  const [viteNodeServer, viteNodeRunner] = await __setupViteNodeServer(configPath);\n  setConfig((await viteNodeRunner.executeId(configPath)).default);\n  const config = getConfig();\n  log(\"Initial config\", config);\n  store.dispatch(setConfigAction(config));\n\n  const viteWebServer = await __setupViteWebServer(configPath);\n  const viteLocalhost = viteWebServer.resolvedUrls?.local[0];\n  log(\"Vite web server at \" + viteLocalhost);\n\n  const desktopLocation = viteLocalhost + \"desktop/index.html\";\n  const frameLocation = viteLocalhost + \"frame/index.html\";\n\n  setupContentSecurityPolicy();\n\n  let context: XWMContext;\n\n  const sendKeyToBrowser = async (args: XWMEventConsumerKeyPressArgs) => {\n    const screenIndex = await getScreenIndexWithCursor(context, args.wid);\n    const browser = desktopBrowsers[screenIndex];\n    if (browser) {\n      browser.webContents.send(\"x-keypress\", {\n        keyString: args.originalKeyString,\n      });\n    }\n  };\n\n  async function destroy(): Promise<void> {\n    await viteNodeServer.close();\n    await viteWebServer.close();\n  }\n\n  const wmServer: IWindowManagerServer = {\n    restart: async () => {\n      await destroy();\n      app.relaunch();\n      app.exit(0);\n    },\n\n    quit: async () => {\n      await destroy();\n      app.quit();\n    },\n\n    closeFocusedWindow,\n    launchProcess,\n\n    registerShortcuts: (registrationMap: KeyRegistrationMap) => {\n      const screens = store.getState().screens;\n      const registeredRootWids = new Set<number>();\n      for (const screen of screens) {\n        const { root } = screen;\n        if (!registeredRootWids.has(root)) {\n          registeredRootWids.add(root);\n          shortcuts.registerShortcuts(root, registrationMap);\n        }\n      }\n    },\n\n    sendActiveWindowToNextScreen,\n    sendActiveWindowToTag,\n    setTagIndexForActiveDesktop,\n    showDevtoolsForFocusedWindowFrame,\n    startDragFocusedWindow,\n    switchToNextLayout: switchToNextLayoutWM,\n  };\n\n  // Initialization.\n  const client: IX11Client = x11.createClient(async (err: unknown, display: IXDisplay) => {\n    if (err || !display) {\n      logError(err ?? \"No display available.\");\n      process.exit(1);\n    }\n\n    XDisplay = display;\n    X = display.client;\n\n    context = {\n      X,\n      XDisplay,\n      store,\n      wmServer,\n      getWindowIdFromFrameId,\n      getFrameIdFromWindowId,\n    };\n\n    desktopEntriesModule = await createDesktopEntriesModule(context);\n    dragModule = await createDragModule(context, (screenIndex) => layoutsByScreen.get(screenIndex));\n    eventConsumers.push(dragModule);\n    eventConsumers.push(await createICCCMEventConsumer(context));\n    ewmhModule = await createEWMHEventConsumer(context, dragModule);\n    eventConsumers.push(ewmhModule);\n    eventConsumers.push(await createTrayEventConsumer(context));\n\n    motif = await createMotifModule(context);\n    shortcuts = await createShortcutsModule(context);\n    eventConsumers.push(shortcuts);\n\n    await __setupAtoms();\n    await __initDesktop();\n\n    for (let s = 0; s < desktopBrowsers.length; s++) {\n      const layoutPlugins = getConfigWithOverrides(s).layouts;\n      layoutsByScreen.set(s, layoutPlugins ?? []);\n    }\n\n    if (typeof config.onWindowManagerReady === \"function\") {\n      await config.onWindowManagerReady({ wm: wmServer });\n    }\n\n    // Prep one frame window to speed up rendering for the first window.\n    setTimeout(() => createFrameBrowserOnDeck(), 0);\n  });\n\n  client.on(\"error\", logError);\n  client.on(\"event\", __onXEvent);\n\n  ipcMain.on(IPCMessages.RaiseWindow, (event, wid) => {\n    raiseWindow(wid);\n  });\n\n  ipcMain.on(IPCMessages.MinimizeWindow, (event, wid) => {\n    minimize(wid);\n  });\n\n  ipcMain.on(IPCMessages.MaximizeWindow, (event, wid) => {\n    maximize(wid);\n  });\n\n  ipcMain.on(IPCMessages.RestoreWindow, (event, wid) => {\n    restore(wid);\n  });\n\n  ipcMain.on(IPCMessages.CloseWindow, (event, wid) => {\n    closeWindow(wid);\n  });\n\n  ipcMain.on(IPCMessages.FocusDesktopBrowser, (event, args: { screenIndex: number; takeVisualFocus?: boolean }) => {\n    setFocusToDesktopWindow(args.screenIndex, args.takeVisualFocus);\n  });\n\n  ipcMain.on(IPCMessages.FrameWindowMouseEnter, (event, wid) => {\n    // Alternative in case we don't receive PointerMotion over a window.\n    if (ignoreEnterLeave) {\n      widLog(wid, IPCMessages.FrameWindowMouseEnter, \"clearing enterleave ignore\");\n      ignoreEnterLeave = false;\n    }\n  });\n\n  ipcMain.on(IPCMessages.DesktopZoomIn, (event, args: { screenIndex: number }) => {\n    desktopZoomIn(args.screenIndex);\n  });\n\n  ipcMain.on(IPCMessages.DesktopZoomOut, (event, args: { screenIndex: number }) => {\n    desktopZoomOut(args.screenIndex);\n  });\n\n  ipcMain.on(IPCMessages.DesktopZoomReset, (event, args: { screenIndex: number }) => {\n    desktopZoomReset(args.screenIndex);\n  });\n\n  ipcMain.on(IPCMessages.ExecDesktopEntry, (event, args: { entryName: string }) => {\n    desktopEntriesModule.launchDesktopEntry(args.entryName);\n  });\n\n  ipcMain.on(IPCMessages.ShowContextMenu, (event, args: { menuKind: ContextMenuKind }) => {\n    showContextMenu(event, args.menuKind, store.getState().config.version);\n  });\n\n  ipcMain.on(IPCMessages.ShowDesktopDevTools, (event, args: { screenIndex: number }) => {\n    desktopBrowsers[args.screenIndex]?.webContents?.openDevTools();\n  });\n\n  ipcMain.on(IPCMessages.RegisterDesktopShortcut, (event, args: { keyString: string; screenIndex: number }) => {\n    const screen = store.getState().screens[args.screenIndex];\n    shortcuts.registerShortcut(screen.root, args.keyString, sendKeyToBrowser);\n  });\n\n  // ipcMain.on(IPCMessages.UnregisterDesktopShortcut, (event, args: { keyString: string; screenIndex: number }) => {\n  //   // Not implemented yet.\n  // });\n\n  setupAutocompleteListener();\n\n  async function __setupViteNodeServer(configPath: string): Promise<[ViteDevServer, ViteNodeRunner]> {\n    const viteServer = await createViteServer({\n      root: configPath,\n      mode: \"development\",\n      server: {\n        port: 19108,\n      },\n      optimizeDeps: {\n        noDiscovery: true,\n        include: undefined,\n      },\n    });\n    await viteServer.pluginContainer.buildStart({});\n    const viteNodeServer = new ViteNodeServer(viteServer);\n    installSourcemapsSupport({\n      getSourceMap: (source) => viteNodeServer.getSourceMap(source),\n    });\n    const runner = new ViteNodeRunner({\n      root: viteServer.config.root,\n      base: viteServer.config.base,\n      fetchModule(id) {\n        return viteNodeServer.fetchModule(id);\n      },\n      resolveId(id, importer) {\n        return viteNodeServer.resolveId(id, importer);\n      },\n    });\n    await viteServer.listen();\n    return [viteServer, runner];\n  }\n\n  async function __setupViteWebServer(configPath: string): Promise<ViteDevServer> {\n    const viteWebServer = await createViteServer({\n      root: configPath,\n      mode: \"development\",\n      server: {\n        port: 19109,\n      },\n    });\n\n    // Endpoint for \"/icon/[desktopEntry]\" to get an icon image response.\n    viteWebServer.middlewares.use(\"/icon\", async (req, res) => {\n      log(\"Icon request: \" + req.url);\n\n      let desktopEntryName = req.url!;\n      while (desktopEntryName.endsWith(\"/\")) {\n        desktopEntryName = desktopEntryName.substring(0, desktopEntryName.length - 1);\n      }\n      while (desktopEntryName.startsWith(\"/\")) {\n        desktopEntryName = desktopEntryName.substring(1);\n      }\n      const iconInfo = await desktopEntriesModule.getDesktopEntryIcon(desktopEntryName);\n      if (!iconInfo) {\n        res.statusCode = 404;\n        res.end();\n        return;\n      }\n      res.setHeader(\"Content-Type\", iconInfo.mimeType);\n      res.end(iconInfo.data);\n    });\n    viteWebServer.middlewares.stack.unshift(viteWebServer.middlewares.stack.pop()!);\n\n    await viteWebServer.listen();\n    return viteWebServer;\n  }\n\n  async function __setupAtoms(): Promise<void> {\n    // TODO: Typings are a little awkward here.\n    /* eslint-disable @typescript-eslint/no-explicit-any */\n    const extraAtoms = ExtraAtoms as Writable<typeof ExtraAtoms>;\n    extraAtoms.UTF8_STRING = (await internAtomAsync(X, \"UTF8_STRING\")) as any;\n\n    extraAtoms.WM_PROTOCOLS = (await internAtomAsync(X, \"WM_PROTOCOLS\")) as any;\n    extraAtoms.WM_DELETE_WINDOW = (await internAtomAsync(X, \"WM_DELETE_WINDOW\")) as any;\n\n    extraAtoms._NET_WM_NAME = (await internAtomAsync(X, \"_NET_WM_NAME\")) as any;\n\n    log(\"ExtraAtoms\", extraAtoms);\n    /* eslint-enable @typescript-eslint/no-explicit-any */\n  }\n\n  async function __initDesktop(): Promise<void> {\n    for (const screen of XDisplay.screen) {\n      await __initScreen(screen);\n    }\n\n    // Set focus to the initial window/desktop.\n    const firstDesktopWid = getNextFocusWidForScreen(0, undefined);\n    if (typeof firstDesktopWid === \"number\") {\n      setFocus(firstDesktopWid);\n    }\n  }\n\n  async function __initScreen(screen: IXScreen): Promise<void> {\n    const root = screen.root;\n\n    const debugScreen = Object.assign({}, screen);\n    delete (debugScreen as any).depths; // eslint-disable-line\n    log(\"Processing X screen\", debugScreen);\n\n    X.GrabServer();\n\n    changeWindowEventMask(X, root, ROOT_WIN_EVENT_MASK);\n\n    X.UngrabServer();\n\n    const logicalScreens = await getScreenGeometries(screen);\n    log(\"Obtained logical screens\", logicalScreens);\n\n    for (const logicalScreen of logicalScreens) {\n      store.dispatch(\n        addScreenAction({\n          x: logicalScreen.x,\n          y: logicalScreen.y,\n          width: logicalScreen.width,\n          height: logicalScreen.height,\n          root,\n          tags: config.tags,\n          initialTag: config.initialTag,\n          initialLayout: config.initialLayout,\n        })\n      );\n\n      const did = await createDesktopBrowser({\n        x: logicalScreen.x,\n        y: logicalScreen.y,\n        width: logicalScreen.width,\n        height: logicalScreen.height,\n      });\n\n      X.ReparentWindow(did, root, logicalScreen.x, logicalScreen.y);\n\n      X.ConfigureWindow(did, {\n        borderWidth: 0,\n        x: logicalScreen.x,\n        y: logicalScreen.y,\n        width: logicalScreen.width,\n        height: logicalScreen.height,\n      });\n    }\n\n    X.QueryTree(root, (err, tree) => {\n      tree.children.forEach((childWid) => manageWindow(childWid, { screenIndex: 0, checkUnmappedState: true }));\n    });\n\n    X.SetInputFocus(PointerRoot, XFocusRevertTo.PointerRoot);\n\n    eventConsumers.forEach((consumer) =>\n      consumer.onScreenCreated?.({\n        root,\n        desktopWindowId: screenIndexToDesktopId[0],\n      })\n    );\n  }\n\n  function isDesktopBrowserWin(wid: number): boolean {\n    return desktopBrowserHandles.hasOwnProperty(wid);\n  }\n\n  function isFrameBrowserWin(wid: number): boolean {\n    return frameBrowserFrameIdToWinId.hasOwnProperty(wid) || frameBrowserOnDeck?.fid === wid;\n  }\n\n  function isTrayWin(wid: number): boolean {\n    return wid in store.getState().tray.windows;\n  }\n\n  function getFrameIdFromWindowId(wid: number): number | undefined {\n    return frameBrowserWinIdToFrameId[wid];\n  }\n\n  function getWindowIdFromFrameId(wid: number): number | undefined {\n    return frameBrowserFrameIdToWinId[wid];\n  }\n\n  function getRootIdFromWindowId(wid: number): number | undefined {\n    return winIdToRootId[wid];\n  }\n\n  async function createDesktopBrowser(props: IGeometry): Promise<number> {\n    const win = new BrowserWindow({\n      frame: false,\n      fullscreen: true,\n      width: props.width,\n      height: props.height,\n      x: props.x,\n      y: props.y,\n      type: \"desktop\",\n      webPreferences: {\n        preload: PRELOAD_JS,\n      },\n    });\n\n    const index = desktopBrowsers.length;\n    desktopBrowsers[index] = win;\n\n    const handle = getNativeWindowHandleInt(win);\n    if (!handle) {\n      logError(\"Browser handle was null\");\n    }\n    desktopBrowserHandles[handle] = index;\n    screenIndexToDesktopId[index] = handle;\n\n    log(\"Created browser window\", handle);\n\n    win.webContents.setWindowOpenHandler(onWindowOpen);\n    win.webContents.addListener(\"did-create-window\", onChildWindowCreated);\n\n    if (!desktopLocation) {\n      throw new Error(\"Missing desktop config. Desktop windows cannot be created without a desktop plugin.\");\n    }\n    const url = desktopLocation + \"?screen=\" + index;\n    await win.loadURL(url);\n\n    const zoomLevel = win.webContents.getZoomLevel();\n    if (zoomLevel !== 1) {\n      store.dispatch(setScreenZoomLevelAction({ screenIndex: index, zoom: zoomLevel }));\n    }\n\n    // Uncomment to help debug total failures of the desktop window.\n    // win.webContents.openDevTools({ mode: \"right\" });\n\n    win.on(\"closed\", function () {\n      desktopBrowsers[index] = null;\n    });\n\n    return handle;\n  }\n\n  const FrameBrowserBaseProperties: Electron.BrowserWindowConstructorOptions = {\n    frame: false,\n    backgroundColor: \"#00000000\",\n    transparent: true,\n    hasShadow: false,\n    webPreferences: {\n      preload: PRELOAD_JS,\n    },\n  };\n\n  function createFrameBrowserOnDeck() {\n    if (frameBrowserOnDeck) {\n      return;\n    }\n\n    const win = new BrowserWindow({\n      ...FrameBrowserBaseProperties,\n      show: false,\n    });\n    const winLoadPromise = win.loadURL(frameLocation);\n\n    const fid = getNativeWindowHandleInt(win);\n    if (!fid) {\n      logError(\"Frame window handle was null\");\n    }\n\n    frameBrowserOnDeck = { win, fid, winLoadPromise };\n  }\n\n  function createFrameBrowser(wid: number, screen: IScreen, geometry: IGeometry) {\n    // If we have a pre-made frame window, use it. Otherwise, create one.\n    let win: BrowserWindow;\n    let fid: number;\n    if (frameBrowserOnDeck) {\n      const onDeckInfo = frameBrowserOnDeck;\n      frameBrowserOnDeck = null;\n      win = onDeckInfo.win;\n      fid = onDeckInfo.fid;\n      win.setSize(geometry.width, geometry.height, false);\n      win.setPosition(geometry.x, geometry.y, false);\n      onDeckInfo.winLoadPromise.then(() => {\n        win.webContents.send(IPCMessages.SetFrameWid, wid);\n        win.webContents.setZoomLevel(screen.zoom);\n      });\n      win.show();\n    } else {\n      win = new BrowserWindow({\n        ...FrameBrowserBaseProperties,\n        width: geometry.width,\n        height: geometry.height,\n        x: geometry.x,\n        y: geometry.y,\n      });\n      win.webContents.on(\"did-finish-load\", () => {\n        win.webContents.setZoomLevel(screen.zoom);\n      });\n      win.loadURL(`${frameLocation}?wid=${wid}`);\n\n      fid = getNativeWindowHandleInt(win);\n      if (!fid) {\n        logError(\"Frame window handle was null\");\n      }\n    }\n\n    frameBrowserWindows[wid] = win;\n\n    frameBrowserWinIdToFrameId[wid] = fid;\n    frameBrowserFrameIdToWinId[fid] = wid;\n\n    log(\"Created frame window\", fid);\n\n    if (!frameBrowserOnDeck) {\n      setTimeout(() => createFrameBrowserOnDeck(), 0);\n    }\n\n    return fid;\n  }\n\n  type WindowOpenResult =\n    | { action: \"deny\" }\n    | { action: \"allow\"; outlivesOpener?: boolean; overrideBrowserWindowOptions?: BrowserWindowConstructorOptions };\n\n  function onWindowOpen(details: HandlerDetails): WindowOpenResult {\n    const { url, features } = details;\n    if (url === \"about:blank\" && features?.includes(\"BondWmChildWindow=true\")) {\n      const title = `BondWmChildWindow-${++childWindowCounter}`;\n      const alwaysOnTop = features?.includes(\"alwaysOnTop=true\") ?? false;\n      const windowOpenResult: WindowOpenResult = {\n        action: \"allow\",\n        overrideBrowserWindowOptions: {\n          title,\n          alwaysOnTop,\n          frame: false,\n          fullscreenable: false,\n          resizable: false,\n          backgroundColor: \"#00FFFFFF\", // AARRGGBB\n          transparent: true,\n          hasShadow: false,\n        },\n      };\n      log(\"onWindowOpen\", windowOpenResult);\n      childWindows.set(title, {\n        wid: null, // Assigned when created\n        alwaysOnTop,\n      });\n      return windowOpenResult;\n    }\n    return { action: \"allow\" };\n  }\n\n  function onChildWindowCreated(win: BrowserWindow, details: DidCreateWindowDetails) {\n    log(\"Child window created\", details);\n\n    // win.webContents.openDevTools({ mode: \"detach\" });\n  }\n\n  function __onXEvent(ev: IXEvent) {\n    const { type } = ev;\n\n    switch (type) {\n      case X11_EVENT_TYPE.KeyPress:\n        onKeyPress(ev as IXKeyEvent);\n        break;\n      case X11_EVENT_TYPE.KeyRelease:\n        break;\n      case X11_EVENT_TYPE.ButtonPress:\n        onButtonPress(ev as IXButtonReleaseEvent);\n        break;\n      case X11_EVENT_TYPE.ButtonRelease:\n        onButtonRelease(ev as IXButtonReleaseEvent);\n        break;\n      case X11_EVENT_TYPE.MotionNotify:\n        onPointerMotion(ev as IXMotionNotifyEvent);\n        break;\n      case X11_EVENT_TYPE.EnterNotify:\n        onEnterNotify(ev);\n        break;\n      case X11_EVENT_TYPE.LeaveNotify:\n        onLeaveNotify(ev);\n        break;\n      case X11_EVENT_TYPE.FocusIn:\n        widLog(ev.wid, \"onFocusIn\", ev);\n        break;\n      case X11_EVENT_TYPE.FocusOut:\n        widLog(ev.wid, \"onFocusOut\", ev);\n        break;\n      case X11_EVENT_TYPE.Expose:\n        widLog(ev.wid, \"onExpose\", ev);\n        break;\n      case X11_EVENT_TYPE.CreateNotify:\n        onCreateNotify(ev);\n        break;\n      case X11_EVENT_TYPE.DestroyNotify:\n        onDestroyNotify(ev);\n        break;\n      case X11_EVENT_TYPE.UnmapNotify:\n        onUnmapNotify(ev);\n        break;\n      case X11_EVENT_TYPE.MapNotify:\n        onMapNotify(ev);\n        break;\n      case X11_EVENT_TYPE.MapRequest:\n        onMapRequest(ev);\n        break;\n      case X11_EVENT_TYPE.ReparentNotify:\n        widLog(ev.wid, \"onReparentNotify\", ev);\n        break;\n      case X11_EVENT_TYPE.ConfigureNotify:\n        break;\n      case X11_EVENT_TYPE.ConfigureRequest:\n        onConfigureRequest(ev as IXConfigureEvent);\n        break;\n      case X11_EVENT_TYPE.ClientMessage:\n        onClientMessage(ev as IClientMessageEvent);\n        break;\n      case X11_EVENT_TYPE.PropertyNotify:\n        onPropertyNotify(ev as IXPropertyNotifyEvent);\n        break;\n      default:\n        log(\"Unhandled event\", ev);\n        break;\n    }\n  }\n\n  interface ManageWindowOpts {\n    screenIndex: number;\n    checkUnmappedState: boolean;\n    focusWindow?: boolean;\n  }\n\n  async function manageWindow(wid: number, opts: ManageWindowOpts): Promise<void> {\n    const { checkUnmappedState } = opts;\n    let { screenIndex, focusWindow } = opts;\n\n    widLog(wid, `Manage window on screen ${screenIndex}`);\n\n    if (initializingWins[wid]) {\n      log(`Skip manage, ${wid} is already initializing`);\n      return;\n    }\n    if (knownWids.has(wid)) {\n      log(`Skip manage, ${wid} is known`);\n      return;\n    }\n    if (isFrameBrowserWin(wid)) {\n      log(`Skip manage, ${wid} is a frame window`);\n      return;\n    }\n    if (isTrayWin(wid)) {\n      log(`Skip manage, ${wid} is a tray window`);\n      return;\n    }\n\n    // Make sure we don't respond to too many messages at once.\n    initializingWins[wid] = true;\n    knownWids.add(wid);\n\n    const values = await Promise.all([\n      determineWindowAttributes(wid),\n      determineWindowGeometry(wid),\n      getWindowTitle(wid),\n      getWMClass(X, wid),\n      getWMHints(X, wid),\n      getNormalHints(X, wid),\n      motif.getMotifHints(wid),\n      getWMTransientFor(X, wid),\n      ewmhModule.getNetWmType(wid),\n      ewmhModule.getNetWmIcons(wid),\n    ]);\n\n    const [attrs, clientGeom, title, wmClass, wmHints, normalHints, motifHints, transientFor, winType, icons] = values;\n    log(`got values for ${wid}:`, values);\n\n    const isOverrideRedirect = attrs.overrideRedirect === 1;\n    if (isOverrideRedirect) {\n      log(`Not managing ${wid} due to override redirect.`);\n    }\n\n    const isUnmappedState = checkUnmappedState && attrs.mapState === XMapState.IsUnmapped;\n    if (isUnmappedState) {\n      log(`Not managing ${wid} due to unmapped state.`);\n    }\n\n    const isChildWindow = title?.startsWith(\"BondWmChildWindow-\");\n    if (isChildWindow) {\n      const childWindowInfo = childWindows.get(title!);\n      if (!childWindowInfo) {\n        logError(\"Missing child window info\");\n      } else {\n        childWindowInfo.wid = wid;\n      }\n      log(`Not managing ${wid} due to it being a ChildWindow.`);\n    }\n\n    if (isOverrideRedirect || isUnmappedState || isChildWindow) {\n      delete initializingWins[wid];\n      X.MapWindow(wid);\n      return;\n    }\n\n    ignoreEnterLeave = true;\n\n    X.ChangeSaveSet(1, wid);\n\n    if (shouldCreateFrame(wid, clientGeom)) {\n      const initialGeometry = getInitialGeometryForWindow(clientGeom, normalHints);\n\n      const win: Partial<IWindow> = {\n        outer: {\n          x: initialGeometry.x,\n          y: initialGeometry.y,\n          width: initialGeometry.width,\n          height: initialGeometry.height,\n        },\n        frameExtents: lastFrameExtents,\n        visible: true,\n        type: winType ?? WindowType.Normal,\n        transientFor,\n        decorated: hasMotifDecorations(motifHints),\n        title,\n        wmClass,\n        screenIndex,\n        wmHints,\n        normalHints,\n        icons,\n      };\n\n      const state = store.getState();\n\n      if (typeof config.onWindowCreated === \"function\") {\n        config.onWindowCreated({ win: win as IWindow, state });\n      }\n\n      assert(typeof win.screenIndex === \"number\");\n      assert(win.outer);\n\n      // Accept any update to screenIndex (if it is valid).\n      let screen = state.screens[win.screenIndex];\n      if (screen) {\n        screenIndex = win.screenIndex;\n      } else {\n        win.screenIndex = screenIndex;\n        screen = state.screens[win.screenIndex];\n      }\n\n      if (!win.tags) {\n        win.tags = [screen.currentTags[0]];\n      }\n\n      const [frameX, frameY] = [screen.x + win.outer.x, screen.y + win.outer.y];\n\n      const fid = createFrameBrowser(wid, screen, { ...win.outer, x: frameX, y: frameY });\n      knownWids.add(fid);\n\n      winIdToRootId[wid] = screen.root;\n      winIdToRootId[fid] = screen.root;\n\n      X.ReparentWindow(fid, screen.root, frameX, frameY);\n      X.ReparentWindow(wid, fid, lastFrameExtents?.left || 0, lastFrameExtents?.top || 0);\n\n      X.GrabServer();\n\n      changeWindowEventMask(X, fid, FRAME_WIN_EVENT_MASK);\n      changeWindowEventMask(X, wid, CLIENT_WIN_EVENT_MASK);\n\n      X.UngrabServer();\n\n      X.ConfigureWindow(fid, {\n        borderWidth: 0,\n        x: frameX,\n        y: frameY,\n        width: win.outer.width,\n        height: win.outer.height,\n      });\n      X.ConfigureWindow(wid, { borderWidth: 0 });\n\n      if (lastFrameExtents) {\n        eventConsumers.forEach((consumer) => consumer.onSetFrameExtents?.({ wid, frameExtents: lastFrameExtents! }));\n      }\n\n      store.dispatch(addWindowAction({ wid, ...win }));\n\n      X.MapWindow(fid);\n\n      if (focusWindow && !windowAcceptsFocus(win as IWindow)) {\n        focusWindow = false;\n      }\n    }\n\n    log(\"Initial map of wid\", wid);\n    X.MapWindow(wid);\n\n    if (focusWindow) {\n      setFocus(wid);\n    }\n\n    delete initializingWins[wid];\n  }\n\n  function unmanageWindow(wid: number): void {\n    if (isFrameBrowserWin(wid)) {\n      widLog(wid, `Unmanage frame window`);\n\n      const innerWid = frameBrowserFrameIdToWinId[wid];\n      delete frameBrowserFrameIdToWinId[wid];\n      if (typeof innerWid === \"number\") {\n        delete frameBrowserWinIdToFrameId[innerWid];\n        delete frameBrowserWindows[innerWid];\n      }\n    } else if (isClientWin(wid)) {\n      widLog(wid, `Unmanage window`);\n\n      const focusedWid = getFocusedWindowId();\n      const win = getWinFromStore(wid);\n      if (!win) {\n        return;\n      }\n\n      store.dispatch(removeWindowAction(wid));\n\n      const fid = getFrameIdFromWindowId(wid);\n      if (typeof fid === \"number\" && fid !== wid) {\n        // Reparent the hosted window back to the root before destroying the BrowserWindow.\n        // This prevents a browser save popup closing from taking out the entire browser process for example.\n        // (Presumably destroying the BrowserWindow with a window inside it triggers mass destruction.)\n        const screen = store.getState().screens[win.screenIndex];\n        X.ReparentWindow(wid, screen.root, 0, 0);\n\n        log(\"Destroying BrowserWindow for frame \" + fid);\n        frameBrowserWindows[wid]?.destroy();\n      }\n\n      if (wid === focusedWid && win) {\n        tryReplaceFocusForScreen(win.screenIndex, focusedWid);\n      }\n    }\n\n    knownWids.delete(wid);\n    delete winIdToRootId[wid];\n  }\n\n  function shouldCreateFrame(wid: number, geometry: XGeometry): boolean {\n    if (isDesktopBrowserWin(wid)) {\n      return false;\n    }\n\n    // Positioned negatively outside the desktop.\n    if (geometry.xPos + geometry.width < 0 || geometry.yPos + geometry.height < 0) {\n      return false;\n    }\n\n    // TODO: Positioned positively outside?\n\n    return true;\n  }\n\n  function getInitialGeometryForWindow(clientGeom: XGeometry, normalHints: WMSizeHints | undefined): IGeometry {\n    const initialGeometry = {\n      height: clientGeom.height,\n      width: clientGeom.width,\n      x: clientGeom.xPos,\n      y: clientGeom.yPos,\n    };\n    if (normalHints) {\n      if (normalHints.maxHeight && normalHints.maxHeight > 0) {\n        initialGeometry.height = Math.min(initialGeometry.height, normalHints.maxHeight);\n      }\n      if (normalHints.minHeight && normalHints.minHeight > 0) {\n        initialGeometry.height = Math.max(initialGeometry.height, normalHints.minHeight);\n      }\n      if (normalHints.maxWidth && normalHints.maxWidth > 0) {\n        initialGeometry.width = Math.min(initialGeometry.width, normalHints.maxWidth);\n      }\n      if (normalHints.minWidth && normalHints.minWidth > 0) {\n        initialGeometry.width = Math.max(initialGeometry.width, normalHints.minWidth);\n      }\n    }\n\n    return initialGeometry;\n  }\n\n  function runXCallsWithoutEvents(wid: number, fn: VoidFunction): void {\n    X.GrabServer();\n    try {\n      const root = getRootIdFromWindowId(wid);\n      if (typeof root === \"number\") {\n        changeWindowEventMask(X, root, NO_EVENT_MASK);\n      }\n      const fid = getFrameIdFromWindowId(wid);\n      if (typeof fid === \"number\") {\n        changeWindowEventMask(X, fid, NO_EVENT_MASK);\n      }\n      changeWindowEventMask(X, wid, NO_EVENT_MASK);\n\n      try {\n        fn();\n      } finally {\n        if (typeof root === \"number\") {\n          changeWindowEventMask(X, root, ROOT_WIN_EVENT_MASK);\n        }\n        if (typeof fid === \"number\") {\n          changeWindowEventMask(X, fid, FRAME_WIN_EVENT_MASK);\n        }\n        changeWindowEventMask(X, wid, CLIENT_WIN_EVENT_MASK);\n      }\n    } finally {\n      X.UngrabServer();\n    }\n  }\n\n  async function onCreateNotify(ev: IXEvent) {\n    const { wid } = ev;\n    widLog(wid, \"onCreateNotify\", ev);\n\n    const wmHints = await getWMHints(X, wid);\n    if (knownWids.has(wid)) {\n      widLog(wid, \"onCreateNotify exiting after obtaining WM_HINTS; window was already managed.\");\n      return;\n    }\n\n    const initialState = wmHints?.initialState;\n    if (typeof initialState === \"number\") {\n      widLog(wid, `onCreateNotify initial state: ${initialState} (${WMHintsStates[initialState]})`);\n      // if (initialState === WMHintsStates.IconicState) {\n      //   const screenIndex = Math.max(0, await getScreenIndexWithCursor(context, wid));\n      //   manageWindow(wid, { screenIndex, focusWindow: true, checkUnmappedState: false });\n      // }\n    }\n  }\n\n  async function onMapRequest(ev: IXEvent) {\n    const { wid } = ev;\n    widLog(wid, \"onMapRequest\", ev);\n\n    if (initializingWins[wid]) return;\n\n    if (knownWids.has(wid)) {\n      showWindow(wid);\n    } else {\n      const screenIndex = Math.max(0, await getScreenIndexWithCursor(context, wid));\n      manageWindow(wid, { screenIndex, focusWindow: true, checkUnmappedState: false });\n    }\n  }\n\n  function onMapNotify(ev: IXEvent) {\n    const { wid } = ev;\n    widLog(wid, \"onMapNotify\", ev);\n\n    if (isClientWin(wid)) {\n      eventConsumers.forEach((consumer) => consumer.onMapNotify?.({ wid, windowType: getWindowType(wid) }));\n    }\n  }\n\n  function onUnmapNotify(ev: IXEvent) {\n    const { wid } = ev;\n    widLog(wid, \"onUnmapNotify\", ev);\n\n    eventConsumers.forEach((consumer) => consumer.onUnmapNotify?.({ wid, windowType: getWindowType(wid) }));\n\n    unmanageWindow(wid);\n  }\n\n  function onDestroyNotify(ev: IXEvent) {\n    const { wid } = ev;\n    widLog(wid, \"onDestroyNotify\", ev);\n\n    childWindows.forEach((childWindowInfo, title) => {\n      if (wid === childWindowInfo.wid) {\n        log(`Removing child window ${wid} ${title}`);\n        childWindows.delete(title);\n      }\n    });\n\n    unmanageWindow(wid);\n  }\n\n  function onConfigureRequest(ev: IXConfigureEvent) {\n    const { wid } = ev;\n\n    // Until node-x11 5a1fb64 reaches npm, `mask` needs to be read from the raw data.\n    const mask = (ev.mask = ev.rawData.readUInt16LE(26));\n\n    widLog(wid, \"onConfigureRequest\", ev);\n\n    // Ignore any configure requests for these; we always control their size.\n    if (isFrameBrowserWin(wid)) {\n      return;\n    }\n\n    if (!mask) {\n      return; // There's no requested changes?\n    }\n\n    const config: Partial<IXConfigureInfo> = {};\n    if (mask & CWMaskBits.CWX) {\n      // ev.x is absolute, but our state is relative to the screen.\n      config.x = ev.x;\n    }\n    if (mask & CWMaskBits.CWY) {\n      config.y = ev.y;\n    }\n    if (mask & CWMaskBits.CWWidth) {\n      config.width = ev.width;\n    }\n    if (mask & CWMaskBits.CWHeight) {\n      config.height = ev.height;\n    }\n    if (mask & CWMaskBits.CWBorderWidth) {\n      config.borderWidth = ev.borderWidth;\n    }\n    if (mask & CWMaskBits.CWSibling) {\n      config.sibling = ev.sibling;\n    }\n    if (mask & CWMaskBits.CWStackMode) {\n      // Don't allow the desktop to come to the front.\n      if (!isDesktopBrowserWin(wid)) {\n        config.stackMode = ev.stackMode;\n      }\n    }\n\n    if (isClientWin(wid)) {\n      const win = getWinFromStore(wid);\n      if (!win) {\n        return;\n      }\n      const screen = store.getState().screens[win.screenIndex];\n\n      // ev.x|y is absolute, but our state is relative to the screen.\n      if (mask & CWMaskBits.CWX) {\n        config.x! -= screen.x;\n      }\n      if (mask & CWMaskBits.CWY) {\n        config.y! -= screen.y;\n      }\n\n      if (Object.keys(config).length > 0) {\n        store.dispatch(configureWindowAction({ wid, ...config }));\n      }\n    } else {\n      // Some unmanaged window; pass the call through.\n      X.ConfigureWindow(wid, config);\n    }\n  }\n\n  function onEnterNotify(ev: IXEvent) {\n    const { wid } = ev;\n    widLog(wid, \"onEnterNotify\", ignoreEnterLeave ? \"ignoring\" : \"handling\");\n\n    if (ignoreEnterLeave) {\n      return;\n    }\n\n    focusWindowOnEnter(wid);\n  }\n\n  function focusWindowOnEnter(wid: number): void {\n    const isFrame = isFrameBrowserWin(wid);\n    const focusWid = isFrame ? getWindowIdFromFrameId(wid) : wid;\n    if (typeof focusWid === \"number\") {\n      const win = getWinFromStore(focusWid);\n      if (win && windowAcceptsFocus(win)) {\n        setFocus(focusWid);\n      }\n    }\n  }\n\n  function onLeaveNotify(ev: IXEvent) {\n    const { wid } = ev;\n    widLog(wid, \"onLeaveNotify\", ignoreEnterLeave ? \"ignoring\" : \"handling\");\n  }\n\n  function onPointerMotion(ev: IXMotionNotifyEvent): void {\n    const { wid } = ev;\n    // widLog(wid, \"onPointerMotion\", ev);\n\n    if (ignoreEnterLeave) {\n      widLog(wid, \"onMotionNotify\", \"clearing enterleave ignore\");\n      ignoreEnterLeave = false;\n      focusWindowOnEnter(wid); // In case we don't get onEnterNotify\n    }\n\n    eventConsumers.forEach((consumer) =>\n      consumer.onPointerMotion?.({\n        wid,\n        windowType: getWindowType(wid),\n        rootx: ev.rootx,\n        rooty: ev.rooty,\n      })\n    );\n  }\n\n  async function onKeyPress(ev: IXKeyEvent) {\n    const { wid } = ev;\n    widLog(wid, \"onKeyPress\", ev);\n\n    for (const consumer of eventConsumers) {\n      if (\n        consumer.onKeyPress?.({\n          wid,\n          windowType: getWindowType(wid),\n          modifiers: ev.buttons,\n          keycode: ev.keycode,\n        })\n      ) {\n        break; // Handled if returned true.\n      }\n    }\n  }\n\n  function onButtonPress(ev: IXButtonReleaseEvent) {\n    const { wid } = ev;\n\n    // Why is this coming through ButtonPress?\n    if (ev.name === \"ButtonRelease\") {\n      onButtonRelease(ev);\n      return;\n    }\n\n    raiseWindow(wid);\n\n    widLog(wid, \"onButtonPress\", ev);\n  }\n\n  function onButtonRelease(ev: IXButtonReleaseEvent) {\n    const { wid } = ev;\n    widLog(wid, \"onButtonRelease\", ev);\n\n    raiseWindow(wid);\n\n    eventConsumers.forEach((consumer) =>\n      consumer.onButtonRelease?.({\n        wid,\n        windowType: getWindowType(wid),\n      })\n    );\n  }\n\n  function onClientMessage(ev: IClientMessageEvent) {\n    const { wid } = ev;\n\n    widLog(wid, \"onClientMessage\", ev);\n    X.GetAtomName(ev.message_type, (err, name) => log(`(Client message message_type ${ev.message_type} == ${name})`));\n\n    eventConsumers.forEach((consumer) =>\n      consumer.onClientMessage?.({\n        wid,\n        windowType: getWindowType(wid),\n        messageType: ev.message_type,\n        data: ev.data,\n      })\n    );\n  }\n\n  async function onPropertyNotify(ev: IXPropertyNotifyEvent): Promise<void> {\n    const { wid, atom } = ev;\n    widLog(wid, \"onPropertyNotify\", ev);\n\n    if (isFrameBrowserWin(wid) || isDesktopBrowserWin(wid)) {\n      return;\n    }\n\n    switch (atom) {\n      case X.atoms.WM_NAME:\n      case ExtraAtoms._NET_WM_NAME:\n        {\n          const title = await getWindowTitle(wid);\n          store.dispatch(setWindowTitleAction({ wid, title: title || \"\" }));\n        }\n        break;\n\n      default:\n        X.GetAtomName(atom, (err, name) => log(`Atom ${atom} (${name}) for property change is unhandled.`));\n        break;\n    }\n  }\n\n  function launchProcess(command: string): void {\n    log(\"launchProcess\", command);\n\n    const child = spawn(command, {\n      detached: true,\n      stdio: \"ignore\",\n      shell: true,\n    });\n    child.unref(); // Allow electron to close before this child\n  }\n\n  function determineWindowAttributes(wid: number): Promise<XWindowAttrs> {\n    return new Promise((resolve, reject) => {\n      X.GetWindowAttributes(wid, function (err: unknown, attrs) {\n        if (err) {\n          logError(\"Couldn't GetWindowAttributes\", wid, err);\n          reject(err);\n          return;\n        }\n\n        resolve(attrs);\n      });\n    });\n  }\n\n  function determineWindowGeometry(wid: number): Promise<XGeometry> {\n    return new Promise((resolve, reject) => {\n      X.GetGeometry(wid, function (err: unknown, clientGeom) {\n        if (err) {\n          logError(\"Couldn't read geometry\", err);\n          reject(err);\n          return;\n        }\n\n        resolve(clientGeom);\n      });\n    });\n  }\n\n  async function getWindowTitle(wid: number): Promise<string | undefined> {\n    const [name, utf8name] = await Promise.all([\n      getPropertyValue<string>(X, wid, X.atoms.WM_NAME, X.atoms.STRING),\n      getPropertyValue<string>(X, wid, ExtraAtoms._NET_WM_NAME, ExtraAtoms.UTF8_STRING),\n    ]);\n\n    return utf8name || name;\n  }\n\n  /**\n   * By default, one screen means one screen geometry.\n   * But if Xinerama is in play, we may have multiple logical screens\n   * represented within a single screen.\n   */\n  function getScreenGeometries(screen: IXScreen): Promise<IGeometry[]> {\n    return new Promise((resolve) => {\n      const defaultGeometry: IGeometry = {\n        x: 0,\n        y: 0,\n        width: screen.pixel_width,\n        height: screen.pixel_height,\n      };\n\n      requireXinerama(XDisplay, (err, xinerama) => {\n        if (!xinerama) {\n          resolve([defaultGeometry]);\n          return;\n        }\n\n        xinerama.IsActive((err, isActive) => {\n          if (!isActive) {\n            resolve([defaultGeometry]);\n            return;\n          }\n\n          xinerama.QueryScreens((err, screenInfos) => {\n            if (err || !screenInfos) {\n              resolve([defaultGeometry]);\n              return;\n            }\n\n            resolve(screenInfos);\n          });\n        });\n      });\n    });\n  }\n\n  function getFocusedWindowId(screenIndex?: number): number | null {\n    const windows = store.getState().windows;\n    for (const widStr in windows) {\n      const win = windows[widStr];\n      if (win.focused) {\n        if (typeof screenIndex !== \"number\" || win.screenIndex === screenIndex) {\n          return parseInt(widStr);\n        }\n      }\n    }\n    return null;\n  }\n\n  /** Returns a window id if there is only one window in existence. */\n  function getOnlyWindowId(): number | null {\n    const windows = store.getState().windows;\n    const wids = Object.keys(windows);\n    if (wids.length === 1) {\n      return parseInt(wids[0], 10);\n    }\n    return null;\n  }\n\n  function anyWindowHasFocus(screenIndex?: number): boolean {\n    return typeof getFocusedWindowId(screenIndex) === \"number\";\n  }\n\n  function XGetWMProtocols(wid: number, callback: XCbWithErr<[number[] | void]>) {\n    X.GetProperty(0, wid, ExtraAtoms.WM_PROTOCOLS, 0, 0, 10000000, (err, prop) => {\n      if (err) {\n        callback(err);\n        return;\n      }\n\n      const protocols = [];\n      if (prop && prop.data && prop.data.length) {\n        const len = prop.data.length;\n        if (len % 4) {\n          callback(\"Bad length on WM protocol buffer\");\n          return;\n        }\n\n        for (let i = 0; i < len; i += 4) {\n          protocols.push(prop.data.readUInt32LE(i));\n        }\n      }\n\n      callback(null, protocols);\n    });\n  }\n\n  async function startDragFocusedWindow(): Promise<void> {\n    const wid = getFocusedWindowId();\n    if (typeof wid === \"number\" && !isDesktopBrowserWin(wid)) {\n      const pointerInfo = await queryPointer(X, wid);\n      if (pointerInfo) {\n        dragModule.startMove(wid, [pointerInfo.rootX, pointerInfo.rootY]);\n      }\n    }\n  }\n\n  function showDevtoolsForFocusedWindowFrame(): void {\n    const wid = getFocusedWindowId() ?? getOnlyWindowId();\n    if (typeof wid === \"number\") {\n      log(`Opening dev tools for ${wid}`);\n      frameBrowserWindows[wid]?.webContents?.openDevTools({ mode: \"detach\" });\n    }\n  }\n\n  function closeFocusedWindow(): void {\n    const wid = getFocusedWindowId();\n    if (typeof wid === \"number\" && !isDesktopBrowserWin(wid)) {\n      closeWindow(wid);\n    }\n  }\n\n  function closeWindow(wid: number) {\n    const nextFocusWid = wid === getFocusedWindowId() ? getNextFocusWid(wid) : undefined;\n\n    supportsGracefulDestroy(wid, (err, args) => {\n      if (err) {\n        log(\"Error in supportsGracefulDestroy\", err);\n      }\n      if (args && args.supported) {\n        const eventData = Buffer.alloc(32);\n        eventData.writeUInt8(X11_EVENT_TYPE.ClientMessage, 0); // Event Type 33 = ClientMessage\n        eventData.writeUInt8(32, 1); // Format\n        eventData.writeUInt32LE(wid, 4); // Window ID\n        eventData.writeUInt32LE(ExtraAtoms.WM_PROTOCOLS, 8); // Message Type\n        eventData.writeUInt32LE(ExtraAtoms.WM_DELETE_WINDOW, 12); // data32[0]\n        // Also send a timestamp in data32[1]?\n        widLog(wid, \"Sending graceful kill\", eventData);\n        X.SendEvent(wid, false, XCB_EVENT_MASK_NO_EVENT, eventData);\n      } else {\n        widLog(wid, \"Killing window client\");\n        X.KillClient(wid);\n      }\n\n      if (typeof nextFocusWid == \"number\") {\n        setFocus(nextFocusWid);\n      }\n    });\n  }\n\n  function supportsGracefulDestroy(wid: number, callback: XCbWithErr<[{ supported: boolean } | void]>) {\n    XGetWMProtocols(wid, (err, protocols) => {\n      if (err) {\n        logError(\"XGetWMProtocols error\", err);\n        callback(err);\n        return;\n      }\n\n      callback(null, {\n        supported: !!protocols && protocols.indexOf(ExtraAtoms.WM_DELETE_WINDOW) >= 0,\n      });\n    });\n  }\n\n  function getNextFocusWid(widLosingFocus: number): number | undefined {\n    let nextFocusWid: number | undefined;\n    const win = getWinFromStore(widLosingFocus);\n    if (win) {\n      return getNextFocusWidForScreen(win.screenIndex, widLosingFocus);\n    }\n    return nextFocusWid;\n  }\n\n  function getNextFocusWidForScreen(screenIndex: number, widLosingFocus: number | undefined): number | undefined {\n    let nextFocusWid: number | undefined;\n    const wins = store.getState().windows;\n    for (const widStr in wins) {\n      const otherWin = wins[widStr];\n      if (\n        otherWin.id !== widLosingFocus &&\n        otherWin.screenIndex === screenIndex &&\n        otherWin.visible &&\n        windowAcceptsFocus(otherWin)\n      ) {\n        nextFocusWid = otherWin.id;\n\n        // Not breaking here, on the chance that we end up finding the \"most recent\"\n        // window later on in the enumeration. (Probably should implement some sort\n        // of true \"focus history\" stack.)\n      }\n    }\n\n    if (typeof nextFocusWid === \"undefined\") {\n      nextFocusWid = screenIndexToDesktopId[screenIndex];\n    }\n    return nextFocusWid;\n  }\n\n  function tryReplaceFocusForScreen(screenIndex: number, widLosingFocus: number | undefined) {\n    const nextFocusWid = getNextFocusWidForScreen(screenIndex, widLosingFocus);\n    if (typeof nextFocusWid === \"number\") {\n      setFocus(nextFocusWid);\n    }\n  }\n\n  function showWindow(wid: number) {\n    let fid;\n    const isFrame = isFrameBrowserWin(wid);\n    if (isFrame) {\n      fid = wid;\n      const trueWid = getWindowIdFromFrameId(wid);\n      assert(typeof trueWid === \"number\");\n      wid = trueWid;\n    } else {\n      fid = getFrameIdFromWindowId(wid);\n    }\n\n    if (typeof fid === \"number\") {\n      log(\"showWindow frame id\", fid);\n      X.MapWindow(fid);\n    }\n\n    const win = getWinFromStore(wid);\n    if (win?.minimized) {\n      setWindowMinimized(wid, false);\n    }\n    if (win?.visible === false) {\n      store.dispatch(setWindowVisibleAction({ wid, visible: true }));\n    }\n\n    log(\"showWindow id\", wid);\n    X.MapWindow(wid);\n  }\n\n  /** Hides a window without destroying its frame. */\n  function hideWindow(wid: number): void {\n    const fid = getFrameIdFromWindowId(wid);\n\n    runXCallsWithoutEvents(wid, () => {\n      if (typeof fid === \"number\") {\n        X.UnmapWindow(fid);\n      } else if (wid) {\n        X.UnmapWindow(wid);\n      }\n    });\n\n    const win = getWinFromStore(wid);\n    if (win?.visible === true) {\n      store.dispatch(setWindowVisibleAction({ wid, visible: false }));\n    }\n  }\n\n  function raiseWindow(wid: number): void {\n    if (isFrameBrowserWin(wid)) {\n      const trueWid = getWindowIdFromFrameId(wid);\n      assert(typeof trueWid === \"number\");\n      wid = trueWid;\n    }\n\n    const win = getWinFromStore(wid);\n    if (!win) {\n      return;\n    }\n\n    if (!win.visible) {\n      showWindow(wid);\n    } else {\n      const fid = getFrameIdFromWindowId(wid);\n      if (fid) {\n        X.RaiseWindow(fid);\n      }\n      if (wid) {\n        X.RaiseWindow(wid);\n      }\n    }\n\n    // Keep \"above windows\" on top.\n    const windows = store.getState().windows;\n    for (const widStr in windows) {\n      const win = windows[widStr];\n      if (win.alwaysOnTop) {\n        X.RaiseWindow(win.id);\n      }\n    }\n    childWindows.forEach((childWinInfo) => {\n      if (childWinInfo.alwaysOnTop && childWinInfo.wid !== null) {\n        X.RaiseWindow(childWinInfo.wid);\n      }\n    });\n\n    if (windowAcceptsFocus(win)) {\n      setFocus(wid);\n    }\n  }\n\n  function minimize(wid: number): void {\n    widLog(wid, \"minimize\");\n    setWindowMinimized(wid, true);\n    hideWindow(wid);\n  }\n\n  function maximize(wid: number): void {\n    widLog(wid, \"maximize\");\n    setWindowMaximized(wid, true);\n  }\n\n  function restore(wid: number): void {\n    widLog(wid, \"restore\");\n    setWindowMaximized(wid, false);\n  }\n\n  function setWindowMinimized(wid: number, minimized: boolean): void {\n    const win = getWinFromStore(wid);\n    if (!win) {\n      return;\n    }\n\n    if (win.minimized !== minimized) {\n      store.dispatch(setWindowMinimizedAction({ wid, minimized }));\n    }\n  }\n\n  function setWindowMaximized(wid: number, maximized: boolean): void {\n    const win = getWinFromStore(wid);\n    if (!win) {\n      return;\n    }\n\n    if (win.maximized !== maximized) {\n      store.dispatch(setWindowMaximizedAction({ wid, maximized }));\n    }\n  }\n\n  function setFocus(wid: number): void {\n    if (isClientWin(wid)) {\n      setXInputFocus(wid);\n\n      store.dispatch(focusWindowAction({ wid }));\n    } else if (isDesktopBrowserWin(wid)) {\n      setXInputFocus(wid);\n    }\n  }\n\n  function setFocusToDesktopWindow(screenIndex: number, takeVisualFocus?: boolean | undefined) {\n    const did = screenIndexToDesktopId[screenIndex];\n    if (typeof did === \"number\") {\n      if (takeVisualFocus) {\n        store.dispatch(focusWindowAction({ wid: null }));\n      }\n      setFocus(did);\n    }\n  }\n\n  function setXInputFocus(wid: number): void {\n    widLog(wid, \"Setting X input focus\");\n\n    X.SetInputFocus(wid, XFocusRevertTo.PointerRoot);\n  }\n\n  function sendActiveWindowToNextScreen(): void {\n    const screens = store.getState().screens;\n    const screenCount = screens.length;\n    if (screenCount === 1) {\n      return; // Only one screen, can't switch.\n    }\n    const wid = getFocusedWindowId();\n    if (typeof wid !== \"number\") {\n      return;\n    }\n\n    const win = getWinFromStore(wid);\n    if (win) {\n      const nextScreenIndex = (win.screenIndex + 1) % screenCount;\n\n      // Update the window's tags if the next screen has different tags visible.\n      const nextScreen = screens[nextScreenIndex];\n      updateWindowTagsForNextScreen(store, win, nextScreen);\n\n      // Another window could move under our mouse; we don't want it to steal focus.\n      ignoreEnterLeave = true;\n\n      store.dispatch(setWindowIntoScreenAction({ wid, screenIndex: nextScreenIndex }));\n\n      // The new screen may have different dimensions. Try to fit the window nicely within.\n      const nextOuter = fitGeometryWithinAnother(nextScreen.workArea, win.outer, {\n        width: getWindowMinWidth(win),\n        height: getWindowMinHeight(win),\n      });\n\n      // Trigger reconfigure since coordinates have remained the same,\n      // and we won't configure again otherwise (at least not if we are floating).\n      store.dispatch(configureWindowAction({ wid, ...nextOuter }));\n    }\n  }\n\n  function sendActiveWindowToTag(tagIndex: number): void {\n    const screens = store.getState().screens;\n    const wid = getFocusedWindowId();\n    if (typeof wid !== \"number\") {\n      return;\n    }\n    const win = getWinFromStore(wid);\n    if (!win) {\n      return;\n    }\n\n    const screen = screens[win.screenIndex];\n    if (!screen) {\n      return;\n    }\n\n    const nextTag = getScreenTagByIndex(win.screenIndex, tagIndex);\n    if (!nextTag || win.tags.includes(nextTag)) {\n      return;\n    }\n\n    store.dispatch(setWindowTagsAction({ wid, tags: [nextTag] }));\n\n    if (!screen.currentTags.includes(nextTag)) {\n      hideWindow(wid);\n      tryReplaceFocusForScreen(win.screenIndex, wid);\n    }\n  }\n\n  async function setTagIndexForActiveDesktop(tagIndex: number, relativeWid: number): Promise<void> {\n    const screenIndex = await getScreenIndexWithCursor(context, relativeWid);\n    if (typeof screenIndex === \"number\") {\n      const screen = store.getState().screens[screenIndex];\n      const nextTag = getScreenTagByIndex(screenIndex, tagIndex);\n      if (!nextTag || arraysEqual(screen.currentTags, [nextTag])) {\n        return;\n      }\n      store.dispatch(setScreenCurrentTagsAction({ screenIndex, currentTags: [nextTag] }));\n    }\n  }\n\n  function getScreenTagByIndex(screenIndex: number, tagIndex: number): string | undefined {\n    const screens = store.getState().screens;\n    const screen = screens[screenIndex];\n    return screen?.tags[tagIndex];\n  }\n\n  function desktopZoomIn(screenIndex: number): void {\n    const browser = desktopBrowsers[screenIndex];\n    if (browser) {\n      setScreenZoomLevel(screenIndex, browser.webContents.getZoomLevel() + 1);\n    }\n  }\n\n  function desktopZoomOut(screenIndex: number): void {\n    const browser = desktopBrowsers[screenIndex];\n    if (browser) {\n      setScreenZoomLevel(screenIndex, browser.webContents.getZoomLevel() - 1);\n    }\n  }\n\n  function desktopZoomReset(screenIndex: number): void {\n    setScreenZoomLevel(screenIndex, 0);\n  }\n\n  function setScreenZoomLevel(screenIndex: number, zoomLevel: number): void {\n    const browser = desktopBrowsers[screenIndex];\n    if (browser) {\n      browser.webContents.setZoomLevel(zoomLevel);\n    }\n\n    setFrameWindowsZoomLevel(screenIndex, zoomLevel);\n    store.dispatch(setScreenZoomLevelAction({ screenIndex, zoom: zoomLevel }));\n\n    log(`Set zoom level to ${zoomLevel} (for ${screenIndex})`);\n  }\n\n  function setFrameWindowsZoomLevel(screenIndex: number, zoomLevel: number): void {\n    const state = store.getState();\n    for (const widStr in state.windows) {\n      const wid = parseInt(widStr, 10);\n      const win = state.windows[widStr];\n      if (win.screenIndex !== screenIndex) {\n        continue;\n      }\n      const frameWin = frameBrowserWindows[wid];\n      frameWin?.webContents?.setZoomLevel(zoomLevel);\n    }\n  }\n\n  async function switchToNextLayoutWM(): Promise<void> {\n    const screens = store.getState().screens;\n    let screenIndex = 0;\n    if (screens.length > 1) {\n      screenIndex = Math.max(0, await getScreenIndexWithCursor(context, screens[0].root));\n    }\n    const layouts = layoutsByScreen.get(screenIndex);\n    if (layouts) {\n      switchToNextLayout(store, layouts, screenIndex);\n    }\n  }\n\n  function widLog(wid: number, ...args: unknown[]): void {\n    const details = [];\n    if (typeof wid === \"number\") {\n      details.push(wid);\n\n      switch (getWindowType(wid)) {\n        case XWMWindowType.Frame:\n          details.push(`(frame for ${getWindowIdFromFrameId(wid)})`);\n          break;\n        case XWMWindowType.Desktop:\n          details.push(\"(desktop)\");\n          break;\n      }\n    }\n\n    const logArgs = [...details, ...args];\n    log(...logArgs);\n  }\n\n  function getWindowType(wid: number): XWMWindowType {\n    if (isFrameBrowserWin(wid)) {\n      return XWMWindowType.Frame;\n    }\n    if (isDesktopBrowserWin(wid)) {\n      return XWMWindowType.Desktop;\n    }\n    if (isClientWin(wid)) {\n      return XWMWindowType.Client;\n    }\n\n    return XWMWindowType.Other;\n  }\n\n  function isClientWin(wid: number): boolean {\n    return !!getWinFromStore(wid);\n  }\n\n  function getWinFromStore(wid: number): IWindow | undefined {\n    return store.getState().windows[wid];\n  }\n\n  function configureWindow(wid: number, fid: number, win: IWindow, frameConfig: IGeometry): void {\n    X.ConfigureWindow(fid, frameConfig);\n\n    if (fid !== wid && win) {\n      X.ConfigureWindow(wid, {\n        width: win.outer.width - win.frameExtents.left - win.frameExtents.right,\n        height: win.outer.height - win.frameExtents.top - win.frameExtents.bottom,\n      });\n    }\n  }\n\n  function configureToCurrentSize(state: ServerRootState, wid: number): void {\n    const win = state.windows[wid];\n    const screen = state.screens[win.screenIndex];\n    const fid = getFrameIdFromWindowId(wid) ?? wid;\n    const frameConfig = {\n      x: screen.x + win.outer.x,\n      y: screen.y + win.outer.y,\n      width: win.outer.width,\n      height: win.outer.height,\n    };\n    widLog(fid, \"Configuring window to current size\", frameConfig);\n    configureWindow(wid, fid, win, frameConfig);\n  }\n\n  function __setupStore(): ServerStore {\n    const loggerMiddleware: Middleware = function ({ getState }) {\n      return (next) => (action) => {\n        log(\"will dispatch\", action);\n\n        // Call the next dispatch method in the middleware chain.\n        const returnValue = next(action);\n\n        const stateAfterDispatch = getState();\n\n        let affectedSlice: string | undefined;\n        if (isAction(action) && typeof action?.type === \"string\") {\n          const actionTypeParts = action.type.split(\"/\");\n          if (actionTypeParts.length > 1) {\n            affectedSlice = actionTypeParts[0];\n            if (!(affectedSlice! in stateAfterDispatch)) {\n              affectedSlice = undefined; // Not a slice?\n            }\n          }\n        }\n\n        if (affectedSlice) {\n          log(affectedSlice, \" state slice after dispatch:\");\n          logDir(stateAfterDispatch[affectedSlice], { depth: 2 });\n        } else {\n          log(\"state after dispatch:\");\n          logDir(stateAfterDispatch, { depth: 3 });\n        }\n\n        // This will likely be the action itself, unless\n        // a middleware further in chain changed it.\n        return returnValue;\n      };\n    };\n\n    function performLayout(): void {\n      const state = store.getState();\n      for (let s = 0; s < state.screens.length; s++) {\n        const screen = state.screens[s];\n        const screenLayouts = layoutsByScreen.get(s);\n        const tag = screen.currentTags[0];\n        const currentLayoutName = screen.currentLayouts[tag];\n        let currentLayout = screenLayouts?.find((layout) => getLayoutPluginName(layout) === currentLayoutName);\n        if (!currentLayout) {\n          currentLayout = screenLayouts?.[0];\n        }\n        if (!currentLayout) {\n          continue; // ?\n        }\n\n        const windows = selectVisibleWindowsFromCurrentTags(state, s);\n        const results = currentLayout.fn({ screen, windows });\n        results.forEach((nextWinPos, wid) => {\n          const curWinPos = state.windows[wid]?.outer;\n          if (geometriesDiffer(curWinPos, nextWinPos)) {\n            store.dispatch(\n              configureWindowAction({\n                wid,\n                ...nextWinPos,\n              })\n            );\n          }\n        });\n      }\n    }\n\n    const x11Middleware: Middleware<UnknownAction, ServerRootState> = function ({ getState }) {\n      return (next) => (action) => {\n        const returnValue = next(action);\n\n        if (!isAction(action)) {\n          return returnValue;\n        }\n\n        if (configureWindowAction.match(action)) {\n          const state = getState();\n          const payload: Partial<IGeometry> = action.payload;\n          const wid = action.payload.wid;\n          const win = state.windows[wid];\n          const screen = state.screens[win.screenIndex];\n\n          const frameConfig: Partial<IGeometry> = {};\n          if (typeof payload.x === \"number\") {\n            frameConfig.x = screen.x + payload.x;\n          }\n          if (typeof payload.y === \"number\") {\n            frameConfig.y = screen.y + payload.y;\n          }\n          if (typeof payload.width === \"number\") {\n            frameConfig.width = payload.width;\n          }\n          if (typeof payload.height === \"number\") {\n            frameConfig.height = payload.height;\n          }\n\n          const fid = getFrameIdFromWindowId(wid) ?? wid;\n          widLog(fid, \"Configuring from X11 middleware\", frameConfig);\n          X.ConfigureWindow(fid, frameConfig);\n\n          if (fid !== wid && win) {\n            X.ConfigureWindow(wid, {\n              width: (payload.width ?? win.outer.width) - win.frameExtents.left - win.frameExtents.right,\n              height: (payload.height ?? win.outer.height) - win.frameExtents.top - win.frameExtents.bottom,\n            });\n          }\n        } else if (setWindowMaximizedAction.match(action)) {\n          // Restore the window to its location prior to going maximized.\n          // We need to do this here since some layouts (floating) won't bother to move the window.\n          const { wid, maximized } = action.payload as { wid: number; maximized: boolean };\n          if (!maximized) {\n            configureToCurrentSize(getState(), wid);\n          }\n        } else if (setWindowFullscreenAction.match(action)) {\n          // Restore the window to its location prior to going fullscreen.\n          const { wid, fullscreen } = action.payload as { wid: number; fullscreen: boolean };\n          if (!fullscreen) {\n            configureToCurrentSize(getState(), wid);\n          }\n        } else if (setFrameExtentsAction.match(action)) {\n          const state = getState();\n          const wid = action.payload.wid;\n          const win = state.windows[wid];\n          const { width, height } = win.outer;\n          const frameExtents = {\n            left: action.payload.left,\n            right: action.payload.right,\n            top: action.payload.top,\n            bottom: action.payload.bottom,\n          };\n          lastFrameExtents = frameExtents;\n\n          X.ConfigureWindow(wid, {\n            x: frameExtents.left,\n            y: frameExtents.top,\n            width: width - frameExtents.left - frameExtents.right,\n            height: height - frameExtents.top - frameExtents.bottom,\n          });\n\n          eventConsumers.forEach((consumer) => consumer.onSetFrameExtents?.({ wid, frameExtents }));\n        } else if (setWindowIntoScreenAction.match(action)) {\n          const state = getState();\n          const { wid, screenIndex } = action.payload;\n          const screen = state.screens[screenIndex];\n\n          // Update the frame window's zoom level to match the screen zoom level, if it differs.\n          const frameWin = frameBrowserWindows[wid];\n          if (frameWin && frameWin.webContents && frameWin.webContents.zoomLevel !== screen.zoom) {\n            frameWin?.webContents.setZoomLevel(screen.zoom);\n          }\n        } else if (setScreenCurrentTagsAction.match(action)) {\n          const state = getState();\n          const { currentTags, screenIndex } = action.payload as {\n            currentTags: string[];\n            screenIndex: number;\n          };\n          let hidFocusedWid: number | undefined = undefined;\n          for (const widStr in state.windows) {\n            const wid = parseInt(widStr, 10);\n            const win = state.windows[widStr];\n            if (win.screenIndex !== screenIndex) {\n              continue; // Other screens not affected.\n            }\n            if (anyIntersect(win.tags, currentTags)) {\n              if (!win.minimized) {\n                showWindow(wid);\n              }\n            } else {\n              if (win.focused) {\n                hidFocusedWid = wid;\n              }\n              hideWindow(wid);\n            }\n          }\n\n          if (typeof hidFocusedWid === \"number\" || !anyWindowHasFocus()) {\n            tryReplaceFocusForScreen(screenIndex, hidFocusedWid);\n          }\n        } else {\n          eventConsumers.forEach((consumer) => consumer.onReduxAction?.({ action, getState }));\n        }\n\n        performLayout();\n\n        return returnValue;\n      };\n    };\n\n    const middleware = [x11Middleware];\n    if (loggingEnabled()) {\n      middleware.unshift(loggerMiddleware);\n    }\n\n    const store = configureWMStore(middleware);\n    return store;\n  }\n\n  return wmServer;\n}\n\nfunction getNativeWindowHandleInt(win: BrowserWindow): number {\n  const hbuf = win.getNativeWindowHandle();\n  return os.endianness() === \"LE\" ? hbuf.readInt32LE() : hbuf.readInt32BE();\n}\n", "// Loggin based on: https://github.com/ungoldman/electron-ipc-log/blob/master/index.js\n\nconst electron = require(\"electron\");\n\nconst internal = [\"CHROME\", \"ELECTRON\"];\n\ninterface IElectronEvent {\n  channel: string | symbol;\n  data: readonly unknown[];\n  sync?: boolean;\n  sent?: boolean;\n}\n\ninterface Logger {\n  (event: IElectronEvent): void;\n}\n\nexport function electronIpcLog(log: Logger) {\n  if (log == null) log = console.log;\n  //if (electron.ipcRenderer) return handleRenderer(log);\n  if (electron.ipcMain) return handleMain(log);\n}\n\n// function handleRenderer(log: Logger): void {\n//   const { ipcRenderer } = electron;\n//   const oldEmit = ipcRenderer.emit;\n//   const oldSend = ipcRenderer.send;\n//   const oldSendSync = ipcRenderer.sendSync;\n\n//   ipcRenderer.emit = function (channel, event, ...data) {\n//     trackEvent(log, channel, data);\n//     return oldEmit.apply(ipcRenderer, arguments);\n//   };\n\n//   ipcRenderer.send = function (channel, ...data) {\n//     trackEvent(log, channel, data, true);\n//     return oldSend.apply(ipcRenderer, arguments);\n//   };\n\n//   ipcRenderer.sendSync = function (channel, ...data) {\n//     trackEvent(log, channel, data, true, true);\n//     const returnValue = oldSendSync.apply(ipcRenderer, arguments);\n//     trackEvent(log, channel, [returnValue], false, true);\n//     return returnValue;\n//   };\n// }\n\nfunction handleMain(log: Logger) {\n  const { ipcMain } = electron;\n  const oldEmit = ipcMain.emit;\n\n  ipcMain.emit = function (channel: string | symbol, event: unknown, ...data: unknown[]) {\n    trackEvent(log, channel, data);\n    return oldEmit.apply(ipcMain, [channel, event, ...data]);\n  };\n}\n\nfunction trackEvent(log: Logger, channel: string | symbol, data: unknown[], sent?: boolean, sync?: boolean): void {\n  // only log user defined ipc messages\n  const isInteral = internal.some((str) => {\n    if (typeof channel === \"string\") {\n      return channel.indexOf(str) !== -1;\n    }\n    return true;\n  });\n  if (isInteral) return;\n\n  const event: IElectronEvent = { channel, data };\n\n  if (sent) event.sent = sent;\n  if (sync) event.sync = sync;\n\n  log(event);\n}\n", "import { app, dialog } from \"electron\";\nimport { startWindowManager } from \"./wm\";\nimport { loggingEnabled } from \"./args\";\nimport { log } from \"./log\";\nimport { electronIpcLog } from \"./electronLog\";\n\n// Disable error dialogs by override\ndialog.showErrorBox = function (title, content) {\n  console.error(`${title}\\n${content}`);\n};\n\nlog(\"bond-wm main\");\nlog(\"user data path: \", app.getPath(\"userData\"));\n\nif (loggingEnabled()) {\n  electronIpcLog(log);\n}\n\n// Possibly could help with transparency?\n// app.commandLine.appendSwitch(\"enable-transparent-visuals\");\n// app.commandLine.appendSwitch(\"disable-gpu\");\n// app.disableHardwareAcceleration();\n\n// Quit when all windows are closed.\napp.on(\"window-all-closed\", () => {\n  app.quit();\n});\n\napp.on(\"ready\", async () => {\n  startWindowManager();\n});\n", "// Non-ts entrypoint file, mostly for historical reasons.\nrequire(\"./main.ts\");"],
  "mappings": "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",
  "names": ["resolve", "resolve", "XPropMode", "XWMWindowType", "stdout", "resolve", "XWMWindowType", "ResizeDirection", "intersect", "win", "resolve", "existsSync", "join", "XCB_COPY_FROM_PARENT", "XPropMode", "SystemTrayOps", "existsSync", "join", "exec", "ensureArray", "existsSync", "join", "app", "app", "ipcMain", "BrowserWindow", "WindowType", "XWMWindowType", "X11_EVENT_TYPE", "arraysEqual", "configureWindowAction", "setWindowFullscreenAction", "setWindowIntoScreenAction", "setWindowTagsAction", "dirname", "x11", "configPath", "viteNodeServer", "viteWebServer", "config", "resolve", "err", "win", "store", "log", "ipcMain", "app"]
}
