Aufloesung auslesen
-
Hallo,
ich wuerde gern mit Hilfe der Xlib die Aufloesung des Bildschirms auslesen und aendern und bin dabei auf diverse XRR (XRandR) Funktionen gestossen.
Nun braucht nahezu jede dieser Funktionen eine Variable vom Typ XRRScreenConfiguration (oder gibt sie zurueck). Wo bekomme ich die Deklaration dazu her?
Was ich gefunden habe:/* internal representation is private to the library */ typedef struct _XRRScreenConfiguration XRRScreenConfiguration;
Compiler schrieb:
"Error: In this declaration "config" is of an incomplete type "_XRRScreenConfiguration".
Eingebunden habe ich:
#include <X11/Xlib.h> #include <X11/Xutil.h> #include <X11/extensions/Xrandr.h>
man 3 Xrandr schrieb:
XRRScreenConfiguration This is an opaque data type containing the configuration information for a screen.
Aha
Habe schon das ganze X11 include Verzeichnis durchgegrept, aber nichts gefunden.Alternativ gibt es wohl diverse XF86-Funktionen, aber das hoert sich so veraltet an *hust*. Darum wuerde ich das lieber nur als Fallback nutzen.
Hat jemand Ahnung?
Vielen Dank.
deso
-
http://www.squarebox.co.uk/cgi-squarebox/manServer/usr/X11R6/man/man3/Xrandr.3x
XRRScreenConfiguration *XRRGetScreenInfo (Display *dpy, Drawable draw);
-
"opaque data type" entspricht den privaten membern einer klasse, d.h. du kommst an die daten überhaupt nicht ran.
-
d3d3d3 schrieb:
"opaque data type" entspricht den privaten membern einer klasse, d.h. du kommst an die daten überhaupt nicht ran.
Ok, und was bringt mir die Funktion da?
Wird das ganze nur intern verwendet?
-
Habs nun hinbekommen.
Falls es noch jemand braucht, so kann der Code aussehen:SizeT width = 0; SizeT height = 0; int color_depth = XDefaultDepth(display_, screen_); int refresh_rate = 0; XRRScreenConfiguration* config = XRRGetScreenInfo(display_, XDefaultRootWindow(display_)); typedef void (*FreeConfig)(XRRScreenConfiguration*); typedef ResourceGuard<XRRScreenConfiguration*, FreeConfig> Guard; Guard guard(config, reinterpret_cast<FreeConfig>(&XRRFreeScreenConfigInfo)); int count = 0; XRRScreenSize* sizes = XRRConfigSizes(config, &count); if (count > 0) { Rotation rotation; SizeID current = XRRConfigCurrentConfiguration(config, &rotation); if (current >= 0 && current < count) { width = sizes[current].width; height = sizes[current].height; refresh_rate = XRRConfigCurrentRate(config); } else { throw Error(TXT("Error retrieving current resolution"), TXT("XRRConfigCurrentConfiguration returned invalid index")); } } else throw Error(TXT("Error retrieving current resolution"), TXT("XRRConfigSizes returned zero"));
-
Mal eine Frage: Brauchst du wirklich die Auflösung, oder reicht dir die Größe des Desktops in Pixel? Wenn ja, dann könntest du auf die XRandr Erweiterung verzichten, die vielleicht nicht überall installiert ist.
-
Mein Ziel war letztendlich, eine Liste aller verfügbaren Auflösungen zu erstellen und zwischen diesen dann auch umschalten zu können. Daher - denke ich - komme ich um eine Erweiterung nicht herum.