Glade Panel in Axis blocks arrow keys

More
8 years 9 months ago #105185 by cmorley
First try this, replace the def forward function etc with this code:
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.

More
8 years 9 months ago #105186 by cmorley
hmm i see press events use 'connect_after' and release uses 'connect'
changing those commands could make a difference too.

Chris M

Please Log in to join the conversation.

More
8 years 9 months ago #105219 by +Jan+
Hey Chris,
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.

More
8 years 9 months ago #105225 by cmorley
Starting with my last code
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.

More
8 years 8 months ago #105236 by +Jan+
Hello Chris,
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

CMD = linuxcnc.cmmand()

to

CMD = linuxcnc.command()


Is that correct?

Please Log in to join the conversation.

More
8 years 8 months ago #105239 by cmorley
change them to like this:
CMD.jog(linuxcnc.JOG_STOP, 0)

and yes i misspelled command

Chris M

Please Log in to join the conversation.

More
8 years 8 months ago #105249 by +Jan+
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:
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.

More
8 years 8 months ago #105257 by cmorley
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

Please Log in to join the conversation.

More
8 years 8 months ago #105263 by cmorley
looks likethis should do it for master:
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.

More
8 years 8 months ago #105342 by +Jan+
Hey Chris,

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
Powered by Kunena Forum