เปิดหน้าต่างแอปพลิเคชันบนหน้าจอเดียวกับที่เปิดตัว


8

ฉันใช้การตั้งค่าหน้าจอคู่ Ubuntu 14.10 / Unity แต่ละหน้าจอมีตัวเรียกใช้งาน / Dash ของตัวเอง แอปพลิเคชั่นเริ่มต้นเช่น Firefox, หอยโข่ง, เทอร์มินัล & ธันเดอร์เบิร์ดจะปรากฏบนหน้าจอที่ฉันใช้ตัวเรียกใช้งาน ดังนั้น .. เมื่อฉันใช้ตัวเรียกใช้งานสำหรับ Firefox บนหน้าจอด้านขวาเบราว์เซอร์จะเปิดขึ้นที่หน้าจอด้านขวา อย่างที่ควรจะเป็น

ฉันต้องการพฤติกรรมนั้นกับแอปพลิเคชันอื่นเช่น Google Chrome ฉันไม่สามารถหาทางออกที่เหมาะสมได้

คำตอบ:


5

การเปลี่ยนเส้นทางคำสั่งเพื่อเรียกใช้แอปพลิเคชัน

แอปพลิเคชันส่วนใหญ่เปิดหน้าต่างของพวกเขาบนหน้าจอที่พวกเขาเริ่มต้นจาก (ทั้งจาก Dash หรือตัวเรียกใช้งาน) แอปพลิเคชั่นบางตัวไม่ทำเช่นนั้น แต่สามารถบังคับได้โดยเปลี่ยนเส้นทางคำสั่งเพื่อเรียกใช้แอปพลิเคชันผ่านสคริปต์ด้านล่าง ในการทำเช่นนั้นคุณจะต้องแก้ไข.desktopไฟล์ที่เกี่ยวข้อง(ตัวเรียกใช้งาน)

ดูเหมือนว่าการตั้งค่าจะซับซ้อนเล็กน้อย แต่ถ้าทำตามขั้นตอน ("วิธีใช้") ก็ไม่ควรยากเกินไป

มันทำงานอย่างไร

  • สคริปต์จะอ่านตำแหน่งของเมาส์ในขณะที่คุณคลิกตัวเรียกใช้งานหรือเลือกแอปพลิเคชันจาก Dash และกำหนดว่าหน้าจอใดคือ (ซ้าย / ขวา)
  • Subsquently จะรอให้หน้าต่างใหม่ปรากฏเป็นเจ้าของแอปพลิเคชัน (pid) ที่คุณเริ่ม
  • เมื่อหน้าต่างปรากฏขึ้นจะตรวจสอบว่าตำแหน่งหน้าต่าง (หน้าจอ) ตรงกับตำแหน่งเมาส์ (หน้าจอ) หรือไม่
  • มิฉะนั้นระบบจะย้ายหน้าต่างไปยังหน้าจอที่คุณเริ่มต้นแอปพลิเคชัน ในกรณีส่วนใหญ่การกระทำจะอยู่ในระยะเริ่มต้นของการมีอยู่ของหน้าต่างดังนั้นคุณจะไม่สังเกตเห็น

ปัญหา / ทางออก

มีข้อเสียอย่างหนึ่ง: หากคุณแทนที่คำสั่งหลัก.desktopของไฟล์โดยคำสั่งเพื่อเรียกสคริปต์นี้คลิกขวาที่"open with"จะไม่ทำงานอย่างถูกต้อง ในกรณีของเว็บเบราเซอร์เช่น Google Chrome นั่นจะไม่เป็นปัญหาใหญ่เกินไป ด้วยแอพพลิเคชั่นอื่น ๆ ทางออกที่ง่ายคือการเพิ่มตัวเลือกในการเปิดหน้าต่างใหม่บนหน้าจอปัจจุบันเป็นทางลัด (ดูเพิ่มเติมด้านล่าง)

<ภาพ>

