9 HighDPI Unterstützung
Die Auflösung moderner Bildschirme wächst stetig. Damit ändern sich auch die Anforderungen an Design und Qualität der Bedienelemente und Oberflächen. Probleme sind dabei häufig, dass Anwendungen viel zu klein erscheinen und Text und Grafiken unscharf oder pixelig dargestellt werden. Die im System eingestellte Auflösung, DPI und Skalierung sowie Fonts und Größe und Qualität der Bilder beeinflussen das Darstellungsbild einer Anwendung. Damit bestehende Anwendungen auch auf hochauflösenden Bildschirmen detailreich und scharf dargestellt werden, müssen diese auf HighDPI vorbereitet werden.
Der IDM für Motif, Qt und Microsoft Windows ab Version A.06.03.a (unter Microsoft Windows nur der IDM für Windows 11) bietet nun die geeigneten Werkzeuge um hochauflösende Bildschirme zu unterstützen und Anwendungen zukunftssicher zu gestalten. Außerdem wurde das Arbeiten mit mehreren Bildschirmen verbessert.
IDM-Anwendungen beachten nun die DPI-Einstellungen und Skalierungsfaktoren des Systems. Bisherige Probleme wie pixelige, matschige oder zu klein angezeigte Anwendungen oder verringerte Schriftgrößen bei hohen Auflösungen und geringer Bildschirmgröße (die Effekte können je nach System variieren) treten somit nicht mehr auf. Der IDM passt Geometrie, Layout, Schriftgrößen, Grafiken sowie Cursor nun automatisch an die entsprechende Auflösung und vom System bestimmte DPI an.
Der Skalierungsfaktor basiert dabei auf den Systemeinstellungen der jeweiligen Desktop-Umgebung.
Es steht dem Anwender aber frei durch verschiedene neue Attribute, Optionen und Mechanismen andere Vorgaben zu machen bzw. gestalterisch einzugreifen.
9.1
Startoptionen
-IDMscale <integer>
Über die Startoption -IDMscale <integer> kann die Skalierung durch den IDM aktiviert oder deaktiviert werden. Unter Qt und Motif gibt der Wert die Skalierung in % an.
Abbildung 19-37:
Hinweis
Diese Option sollte unter Microsoft Windows nicht verwendet werden. Die DPI-Awareness ist eine Eigenschaft der Anwendung und sollte in einer Manifest-Datei spezifiziert werden. Für Testzwecke kann die DPI-Awareness eingeschaltet (Wert: 1) oder ausgeschaltet (Wert: 0) werden.
Achtung:
Es wird empfohlen eine Skalierung > 0 und < 100% nicht zu verwenden, da es hier zu Einschränkung in der Darstellung und Bedienung von Objekten kommen kann.
-IDMtiledpi <integer>
Grafiken werden automatisch entsprechend des eingestellten Vergrößerungsfaktor skaliert. Es wird hierbei davon ausgegangen, dass die Bilder für einen DPI-Wert von 96 entworfen wurden. Sind die Bilder der Anwendung für eine höhere Auflösung entworfen worden, kann diese über die Startoption -IDMtiledpi <integer> eingestellt werden. Die Größe eines Bildes wird dann ausgehend von diesem Wert auf den aktuell geltenden DPI-Wert umgerechnet und dementsprechend skaliert.
Ebenso kann diese Einstellung direkt am setup-Objekt mit dem Attribut .tiledpi (siehe Erweiterung am Setup-Objekt) vorgenommen werden.
9.2
Layout-Ressourcen
Bisher waren die verfügbaren, vordefinierten Ressourcen beim IDM immer WSI- bzw. systemabhängig und bedurften bei Übertragung auf andere Systeme immer aufwändiger Anpassungen. Der IDM A.06.03.a bietet nun erstmals WSI-unabhängige und HighDPI-konforme, vordefinierte Layout-Ressourcen an. Dazu gehören folgende Ressourcen, die auf allen Systemen in ähnlicher Ausprägung bzw. Bedeutung verfügbar sind: font (Zeichensatz), color (Farbe), cursor.
Das bietet den enormen Mehrwert, dass Dialoge, die komplett auf die neuen UI-Ressourcen umgestellt wurden, nun einfach und ohne Aufwand auf andere Systeme übertragen werden können. Erkennbar sind diese Ressourcen über das Namensschema UI*_FONT, UI*_COLOR bzw. UI*_CURSOR.
Beispiel:
module Resc
font FontNormal "UI_FONT";
font FontBig "UI_FONT", 16;
font FontFixed "UI_FIXED_FONT";
cursor CurStop "UI_STOP_CURSOR";
!! Background color for group objects
color ColGrp "UI_BG_COLOR";
!! Background color for input objects
color ColInp "UI_INPUTBG_COLOR";
Die UI_-Ressourcennamen sind ebenfalls – wie alle anderen vordefinierten Ressourcennamen - am setup-Objekt über die Attribute .colorname[integer], .fontname[integer], .cursorname[integer] abfragbar.
Cursor
Die einheitlichen Cursor-Ressourcen haben das Namensschema UI*_CURSOR und sind wie folgt definiert:
| UI_CURSOR |
Standardcursor meist Pfeil |
| UI_IBEAM_CURSOR |
Edittext-Einfügemarke |
| UI_WAIT_CURSOR |
Anzeige, dass die Anwendung beschäftig ist, „Eieruhr“ |
| UI_CROSS_CURSOR |
Kreuz |
| UI_UP_CURSOR |
Pfeil nach oben |
| UI_SIZEDIAGF_CURSOR |
Sizing-Pfeil von links oben nach rechts unten |
| UI_SIZEDIAGB_CURSOR |
Sizing-Pfeil von links unten nach rechts oben |
| UI_SIZEVER_CURSOR |
Sizing-Pfeil von oben nach unten |
| UI_SIZEHOR_CURSOR |
Sizing-Pfeil von links nach rechts |
| UI_MOVE_CURSOR |
Verschiebe-Pfeil in alle Richtungen |
| UI_STOP_CURSOR |
Verbotszeichen (durchgestrichener Kreis) |
| UI_HAND_CURSOR |
Handsymbol (Zeigefinger dient zum Zeigen) |
| UI_HELP_CURSOR |
Pfeil mit Fragezeichen (für Kontexthilfe-Modus) |
Fonts
Die einheitlichen Font-Ressourcen haben das Namensschema UI*_FONT und sind wie folgt definiert:
| UI_FONT |
Schriftart, die standardmäßig für Oberflächenelemente verwendet wird (Default oder Dialog Font). |
| UI_FIXED_FONT |
Schriftart mit einer festen Buchstabenbreite. |
| UI_MENU_FONT |
Schriftart, die für Menüs verwendet wird. |
| UI_TITLE_FONT |
Schriftart, die in der Fensterüberschrift verwendet wird. |
| UI_SMALLTITLE_FONT |
Schriftart, die in einer kleinen/niedrigen Fensterüberschrift verwendet wird. |
| UI_STATUSBAR_FONT |
Schriftart, die in der Statusbar verwendet wird. |
| UI_NULL_FONT |
Verhalten als wenn keine Font-Vorgabe gemacht würde (null). |
Color
Die Farb-Ressourcen haben das Namensschema UI*_COLOR und sind wie folgt definiert:
| UI_BG_COLOR |
Farbe, die standardmäßig für allgemeine Hintergründe von (meist Gruppierungs-) Objekten verwendet wird. |
| UI_FG_COLOR |
Farbe, die standardmäßig für allgemeine Vordergründe/Textfarbe von (meist Gruppierungs-) Objekten verwendet wird. |
| UI_INPUTBG_COLOR |
Farbe, die standardmäßig bei Hintergründen von Eingabe-/Auswahl-Objekten verwendet wird. |
| UI_INPUTFG_COLOR |
Farbe, die standardmäßig bei Vordergründen von Eingabe-/Auswahl-Objekten verwendet wird, wie z.B. Edittext, Listen, Tabellen, Poptext, Treeview |
| UI_BUTTONBG_COLOR |
Farbe, die standardmäßig beim Hintergrund von Button-artigen Objekten, |
| UI_BUTTONFG_COLOR |
Farbe, die standardmäßig beim Vordergrund von Button-artigen Objekten, |
| UI_BORDER_COLOR |
Farbe, die standardmäßig als Rahmen, Rand oder Begrenzung verwendet wird (z.B. an .bordercolor). |
| UI_ACTIVEBG_COLOR |
Farbe, die standardmäßig als Hintergrundfarbe des aktiven Elements z.B. bei Listen, Poptext, Tabellen, ggf. Progressbar, Markierungen etc. verwendet wird. |
| UI_ACTIVEFG_COLOR |
Farbe, die standardmäßig als Vordergrund-/Textfarbe des aktiven Elements z.B. bei Listen, Poptext, Tabellen, ggf. Progressbar, Markierungen etc. verwendet wird. |
| UI_TITLEBG_COLOR |
Farbe, die standardmäßig als Hintergrundfarbe bei Titelleisten oder Umrandungen von Fenstern/Dialogen verwendet wird, sofern unterstützt (z.B. an Attribut .titlebgc). |
| UI_TITLEFG_COLOR |
Farbe, die standardmäßig als Vordergrund-/Textfarbe bei Titelleisten oder Umrandungen von Fenstern/Dialogen verwendet wird, |
| UI_MENUBG_COLOR |
Farbe, die standardmäßig als Hintergrundfarbe bei Menüs verwendet wird, |
| UI_MENUFG_COLOR |
Farbe, die standardmäßig als Vordergrund-/Textfarbe bei Menüs verwendet wird, |
| UI_HEADERBG_COLOR |
Farbe, die standardmäßig als Hintergrundfarbe bei Tabellenheadern – sofern unterstützt – verwendet wird. |
| UI_HEADERFG_COLOR |
Farbe, die standardmäßig als Vordergrund-/Textfarbe bei Tabellenheadern – sofern unterstützt – verwendet wird. |
| UI_NULL_COLOR |
Verhalten, als wenn keine Farbe (null) gesetzt wäre. WSI zeichnet nach seiner Standardpalette. |
Es kann vorkommen, dass sich nicht alle UI*COLORS voneinander unterscheiden. Das liegt daran, dass die meisten Desktopfarben aus wenigen Basisfarben "berechnet" werden.
Hinweise Motif:
Neben den UI*_COLOR Farben wurden die Systemnamen für Farb-Ressourcen vervollständigt. Neu hinzugekommen sind:
- INACTIVE_BACKGROUND
- INACTIVE_FOREGROUND
- INACTIVE_TOP_SHADOW
- INACTIVE_BOTTOM_SHADOW
- INACTIVE_SELECT
- SECONDARY_BACKGROUND
- SECONDARY_FOREGROUND
- SECONDARY_TOP_SHADOW
- SECONDARY_BOTTOM_SHADOW
- SECONDARY_SELECT
Hinweise Windows:
Die UI*_COLOR Farben greifen auf die Windows Systemfarben zu. Hierbei ist zum einen zu beachten, dass mit Einführung der Visual Styles von den einzelnen Objekten nicht mehr die Systemfarben, sondern die durch das Theme definierten Farben verwendet werden. Je nach ausgewähltem Theme kann es somit starke Diskrepanzen geben. Deshalb sollten unter Windows nach Möglichkeit keine Farben (oder besser die UI_NULL_COLOR) gesetzt werden.
Zum anderen ist zu beachten, dass mit Windows 10 die Farbvielfalt verringert wurde. Die Farben UI_HEADERBG_COLOR, UI_HEADERFG_COLOR, UI_MENUBG_COLOR, UI_MENUFG_COLOR, UI_TITLEBG_COLOR und UI_TITLEFG_COLOR werden zum Beispiel nicht mehr unterstützt. Das heißt, dass diese Farben für den Anwender zwar noch verfügbar und nutzbar sind, sie aber aktuell von keinem Objekt defaultmäßig verwendet werden.
Hinweise Qt:
Die UI*_COLOR Farben greifen auf die von Qt angebotenen Farben der Standard-Palette zu. Für die Farbausprägung wird dabei die ColorGroup Normal bzw. Active zugrunde gelegt. Die Farben der Standard-Palette wiederum werden durch den aktuell eingestellten Systemstyle vorgegeben.
Neben den UI*_COLOR Farben wurden die vordefinierten Farben um weitere vom Qt-Toolkit angebotenen ColorRoles vervollständigt. Neu hinzugekommen (in allen Ausprägungen der ColorGroups) sind:
- BRIGHTTEXT
- ALTERNATEBASE
- TOOLTIPBASE
- TOOLTIPTEXT
- LINK
- LINKVISITED
- PLACEHOLDERTEXT
9.3
Erweiterung an der Tile-Ressource
Die bestehenden Skalierungsoptionen an der Tile-Ressource wurden erweitert. Es kann nun ein .scalestyle angegeben werden, der bestimmt wie ein Tile skaliert werden soll. So können Muster (tiles) nun nach folgenden Merkmalen skaliert werden:
- automatisch
- um einen bestimmten Faktor
- proportional
- in alle Richtungen frei
- an den DPI-Wert anpassen und keine Skalierung
Abbildung 19-38:
In der Regelsprache stehen dabei folgende Werte zur Auswahl:
|
|
|
Bedeutung |
|---|---|---|
| noscale | scalestyle_none |
Das Muster bzw. Bild wird nicht skaliert., .tiledpi hat keine Auswirkungen. |
| scale | scalestyle_any |
Höhe und Breite des Musters bzw. Bildes werden voll auf die verfügbare Fläche vergrößert. |
| propscale | scalestyle_prop |
Höhe und Breite des Musters bzw. Bildes werden auf die verfügbare Fläche vergrößert, wobei Höhen- und Breitenproportionen des Musters bzw. Bildes auf jeden Fall erhalten bleiben. D.h. es können oben und unten bzw. links und rechts Freiflächen entstehen. |
| numscale | scalestyle_num |
Die Skalierung des Musters bzw. Bildes wird durch einen numerischen Skalierungsteiler vorgenommen. Dabei wird die Skalierung in Viertel-Schritten vorgenommen, also 1.25-fach, 1.5-fach, 1.75-fach, 2-fach, 2.25-fach, 2.5-fach, usw. |
| dpiscale | scalestyle_dpi |
Das Muster bzw. Bild wird immer entsprechend der eingestellten Bildschirmskalierung skaliert. |
|
Keine Angabe |
scalestyle_auto |
Das Muster bzw. Bild wird entsprechend der eingestellten Bildschirmskalierung skaliert. Eine zur Vorgängerversion kompatible Skalierung findet statt. Defaultwert |
Der scalestyle kann dabei entweder direkt bei der Definition des Tiles oder aber als dynamisches Attribut angegeben werden.
Tile-Definition
tileSpec ::= <tileBitmap> | "<
Dynamisches Attribut
|
Bezeichner |
Datentyp |
||
|---|---|---|---|
|
Regelsprache |
.scalestyle |
enum |
|
|
C |
DT_enum |
||
|
COBOL |
DT-enum |
||
|
Klassifizierung |
Objektspezifisches Attribut |
||
|
Objekte |
|||
|
Zugriff |
get, set |
Standardwert |
scalestyle_auto |
|
changed-Ereignis |
nein |
Vererbung |
– |
Beispiel:
dialog D
tile Ti_Rect_Pattern 5,5,
"#####",
"# #",
"# #",
"# #",
"#####" noscale; //
tile Ti_BG „bg.gif“ scale; //
tile Ti_Logo „logo.gif“; //
...
on dialog start {
if setup.scale > 100 then
Ti_Logo.scalestyle := scalestyle_prop; // dynami
endif
}
Siehe auch Kapitel „tile (Muster) “ im „Ressourcenreferenz“-Handbuch.
9.4
Erweiterung der Font-Ressource
Die Font-Ressource hat eine neue Eigenschaft .propscale. Dies steuert, ob das horizontale und vertikale Raster proportional auf den maximalen Wert gesetzt werden soll, welcher durch die Werteberechnung von xraster und yraster des Font-Rasters ermittelt wird.
Die propscale-Eigenschaft kann dabei entweder direkt bei der Definition des Fonts oder aber als dynamisches Attribut angegeben werden.
Der Divisor dient der Verfeinerung des Rasters.
Font-Definition:
fontspec ::=
...
...
{ x:= * <xscale> % + <xoffset> | / <xdivider>} { y:= * <yscale> %
+ <yoffset> | / <ydivider>}
{ propscale }
{ r:= "<RefString >" } ;
Dynami
|
Bezeichner |
Datentyp |
||
|---|---|---|---|
|
Regelsprache |
.propscale |
boolean |
|
|
C |
DT_boolean |
||
|
COBOL |
DT-boolean |
||
|
Klassifizierung |
Objektspezifisches Attribut |
||
|
Objekte |
|||
|
Zugriff |
get, set |
Standardwert |
false |
|
changed-Ereignis |
nein |
Vererbung |
– |
Siehe auch Kapitel „font (Zeichensatz)“ im „Ressourcenreferenz“-Handbuch.
9.5 Erweiterung am Setup-Objekt
|
Bezeichner |
Datentyp |
||
|---|---|---|---|
|
Regelsprache |
.tiledpi |
integer |
|
|
C |
DT_integer |
||
|
COBOL |
DT-integer |
||
|
Klassifizierung |
Objektspezifisches Attribut |
||
|
Objekte |
|||
|
Zugriff |
get, set |
Standardwert |
– |
|
changed-Ereignis |
nein |
Vererbung |
– |
|
Bezeichner |
Datentyp |
||
|---|---|---|---|
|
Regelsprache |
.tiledpi |
integer |
|
|
C |
DT_integer |
||
|
COBOL |
DT-integer |
||
|
Klassifizierung |
Objektspezifisches Attribut |
||
|
Objekte |
|||
|
Zugriff |
get, set |
Standardwert |
96 |
|
changed-Ereignis |
nein |
Vererbung |
– |
Dieses Attribut bestimmt für welche Auflösung die Bilder/Muster entworfen wurden. Die Größe eines Bildes/Musters wird ausgehend von diesem Wert auf den aktuell geltenden DPI-Wert umgerechnet.
Siehe auch Kapitel „setup“ im „Objektreferenz“-Handbuch.
9.6
Erweiterungen am Image-Objekt
Für eine bessere Ausrichtung und erweiterte Layoutmöglichkeiten können nun über die folgenden Attribute am Image-Objekt die Ränder bzw. Abstände gesteuert werden:
|
Bezeichner |
Datentyp |
||
|---|---|---|---|
|
Regelsprache |
.xmargin |
integer |
|
|
C |
DT_integer |
||
|
COBOL |
DT-integer |
||
|
Klassifizierung |
Objektspezifisches Attribut |
||
|
Objekte |
|||
|
Zugriff |
get, set |
Standardwert |
0 |
|
changed-Ereignis |
nein |
Vererbung |
ja |
Dieses Attribut bestimmt den horizontalen Abstand zwischen Rand und Darstellungsbereich.
|
Bezeichner |
Datentyp |
||
|---|---|---|---|
|
Regelsprache |
.ymargin |
integer |
|
|
C |
DT_integer |
||
|
COBOL |
DT-integer |
||
|
Klassifizierung |
Objektspezifisches Attribut |
||
|
Objekte |
|||
|
Zugriff |
get, set |
Standardwert |
0 |
|
changed-Ereignis |
nein |
Vererbung |
ja |
Dieses Attribut bestimmt den vertikalen Abstand zwischen Rand und Darstellungsbereich.
Siehe auch Kapitel „image (Bild)“ im „Objektreferenz“-Handbuch.
9.7
Unterstützung von HiDPI Bild-Varianten
Für eine optimale Gestaltung der Oberfläche bzgl. Bilder und Applikations-Icons durch Ausnutzung der höheren Auflösung sind für die Skalierungsstufe angepasste Bilder sinnvoll.
Bisher gab es hier nur für die Fenstersysteme Windows und Qt eingeschränkte Möglichkeiten. Windows bietet hier bislang zur Unterstützung den ICON/BITMAP-Mechanismus und Qt den Icon-Ressource-Mechanismus. Beide Mechanismen ermöglichen das Vorhalten mehrerer Auflösungsstufen, sind jedoch begrenzt was Bildtyp oder Verwendung angeht. Einen solchen Mechanismus gibt es für Motif nicht.
Daher wurde mit dem IDM A.06.03.a eine Möglichkeit zum Laden mehrerer Auflösungsstufen geschaffen, die gleichermaßen für Windows, Qt und Motif angewandt werden kann und somit auch systemunabhängig ist.
Die Tile-Verwaltung vom IDM war bisher nur in der Lage eine Bilddatei zu laden (bspw.: tile Ti smiley.gif
) und konnte nicht mehrere Auflösungsstufen der Datei vorhalten (bis auf o.g. Ausnahmen). Liegt nun eine Skalierung der Anwendung vor, versucht der neue Lademechanismus für Tile-Dateien nun zuerst die Bilddaten für die entsprechende Skalierung zu laden. Dazu wird in Anlehnung an den Qt-Mechanismus die Endung @nx an den Dateinamen und vor dem Suffix angehängt. Dabei steht n für die Skalierungsstufe zwischen 2 und 9. Die Zahl 2 entspricht dabei einer Skalierung von 150%-249%, 3 von 250%-349%, usw.
Sinnvollerweise sollten die Größenänderungen der Varianten Bilder der Skalierungsstufe entsprechen, wobei eine Überprüfung durch den IDM nicht erfolgt. Also z.B. Orginalbild smiley.gif
(32x32 Pixel), smiley@2x.gif (64x64 Pixel), smiley@3x.gif (96x96 Pixel), smiley@4x.gif (128x128 Pixel).
Beispiel:
tile Ti „smiley.gif“; //
//
// smiley@2x.gif
//
//
// smiley@3x.gif
tile Ti2 „smiley.ico“ //
//
//
tile Ti3 „:/smiley“ //
//
//
//
9.8
Installationshinweise
Um eine Anwendung für unterschiedliche Auflösungen vorzubereiten, kann es notwendig sein, die Grafiken für die verschiedenen Skalierungsstufen vorzuhalten. Wer das in Anspruch nehmen möchte und nicht den ICON-Mechanismus von Windows oder den Resource-Mechanismus von Qt nutzt, der sollte darauf achten die Bilderdateien entsprechend der @-Namensgebung (siehe Kapitel „Unterstützung von HiDPI Bild-Varianten“) mit seiner Anwendung mit auszuliefern bzw. diese ggf. in die Installationspakete mit aufzunehmen.
9.9
Geometrie und Koordinaten
Koordinaten und Größenangaben werden vom IDM passend zum Skalierungsfaktor des Systems transformiert um eine zu den Systemeinstellungen konsistente Darstellung zu gewährleisten.
Die Geometrieeinheiten werden dabei wie bisher in IDM-Pixelwerten oder Raster gesetzt.
Die IDM-Pixelwerte werden intern entsprechend dem Skalierungsfaktor in reale Pixelwerte hochgerechnet und umgesetzt. Dadurch wird die Anwendung als Ganzes skaliert und Verhältnisse und Proportionen der Objekte zu- und untereinander beibehalten.
Diese Konvertierung geschieht in beide Richtungen. Beim Abfragen von Größe und Position von Objekten wie auch bei der Event-Verarbeitung werden die realen Pixelwerte vom IDM ebenso wieder bereinigt in IDM-Pixelwerten angegeben. Der Vergrößerungsfaktor ist dann wieder herausgerechnet. Dies betrifft alle pixelorientierten Geometrieattribute.
Rasterwerte sind entweder an den verwendeten (HighDPI-fähigen) Zeichensatz geknüpft oder werden ebenfalls in IDM-Pixelwerten gesetzt und dann hoch skaliert. Die Rastereinheiten können basierend auf der zugrundeliegenden Schriftart ebenfalls zu IDM-Pixelwerten ermittelt werden.
9.10
Unterstützung hoher Auflösungen unter Motif
Das Motif-Toolkit selbst enthält zwar keine besondere Technologie zur Unterstützung hoher Auflösungen, wenn aber das verwendete X-Display die Xrender-Extension implementiert hat und eine Unterstützung von XFT-Fonts mit den entsprechenden Schriftarten vorliegt, können IDM-Anwendungen für Motif auf HiDPI-Bildschirmen, unter Berücksichtigung des Skalierungsfaktors des Desktops, betrieben werden.
Wie kann geprüft werden, ob auf dem verwendeten X-Display/Desktop eine Unterstützung vorliegt? Dazu kann die Serverinformation des X-Displays über die Option -IDMserver: erfragt werden.
$ idm -IDMserver
ServerVendor The X.Org Foundation
VendorRelease 12013000
Motif at compiletime @(#)Motif Version 2.3.8
Motif at runtime 2003
XRenderVersion 11 (active)
XFT Support yes (active)
Scaling 200% (active)
Screen dpi 96 (tile dpi: 96, scaled dpi: 192)
Die Version der Xrender-Extension und deren Nutzbarkeit (active) wird darin ebenso aufgelistet wie das Vorhandensein von XFT und seiner Nutzbarkeit. Die „Scaling“-Zeile zeigt den Skalierungsfaktor an, der in den Desktop-/Anzeigeeinstellungen vom Anwender gesetzt wurde.
Die DPI-Information welche X liefert, ist zumeist der Standardwert von 96 und spiegelt damit nicht unbedingt den real am Monitor vorhandene DPI-Wert wider. Die optional ausgegebenen „tile dpi“ und „scaled dpi“ dienen zur Kontrolle der für die Bilder und Bedienelemente zugrunde gelegten DPI-Werte.
Ein dynamisches Wechseln der Skalierung ist für Motif-Anwendungen nicht vorgesehen. Ebenso kann eine Umsetzung der Skalierung im Desktop nicht erkannt werden.
Unterstützung von XFT / Font-Handhabung / Motif-Font
Die Basis für eine GUI-Anwendung für unterschiedliche Desktop-Skalierungen stellen die verwendeten Schriften dar. Im Gegensatz zu den bisher unter Motif/X verwendbaren Schriftarten, die meist über einen XLFD (X Logical Font Descriptor) angeben wurden, werden XFT Fonts entsprechend der gesetzten Skalierung des Desktop mitskaliert.
Die bisher unter dem IDM für Motif verwendbaren Schriftarten hatten sich nicht automatisch an unterschiedliche Desktop-Skalierungen angepasst.
Die XFT-Unterstützung ist im IDM nur auf Linux-Plattformen verfügbar. Da die meisten Desktops auf Linux-Plattformen den Standard-Font für Motif-Widgets nur unzureichend setzen, benutzt der IDM Liberation Sans als Standard-Schrift und Liberation Mono als Festbreitenschriftart, wenn kein Font im Dialog gesetzt wurde. Dadurch skalieren sich Texte in IDM-Dialogen auch ohne gesetzte Schriftart.
Durch explizites Ausschalten des Scaling (über die Startoption -IDMscale=0), kann man die alten Default-Schriftarten erhalten.
Zum setzen eines XFT Fonts muss wie bei bisherigen Fontdefinitionen im IDM nur der Fontname und ggf. weitere Modifier gesetzt werden. Ist der Font als XFT Font auf dem System vorhanden, dann wird dieser geladen. Die Liste der auf dem System verfügbaren XFT Fonts kann im IDM Editor eingesehen werden.
Unter CDE-konformen Plattformen wie AIX und HP-UX verwendet der IDM als Standard-Schrift -dt-interface_system-medium-r-normal-*
und -dt-interface_user-medium-r-normal-*
als Festbreitenschrift, sofern keine Schrift gesetzt wurde. Je nach Skalierungsfaktor werden dabei unterschiedliche Größenausprägungen des Fonts herangezogen. Zwischen 1%...75% wird xs (extra small) verwendet, zwischen 75%-150% wird m (medium) verwendet, zwischen 150%-250% wird l (large) verwendet und ab 250% wird xxl (extra extra large) verwendet. Dadurch kann für solche Anwendungen eine Skalierbarkeit erreicht werden auch wenn keine XFT-Fonts verfügbar sind.
9.11
Unterstützung hoher Auflösungen beim IDM für Windows 11
Es gibt jetzt einen IDM für Windows 11 und einen für Windows 10. Der IDM für Windows 11 unterstützt DPI-Awareness und High DPI.
Der IDM für Windows 11 unterstützt hohe Auflösungen des Modells PerMonitor V2
. Da die Unterstützung hoher Auflösungen eine Eigenschaft der Anwendung ist, muss diese im Anwendungsmanifest entsprechend gekennzeichnet werden. Entsprechende Setzung können in den IDM-Beispielen entnommen werden. Der IDM erkennt dies dann selbständig und rechnet die Koordinaten entsprechend dem eingestellten Vergrößerungsfaktor um. Mit anderen Worten, die Pixelkoordinaten des IDM sind virtuelle Pixel, die entsprechend dem eingestellten Vergrößerungsfaktor umgerechnet werden.
Die Manifest-Dateien der IDM-Beispiele kennzeichnen die gebauten Anwendungen als High DPI-Aware
. Um eine Anwendung zu bauen, die nicht DPI-Aware
ist, muss der gesamte Block <asmv3:application> aus der Manifest-Datei entfernt werden.
Hinweise IDM f
Alle Funktionen, die Microsoft Windows Nachrichten verarbeiten: Wenn die Anwendung hohe Auflösungen unterstützt, dann sind alle Koordinaten, die über Microsoft Windows Nachrichten erhalten werden, die realen hochauflösenden Koordinaten. Der IDM benutzt dagegen um den Vergrößerungsfaktor bereinigte Koordinaten. Es muss also berücksichtigt werden, dass im Falle der Unterstützung hoher Auflösungen, die IDM-Koordinaten im Allgemeinen nicht mehr identisch zu den Microsoft Windows Koordinaten sind. Betroffen hiervon sind zum Beispiel Inputhandler-, Canvas-, Monitor- und Subclassing-Funktionen, sowie auch die USW-Implementierungen.
Hinweise IDM f
Die Unterstützung hoher Auflösungen erfordert eine andere Behandlung von Windowsnachrichten. Dadurch ist es leider nicht mehr möglich Fenster während des Verschiebens oder Vergrößerns an Rahmenbedingungen wie zum Beispiel Rasterkoordinaten anzupassen. Erst nach dem Loslassen der Maustaste wird das Fenster auf die nächste Rasterkoordinate angepasst.
Intern definierte Cursor werden jetzt auf die vom System geforderte Größe vergrößert bzw. verkleinert, um diese automatisch auf den eingestellten Vergrößerungsfaktor anzupassen. Hierdurch werden die Cursor richtig dargestellt, wenn die Anwendung hohe Auflösungen unterstützt. Bisher wurden die Cursor entweder mit durchsichtigen Bereichen aufgefüllt oder einfach abgeschnitten, wenn die Größe nicht passte.
Bilder (tile Ressource) werden automatisch entsprechend des eingestellten Vergrößerungsfaktor vergrößert. Es wird hierbei davon ausgegangen, dass die Bilder für einen DPI-Wert von 96 entworfen wurden. Sind die Bilder der Anwendung für eine höhere Auflösung gestaltet, dann kann dies am setup Objekt mit dem Attribute .tiledpi eingestellt werden. Eine automatische Anpassung gilt nur für die tile-Ressource. Bilder die direkt über den Dateinamen am .picture Attribute des image-Objektes angegeben werden, werden nicht automatisch angepasst.
Als Standardschriftart wird nun die in den Systemparameters definierte Dialog- bzw. Message-Schriftart verwendet, da diese sich an die Auflösung anpasst. Hierdurch kann es zu Änderungen der Darstellung von Objekten kommen, die keine Schriftart gesetzt haben. Die erwähnte Schriftart kann über Windows Systemeinstellungen konfiguriert werden.
Die alten Systemschriftarten sind nicht DPI-Aware. Nur die neuen UI*_FONT Schriftarten passen sich der eingestellten Auflösung an.
Die alten Windows-Schriftarten ANSI_FIXED_FONT
, ANSI_VAR_FONT
, DEVICE_DEFAULT_FONT
und SYSTEM_FONT
lassen sich nicht an verschiedene Auflösungen anpassen, daher wird von der Verwendung abgeraten. Von der Verwendung von Schriftarten ohne Größenangabe wird abgeraten, da in einem solchen Fall vom Windows Font Mapper eine schriftartspezifische Standardgröße gewählt wird, die sich nicht an unterschiedliche Auflösungen anpasst.
9.12
Unterstützung hoher Auflösungen unter Qt
Für die Unterstützung hoher Auflösungen aktiviert der IDM das Qt-seitige HighDpi-Scaling sowie das mögliche Rendern von Bildern über ihre eigentlich angeforderte Größe hinaus. D.h. die Skalierung wird auf Basis der Pixeldichte des Monitors vorgenommen.
Unter Linux Desktop-Umgebungen ist die Unterstützung für HighDPI leider sehr unterschiedlich ausgeprägt und fortgeschritten. Da die Werte für logische und tatsächliche Pixeldichte sowie Skalierungsfaktoren vom Qt-Framework bezogen werden, kann es sein, dass weniger populäre Desktop-Umgebungen hier unzureichende Werte liefern.
Hinweise
Qt bietet noch einige Umgebungsvariablen an, mit denen die Darstellung bei hohen Auflösungen gesteuert werden kann. Bei Einsatz solcher Umgebungsvariablen sollte jedoch bewusst sein, dass somit das Verhalten des IDM überschrieben wird und es dadurch zu ungewollten Darstellungseffekten kommen kann.
Anmerkungen
Objekte werden standardmäßig mit den vom Desktop-Style vorgegebenen Werten durch das WSI/Toolkit dargestellt. Es kann daher in bestimmten Situationen vorkommen, dass die gewünschten Einstellungen bezüglich Größe und Skalierung von Tiles nicht umgesetzt werden. Dies betrifft die Verwendung von Tiles bei Objekten mit Tabs wie dem Notebook bzw. den Notepages sowie dem Menu mit Menuitems. Der IDM setzt zwar die gewünschten Darstellungsoptionen, jedoch unterliegt die finale Anzeige der Darstellungsrichtlinie der jeweiligen DrawingEngine des gesetzten UI-Styles. Das bedeutet, dass die Anzeige von den gesetzten Optionen Style-abhängig abweichen kann oder Optionen vollständig ignoriert werden.
9.13
Erweiterungen/ Änderungen im IDMED
Eine beliebige Auswahl der Schriftart für die Bedienoberflächen oder Regelcode ist nicht mehr möglich. Dafür kann die Schriftgröße zwischen Klein (Small) – Normal – Groß (Large) – Extra Groß (Extra Large) ausgewählt werden. Diese hat dann natürlich Einfluss auf die Fenstergröße.
Im Schriften- bzw. Font-Einstellungsbereich werden unter Motif auch XFT-Fonts aufgelistet. Außerdem kann die Liste der Auswählbaren Schriften zum Zwecke der Übersichtlichkeit auf UI-Fonts, X-Fonts und XFT-Fonts reduziert werden.
Der IDMED, TracefileAnalyzer sowie der Debugger setzen nun UI-Ressourcen ein.
9.14
Unterstützung hoher Auflösungen bei der USW-Programmierung
Die Funktion DM_GetToolkitDataEx wurde zur Unterstützung von HighDPI verbessert. Die ToolkitDaten-Struktur DM_ToolkitDataArgs wurde zu diesem Zweck erweitert und liefert nun detaillierte Informationen zu DPI, Skalierungsfaktor und Bild. Diese können über die Attribute AT_DPI und AT_XWidget erfragt werden.
Hinweis Motif
Der USW-Programmierer muss die Koordinaten zwischen dem IDM (dies betrifft Attribute sowie Events) und den Motif-Werten/Strukturen/Funktionen (X…/ Xt…/ Xm…) umrechnen. Die für eine Umrechnung benötigten Daten können über Funktion DM_GetToolkitDataEx mittels AT_DPI und die ToolkitDaten-Struktur DM_ToolkitDataArgs-Struktur (tile.scale.factor) erfragt werden. Je nach Bildart muss u.U. auch eine Skalierung vorgenommen werden.
Hinweis f
Der IDM für Windows 11 unterstützt hohe Auflösungen. Wenn eine Anwendung für hohe Auflösungen freigegeben wird, dann müssen auch die von ihr verwendeten USW-Objekte hohe Auflösungen unterstützen. Das heißt dann, dass die USW-Objekte von Windows reale Koordinaten erhalten (um den Vergrößerungsfaktor vergrößert), während der IDM mit virtuellen Koordinaten (nicht vergrößert) arbeitet. Praktisch wird sich nicht viel ändern, da der IDM die Koordinatenberechnungen für das USW Objekt ausführt. Aber es ist zu berücksichtigen, dass der control Aufruf für UC_C_PrefSize
reale Koordinaten erwartet, da diese im Normalfall aus Toolkitwerten berechnet werden. Sind hier fixe Zahlen wie im ucarrow Beispiel eingesetzt, dann müssen diese um den aktuellen DPI-Wert korrigiert werden (siehe ucarrow Beispiel).
Wenn die Anwendung als DPI-Aware gestartet wurde, werden nun von der Task UC_I_clientarea
der Funktion UC_Inquire auch die hochauflösenden Werte erwartet.
Ergänzungen der C-Schnittstelle für DM_GetToolkitData() und DM_GetToolkitDataEx()
Bei den C-Schnittstellen Funktionen "DM_GetToolkitData()", "DM_GetToolkitDataEx()" und Toolkitdaten-Struktur "DM_ToolkitDataArgs" gibt es zur Unterstützung von hohen Auflösungen die folgenden Erweiterungen:
Attribute AT_DPI
Gibt den DPI-Wert des Systems oder des angegebenen Objektes zurück. Die Funktion "DM_GetToolkitDataEx()" muss mit einem Zeiger auf eine Toolkitdaten-Struktur "DM_ToolkitDataArgs" aufgerufen werden. In dieser Struktur werden weitere DPI-Informationen zurückgeliefert. Sie ist hierzu um das Datenfeld "dpi" und die Unterdatenstruktur "scale" erweitert.
Attribute "AT_Tile" bzw. "AT_XTile"
Dieses Attribut gab es schon für die "tile" Ressource. Jetzt kann die Funktion "DM_GetToolkitDataEx()" mit einem Zeiger auf eine Toolkitdaten-Struktur "DM_ToolkitDataArgs" aufgerufen werden, die um die Unterdatenstruktur "tile" erweitert wurde. Diese enthält unter anderem den DPI-Wert, für den die "tile" Ressource entworfen wurde.
Attribute "AT_IsNull"
Liefert einen Wert ungleich "0" zurück, wenn die angegebene "color" oder "font" Ressource auf "UI_NULL_FONT" bzw. "UI_NULL_COLOR" definiert war.
Siehe auch Kapitel„ToolkitDaten-Struktur DM_ToolkitDataArgs“ im „C-Schnittstelle - Grundlagen“-Handbuch.
Siehe auch Kapitel „DM_GetToolkitDataEx“ im „C-Schnittstelle - Funktionen“-Handbuch.