diff --git a/Terminal.Gui/MonoCurses/binding.cs b/Terminal.Gui/MonoCurses/binding.cs index 60fab808ae..cc3d462c58 100644 --- a/Terminal.Gui/MonoCurses/binding.cs +++ b/Terminal.Gui/MonoCurses/binding.cs @@ -52,10 +52,23 @@ internal struct MouseEvent { static void FindNCurses () { - if (File.Exists ("/usr/lib/libncurses.dylib")) - curses_handle = dlopen ("libncurses.dylib", 1); - else - curses_handle = dlopen ("libncurses.so", 1); + try { + if (File.Exists ("/usr/lib/libncurses.dylib")) + curses_handle = dlopen ("libncurses.dylib", 1); + else + curses_handle = dlopen ("libncurses.so", 1); + } catch (DllNotFoundException) { + uselibc = true; + if (File.Exists ("/usr/lib/libncurses.dylib")) + curses_handle = libc_dlopen ("libncurses.dylib", 1); + else { + curses_handle = libc_dlopen ("libncurses.so", 1); + if (curses_handle == IntPtr.Zero) { + Console.WriteLine ("It is not possible to open libncurses.so, you might need to symlink libncurses.so.5 to libncurses.so"); + Environment.Exit (1); + } + } + } if (curses_handle == IntPtr.Zero) throw new Exception ("Could not dlopen ncurses"); @@ -320,11 +333,20 @@ public static int addch (int ch) [DllImport ("dl")] extern static IntPtr dlsym (IntPtr handle, string symbol); + [DllImport ("libc", EntryPoint="dlopen")] + extern static IntPtr libc_dlopen (string file, int mode); + + [DllImport ("libc", EntryPoint ="dlsym")] + extern static IntPtr libc_dlsym (IntPtr handle, string symbol); + + static bool uselibc; + static IntPtr stdscr; static IntPtr get_ptr (string key) { - var ptr = dlsym (curses_handle, key); + var ptr = uselibc ? libc_dlsym (curses_handle, key) : dlsym (curses_handle, key); + if (ptr == IntPtr.Zero) throw new Exception ("Could not load the key " + key); return ptr;