2009-07-20 7 views
10

J'essaie d'obtenir la résolution de l'écran ainsi que la résolution d'une fenêtre spécifique (dans laquelle un programme est en cours d'exécution) sur le système Linux. Je n'ai pas besoin de modifier la résolution, j'ai seulement besoin des valeurs actuelles. Pour autant que je sache, nous pouvons appeler certaines fonctions du système pour le faire sur Windows, comment pouvons-nous faire cela sur Linux, de préférence en utilisant le langage C/C++? Merci d'avance. Mise à jour: En fait, je n'ai pas besoin de faire une interface graphique, même si je sais que Qt et GTK + peuvent le faire, je suis réticent à inclure une bibliothèque externe pour obtenir la résolution.Comment obtenir par programme la résolution d'une fenêtre et celle du système sous Linux?

+0

S'il n'y a pas d'interface graphique, puis est une application de la console? Avez-vous besoin de ces valeurs même si elles ne fonctionnent pas sous X? – jmanning2k

+0

Il y a une interface graphique, mais la partie sur laquelle je travaille n'en a pas besoin. Il a seulement besoin de ces valeurs pour une mesure ultérieure. –

Répondre

6

Dans X11, vous devez appeler le XGetWindowAttributes du Xlib pour obtenir les différentes informations sur la fenêtre, y compris la taille et la position par rapport au parent. Pour un exemple de la façon dont il est utilisé, vous pouvez google pour 'xwininfo.c'. Cela dit, vous utiliserez sans doute un peu plus de framework de haut niveau pour faire votre programmation de fenêtres - et il y a de fortes chances qu'il ait déjà d'autres primitives pour cela, voir un exemple pour Qt - donc vous pourriez vouloir donner un peu plus d'informations sur la question.

0

L'outil de ligne de commande xdpyinfo fournit cette information pour vous; Pour le faire par programmation, vous devez utiliser Xlib, comme Andrew Y explique.

6

Depends:

+0

Can Qt ou Gtk + obtiennent une résolution de fenêtre spécifique? –

+0

Je peux obtenir une liste de fenêtres avec GTK, mais pas de nom, id ou quoi que ce soit. Aucune idée comment identifier une fenêtre spécifique. Finalement allé pour Xlib, et résolu mon problème (bien que le code semble un peu dégoûtant ...). –

9

Pour obtenir la résolution de l'écran, vous pouvez utiliser l'extension XRandR, comme dans xrandr sources:

SizeID  current_size; 
    XRRScreenSize *sizes; 
    dpy = XOpenDisplay (display_name); 
    // ... 
    root = RootWindow (dpy, screen); 
    sc = XRRGetScreenInfo (dpy, root); 
    current_size = XRRConfigCurrentConfiguration (sc, &current_rotation); 
    sizes = XRRConfigSizes(sc, &nsize); 
    for (i = 0; i < nsize; i++) { 
    printf ("%c%-2d %5d x %-5d (%4dmm x%4dmm)", 
     i == current_size ? '*' : ' ', 
     i, sizes[i].width, sizes[i].height, 
     sizes[i].mwidth, sizes[i].mheight); 
    // ... 
    } 

Vous pouvez voir la sortie en tapant "xrandr" dans votre xterm.

Ou, mieux, utiliser la méthode xdpyinfo:

Display *dpy; 
// dpy = ... 
int scr = /* ... */ 
printf (" dimensions: %dx%d pixels (%dx%d millimeters)\n", 
     DisplayWidth (dpy, scr), DisplayHeight (dpy, scr), 
     DisplayWidthMM(dpy, scr), DisplayHeightMM (dpy, scr)); 
+0

RandR est plus détaillé que DisplayWidth/DisplayHeight, mais les deux sont utiles (pour différentes raisons). – ephemient

+0

Pour autant que je sache, 'DisplayWidht' /' DisplayHeight' ne peut afficher que la taille de l'écran actuel. Ils ne sont pas destinés à lister toutes les tailles d'écran disponibles (modes d'affichage). C'est à ça que sont 'Xrandr' ou 'XF86vm'. – SasQ

+0

Question courte: Est-ce que le tableau 'sizes' renvoyé (en tant qu'adresse) à partir de' XRRConfigSizes' doit être libéré plus tard? Ou est-il attribué et géré en interne par la bibliothèque? Je n'ai rien trouvé à ce sujet dans la documentation (s'il y en a, au-delà de la page de manuel). – SasQ

Questions connexes