Những gì tôi muốn làm và tại saoLàm thế nào để Không tập trung (mờ) Python-gi GTK + 3 cửa sổ trên Linux
tôi muốn cửa sổ của tôi để Không tập trung, do đó cửa sổ tập trung trước được chọn.
Tại sao? Tôi muốn tương tác với cửa sổ đã chọn trước đó (từ các chương trình khác). Kế hoạch hiện tại của tôi là: không tập trung cửa sổ của tôi, sử dụng libxdo
để mô phỏng các lần nhấn phím, sau đó tập trung lại cửa sổ của tôi.
Cửa sổ của tôi có thể được đặt ở trên cùng để giúp tránh bị rung. Nên đủ tốt. Trông đơn giản với tôi. Nhưng tôi không thể làm cho nó hoạt động được.
Những gì tôi đã cố gắng cho đến nay
Ẩn cửa sổ với Gtk.Widget.hide()
và sau đó hiển thị nó một lần nữa: Cửa sổ thấp thoáng quá nhiều và nó hơi chuyển một số điểm ảnh lên hàng đầu (vì cửa sổ bướng bỉnh người quản lý, tôi giả sử).
kiểm tra mẫu mã
mã hiện gọi Gtk.Window.set_focus(None)
mà không hoạt động. Tôi cần phải thay thế dòng đó bằng thứ gì đó khác khiến tôi muốn nó làm.
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>
Rất thông minh! Cảm ơn vì tiền hỗ trợ. Tuy nhiên, điều này không hoạt động đúng cách, ít nhất là với Unity 7. Cửa sổ trước đó được đánh dấu trong thanh tác vụ nhưng nó không tập trung chút nào. –
Unity có tính năng * chống ăn cắp tập trung *, được kế thừa từ [compiz] (https://bugs.launchpad.net/ubuntu/+source/compiz/+bug/369954/comments/2), được thiết kế để ngăn chương trình thay đổi tiêu điểm nhưng đánh dấu chương trình trong thanh tác vụ thay thế. Phương thức 'focus()' của GDKWindow [gọi lệnh Xlib thích hợp] (https://github.com/GNOME/gtk/blob/master/gdk/x11/gdkwindow-x11.c#L2250), và nó hoạt động tốt Quế. Tôi đã tìm thấy các trang tuyên bố rằng bạn có thể điều chỉnh cài đặt bằng cách sử dụng CCSM → Tùy chọn chung → Tập trung và nâng cao hành vi. – Phillip
Thật không may, tôi cần một cái gì đó hoạt động ra khỏi hộp trên Ubuntu. Tôi muốn gửi tổ hợp phím đến cửa sổ khác. Vì tôi biết cảm ơn bạn về cách lấy ID cửa sổ khác, giờ đây tôi có thể sử dụng lệnh xdo để lấy tiêu điểm trên cửa sổ đó, nhập và sau đó khôi phục tiêu điểm. Tôi đã đăng một ví dụ làm việc tại đây: http://pastebin.com/0BsKYZtP Tôi đã thử sử dụng tính năng xdo để nhập vào một cửa sổ nhất định bằng cách sử dụng ID cửa sổ, nhưng có vẻ như 'XSendEvent' sẽ không hoạt động. Vì vậy, tôi kích hoạt riêng cửa sổ, sau đó nhập và sau đó khôi phục tiêu điểm. Bằng cách đó, tôi chỉ dựa vào 'Xtest' có vẻ hoạt động hoàn hảo. –