اجرای دستور پس از یک دوره مشخص بدون فعالیت

امین 16 سپتامبر 2023 زمان خواندن: 2 دقیقه

توجه: این مطلب قدیمی است و صرفا جهت آرشیو حفظ شده است. ممکن است امروزه برخی موارد یکسان نباشند.

ممکنه براتون پیش بیاد که بخواید وقتی مثلا به مدت سه دقیقه از کامپیوترتون استفاده نکردید یک اتفاقی بیفته. مثلا من همیشه یادم میره کلید Numlock رو خاموش کنم، و از اونجایی که در کیبورد من عدد 1 در حالت Numlock خاموش مساوی است با End این موضوع خیلی روی اعصابه، و هر وقت که میزنم End تایپ میکنه 1. بنابراین میام به سیستم میگم هر وقت به مدت ۵ ثانیه کسی بهت دست نزد numlock رو خاموش کن. خیلی کارها میشه با این اسکریپت کرد...

البته این مسلزم اینه که از xorg برای رابط گرافیکی دسکتاپ استفاده کرده باشید و نه wayland 😞

اول از همه پیش نیاز های این اسکریپت رو نصب میکنیم. در توزیع خودتون اینها رو باید نصب کنید: sdotool , xprintidle , wmctrl و بعد اسکریپتی که در انتهای مطلب اومده رو در یک فایل با پسوند py ذخیره میکنیم و مجوز اجرایی به این اسکریپت میدیم.

برای خاموش کردن numlock هم از numlockx استفاده میکنیم که با off خاموش و با on روشن میکنه. مثلا numlockx off

برای استفاده از این اسکریپت به صورت زیر عمل میکنیم:

python3 /pat/to/idle.py 5 "numlockx off"

دستور بالا (باید مکان اسکریپت و نام اون رو طبق چیزی که میخواید تغییر بدید) پس از اجرا شدن (که ما اون رو در کرون میذاریم تا موقع استارتاپ اجرا بشه) پس از ۵ ثانیه استفاده نکردن از سیستم کلید numlock رو خاموش میکنه. شما به جای متغیر زمان و دستور میتونید هر چیز دیگه ای رو بذارید.

#!/usr/bin/env python3
import subprocess
import time
import sys
idletime = int(sys.argv[1])
command = sys.argv[2]
get = lambda cmd: subprocess.check_output(cmd).decode("utf-8").strip()
def get_res():
  xr = [s for s in get(["xrandr"]).split() \
        if "+0+0" in s][0].split("x"); xr[1] = xr[1].split("+")[0]
  return xr
res = get_res()
def check():
  front = [l for l in get(["xprop", "-root"]).splitlines() \
           if "_NET_ACTIVE_WINDOW(WINDOW):" in l][0].split("#")[-1].strip()
  front = front[:2]+(10-len(front))*"0"+front[2:]
  try:
      wdata = subprocess.check_output(
          ["wmctrl", "-lG"]
          ).decode("utf-8").splitlines()
      match = [l for l in wdata if front in l][0].split()[4:6]
      if match == res:
          return True
      else:
          return False
  except subprocess.CalledProcessError:
      pass
minus = 0; real_idle = 0; t1 = 0; due_1 = False
while True:
  time.sleep(1)
  fscreen = check()
  t2 = int(int(get(["xprintidle"]))/1000)
  if t2 < t1:
      minus = 0; real_idle = 0
  else:
      if fscreen == True:
          minus = t2
  real_idle = t2 - minus
  due_2 = [real_idle > idletime][0]
  if all([real_idle > idletime, due_1 != due_2]):
      subprocess.Popen(["/bin/bash", "-c", command])
  due_1 = due_2
  t1 = t2

اولین نفری باشید که دیدگاهی ارسال می کند!




حاصل سر و کله زدن های من با لینوکس