Buka jendela aplikasi pada layar yang sama dengan tempat diluncurkan

8

Saya menggunakan pengaturan layar ganda. Ubuntu 14.10 / Unity. Setiap layar memiliki peluncur / Dash sendiri. Aplikasi bawaan seperti Firefox, nautilus, terminal & thunderbird muncul di layar tempat saya menggunakan peluncur. Jadi, ketika saya menggunakan peluncur untuk Firefox di layar kanan, browser akan terbuka di layar sebelah kanan. Seperti seharusnya.

Saya ingin perilaku itu dengan aplikasi lain seperti Google Chrome. Sepertinya saya tidak dapat menemukan solusi yang tepat.

Digiplace
sumber

Jawaban:

5

Mengarahkan perintah untuk menjalankan aplikasi

Sebagian besar aplikasi membuka jendelanya di layar tempat mereka memulai (baik dari Dash atau launcher). Namun beberapa aplikasi tidak, tetapi mereka dapat dipaksa, dengan mengarahkan perintah untuk menjalankan aplikasi melalui skrip di bawah ini. Untuk melakukan itu, Anda harus mengedit .desktopfile yang sesuai (peluncur).

Pengaturannya agak rumit, tetapi jika prosedurnya diikuti ("Bagaimana cara menggunakan"), seharusnya tidak terlalu sulit sama sekali.

Bagaimana itu bekerja

  • Script membaca posisi mouse pada saat Anda mengklik peluncur atau memilih aplikasi dari Dash, dan menentukan pada layar mana yang (kiri / kanan).
  • Secara tidak teratur, ia menunggu jendela baru muncul, yang dimiliki oleh aplikasi (pid) yang Anda mulai.
  • Setelah jendela muncul, ia memeriksa apakah posisi jendela (layar-) cocok dengan posisi awal mouse (layar-).
  • Jika tidak, ini akan memindahkan jendela ke layar tempat Anda memulai aplikasi. Dalam kebanyakan kasus, tindakan akan berada pada tahap awal keberadaan jendela, sehingga Anda bahkan tidak akan menyadarinya.

Masalah / solusi

Ada satu kelemahan: jika Anda mengganti perintah utama.desktop file dengan perintah untuk memanggil skrip ini, klik kanan "buka dengan" tidak akan berfungsi dengan baik. Dalam kasus browser web seperti Google Chrome, itu tidak akan menjadi masalah besar. Dengan aplikasi lain, solusi sederhana adalah menambahkan opsi untuk membuka jendela baru pada layar saat ini sebagai jalan pintas (lihat lebih lanjut di bawah).

<gambar>

Cara Penggunaan:

  • Script menggunakan keduanya wmctrldan xautomation:

    sudo apt-get install xautomation
    sudo apt-get install wmctrl
    
  • Buat direktori ~/binjika belum ada.

  • Salin skrip ke file kosong, simpan sebagai open_oncurrent(tanpa ekstensi) di~/bin

  • Jadikan itu dapat dieksekusi (!)
  • Salin .desktopfile yang sesuai dari /usr/share/applicationske ~/.local/share/applications:

    cp /usr/share/applications/google-chrome.desktop ~/.local/share/applications/google-chrome.desktop
    
  • Buka salinan lokal di ~/.local/share/applications:

    gedit ~/.local/share/applications/google-chrome.desktop
    
  • Edit file (dua opsi):

    1. Untuk mengubah perintah utama peluncur:

      • temukan garis:

        Exec=/usr/bin/google-chrome-stable %U
        
      • ubah ke

        Exec=/bin/bash -c "open_oncurrent /usr/bin/google-chrome-stable"
        
    2. Untuk menambahkan opsi sebagai pintasan (seperti pada gambar di atas):

      • temukan garis:

        X-Ayatana-Desktop-Shortcuts=NewWindow;NewIncognito;
        
      • ganti dengan:

        X-Ayatana-Desktop-Shortcuts=NewWindow;NewIncognito;New window on this screen;
        
      • Kemudian tambahkan bagian berikut ke bagian paling akhir file:

        [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
        

Cara menggunakan dengan aplikasi lain:

Demikian pula, Anda dapat menerapkan solusi ke aplikasi lain. Sintaks perintah yang digunakan dalam .desktopfileadalah seperti contoh:

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

Penjelasan tambahan kecil tentang cara menangani pengecualian ada di skrip.

Naskah

#!/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)
Yakub Vlijm
sumber
Terima kasih, ini berhasil. Saya melihat ikon kedua Google Chrome di peluncur saat terbuka.
Digiplace
6

Unity menggunakan Compiz sebagai manajer penulisan, dan yang memiliki semua jenis plugin untuk hal-hal semacam ini. Untuk membuatnya mudah dan cerita pendek tanpa mengacaukan di baris perintah, instal Compiz Config Settings Manager (dengan sudo apt-get install compizconfig-settings-manageratau melalui Pusat Perangkat Lunak), dan cari Place Windows, pastikan dicentang

masukkan deskripsi gambar di sini

Di bawah plugin itu akan ada beberapa opsi untuk Multi Output Mode. Yang Anda inginkan adalah Use output device of focused window. Maka itu akan menempatkan jendela file terbuka di mana pun manajer file Anda masukkan deskripsi gambar di sini

Sergiy Kolodyazhnyy
sumber