เกิดอะไรขึ้น
สมมติฐานของคุณว่าไฟล์ที่ดาวน์โหลด "ที่ดิน" ในพื้นที่ "คนตาบอด" ถูกต้อง: คุณสามารถรับตำแหน่งไอคอนด้วยคำสั่ง:
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" จะอยู่ที่มุมล่างซ้ายเท่านั้น