如何在 Linux 上散焦(模糊)Python-gi GTK+3 window
How to unfocus (blur) Python-gi GTK+3 window on Linux
我想做什么以及为什么
我想让我的window不聚焦,所以选择了之前聚焦的window。
为什么?我想与之前选择的 window(来自其他程序)进行交互。我目前的计划是:取消 window 的焦点,使用 libxdo
模拟击键,然后再次聚焦 window。
我的 window 可以设置在顶部以帮助避免闪烁。应该够好了。对我来说看起来很简单。但是我无法让它工作。
到目前为止我尝试了什么
用Gtk.Widget.hide()
隐藏window,然后再次显示:window闪烁太多,它稍微移动了一些像素到顶部(因为window我猜是经理的固执)。
示例测试代码
当前代码调用 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>
一个简单的解决方案是在创建 window 和每个 focus-in-event
时记录之前关注哪个 window,并明确关注 window而不是试图分散活跃的注意力:
import signal
from gi import require_version
require_version('Gtk', '3.0')
from gi.repository import GLib, Gdk, Gtk, GObject
class LoseFocusHandler:
def onClick(self, window):
print "Losing focus yet?"
old_window[0].focus(0)
def focus_handler(gdk_window, event):
# At this point, our window does not have focus yet, but is
# about to. This hence works:
old_window[0] = gdk_window.get_screen().get_active_window()
if __name__ == "__main__":
GObject.threads_init()
old_window = [ Gdk.Screen.get_default().get_active_window() ]
builder = Gtk.Builder()
builder.add_from_file("losefocus.glade")
builder.connect_signals(LoseFocusHandler())
window1 = builder.get_object("window1")
window1.connect("focus-in-event", focus_handler)
window1.show_all()
signal.signal(signal.SIGINT, signal.SIG_DFL)
Gtk.main()
我想做什么以及为什么
我想让我的window不聚焦,所以选择了之前聚焦的window。
为什么?我想与之前选择的 window(来自其他程序)进行交互。我目前的计划是:取消 window 的焦点,使用 libxdo
模拟击键,然后再次聚焦 window。
我的 window 可以设置在顶部以帮助避免闪烁。应该够好了。对我来说看起来很简单。但是我无法让它工作。
到目前为止我尝试了什么
用Gtk.Widget.hide()
隐藏window,然后再次显示:window闪烁太多,它稍微移动了一些像素到顶部(因为window我猜是经理的固执)。
示例测试代码
当前代码调用 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>
一个简单的解决方案是在创建 window 和每个 focus-in-event
时记录之前关注哪个 window,并明确关注 window而不是试图分散活跃的注意力:
import signal
from gi import require_version
require_version('Gtk', '3.0')
from gi.repository import GLib, Gdk, Gtk, GObject
class LoseFocusHandler:
def onClick(self, window):
print "Losing focus yet?"
old_window[0].focus(0)
def focus_handler(gdk_window, event):
# At this point, our window does not have focus yet, but is
# about to. This hence works:
old_window[0] = gdk_window.get_screen().get_active_window()
if __name__ == "__main__":
GObject.threads_init()
old_window = [ Gdk.Screen.get_default().get_active_window() ]
builder = Gtk.Builder()
builder.add_from_file("losefocus.glade")
builder.connect_signals(LoseFocusHandler())
window1 = builder.get_object("window1")
window1.connect("focus-in-event", focus_handler)
window1.show_all()
signal.signal(signal.SIGINT, signal.SIG_DFL)
Gtk.main()