Làm thế nào tôi có thể mở một cửa sổ trên một màn hình khác?


9

Với nhiều màn hình, cho đến nay tôi đã kéo các cửa sổ bằng tay xung quanh. Có cách nào để mở cửa sổ trên một màn hình cụ thể trong thiết lập hai đầu không? (Không nên nhầm lẫn với nhiều màn hình máy chủ X.)

Một cái gì đó như: SCREEN=2 firefoxhoặc open-in-screen 2 firefox.

Nếu có vấn đề, môi trường của tôi là KDE bằng trình quản lý cửa sổ KWin. Quy tắc cửa sổ KWin chỉ có thể khớp với một số thuộc tính như tiêu đề, nhưng tôi không thể tìm thấy biến môi trường dưới dạng bộ lọc.

Màn hình phụ mở rộng màn hình chính:

$ 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)

2
Thông thường, tôi khuyên bạn nên sử dụng kstartcho việc này, nhưng dường như kstartchỉ hỗ trợ xác định một máy tính để bàn cụ thể, nhưng không phải là màn hình mà ứng dụng sẽ được khởi động. Có lẽ đáng giá một lỗi WISHLIST trên bug.kde.org .
Elias Probst 27/12/13

Mẹo tuyệt vời về kstart, tôi cũng muốn biết điều đó. Lệnh này là: kstart --desktop $N firefoxtrong đó $Nmột số nằm trong khoảng từ 1 đến tổng số máy tính để bàn ảo .
Lekensteyn

Về kstart, cũng có một lỗi trên bug.kde.org yêu cầu tính năng này.
Elias Probst

Thật kỳ lạ, tôi đã thấy một bài viết về wmctrl vào hôm nay nhưng chưa có cơ hội để kiểm tra nó. Tại sao nó bị xóa?
Lekensteyn

Không có ý tưởng về bài đăng wmctrl, đã không nhìn thấy nó.
Elias Probst

Câu trả lời:


5

Không, bạn không thể làm điều đó trực tiếp. Trong kiến ​​trúc X, hai màn hình vật lý mà bạn nhìn thấy không thể thấy rõ bằng các ứng dụng. Bạn chỉ có thể làm việc theo cách trừu tượng này, bằng cách xác định khu vực nào của không gian làm việc có thể nhìn thấy tương ứng với màn hình nào và sau đó đặt các cửa sổ ở vị trí chính xác.

Bộ công cụ hợp lý hỗ trợ một -geometrytùy chọn, cho phép ứng dụng của bạn yêu cầu được đặt ở một vị trí cụ thể. Nếu bạn không có sẵn tùy chọn này, bạn có thể sử dụng wmctrlnếu bạn có Trình quản lý cửa sổ X tương thích EWMH / NetWM để di chuyển và thay đổi kích thước các cửa sổ hiện có (xem wmctrl (1), bạn cần tùy chọn -r-e). Tôi sử dụng devilspieđể buộc vị trí của một số cửa sổ và tất nhiên người quản lý cửa sổ của bạn có thể có cơ sở riêng để buộc vị trí cửa sổ.

devilspiecho phép áp dụng một số hành động nhất định trên các cửa sổ X và có thể sử dụng các thuộc tính cửa sổ X để phân biệt các cửa sổ và ứng dụng khác nhau. Các quy tắc quan trọng cho bạn sẽ là geometry "<width>x<height>+<xoffset>+<yoffset>".

Tuy nhiên, bạn luôn cần thực hiện các tính toán về thời điểm và nơi mà một màn hình vật lý khác bắt đầu. Nhưng điều này không quá khó và xrandrcho bạn biết cách thức và nơi nó sử dụng màn hình ở dạng "<width>x<height>+<xoffset>+<yoffset>trên mỗi dòng nhìn chằm chằm với một tên đầu ra.

Không có cách thức hoàn hảo, bởi vì việc triển khai có thể (và làm!) Khác nhau. wmctrlthường hoạt động trên tiêu đề cửa sổ để xác định mục tiêu. devilspieTuy nhiên, tôi cũng có thể tham khảo lớp của nó, tôi không biết bất kỳ bộ công cụ nào cho phép bạn chỉ định một lớp cửa sổ X nhưng không phải là hình học của nó.

