Glade Panel in Axis blocks arrow keys
03 Feb 2018 00:14 #105344
by cmorley
Replied by cmorley on topic Glade Panel in Axis blocks arrow keys
Sorry I did it again...You are right self.emc is wrong.
I'm copying and pasting code from another program.
You are a linuxcnc coder now!
Chris M
I'm copying and pasting code from another program.
You are a linuxcnc coder now!
Chris M
Please Log in or Create an account to join the conversation.
03 Feb 2018 10:07 #105355
by +Jan+
Haha don`t think so...
Replied by +Jan+ on topic Glade Panel in Axis blocks arrow keys
You are a linuxcnc coder now!
Haha don`t think so...
in my last post means, that I do not get any error on the shell, but the behaviour remains in master 2.8.ow I do not get any error message on the Terminal (the print messages are displayed).
Please Log in or Create an account to join the conversation.
03 Feb 2018 18:37 #105363
by cmorley
Replied by cmorley on topic Glade Panel in Axis blocks arrow keys
try:
CMD.jog(linuxcnc.JOG_STOP, 1,0)
CMD.jog(linuxcnc.JOG_STOP, 1,1)
CMD.jog(linuxcnc.JOG_STOP, 1,2)
Chris M
CMD.jog(linuxcnc.JOG_STOP, 1,0)
CMD.jog(linuxcnc.JOG_STOP, 1,1)
CMD.jog(linuxcnc.JOG_STOP, 1,2)
Chris M
Please Log in or Create an account to join the conversation.
04 Feb 2018 18:08 #105410
by +Jan+
Replied by +Jan+ on topic Glade Panel in Axis blocks arrow keys
Thanks, that did the job.
I attach both xembed files, for 2.7 and 2.8, maybe it is helpful for someone.
Best wishes.
Jan
I attach both xembed files, for 2.7 and 2.8, maybe it is helpful for someone.
Best wishes.
Jan
Please Log in or Create an account to join the conversation.
07 Oct 2021 15:45 - 07 Oct 2021 15:54 #222463
by +Jan+
Replied by +Jan+ on topic Glade Panel in Axis blocks arrow keys
Hello,
three years later, I am facing the same problem again. I have a new machine which I run with Linuxcnc 2.8.2.
The Glade panel is still the same, and I use the XEMBED.py file we created for LinuxCNC 2.8 Master back then.
That's how the machine behaves:
- Pushing the arrow key for x+ or x- , moving the mouse into the glade panel and then releasing the arrow key ==> release not detected
- Moving than with the mouse out of the glade panel and hitting the arrow key once again ==> release detected and machine stops
- Pushing x+ or x- arrow key, moving the mouse into the glade panel and then releasing the arrow key ==> RELEASE DETECTED!
- Then pushing the arrow key y+ or y-, moving the mouse into the glade panel and releasing the arrow key ==> release not detected
- Moving than with the mouse out of the glade panel and hitting the arrow key once again ==> release detected and machine stops
- Pushing y+ or y- arrow key, moving the mouse into the glade panel and then releasing the arrow key ==> RELEASE DETECTED!
- But then the release of x+ and x- is not detected anymore... and so on...
I have again created a video with key logging and open terminal for debugging:
Here is the code of the Xembed file:
Where could be the error?
Thanks in advance
Jan
three years later, I am facing the same problem again. I have a new machine which I run with Linuxcnc 2.8.2.
The Glade panel is still the same, and I use the XEMBED.py file we created for LinuxCNC 2.8 Master back then.
That's how the machine behaves:
- Pushing the arrow key for x+ or x- , moving the mouse into the glade panel and then releasing the arrow key ==> release not detected
- Moving than with the mouse out of the glade panel and hitting the arrow key once again ==> release detected and machine stops
- Pushing x+ or x- arrow key, moving the mouse into the glade panel and then releasing the arrow key ==> RELEASE DETECTED!
- Then pushing the arrow key y+ or y-, moving the mouse into the glade panel and releasing the arrow key ==> release not detected
- Moving than with the mouse out of the glade panel and hitting the arrow key once again ==> release detected and machine stops
- Pushing y+ or y- arrow key, moving the mouse into the glade panel and then releasing the arrow key ==> RELEASE DETECTED!
- But then the release of x+ and x- is not detected anymore... and so on...
I have again created a video with key logging and open terminal for debugging:
Here is the code of the Xembed file:
#!/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 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):
if e.keyval in ignore:
CMD.jog(linuxcnc.JOG_STOP, 1,0)
print 'stop0'
CMD.jog(linuxcnc.JOG_STOP, 1,1)
print 'stop1'
CMD.jog(linuxcnc.JOG_STOP, 1,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)
Where could be the error?
Thanks in advance
Jan
Last edit: 07 Oct 2021 15:54 by +Jan+. Reason: format issues...
Please Log in or Create an account to join the conversation.
10 Oct 2021 16:21 #222767
by nkp
Replied by nkp on topic Glade Panel in Axis blocks arrow keys
Attachments:
Please Log in or Create an account to join the conversation.
10 Oct 2021 18:54 #222792
by +Jan+
Replied by +Jan+ on topic Glade Panel in Axis blocks arrow keys
That would be a workaround, but not a good one. The machine is too big:
I need hardware keys which I can use without looking on them
The next step is then to put the electronic handwheel from the scrap back into operation.
Until then, however, I would like to keep the cursor keys. Do you have the same problem when using the hardware arrow keys?
Best wishes
Jan
I need hardware keys which I can use without looking on them
The next step is then to put the electronic handwheel from the scrap back into operation.
Until then, however, I would like to keep the cursor keys. Do you have the same problem when using the hardware arrow keys?
Best wishes
Jan
Attachments:
Please Log in or Create an account to join the conversation.
12 Oct 2021 22:41 #222983
by andypugh
Replied by andypugh on topic Glade Panel in Axis blocks arrow keys
I think that the old pendant looks like too much work.
So, consider buying one of the XHC-type pendants that LinuxCNC already supports.
linuxcnc.org/docs/2.8/html/man/man1/xhc-whb04b-6.1.html
So, consider buying one of the XHC-type pendants that LinuxCNC already supports.
linuxcnc.org/docs/2.8/html/man/man1/xhc-whb04b-6.1.html
Please Log in or Create an account to join the conversation.
13 Oct 2021 01:20 #222992
by rodw
Replied by rodw on topic Glade Panel in Axis blocks arrow keys
If its a standard MPG encoder and the axis selection and scales are hardwired , its quite easy to wire it into a Mesa MPG input (eg on 776e).
I use a 433Mhz wireless pendant with a receiver box that is all hardwired into a Mesa 7i76e. There is a MPG example in the docs which will guide you. I use binary coded inputs that output a logical bitmap which I decode to save a few pins.
I use a 433Mhz wireless pendant with a receiver box that is all hardwired into a Mesa 7i76e. There is a MPG example in the docs which will guide you. I use binary coded inputs that output a logical bitmap which I decode to save a few pins.
Please Log in or Create an account to join the conversation.
14 Oct 2021 10:40 - 14 Oct 2021 10:44 #223069
by +Jan+
Replied by +Jan+ on topic Glade Panel in Axis blocks arrow keys
I love to give things from the scrap a second use. The handwheel is built like a tank and actually too good to throw away. It is a normal encoder and rotary switches without any electronics installed. I will try to put it into operation, but if I can't I will gladly fall back on the XHC variant.
I have now test updated to Linux MX and Master 2.9. Also here I have with e.g. the GladeVCP example from PNCCONF the same dangerous behavior. Does no one but me use Axis with a Glade side panel and arrow keys? The Xembed file (see attachment) looks different in Master, but I don't know where to start to solve the problem.
Does anyone have an idea?
Best wishes
Jan
I have now test updated to Linux MX and Master 2.9. Also here I have with e.g. the GladeVCP example from PNCCONF the same dangerous behavior. Does no one but me use Axis with a Glade side panel and arrow keys? The Xembed file (see attachment) looks different in Master, but I don't know where to start to solve the problem.
#!/usr/bin/env python3
# vim: sts=4 sw=4 et
"""
XEmbed helper functions to allow correct embeding inside Axis
"""
import gi
gi.require_version('Gtk', '3.0')
from gi.repository import Gtk
from gi.repository import Gdk
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.new(int(parent))
plug.show_all()
d = display.Display()
w = drawable.Window(d.display, plug.get_window().get_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 add_plug(window):
"""Replace top level with a plug so it can be reparented.
This doesn't actually reparent the widget
"""
plug = Gtk.Plug(0)
plug.show()
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-press and key-release events. If key is not
in ignore list - forward it to window id found in environment.
"""
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)
#TODO: GTK3
# 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 == Gdk.EventType.KEY_PRESS:
klass = event.KeyPress
elif type == Gdk.EventType.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(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)
window.connect_after("key-press-event", forward, fw)
window.connect("key-release-event", forward, fw)
#TODO:
#window.add_events(Gdk.EventType.KEY_PRESS_MASK)
#window.add_events(Gdk.EventType.KEY_RELEASE_MASK)
Does anyone have an idea?
Best wishes
Jan
Attachments:
Last edit: 14 Oct 2021 10:44 by +Jan+.
Please Log in or Create an account to join the conversation.
Time to create page: 0.141 seconds