2013-08-21 34 views
8

Tôi có một câu hỏi khó tìm kiếm câu trả lời (tôi luôn kết thúc với câu trả lời cho thao tác theo dõi). Tôi đang viết một kịch bản shell bash để giúp tôi với dev mã của tôi và tôi có hai màn hình.Làm thế nào để bạn chạy một ứng dụng trong bash và chọn màn hình nó chạy trên?

Khi tôi chạy tệp thực thi mà tôi đã biên soạn, tôi muốn cho nó chạy trên một màn hình cụ thể (tức là khác với màn hình mà tôi có thiết bị đầu cuối mở để tôi có thể xem gỡ lỗi trên một màn hình và có ứng dụng trên một cái khác).

Tôi làm cách nào để thực hiện việc này? Một cái gì đó như:

./myProject > but run on monitor 2 

Ở đâu myProject là tệp nhị phân thực thi của tôi.

Cảm ơn tất cả.

+1

Hãy chỉ định đây có phải là ứng dụng đồ họa hay không, một giao diện điều khiển đơn giản và liệu điều này có sử dụng bất kỳ bộ công cụ nào như ncurses hay không. –

+1

Điều này sẽ phụ thuộc vào trình quản lý cửa sổ của bạn và cách nó chọn vị trí hiển thị cửa sổ mới. – chepner

+1

Khi bạn nói chạy tập tin thực thi của tôi trên màn hình khác. Tôi có hiểu chính xác, ứng dụng của bạn là ứng dụng dựa trên GUI không? bash không liên quan gì đến việc định vị trong trường hợp đó. Thư viện bạn đang sử dụng để tạo cửa sổ có thể có một số phương pháp để khóa vị trí cửa sổ. –

Trả lời

7

Nếu bạn chạy màn hình riêng biệt trên mỗi màn hình (ít có khả năng những ngày này), biến DISPLAY môi trường là những gì bạn muốn.

Nếu bạn sử dụng Xinerama (lây lan một màn logic trên nhiều màn hình), tuy nhiên:

  • Ngoài: X11 từ vựng: Một "hiển thị" là một hoặc nhiều "màn hình" với các thiết bị đầu vào; ví dụ. bàn phím và chuột, a.k.a. là "chỗ ngồi". Một "màn hình" là một khung hợp lý được hiển thị một phần hoặc toàn bộ trên một hoặc nhiều "màn hình"; khi sử dụng nhiều màn hình cho một "màn hình", các cửa sổ có thể được hiển thị một phần trên mỗi màn hình, nhưng chia sẻ cùng một mã định danh X11 DISPLAY; đây được gọi là Xinerama.Định dạng DISPLAYmáy chủ:display-number.screen-id, do đó, ví dụ: trên thiết lập Xinerama của tôi, cả hai màn hình đều là một phần của màn hình 0 trên số hiển thị đếm từ 0 với mỗi người dùng đã đăng nhập trên cùng một máy chủ. "Ghế" là các nhóm hợp lý của màn hình + đầu vào đang sử dụng phần cứng khác nhau; nhiều "hiển thị" có thể xảy ra bằng cách sử dụng chuyển đổi "bảng điều khiển ảo", đó là cách Gnome và KDE cho phép nhiều người dùng đăng nhập trên một máy "ghế" duy nhất.

Hầu hết các bộ công cụ GUI cho phép bạn chỉ định hình ảnh của cửa sổ bằng cách sử dụng công tắc --geometry hoặc -geometry.

  • Qt sử dụng biểu mẫu MIT cũ hơn -geometry. GTK +/Gnome sử dụng kiểu --geometry theo kiểu GNU.

  • Giả định rằng bạn cho phép Qt xử lý dòng lệnh của bạn, ví dụ: chuyển số argv vào QtApplication hoặc tương tự.

"hiển thị logic" sẽ có độ phân giải là tổng các độ phân giải theo mỗi hướng sắp xếp màn hình của bạn. Ví dụ, tôi có màn hình 2 × 1920 × 1080 được nối ngay bây giờ. xrandr báo cáo:

Screen 0: minimum 320 x 200, current 3840 x 1080, maximum 8192 x 8192 

Để hiển thị một cửa sổ trên màn hình bên phải, tôi có thể cung cấp cho một chuỗi hình học có của nó x phối hợp giữa những năm 1920 ... 3839 (bao gồm).

