views:

85

answers:

1

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)>)]

+1  A: 

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.

new123456
Thanks for the links, I was looking for a way to listen for **all** configure events on all existing and future windows. Your method applies only when creating a new window.
Ian Wetherbee
I though you were talking within you own app. You can always fork e16 :)
new123456