Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 18/09/2021, à 12:25

Hizoka

[Résolu] Determiner la taille de l'écran de la console

Bonjour,

j'aurais besoin de déterminer la taille de l’écran ou se trouve ma console.

Je parle bien de l'écran actif, pas de la résolution du bureau.

Dans mon cas, j'ai 2 écrans qui se suivent avec un petit décalage en hauteur.

1920*1080  et  1920*1080  =>  3840x1164

Je voudrais pouvoir déterminer que ma résolution fait 1920*1080 sur l’écran actuel.

Évidemment, là c'est facile, ma résolution est la même sur les 2 écrans smile
Mais le but est de toujours trouver la résolution de l'écran actuel.


inxi : Impossible de déterminer l'écran de la console :

inxi -G
Graphics:  Device-1: NVIDIA GM204 [GeForce GTX 970] driver: nvidia v: 460.91.03 
           Display: x11 server: X.Org 1.20.11 driver: nvidia unloaded: fbdev,modesetting,nouveau,vesa 
           resolution: 1920x1080~60Hz, 1920x1080~60Hz 
           OpenGL: renderer: GeForce GTX 970/PCIe/SSE2 v: 4.6.0 NVIDIA 460.91.03

xdpyinfo : Renvoie la résolution du bureau, pas des écrans :

xdpyinfo | grep 'dimensions:'
  dimensions:    3840x1164 pixels (1038x314 millimeters)

xrandr : Ne me précise pas l'écran actuellement utilisé :

xrandr
Screen 0: minimum 8 x 8, current 3840 x 1164, maximum 16384 x 16384
DVI-I-0 disconnected (normal left inverted right x axis y axis)
DVI-I-1 connected primary 1920x1080+0+0 (normal left inverted right x axis y axis) 521mm x 293mm
   1920x1080     60.00*+
   1680x1050     59.95  
   1440x900      74.98    59.89  
   1280x1024     75.02    60.02  
   1280x960      60.00  
   1152x864      75.00  
   1024x768      75.03    70.07    60.00  
   800x600       75.00    72.19    60.32    56.25  
   640x480       75.00    72.81    59.94  
HDMI-0 connected 1920x1080+1920+84 (normal left inverted right x axis y axis) 160mm x 90mm
   1920x1080     60.00*+  59.94    50.00    29.97    25.00    23.98    60.05    60.00    50.04  
   1280x720      60.00    59.94    50.00  
   720x576       50.00  
   720x480       59.94  
   640x480       59.94  
DP-0 disconnected (normal left inverted right x axis y axis)
DP-1 disconnected (normal left inverted right x axis y axis)
DVI-D-0 disconnected (normal left inverted right x axis y axis)

Une idée de comment faire ?

Merci beaucoup smile

Dernière modification par Hizoka (Le 18/09/2021, à 19:09)


KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github

Hors ligne

#2 Le 18/09/2021, à 17:26

Zakhar

Re : [Résolu] Determiner la taille de l'écran de la console

Tout ça couplé avec les bureaux virtuels... bon courage. big_smile

Il y a sans doute moyen de voir à quel "display" est attaché une fenêtre du D.E. (Desktop Environment).

Sur Stack Overflow je trouve ça :  https://stackoverflow.com/questions/156 … le-windows

Liste des fenêtres visibles :

$ xprop -root | grep '_NET_CLIENT_LIST_STACKING(WINDOW)'
_NET_CLIENT_LIST_STACKING(WINDOW): window id # 0x2800010, 0x260002c, 0x2e0000a

J'ai actuellement 3 fenêtres ouvertes, Thunderbird, Firefox et le Terminal, d'où les 3 identifiants trouvés.

La dernière me donne :

$ xprop -id 0x2e0000a | grep WM_CLASS
WM_CLASS(STRING) = "gnome-terminal-server", "Gnome-terminal"

xprop donne tout plein d'informations sur la fenêtre ouverte, il y bien probablement le display physique... mais comme je n'ai qu'un écran je te laisse creuser la piste ! cool

Par exemple, petit "one liner" pour afficher ce qui est visible comme fenêtres ouvertes :

