#1 Le 18/09/2021, à 11: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
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
Dernière modification par Hizoka (Le 18/09/2021, à 18:09)
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne
#2 Le 18/09/2021, à 16:26
- Zakhar
Re : [Résolu] Determiner la taille de l'écran de la console
Tout ça couplé avec les bureaux virtuels... bon courage.
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 !
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, à 16:43)
"A computer is like air conditioning: it becomes useless when you open windows." (Linus Torvald)
Hors ligne
#3 Le 18/09/2021, à 17: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
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
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, à 18:24)
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne
#4 Le 18/09/2021, à 18: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" ?
"A computer is like air conditioning: it becomes useless when you open windows." (Linus Torvald)
Hors ligne
#5 Le 18/09/2021, à 18: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é
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, à 14:00)
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne