Chris asked [2] if it's possible to embed GladeVCP panels in Axis like
video tabs [1] so moving discussion here.
If you don't want to read detailed description of process and just curious how
to run gladevcp in axis then skip to the last part of message.
Background:
Embeding programs into axis tabs is achieved with XEMBED protocol so either
child
or parent program (Axis) must be aware of it. I'm not similar with Tkinter or
Tcl
so on Axis side only empty frame is created. Reparenting relies on client.
Gtk provides special widget (GtkPlug [4]) that is able to reparent but it only
works
with gtk's counterpart named GtkSocket. Maybe with Qt's too but I have not
tested.
Only possible way I've found is to use low-level X calls to reparent child
window
manually. So how it's done:
* Create popup GtkWindow. When it's created in program just give
GTK_WINDOW_POPUP
instead of GTK_WINDOW_TOPLEVEL (gtk.WINDOW_POPUP for python). With glade
select
window type as popup in properties. It's needed to suppress window
decorations.
* Get display and window id from gtk. Done with macros in C/C++:
Window wid = GDK_WINDOW_XID (GTK_WIDGET(window)->window);
Display *dpy = GDK_WINDOW_XDISPLAY(GTK_WIDGET(window)->window);
In python window id is located in window->window->xid. I've not
found way to get proper display object from gtk and use Xlib [5]:
from Xlib import display
from Xlib.xobject import drawable
d = display.Display()
w = drawable.Window(d.display, window.window.xid, 0)
* Set _XEMBED_INFO property. Tests show that it's not very importat but to
comply
with protocol [3]. For C/C++ code is
long info[2] = { 0, 1 << 0 /*XEMBED_MAPPED*/ };
Atom atom = XInternAtom(dpy, "_XEMBED_INFO", 1);
XChangeProperty(dpy, xid, atom, atom, 32, PropModeReplace, (unsigned
char *)&info, 2);
For python (d is display, w is window objects):
atom = d.get_atom('_XEMBED_INFO')
w.change_property(atom, atom, 32, [0, 1])
* Run reparent, map and sync X calls. For C/C++ it's
XReparentWindow(dpy, wid, parent, 0, 0)
XMapWindow(dpy, wid)
XSync(dpy)
For python it's
w.reparent(parent, 0, 0)
w.map()
d.sync()
* Enjoy Gtk window reprented into non-gtk one.
Why so verbose? I've not found any explanation why GtkPlug is not working
inside widgets
other then GtkSocket and why normal GtkWindow is not respecting XReparent. So
let's hope
that google will find this message :)
Short version.
All you need is:
1. Small patch is needed for gladevcp (in following message). It uses python
Xlib [5].
2. Fix your glade file so it's toplevel window1 will be popup. With glade gui
change
'Window type' property of top level window to 'popup'. Or edit .glade file
and add
next line after <widget class='GtkWindow' id='window1'>
<property name="type">popup</property>
3. Add .axisrc from [1] to your local one.
4. Comment loadusr string in hal file (since we don't know parent window in
this stage).
5. Add two variables in DISPLAY section of ini file:
EMBED_TAB_NAME = GladeVCP
EMBED_TAB_COMMAND = gladevcp -c COMPNAME -w {XID} path-to-glade-file
Don't forget to add -w {XID} in command!
That's all.
Pavel
--
[1] http://wiki.linuxcnc.org/emcinfo.pl?Axis_Embed_Video
[2]
http://www.linuxcnc.org/component/option,com_kunena/Itemid,20/func,view/catid,21/id,2198/limit,6/limitstart,18/lang,english/
[3] http://standards.freedesktop.org/xembed-spec/xembed-spec-latest.html
[4] http://library.gnome.org/devel/gtk/stable/GtkPlug.html
[5] http://python-xlib.sourceforge.net/
------------------------------------------------------------------------------
Beautiful is writing same markup. Internet Explorer 9 supports
standards for HTML5, CSS3, SVG 1.1, ECMAScript5, and DOM L2 & L3.
Spend less time writing and rewriting code and more time creating great
experiences on the web. Be a part of the beta today.
http://p.sf.net/sfu/beautyoftheweb
_______________________________________________
Emc-developers mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/emc-developers