2016-03-16 26 views
5

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> 

Trả lời

1

Một giải pháp đơn giản sẽ được ghi lại mà cửa sổ đã tập trung trước đây, cả hai khi tạo cửa sổ và sau đó trên mỗi focus-in-event, và rõ ràng tập trung mà cửa sổ thay vì cố gắng làm mất nét hoạt động:

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() 
+0

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. –

+1

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

+0

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. –

Các vấn đề liên quan