Reputation: 6109
I'm trying to capture the configure-event for every window to create a windows 7-esque snap feature. I know there are solutions involving compiz-fusion, but my installation is running within vmware and doesn't have hardware acceleration to run compiz. I figured a simple python script could do what I wanted, but I can't seem to find the right place to bind the configure-event to.
How/to what do you bind the configure-event callback, or is there a different event I need to watch for? I've tried binding it to the screen and the root window using get_root_window() with no luck.
EDIT2
Now I can capture all events, the problem is that every event returned is of type GDK_NOTHING, so I can't tell the difference between focus events, move events, close events, 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()
One iteration of move_event(e) while dragging a window:
<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)>)]
Upvotes: 2
Views: 1726
Reputation: 873
A quick search reveals this page, which, though written in C, communicates the basics pretty well (you'll have to grep
it to find for "Moving Window")
The configure-event is binded to your application's window.
To do what you're going to want to do, you'll also have to find out the screen size, which resides in gtk.gdk.screen, documented here.
Upvotes: 1