screen.ts 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. import { EventEmitter } from 'events';
  2. const { createScreen } = process._linkedBinding('electron_browser_screen');
  3. let _screen: Electron.Screen;
  4. const createScreenIfNeeded = () => {
  5. if (_screen === undefined) {
  6. _screen = createScreen();
  7. }
  8. };
  9. // We can't call createScreen until after app.on('ready'), but this module
  10. // exposes an instance created by createScreen. In order to avoid
  11. // side-effecting and calling createScreen upon import of this module, instead
  12. // we export a proxy which lazily calls createScreen on first access.
  13. export default new Proxy({}, {
  14. get: (target, property: keyof Electron.Screen) => {
  15. createScreenIfNeeded();
  16. const value = _screen[property];
  17. if (typeof value === 'function') {
  18. return value.bind(_screen);
  19. }
  20. return value;
  21. },
  22. set: (target, property: string, value: unknown) => {
  23. createScreenIfNeeded();
  24. return Reflect.set(_screen, property, value);
  25. },
  26. ownKeys: () => {
  27. createScreenIfNeeded();
  28. return Reflect.ownKeys(_screen);
  29. },
  30. has: (target, property: string) => {
  31. createScreenIfNeeded();
  32. return property in _screen;
  33. },
  34. getOwnPropertyDescriptor: (target, property: string) => {
  35. createScreenIfNeeded();
  36. return Reflect.getOwnPropertyDescriptor(_screen, property);
  37. },
  38. getPrototypeOf: () => {
  39. // This is necessary as a result of weirdness with EventEmitterMixin
  40. // and FunctionTemplate - we need to explicitly ensure it's returned
  41. // in the prototype.
  42. return EventEmitter.prototype;
  43. }
  44. });