@lunar: Hier etwas mehr Background. Ich schreibe ein GUI für einige Komponenten von
Argyll CMS, einem Open-Source-Farbmanagement-System auf Kommandozeilenbasis, genauer gesagt für dispcal, dispread und colprof. Mit diesen dreien lässt sich ein Monitor kalibrieren. Dazu wird ein Messfeld angezeigt (von dispcal / dispread), von dem Farbwerte mittels eines Messgeräts ausgelesen werden. Argyll benutzt als Größenangabe dieses Messfelds keine relativen Pixelgrößen, sondern geht immer von einem Rechteck mit 100x100 mm aus. Dieses lässt sich per Kommandozeilenoptionen skalieren und verschieben (proportional).
Beispiel: Damit das Messfeld sowohl auf einem 40" HD-Ready TV (Auflösung 1360x768) wie auch einem 20" TFT (Auflösung 1600x1200) gleich gross ist (also standardmässig 100x100 mm), benutzt Argyll zur Umrechnung der absoluten mm-Maße in Pixel die EDID-Angaben des jeweiligen Monitors. Diese erhält es durch Aufruf diverser betriebssystemspezifischer Funktionen. Das funktioniert gut (gemessene Abweichung der Größe des Messfelds zwischen den zwei Schirmen im Beispiel 1-2 mm).
Ich möchte in meinem GUI dem Benutzer die Möglichkeit geben, die Größe und Position mittels eines frei verschieb-und skalierbaren Fensters festzulegen. Um jedoch aus den relativen Maßen dieses Fensters die richtigen Kommandozeilenoptionen zur Skalierung errechnen zu können, brauche ich wieder die korrekten mm-Maße des Monitors, auf dem das Messfenster dargestellt wird. Unter Windows und Linux bekomme ich zumindest die des Haupt-Monitors mit wx.DisplaySizeMM (unter Mac OS stimmen die von DisplaySizeMM gelieferten Werte aber nicht mit denen unter Windows oder Linux überein. DisplaySizeMM verlässt sich unter MacOS scheinbar auf die Angaben von NSScreen und nicht auf diejenigen von Quartz Display Services. Ist aber nur ne Vermutung von mir, habe jetzt nicht im wxPython Sourcecode nachgesehen).
(BTW, der C-Code den ich erwähnt habe, der unter Argyll für die Positionierung und Skalierung des Messfensters zuständig ist, findet sich im Argyll-Sourecode in dispwin.c, Zeile 2777+)
@HWK: Danke für die Links. Ich denke, die Herausforderung für mich wird sein, dass der C-Code zur Ermittlung der Größe eines Displays einen Display-Pointer erwartet, und nicht etwa einen numerischen Index, wie ihn etwa wx.Display.GetFromWindow liefert. Ich werd schauen müssen, wie Displays im C-Code enumeriert werden und dann zwischen beiden Methoden übersetzen.