Converted the win32config module to a plugin (using PLUGTYPE_CORE for now).

This commit is contained in:
Volker Ruppert 2021-03-26 19:12:09 +00:00
parent e9df9c51c8
commit 9426ba987b
9 changed files with 98 additions and 78 deletions

79
bochs/configure vendored
View File

@ -839,7 +839,8 @@ PTHREAD_CFLAGS
PTHREAD_LIBS
PTHREAD_CC
EXPORT_DYNAMIC
DIALOG_OBJS
CI_SUPPORT_OBJS
CI_PLUGIN_OBJS
ENH_DBG_OBJS
CXXFLAGS_CONSOLE
BXHUB_LINK_OPTS
@ -852,6 +853,8 @@ WX_CXXFLAGS
WX_CFLAGS
GUI_CXXFLAGS
GUI_CFLAGS
SPECIFIC_GUI_SUPPORT_OBJS
SPECIFIC_GUI_OBJS
LIBVNCSERVER_CONFIG
WX_CONFIG
RC_CMD
@ -5196,7 +5199,7 @@ ia64-*-hpux*)
;;
*-*-irix6*)
# Find out which ABI we are using.
echo '#line 5199 "configure"' > conftest.$ac_ext
echo '#line 5202 "configure"' > conftest.$ac_ext
if { { eval echo "\"\$as_me\":${as_lineno-$LINENO}: \"$ac_compile\""; } >&5
(eval $ac_compile) 2>&5
ac_status=$?
@ -6884,11 +6887,11 @@ else
-e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \
-e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
-e 's:$: $lt_compiler_flag:'`
(eval echo "\"\$as_me:6887: $lt_compile\"" >&5)
(eval echo "\"\$as_me:6890: $lt_compile\"" >&5)
(eval "$lt_compile" 2>conftest.err)
ac_status=$?
cat conftest.err >&5
echo "$as_me:6891: \$? = $ac_status" >&5
echo "$as_me:6894: \$? = $ac_status" >&5
if (exit $ac_status) && test -s "$ac_outfile"; then
# The compiler can only warn and ignore the option if not recognized
# So say no if there are warnings
@ -7117,11 +7120,11 @@ else
-e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \
-e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
-e 's:$: $lt_compiler_flag:'`
(eval echo "\"\$as_me:7120: $lt_compile\"" >&5)
(eval echo "\"\$as_me:7123: $lt_compile\"" >&5)
(eval "$lt_compile" 2>conftest.err)
ac_status=$?
cat conftest.err >&5
echo "$as_me:7124: \$? = $ac_status" >&5
echo "$as_me:7127: \$? = $ac_status" >&5
if (exit $ac_status) && test -s "$ac_outfile"; then
# The compiler can only warn and ignore the option if not recognized
# So say no if there are warnings
@ -7184,11 +7187,11 @@ else
-e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \
-e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
-e 's:$: $lt_compiler_flag:'`
(eval echo "\"\$as_me:7187: $lt_compile\"" >&5)
(eval echo "\"\$as_me:7190: $lt_compile\"" >&5)
(eval "$lt_compile" 2>out/conftest.err)
ac_status=$?
cat out/conftest.err >&5
echo "$as_me:7191: \$? = $ac_status" >&5
echo "$as_me:7194: \$? = $ac_status" >&5
if (exit $ac_status) && test -s out/conftest2.$ac_objext
then
# The compiler can only warn and ignore the option if not recognized
@ -8974,7 +8977,7 @@ else
lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
lt_status=$lt_dlunknown
cat > conftest.$ac_ext <<EOF
#line 8977 "configure"
#line 8980 "configure"
#include "confdefs.h"
#if HAVE_DLFCN_H
@ -9072,7 +9075,7 @@ else
lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
lt_status=$lt_dlunknown
cat > conftest.$ac_ext <<EOF
#line 9075 "configure"
#line 9078 "configure"
#include "confdefs.h"
#if HAVE_DLFCN_H
@ -11187,11 +11190,11 @@ else
-e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \
-e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
-e 's:$: $lt_compiler_flag:'`
(eval echo "\"\$as_me:11190: $lt_compile\"" >&5)
(eval echo "\"\$as_me:11193: $lt_compile\"" >&5)
(eval "$lt_compile" 2>conftest.err)
ac_status=$?
cat conftest.err >&5
echo "$as_me:11194: \$? = $ac_status" >&5
echo "$as_me:11197: \$? = $ac_status" >&5
if (exit $ac_status) && test -s "$ac_outfile"; then
# The compiler can only warn and ignore the option if not recognized
# So say no if there are warnings
@ -11254,11 +11257,11 @@ else
-e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \
-e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
-e 's:$: $lt_compiler_flag:'`
(eval echo "\"\$as_me:11257: $lt_compile\"" >&5)
(eval echo "\"\$as_me:11260: $lt_compile\"" >&5)
(eval "$lt_compile" 2>out/conftest.err)
ac_status=$?
cat out/conftest.err >&5
echo "$as_me:11261: \$? = $ac_status" >&5
echo "$as_me:11264: \$? = $ac_status" >&5
if (exit $ac_status) && test -s out/conftest2.$ac_objext
then
# The compiler can only warn and ignore the option if not recognized
@ -12279,7 +12282,7 @@ else
lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
lt_status=$lt_dlunknown
cat > conftest.$ac_ext <<EOF
#line 12282 "configure"
#line 12285 "configure"
#include "confdefs.h"
#if HAVE_DLFCN_H
@ -12377,7 +12380,7 @@ else
lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
lt_status=$lt_dlunknown
cat > conftest.$ac_ext <<EOF
#line 12380 "configure"
#line 12383 "configure"
#include "confdefs.h"
#if HAVE_DLFCN_H
@ -13200,11 +13203,11 @@ else
-e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \
-e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
-e 's:$: $lt_compiler_flag:'`
(eval echo "\"\$as_me:13203: $lt_compile\"" >&5)
(eval echo "\"\$as_me:13206: $lt_compile\"" >&5)
(eval "$lt_compile" 2>conftest.err)
ac_status=$?
cat conftest.err >&5
echo "$as_me:13207: \$? = $ac_status" >&5
echo "$as_me:13210: \$? = $ac_status" >&5
if (exit $ac_status) && test -s "$ac_outfile"; then
# The compiler can only warn and ignore the option if not recognized
# So say no if there are warnings
@ -13267,11 +13270,11 @@ else
-e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \
-e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
-e 's:$: $lt_compiler_flag:'`
(eval echo "\"\$as_me:13270: $lt_compile\"" >&5)
(eval echo "\"\$as_me:13273: $lt_compile\"" >&5)
(eval "$lt_compile" 2>out/conftest.err)
ac_status=$?
cat out/conftest.err >&5
echo "$as_me:13274: \$? = $ac_status" >&5
echo "$as_me:13277: \$? = $ac_status" >&5
if (exit $ac_status) && test -s out/conftest2.$ac_objext
then
# The compiler can only warn and ignore the option if not recognized
@ -15232,11 +15235,11 @@ else
-e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \
-e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
-e 's:$: $lt_compiler_flag:'`
(eval echo "\"\$as_me:15235: $lt_compile\"" >&5)
(eval echo "\"\$as_me:15238: $lt_compile\"" >&5)
(eval "$lt_compile" 2>conftest.err)
ac_status=$?
cat conftest.err >&5
echo "$as_me:15239: \$? = $ac_status" >&5
echo "$as_me:15242: \$? = $ac_status" >&5
if (exit $ac_status) && test -s "$ac_outfile"; then
# The compiler can only warn and ignore the option if not recognized
# So say no if there are warnings
@ -15465,11 +15468,11 @@ else
-e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \
-e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
-e 's:$: $lt_compiler_flag:'`
(eval echo "\"\$as_me:15468: $lt_compile\"" >&5)
(eval echo "\"\$as_me:15471: $lt_compile\"" >&5)
(eval "$lt_compile" 2>conftest.err)
ac_status=$?
cat conftest.err >&5
echo "$as_me:15472: \$? = $ac_status" >&5
echo "$as_me:15475: \$? = $ac_status" >&5
if (exit $ac_status) && test -s "$ac_outfile"; then
# The compiler can only warn and ignore the option if not recognized
# So say no if there are warnings
@ -15532,11 +15535,11 @@ else
-e 's:.*FLAGS}? :&$lt_compiler_flag :; t' \
-e 's: [^ ]*conftest\.: $lt_compiler_flag&:; t' \
-e 's:$: $lt_compiler_flag:'`
(eval echo "\"\$as_me:15535: $lt_compile\"" >&5)
(eval echo "\"\$as_me:15538: $lt_compile\"" >&5)
(eval "$lt_compile" 2>out/conftest.err)
ac_status=$?
cat out/conftest.err >&5
echo "$as_me:15539: \$? = $ac_status" >&5
echo "$as_me:15542: \$? = $ac_status" >&5
if (exit $ac_status) && test -s out/conftest2.$ac_objext
then
# The compiler can only warn and ignore the option if not recognized
@ -17322,7 +17325,7 @@ else
lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
lt_status=$lt_dlunknown
cat > conftest.$ac_ext <<EOF
#line 17325 "configure"
#line 17328 "configure"
#include "confdefs.h"
#if HAVE_DLFCN_H
@ -17420,7 +17423,7 @@ else
lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
lt_status=$lt_dlunknown
cat > conftest.$ac_ext <<EOF
#line 17423 "configure"
#line 17426 "configure"
#include "confdefs.h"
#if HAVE_DLFCN_H
@ -19107,7 +19110,7 @@ else
lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
lt_status=$lt_dlunknown
cat > conftest.$ac_ext <<EOF
#line 19110 "configure"
#line 19113 "configure"
#include "confdefs.h"
#if HAVE_DLFCN_H
@ -25022,14 +25025,7 @@ else
fi
if test "$bx_plugins" = 1; then
# every item in this list will be compiled as a plugin. Do not include
# support objs; they will be mentioned in plugin-specific makefile rules.
GUI_PLUGIN_OBJS="$SPECIFIC_GUI_OBJS"
else
# include support objs
GUI_NON_PLUGIN_OBJS="$GUI_NON_PLUGIN_OBJS $SPECIFIC_GUI_OBJS $SPECIFIC_GUI_SUPPORT_OBJS"
fi
@ -25239,7 +25235,7 @@ $as_echo "$as_me: WARNING: The Bochs debugger gui cannot be compiled here, disab
fi
DIALOG_OBJS=""
CI_PLUGIN_OBJS="textconfig.o"
EXPORT_DYNAMIC="-export-dynamic"
case $target in
*-pc-windows* | *-pc-winnt*)
@ -25279,7 +25275,8 @@ case $target in
LIBS="$LIBS comctl32.lib"
fi
fi
DIALOG_OBJS="win32config.o win32paramdlg.o scrollwin.o"
CI_PLUGIN_OBJS="$CI_PLUGIN_OBJS \$(CI_OBJS_WIN32)"
CI_SUPPORT_OBJS="\$(CI_OBJS_WIN32_SUPPORT)"
EXPORT_DYNAMIC=""
;;
*-cygwin* | *-mingw* | *-msys)
@ -25297,13 +25294,15 @@ case $target in
LIBS="$LIBS -lcomctl32"
fi
fi
DIALOG_OBJS="win32config.o win32paramdlg.o scrollwin.o"
CI_PLUGIN_OBJS="$CI_PLUGIN_OBJS \$(CI_OBJS_WIN32)"
CI_SUPPORT_OBJS="\$(CI_OBJS_WIN32_SUPPORT)"
EXPORT_DYNAMIC=""
;;
esac
if test "$use_curses" = yes; then
if test "$PKGCONFIG" != not_found; then
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for mvaddch in -lcurses" >&5