Định dạng thông thường là: rộngxchiều cao±x-bù đắp±y bù đắp - nhưng chiều rộng và chiều cao là không bắt buộc, nếu bạn thích để có những giá trị mặc định. Số ±+ để tính tương đối so với trên cùng/bên trái hoặc - để tính tương đối so với dưới cùng/phải.

Vì vậy, ví dụ:

gedit --geometry 800x600+1920+0 # set size at top-left of right screen 
gedit --geometry +1920+100  # default size at top-left of right screen 
gedit --geometry -0+0   # default size at top-right of entire display 

Thật không may, chỉ tính chương trình Con đường tôi biết để xác định diện tích màn hình hiển thị trên mỗi màn hình từ vỏ sẽ được phân tích đầu ra từ xrandr; ví dụ.

$ xrandr 
Screen 0: minimum 320 x 200, current 3840 x 1080, maximum 8192 x 8192 
LVDS1 connected (normal left inverted right x axis y axis) 
    1366x768  60.0 + 
    1024x768  60.0 
    800x600  60.3  56.2 
    640x480  59.9 
VGA1 connected primary 1920x1080+0+0 (normal left inverted right x axis y axis) 510mm x 287mm 
    1920x1080  60.0*+ 
    1680x1050  60.0 
    1280x1024  60.0 
    1440x900  59.9 
    1280x720  60.0 
    1024x768  60.0 
    800x600  60.3 
    640x480  60.0 
    720x400  70.1 
HDMI1 connected 1920x1080+1920+0 (normal left inverted right x axis y axis) 510mm x 287mm 
    1920x1080  60.0*+ 
    1680x1050  59.9 
    1280x1024  60.0 
    1440x900  59.9 
    1280x720  60.0 
    1024x768  60.0 
    800x600  60.3 
    640x480  60.0 
    720x400  70.1 
DP1 disconnected (normal left inverted right x axis y axis) 

$ xrandr | perl -ne 'if (/(\d+)x(\d+)\+(\d+)\+(\d+)/) '\ 
> ' { print "$3,$4 - ", $3 + $1 - 1, ",", $4 + $2 - 1, "\n" }' 
0,0 - 1919,1079 
1920,0 - 3839,1079 

(Bạn sẽ thường muốn tránh tách Perl one-liner giữa hai dòng trong vỏ, nhưng '\ ... ' lừa có để làm cho nó dễ đọc trên SO.)

+1

Như tôi đã đề cập đến John, tôi dường như không có màn hình hiển thị: 0.1 (mặc dù tôi có hai màn hình). máy tính để bàn của tôi được lan truyền trên cả hai màn hình (nếu tôi hiểu lời giải thích của bạn), điều này có nghĩa là tôi chỉ có một màn hình –

+0

