Stoper roboczy?

13

Czy istnieje program, który może służyć jako stoper zależny od obszaru roboczego? Chciałbym wiedzieć, ile czasu spędzam w każdym obszarze roboczym każdego dnia.

Edycja: Używam Unity.

Gazorpazorp
źródło
Czy korzystasz z Unity?
Jacob Vlijm
Z którego menedżera pulpitu korzystasz?
David Foerster
1
tak, używam Unity.
Gazorpazorp

Odpowiedzi:

11

Fajne pytanie!

Poniższy skrypt tworzy plik dziennika: ~/viewport_log.txtw katalogu domowym, w którym raportuje czas użycia rzutni bieżącej sesji (obszaru roboczego) na rzutnię.

Raport jest aktualizowany raz na dwie sekundy i wygląda następująco (w krótkim czasie):

workspace1 0:00:24
workspace2 0:00:05
workspace6 0:00:04
workspace8 0:00:05

w formacie

hours:minutse:seconds

Jak widać, użyłem tylko obszaru roboczego 1, 2, 6 i 8.

Jak używać

Skrypt korzysta z wmctrl -dpolecenia, aby uzyskać bieżące dane rzutni, więc musisz je najpierw zainstalować:

sudo apt-get install wmctrl

Następnie:

  1. Skopiuj poniższy skrypt do pustego pliku i zapisz go jako workspace_log.py
  2. Uruchom go testowo za pomocą polecenia:

    python3 /path/to/workspace_log.py

    Poruszaj się po różnych obszarach roboczych i otwórz plik, ~/viewport_log.txtaby zobaczyć wynik (alternatywnie uruchom w terminalu, cat ~/viewport_log.txtaby wygodnie czytać, ponieważ dziennik jest aktualizowany co sekundę).

  3. jeśli wszystko działa zgodnie z oczekiwaniami, dodaj polecenie do aplikacji startowych. Ponieważ najprawdopodobniej nastąpi awaria, jeśli skrypt zostanie uruchomiony zbyt wcześnie (zanim komputer zostanie w pełni załadowany), prawdopodobnie trzeba dodać małą przerwę w poleceniu uruchamiania, aby działało ono jako aplikacja startowa, więc polecenie to:

    /bin/bash -c "sleep 15&&python3 /path/to/workspace_log.py"

    Aby dodać go do aplikacji startowych: Dash> Aplikacje startowe> Dodaj i dodaj polecenie.

Scenariusz

import subprocess
import os
import time

# define / clear log file
home = os.environ["HOME"]
logfile = home+"/"+"viewport_log.txt"
open(logfile, "wt").write("")
vplist = []

def get_res():
    # get resolution
    xr = subprocess.check_output(["xrandr"]).decode("utf-8").split()
    pos = xr.index("current")
    return [int(xr[pos+1]), int(xr[pos+3].replace(",", "") )]

def get_dt():
    # get the current viewport
    res = get_res()
    vp_data = subprocess.check_output(["wmctrl", "-d"]).decode("utf-8").split()
    dt = [int(n) for n in vp_data[3].split("x")]
    cols = int(dt[0]/res[0])
    curr_vpdata = [int(n) for n in vp_data[5].split(",")]
    curr_col = int(curr_vpdata[0]/res[0])+1; curr_row = int(curr_vpdata[1]/res[1])
    return str(curr_col+curr_row*cols)

def time_format(s):
    # convert time format from seconds to h:m:s
    m, s = divmod(s, 60)
    h, m = divmod(m, 60)
    return "%d:%02d:%02d" % (h, m, s)

current_time1 = float(time.time())
curr_dt1 = get_dt()

while True:
    time.sleep(2)
    curr_dt2 = get_dt()
    if curr_dt2 == curr_dt1:
        current_time2 = float(time.time())
        span = current_time2-current_time1
        vp = "workspace "+curr_dt1+" . "*10
        vplist.sort(key=lambda x: x[0])
        if not vp in [v[0] for v in vplist]:
            vplist.append([vp, span])
        else: 
            index = vplist.index([vplist[i] for i in range(len(vplist)) if vplist[i][0] == vp][0])
            vplist[index][1] = float(vplist[index][1])+span
        with open(logfile, "wt") as out:
            for item in vplist:
                out.write(item[0]+" "+time_format(item[1])+"\n")
    current_time1 = current_time2
    curr_dt1 = curr_dt2

Właściwości skryptu

Skrypt oblicza dokładny przedział czasu między dwoma momentami. Icw używane przestrzenie robocze tych momentów (tak jak są to 2 sekundy, odstęp w linii time.sleep(2)), jeśli przestrzenie robocze w obu momentach są takie same, czas jest dodawany do sumy odpowiadającego obszaru roboczego czas użytkowania.

Jeśli obszary robocze w obu momentach są różne, jasne jest, że istniał przełącznik obszaru roboczego, a czas nie jest dodawany do czasu produktywności obszaru roboczego; czas w przeglądzie w ~/viewport_log.txtzaokrąglany jest zatem do dwóch sekund na okres na obszar roboczy.

Edytować

Uruchamiając powyższy skrypt w tle, możesz wyświetlić bieżące czasy użycia dla każdego obszaru roboczego, umieszczając poniższy skrypt w kombinacji klawiszy:

#!/bin/bash
lines="$( cat ~/viewport_log.txt )"
zenity --info --title='Usage per Viewport' --text="$lines"
  1. Skopiuj skrypt do pustego pliku i zapisz go jako view_vplog.sh
  2. Uruchom go, gdy pierwszy skrypt działa w tle , za pomocą polecenia:

    sh /path/to/view_vplog.sh
  3. Udostępnij go (po przetestowaniu) za pomocą kombinacji klawiszy skrótu: wybierz: Ustawienia systemu> „Klawiatura”> „Skróty”> „Skróty niestandardowe”. Kliknij „+” i dodaj polecenie do wybranej kombinacji klawiszy.

    wprowadź opis zdjęcia tutaj

Jacob Vlijm
źródło
1
@AB Dziękuję! Lubię tego rodzaju pytania :)
Jacob Vlijm
Łał! Pozytywne i zostanie zainstalowany jutro! (zbyt zmęczony, aby to zrobić teraz)
Fabby