Doar pentru distracție, din moment ce ești pe X
Folosind python (sau o grămadă de alte limbi) Putem folosi semnale de la Wnck.Ecran și Wnck.Fereastră pentru a fi cu ochii pe crearea și/sau schimbarea stării ferestrelor. Aceasta include maximizarea și minimizarea ferestrelor.
Exact asta face scenariul de mai jos. Ulterior, menține un fișier jurnal, care va fi actualizat dacă creați, minimizați sau deminimizați o fereastră a unei anumite WM_CLASS (și așadar aplicație). Puteți găsi WMCLASS al aplicației vizate prin deschiderea unui terminal, tastați xprop WM_CLASS
+ Întoarcere, apoi faceți clic pe subiectul ferestrei ("telegramdesktop" pentru telegramă sau ceva de genul acesta).
Rețineți că am făcut ca scriptul să resetați fișierul jurnal după fiecare sesiune (de înregistrare), altfel fișierul jurnal ar deveni uriaș în timp.
Ce este în fișierul jurnal?
Fișierul jurnal (~/.windowlog.txt
) va ține evidența creării, închiderii și schimbării stării ferestrelor/ferestrelor WM_Class date. De fiecare dată când fereastra este neminimizată, contorul adaugă una, astfel încât la sfârșitul zilei, puteți vedea activitatea:
fereastra găsită: Telegramă
starea schimbată: vizuală(1)
stare schimbată: minimizat
starea schimbată: vizuală(2)
stare schimbată: minimizat
starea schimbată: vizual (3)
fereastra închisă: Telegramă
fereastră nouă: Telegram
starea schimbată: vizuală(4)
stare schimbată: minimizat
starea schimbată: vizual (5)
Notă că scriptul este scris cu o singură fereastră pentru aplicație, ca cea din întrebarea dvs. Pentru a păstra o evidență mai detaliată pe fereastră, prelucrarea datelor ar necesita o codificare mai sofisticată.
Scenariul
#!/usr/bin/env python3
import gi
gi.require_version(„Gtk”, „3.0”)
gi.require_version ("Wnck", "3.0")
din gi.repository import Gtk, Wnck
import os
import sys
clasa WatchWindow:
def __init__(self, wmclass):
self.visual = Nici unul
self.count_visual = 0
self.wnck_scr = Wnck.Screen.get_default()
self.wmclass = wmclass
self.logpath = os.environ["HOME"] + "/.windowlog.txt"
self.run_watching()
Gtk.main()
def write_to_log(self, newline):
cu open(self.logpath, "a+") ca fișier jurnal:
logfile.write(linie nouă + „\n”)
def readable_state(self, minimized):
n = ""
dacă nu este minimizat:
self.count_visual = self.count_visual + 1
n = "(" + str(self.count_visual) + ")"
return [„minimizat”, „vizual”][[Adevărat, Fals].index(minimizat)] + n
def logstate(self, window, *args):
vechi_state = self.visual
stare_nouă = window.is_minimized()
# înregistrează-te numai dacă starea minimizată s-a schimbat cu adevărat
if old_state != new_state:
self.visual = new_state
mesaj = "starea schimbată: " + self.readable_state(self.visual) # log
imprimare (mesaj)
self.write_to_log(mesaj)
def log_new(self, screen, window):
dacă window.get_class_group_name().lower() == self.wmclass:
mesaj = "fereastră nouă:" + window.get_name() # log new
imprimare (mesaj)
self.write_to_log(mesaj)
self.watch_window(fereastra)
self.logstate(fereastră)
def log_closed(self, screen, window):
dacă window.get_class_group_name().lower() == self.wmclass:
nume = window.get_name()
self.visual = Nici unul
print("fereastra închisă:", nume) # jurnal închis
def watch_window(self, window, firstcall=False):
dacă window.get_class_group_name().lower() == self.wmclass:
dacă primul apel:
mesaj = „fereastra găsită:” + window.get_name()
print(mesaj) # log vă rog
self.write_to_log("fereastra găsită: " + window.get_name())
self.logstate(fereastră)
window.connect("state_changed", self.logstate)
def run_watching(self):
încerca:
os.remove(self.logpath)
cu excepția FileNotFoundError:
trece
self.wnck_scr.force_update()
pentru w în self.wnck_scr.get_windows():
self.watch_window(w, True)
self.wnck_scr.connect(„fereastra deschisă”, self.log_new)
self.wnck_scr.connect(„fereastra închisă”, self.log_closed)
args = sys.argv[1:]
daca nu args:
print("Argumente insuficiente! Avem nevoie de un wm_class pentru a urmări...")
altceva:
WatchWindow(args[0])
Înființat
Copiați scriptul într-un fișier gol, salvați-l ca windowlogger.py
și face-l executabil
Testați-l rulați într-o fereastră de terminal, rulați-l cu WM_CLASS ca argument (presupun telegramdesktop
), asa de:
/cale/la/windowlogger telegramdesktop
Vedeți dacă rezultatul din terminal este în regulă, vedeți în interiorul fișierului jurnal ~/.windowlog.txt
dacă totul funcționează așa cum ar trebui.
Adăugați-l la aplicațiile dvs. de pornire, dacă doriți.
N.B
Posibil, trebuie să adăugați una sau mai multe biblioteci, verificați ieșirea terminalului.
Fereastra de înregistrare este activă?
Dintr-un comentariu, înțeleg că considerați fereastra ca „folosită” (doar) dacă este fereastra activă.
În acest caz, putem face scriptul substanțial mai simplu, deoarece noi numai trebuie să te uiți la fereastră_activă_schimbată
semnal. Dacă înregistrăm și utilizarea timpului (pe utilizare / timpul total de utilizare), puteți obține o perspectivă clară cât timp ați petrecut, uitându-vă la (orice) fereastră de telegramă. Fișierul jurnal arată astfel:
start_time: woensdag, 06 octombrie 2021, 11:32:53
fereastra activata (1)
fereastra ascunsă sau închisă, a fost activă: 0:00:04 total: 0:00:04
fereastra activata (2)
fereastra ascunsă sau închisă, a fost activă: 0:00:06 total: 0:00:10
fereastra activata (3)
fereastra ascunsă sau închisă, a fost activă: 0:00:12 total: 0:00:22
fereastra activata (4)
fereastra ascunsă sau închisă, a fost activă: 0:00:07 total: 0:00:29
Scriptul în acest caz:
#!/usr/bin/env python3
import gi
gi.require_version(„Gtk”, „3.0”)
gi.require_version ("Wnck", "3.0")
din gi.repository import Gtk, Wnck
import os
import sys
timpul de import
import datetime
clasa WatchWindow:
def __init__(self, wmclass):
self.visual = Fals
self.count_visual = 1
self.wnck_scr = Wnck.Screen.get_default()
self.wmclass = wmclass
self.logpath = os.environ["HOME"] + "/.windowlog.txt"
self.total_time = 0
self.last_time = time.time()
self.run_watching()
Gtk.main()
def write_to_log(self, newline):
cu open(self.logpath, "a+") ca fișier jurnal:
logfile.write(linie nouă + „\n”)
def get_readable_time(self, elapsed):
returnează str(datetime.timedelta(secunde=elapsed))
def log_active(self, *args):
încerca:
# active_class poate fi None, de ex. la inceput
active_class = self.wnck_scr.get_active_window().get_class_group_name()
cu excepția AttributeError:
active_class = ""
newvisual = active_class.lower() == self.wmclass.lower()
oldvisual = self.visual
currtime = timp.timp()
if newvisual != oldvisual:
dacă newvisual:
self.last_time = currtime
mesaj = "fereastra activată (" + str(self.count_visual) + ")"
self.count_visual = self.count_visual + 1
altceva:
winactive_time = currtime - self.last_time
self.last_time = currtime
self.total_time = self.total_time + winactive_time
mesaj = „fereastra ascunsă sau închisă, a fost activă: „ + \
self.get_readable_time(round(winactive_time)) +\
"\t" + "total: " +\
self.get_readable_time(round(self.total_time))
self.write_to_log(mesaj)
self.visual = newvisual
def run_watching(self):
încerca:
os.remove(self.logpath)
cu excepția FileNotFoundError:
trece
time_stamp_message = "start_time: " + time.strftime ("%A, %B %d %Y, %H:%M:%S")
self.write_to_log(time_stamp_message)
self.wnck_scr.force_update()
self.wnck_scr.connect ("activ-window-schimbat", self.log_active)
self.log_active()
args = sys.argv[1:]
daca nu args:
print("Argumente insuficiente! Avem nevoie de un wm_class pentru a urmări...")
altceva:
WatchWindow(args[0])
Configurarea este aceeași.