$ for id in $( xprop -root | sed -n '/_NET_CLIENT_LIST_STACKING(WINDOW)/s/.*#//p' ); do xprop -id $id | grep WM_CLASS; done
WM_CLASS(STRING) = "Mail", "Thunderbird"
WM_CLASS(STRING) = "Navigator", "Firefox"
WM_CLASS(STRING) = "gnome-terminal-server", "Gnome-terminal"

Et avec un peu plus de trucs ouverts !

$ for id in $( xprop -root | sed -n '/_NET_CLIENT_LIST_STACKING(WINDOW)/s/.*#//p' ); do xprop -id $id | grep WM_CLASS; done
WM_CLASS(STRING) = "Mail", "Thunderbird"
WM_CLASS(STRING) = "Navigator", "Firefox"
WM_CLASS(STRING) = "org.gnome.Nautilus", "Org.gnome.Nautilus"
WM_CLASS(STRING) = "gnome-control-center", "Gnome-control-center"
WM_CLASS(STRING) = "gnome-calculator", "Gnome-calculator"
WM_CLASS(STRING) = "gnome-terminal-server", "Gnome-terminal"

Dernière modification par Zakhar (Le 18/09/2021, à 17:43)


"A computer is like air conditioning: it becomes useless when you open windows." (Linus Torvald)

Hors ligne

#3 Le 18/09/2021, à 18:51

Hizoka

Re : [Résolu] Determiner la taille de l'écran de la console

Merci pour cette proposition.

Je ne connaissais pas xprop qui est intéressant, malheureusement, aucun info sur l'écran actuel...

xwininfo est pas mal aussi, ça donne la géométrie de la fenêtre.

Pour le moment, je fais ça :

xrandr --listactivemonitors | sed -rn "s@.* ([0-9]*)/.*@\1@p" | sort -r | head -n 1

Ca me permet de ressortir la plus petite résolution d'écran actif...
Mais ce n'est pas tout à fait ce que je veux...

Et je suis en train de me dire ceci :
xrandr
- DVI-I-1 connected primary 1920x1080+0+0 (normal left inverted right x axis y axis) 521mm x 293mm
- HDMI-0 connected 1920x1080+1920+84 (normal left inverted right x axis y axis) 160mm x 90mm

xwininfo
- Absolute upper-left X:  1086
- Absolute upper-left Y:  277

1086 < 1920
277 < 1080
=> Je suis sur le 1er écran

xwininfo
  Absolute upper-left X:  2108
  Absolute upper-left Y:  213

2108 < 1920+1920 (le décalage)
213 < 1080
=> Sur le 2eme écran


Il reste plus qu'à pondre un truc smile

EDIT :

Fenetre=$(xwininfo -id 0x400006 -frame | sed -rn "/-geometry/ s/.*\+([0-9]+)\+([0-9]+).*/\1+\2/p")

