Compiz“屏幕边缘绑定操作”类似,但没有 Compiz

Compiz“屏幕边缘绑定操作”类似,但没有 Compiz

我希望使用一个工具在鼠标触及屏幕边缘时运行command(或script),但没有 Compiz。Compiz 的“边缘操作”工具是什么样的?我的笔记本电脑不支持 Compiz,所以我正在寻找其他解决方案。

我希望当点击与鼠标 + 按钮相关的屏幕边缘时执行命令,就像 Compiz 功能一样,但没有 Compiz。我尝试了 Brightside,但它不支持边缘运行命令,只支持角落。

答案1

您可以使用xinput --query-state $XIDxdotool getmouselocation来获取鼠标位置。的强大功能xdotool getmouselocation是它的--shell选项,有了它,eval您可以将值分配给变量,而无需将任何输出分成几部分,例如:

$ eval $(xdotool getmouselocation --shell)
$ echo $X, $Y
604, 778

这样我们就可以构建一个while循环来不断测试所需的值,例如:

while :;
do
  eval $(xdotool getmouselocation --shell)
  (( $X <= 20 )) && break
  sleep .1
done

这将运行到$X20 或更少,并每 100 毫秒测试一次。我建议根据你的具体情况构建一个脚本,如下所示:

#!/bin/bash

id=9 # device XID, run xinput without any option to get a list of devices and their IDs
interval=.01 # sleep interval between tests in seconds

# edge areas
# to display the current mouse coordinates run xdotool getmouselocation
# syntax: x_min x_max y_min y_max
e1=(200 1079 0 20)
e2=(1259 1279 200 823)
e3=(200 1079 1003 1023)
e4=(0 20 200 823)

while :; do
  eval $(xdotool getmouselocation --shell)
  if ( [ ${#e1[@]} -ne 0 ] && (( $X >= ${e1[0]} && $X <= ${e1[1]} && $Y >= ${e1[2]} && $Y <= ${e1[3]} )) ); then
    # your commands for edge area e1
    echo "Your mouse was detected inside the monitored area no. 1 at $X, $Y."
    sleep 2
  fi
  if ( [ ${#e2[@]} -ne 0 ] && (( $X >= ${e2[0]} && $X <= ${e2[1]} && $Y >= ${e2[2]} && $Y <= ${e2[3]} )) ); then
    # your commands for edge area e2
    echo "Your mouse was detected inside the monitored area no. 2 at $X, $Y."
    sleep 2
  fi
  if ( [ ${#e3[@]} -ne 0 ] && (( $X >= ${e3[0]} && $X <= ${e3[1]} && $Y >= ${e3[2]} && $Y <= ${e3[3]} )) ); then
    # your commands for edge area e3
    echo "Your mouse was detected inside the monitored area no. 3 at $X, $Y."
    sleep 2
  fi
  if ( [ ${#e4[@]} -ne 0 ] && (( $X >= ${e4[0]} && $X <= ${e4[1]} && $Y >= ${e4[2]} && $Y <= ${e4[3]} )) ); then
    # your commands for edge area e4
    echo "Your mouse was detected inside the monitored area no. 4 at $X, $Y."
    sleep 2
  fi
  sleep $interval
done

我创建了一些边缘区域作为示例,这些区域从角落开始和结束 200px,并覆盖我 1279x1023px 屏幕的边缘 20px 内的区域 - 您需要根据需要进行调整。如果您需要较少的区域,只需删除或注释其他区域即可。您要执行的命令位于ifwhile 函数内的子句中。为了防止将鼠标放在边缘区域内时多次调用,您可以使用sleepbreak或者只是测试相关命令是否已运行。

相关内容