我想做什么以及原因
我希望我的窗口失去焦点,所以先前聚焦的窗口被选中。
为什么?我想要与先前从其他程序选择的窗口进行交互。我的当前计划是:使我的窗口失去焦点,使用libxdo
模拟按键,然后再次聚焦我的窗口。
我的窗口可以设置在顶部,以帮助避免闪烁。应该足够简单。但是我无法使它工作。
我迄今为止尝试过的内容
使用Gtk.Widget.hide()
隐藏窗口,然后再次显示它:该窗口会闪烁太多,并且稍微向上移动了几个像素(可能是由于窗口管理器的顽固性)。
示例测试代码
当前代码调用Gtk.Window.set_focus(None)
,无法正常工作。我需要将那行替换为其他可以实现我想要的功能的代码。
losefocus.py
:
import signal
from gi import require_version
require_version('Gtk', '3.0')
from gi.repository import GLib, Gtk, GObject
class LoseFocusHandler:
def onClick(self, window):
print "Losing focus yet?"
window1 = builder.get_object("window1")
window1.set_focus(None)
if __name__ == "__main__":
GObject.threads_init()
builder = Gtk.Builder()
builder.add_from_file("losefocus.glade")
builder.connect_signals(LoseFocusHandler())
window1 = builder.get_object("window1")
window1.show_all()
signal.signal(signal.SIGINT, signal.SIG_DFL)
Gtk.main()
losefocus.glade
:
<?xml version="1.0" encoding="UTF-8"?>
<!-- Generated with glade 3.16.1 -->
<interface>
<requires lib="gtk+" version="3.10"/>
<object class="GtkWindow" id="window1">
<property name="can_focus">False</property>
<property name="window_position">center-always</property>
<property name="gravity">center</property>
<child>
<object class="GtkButton" id="button1">
<property name="label" translatable="yes">Lose Focus!</property>
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="receives_default">True</property>
<property name="relief">half</property>
<signal name="clicked" handler="onClick" swapped="no"/>
</object>
</child>
</object>
</interface>
focus()
方法调用适当的Xlib命令,在Cinnamon中运行良好。我发现有些页面声称您可以使用CCSM →常规选项→焦点和提升行为来调整设置。 - Phillipxdotool
也可以胜任。 (我[使用脚本将密码粘贴到活动窗口中](https://github.com/phillipberndt/scripts/blob/master/passwrd/passwrd.py),您可能可以重用其中的部分。) - Phillip