NOT: Bu, i915 tahrikli grafik kartlı bir dizüstü bilgisayarda test edilmiştir.
Arka fon
NOT: Yeni bir ekran takıldığında, ana bilgisayara hiçbir olay gönderilmez, bu, son düzenlememden sonra bile geçerlidir. Yani tek yol yoklama kullanmak. Onları olabildiğince verimli kılmaya çalışıyorum ...
# 3 DÜZENLEME
Sonunda daha iyi bir çözüm var (ACPI aracılığıyla):
Hala bir olay yok, ancak ACPI sormaktan daha verimli görünüyor xrandr
. (Not: Bu , yüklü ACPI çekirdek modüllerini gerektirir , ancak kök ayrıcalıkları gerektirmez).
Son çözümüm (bash kullanarak):
isVgaConnected() {
local crtState
read -a < /proc/acpi/video/VID/CRT0/state crtState
test $(( ( ${crtState[1]} >>4 ) ${1:+*-1+1} )) -ne 0
}
Şimdi bir test:
$ if isVgaConnected; then echo yes; else echo no; fi
yes
Fişe takılı, bu yüzden şimdi fişini çekiyorum:
$ if isVgaConnected; then echo yes; else echo no; fi
no
NOT: ${1:+*-1+1}
Bir izin boolean argüman: Eğer bir şey mevcutsa , cevap ters olurdu: ( crtState >> 4 ) * -1 + 1
.
ve son senaryo:
#!/bin/bash
export crtProcEntry=/proc/acpi/video/VID/CRT0/state
isVgaConnected() {
local crtState
read -a < $crtProcEntry crtState
test $(( ( ${crtState[1]} >>4 ) ${1:+*-1+1} )) -ne 0
}
delay=.1
unset switch
isVgaConnected || switch=not
while :;do
while isVgaConnected $switch;do
sleep $delay
done
if [ "$switch" ];then
unset switch
echo VGA IS connected
# doing something while VGA is connected
else
switch=not
echo VGA is NOT connected.
# doing something else, maybe.
fi
done
UYARILAR: 0,02 saniyeden daha kısa bir gecikmeyle daha hafif xrandr
, ancak önemsiz değil , Bash komut dosyası kaynak yiyenlerin işleminin en üstüne gider ( )!top
Bu maliyet ~ 0,001 sn iken:
$ time read -a </proc/stat crtStat
Bu, ~ 0.030 sn gerektirir:
$ read -a < /proc/acpi/video/VID/CRT0/state crtState
Bu büyük! Yani ihtiyacınız olana bağlı olarak, ve delay
arasında makul bir şekilde ayarlanmış olabilir .0.5
2
# 2 DÜZENLEME
Sonunda bunu kullanarak bir şey buldum:
Önemli feragatname: Oynamak /proc
ve /sys
girişler sisteminizi bozabilir !!! Bu yüzden üretim sistemlerinde aşağıdakileri denemeyin.
mapfile watchFileList < <(
find /sys /proc -type f 2>/dev/null |
grep -i acpi\\\|i91
)
prompt=("/" "|" '\' '-');
l=0
while :; do
mapfile watchStat < <(
grep -H . ${watchFileList[@]} 2>/dev/null
)
for ((i=0;i<=${#watchStat[@]};i++)); do
[ "${watchStat[i]}" == "${oldStat[i]}" ] || echo ${watchStat[i]}
done
oldStat=("${watchStat[@]}")
sleep .5
printf "\r%s\r" ${prompt[l++]}
[ $l -eq 4 ]&&l=0
done
... istenmeyen meraklıları temizledikten sonra:
for ((i=0;i<=${#watchFileList[@]};i++)); do
[[ "${watchFileList[$i]}" =~ /sys/firmware/acpi/interrupts/sci ]] &&
unset watchFileList[$i] && echo $i
done
Bunu okuyabildim:
/proc/acpi/video/VID/CRT0/state:state: 0x1d
/proc/acpi/video/VID/CRT0/state:state: 0x0d
/proc/acpi/video/VID/CRT0/state:state: 0x1d
Monitör kablosunu taktığımda, fişten çekip çıkarın.
Orijinal cevap
Yapılandırma sorulduğunda (çalışıyor system/preferences/monitor
veya çalışıyor xrandr
), grafik kartları bir tür tarama yapar , bu nedenle çalıştırma xrandr -q
size bilgi verir, ancak durumu yoklamanız gerekir.
Tüm günlükleri taradım, (çekirdek, daemon, X vb.) /proc
& /sys
, Ve açıkça talebinizi karşılayacak hiçbir şey bulunmadığı görülüyor.
Bunu da denedim:
export spc50="$(printf "%50s" "")"
watch -n1 '
find /proc/acpi/video -type f |
xargs grep -H . |
sed "s/^\([^:]*):/\1'$spc50'}:/;
s/^\(.\{50\}\) *:/\1 /"'
Tüm bunlardan sonra, System/Preferences/Monitor
yeni bir ekran henüz takılı olmadığında ya da takılı olmadığında çalışırsanız , araç basitçe (normal olarak) görünecektir. Ancak, daha önce bir ekranı taktıysanız veya çıkardıysanız, zaman zaman bu aracı çalıştırırsınız ve masaüstünüzde bir tür sıfırlama veya yenileme işlemi görürsünüz (çalıştırırsanız aynı xrandr
).
Bu, bu aracın xrandr
çalıştırıldığı zamandan itibaren periyodik olarak oy kullanma durumunu istediğini (veya aynı şekilde çalıştığını) onaylıyor gibi görünüyor .
Kendin deneyebilirsin:
$ for ((i=10;i--;)); do xrandr -q | grep ' connected' | wc -l; sleep 1; done
1
1
1
2
2
2
1
1
1
1
Bu, 10 saniye boyunca kaç ekranın bağlandığını görüntüler.
Bu çalışırken, ekranınızı / monitörünüzü fişe takıp çıkarın ve neler olduğuna bakın. Böylece küçük bir Bash test fonksiyonu yaratabilirsiniz:
isVgaConnected() {
local xRandr=$(xrandr -q)
[ "$xRandr" == "${xRandr#*VGA1 con}" ] || return 0
return 1
}
hangi gibi kullanılabilir:
$ if isVgaConnected; then echo yes; fi
Ancak dikkatli olun, fişlerde herhangi bir değişiklik yapılmazken ve daha önce bir şey takıldığında ya da çıkarıldığında 0.700 saniyeye kadar sürebilirken , 0.240 saniye ilexrandr
yaklaşık 0.140 saniye sürer ( NOT: Bir kaynak yiyici gibi görünmüyor).
# 1 DÜZENLEME
Yanlış bir şey öğretmediğimden emin olmak için Web ve dokümanlar arasında arama yaptım ancak DBus ve Ekranlar hakkında hiçbir şey bulamadım .
Sonunda, iki farklı pencerede dbus-monitor --system
(seçeneklerle de oynuyorum) ve yazdığım küçük senaryoyu kullandım:
$ for ((i=1000;i--;)); do isVgaConnected && echo yes || echo no; sleep .5; done
... ve tekrar takılı, monitörün fişini çektikten çok defa. Şimdi söyleyebilirim ki:
- Bu yapılandırmada, i915 sürücüsünü kullanarak ,
xrandr -q
monitörün takılı olup olmadığını bilmek dışında koşmanın başka yolu yoktur .
Ancak dikkatli olun, çünkü başka yollar görünmüyor. Örneğin, xrandr
bu bilgi paylaşmak gibi görünüyor, bu yüzden benim GNOME masaüstü geçmek istiyorsunuz xinerama
otomatik ... Kaçtım zamanxrandr
.
Bazı dokümanlar