Dlopen libncurses.so in wineconsole.
This commit is contained in:
parent
e31fcdbe27
commit
9557d1bfae
|
@ -12997,6 +12997,136 @@ cat >>confdefs.h <<_ACEOF
|
||||||
#define SONAME_LIBCRYPTO "$ac_cv_lib_soname_crypto"
|
#define SONAME_LIBCRYPTO "$ac_cv_lib_soname_crypto"
|
||||||
_ACEOF
|
_ACEOF
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
echo "$as_me:$LINENO: checking for -lncurses soname" >&5
|
||||||
|
echo $ECHO_N "checking for -lncurses soname... $ECHO_C" >&6
|
||||||
|
if test "${ac_cv_lib_soname_ncurses+set}" = set; then
|
||||||
|
echo $ECHO_N "(cached) $ECHO_C" >&6
|
||||||
|
else
|
||||||
|
ac_get_soname_save_LIBS=$LIBS
|
||||||
|
LIBS="-lncurses $LIBS"
|
||||||
|
cat >conftest.$ac_ext <<_ACEOF
|
||||||
|
#line $LINENO "configure"
|
||||||
|
/* confdefs.h. */
|
||||||
|
_ACEOF
|
||||||
|
cat confdefs.h >>conftest.$ac_ext
|
||||||
|
cat >>conftest.$ac_ext <<_ACEOF
|
||||||
|
/* end confdefs.h. */
|
||||||
|
|
||||||
|
/* Override any gcc2 internal prototype to avoid an error. */
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C"
|
||||||
|
#endif
|
||||||
|
/* We use char because int might match the return type of a gcc2
|
||||||
|
builtin and then its argument prototype would still apply. */
|
||||||
|
char waddch ();
|
||||||
|
int
|
||||||
|
main ()
|
||||||
|
{
|
||||||
|
waddch ();
|
||||||
|
;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
_ACEOF
|
||||||
|
rm -f conftest.$ac_objext conftest$ac_exeext
|
||||||
|
if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
|
||||||
|
(eval $ac_link) 2>&5
|
||||||
|
ac_status=$?
|
||||||
|
echo "$as_me:$LINENO: \$? = $ac_status" >&5
|
||||||
|
(exit $ac_status); } &&
|
||||||
|
{ ac_try='test -s conftest$ac_exeext'
|
||||||
|
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
|
||||||
|
(eval $ac_try) 2>&5
|
||||||
|
ac_status=$?
|
||||||
|
echo "$as_me:$LINENO: \$? = $ac_status" >&5
|
||||||
|
(exit $ac_status); }; }; then
|
||||||
|
ac_cv_lib_soname_ncurses=`$ac_cv_path_LDD conftest$ac_exeext | grep libncurses\\.so | sed 's/^.*\(libncurses\.so[^ ]*\).*$/\1/'`
|
||||||
|
if test "x$ac_cv_lib_soname_ncurses" = "x"
|
||||||
|
then
|
||||||
|
ac_cv_lib_soname_ncurses="libncurses.so"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
echo "$as_me: failed program was:" >&5
|
||||||
|
sed 's/^/| /' conftest.$ac_ext >&5
|
||||||
|
|
||||||
|
ac_cv_lib_soname_ncurses="libncurses.so"
|
||||||
|
fi
|
||||||
|
rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
|
||||||
|
LIBS=$ac_get_soname_save_LIBS
|
||||||
|
fi
|
||||||
|
echo "$as_me:$LINENO: result: $ac_cv_lib_soname_ncurses" >&5
|
||||||
|
echo "${ECHO_T}$ac_cv_lib_soname_ncurses" >&6
|
||||||
|
if test "x$ac_cv_lib_soname_ncurses" != xNONE
|
||||||
|
then
|
||||||
|
cat >>confdefs.h <<_ACEOF
|
||||||
|
#define SONAME_LIBNCURSES "$ac_cv_lib_soname_ncurses"
|
||||||
|
_ACEOF
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "$as_me:$LINENO: checking for -lcurses soname" >&5
|
||||||
|
echo $ECHO_N "checking for -lcurses soname... $ECHO_C" >&6
|
||||||
|
if test "${ac_cv_lib_soname_curses+set}" = set; then
|
||||||
|
echo $ECHO_N "(cached) $ECHO_C" >&6
|
||||||
|
else
|
||||||
|
ac_get_soname_save_LIBS=$LIBS
|
||||||
|
LIBS="-lcurses $LIBS"
|
||||||
|
cat >conftest.$ac_ext <<_ACEOF
|
||||||
|
#line $LINENO "configure"
|
||||||
|
/* confdefs.h. */
|
||||||
|
_ACEOF
|
||||||
|
cat confdefs.h >>conftest.$ac_ext
|
||||||
|
cat >>conftest.$ac_ext <<_ACEOF
|
||||||
|
/* end confdefs.h. */
|
||||||
|
|
||||||
|
/* Override any gcc2 internal prototype to avoid an error. */
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C"
|
||||||
|
#endif
|
||||||
|
/* We use char because int might match the return type of a gcc2
|
||||||
|
builtin and then its argument prototype would still apply. */
|
||||||
|
char waddch ();
|
||||||
|
int
|
||||||
|
main ()
|
||||||
|
{
|
||||||
|
waddch ();
|
||||||
|
;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
_ACEOF
|
||||||
|
rm -f conftest.$ac_objext conftest$ac_exeext
|
||||||
|
if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5
|
||||||
|
(eval $ac_link) 2>&5
|
||||||
|
ac_status=$?
|
||||||
|
echo "$as_me:$LINENO: \$? = $ac_status" >&5
|
||||||
|
(exit $ac_status); } &&
|
||||||
|
{ ac_try='test -s conftest$ac_exeext'
|
||||||
|
{ (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5
|
||||||
|
(eval $ac_try) 2>&5
|
||||||
|
ac_status=$?
|
||||||
|
echo "$as_me:$LINENO: \$? = $ac_status" >&5
|
||||||
|
(exit $ac_status); }; }; then
|
||||||
|
ac_cv_lib_soname_curses=`$ac_cv_path_LDD conftest$ac_exeext | grep libcurses\\.so | sed 's/^.*\(libcurses\.so[^ ]*\).*$/\1/'`
|
||||||
|
if test "x$ac_cv_lib_soname_curses" = "x"
|
||||||
|
then
|
||||||
|
ac_cv_lib_soname_curses="libcurses.so"
|
||||||
|
fi
|
||||||
|
else
|
||||||
|
echo "$as_me: failed program was:" >&5
|
||||||
|
sed 's/^/| /' conftest.$ac_ext >&5
|
||||||
|
|
||||||
|
ac_cv_lib_soname_curses="libcurses.so"
|
||||||
|
fi
|
||||||
|
rm -f conftest.$ac_objext conftest$ac_exeext conftest.$ac_ext
|
||||||
|
LIBS=$ac_get_soname_save_LIBS
|
||||||
|
fi
|
||||||
|
echo "$as_me:$LINENO: result: $ac_cv_lib_soname_curses" >&5
|
||||||
|
echo "${ECHO_T}$ac_cv_lib_soname_curses" >&6
|
||||||
|
if test "x$ac_cv_lib_soname_curses" != xNONE
|
||||||
|
then
|
||||||
|
cat >>confdefs.h <<_ACEOF
|
||||||
|
#define SONAME_LIBCURSES "$ac_cv_lib_soname_curses"
|
||||||
|
_ACEOF
|
||||||
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -923,6 +923,8 @@ then
|
||||||
WINE_GET_SONAME(jack,jack_client_new)
|
WINE_GET_SONAME(jack,jack_client_new)
|
||||||
WINE_GET_SONAME(ssl,SSL_library_init)
|
WINE_GET_SONAME(ssl,SSL_library_init)
|
||||||
WINE_GET_SONAME(crypto,BIO_new_socket)
|
WINE_GET_SONAME(crypto,BIO_new_socket)
|
||||||
|
WINE_GET_SONAME(ncurses,waddch)
|
||||||
|
WINE_GET_SONAME(curses,waddch)
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -755,6 +755,9 @@
|
||||||
/* Define to the soname of the libcups library. */
|
/* Define to the soname of the libcups library. */
|
||||||
#undef SONAME_LIBCUPS
|
#undef SONAME_LIBCUPS
|
||||||
|
|
||||||
|
/* Define to the soname of the libcurses library. */
|
||||||
|
#undef SONAME_LIBCURSES
|
||||||
|
|
||||||
/* Define to the soname of the libfreetype library. */
|
/* Define to the soname of the libfreetype library. */
|
||||||
#undef SONAME_LIBFREETYPE
|
#undef SONAME_LIBFREETYPE
|
||||||
|
|
||||||
|
@ -764,6 +767,9 @@
|
||||||
/* Define to the soname of the libjack library. */
|
/* Define to the soname of the libjack library. */
|
||||||
#undef SONAME_LIBJACK
|
#undef SONAME_LIBJACK
|
||||||
|
|
||||||
|
/* Define to the soname of the libncurses library. */
|
||||||
|
#undef SONAME_LIBNCURSES
|
||||||
|
|
||||||
/* Define to the soname of the libssl library. */
|
/* Define to the soname of the libssl library. */
|
||||||
#undef SONAME_LIBSSL
|
#undef SONAME_LIBSSL
|
||||||
|
|
||||||
|
|
|
@ -4,7 +4,6 @@ TOPOBJDIR = ../..
|
||||||
SRCDIR = @srcdir@
|
SRCDIR = @srcdir@
|
||||||
VPATH = @srcdir@
|
VPATH = @srcdir@
|
||||||
MODULE = wineconsole.exe
|
MODULE = wineconsole.exe
|
||||||
EXTRALIBS = @CURSESLIBS@
|
|
||||||
APPMODE = gui
|
APPMODE = gui
|
||||||
IMPORTS = advapi32 kernel32 ntdll
|
IMPORTS = advapi32 kernel32 ntdll
|
||||||
DELAYIMPORTS = comctl32 user32 gdi32
|
DELAYIMPORTS = comctl32 user32 gdi32
|
||||||
|
|
|
@ -30,6 +30,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
|
#include "wine/port.h"
|
||||||
|
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
|
@ -44,6 +45,7 @@
|
||||||
#include <winnls.h>
|
#include <winnls.h>
|
||||||
#include "winecon_private.h"
|
#include "winecon_private.h"
|
||||||
|
|
||||||
|
#include "wine/library.h"
|
||||||
#include "wine/server.h"
|
#include "wine/server.h"
|
||||||
#include "wine/debug.h"
|
#include "wine/debug.h"
|
||||||
|
|
||||||
|
@ -53,6 +55,12 @@ WINE_DEFAULT_DEBUG_CHANNEL(wineconsole);
|
||||||
|
|
||||||
#if defined(HAVE_CURSES_H) || defined(HAVE_NCURSES_H)
|
#if defined(HAVE_CURSES_H) || defined(HAVE_NCURSES_H)
|
||||||
|
|
||||||
|
#ifdef HAVE_NCURSES_H
|
||||||
|
#define CURSES_NAME "ncurses"
|
||||||
|
#else
|
||||||
|
#define CURSES_NAME "curses"
|
||||||
|
#endif
|
||||||
|
|
||||||
struct inner_data_curse
|
struct inner_data_curse
|
||||||
{
|
{
|
||||||
mmask_t initial_mouse_mask;
|
mmask_t initial_mouse_mask;
|
||||||
|
@ -63,6 +71,146 @@ struct inner_data_curse
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
static void *nc_handle = NULL;
|
||||||
|
|
||||||
|
#define MAKE_FUNCPTR(f) static typeof(f) * p_##f;
|
||||||
|
|
||||||
|
MAKE_FUNCPTR(curs_set)
|
||||||
|
MAKE_FUNCPTR(delwin)
|
||||||
|
MAKE_FUNCPTR(endwin)
|
||||||
|
MAKE_FUNCPTR(getmouse)
|
||||||
|
MAKE_FUNCPTR(has_colors)
|
||||||
|
MAKE_FUNCPTR(init_pair)
|
||||||
|
#ifndef initscr
|
||||||
|
MAKE_FUNCPTR(initscr)
|
||||||
|
#endif
|
||||||
|
#ifndef intrflush
|
||||||
|
MAKE_FUNCPTR(intrflush)
|
||||||
|
#endif
|
||||||
|
MAKE_FUNCPTR(keypad)
|
||||||
|
MAKE_FUNCPTR(mouseinterval)
|
||||||
|
MAKE_FUNCPTR(mousemask)
|
||||||
|
MAKE_FUNCPTR(newpad)
|
||||||
|
#ifndef nodelay
|
||||||
|
MAKE_FUNCPTR(nodelay)
|
||||||
|
#endif
|
||||||
|
#ifndef noecho
|
||||||
|
MAKE_FUNCPTR(noecho)
|
||||||
|
#endif
|
||||||
|
MAKE_FUNCPTR(prefresh)
|
||||||
|
MAKE_FUNCPTR(raw)
|
||||||
|
MAKE_FUNCPTR(start_color)
|
||||||
|
MAKE_FUNCPTR(stdscr)
|
||||||
|
MAKE_FUNCPTR(waddchnstr)
|
||||||
|
MAKE_FUNCPTR(wmove)
|
||||||
|
MAKE_FUNCPTR(wgetch)
|
||||||
|
|
||||||
|
#undef MAKE_FUNCPTR
|
||||||
|
|
||||||
|
/**********************************************************************/
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
LPVOID lpCallback;
|
||||||
|
LPVOID lpContext;
|
||||||
|
} DirectDrawEnumerateProcData;
|
||||||
|
|
||||||
|
static BOOL WCCURSES_bind_libcurses(void)
|
||||||
|
{
|
||||||
|
#ifdef HAVE_NCURSES_H
|
||||||
|
static const char *ncname = SONAME_LIBNCURSES;
|
||||||
|
#else
|
||||||
|
static const char *ncname = SONAME_LIBCURSES;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
nc_handle = wine_dlopen(ncname, RTLD_NOW, NULL, 0);
|
||||||
|
if(!nc_handle)
|
||||||
|
{
|
||||||
|
WINE_MESSAGE("Wine cannot find the " CURSES_NAME " library (%s).\n",
|
||||||
|
ncname);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
#define LOAD_FUNCPTR(f) \
|
||||||
|
if((p_##f = wine_dlsym(nc_handle, #f, NULL, 0)) == NULL) \
|
||||||
|
{ \
|
||||||
|
WINE_WARN("Can't find symbol %s\n", #f); \
|
||||||
|
goto sym_not_found; \
|
||||||
|
}
|
||||||
|
|
||||||
|
LOAD_FUNCPTR(curs_set)
|
||||||
|
LOAD_FUNCPTR(delwin)
|
||||||
|
LOAD_FUNCPTR(endwin)
|
||||||
|
LOAD_FUNCPTR(getmouse)
|
||||||
|
LOAD_FUNCPTR(has_colors)
|
||||||
|
LOAD_FUNCPTR(init_pair)
|
||||||
|
#ifndef initscr
|
||||||
|
LOAD_FUNCPTR(initscr)
|
||||||
|
#endif
|
||||||
|
#ifndef intrflush
|
||||||
|
LOAD_FUNCPTR(intrflush)
|
||||||
|
#endif
|
||||||
|
LOAD_FUNCPTR(keypad)
|
||||||
|
LOAD_FUNCPTR(mouseinterval)
|
||||||
|
LOAD_FUNCPTR(mousemask)
|
||||||
|
LOAD_FUNCPTR(newpad)
|
||||||
|
#ifndef nodelay
|
||||||
|
LOAD_FUNCPTR(nodelay)
|
||||||
|
#endif
|
||||||
|
#ifndef noecho
|
||||||
|
LOAD_FUNCPTR(noecho)
|
||||||
|
#endif
|
||||||
|
LOAD_FUNCPTR(prefresh)
|
||||||
|
LOAD_FUNCPTR(raw)
|
||||||
|
LOAD_FUNCPTR(start_color)
|
||||||
|
LOAD_FUNCPTR(stdscr)
|
||||||
|
LOAD_FUNCPTR(waddchnstr)
|
||||||
|
LOAD_FUNCPTR(wmove)
|
||||||
|
LOAD_FUNCPTR(wgetch)
|
||||||
|
|
||||||
|
#undef LOAD_FUNCPTR
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
|
||||||
|
sym_not_found:
|
||||||
|
WINE_MESSAGE(
|
||||||
|
"Wine cannot find certain functions that it needs inside the "
|
||||||
|
CURSES_NAME "\nlibrary. To enable Wine to use " CURSES_NAME
|
||||||
|
" please upgrade your " CURSES_NAME "\nlibraries\n");
|
||||||
|
wine_dlclose(nc_handle, NULL, 0);
|
||||||
|
nc_handle = NULL;
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
#define curs_set p_curs_set
|
||||||
|
#define delwin p_delwin
|
||||||
|
#define endwin p_endwin
|
||||||
|
#define getmouse p_getmouse
|
||||||
|
#define has_colors p_has_colors
|
||||||
|
#define init_pair p_init_pair
|
||||||
|
#ifndef initscr
|
||||||
|
#define initscr p_initscr
|
||||||
|
#endif
|
||||||
|
#ifndef intrflush
|
||||||
|
#define intrflush p_intrflush
|
||||||
|
#endif
|
||||||
|
#define keypad p_keypad
|
||||||
|
#define mouseinterval p_mouseinterval
|
||||||
|
#define mousemask p_mousemask
|
||||||
|
#define newpad p_newpad
|
||||||
|
#ifndef nodelay
|
||||||
|
#define nodelay p_nodelay
|
||||||
|
#endif
|
||||||
|
#ifndef noecho
|
||||||
|
#define noecho p_noecho
|
||||||
|
#endif
|
||||||
|
#define prefresh p_prefresh
|
||||||
|
#define raw p_raw
|
||||||
|
#define start_color p_start_color
|
||||||
|
#define stdscr (*p_stdscr)
|
||||||
|
#define waddchnstr p_waddchnstr
|
||||||
|
#define wmove p_wmove
|
||||||
|
#define wgetch p_wgetch
|
||||||
|
|
||||||
/******************************************************************
|
/******************************************************************
|
||||||
* WCCURSES_ResizeScreenBuffer
|
* WCCURSES_ResizeScreenBuffer
|
||||||
*
|
*
|
||||||
|
@ -719,6 +867,9 @@ static int WCCURSES_MainLoop(struct inner_data* data)
|
||||||
*/
|
*/
|
||||||
enum init_return WCCURSES_InitBackend(struct inner_data* data)
|
enum init_return WCCURSES_InitBackend(struct inner_data* data)
|
||||||
{
|
{
|
||||||
|
if( !WCCURSES_bind_libcurses() )
|
||||||
|
return init_failed;
|
||||||
|
|
||||||
data->private = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(struct inner_data_curse));
|
data->private = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(struct inner_data_curse));
|
||||||
if (!data->private) return init_failed;
|
if (!data->private) return init_failed;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue