Bagaimana saya bisa membuka jendela pada monitor yang berbeda?

9

Dengan beberapa monitor, saya sejauh ini telah menyeret windows secara manual. Apakah ada cara untuk membuat jendela terbuka pada layar tertentu dalam pengaturan dual-head? (Jangan bingung dengan beberapa tampilan server X.)

Sesuatu seperti: SCREEN=2 firefoxatau open-in-screen 2 firefox.

Jika itu penting, lingkungan saya adalah KDE menggunakan manajer jendela KWin. Aturan jendela KWin hanya dapat mencocokkan beberapa properti seperti judul, tetapi saya tidak dapat menemukan variabel lingkungan sebagai filter.

Tampilan sekunder memperluas layar utama:

$ xrandr -q
Screen 0: minimum 320 x 200, current 3520 x 1080, maximum 32767 x 32767
LVDS1 connected 1600x900+0+0 (normal left inverted right x axis y axis) 382mm x 214mm
   1600x900       60.1*+
   1024x768       60.0  
   800x600        60.3     56.2  
   640x480        59.9  
VGA1 disconnected (normal left inverted right x axis y axis)
HDMI1 connected 1920x1080+1600+0 (normal left inverted right x axis y axis) 477mm x 268mm
   1920x1080      60.0*    50.0     59.9  
   1920x1080i     60.1     50.0     60.0  
   1680x1050      59.9  
   1280x1024      75.0     60.0  
   1440x900       59.9  
   1280x960       60.0  
   1280x720       60.0     50.0     59.9  
   1024x768       75.1     70.1     60.0  
   832x624        74.6  
   800x600        72.2     75.0     60.3     56.2  
   720x576        50.0  
   720x480        60.0     59.9  
   640x480        75.0     72.8     66.7     60.0     59.9  
   720x400        70.1  
DP1 disconnected (normal left inverted right x axis y axis)
Lekensteyn
sumber
2
Biasanya, saya menyarankan untuk menggunakan kstartini, tetapi tampaknya kstarthanya mendukung mendefinisikan desktop tertentu, tetapi bukan layar di mana aplikasi harus dimulai. Mungkin layak dilaporkan WISHLIST bugreport di bugs.kde.org .
Elias Probst
Tip hebat tentang kstart, saya juga ingin tahu itu. Perintahnya adalah: di kstart --desktop $N firefoxmana $Nangka antara 1 dan jumlah total desktop virtual .
Lekensteyn
Mengenai kstart, ada juga laporan bug di bugs.kde.org yang meminta fitur ini.
Elias Probst
Sungguh aneh, saya melihat posting tentang wmctrl sebelumnya hari ini tetapi belum sempat mengujinya. Mengapa itu dihapus?
Lekensteyn
Tidak tahu tentang posting wmctrl, tidak melihatnya.
Elias Probst

Jawaban:

5

Tidak, Anda tidak dapat melakukannya secara langsung. Dalam arsitektur X, dua monitor fisik yang Anda lihat tidak dapat dilihat oleh aplikasi. Anda hanya dapat bekerja di sekitar abstraksi ini, dengan menentukan area mana dari ruang kerja yang terlihat yang sesuai dengan monitor mana dan kemudian menempatkan windows pada offset yang benar.

Toolkit yang masuk akal mendukung -geometryopsi, yang memungkinkan aplikasi Anda meminta ditempatkan pada posisi tertentu. Jika Anda tidak memiliki opsi ini, Anda dapat menggunakan wmctrljika Anda memiliki X Window Manager yang kompatibel dengan EWMH / NetWM untuk memindahkan dan mengubah ukuran jendela yang sudah ada (lihat wmctrl (1), Anda memerlukan opsi -rdan -e). Saya gunakan devilspieuntuk memaksa penempatan beberapa jendela dan tentu saja window manager pilihan Anda mungkin memiliki fasilitas sendiri untuk memaksa penempatan jendela.

devilspiememungkinkan untuk menerapkan tindakan tertentu pada X windows dan dapat menggunakan properti X window untuk membedakan berbagai windows dan aplikasi. Aturan kuncinya bagi Anda adalah geometry "<width>x<height>+<xoffset>+<yoffset>".

Namun, Anda selalu perlu melakukan perhitungan kapan dan di mana monitor fisik lain dimulai. Tapi ini tidak terlalu sulit dan xrandrtidak memberitahu Anda bagaimana dan di mana ia menggunakan monitor dalam bentuk "<width>x<height>+<xoffset>+<yoffset>pada setiap baris yang menatap nama output.

