在具有SDL的macOS上电子重写高DPI支持

时间:2019-10-21 07:18:35

标签: electron sdl-2

在Electron中运行我们的C ++节点附加组件时,不遵守高DPI设置/标志。直到与Electron打包为止,节点插件才可以正常工作。

在另一个过程中,但从Electron内部调用的我们的节点附加组件分别创建了一个带有SDL的新窗口,该窗口试图通过SDL_WINDOW_ALLOW_HIGHDPI启用DPI。

我们不使用new BrowserWindow,并希望Chrome在这种情况下能够调整大小!

在以下情况下不起作用:

  • 通过electron .
  • 运行
  • 在打包的.dmg之后运行

Info.plist High Resolution Capable中的密钥设置为YES-电子似乎会自动生成一个默认的info.plist。 (我们不会自行设置任何内容),也不会设置--extend-info

  • 电子版本:

    • “电子”:“ ^ 6.0.9”, “ electron-builder”:“ ^ 21.2.0”,
  • 操作系统: macOS-10.14.6

预期行为

程序应以高DPI模式显示,并尊重传递给SDL的内容

例如,我们应该收到一个SDL_WINDOWEVENT,它告诉我们以新的宽度和高度调整纹理的大小。

实际行为

将程序窗口(不是由Electron创建的窗口)移到Retina屏幕(macbook pro)上时,它也不会接收新的渲染器输出来调整大小,并且对DPI的了解也不高

当我们单独运行节点插件时,只要将屏幕移动到另一个DPI屏幕,每次移动窗口都会重新配置纹理。

要复制

在SDL中设置以下内容:

// init
SDL_Window *window = SDL_CreateWindow(
      "App name", SDL_WINDOWPOS_CENTERED, SDL_WINDOWPOS_CENTERED, width, height,
      SDL_WINDOW_RESIZABLE | SDL_WINDOW_ALLOW_HIGHDPI)

 SDL_Renderer *renderer =
      SDL_CreateRenderer(window, -1, SDL_RENDERER_ACCELERATED);

// configure texture
SDL_SetHint(SDL_HINT_RENDER_SCALE_QUALITY, "linear");

  int o_width = 0, o_height = 0;
  int ret = SDL_GetRendererOutputSize(ctx->renderer, &o_width, &o_height);
  if (ret != 0) {
    throw runtime_error("Could not get output renderer size\n");
  }

  printf("Output renderer size: %dx%d\n", o_width, o_height);

问题

  • 当我们进行electron .
  • 时,如何确保这在开发人员中有效?
  • 打包后如何使这项成功工作?

1 个答案:

答案 0 :(得分:0)

解决方案:在Electron中,在主进程的Info.plist中设置的任何内容都不会等效地应用于Electron Helper进程,因为它们具有自己的Info.plist。

我们通过以下方式对此进行了修补:

cd dist/mac/Your.app/Contents/Frameworks/Your\ Helper.app/Contents
/usr/libexec/PlistBuddy -c "add NSHighResolutionCapable bool true" Info.plist

Electron 7.1或更低版本不正确支持

Github issue