Glade Panel in Axis blocks arrow keys
def forward_press(w, e, fw):
if e.keyval in ignore:
return
g = fw.get_geometry()
fe = gtk2xlib(e, fw, g)
if not fe: return
fw.send_event(fe)
def forward_release(w, e, fw):
g = fw.get_geometry()
fe = gtk2xlib(e, fw, g)
if not fe: return
fw.send_event(fe)
window.connect_after("key-press-event", forward_press, fw)
window.connect("key-release-event", forward_release, fw)
Now that will only ignore press events not release events.
Chris M
Please Log in or Create an account to join the conversation.
changing those commands could make a difference too.
Chris M
Please Log in or Create an account to join the conversation.
I tested your code today, my xembed file:
#!/usr/bin/env python
# vim: sts=4 sw=4 et
"""
XEmbed helper functions to allow correct embeding inside Axis
"""
import gtk
def reparent(window, parent):
""" Forced reparent. When reparenting Gtk applications into Tk
some extra protocol calls are needed.
"""
from Xlib import display
from Xlib.xobject import drawable
if not parent:
return window
plug = gtk.Plug(long(parent))
plug.show()
d = display.Display()
w = drawable.Window(d.display, plug.window.xid, 0)
# Honor XEmbed spec
atom = d.get_atom('_XEMBED_INFO')
w.change_property(atom, atom, 32, [0, 1])
w.reparent(parent, 0, 0)
w.map()
d.sync()
for c in window.get_children():
window.remove(c)
plug.add(c)
# Hide window if it's displayed
window.unmap()
return plug
def keyboard_forward(window, forward):
""" XXX: Keyboard events forwardind
This is kind of hack needed to properly function inside Tk windows.
Gtk app will receive _all_ events, even not needed. So we have to forward
back things that left over after our widgets. Connect handlers _after_
all others and listen for key-presss and key-release events. If key is not
in ignore list - forward it to window id found in evironment.
"""
if not forward:
return
try:
forward = int(forward, 0)
except:
return
from Xlib.protocol import event
from Xlib import display, X
from Xlib.xobject import drawable
d = display.Display()
fw = drawable.Window(d.display, forward, 0)
ks = gtk.keysyms
ignore = [ ks.Tab, ks.Page_Up, ks.Page_Down
, ks.KP_Page_Up, ks.KP_Page_Down
, ks.Left, ks.Right, ks.Up, ks.Down
, ks.KP_Left, ks.KP_Right, ks.KP_Up, ks.KP_Down
, ks.bracketleft, ks.bracketright
]
def gtk2xlib(e, fw, g, type=None):
if type is None: type = e.type
if type == gtk.gdk.KEY_PRESS:
klass = event.KeyPress
elif type == gtk.gdk.KEY_RELEASE:
klass = event.KeyRelease
else:
return
kw = dict(window=fw, detail=e.hardware_keycode,
state=e.state & 0xff,
child=X.NONE, root=g._data['root'],
root_x=g._data['x'], root_y=g._data['y'],
event_x=0, event_y=0, same_screen=1)
return klass(time=e.time, **kw)
def forward_press(w, e, fw):
if e.keyval in ignore:
return
g = fw.get_geometry()
fe = gtk2xlib(e, fw, g)
if not fe: return
fw.send_event(fe)
def forward_release(w, e, fw):
g = fw.get_geometry()
fe = gtk2xlib(e, fw, g)
if not fe: return
fw.send_event(fe)
window.connect_after("key-press-event", forward_press, fw)
window.connect("key-release-event", forward_release, fw)
window.add_events(gtk.gdk.KEY_PRESS_MASK)
window.add_events(gtk.gdk.KEY_RELEASE_MASK)
Now xyz behave the same way (no oszillating on z anymore), but they still do not stop on the FIRST button release after moving the mouse into the panel.
hmm i see press events use 'connect_after' and release uses 'connect'
changing those commands could make a difference too.
No difference
Thanks in advance
Jan
Please Log in or Create an account to join the conversation.
Change the one function to this:
def forward_release(w, e, fw):
CMD.jog(self.emc.JOG_STOP, 0)
CMD.jog(self.emc.JOG_STOP, 1)
CMD.jog(self.emc.JOG_STOP, 2)
g = fw.get_geometry()
fe = gtk2xlib(e, fw, g)
if not fe: return
fw.send_event(fe)
add this to the top of the file:
import linuxcnc
CMD = linuxcnc.cmmand()
This will only work in 2.7.X
It's a brute force way to do it but will be interesting if it actually works as expected.
Chris M
Please Log in or Create an account to join the conversation.
I tried to use your on code on a 2.7 machine and got on the terminal the message:
CMD.jog(self.emc.JOG_STOP, 0)
NameError: global name 'self' is not defined
I suppose I have to do something additional?
I corrected
toCMD = linuxcnc.cmmand()
CMD = linuxcnc.command()
Is that correct?
Please Log in or Create an account to join the conversation.
CMD.jog(linuxcnc.JOG_STOP, 0)
and yes i misspelled command
Chris M
Please Log in or Create an account to join the conversation.
thanks for your comments, It works now under 2.7.
I did my very first python programmning approach with some changes, so that this brute force event only takes place when I release on of the keys mentioned in the ignore section:
def forward_press(w, e, fw):
if e.keyval in ignore:
return
g = fw.get_geometry()
fe = gtk2xlib(e, fw, g)
if not fe: return
fw.send_event(fe)
def forward_release(w, e, fw):
if e.keyval in ignore:
CMD.jog(linuxcnc.JOG_STOP, 0)
print 'stop0'
CMD.jog(linuxcnc.JOG_STOP, 1)
print 'stop1'
CMD.jog(linuxcnc.JOG_STOP, 2)
print 'stop2'
g = fw.get_geometry()
fe = gtk2xlib(e, fw, g)
if not fe: return
g = fw.get_geometry()
fe = gtk2xlib(e, fw, g)
if not fe: return
fw.send_event(fe)
window.connect_after("key-press-event", forward_press, fw)
window.connect("key-release-event", forward_release, fw)
This avoids error messages after hitting for example the esc key.
I`m still interested in a "clean" way which works also in 2.8. How should I go on?
Best wishes
Jan
Please Log in or Create an account to join the conversation.
Nice on the editing too - that is one reason why I like python it is pretty easy to figure out and test changes.
The CMD.jog function has changed in master requiring another bit of data.
It is part of the upgrade for axis to joints.
I will look at whats required soon for you.
I would prefer to see the code send out release events rather then assume they are jogging keys.
If someone changed the jogging key is AXIS it could mess things up - but thats a problem if we pushed this fix to linuxcnc.
At this point I am just glade we have made a positive step...
Chris M
Please Log in or Create an account to join the conversation.
CMD.jog(self.emc.JOG_STOP, 0,0)
CMD.jog(self.emc.JOG_STOP, 0,1)
CMD.jog(self.emc.JOG_STOP, 0,2)
Chris M
Please Log in or Create an account to join the conversation.
At this point I am just glade we have made a positive step...
Me too...
I upgraded again to Master, and did some tests, until now I was not able to fix the problem in Master. I had to change again "self.emc" to "linuxcnc". Now I do not get any error message on the Terminal (the print messages are displayed).
Here is my actual xembed code (the interesting parts) I use for Master 2.8.
#!/usr/bin/env python
# vim: sts=4 sw=4 et
"""
XEmbed helper functions to allow correct embeding inside Axis
"""
import gtk
import linuxcnc
CMD = linuxcnc.command()
...
def forward_press(w, e, fw):
if e.keyval in ignore:
return
g = fw.get_geometry()
fe = gtk2xlib(e, fw, g)
if not fe: return
fw.send_event(fe)
def forward_release(w, e, fw):
if e.keyval in ignore:
CMD.jog(linuxcnc.JOG_STOP, 0,0)
print 'stop0'
CMD.jog(linuxcnc.JOG_STOP, 0,1)
print 'stop1'
CMD.jog(linuxcnc.JOG_STOP, 0,2)
print 'stop2'
g = fw.get_geometry()
fe = gtk2xlib(e, fw, g)
if not fe: return
g = fw.get_geometry()
fe = gtk2xlib(e, fw, g)
if not fe: return
fw.send_event(fe)
window.connect_after("key-press-event", forward_press, fw)
window.connect("key-release-event", forward_release, fw)
window.add_events(gtk.gdk.KEY_PRESS_MASK)
window.add_events(gtk.gdk.KEY_RELEASE_MASK)
Please Log in or Create an account to join the conversation.