mouse
mouse copied to clipboard
Segmentation Fault when trying to use mouse.record(button='F2')
Linux j-pc 4.4.0-83-generic #106-Ubuntu SMP Mon Jun 26 17:54:43 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux python 3.5 mouse Version: 0.7.0
my code
import mouse
def run():
start_stop_record = 'F2'
print('Press {} to start or stop mouse recording'
.format(start_stop_record))
events = mouse.record(button=start_stop_record,)
run()
edit: I realize now that the button is a mouse button, so something like 'left' or 'right' would be valid. Core problem still exists though I believe.
traceback from gdb
j@j-pc ~/_Github-Projects/misc_scripts $ sudo gdb python3
GNU gdb (Ubuntu 7.11.1-0ubuntu1~16.5) 7.11.1
Copyright (C) 2016 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law. Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-linux-gnu".
Type "show configuration" for configuration details.
For bug reporting instructions, please see:
<http://www.gnu.org/software/gdb/bugs/>.
Find the GDB manual and other documentation resources online at:
<http://www.gnu.org/software/gdb/documentation/>.
For help, type "help".
Type "apropos word" to search for commands related to "word"...
Reading symbols from python3...(no debugging symbols found)...done.
(gdb) run misc_scripts/record_and_play_mouse_macro.py
Starting program: /usr/bin/python3 misc_scripts/record_and_play_mouse_macro.py
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
Press F2 to start or stop mouse recording
[New Thread 0x7ffff5675700 (LWP 27441)]
[New Thread 0x7ffff4e74700 (LWP 27442)]
[New Thread 0x7fffeffff700 (LWP 27443)]
Thread 3 "python3" received signal SIGSEGV, Segmentation fault.
[Switching to Thread 0x7ffff4e74700 (LWP 27442)]
0x00007ffff43659d0 in XDefaultRootWindow () from /usr/lib/x86_64-linux-gnu/libX11.so.6
(gdb)
Sorry, the Linux part has seen little love recently. I'm just finishing some major changes to keyboard and Linux crashes will be the next top priority.
Thank you for the report.
The problem seems to be that in build_display() "display" is passed as C int to XDefaultRootWindow(). On platforms where pointers don't fit to C int that just doesn't work.
Here is a patch to fix the problem:
--- ./mouse/_nixmouse.py.orig 2018-05-18 14:12:49.039934827 +0300
+++ ./mouse/_nixmouse.py 2018-05-25 15:49:15.298608794 +0300
@@ -7,7 +7,10 @@
import ctypes
import ctypes.util
-from ctypes import c_uint32, c_uint, c_int, byref
+from ctypes import c_uint32, c_uint, c_int, c_void_p, byref
+
+class c_ptr(c_void_p):
+ pass
display = None
window = None
@@ -16,12 +19,11 @@
global display, window, x11
if display and window and x11: return
x11 = ctypes.cdll.LoadLibrary(ctypes.util.find_library('X11'))
+ x11.XOpenDisplay.restype = c_ptr
# Required because we will have multiple threads calling x11,
# such as the listener thread and then main using "move_to".
x11.XInitThreads()
display = x11.XOpenDisplay(None)
- # Known to cause segfault in Fedora 23 64bits, no known workarounds.
- # http://stackoverflow.com/questions/35137007/get-mouse-position-on-linux-pure-python
window = x11.XDefaultRootWindow(display)
def get_position():