วิธีใช้:

  • สคริปต์ใช้ทั้งwmctrlและxautomation:

    sudo apt-get install xautomation
    sudo apt-get install wmctrl
    
  • สร้างไดเรกทอรี~/binหากยังไม่มีอยู่

  • คัดลอกสคริปต์ลงในไฟล์เปล่าบันทึกเป็นopen_oncurrent(ไม่มีส่วนขยาย) ใน~/bin

  • ทำให้สามารถเรียกใช้งานได้ (!)
  • คัดลอก.desktopไฟล์ที่เกี่ยวข้องจาก/usr/share/applicationsไปยัง~/.local/share/applications:

    cp /usr/share/applications/google-chrome.desktop ~/.local/share/applications/google-chrome.desktop
    
  • เปิดสำเนาโลคัลใน~/.local/share/applications:

    gedit ~/.local/share/applications/google-chrome.desktop
    
  • แก้ไขไฟล์ (สองตัวเลือก):

    1. วิธีเปลี่ยนคำสั่งหลักของตัวเรียกใช้งาน:

      • ค้นหาบรรทัด:

        Exec=/usr/bin/google-chrome-stable %U
        
      • เปลี่ยนเป็น

        Exec=/bin/bash -c "open_oncurrent /usr/bin/google-chrome-stable"
        
    2. หากต้องการเพิ่มตัวเลือกเป็นทางลัด (เช่นในภาพด้านบน):

      • ค้นหาบรรทัด:

        X-Ayatana-Desktop-Shortcuts=NewWindow;NewIncognito;
        
      • แทนที่ด้วย:

        X-Ayatana-Desktop-Shortcuts=NewWindow;NewIncognito;New window on this screen;
        
      • จากนั้นเพิ่มหัวข้อต่อไปนี้ในส่วนท้ายสุดของไฟล์:

        [New window on this screen Shortcut Group]
        Name=New window on this screen
        Exec=/bin/bash -c "open_oncurrent /usr/bin/google-chrome-stable"
        TargetEnvironment=Unity
        

วิธีใช้กับแอปพลิเคชันอื่น:

ในทำนองเดียวกันคุณสามารถใช้โซลูชันกับแอปพลิเคชันอื่น ไวยากรณ์ของคำสั่งที่ใช้ใน.desktopไฟล์เป็นตัวอย่าง:

Exec=/bin/bash -c "open_oncurrent <command>"

คำอธิบายเพิ่มเติมเล็กน้อยเกี่ยวกับวิธีจัดการกับข้อยกเว้นอยู่ในสคริปต์

สคริปต์

#!/usr/bin/env python3
import subprocess
import sys
import time
import getpass

t = 0; user = getpass.getuser(); application = sys.argv[1]
"""
In most cases, the command to run an application is the same as the process
name. There are however exceptions, to be listed below, if you use these appli-
cations i.c.w. this script. Just add an item to the list in the format:
["<command>", "<process_name>"],
"""
exceptions = [
    ["/usr/bin/google-chrome-stable", "chrome"],
    ]
try:
    procname = [app[1] for app in exceptions if app[0] == application][0]
except IndexError:
    procname = application

get = lambda cmd: subprocess.check_output(["/bin/bash", "-c", cmd]).decode("utf-8")
# initial position of the mouse (click position)
start_pos = int(get("xmousepos").strip().split()[0])
# x- position of right side of the screen  
x_res = [int(s.split("x")[0]) for s in get("xrandr").split() if s.endswith("+0+0")][0]
# current windows
start_windows = get("wmctrl -l")
# open application
subprocess.call(["/bin/bash", "-c", application+"&"])
while t < 30:
    procs = get("ps -u "+user).splitlines()
    new = [w for w in get("wmctrl -lpG").splitlines() if not w.split()[0] in start_windows]
    match = sum([[line for line in procs if w.split()[2] in line and procname[:15] in line] for w in new], [])
    if len(match) == 1:
        data = new[0].split(); curr_pos = int(data[3]); compare = (start_pos > x_res, curr_pos > x_res)
        if compare[0] == compare[1]:
            pass
        else:
            if compare[0] == True:
                data[3] = str(int(data[3])+x_res)
            else:
                data[3] = str(int(data[3])-x_res)
            cmd1 = "wmctrl -r "+data[0]+" -b remove,maximized_vert,maximized_horz"
            cmd2 = "wmctrl -ir "+data[0]+" -e 0,"+(",").join(data[3:7])
            for cmd in [cmd1, cmd2]:
                subprocess.Popen(["/bin/bash", "-c", cmd])
        break
    t = t + 1
    time.sleep(0.5)

ขอบคุณมันใช้งานได้ ฉันสังเกตเห็นไอคอนที่สองของ Google Chrome บนตัวเรียกใช้งานเมื่อเปิด
Digiplace

6

Unity ใช้ Compiz เป็นผู้จัดการการเขียนและมีปลั๊กอินทุกประเภทสำหรับสิ่งต่าง ๆ ประเภทนี้ เพื่อให้เนื้อเรื่องสั้นและยาวโดยไม่ต้องยุ่งในบรรทัดคำสั่งให้ติดตั้งตัวจัดการการตั้งค่า Compiz Config (ด้วยsudo apt-get install compizconfig-settings-managerหรือผ่าน Software Center) และค้นหาPlace Windowsตรวจสอบให้แน่ใจว่าได้ทำการตรวจสอบแล้ว

ป้อนคำอธิบายรูปภาพที่นี่

Multi Output Modeภายใต้ปลั๊กอินที่จะมีหลายตัวเลือกสำหรับ Use output device of focused windowสิ่งที่คุณต้องการคือ ดังนั้นมันจะวางหน้าต่างเปิดไฟล์ไว้ทุกที่ที่ตัวจัดการไฟล์ของคุณอยู่ ป้อนคำอธิบายรูปภาพที่นี่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.