XFCE-在按键时将窗口发送到其他监视器


27

我正在使用双监视器设置运行Xubuntu 11.10。我想创建一个按键(也许是CTRL+ ALT+ SPACE,这将允许我将选定的窗口发送到下一台显示器。

在GNOME中,有一个名为的软件包swapmonitor,该软件包能够将窗口发送到另一个监视器。通过按键调用该程序可获得相同的效果。

如何在XFCE / Xubuntu中完成?


您没有进入swapmonitorXubuntu的权限吗?还是您在问如何为其设置键盘快捷键?
ire_and_curses 2012年

它似乎在XFCE上不起作用。虽然我想知道那里有什么选择。
boffin 2012年

您如何设置多台显示器?作为大型虚拟屏幕还是单独的X显示屏?您在使用nvidia twinview吗?
Keith 2012年

是TwinView。我有一张带有2个戴尔19英寸显示器的旧Nvidia GeForce卡
棺材2012年

Answers:


27

这是前一段时间发布的,我相信您已经得到了答案,但是对于那些还没有的人。

运行这些命令

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

然后从以下链接下载bash脚本(贷记至jc00ke) https://github.com/jc00ke/move-to-next-monitor

就个人而言,我的根目录中有一个目录,用于存储所有个人脚本。但是,实际下载位置由您自己决定。将其更改为具有权限,以便您可以执行。例如,将脚本另存为move-to-next-monitor.sh,然后执行以下命令

chmod 755 move-to-next-monitor.sh
  1. 设置管理器->键盘->应用程序快捷方式
  2. 点击添加
  3. 单击打开并将其定向到您的脚本
  4. 给它分配一个键盘快捷键,瞧瞧!

现在,您有了键盘快捷键,可以将一个窗口从一个屏幕切换到另一个屏幕。我不确定如何在2个以上的屏幕上运行。


链接的脚本对我来说有这个问题:github.com/jc00ke/bin/issues/1
thejoshwolfe

1
到目前为止,我可以使用Mint 17.3和xfce 4.12,ati芯片组视频卡和三台显示器正常工作。在我的系统上没有看到thejoshwolfe的最大化问题。感谢您的提示!
ether_joe

1
@thejoshwolfe我添加了自己的脚本版本,该脚本可以为我解决最大化问题。
jbrock '16

1
@ether_joe我添加了我的脚本版本,如果您有三个监视器,这可能会使您受益。
jbrock '16

我在xfce中,这东西很邪恶。它只会将窗口从左侧监视器移到右侧,并且曾经使我的桌面处于一种非常奇怪的状态。
Sava B.

10

我对上面提到的最初由jc00ke编写的脚本进行了一些更改。
-地雷设置为三台显示器。
-保持窗口是否最大化。
-它用于分别与用法script-name -l和来左右移动窗口script-name -r
-我添加了一个修复程序,其中Chromium应用程序最小化时很小,并且不会在新显示器上再次最大化。
我对应于jc00ke。尽管这在Xfce上效果很好,但他说他在Unity中的脚本有问题。当然,其他桌面环境(例如Unity)将不需要此脚本,因为此类选项内置在窗口管理器中。
要使用该脚本,使其可执行,chmod +x script-name并安装以下两个程序sudo apt-get install xdotool wmctrl

#!/bin/bash
#
# Move the current window to the next monitor.
#
# Also works only on one X screen (which is the most common case).
#
# Props to
# http://icyrock.com/blog/2012/05/xubuntu-moving-windows-between-monitors/
#
# Unfortunately, both "xdotool getwindowgeometry --shell $window_id" and
# checking "-geometry" of "xwininfo -id $window_id" are not sufficient, as
# the first command does not respect panel/decoration offsets and the second
# will sometimes give a "-0-0" geometry. This is why we resort to "xwininfo".

screen_width=$(xdpyinfo | awk -F" |x" '/dimensions:/ { print $7 }')
screen_height=$(xdpyinfo | awk -F" |x" '/dimensions:/ { print $8 }')
window_id=$(xdotool getactivewindow)

case $1 in
    -l )
        display_width=$((screen_width / 3 * 2)) ;;
    -r )
        display_width=$((screen_width / 3)) ;;
esac

# Remember if it was maximized.
window_state=$(xprop -id $window_id _NET_WM_STATE | awk '{ print $3 }')

# Un-maximize current window so that we can move it
wmctrl -ir $window_id -b remove,maximized_vert,maximized_horz

# Read window position
x=$(xwininfo -id $window_id | awk '/Absolute upper-left X:/ { print $4 }')
y=$(xwininfo -id $window_id | awk '/Absolute upper-left Y:/ { print $4 }')

# Subtract any offsets caused by window decorations and panels
x_offset=$(xwininfo -id $window_id | awk '/Relative upper-left X:/ { print $4 }')
y_offset=$(xwininfo -id $window_id | awk '/Relative upper-left Y:/ { print $4 }')
x=$((x - x_offset))
y=$((y - y_offset))

# Fix Chromium app view issue of small un-maximized size
width=$(xdotool getwindowgeometry $window_id | awk -F" |x" '/Geometry:/ { print $4 }')
if [ "$width" -lt "150" ]; then
  display_width=$((display_width + 150))
fi

# Compute new X position
new_x=$((x + display_width))
# Compute new Y position
new_y=$((y + screen_height))

# If we would move off the right-most monitor, we set it to the left one.
# We also respect the window's width here: moving a window off more than half its width won't happen.
if [ $((new_x + width / 2)) -gt $screen_width ]; then
  new_x=$((new_x - screen_width))
fi

height=$(xdotool getwindowgeometry $window_id | awk -F" |x" '/Geometry:/ { print $5 }')
if [ $((new_y + height / 2)) -gt $screen_height ]; then
  new_y=$((new_y - screen_height))
fi

# Don't move off the left side.
if [ $new_x -lt 0 ]; then
  new_x=0
fi

# Don't move off the bottom
if [ $new_y -lt 0 ]; then
  new_y=0
fi

# Move the window
xdotool windowmove $window_id $new_x $new_y

# Maintain if window was maximized or not
if [ "${window_state}" = "_NET_WM_STATE_MAXIMIZED_HORZ," ]; then
    wmctrl -ir $window_id -b add,maximized_vert,maximized_horz
fi

7

我还创建了自己的python脚本来在监视器之间移动窗口。

https://github.com/calandoa/movescreen

用法:

movescreen.py <up|down|left|right>

有趣的功能:

  • 处理4个方向
  • 处理一些特殊情况,例如在多个监视器上重叠的窗口
  • 全屏独立恢复,最大化水平垂直状态
  • 使用python轻松调试或添加新功能。

1

另一个不依赖任何“二进制”依赖项的替代方法(如xdotool或wmctrl):https : //github.com/AlexisBRENON/ewmh_m2m

  • 您可以使用进行安装pip(无需手动复制,使其可执行等)。
  • 它可以处理具有不同布局(水平,垂直,混合)的多个屏幕
  • 在不同尺寸的屏幕之间移动时,保持窗口/屏幕比例
  • 恢复最大化状态(水平,垂直)

类。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.