2010-06-27 4 views
2

J'essaye de capturer l'événement configure pour chaque fenêtre pour créer une fonction d'accrochage Windows 7-esque. Je sais qu'il existe des solutions impliquant compiz-fusion, mais mon installation fonctionne dans vmware et n'a pas d'accélération matérielle pour faire fonctionner compiz. J'ai pensé qu'un simple script python pourrait faire ce que je voulais, mais je n'arrive pas à trouver le bon endroit pour lier l'événement configure.pyGTK détecter tous les événements de déplacement de la fenêtre

Comment/à quoi lier le rappel configure-event, ou y a-t-il un événement différent que je dois surveiller? J'ai essayé de le lier à l'écran et à la fenêtre racine en utilisant get_root_window() sans chance.

EDIT2

Maintenant je peux capturer tous les événements, le problème est que chaque événement renvoyé est de type GDK_NOTHING, donc je ne peux pas dire la différence entre les événements de discussion, déplacer les événements, les événements à proximité, etc.

#!/usr/bin/python 
import pygtk 
pygtk.require('2.0') 
import gtk, wnck 
import inspect 

def move_event(e): 
    print e.type, e.window 
    print inspect.getmembers(e) 
    return gtk.gdk.FILTER_CONTINUE 

def bind_win(screen, win): 
    w = gtk.gdk.window_foreign_new(win.get_xid()) 
    if w: 
     w.set_events(w.get_events() | gtk.gdk.ALL_EVENTS_MASK) 
     w.add_filter(move_event) 


if __name__ == "__main__": 
    screen = wnck.screen_get_default() 
    screen.connect("window_opened", bind_win) 
    gtk.main() 

une itération de move_event (e) tout en faisant glisser une fenêtre:

<enum GDK_NOTHING of type GdkEventType> <gtk.gdk.Window object at 0x7f38f72f8730 (GdkWindow at 0x196ce20)> [('copy', <built-in method copy of gtk.gdk.Event object at 0x7f3900513d00>), ('free', <built-in method free of gtk.gdk.Event object at 0x7f3900513d00>), ('get_axis', <built-in method get_axis of gtk.gdk.Event object at 0x7f3900513d00>), ('get_coords', <built-in method get_coords of gtk.gdk.Event object at 0x7f3900513d00>), ('get_root_coords', <built-in method get_root_coords of gtk.gdk.Event object at 0x7f3900513d00>), ('get_screen', <built-in method get_screen of gtk.gdk.Event object at 0x7f3900513d00>), ('get_state', <built-in method get_state of gtk.gdk.Event object at 0x7f3900513d00>), ('get_time', <built-in method get_time of gtk.gdk.Event object at 0x7f3900513d00>), ('put', <built-in method put of gtk.gdk.Event object at 0x7f3900513d00>), ('send_client_message', <built-in method send_client_message of gtk.gdk.Event object at 0x7f3900513d00>), ('send_clientmessage_toall', <built-in method send_clientmessage_toall of gtk.gdk.Event object at 0x7f3900513d00>), ('send_event', 1), ('set_screen', <built-in method set_screen of gtk.gdk.Event object at 0x7f3900513d00>), ('type', <enum GDK_NOTHING of type GdkEventType>), ('window', <gtk.gdk.Window object at 0x7f38f72f8730 (GdkWindow at 0x196ce20)>)]

+0

J'ai le même problème. Je pense que ce pourrait être un bug gtk. – simonzack

+0

J'ai déposé un bug ici: https://bugzilla.gnome.org/show_bug.cgi?id=722027 – simonzack

Répondre

1

Une recherche rapide révèle this page qui, bien écrit en C, communique les bases assez bien (vous aurez à grep pour trouver pour « fenêtre mobile »)

La configuration événement est binded à votre application de fenêtre. Pour faire ce que vous voulez faire, vous devrez également trouver la taille de l'écran, qui réside dans gtk.gdk.screen, documentée here.

+1

Merci pour les liens, je cherchais un moyen d'écouter ** tout ** configurer des événements sur tous les fenêtres existantes et futures. Votre méthode s'applique uniquement lors de la création d'une nouvelle fenêtre. –

+0

Je pensais que vous parliez dans votre propre application. Vous pouvez toujours fourchette e16 :) – new123456

Questions connexes