在特定监视器上启动应用程序

我有Ubuntu 14.04和两台显示器。 当我打开应用程序时,我需要将其中一些放在主监视器上,而将其他放在辅助监视器上。
目前,应用程序始终在主监视器中打开。

我只在一个(左)显示屏上显示短划线图标,因此我无法使用Compiz中的光标或活动窗口设置启动应用程序。

这是一个启动脚本或至少一个可以绑定到第一次启动窗口的快捷方式的脚本的想法:

步骤1

找出你的根窗口宽度和高度。 这可以用来完成

xwininfo -root | awk '/Width/,/Height/ {print}'

要么

xprop -root | awk '$1~/NET_DESKTOP_GEOMETRY/ {print }

样本输出如下

 $ xwininfo -root | awk '/Width/,/Height/ {print}' Width: 1366 Height: 768 $ xprop -root | awk '$1~/NET_DESKTOP_GEOMETRY/ {print}' _NET_DESKTOP_GEOMETRY(CARDINAL) = 1366, 768 

第2步

使用sudo apt-get install wmctrl

此工具允许通过引用其hexID或窗口标题来更改某些窗口属性。 我已经解释了它是如何工作的另一个问题,我将在后面链接

步骤3~/bin文件夹或路径中的某个位置创建此脚本。 您还可以绑定此脚本的完整路径以快捷方式或创建.desktop快捷方式。 请注意,由于我的屏幕是1366 x 768,我使用1300作为我的最大右侧x偏移。 根据步骤1中的规范调整脚本。请注意,如果您有重复的窗口,这可能会中断,所以这对于第一次启动两个程序窗口很有用

 #!/bin/sh # Author: Serg Kolo # Description: Send two different applications to different windows set -x LEFT=$(zenity --entry --text="What to put on the left?") RIGHT=$(zenity --entry --text="What to put on the right?") $LEFT & $RIGHT & sleep 1 if [ $? -eq 0 ]; then # Get title of the left window LEFT_TITLE="$(wmctrl -l | grep -i $LEFT | awk '{$1=$2=$3="";print}')" # Get title of the right window RIGHT_TITLE="$(wmctrl -l | grep -i $RIGHT | awk '{$1=$2=$3="";print }')" printf "THIS IS A TEST %s",$LEFT_TITLE printf "THIS IS A TEST 2 %s",$RIGHT_TITLE wmctrl -r $LEFT_TITLE -e 0,0,0,600,600 sleep 0.5 wmctrl -r $RIGHT_TITLE -e 0,1300,0,600,600 fi 

现在,您可以调整此脚本以仅作为一个窗口的启动器,并指定您是希望它位于右侧还是左侧。 我将在当天晚些时候研究这个想法,但基本的想法是再次使用两个弹出窗口和if语句。 我的另一个想法是使用awk从单个弹出窗口中提取相关信息。 完成脚本后,我将编辑我的答案

编辑

这是单窗口的发射器; 输入programname,L表示左侧放置, programname,R表示右侧放置

 #!/bin/sh # set -x PROG=$(zenity --entry --text="Program,L or R ?") NAME=$(echo $PROG | cut -d ',' -f1) SIDE=$(echo $PROG | cut -d ',' -f2) $NAME & sleep 1 if [ $? -eq 0 ] then TITLE=$( wmctrl -l | grep -i $NAME| awk '{$1=$2=$3=""; print}' ) sleep 0.5 if [ $SIDE = "L" ];then wmctrl -r $TITLE -e 0,0,0,600,600 else wmctrl -r $TITLE -e 0,1300,0,600,600 fi fi 

以下解决方案的工作原理如下:

  1. 按组合键
  2. 在15秒内启动的第一个应用程序将从屏幕1开始

要么:

  1. 按(另一个)组合键
  2. 在15秒内启动的第一个应用程序将在屏幕2上开始

换句话说:您需要两个组合键以确保在第一个或第二个屏幕上显示新的应用程序窗口。

如何设置

该脚本使用xdotoolwmctrl

 sudo apt-get install xdotool sudo apt-get install wmctrl 

然后:

  1. 将下面的脚本复制到一个空文件中,将其保存为~/bin preferred_screen (无扩展名)。 必要时创建目录。
  2. 使脚本可执行
  3. 在head部分,设置左侧屏幕的水平分辨率(我已经为你设置了1600)
  4. 如果您刚刚创建了目录~bin ,请在终端中运行:

     source ~/.profile 
  5. 通过在终端窗口中运行命令来测试运行脚本:

     preferred_screen 1 

    现在打开一个(任何)应用程序,它应该在第一个屏幕上打开

    使用以下命令重复该步骤:

     preferred_screen 2 

    现在应用程序在第二个屏幕上打开。

  6. 如果一切正常,请将两个命令添加到两个不同的组合键:选择:系统设置>“键盘”>“快捷方式”>“自定义快捷方式”。 单击“+”并添加命令:

     preferred_screen 1 preferred_screen 2 

剧本

 #!/usr/bin/env python3 import subprocess import time import sys #--- enter the horizontal resolution of the left screen below left_width = 1600 #--- target_screen = int(sys.argv[1]) get = lambda cmd: subprocess.check_output(cmd).decode("utf-8") def new_window(left_width): w_list1 = get(["wmctrl", "-lG"]).splitlines() while True: time.sleep(1) w_list2 = get(["wmctrl", "-lG"]).splitlines() new = [w.split() for w in w_list2 if not w in w_list1] if len(new) != 0: data = new[0] pos = 1 if int(data[2]) < left_width else 2 coords = data[2:4] w_id = data[0] return [w_id, pos, coords] break subject = new_window(left_width) if not int(subject[1]) == target_screen: move = -left_width if target_screen == 1 else left_width - int(subject[2][0]) subprocess.Popen(["xdotool", "windowmove", subject[0], str(int(subject[2][0])+move), subject[2][1]]) 

说明

在这种情况下,突破启动过程本身对我来说似乎并不是一个干净的解决方案,因此下面的解决方案适用于“偶然”基础(仅当您从组合键调用它时)。

如果调用该脚本,它将等待15秒以显示新窗口并将其移动到右侧或左侧屏幕(如果它尚未在目标屏幕上)并随后终止。 15秒后,它会终止,以防止在没有窗口出现时无限运行。

注意

该脚本假定屏幕排在最前面。 如果存在很大差异,脚本可能需要稍微调整以防止窗口“碰撞”另一个屏幕的边框。