while read Ecran
do
    [[ ${Ecran} =~ ([0-9]+)/([0-9]+)x([0-9]+)/([0-9]+)\+([0-9]+)\+([0-9]+) ]] || continue
    
    x=$(( ${BASH_REMATCH["1"]} + ${BASH_REMATCH["5"]} ))
    y=$(( ${BASH_REMATCH["3"]} + ${BASH_REMATCH["6"]} ))
    
    if (( ${Fenetre%+*} < $x && ${Fenetre#*+} < $y ))
    then
        echo "${Fenetre%+*} < $x && ${Fenetre#*+} < $y"
        echo "La fenetre est sur l'écran $Ecran"
        echo "La resolution max de l'ecran est ${BASH_REMATCH["1"]}x${BASH_REMATCH["3"]}"        
        break
    fi
done < <(xrandr --listactivemonitors)

# 2034 < 3840 && 229 < 1164
# La fenetre est sur l'écran 1: +HDMI-0 1920/160x1080/90+1920+84  HDMI-0
# La resolution max de l'ecran est 1920x1080

Ca parait pas mal, dommage que xrandr prenne 0.5s smile

On gagne 0.2 à 0.3 seconde avec :

Window=$(xwininfo -id 0x400006 -frame | sed -rn "/-geometry/ s/.*\+([0-9]+)\+([0-9]+).*/\1+\2/p")

while read Screen
do
    # Si la ligne n'affiche pas : ... connected ... 1920x1080+1920+84, on la zappe
    [[ ${Screen} =~ connected\ ([0-9]+)x([0-9]+)\+([0-9]+)\+([0-9]+) ]] || continue

    # Calcul de l'emplacement de l'écran
    ScreenX=$(( ${BASH_REMATCH["1"]} + ${BASH_REMATCH["3"]} ))
    ScreenY=$(( ${BASH_REMATCH["2"]} + ${BASH_REMATCH["4"]} ))
    
    # Si la fenêtre se situe dans l'écran
    if (( ${Window%+*} < ${ScreenX} && ${Window#*+} < ${ScreenY} ))
    then
        echo "${BASH_REMATCH["1"]}x${BASH_REMATCH["2"]}"        
        break
    fi
done < <(xrandr)

Dernière modification par Hizoka (Le 18/09/2021, à 19:24)


KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github

Hors ligne

#4 Le 18/09/2021, à 19:17

Zakhar

Re : [Résolu] Determiner la taille de l'écran de la console

Après comme tu as deux moniteurs la notion de "je suis sur tel écran" est variable quand une fenêtre est "à cheval" !..

Tu peux effectivement regarder le coin en haut à gauche, mais si tu mets le terminal "à cheval" avec juste la partie gauche qui déborde sur l'écran de gauche... est-ce que tu considères que c'est "à gauche" ? lol


"A computer is like air conditioning: it becomes useless when you open windows." (Linus Torvald)

Hors ligne

#5 Le 18/09/2021, à 19:25

Hizoka

Re : [Résolu] Determiner la taille de l'écran de la console

Après comme tu as deux moniteurs la notion de "je suis sur tel écran" est variable quand une fenêtre est "à cheval" !..

Tu peux effectivement regarder le coin en haut à gauche, mais si tu mets le terminal "à cheval" avec juste la partie gauche qui déborde sur l'écran de gauche... est-ce que tu considères que c'est "à gauche" ?

En effet mais là, je m'en fiche, faut assumer à un moment donné lol
Je me base sur le pixel en haut à gauche.

Version Finale :

    WinIdList="$(xprop -root _NET_CLIENT_LIST_STACKING)"
    WinIdList="${WinIdList#*# }"
    WinIdList="${WinIdList//,}"

    for WinId in ${WinIdList}
    do
        # Si ce n'est pas pas une fenêtre dolphin
        [[ $(xprop -id ${WinId} WM_CLASS) != *\"dolphin\"* ]] && continue

        # Résolution de la fenêtre
        Window=$(xwininfo -id ${WinId} -frame | sed -rn "/Corners:/ s@[^+]*\+([0-9-]*)\+([0-9-]*).*@\1+\2@p")

        while read Screen
        do
            # Si la ligne n'affiche pas : ... connected ... 1920x1080+1920+84, on la zappe
            [[ ${Screen} =~ connected\ ([0-9]+)x([0-9]+)\+([0-9]+)\+([0-9]+) ]] || continue

            # Calcul de l'emplacement de l'écran
            ScreenX=$(( ${BASH_REMATCH["1"]} + ${BASH_REMATCH["3"]} ))
            ScreenY=$(( ${BASH_REMATCH["2"]} + ${BASH_REMATCH["4"]} ))

            # Si la fenêtre se situe dans l'écran
            if (( ${Window%+*} < ${ScreenX} && ${Window#*+} < ${ScreenY} ))
            then
                echo "${BASH_REMATCH["1"]}x${BASH_REMATCH["2"]}"
                break 2
            fi
        done < <(xrandr)
    done

EDIT : Mise à jour du code :

Window=$(xwininfo -id ${WinId} -frame | sed -rn "/Corners:/ s@[^+]*\+([0-9-]*)\+([0-9-]*).*@\1+\2@p")

Dernière modification par Hizoka (Le 21/09/2021, à 15:00)


KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github

Hors ligne