{"version":3,"file":"screen.mjs","names":[],"sources":["../../src/main/screen/index.ts"],"sourcesContent":["/**\n * Main process handlers for screen module\n * Provides information about screen size, displays, and cursor position\n */\n\nimport { BrowserWindow, screen } from \"electron\";\nimport type { RpcServer } from \"electron-json-rpc/main\";\nimport type { Display, Point, Rectangle } from \"@shared/screen.types.js\";\n\nconst RPC_METHOD_PREFIX = \"screen\";\n\n/**\n * Get the current absolute position of the mouse pointer\n */\nexport async function getCursorScreenPointHandler(): Promise<Point> {\n  return screen.getCursorScreenPoint();\n}\n\n/**\n * Get the primary display\n */\nexport async function getPrimaryDisplayHandler(): Promise<Display> {\n  return screen.getPrimaryDisplay() as Display;\n}\n\n/**\n * Get an array of displays that are currently available\n */\nexport async function getAllDisplaysHandler(): Promise<Display[]> {\n  return screen.getAllDisplays() as Display[];\n}\n\n/**\n * Get the display nearest to the specified point\n */\nexport async function getDisplayNearestPointHandler(...params: unknown[]): Promise<Display> {\n  const [point] = params as [Point];\n  return screen.getDisplayNearestPoint(point) as Display;\n}\n\n/**\n * Get the display that most closely intersects the provided bounds\n */\nexport async function getDisplayMatchingHandler(...params: unknown[]): Promise<Display> {\n  const [rect] = params as [Rectangle];\n  return screen.getDisplayMatching(rect) as Display;\n}\n\n/**\n * Convert a screen physical point to a screen DIP point (Windows/Linux)\n * Not currently supported on Wayland\n */\nexport async function screenToDipPointHandler(...params: unknown[]): Promise<Point> {\n  const [point] = params as [Point];\n  return screen.screenToDipPoint(point);\n}\n\n/**\n * Convert a screen DIP point to a screen physical point (Windows/Linux)\n * Not currently supported on Wayland\n */\nexport async function dipToScreenPointHandler(...params: unknown[]): Promise<Point> {\n  const [point] = params as [Point];\n  return screen.dipToScreenPoint(point);\n}\n\n/**\n * Convert a screen physical rect to a screen DIP rect (Windows)\n * @param windowId - The BrowserWindow id (or null for nearest display to rect)\n * @param rect - The physical rect to convert\n */\nexport async function screenToDipRectHandler(...params: unknown[]): Promise<Rectangle> {\n  const [windowId, rect] = params as [number | null, Rectangle];\n  const window = windowId === null ? null : (BrowserWindow.fromId(windowId ?? -1) ?? null);\n  return screen.screenToDipRect(window, rect);\n}\n\n/**\n * Convert a screen DIP rect to a screen physical rect (Windows)\n * @param windowId - The BrowserWindow id (or null for nearest display to rect)\n * @param rect - The DIP rect to convert\n */\nexport async function dipToScreenRectHandler(...params: unknown[]): Promise<Rectangle> {\n  const [windowId, rect] = params as [number | null, Rectangle];\n  const window = windowId === null ? null : (BrowserWindow.fromId(windowId ?? -1) ?? null);\n  return screen.dipToScreenRect(window, rect);\n}\n\n/**\n * Register all screen module RPC handlers and set up event forwarding\n */\nexport function registerScreenModule(rpc: RpcServer): void {\n  rpc.register(`${RPC_METHOD_PREFIX}.getCursorScreenPoint`, getCursorScreenPointHandler);\n  rpc.register(`${RPC_METHOD_PREFIX}.getPrimaryDisplay`, getPrimaryDisplayHandler);\n  rpc.register(`${RPC_METHOD_PREFIX}.getAllDisplays`, getAllDisplaysHandler);\n  rpc.register(`${RPC_METHOD_PREFIX}.getDisplayNearestPoint`, getDisplayNearestPointHandler);\n  rpc.register(`${RPC_METHOD_PREFIX}.getDisplayMatching`, getDisplayMatchingHandler);\n  rpc.register(`${RPC_METHOD_PREFIX}.screenToDipPoint`, screenToDipPointHandler);\n  rpc.register(`${RPC_METHOD_PREFIX}.dipToScreenPoint`, dipToScreenPointHandler);\n  rpc.register(`${RPC_METHOD_PREFIX}.screenToDipRect`, screenToDipRectHandler);\n  rpc.register(`${RPC_METHOD_PREFIX}.dipToScreenRect`, dipToScreenRectHandler);\n\n  // Forward display events to renderer\n  screen.on(\"display-added\", (_event, newDisplay) => {\n    rpc.publish(\"screen.display-added\", newDisplay);\n  });\n\n  screen.on(\"display-removed\", (_event, oldDisplay) => {\n    rpc.publish(\"screen.display-removed\", oldDisplay);\n  });\n\n  screen.on(\"display-metrics-changed\", (_event, display, changedMetrics) => {\n    rpc.publish(\"screen.display-metrics-changed\", {\n      display,\n      changedMetrics,\n    });\n  });\n}\n"],"mappings":";;;;;;;AASA,MAAM,oBAAoB;;;;AAK1B,eAAsB,8BAA8C;AAClE,QAAO,OAAO,sBAAsB;;;;;AAMtC,eAAsB,2BAA6C;AACjE,QAAO,OAAO,mBAAmB;;;;;AAMnC,eAAsB,wBAA4C;AAChE,QAAO,OAAO,gBAAgB;;;;;AAMhC,eAAsB,8BAA8B,GAAG,QAAqC;CAC1F,MAAM,CAAC,SAAS;AAChB,QAAO,OAAO,uBAAuB,MAAM;;;;;AAM7C,eAAsB,0BAA0B,GAAG,QAAqC;CACtF,MAAM,CAAC,QAAQ;AACf,QAAO,OAAO,mBAAmB,KAAK;;;;;;AAOxC,eAAsB,wBAAwB,GAAG,QAAmC;CAClF,MAAM,CAAC,SAAS;AAChB,QAAO,OAAO,iBAAiB,MAAM;;;;;;AAOvC,eAAsB,wBAAwB,GAAG,QAAmC;CAClF,MAAM,CAAC,SAAS;AAChB,QAAO,OAAO,iBAAiB,MAAM;;;;;;;AAQvC,eAAsB,uBAAuB,GAAG,QAAuC;CACrF,MAAM,CAAC,UAAU,QAAQ;CACzB,MAAM,SAAS,aAAa,OAAO,OAAQ,cAAc,OAAO,YAAY,GAAG,IAAI;AACnF,QAAO,OAAO,gBAAgB,QAAQ,KAAK;;;;;;;AAQ7C,eAAsB,uBAAuB,GAAG,QAAuC;CACrF,MAAM,CAAC,UAAU,QAAQ;CACzB,MAAM,SAAS,aAAa,OAAO,OAAQ,cAAc,OAAO,YAAY,GAAG,IAAI;AACnF,QAAO,OAAO,gBAAgB,QAAQ,KAAK;;;;;AAM7C,SAAgB,qBAAqB,KAAsB;AACzD,KAAI,SAAS,GAAG,kBAAkB,wBAAwB,4BAA4B;AACtF,KAAI,SAAS,GAAG,kBAAkB,qBAAqB,yBAAyB;AAChF,KAAI,SAAS,GAAG,kBAAkB,kBAAkB,sBAAsB;AAC1E,KAAI,SAAS,GAAG,kBAAkB,0BAA0B,8BAA8B;AAC1F,KAAI,SAAS,GAAG,kBAAkB,sBAAsB,0BAA0B;AAClF,KAAI,SAAS,GAAG,kBAAkB,oBAAoB,wBAAwB;AAC9E,KAAI,SAAS,GAAG,kBAAkB,oBAAoB,wBAAwB;AAC9E,KAAI,SAAS,GAAG,kBAAkB,mBAAmB,uBAAuB;AAC5E,KAAI,SAAS,GAAG,kBAAkB,mBAAmB,uBAAuB;AAG5E,QAAO,GAAG,kBAAkB,QAAQ,eAAe;AACjD,MAAI,QAAQ,wBAAwB,WAAW;GAC/C;AAEF,QAAO,GAAG,oBAAoB,QAAQ,eAAe;AACnD,MAAI,QAAQ,0BAA0B,WAAW;GACjD;AAEF,QAAO,GAAG,4BAA4B,QAAQ,SAAS,mBAAmB;AACxE,MAAI,QAAQ,kCAAkC;GAC5C;GACA;GACD,CAAC;GACF"}