Tất nhiên, bạn luôn có thể bắt đầu hai xephyrtrường hợp và thực hiện một lần lấp đầy màn hình bên trái và màn hình bên phải của bạn và sau đó giải quyết các màn hình thông qua DISPLAYbiến môi trường, nhưng giải pháp này có những nhược điểm khác.

Về lý thuyết, cơ quan quản lý vị trí cửa sổ là trình quản lý cửa sổ. Do đó, nếu bạn muốn công cụ quản lý cửa sổ của mình không thể, nó sẽ bị hack và đó cũng là lý do tại sao không có cách chung nào để thực hiện việc này.

Tuy nhiên, nếu trường hợp sử dụng cụ thể của bạn là trình giả lập Android của bạn ... khác với yêu cầu tùy chọn chỉ định SCREEN=n fooapptrên vỏ, thì đó devilspiecó thể là những gì bạn đang tìm kiếm. Gợi ý: Tôi thấy tốt nhất là xác định các ứng dụng theo lớp cửa sổ của chúng.


Cảm ơn đã giải thích lý do tại sao đây không phải là một tính năng dễ dàng. KWin cũng có các quy tắc cửa sổ buộc đặt vị trí trên một màn hình khác (đó là những gì tôi sử dụng bây giờ). Mặc dù không có tính năng mặc định cho SCREEN=x app, nhưng có thể thêm thuộc tính cửa sổ theo cách này để nó có thể được lọc bởi KWin không?
Lekensteyn

Về lý thuyết thì có, nhưng tôi không biết về bất kỳ giải pháp hiện có nào cho việc này. Tôi nghĩ rằng bạn không thể thêm thuộc tính nhưng bạn có thể thay đổi các thuộc tính hiện có, vì vậy bạn chỉ cần thêm một số chuỗi vào lớp cửa sổ mà kwin có thể phát hiện.
Bananguin

Tôi đã trao tiền thưởng cho bạn vì SE sẽ cấp nó cho câu trả lời được bình chọn hàng đầu trong khi câu trả lời của bạn mô tả rõ hơn các vấn đề. Các câu trả lời hiện tại vẫn chưa thỏa đáng.
Lekensteyn

4

Đây là một giải pháp cụ thể của người quản lý cửa sổ. Đây là cách thực hiện với kwin, trình quản lý cửa sổ mặc định của KDE.

Nếu bạn nhấp chuột phải vào Thanh tiêu đề của ứng dụng và chọn thêm cài đặt -> cài đặt ứng dụng đặc biệt.

Chuyển đến tab khớp cửa sổ. Nhấp vào nút Phát hiện thuộc tính cửa sổ. Sau đó, với con trỏ chuột nhấp vào cửa sổ chính của ứng dụng. Nó sẽ chọn lớp cửa sổ vv và cũng có được thông tin định vị cửa sổ, vv

Sau đó bấm vào tab Kích thước và vị trí. Nhấp vào Hộp vị trí và kích thước hộp và thả xuống hộp bên phải của cả hai và đặt để ghi nhớ.

Sau đó bấm ok.

Lần tới khi bạn chạy ứng dụng, nó phải có cùng kích thước và trên cùng một màn hình.

Tôi sử dụng điều này trong KDE để mở thiết bị đầu cuối uRxvt của mình trên màn hình bên trái trên thiết lập 3 màn hình và nó hoạt động mọi lúc.

Chúc may mắn.


Đây là cách tôi làm điều đó ngay bây giờ, tôi đã hy vọng có một cách đơn giản hơn bằng cách sử dụng envvars.
Lekensteyn

Đây là câu trả lời đúng cho người dùng KDE KWin.
iLikeDirt

3

Điều này phụ thuộc vào cách thiết lập màn hình kép của bạn.

Nếu bạn đang sử dụng XINERAMA để làm cho cả hai màn hình trông giống như một đến X, thì bạn sẽ sử dụng -geometrytùy chọn để yêu cầu các ứng dụng xuất hiện tại một vị trí cụ thể. Nếu bạn có thiết lập màn hình như các màn hình khác nhau thì bạn sẽ sử dụng DISPLAYđể đạt được điều này.

Hãy thử xem:

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

Nếu màn hình của bạn là màn hình 0 và 1, điều này sẽ sinh ra một xterm trên mỗi màn hình.


