ไม่ใช่สิ่งที่คุณขออย่างแท้จริงแต่อย่างน้อยโซลูชันที่เทียบเคียงได้อย่างมีประสิทธิภาพจะวางสคริปต์ด้านล่างไว้ใต้คีย์ลัด
มันทำอะไร
เมื่อใช้คีย์ลัด:
แล้ว:
- หากผู้ใช้กดEnterระบบจะปิด
- หากผู้ใช้ไม่ทำอะไรเลยระบบจะรอเป็นเวลา 30 วินาที (หรือช่วงเวลาอื่นที่คุณต้องการตั้งค่า) และปิดตัวลง
- หากผู้ใช้เลื่อนเมาส์ระหว่าง 30 วินาทีขั้นตอนจะหยุด
บท
#!/usr/bin/env python3
import subprocess
import time
#--- set the location of the close button x, y
q_loc = [1050, 525]
#--- set the time to wait before shutdown
countdown = 30
subprocess.Popen(["gnome-session-quit", "--power-off"])
# for slower systems, set a longer break, on faster systems, can be shorter:
time.sleep(0.4)
subprocess.Popen(["xdotool", "mousemove", str(q_loc[0]), str(q_loc[1])])
coords1 = q_loc
t = 0
while True:
time.sleep(1)
cmd = "xdotool", "getmouselocation"
currloc = subprocess.check_output(cmd).decode("utf-8").split()[:2]
coords2 = [int(n.split(":")[1]) for n in currloc]
if coords2 != coords1:
break
else:
if t >= countdown:
subprocess.Popen(["xdotool", "key", "KP_Enter"])
break
t += 1
วิธีใช้
ฉันค่อนข้างแน่ใจว่าคุณรู้วิธีการใช้งาน แต่ที่นี่เราไปด้วยเหตุผล habbit:
สคริปต์ใช้ xdotool
sudo apt-get install xdotool
คัดลอกสคริปต์ไปยังไฟล์เปล่าบันทึกเป็น run_close.py
ในส่วนหัวให้ตั้งตำแหน่งของหน้าจอของปุ่มปิดเครื่องในหน้าต่างปิด (เดาแรกของฉันถูกต้อง):
#--- set the location of the close button x, y
q_loc = [1050, 525]
และเวลาที่จะรอก่อนที่จะปิดตัวลงโดยไม่ตั้งใจ:
#--- set the time to wait before shutdown
countdown = 30
ทดสอบเรียกใช้โดยคำสั่ง:
python3 /path/to/run_close.py
ทดสอบด้วยตัวเลือกทั้งหมด: กดEnterเพื่อปิดเครื่องทันทีปิดเครื่องโดยไม่ต้องใส่เครื่องและทำตามขั้นตอนโดยเลื่อนเม้าส์
หากใช้งานได้ดีให้เพิ่มลงในคีย์ลัด: เลือก: การตั้งค่าระบบ> "คีย์บอร์ด"> "ทางลัด"> "ทางลัดที่กำหนดเอง" คลิกที่ "+" และเพิ่มคำสั่ง:
python3 /path/to/run_close.py
แก้ไข
ด้านล่างเป็นเวอร์ชันของสคริปต์ที่ไม่ต้องการการตั้งค่าเพิ่มเติมใด ๆ มันจะคำนวณพิกัดของปุ่มออกไม่ว่าอะไรจะเป็นความละเอียดของหน้าจอ
การตั้งค่าค่อนข้างเหมือนกัน แต่[3.]
สามารถข้ามได้
#!/usr/bin/env python3
import subprocess
import time
#--- set the time to wait before shutdown
countdown = 30
def get_qloc():
xr = subprocess.check_output(["xrandr"]).decode("utf-8").split()
scrs = [s.split("+") for s in xr if all([s.count("x") == 1, s.count("+") == 2])]
center = [int(int(s)/2) for s in [scr[0] for scr in scrs if scr[1] == "0"][0].split("x")]
return [center[0] + 250, center[1]]
q_loc = get_qloc()
subprocess.Popen(["gnome-session-quit", "--power-off"])
# for slower systems, set a longer break, on faster systems, can be shorter:
time.sleep(0.4)
subprocess.Popen(["xdotool", "mousemove", str(q_loc[0]), str(q_loc[1])])
coords1 = q_loc
t = 0
while True:
time.sleep(1)
cmd = "xdotool", "getmouselocation"
currloc = subprocess.check_output(cmd).decode("utf-8").split()[:2]
coords2 = [int(n.split(":")[1]) for n in currloc]
if coords2 != coords1:
break
else:
if t >= countdown:
subprocess.Popen(["xdotool", "key", "KP_Enter"])
break
t += 1
คำอธิบาย
ขนาดของหน้าต่างตัวจัดการเซสชันเพื่อปิดระบบจะอยู่กึ่งกลางเสมอและมีขนาดคงที่ (แน่นอน) ขึ้นอยู่กับความละเอียดของหน้าจอ ดังนั้นตำแหน่งที่สัมพันธ์กับศูนย์กลางของหน้าจอเป็นปัจจัยคงที่
สิ่งที่เราต้องทำก็คืออ่านความละเอียดของหน้าจอและคำนวณตำแหน่งของปุ่มจากตรงนั้น
ฟังก์ชั่นที่ใช้ ( get_qloc()
) คำนวณความละเอียดของหน้าจอด้านซ้ายเนื่องจากเป็นฟังก์ชั่นการสนทนาที่ปรากฏขึ้น
บันทึก
เวลาที่ตั้งไว้ในสายtime.sleep(0.4)
ถูกตั้งค่าไว้สำหรับระบบที่ค่อนข้างช้าเพื่อให้แน่ใจว่าเมาส์จะถูกย้ายหลังจากหน้าต่างปิดการทำงานปรากฏขึ้น สำหรับระบบที่เร็วกว่านั้นสามารถสั้นลงได้บนระบบที่ช้ากว่า (เช่น VM) ซึ่งอาจจำเป็นต้องตั้งค่าให้นานขึ้น