Переопределение электронов Поддержка высокого DPI на macOS с SDL - PullRequest
1 голос
/ 21 октября 2019

При запуске нашего аддона узла C ++ в Electron настройки / флаги с высоким разрешением не соблюдаются. Аддон узла работает сам по себе, пока не будет упакован с Electron.

Наш аддон узла отдельно, в другом процессе, но вызывается из Electron, создает новое окно с SDL, которое пытается включить DPI через SDL_WINDOW_ALLOW_HIGHDPI

Мы не используем new BrowserWindow и не ожидаем, что Chrome изменит размер в этом случае!

Не работает в следующем сценарии:

  • Запуск через electron .
  • Запуск после упакованного .dmg

Ключ в Info.plist High Resolution Capable установлен в YES - электрон, кажется, автоматически генерируетпо умолчанию info.plist с ним. (Мы ничего не устанавливаем самостоятельно), и при этом мы не устанавливаем --extend-info

  • Электронная версия:

    • "электрон": "^ 6.0.9", "строитель электронов": "^ 21.2.0",
  • Операционная система: macOS - 10.14.6

Ожидаемое поведение

Программа должна отображаться в режиме высокого разрешения и учитывать то, что передается в SDL

Например, мы должны получитьSDL_WINDOWEVENT, который говорит нам изменить размер текстуры на новую ширину и высоту.

Фактическое поведение

При перемещении окна программы (не созданного Электроном окна) на экран 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);

Вопросы

  • Как убедиться, что это работает в dev, когда мы делаем electron .
  • Как сделать эту успешную работу в упаковке?

1 Ответ

0 голосов
/ 10 ноября 2019

Решение: в 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

...