View File

@ -2704,15 +2704,8 @@ else
AC_DEFINE(BX_USE_GUI_CONSOLE, 0)
fi
if test "$bx_plugins" = 1; then
# every item in this list will be compiled as a plugin. Do not include
# support objs; they will be mentioned in plugin-specific makefile rules.
GUI_PLUGIN_OBJS="$SPECIFIC_GUI_OBJS"
else
# include support objs
GUI_NON_PLUGIN_OBJS="$GUI_NON_PLUGIN_OBJS $SPECIFIC_GUI_OBJS $SPECIFIC_GUI_SUPPORT_OBJS"
fi
AC_SUBST(SPECIFIC_GUI_OBJS)
AC_SUBST(SPECIFIC_GUI_SUPPORT_OBJS)
AC_SUBST(GUI_CFLAGS)
AC_SUBST(GUI_CXXFLAGS)
AC_SUBST(WX_CONFIG)
@ -2857,7 +2850,7 @@ if test "$gui_debugger" = 1; then
fi
AC_SUBST(ENH_DBG_OBJS)
DIALOG_OBJS=""
CI_PLUGIN_OBJS="textconfig.o"
EXPORT_DYNAMIC="-export-dynamic"
case $target in
*-pc-windows* | *-pc-winnt*)
@ -2897,7 +2890,8 @@ case $target in
LIBS="$LIBS comctl32.lib"
fi
fi
DIALOG_OBJS="win32config.o win32paramdlg.o scrollwin.o"
CI_PLUGIN_OBJS="$CI_PLUGIN_OBJS \$(CI_OBJS_WIN32)"
CI_SUPPORT_OBJS="\$(CI_OBJS_WIN32_SUPPORT)"
EXPORT_DYNAMIC=""
;;
*-cygwin* | *-mingw* | *-msys)
@ -2915,11 +2909,13 @@ case $target in
LIBS="$LIBS -lcomctl32"
fi
fi
DIALOG_OBJS="win32config.o win32paramdlg.o scrollwin.o"
CI_PLUGIN_OBJS="$CI_PLUGIN_OBJS \$(CI_OBJS_WIN32)"
CI_SUPPORT_OBJS="\$(CI_OBJS_WIN32_SUPPORT)"
EXPORT_DYNAMIC=""
;;
esac
AC_SUBST(DIALOG_OBJS)
AC_SUBST(CI_PLUGIN_OBJS)
AC_SUBST(CI_SUPPORT_OBJS)
AC_SUBST(EXPORT_DYNAMIC)
if test "$use_curses" = yes; then

