有没有办法使用终端在各种窗口上模拟“关闭”事件?

有没有办法使用终端在各种窗口上模拟“关闭”事件?

我在 Ask Ubuntu 上回答过gnome-terminal通过命令退出所有实例但正如你们都可以读到的那样,gnome-terminal似乎没有一个SIG电话可以用来模拟这个“关闭”事件。所以这让我问,GNOME/KDE/LXDE/{将您的窗口/桌面管理器/环境放在这里}有没有办法模拟“单击关闭按钮”事件?我有 不同的 问题 可能与此有任何关系,但不要回答此问题。

我正在寻找的是全球的命令(如果存在)在不同的场景中执行此操作。如果不存在,请解释“关闭”按钮的工作原理。

可能的用途:

答案1

我相信相关的手册页是,XKillClient。您可以使用xdotool模拟从终端单击关闭按钮,如下所示。

例子

假设我有一个gnome-terminal打开的文件,它的名称是“saml@grinchy:/home”。

  1. 获取窗口ID

    $ xdotool search --name "saml@grinchy:/home"
    96488188
    
  2. 发送一个Alt+F4

    $ xdotool windowactivate --sync 96488188 key --clearmodifiers \
         --delay 100 alt+F4
    

您可以通过将第一个命令嵌入到第二个命令中将它们放在一起:

$ xdotool windowactivate --sync $( ...1st command...) key --clearmodifiers \
         --delay 100 alt+F4

xdotool你可以通过同时做这两件事来拯救自己:

$ xdotool search --name "saml@grinchy:~" key alt+f4

全球范围

您可以调整我提供的内容以在具有相同名称的 Windows 上运行它:

$ xdotool search --name "saml@grinchy:~"
96488779
96468996

或者在 Windows 上通过其他属性。您可以使用xwininfo来查找有关特定窗口的更多信息。运行它,然后只需单击感兴趣的窗口:

$ xwininfo

xwininfo: Please select the window about which you
          would like information by clicking the
          mouse in that window.

xwininfo: Window id: 0x5c04d4b "saml@grinchy:~"

  Absolute upper-left X:  14
  Absolute upper-left Y:  74
  Relative upper-left X:  14
  Relative upper-left Y:  74
  Width: 941
  Height: 361
  Depth: 32
  Visual: 0x62
  Visual Class: TrueColor
  Border width: 0
  Class: InputOutput
  Colormap: 0x5c00003 (not installed)
  Bit Gravity State: NorthWestGravity
  Window Gravity State: NorthWestGravity
  Backing Store State: NotUseful
  Save Under State: no
  Map State: IsViewable
  Override Redirect State: no
  Corners:  +14+74  -485+74  -485-465  +14-465
  -geometry 132x24+14+74

处理 X11 窗口时的其他有用工具是xdpyinfo& xpropxdpyinfo可用于查找有关 X 服务器的信息。这样你就可以找出哪个窗口具有焦点:

$ xdpyinfo |grep focus
focus:  window 0x5c00005, revert to Parent

xprop并且xwininfo可以进行-id切换,以便您可以向他们提供您感兴趣的窗口 ID,而不必单击它:

$ xprop -id 0x5c00001|grep -i class
WM_CLASS(STRING) = "gnome-terminal", "Gnome-terminal"

参考

答案2

我发现xdotool它很不稳定/有缺陷,有时它会关闭前台窗口而不是应该关闭的窗口。这似乎是由于将窗口带到前台后发送按键的方式而不是直接发送窗口事件,这是一个非常烦人的问题。我建议使用wmctrl,它直接关闭窗口而不发送击键。

您可以通过匹配名称直接关闭窗口,例如,这两者都会关闭“Untitled Document 1 - gedit”窗口:

wmctrl -c "gedit"
wmctrl -c "Untitled"

您可以使用该-F选项仅考虑完全匹配:

wmctrl -F -c "Untitled Document 1 - gedit"

或者你可以直接给出 id:

wmctrl -i -c "121634821"

更多使用示例/文档可以找到这里

我确实发现非常有用的一件事是xdotool能够等待使用--sync参数得到结果。将两个命令组合成一个命令是这样完成的:

xdotool search --sync --name "gedit" | xargs wmctrl -i -c

如果您使用的是 Mac,您可能需要以下-I{}参数:

xdotool search --sync --name "gedit" | xargs -I{} wmctrl -i -c {}

如果你想支持多个窗口,你应该告诉xargs每次wmctrl调用时最多使用 1 个参数-nwmctrl不明确支持多个窗口作为参数:

xdotool search --sync --name "gedit" | xargs -I{} -n 1 wmctrl -i -c {}

这将等到至少有 1 个这样的窗口,然后关闭所有窗口。

答案3

pkill(1) 应该是你所需要的。

相关内容