On Tue, Jan 19, 2010 at 11:44, Radek Vykydal <[email protected]> wrote:
> Hello list,
>
>
> I am trying to solve this problem:
>
> In root-only environment (Anaconda installer) we are running very simple
> C window manager (only taking care of setting focus of windows), Anaconda
> pygtk GUI, and on demand nm-connection-editor (C Gtk+ application) can
> be run.
>
> In Anaconda (the pygtk app) I have class (constructor is taking Xid of
> window)
> for embedding nm-c-e foreign window using gtk.Socket. What I need now is
> a mechanism
> for notifying about appearing nm-c-e windows (providing their Xid), idally
> it would allow to set a callback on event/notification.
>
> My last idea was:
> - catch CreateNotify events in the C window manager
> - 'forward' them via ClientMessage to Anaconda pygtk app
>  (to a window W specified/found in window manager by its wmname),
>  sending Xid of created window
> - in Anaconda pygtk app set client-event callback on the window W
>  which will use Xid to (eventually) embed the created window
>
> Does it sound like it could work?
> Especially, is X ClientMessage received in pyGtk app generating
> client-event Gtk signal?
>
> I made an example but it doesn't work - base.py doesn't call the ce-cb
> callback when
> I seem to send ClientMessage to its window.
>
> I run two python processes (in my environment, metacity wm is running).
>
>
> base.py:
>
> #!/usr/bin/python
>
> import pygtk
> import gtk
>
> def ce_cb(widget, event):
>    print "Got client event!"
>
> window = gtk.Window(gtk.WINDOW_TOPLEVEL)
> # This doesn't help
> #window.add_events(gtk.gdk.CLIENT_EVENT)
> window.connect("client-event", ce_cb)
> window.show()
>
> gtk.main()
>
>
> send_event.py:
>
> #!/usr/bin/python
>
> import sys
> import Xlib
> from Xlib import display
> from Xlib.protocol import event
>
> d = display.Display()
> s = d.screen()
> children = s.root.query_tree().children
>
> for c in children:
>    if c.get_wm_name() == "base.py":
>        break
> else:
>    print "ERROR: base.py not found"
>    sys.exit(1)
>
> # here I don't know exactly what I am doing to be honest
> atom = d.intern_atom('WINDOW')
>
> cm = event.ClientMessage(window = c,
>                         client_type = atom,
>                         data = (8, "01234567890123456789"))
>
> c.send_event(cm)
> d.flush()
>
>
> What I am doing wrong?
> Or is my whole concept wrong?

In my experience, though solutions like these seem like a shortcut,
when you get to the details it gets much tougher.

The longer path that I would favour is to put the C code that you want
to reuse in a shared library and generate pygobject bindings for it.

Regards,

Tomeu

-- 
«Sugar Labs is anyone who participates in improving and using Sugar.
What Sugar Labs does is determined by the participants.» - David
Farning
_______________________________________________
pygtk mailing list   [email protected]
http://www.daa.com.au/mailman/listinfo/pygtk
Read the PyGTK FAQ: http://faq.pygtk.org/

Reply via email to