Неверный размер окна с OCaml Graphics - PullRequest
0 голосов
/ 17 февраля 2019

Описание проблемы

При использовании графического модуля OCaml я часто получаю окно с неправильным размером;и это не предсказуемое поведение.Отображаемое окно всегда имеет требуемый размер, но по неизвестной причине OCaml иногда считает, что оно на самом деле имеет другой размер, и, следовательно, это влияет на чертеж.

Возможно, это связано с оконной системой;Я использую X11 (XQuartz) на OS X.

Доказательства проблемы

Рассмотрим следующую последовательность:

open Graphics
let f () =
    Printf.printf "size_x = %d, size_y = %d\n" (size_x ()) (size_y ())
let () =
    open_graph "";
    resize_window 500 500;
    f ();
    Unix.sleepf 0.01
    f ();
    Unix.sleepf 0.1
    f ()

Ожидаемый результатэто окно постоянного размера 500x500, то есть:

size_x = 500, size_y = 500
size_x = 500, size_y = 500
size_x = 500, size_y = 500

Но иногда я получаю (с большой вероятностью)

size_x = 500, size_y = 500
size_x = 600, size_y = 450
size_x = 500, size_y = 500

или

size_x = 600, size_y = 450
size_x = 500, size_y = 500
size_x = 500, size_y = 500

или

size_x = 600, size_y = 450
size_x = 600, size_y = 450
size_x = 500, size_y = 500

Другими словами, это переменное поведение, которое, кажется, происходит только через несколько десятых секунды после открытия окна.

Результат одинаков, независимо от того,включите опции auto_synchronize и display_mode true или false.

Обходное решение

Я проверяю, что все resize_window инструкции выполняются как минимум Unix.sleepf 0.1 (илина synchronize (); Unix.sleepf 0.1, когда auto_synchronize выключен);конечно, это не очень удовлетворительное решение ...

...