Sử dụng gedit Tôi có thể sử dụng --display = DISPLAY, nhưng tôi không thể sử dụng tùy chọn --geometry ... Chỉ có không có !, nhưng tôi nghĩ rằng bạn là đúng vì tôi dường như nhớ lại bằng cách sử dụng nó một lần trong quá khứ và tôi có thể xem các ví dụ google của nó.Tôi có ubuntu 10.04, vì vậy đây là khá cũ (những người làm việc không phải là rất sẵn sàng để di chuyển trên: (() .Nhưng ultimatley ứng dụng Qt của tôi không hỗ trợ bất kỳ tùy chọn nào của loại này, vì vậy tôi cho rằng tôi sẽ phải thực hiện chúng? - Không có lệnh bash cho trình khởi chạy (err ... kernel ?) nơi để đặt cửa sổ? –

+0

Cuối cùng ... cảm ơn lời giải thích chi tiết của bạn .. nếu tôi có thể chuyển sang Ubuntu 12 hoặc thậm chí 13 Tôi nghĩ rằng các tùy chọn này có thể hoạt động :) –

4

Sử dụng một fifo

mở một cửa sổ terminal trên màn hình bạn muốn đầu ra để xuất hiện trên và làm

mkfifo /tmp/myfifo 
cat /tmp/myfifo 

sau đó trên thiết bị đầu cuối nguồn làm

./myProject >/tmp/myfifo 

này giả định nó là một ứng dụng giao diện điều khiển. Nếu nó là đồ họa thì bạn sẽ cần một cách tiếp cận khác, điều này sẽ phụ thuộc vào bộ công cụ quản lý cửa sổ + bạn đang sử dụng.

+1

hmm ... rất tuyệt, nhưng không hoàn toàn là những gì tôi muốn, ứng dụng của tôi là GUI ... infact cho phép chỉ nói gedit hoặc xemacs hoặc somthing của nó và tôi muốn mở nó trên màn hình khác. Tôi đang sử dụng Ubuntu (nếu điều đó giúp?) –

+0

Không sử dụng ubuntu trong một thời gian. Bạn đã sử dụng để có thể kiểm soát mọi thứ bằng cách đặt 'DISPLAY', ví dụ: 'export DISPLAY =: 0.1; ./ myProject' (cần phải chơi với các con số), nhưng điều đó có thể không hoạt động với đa màn hình những ngày này. –

0

Khi ứng dụng của bạn sử dụng QT, có thể bạn đang sử dụng KDE. Trong System Settings > Window Behavior > Advanced, đặt Placement thành Under Mouse. Nhấp vào màn hình mong muốn, ALT + Tab để chuyển sang thiết bị đầu cuối của bạn và bắt đầu chương trình.

+1

Tôi không có KDE, nhưng tôi đã tìm kiếm một tùy chọn tương tự ... không thành công: (... Tôi có Ubuntu với gnome –

3

Tất cả những gì bạn cần làm là đặt biến môi trường DISPLAY trước khi chạy ứng dụng của bạn.

Để tìm hiểu những gì bạn cần phải đặt nó vào, chạy lệnh sau đây trên màn hình bạn muốn nó hiển thị trên:

echo $DISPLAY 

Bạn nên xem, ví dụ :0.1 hoặc :0.0.

Sau đó, bạn có thể xác định rằng bạn muốn ứng dụng của bạn để chạy trên màn hình mà như vậy:

DISPLAY=:0.1 ./my_app 
+3

Cảm ơn vì điều đó ... Tôi nghĩ rằng nó sẽ có hiệu quả, nhưng khi tôi thử nó Tôi dường như không có màn hình 0.1: Tôi có hai màn hình với máy tính để bàn của tôi trải rộng trên cả hai vì vậy chúng không phải là màn hình riêng biệt.Có lẽ nếu tôi sử dụng "máy tính để bàn đôi" thay vì "lây lan" thì điều này sẽ làm việc: ( –

2

Các --geometry câu trả lời được đưa ra ở trên và được chấp nhận đơn giản sẽ không hoạt động trong nhiều trường hợp ...

Có rất nhiều câu hỏi gần như giống hệt như thế này xung quanh các trang web StackExchange khác nhau & AskUbuntu, câu trả lời cuối cùng tôi đã tìm thấy (trên một Linux Mint distro dựa trên Ubuntu 14.04) là sử dụng wmctrl. Tôi đang để lại một câu trả lời chỉ vì không ai khác đã đề cập đến nó trên chủ đề này.

(Có một gọi Devil's Pie và khác gọi Compiz nếu bạn tìm kiếm những người quá bạn sẽ tìm thấy Q & Một của tôi đang nói về)

wmctrl là các loại công cụ unix đơn giản có thể là bạn đang tìm kiếm nếu bạn viết kịch bản Bash. Tôi cũng thấy ai đó đề xuất sử dụng xdotool, phụ thuộc vào mục tiêu cụ thể là gì.

wmctrl cung cấp phù hợp với cửa sổ theo tiêu đề cửa sổ hay pid (không tương thích với tất cả các loại cửa sổ X-quản lý)

Một số tài nguyên hữu ích:

tôi kết nối một màn hình thứ hai bên trái hoặc bên phải tùy thuộc vào nơi tôi đang làm việc mỗi ngày, và tôi nghĩ rằng giải pháp đối với tôi sẽ liên quan đến

  • tìm kích thước từ xrandr (như thể hiện trong câu trả lời BRPocock 's),
  • phân tích đó để nói đó là Exter màn hình được kết nối với nal (VGA/HDMI, v.v.) thay vì màn hình được kết nối sẵn,
  • chỉ định thứ nguyên để cung cấp cho cửa sổ tối đa trên màn hình được kết nối (tức là phần bù đắp bên trái/bên phải/trên cùng/dưới cùng, sẽ thay đổi theo bên màn hình đang được sử dụng)

Để lại ghi chú và [cuối cùng] một số mã được tạo ra here trong trường hợp nó hữu ích cho bất kỳ ai khác.