View File

@ -65,9 +65,11 @@ GUI_OBJS_AMIGAOS = amigaos.o
GUI_OBJS_WX = wx.o
GUI_OBJS_WX_SUPPORT = wxmain.o wxdialog.o
CI_OBJS_WIN32 = win32config.o
CI_OBJS_WIN32_SUPPORT = win32paramdlg.o scrollwin.o
GUI_DLL_TARGETS = @GUI_DLL_TARGETS@
OBJS_THAT_CANNOT_BE_PLUGINS = keymap.o gui.o siminterface.o paramtree.o @ENH_DBG_OBJS@ @DIALOG_OBJS@
OBJS_THAT_CAN_BE_PLUGINS = textconfig.o
OBJS_THAT_CANNOT_BE_PLUGINS = keymap.o gui.o siminterface.o paramtree.o @ENH_DBG_OBJS@
X_LIBS = @X_LIBS@
X_PRE_LIBS = @X_PRE_LIBS@
@ -78,17 +80,22 @@ GUI_LINK_OPTS_RFB = @RFB_LIBS@
GUI_LINK_OPTS_RFB_VCPP = user32.lib @RFB_LIBS@
GUI_LINK_OPTS_VNCSRV = @GUI_LINK_OPTS_VNCSRV@
GUI_LINK_OPTS_AMIGAOS =
GUI_LINK_OPTS_WIN32 = -luser32 -lgdi32 -lcomdlg32 -lcomctl32
GUI_LINK_OPTS_WIN32_VCPP = user32.lib gdi32.lib winmm.lib comdlg32.lib comctl32.lib
GUI_LINK_OPTS_WIN32 = -luser32 -lgdi32 -lcomctl32
GUI_LINK_OPTS_WIN32_VCPP = user32.lib gdi32.lib comctl32.lib
GUI_LINK_OPTS_MACOS =
GUI_LINK_OPTS_CARBON = -framework Carbon
GUI_LINK_OPTS_NOGUI =
GUI_LINK_OPTS_TERM = @GUI_LINK_OPTS_TERM@
GUI_LINK_OPTS_WX = @GUI_LINK_OPTS_WX@
CI_LINK_OPTS_WIN32 = -luser32 -lgdi32 -lcomctl32 -lcomdlg32 -lshell32
CI_LINK_OPTS_WIN32_VCPP = user32.lib gdi32.lib comctl32.lib comdlg32.lib shell32.lib
GUI_PLUGIN_OBJS = @SPECIFIC_GUI_OBJS@
CI_PLUGIN_OBJS = @CI_PLUGIN_OBJS@
OBJS_THAT_CAN_BE_PLUGINS = $(GUI_PLUGIN_OBJS) $(CI_PLUGIN_OBJS)
OBJS_THAT_SUPPORT_OTHER_PLUGINS = @SPECIFIC_GUI_SUPPORT_OBJS@ @CI_SUPPORT_OBJS@
NONPLUGIN_OBJS = @GUI_NON_PLUGIN_OBJS@
GUI_PLUGIN_OBJS = @GUI_PLUGIN_OBJS@
CI_PLUGIN_OBJS = $(OBJS_THAT_CAN_BE_PLUGINS)
#
# -------- end configurable options --------------------------
@ -100,7 +107,7 @@ plugins: @PLUGIN_TARGET_2@
plugins_gcc: $(GUI_PLUGIN_OBJS:@GUI_PLUGIN_NAME_TRANSFORMATION@) $(CI_PLUGIN_OBJS:@PLUGIN_LIBNAME_TRANSFORMATION@)
plugins_msvc: $(GUI_DLL_TARGETS) bx_textconfig.dll
plugins_msvc: $(GUI_DLL_TARGETS) bx_textconfig.dll bx_win32config.dll
libgui.a: $(NONPLUGIN_OBJS)
@RMCOMMAND@ libgui.a
@ -187,6 +194,9 @@ bx_win32_gui.dll: $(GUI_OBJS_WIN32)
bx_textconfig.dll: textconfig.o
@LINK_DLL@ textconfig.o $(WIN32_DLL_IMPORT_LIBRARY)
bx_win32config.dll: $(CI_OBJS_WIN32) $(CI_OBJS_WIN32_SUPPORT)
@LINK_DLL@ $(CI_OBJS_WIN32) $(CI_OBJS_WIN32_SUPPORT) $(WIN32_DLL_IMPORT_LIBRARY) $(CI_LINK_OPTS_WIN32@LINK_VAR@)
##### end DLL section
clean:

