เกิดอะไรขึ้น
สมมติฐานของคุณว่าไฟล์ที่ดาวน์โหลด "ที่ดิน" ในพื้นที่ "คนตาบอด" ถูกต้อง: คุณสามารถรับตำแหน่งไอคอนด้วยคำสั่ง:
gvfs-info <item>
สิ่งนี้จะส่งสัญญาณพิกัด64,1382
(x / y) ซึ่งทำให้ชัดเจนไอคอนอยู่ในตำแหน่งด้านล่างหน้าจอด้านซ้าย ( 1382
> 1080
)
นี่น่าจะเป็นผลลัพธ์ของบั๊ก
สคริปต์ด้านล่างนี้สามารถใช้เพื่อย้ายไฟล์ที่สร้างขึ้นใหม่บนเดสก์ท็อปเสมือนจริง (สแปน) จากพื้นที่หนึ่ง (เช่นส่วนที่มองไม่เห็น) ไปยังตำแหน่งอื่น (ในกรณีนี้: ส่วนที่มองเห็นได้)
คุณสมบัติของสคริปต์
แม้ว่าดูเหมือนว่าสคริปต์จะขยาย แต่ก็มีการเขียนในลักษณะที่หลีกเลี่ยงการกระทำและกิจวัตรที่ไม่จำเป็น หากไม่มีรายการใหม่ปรากฏขึ้นบนเดสก์ท็อปรายการนั้นจะตรวจสอบเฉพาะไฟล์ใหม่เท่านั้นทำให้ตัวประมวลผลไม่มีโหลดจริง
มันทำอะไร
- หนึ่งครั้งต่อวินาทีสคริปต์ตรวจสอบรายการใหม่ในโฟลเดอร์เดสก์ท็อป
- หากพบรายการใหม่รายการนั้นจะตรวจสอบตำแหน่งย้ายรายการเหล่านั้นไปยังพื้นที่ที่มองเห็นหากจำเป็น
อย่างไรก็ตามเดสก์ท็อปจะต้องมีการรีเฟรชหลังจากย้ายรายการซึ่งสามารถทำได้ก็ต่อเมื่อเดสก์ท็อปเป็น "โฟลเดอร์" ที่อยู่ด้านหน้าสุด สคริปต์จึงกำหนดที่จะrefresh
True
ในโอกาสแรกเดสก์ทอปอยู่ข้างหน้าสคริปต์:
วิธีใช้
สคริปต์ต้องการติดตั้งทั้ง xdotool และ wmctrl:
sudo apt-get install xdotool
sudo apt-get install wmctrl
xautomation
ควรมีอยู่ในระบบของคุณแล้ว แต่ในกรณีที่ไม่ใช่:
sudo apt-get install xautomation
แล้ว:
- คัดลอกสคริปต์ด้านล่างลงในไฟล์ว่างแล้วบันทึกเป็น blind_area.py
ในส่วนหัวของสคริปต์ตั้งขนาดหน้าจอด้านซ้ายของคุณ:
left_scr = [1920, 1080]
ตั้งค่าชื่อที่แปลสำหรับโฟลเดอร์เดสก์ท็อปของคุณ (อาจเป็นเพียง "เดสก์ท็อป" แต่ในภาษาดัตช์มันจะเป็น "Bureaublad" เป็นต้น)
- ตั้งความละเอียดของหน้าจอด้านซ้ายถ้ามันแตกต่างจากที่ฉันตั้งไว้
ทดสอบสคริปต์โดยใช้คำสั่ง:
python3 /path/to/blind_area.py
ฉันทดสอบด้วยการตั้งค่าขนาดแนวตั้งของหน้าจอเป็นครึ่งหนึ่งของขนาดจริงซึ่งย้ายไอคอนใหม่ (!) ทั้งหมดไปยัง 50% สูงสุดของหน้าจอของฉัน
- โปรดทราบว่าการดำเนินการย้ายจะสามารถมองเห็นได้เมื่อคุณคลิกเดสก์ท็อป (หรือให้เดสก์ท็อปอยู่ด้านหน้า)
หากใช้งานได้ดีให้เพิ่มลงในแอปพลิเคชันเริ่มต้นของคุณ: Dash> แอปพลิเคชันเริ่มต้น> เพิ่มคำสั่ง:
/bin/bash -c "sleep 15&&python3 /path/to/blind_area.py"
สคริปต์
#!/usr/bin/env python3
import subprocess
import os
import time
#--- set localized name of the Desktop folder below
desktop_name = "Desktop"
#--- set the resolution of the left screen below
left_scr = [1920, 1080]
#---
get = lambda cmd: subprocess.check_output(["/bin/bash", "-c", cmd]).decode("utf-8")
home = os.environ["HOME"]
dr = home+"/"+desktop_name
# used strings
val = " 'metadata::nautilus-icon-position' "
search = "gvfs-info -a"+val
set_val = "gvfs-set-attribute -t string "
refresh_cmd = "xte 'key F5'"
# function to check if desktop is in front
def check_frontmost():
try:
frontmost = str(hex(int(get("xdotool getwindowfocus").strip())))
frontmost = frontmost[:2]+"0"+frontmost[2:]
w_list = [l.split() for l in get("wmctrl -lG").splitlines()]
except subprocess.CalledProcessError:
return False
else:
check = len([l for l in w_list if all([str(space[0]) in l, frontmost in l, str(space[1]) in l])]) > 0
return check
# function to get the resolution
def get_res():
xr = get("xrandr").split(); pos = xr.index("current")
return [int(xr[pos+1]), int(xr[pos+3].replace(",", "") )]
dtfiles_1 = []
refresh = False
while True:
# check current files
time.sleep(1)
dtfiles_2 = os.listdir(dr)
# check for new files, move if necessary
newfiles = [f for f in dtfiles_2 if all([
not f in dtfiles_1,
not f.endswith("~"),
not f.startswith("."),
])]
if len(newfiles) != 0:
# check desktop size (only if new files appear)
space = get_res()
for f in newfiles:
fdir = os.path.join(dr, f); fdir = "'"+fdir+"'" if fdir.count(" ") != 0 else fdir
try:
loc = [int(n) for n in eval(get(search+fdir).split()[-1:][0])]
except:
pass
else:
if all([loc[0] < left_scr[0], loc[1] > left_scr[1]]):
command = set_val+fdir+" "+val+str(loc[0])+","+str(loc[1]-left_scr[1])
subprocess.Popen(["/bin/bash", "-c", command])
refresh = True
if all([refresh == True, check_frontmost() == True]):
subprocess.Popen(["/bin/bash", "-c", refresh_cmd])
refresh = False
dtfiles_1 = dtfiles_2
หมายเหตุ
- แม้ว่าฉันจะทำการทดสอบเป็นเวลานานในระบบของฉัน แต่ข้อผิดพลาดไม่ปรากฏในระบบของฉันดังนั้นคุณสามารถทำการทดสอบ "ของจริง" ได้เท่านั้น :)
- หากเดสก์ท็อปมีจำนวนมากหากมีรายการอยู่จริงการดำเนินการรีเฟรชอาจจัดเรียงไอคอนในพื้นที่ "ต้องห้าม" ฉันไม่สามารถทดสอบได้ แต่ถ้าเป็นเช่นนั้นในสถานการณ์ของคุณด้วยเหตุผลเดียวกับข้างต้น
- สคริปต์เหมือนเดิมถือว่าหน้าจอมีการจัดตำแหน่งสูงสุดดังนั้นพื้นที่ "blind" จะอยู่ที่มุมล่างซ้ายเท่านั้น