在 GNOME 中强制聚焦新窗口

在 GNOME 中强制聚焦新窗口

我正在运行带有两个显示器的 Ubuntu 18.04。

我使用 Atom IDEatom-python-运行运行命令的包

 python3 {filename} 

只需按一下按钮即可。这将打开一个新的终端窗口。但是该窗口没有焦点,并且被埋在所有其他窗口之下,迫使我使用 Alt-Tab 键来访问它。

如何强制新打开的终端获得焦点?

我尝试使用dconf-editor设置焦点新窗口设置org.gnome.desktop.wm.preferences严格的,但并没有解决问题。

答案1

一般来说,您需要安装一个扩展来消除 gnome-shell 中的行为,其中 gnome 显示“窗口已准备好”通知而不是将焦点放在新窗口上。扩展“Noannoyance”似乎是维护得最好的,但“Steal My Focus”或“Focus my window”可能也可以正常工作。

答案2

更新 Atom 软件包autocomplete-clang立即解决了这个问题。我无话可说。

答案3

NoAnnoyance 或 Steal my focus 无法完美运行 - 当我打开另一个 Libre Office 窗口时,它无法获得焦点。我编写了一个脚本来解决这个问题。运行此脚本后,焦点便如我想象的那样工作了。

先决条件:wmctrl

启动脚本:sh -c "sleep 1; focus &"

文件/usr/local/bin/focus

#!/bin/bash

getLinesWithOccurences()
{
  local a=$1
  local b=$2
  local occurences=$3
  
  {
    echo "$a"
    echo "$b"
  } |
        sort |
        uniq -c |
        grep -E "^\s*$occurences" |
    sed -r "s|^\s*$occurences\s*||"
}

getUniqueLines()
{
  getLinesWithOccurences "$1" "$2" 1
}

getCommonLines()
{
  getLinesWithOccurences "$1" "$2" 2
}

getWindowIds()
{
    wmctrl -l |
        sed -r "s|^([^ ]*).*$|\1|"
}


old=`getWindowIds`

while sleep 0.1
do
    new=`getWindowIds`
    
    unique=`getUniqueLines "$old" "$new"`
    common=`getCommonLines "$unique" "$new"`
    
    toActivate=""
    
    for item in $common
    do
        toActivate=$item
        break
    done
    
    if [[ "$toActivate" != "" ]]
    then
    read name < <(
        wmctrl -l |
        grep -E "^$toActivate" |
        head -n 1 |
        sed -r "s|^([^ ]*\s*){3}||"
    )
    
        if [[
            ! "$name" =~ "Panel" &&
            ! "$name" =~ "Desktop" &&
            ! "$name" =~ "bash" &&
            ! "$name" =~ "Sticky Notes" &&
            ! "$name" =~ "Google Chrome" &&
            ! "$name" =~ "System Monitor"
        ]]
        then
            wmctrl -a $toActivate -i
        fi
    fi
    
    old=$new
done

将这些窗口名称从焦点中排除可以修复在关闭窗口后这些窗口被错误地赋予焦点而不是将焦点返回到先前聚焦的窗口时出现的不良行为。

相关内容