Tidak ada cara yang sangat mudah, hanya akan bekerja, karena implementasi dapat (dan lakukan!) Bervariasi. wmctrlbiasanya berfungsi pada judul jendela untuk mengidentifikasi target. devilspiejuga bisa merujuk ke kelasnya, namun, saya tidak mengetahui adanya toolkit yang memungkinkan Anda menentukan kelas X windows tetapi tidak geometrinya.

Tentu saja Anda selalu dapat memulai dua xephyrinstance dan membuat satu mengisi layar kiri Anda dan yang lain layar kanan Anda dan kemudian mengatasi layar melalui DISPLAYvariabel lingkungan, tetapi solusi ini memiliki kelemahan lainnya.

Secara teori, otoritas untuk mengatur penempatan jendela adalah manajer jendela. Akibatnya, jika Anda menginginkan hal-hal yang tidak dapat dilakukan pengelola jendela, itu akan menjadi peretasan dan itu juga alasan mengapa tidak ada cara umum untuk melakukannya.

Namun, jika case use konkret Anda adalah emulator android Anda ... yang sangat berbeda dari meminta opsi untuk menentukan SCREEN=n fooapppada shell, maka devilspiemungkin apa yang Anda cari. Petunjuk: Saya menemukan yang terbaik untuk mengidentifikasi aplikasi berdasarkan kelas jendela mereka.

Bananguin
sumber
Terima kasih telah menjelaskan mengapa ini bukan fitur yang mudah. KWin juga memiliki aturan jendela yang memaksa penempatan di layar yang berbeda (yang saya gunakan sekarang). Meskipun tidak ada fitur default untuk SCREEN=x app, apakah mungkin untuk menambahkan properti jendela dengan cara ini sehingga dapat difilter oleh KWin?
Lekensteyn
Secara teori ya, tapi saya tidak mengetahui ada solusi untuk ini. Saya pikir Anda tidak dapat menambahkan properti tetapi Anda dapat mengubah properti yang ada, jadi Anda bisa menambahkan beberapa string ke kelas jendela yang bisa dideteksi kwin.
Bananguin
Saya menghadiahkan hadiah kepada Anda karena SE sebaliknya akan memberikannya kepada jawaban terpilih sementara jawaban Anda lebih baik menjelaskan masalah. Namun jawaban saat ini masih belum memuaskan.
Lekensteyn
4

Ini adalah solusi khusus manajer jendela. Ini adalah bagaimana melakukannya dengan kwin yang merupakan window manager default KDE.

Jika Anda mengklik kanan pada Title Bar aplikasi dan memilih lebih banyak pengaturan -> pengaturan aplikasi khusus.

Buka tab Jendela yang cocok. Klik pada tombol Detect Window Properties. Kemudian dengan klik kursor mouse di jendela utama aplikasi. Ini akan memilih kelas jendela dll dan juga mendapatkan informasi posisi jendela dll.

Kemudian klik pada tab Ukuran dan Posisi. Klik Posisi Kotak dan Ukuran kotak dan kotak tarik turun ke kanan keduanya dan atur untuk mengingat.

Kemudian klik ok.

Lain kali Anda menjalankan aplikasi itu harus memiliki ukuran dan monitor yang sama.

Saya menggunakan ini di KDE untuk membuka terminal uRxvt saya di monitor kiri saya pada pengaturan 3 monitor dan berfungsi setiap saat.

Semoga berhasil.

rking
sumber
Ini adalah bagaimana saya melakukannya sekarang, saya berharap ada cara yang lebih mudah menggunakan utusan.
Lekensteyn
Ini adalah jawaban yang benar untuk pengguna KDE KWin.
iLikeDirt
3

Ini tergantung pada bagaimana pengaturan dual-monitor Anda.

Jika Anda menggunakan XINERAMA untuk membuat kedua tampilan seperti satu ke X, maka Anda akan menggunakan -geometryopsi untuk meminta aplikasi muncul di lokasi tertentu. Jika Anda memiliki pengaturan tampilan sebagai layar yang berbeda maka Anda akan menggunakan DISPLAYuntuk mencapai ini.

Cobalah ini:

$ DISPLAY=0.0 xterm &
$ DISPLAY=0.1 xterm &

Jika monitor Anda adalah layar 0 dan 1, ini akan menghasilkan xterm pada setiap monitor.

