ubuntuusers.de

Bildschimauflösung mit C ermitteln

Status: Gelöst | Ubuntu-Version: Nicht spezifiziert
Antworten |

Njutik

Anmeldungsdatum:
29. Januar 2009

Beiträge: 52

Hallo Leute!

Wie kann ich aus einem C-Programm heraus die momentane Bildschirmauflösung bestimmen? Gibt es dafür bestimmte C-Funktionen? Ich habe danach schon gegoogelt, habe aber nur Java und C++-Codes gefunden. Ich habe aber ein C-Programm und C++ kann ich leider nicht. Kann mir da jemand helfen?

Liebe Grüße

Anna

Kinch

Anmeldungsdatum:
6. Oktober 2007

Beiträge: 1261

Ich habe vor Ewigkeiten für ein OpenGl-Programm mal die Bildschirmauflösung bestimmt:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <X11/Xlib.h>
#include <IL/il.h>

...

    Display *disp;
    int screen_num;
    unsigned int display_width;
    unsigned int display_height;
    
    /* connect to the XServer */
    if ((disp = XOpenDisplay(NULL)) == NULL) {
        printf("ERROR - Failed to call XOpenDisplay()\n");
        exit(-1);
    }   
    
    /* Query the display structure for information */
    screen_num = DefaultScreen(disp);
    display_width = DisplayWidth(disp, screen_num);
    display_height = DisplayHeight(disp, screen_num);
    
    /* Close the Window and exit application */
    XCloseDisplay(disp);

War allerdings für C++, sollte aber keine Rolle spielen. Die Angaben stehen dann halt in display_width und display_height. Ist wie gesagt ne Weile her; möglicherweise funktioniert das nicht mehr, bzw. ist xcb die bessere Wahl.

Gruß

Njutik

(Themenstarter)

Anmeldungsdatum:
29. Januar 2009

Beiträge: 52

Hi Kinch!

Danke für die Antwort.

Ich habe Deinen Quellcode genommen und einfach eine main() Funktion drum rum gemacht, so dass der Code jetzt wie folgt aussieht:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <X11/Xlib.h>
#include <IL/il.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

int main(int argc, char *argv[])
{
    Display *disp;
    int screen_num;
    unsigned int display_width;
    unsigned int display_height;
    
    /* connect to the XServer */
    if ((disp = XOpenDisplay(NULL)) == NULL) {
        printf("ERROR - Failed to call XOpenDisplay()\n");
        exit(-1);
    }   
    
    /* Query the display structure for information */
    screen_num = DefaultScreen(disp);
    display_width = DisplayWidth(disp, screen_num);
    display_height = DisplayHeight(disp, screen_num);
    
    /* Close the Window and exit application */
    XCloseDisplay(disp);

	return 0;
}

Dann versuche ich den Code mit gcc -o resolution resolution.c zu kompilieren und bekomme folgende Fehlermeldung:

error: IL/il.h: No such file or directory

Im Internet habe ich kein Package gefunden, das für dieses IL/il.h benötigt wird. Ich habe dann probeweise mit

sudo apt-get install libx11-* 

alle Pakete installiert, die für X11 da waren und dann

gcc -o resolution resolution.c -lX11 

versucht, aber dann bekomme ich wieder diesen Fehler. Weisst Du, wie ich ihn beseitigen kann? Welches package brauche ich dazu?

Liebe Grüße

Anna

snafu1

Avatar von snafu1

Anmeldungsdatum:
5. September 2007

Beiträge: 2133

Wohnort: Gelsenkirchen

Soweit ich weiß, brauchst du dieses IL auch gar nicht. Das sind alles reine XLib-Funktionen, die da aufgerufen werden.

Njutik

(Themenstarter)

Anmeldungsdatum:
29. Januar 2009

Beiträge: 52

Ich habe jetzt doch gefunden, dass dieses IL/il.h mit libdevil zusammenhängt. Also habe ich mit

sudo apt-get install libdevil*

alles passende runtergeladen und installiert. Jetzt wird die Headerdatei /IL/il.h gefunden, aber beim Kompilieren kommt die Meldung:

undefined reference to `XOpenDisplay'
undefined reference to `XCloseDisplay'

Ich vermute mal, ich muss gegen eine devil-library linken. Und jetzt meine wahrscheinlich recht primitive Frage: wie mache ich das? Ich kenne es so, dass wenn ich gegen eine Library linken muss, muss ich zuerst libexample-dev installieren und dann mit

gcc -o test test.c -lexample

gegen diese library linken.

In meinem Beispiel habe ich die libdevil-dev installiert und müsste jetzt mit

gcc -o resolution resolution.c -ldevil

linken können, aber dann bekomme ich

/usr/bin/ld: cannot find -ldevil
collect2: ld gab 1 als Ende-Status zurück

Wie linke also gegen die devil-Bibliothek?

Kinch

Anmeldungsdatum:
6. Oktober 2007

Beiträge: 1261

Hallo,

ja, sorry. Den IL-Header brauchst du gar nicht, lass ihn einfach weg. Ansonsten stimmt ein Compile-Aufruf.

Edit: Wie gesagt IL war ein Kopier-Fehler von mir. Du musst es mit -lX11 kompilieren.

Njutik

(Themenstarter)

Anmeldungsdatum:
29. Januar 2009

Beiträge: 52

Danke snafu!

Du hast wahrscheinlich gepostet während ich geschrieben habe. Ich habe die Header-Zeile

1
#include <IL/il.h>

auskommentiert und dann konnte ich mit

gcc -o resolution resoulution.c -lX11

fehlerfrei kompilieren und kriege meine Bildschirmauflösung!

Juhu!

Liebe Grüße

Anna

snafu1

Avatar von snafu1

Anmeldungsdatum:
5. September 2007

Beiträge: 2133

Wohnort: Gelsenkirchen

Es würde übrigens reichen, ein -dev hinter den Paketnamen zu setzen. Man braucht da nicht auf doof alle in Frage kommenden Namen per Wildcard zu installieren. 😉

Antworten |