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 .desktop
file 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).
Cara Penggunaan:
Script menggunakan keduanya wmctrl
dan xautomation
:
sudo apt-get install xautomation
sudo apt-get install wmctrl
Buat direktori ~/bin
jika belum ada.
Salin skrip ke file kosong, simpan sebagai open_oncurrent
(tanpa ekstensi) di~/bin
- Jadikan itu dapat dieksekusi (!)
Salin .desktop
file yang sesuai dari /usr/share/applications
ke ~/.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):
Untuk mengubah perintah utama peluncur:
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 .desktop
fileadalah 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)