View File

@ -18,6 +18,11 @@
// License along with this library; if not, write to the Free Software
// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
// Define BX_PLUGGABLE in files that can be compiled into plugins. For
// platforms that require a special tag on exported symbols, BX_PLUGGABLE
// is used to know when we are exporting symbols and when we are importing.
#define BX_PLUGGABLE
#include "config.h"
#if BX_USE_WIN32CONFIG

View File

@ -18,6 +18,11 @@
// License along with this library; if not, write to the Free Software
// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
// Define BX_PLUGGABLE in files that can be compiled into plugins. For
// platforms that require a special tag on exported symbols, BX_PLUGGABLE
// is used to know when we are exporting symbols and when we are importing.
#define BX_PLUGGABLE
#include "win32dialog.h"
#include "bochs.h"
#include "bx_debug/debug.h"
@ -25,9 +30,24 @@
#include "gui.h"
#include "win32res.h"
#include "win32paramdlg.h"
#include "plugin.h"
#if BX_USE_WIN32CONFIG
static int win32_ci_callback(void *userdata, ci_command_t command);
static BxEvent* win32_notify_callback(void *unused, BxEvent *event);
PLUGIN_ENTRY_FOR_MODULE(win32config)
{
if (mode == PLUGIN_INIT) {
SIM->register_configuration_interface("win32config", win32_ci_callback, NULL);
SIM->set_notify_callback(win32_notify_callback, NULL);
} else if (mode == PLUGIN_PROBE) {
return (int)PLUGTYPE_CORE;
}
return 0; // Success
}
const char log_choices[N_ACT+1][16] = {"ignore", "log", "warn user", "ask user", "end simulation", "no change"};
HWND GetBochsWindow()
@ -688,7 +708,6 @@ static int win32_ci_callback(void *userdata, ci_command_t command)
switch (command)
{
case CI_START:
SIM->set_notify_callback(win32_notify_callback, NULL);
if (SIM->get_param_enum(BXPN_BOCHS_START)->get() == BX_QUICK_START) {
SIM->begin_simulation(bx_startup_flags.argc, bx_startup_flags.argv);
// we don't expect it to return, but if it does, quit
@ -720,10 +739,4 @@ static int win32_ci_callback(void *userdata, ci_command_t command)
return 0;
}
int init_win32_config_interface()
{
SIM->register_configuration_interface("win32config", win32_ci_callback, NULL);
return 0; // success
}
#endif // BX_USE_WIN32CONFIG

View File

@ -41,10 +41,4 @@ extern "C" {
#include <ctype.h>
}
#if BX_USE_WIN32CONFIG
int init_win32_config_interface();
#endif
#endif // BX_WIN32_DIALOGS_H

View File

@ -18,6 +18,11 @@
// License along with this library; if not, write to the Free Software
// Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
// Define BX_PLUGGABLE in files that can be compiled into plugins. For
// platforms that require a special tag on exported symbols, BX_PLUGGABLE
// is used to know when we are exporting symbols and when we are importing.
#define BX_PLUGGABLE
#include "win32dialog.h"
#include "bochs.h"
#include "siminterface.h"

View File

@ -21,9 +21,6 @@
#include "bochs.h"
#include "bxversion.h"
#include "param_names.h"
#if BX_USE_WIN32CONFIG
#include "gui/win32dialog.h"
#endif
#include "cpu/cpu.h"
#include "iodev/iodev.h"
#include "iodev/hdimage/hdimage.h"
@ -334,7 +331,7 @@ int bxmain(void)
}
else if (!strcmp(ci_name, "win32config")) {
#if BX_USE_WIN32CONFIG
init_win32_config_interface();
PLUG_load_plugin(win32config, PLUGTYPE_CORE);
#else
BX_PANIC(("configuration interface 'win32config' not present"));
#endif

View File

@ -442,8 +442,9 @@ PLUGIN_ENTRY_FOR_MODULE(iodebug);
PLUGIN_ENTRY_FOR_MODULE(ioapic);
PLUGIN_ENTRY_FOR_MODULE(hpet);
PLUGIN_ENTRY_FOR_MODULE(voodoo);
// config interface plugin
// config interface plugins
PLUGIN_ENTRY_FOR_MODULE(textconfig);
PLUGIN_ENTRY_FOR_MODULE(win32config);
// gui plugins
PLUGIN_ENTRY_FOR_GUI_MODULE(amigaos);
PLUGIN_ENTRY_FOR_GUI_MODULE(carbon);