- Posts: 6803
- Thank you received: 0
Glade Panel in Axis blocks arrow keys
8 years 9 months ago #105185
by cmorley
Replied by cmorley on topic Glade Panel in Axis blocks arrow keys
First try this, replace the def forward function etc with this code:
Now that will only ignore press events not release events.
Chris M
Code:
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 to join the conversation.
8 years 9 months ago #105186
by cmorley
Replied by cmorley on topic Glade Panel in Axis blocks arrow keys
hmm i see press events use 'connect_after' and release uses 'connect'
changing those commands could make a difference too.
Chris M
changing those commands could make a difference too.
Chris M
Please Log in to join the conversation.
8 years 9 months ago #105219
by +Jan+
Replied by +Jan+ on topic Glade Panel in Axis blocks arrow keys
Hey Chris,
I tested your code today, my xembed file:
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.
No difference :huh:
Thanks in advance
Jan
I tested your code today, my xembed file:
Code:
#!/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 :huh:
Thanks in advance
Jan
Please Log in to join the conversation.
8 years 9 months ago #105225
by cmorley
Replied by cmorley on topic Glade Panel in Axis blocks arrow keys
Starting with my last code
Change the one function to this:
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
Change the one function to this:
Code:
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 to join the conversation.
8 years 8 months ago #105236
by +Jan+
Replied by +Jan+ on topic Glade Panel in Axis blocks arrow keys
Hello Chris,
I tried to use your on code on a 2.7 machine and got on the terminal the message:
I suppose I have to do something additional?
I corrected
Is that correct?
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 to join the conversation.
8 years 8 months ago #105239
by cmorley
Replied by cmorley on topic Glade Panel in Axis blocks arrow keys
change them to like this:
CMD.jog(linuxcnc.JOG_STOP, 0)
and yes i misspelled command
Chris M
CMD.jog(linuxcnc.JOG_STOP, 0)
and yes i misspelled command
Chris M
Please Log in to join the conversation.
8 years 8 months ago #105249
by +Jan+
Replied by +Jan+ on topic Glade Panel in Axis blocks arrow keys
Hey Chris,
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:
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
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:
Code:
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 to join the conversation.
8 years 8 months ago #105257
by cmorley
Replied by cmorley on topic Glade Panel in Axis blocks arrow keys
Excellent !
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
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 to join the conversation.
8 years 8 months ago #105263
by cmorley
Replied by cmorley on topic Glade Panel in Axis blocks arrow keys
looks likethis should do it for master:
Chris M
Code:
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 to join the conversation.
8 years 8 months ago #105342
by +Jan+
Replied by +Jan+ on topic Glade Panel in Axis blocks arrow keys
Hey Chris,
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.
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.
Code:
#!/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 to join the conversation.
Time to create page: 0.117 seconds
