在特定显示器上启动应用程序

Fio*_*ona 8 multiple-monitors unity compiz

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

我只有一个(左侧)显示器上有破折号图标,所以我无法使用 Compiz 的光标或活动窗口设置启动应用程序。

Jac*_*ijm 5

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

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

或者:

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

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

如何设置

该脚本同时使用xdotoolwmctrl

sudo apt-get install xdotool
sudo apt-get install wmctrl
Run Code Online (Sandbox Code Playgroud)

然后:

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

    source ~/.profile
    
    Run Code Online (Sandbox Code Playgroud)
  5. 通过在终端窗口中运行以下命令来测试运行脚本:

    preferred_screen 1
    
    Run Code Online (Sandbox Code Playgroud)

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

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

    preferred_screen 2
    
    Run Code Online (Sandbox Code Playgroud)

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

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

    preferred_screen 1
    preferred_screen 2
    
    Run Code Online (Sandbox Code Playgroud)

剧本

sudo apt-get install xdotool
sudo apt-get install wmctrl
Run Code Online (Sandbox Code Playgroud)

解释

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

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

笔记

该脚本假设屏幕顶部对齐。如果差异很大,则脚本可能需要进行一些调整,以防止窗口“碰撞”另一个屏幕的边框。


Ser*_*nyy 3

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

步骤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
Run Code Online (Sandbox Code Playgroud)

第2步

安装wmctrlsudo apt-get install wmctrl

该工具允许通过引用十六进制 ID 或窗口标题来更改某些窗口属性。我已经解释了它如何解决另一个问题,稍后我将链接到这里

步骤 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
Run Code Online (Sandbox Code Playgroud)

现在,您可以调整此脚本,使其仅充当一个窗口的启动器,并指定您希望其位于右侧还是左侧。我将在当天晚些时候研究这个想法,但基本想法是再次使用两个弹出窗口和 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
Run Code Online (Sandbox Code Playgroud)