unity - bagaimana mendeteksi jika layar terkunci?

9

keduanya hanya berfungsi setelah layar yang dikunci dikosongkan; tetapi kadang-kadang gagal juga, ketika karena alasan apa layar tidak kosong ...

gnome-screensaver-command --query
gnome-screensaver-command --time

Saya mencoba qdbusjuga:

qdbus org.gnome.ScreenSaver /org/gnome/ScreenSaver org.gnome.ScreenSaver.GetActiveTime

tetapi sama-sama gagal.

Saya baru saja menemukan bahwa yang benar-benar mengunci layar adalah Unity!

qdbus com.canonical.Unity /com/canonical/Unity/Session com.canonical.Unity.Session.Lock

Pertanyaan terkait:
/unix/28181/run-script-on-screen-lock-unlock /unix/80143/how-to-create-a- daemon-yang-akan-mendengarkan-ke-dbus-dan-api-script-on-messa

Aquarius Power
sumber

Jawaban:

6

Jawaban Aquarius Power tampaknya bekerja cukup baik. Inilah beberapa tambahan yang mungkin saya buat untuk solusinya.

Hanya status kunci kueri

Jika Anda hanya perlu satu-liner untuk menanyakan status kunci, ini harus dinilai benar jika dikunci dan salah jika dibuka.

isLocked=$(gdbus call -e -d com.canonical.Unity -o /com/canonical/Unity/Session -m com.canonical.Unity.Session.IsLocked | grep -ioP "(true)|(false)")

Meminta status kunci dan melacak waktu sejak perubahan terakhir dalam status

Sekarang jika Anda perlu melacak berapa lama layar terkunci, Anda mungkin ingin mengambil pendekatan yang berbeda.

#!/bin/bash
# To implement this, you can put this at the top of a bash script or you can run
# it the subshell in a separate process and pull the functions into other scripts.

# We need a file to keep track of variable inside subshell the file will contain
# two elements, the state and timestamp of time changed, separated by a tab.
# A timestamp of 0 indicates that the state has not changed since we started
# polling for changes and therefore, the time lapsed in the current state is
# unknown.
vars="/tmp/lock-state"

# start watching the screen lock state
(
    # set the initial value for lock state
    [ "$(gdbus call -e -d com.canonical.Unity -o /com/canonical/Unity/Session -m com.canonical.Unity.Session.IsLocked | grep -ioP "(true)|(false)")" == "true" ] && state="locked" || state="unlocked"
    printf "%s\t%d" $state 0 > "$vars"

    # start watching changes in state
    gdbus monitor -e -d com.canonical.Unity -o /com/canonical/Unity/Session | while read line
    do 
        state=$(grep -ioP "((un)?locked)" <<< "$line")
        # If the line read denotes a change in state, save it to a file with timestamp for access outside this subshell
        [ "$state" != "" ] && printf "%s\t%d" ${state,,} $(date +%s)> "$vars"
    done
) & # don't wait for this subshell to finish

# Get the current state from the vars exported in the subshell
function getState {
    echo $(cut -f1 "$vars")
}

# Get the time in seconds that has passed since the state last changed
function getSecondsElapsed {
    if [ $(cut -f2 "$vars") -ne 0 ]; then
        echo $(($(date +%s)-$(cut -f2 "$vars")))
    else
        echo "unknown"
    fi
}

Pada dasarnya, skrip ini mengawasi perubahan dalam kondisi kunci layar. Ketika perubahan terjadi, waktu dan status dibuang ke file. Anda dapat membaca file ini secara manual jika Anda suka atau menggunakan fungsi yang saya tulis.

Jika Anda menginginkan cap waktu alih-alih jumlah detik, coba:

date -ud @$(getSecondsElapsed) | grep -oP "(\d{2}:){2}\d{2}"

Jangan lupa -usakelar yang memaksa program tanggal untuk mengabaikan zona waktu Anda.

b_laoshi
sumber
akhirnya bisa mengujinya, thx! Itulah mengapa saya suka tidak menerima jawaban saya sendiri ketika saya menjawab diri saya sendiri sehingga hal-hal yang lebih baik akan keluar nanti :)
Aquarius Power
1
Sebab grep -ioP "(true)|(false)", ini juga berfungsi:grep -oE "true|false"
wjandrea
5

layar sebenarnya dikunci oleh Unity, dan, kita perlu menggunakan gdbus

gdbus monitor -e -d com.canonical.Unity -o /com/canonical/Unity/Session

ini akan ditampilkan ketika terkunci seperti:

/com/canonical/Unity/Session: com.canonical.Unity.Session.LockRequested ()
/com/canonical/Unity/Session: com.canonical.Unity.Session.Locked ()
/com/canonical/Unity/Session: com.canonical.Unity.Session.UnlockRequested ()
/com/canonical/Unity/Session: com.canonical.Unity.Session.Unlocked ()
Aquarius Power
sumber
Saya tidak terlalu akrab, tetapi bagaimana melakukan ini tanpa pengawasan? seperti sekedar query'ing?
Noitidart
1
satu-satunya pilihan yang saya temukan adalah untuk tetap memantau (mungkin ada cara untuk hanya query, tapi saya tidak bisa menemukan walaupun saya mencoba), saya kira itu karena saat layar terkunci tidak disimpan di mana pun, sehingga monitor akan menjadi satu-satunya cara untuk menunjukkan kapan itu terjadi.
Aquarius Power
Maksud saya, coba juga, jika Anda menemukan, memberi tahu saya, atau menambahkan jawaban: D
Aquarius Power
Ah haha ​​ok sakit coba temukan itu aku tidak baik dengan linux aku seorang windows guy: P aku hanya coding beberapa hal lintas os sehingga mencari di internet.
Noitidart
1
@Noitidart askubuntu.com/a/890802/46437 :)
Aquarius Power
2

Saya punya pertanyaan serupa di sini

dan bantuan yang saya dapatkan mirip dengan apa yang dikatakan Aquarius Power sebelumnya, kecuali bahwa itu termasuk dalam daemon skrip bash, yang dapat berjalan di latar belakang .. Saya merasa sangat membantu. jadi, lihatlah Pertanyaan saya, dan jawab, dan lihat apakah ini juga membantu Anda.

Sverre
sumber