casey
sumber
2
Saya sudah mencoba ini, tetapi konfigurasi ini tidak berlaku untuk saya, satu layar diposisikan kiri dari yang lain. Saya akan memperbarui pertanyaan saya.
Lekensteyn
1
Sudahkah Anda mencoba menggunakan opsi geometri untuk aplikasi yang mendukungnya? Memberi koordinat x> 1600 harus memposisikan aplikasi di ruang monitor kedua. Anda mungkin juga mencobanya di luar kwin (hanya untuk melihat apakah itu berfungsi) seperti dalam pengalaman saya kwin dan -geometrytidak selalu berfungsi dengan baik.
Casey
Casey, aplikasi yang saya coba posisikan tidak mendukung opsi semacam itu (android emulator, berdasarkan QEMU). Program terbuka di mana kursor mouse saya berada.
Lekensteyn
2

Saya menemukan metode ini yang menggunakan xdotool, xprop, & wmctrl.

Inilah yang akan dilakukan skrip di bawah ini:

  1. Temukan jendela aktif
  2. Dapatkan status maksimalnya dan ingatlah
  3. Hapus maksimisasi
  4. Dapatkan geometrinya
  5. Hitung posisi baru
  6. Pindahkan itu
  7. Maksimalkan berdasarkan kondisi sebelumnya
  8. Angkat itu
  9. Berikut skrip yang melakukan itu:

naskah

Ini akan memindahkan jendela aktif ke monitor lain. Itu hanya bisa menangani berdampingan, alias. horisontal, konfigurasi monitor.

wid=`xdotool getactivewindow`
max_state=`xprop -id $wid _NET_WM_STATE`

wmctrl -ir $wid -b remove,maximized_vert,maximized_horz
eval `xdotool getwindowgeometry --shell $wid`

new_x=1600
if [[ "$X" -ge "$new_x" ]]; then
  new_x=0
fi

xdotool windowmove $wid $new_x $Y
if [ -z "${max_state/*_NET_WM_STATE_MAXIMIZED_*/}" ]; then
  wmctrl -ir $wid -b add,maximized_vert,maximized_horz
fi

xdotool windowraise $wid

Sumber: Xubuntu - memindahkan windows antar monitor

slm
sumber
Ini hanya berfungsi setelah aplikasi dibuka, tidak benar-benar apa yang saya cari (keybinding mungkin bisa ditambahkan untuk ini). Jika saya tidak salah, ini selalu menempatkan jendela di sebelah kiri monitor?
Lekensteyn
@Lekensteyn - Ya maksud dari solusi ini adalah Anda meluncurkan appX dan kemudian jalankan cmd ini untuk memindahkannya. Saya tidak memiliki monitor ganda 8- (jadi saya tidak punya cara untuk menguji ini, saya hanya menemukannya dan memberikan rinciannya di sini untuk Anda evaluasi. Ini adalah opsi dan kemungkinan bisa disesuaikan tetapi ini merupakan solusi "mentah" dalam formulir saat ini
slm
@Lekensteyn - solusi ini tidak jauh berbeda dari SCREEN=2 appXkonsep Anda , kecuali itu appX; sleep 1; moveWindow.sh.
slm
@Lekensteyn - juga saya telah menggunakan devilspie, xdotool, dll untuk melakukan hal-hal yang persis sama (dalam satu jendela), A ini memuji yang lain, karena ia menunjukkan spesifik, di mana yang lain hanya menjelaskan pendekatan yang mungkin tetapi tidak menunjukkan detail implementasi aktual.
slm
Ini akan lebih seperti app & sleep 1; moveWindow.shkarena program tidak lepas. Saya tidak menganggap ini perbaikan dibandingkan menggunakan aturan jendela KWin. +1 untuk upaya Anda.
Lekensteyn
0

Punya masalah serupa. Temukan yang berikut:

  1. Klik kanan pada batang judul jendela dan pilih "Tindakan Lainnya" -> "Pengaturan Manajer Jendela".
  2. Di sana pilih "Fokus" di kolom di sebelah kiri.
  3. Toggle option "Layar aktif mengikuti mouse".

Jika tidak ada standar lain yang ditentukan, jendela muncul di layar yang sedang aktif. Dengan prosedur yang dijelaskan di atas, posisi mouse menentukan layar aktif ini.

BiberBb
sumber
Benar, tetapi ini tidak berfungsi jika saya ingin menyimpan kursor di layar saat ini. Saya pikir ini bahkan merupakan opsi default, tetapi tidak semua program menghormatinya.
Lekensteyn