boppreh / mouse

Hook and simulate global mouse events in pure Python
MIT License
905 stars 136 forks source link

Segmentation Fault when trying to use mouse.record(button='F2') #18

Open jtara1 opened 6 years ago

jtara1 commented 6 years ago

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) 
boppreh commented 6 years ago

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.

jh46 commented 6 years ago

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():