2
Tôi đã thử điều này rồi, nhưng cấu hình này không áp dụng cho tôi, một màn hình được đặt bên trái màn hình khác. Tôi sẽ cập nhật câu hỏi của tôi.
Lekensteyn

1
Bạn đã thử sử dụng tùy chọn hình học cho các ứng dụng hỗ trợ nó chưa? Cho tọa độ x> 1600 sẽ định vị ứng dụng trong không gian màn hình thứ hai. Bạn cũng có thể thử điều đó bên ngoài kwin (chỉ để xem nó có hoạt động không) như kinh nghiệm của tôi kwin và -geometrykhông phải lúc nào cũng hoạt động đúng.
casey 27/12/13

Casey, ứng dụng mà tôi đang cố gắng định vị không hỗ trợ tùy chọn như vậy (android emulator, dựa trên QEMU). Chương trình mở ra nơi con trỏ chuột của tôi được đặt.
Lekensteyn

2

Tôi đã đi qua phương pháp này mà làm cho sử dụng xdotool, xprop, & wmctrl.

Đây là những gì kịch bản dưới đây sẽ làm:

  1. Tìm cửa sổ hoạt động
  2. Nhận trạng thái tối đa của nó và ghi nhớ nó
  3. Xóa tối đa hóa
  4. Nhận hình học của nó
  5. Tính toán vị trí mới
  6. Di chuyển nó
  7. Tối đa hóa dựa trên trạng thái trước đó
  8. Nâng nó
  9. Đây là một kịch bản thực hiện điều đó:

kịch bản

Điều này sẽ di chuyển cửa sổ hoạt động sang màn hình khác. Nó chỉ có thể xử lý một bên, aka. ngang, cấu hình của màn hình.

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

Nguồn: Xubfox - di chuyển các cửa sổ giữa các màn hình


Điều này chỉ hoạt động sau khi một ứng dụng đã được mở, không thực sự là những gì tôi đang tìm kiếm (một keybinding có thể được thêm vào cho điều này mặc dù). Nếu tôi không nhầm, điều này luôn đặt một cửa sổ ở bên trái của màn hình?
Lekensteyn

@Lekensteyn - Có, mục đích của giải pháp này là bạn khởi chạy appX và sau đó chạy cmd này để di chuyển nó. Tôi không có màn hình kép 8- (vì vậy tôi không có cách nào để kiểm tra điều này, tôi chỉ đơn giản tìm thấy nó và cung cấp các chi tiết ở đây để bạn đánh giá. Đây là một tùy chọn và có thể có thể được điều chỉnh nhưng đó là một giải pháp "thô" hình thức hiện tại.
slm

@Lekensteyn - giải pháp này không khác nhiều so với SCREEN=2 appXkhái niệm của bạn , ngoại trừ nó appX; sleep 1; moveWindow.sh.
slm

@Lekensteyn - tôi cũng đã sử dụng devilspie, xdotool, v.v. để làm chính xác những điều tương tự (trong một cửa sổ), cái này khen ngợi cái khác, trong đó nó chỉ ra các chi tiết cụ thể, trong đó cái kia chỉ giải thích các cách tiếp cận có thể nhưng không hiển thị chi tiết thực hiện.
slm

Nó sẽ giống app & sleep 1; moveWindow.shnhư các chương trình không tách ra. Tôi không coi đây là một cải tiến so với việc sử dụng các quy tắc cửa sổ KWin. +1 cho những nỗ lực của bạn.
Lekensteyn

0

Có một vấn đề tương tự. Tìm thấy như sau:

  1. Nhấp chuột phải vào thanh tiêu đề cửa sổ và chọn "Tác vụ khác" -> "Cài đặt trình quản lý cửa sổ".
  2. Ở đó chọn "Tập trung" trong cột bên trái.
  3. Tùy chọn chuyển đổi "Màn hình hoạt động theo chuột".

Nếu không có mặc định nào khác được chỉ định, các cửa sổ sẽ xuất hiện trên màn hình hiện đang hoạt động. Với quy trình được mô tả ở trên, vị trí chuột xác định màn hình hoạt động này.


Phải, nhưng điều này không hoạt động nếu tôi muốn giữ con trỏ trong màn hình hiện tại. Tôi nghĩ rằng đây thậm chí là tùy chọn mặc định, nhưng không phải tất cả các chương trình đều tôn trọng nó.
Lekensteyn
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.