diff --git a/src/config.c b/src/config.c index 3a3705b..407162d 100644 --- a/src/config.c +++ b/src/config.c @@ -10,850 +10,108 @@ #include -#include -#include - #include "config.h" -config_t config = { - .progname = ( char* )"x48ng", +static config_t config = { + .progname = ( char* )"ui48ng", + .gx = true, .verbose = false, - /* .print_config = false, */ - /* .useTerminal = false, */ - /* .useSerial = false, */ - /* .useDebugger = false, */ - /* .throttle = false, */ - /* .resetOnStartup = false, */ - - /* .serialLine = NULL, */ - - /* .frontend_type = FRONTEND_TEXT, */ - .leave_shift_keys = false, - /* .inhibit_shutdown = false, */ .mono = false, .gray = false, - /* /\* tui *\/ */ - /* .small = false, */ - /* .tiny = false, */ - /* sdl */ .hide_chrome = false, .show_ui_fullscreen = false, .scale = 1.0, - /* /\* x11 *\/ */ - /* .netbook = false, */ - /* .name = ( char* )"x48ng", */ - /* .title = ( char* )"x48ng", */ - /* .x11_visual = NULL, */ - /* /\* default | staticgray | staticcolor | truecolor | grayscale | */ - /* * pseudocolor | directcolor | 0xnn | nn */ - /* *\/ */ - /* .monoIcon = false, */ - /* .iconic = false, */ - /* .xrm = true, */ - /* .smallFont = NULL, */ - /* .mediumFont = NULL, */ - /* .largeFont = NULL, */ - /* .connFont = NULL, */ + .wire_name = ( char* )"/dev/wire", + .ir_name = ( char* )"/dev/ir", }; -/* char* configDir = ( char* )"x48ng"; */ -/* char* config_file = ( char* )"config.lua"; */ -/* char* romFileName = NULL; */ -/* char* ramFileName = NULL; */ -/* char* stateFileName = NULL; */ -/* char* port1FileName = NULL; */ -/* char* port2FileName = NULL; */ - -/* char normalized_config_path[ MAX_LENGTH_FILENAME ]; */ -/* char normalized_config_file[ MAX_LENGTH_FILENAME ]; */ -/* char normalized_rom_path[ MAX_LENGTH_FILENAME ]; */ -/* char normalized_ram_path[ MAX_LENGTH_FILENAME ]; */ -/* char normalized_state_path[ MAX_LENGTH_FILENAME ]; */ -/* char normalized_port1_path[ MAX_LENGTH_FILENAME ]; */ -/* char normalized_port2_path[ MAX_LENGTH_FILENAME ]; */ - -/* lua_State* config_lua_values; */ - -/* #ifndef LUA_OK */ -/* # define LUA_OK 0 */ -/* #endif */ - -/* static inline bool config_read( const char* filename ) */ -/* { */ -/* int rc; */ - -/* assert( filename != NULL ); */ - -/* /\*--------------------------------------------------- */ -/* ; Create the Lua state, which includes NO predefined */ -/* ; functions or values. This is literally an empty */ -/* ; slate. */ -/* ;----------------------------------------------------*\/ */ -/* config_lua_values = luaL_newstate(); */ -/* if ( config_lua_values == NULL ) { */ -/* fprintf( stderr, "cannot create Lua state\n" ); */ -/* return false; */ -/* } */ - -/* /\*----------------------------------------------------- */ -/* ; For the truly paranoid about sandboxing, enable the */ -/* ; following code, which removes the string library, */ -/* ; which some people find problematic to leave un-sand- */ -/* ; boxed. But in my opinion, if you are worried about */ -/* ; such attacks in a configuration file, you have bigger */ -/* ; security issues to worry about than this. */ -/* ;------------------------------------------------------*\/ */ -/* #ifdef PARANOID */ -/* lua_pushliteral( config_lua_values, "x" ); */ -/* lua_pushnil( config_lua_values ); */ -/* lua_setmetatable( config_lua_values, -2 ); */ -/* lua_pop( config_lua_values, 1 ); */ -/* #endif */ - -/* /\*----------------------------------------------------- */ -/* ; Lua 5.2+ can restrict scripts to being text only, */ -/* ; to avoid a potential problem with loading pre-compiled */ -/* ; Lua scripts that may have malformed Lua VM code that */ -/* ; could possibly lead to an exploit, but again, if you */ -/* ; have to worry about that, you have bigger security */ -/* ; issues to worry about. But in any case, here I'm */ -/* ; restricting the file to "text" only. */ -/* ;------------------------------------------------------*\/ */ -/* rc = luaL_loadfile( config_lua_values, filename ); */ -/* if ( rc != LUA_OK ) { */ -/* fprintf( stderr, "Lua error: (%d) %s\n", rc, lua_tostring( - * config_lua_values, -1 ) ); */ -/* return false; */ -/* } */ - -/* rc = lua_pcall( config_lua_values, 0, 0, 0 ); */ -/* if ( rc != LUA_OK ) { */ -/* fprintf( stderr, "Lua error: (%d) %s\n", rc, lua_tostring( - * config_lua_values, -1 ) ); */ -/* return false; */ -/* } */ - -/* return true; */ -/* } */ - -/* static inline void get_absolute_config_dir( char* source, char* dest ) */ -/* { */ -/* if ( source[ 0 ] != '/' ) { */ -/* char* xdg_config_home = getenv( "XDG_CONFIG_HOME" ); */ - -/* if ( xdg_config_home ) { */ -/* if ( config.verbose ) */ -/* fprintf( stderr, "XDG_CONFIG_HOME is %s\n", xdg_config_home - * ); */ - -/* strcpy( dest, xdg_config_home ); */ -/* strcat( dest, "/" ); */ -/* } else { */ -/* char* home = getenv( "HOME" ); */ - -/* if ( home ) { */ -/* if ( config.verbose ) */ -/* fprintf( stderr, "HOME is %s\n", home ); */ - -/* strcpy( dest, home ); */ -/* strcat( dest, "/.config/" ); */ -/* } else { */ -/* struct passwd* pwd = getpwuid( getuid() ); */ - -/* if ( pwd ) { */ -/* if ( config.verbose ) */ -/* fprintf( stderr, "pwd->pw_dir is %s\n", pwd->pw_dir - * ); */ - -/* strcpy( dest, pwd->pw_dir ); */ -/* strcat( dest, "/" ); */ -/* } else { */ -/* if ( config.verbose ) */ -/* fprintf( stderr, "can\'t figure out your home - * directory, " */ -/* "trying /tmp\n" ); */ - -/* strcpy( dest, "/tmp" ); */ -/* } */ -/* } */ -/* } */ -/* } */ - -/* strcat( dest, source ); */ - -/* if ( dest[ strlen( dest ) ] != '/' ) */ -/* strcat( dest, "/" ); */ -/* } */ - -/* static inline void normalize_filename( const char* orig, char* dest ) */ -/* { */ -/* if ( orig[ 0 ] == '/' ) */ -/* strcpy( dest, "" ); */ -/* else */ -/* strcpy( dest, normalized_config_path ); */ -/* strcat( dest, orig ); */ -/* } */ - -/* static inline bool normalize_config_dir( void ) */ -/* { */ -/* struct stat st; */ - -/* get_absolute_config_dir( configDir, normalized_config_path ); */ -/* if ( config.verbose ) */ -/* fprintf( stderr, "normalized_config_path: %s\n", - * normalized_config_path ); */ - -/* if ( stat( normalized_config_path, &st ) == -1 ) */ -/* if ( errno == ENOENT ) */ -/* return false; */ - -/* return true; */ -/* } */ - -/* static inline void normalize_filenames( void ) */ -/* { */ -/* normalize_filename( config_file, normalized_config_file ); */ - -/* normalize_filename( romFileName, normalized_rom_path ); */ -/* normalize_filename( ramFileName, normalized_ram_path ); */ -/* normalize_filename( stateFileName, normalized_state_path ); */ -/* normalize_filename( port1FileName, normalized_port1_path ); */ -/* normalize_filename( port2FileName, normalized_port2_path ); */ -/* } */ - -int config_init( int argc, char* argv[] ) +config_t* config_init( int argc, char* argv[] ) { - /* int option_index; */ - /* int c = '?'; */ + int option_index; + int c = '?'; - /* char* clopt_configDir = NULL; */ - /* char* clopt_romFileName = NULL; */ - /* char* clopt_ramFileName = NULL; */ - /* char* clopt_stateFileName = NULL; */ - /* char* clopt_port1FileName = NULL; */ - /* char* clopt_port2FileName = NULL; */ - /* char* clopt_serialLine = NULL; */ - /* char* clopt_x11_visual = NULL; */ - /* char* clopt_smallFont = NULL; */ - /* char* clopt_mediumFont = NULL; */ - /* char* clopt_largeFont = NULL; */ - /* char* clopt_connFont = NULL; */ - /* int clopt_frontend_type = -1; */ - /* int clopt_verbose = -1; */ - /* int clopt_useTerminal = -1; */ - /* int clopt_useSerial = -1; */ - /* int clopt_useDebugger = -1; */ - /* int clopt_throttle = -1; */ - /* int clopt_hide_chrome = -1; */ - /* int clopt_show_ui_fullscreen = -1; */ - /* double clopt_scale = -1.0; */ - /* int clopt_netbook = -1; */ - /* int clopt_mono = -1; */ - /* int clopt_gray = -1; */ - /* int clopt_small = -1; */ - /* int clopt_tiny = -1; */ - /* int clopt_leave_shift_keys = -1; */ - /* int clopt_inhibit_shutdown = -1; */ + int clopt_gx = -1; + int clopt_verbose = -1; + int clopt_leave_shift_keys = -1; + int clopt_mono = -1; + int clopt_gray = -1; + int clopt_hide_chrome = -1; + int clopt_show_ui_fullscreen = -1; + double clopt_scale = -1.0; - /* const char* optstring = "c:hvVtsirT"; */ - /* struct option long_options[] = { */ - /* {"config", required_argument, NULL, 'c' }, */ - /* {"config-dir", required_argument, NULL, 1000 }, */ - /* {"rom", required_argument, NULL, 1010 }, */ - /* {"ram", required_argument, NULL, 1011 }, */ - /* {"state", required_argument, NULL, 1012 }, */ - /* {"port1", required_argument, NULL, 1013 }, */ - /* {"port2", required_argument, NULL, 1014 }, */ + const char* optstring = "c:hvVtsirT"; + struct option long_options[] = { + {"help", no_argument, NULL, 'h' }, - /* {"serial-line", required_argument, NULL, 1015 }, */ + {"gx", no_argument, &clopt_gx, true }, + {"sx", no_argument, &clopt_gx, false}, + {"verbose", no_argument, &clopt_verbose, true }, + {"leave-shift-keys", no_argument, &clopt_leave_shift_keys, true }, + {"mono", no_argument, &clopt_mono, true }, + {"gray", no_argument, &clopt_gray, true }, + {"no-chrome", no_argument, &clopt_hide_chrome, true }, + {"fullscreen", no_argument, &clopt_show_ui_fullscreen, true }, + {"scale", required_argument, NULL, 7110 }, - /* {"help", no_argument, NULL, 'h' }, */ - /* {"version", no_argument, NULL, 'v' }, */ + {0, 0, 0, 0 } + }; - /* {"print-config", no_argument, ( int* - * )&config.print_config, true }, */ - /* {"verbose", no_argument, &clopt_verbose, true }, */ - /* {"terminal", no_argument, &clopt_useTerminal, true }, - */ - /* {"serial", no_argument, &clopt_useSerial, true }, - */ + const char* help_text = "usage: %s [options]\n options:\n -h --help what you " + "are reading\n -V --verbose be verbose (default: false)\n " + " --no-chrome only display the LCD (default: false)\n --fullscreen make the " + "UI fullscreen (default: false)\n --scale= make the UI scale times " + "(default: 1.0)\n --mono make the UI monochrome (default: false)\n " + " --gray make the UI grayscale (default: false)\n " + "--leave-shift-keys _not_ mapping the shift keys to let them free for numbers (default: false)\n"; - /* {"reset", no_argument, ( int* - * )&config.resetOnStartup, true }, */ - /* {"throttle", no_argument, &clopt_throttle, true }, */ + while ( c != EOF ) { + c = getopt_long( argc, argv, optstring, long_options, &option_index ); - /* {"debug", no_argument, &clopt_useDebugger, true }, - */ + switch ( c ) { + case 'h': + fprintf( stderr, help_text, config.progname ); + exit( 0 ); + break; + case 7110: + clopt_scale = atof( optarg ); + break; + default: + break; + } + } - /* {"sdl2", no_argument, &clopt_frontend_type, - * FRONTEND_SDL2}, */ - /* {"sdl", no_argument, &clopt_frontend_type, - * FRONTEND_SDL2}, */ - /* {"no-chrome", no_argument, &clopt_hide_chrome, true }, - */ - /* {"fullscreen", no_argument, &clopt_show_ui_fullscreen, - * true }, */ - /* {"scale", required_argument, NULL, 7110 }, */ + if ( optind < argc ) { + fprintf( stderr, "Invalid arguments : " ); + while ( optind < argc ) + fprintf( stderr, "%s\n", argv[ optind++ ] ); + fprintf( stderr, "\n" ); + } - /* {"x11", no_argument, &clopt_frontend_type, - * FRONTEND_X11 }, */ - /* {"netbook", no_argument, &clopt_netbook, true }, */ - /* {"visual", required_argument, NULL, 8110 }, */ - /* {"small-font", required_argument, NULL, 8111 }, */ - /* {"medium-font", required_argument, NULL, 8112 }, */ - /* {"large-font", required_argument, NULL, 8113 }, */ - /* {"connection-font", required_argument, NULL, 8114 }, */ + /****************************************************/ + /* 2. treat command-line params which have priority */ + /****************************************************/ + if ( clopt_gx != -1 ) + config.gx = clopt_gx; + if ( clopt_verbose != -1 ) + config.verbose = clopt_verbose; + if ( clopt_hide_chrome != -1 ) + config.hide_chrome = clopt_hide_chrome; + if ( clopt_show_ui_fullscreen != -1 ) + config.show_ui_fullscreen = clopt_show_ui_fullscreen; + if ( clopt_scale > 0.0 ) + config.scale = clopt_scale; + if ( clopt_mono != -1 ) + config.mono = clopt_mono; + if ( clopt_gray != -1 ) + config.gray = clopt_gray; + if ( clopt_leave_shift_keys != -1 ) + config.leave_shift_keys = clopt_leave_shift_keys; - /* {"tui", no_argument, NULL, 9100 }, */ - /* {"tui-small", no_argument, NULL, 9110 }, */ - /* {"tui-tiny", no_argument, NULL, 9120 }, */ - /* {"small", no_argument, NULL, 9109 }, /\* - * DEPRECATED *\/ */ - /* {"tiny", no_argument, NULL, 9119 }, /\* - * DEPRECATED *\/ */ - - /* {"mono", no_argument, &clopt_mono, true }, */ - /* {"gray", no_argument, &clopt_gray, true }, */ - /* {"leave-shift-keys", no_argument, &clopt_leave_shift_keys, - * true }, */ - /* {"inhibit-shutdown", no_argument, &clopt_inhibit_shutdown, - * true }, */ - - /* {0, 0, 0, 0 } */ - /* }; */ - - /* const char* help_text = "usage: %s [options]\n" */ - /* "options:\n" */ - /* " -h --help what you are - * reading\n" */ - /* " -v --version show version\n" */ - /* " --print-config print configuration - * as config file\n" */ - /* " -c --config= use as - * x48ng's config file (default: " */ - /* "$XDG_CONFIG_HOME/x48ng/config.lua)\n" */ - /* " --config-dir= use as - * x48ng's home (default: " */ - /* "$XDG_CONFIG_HOME/x48ng/)\n" */ - /* " --rom= use - * (absolute or relative to " */ - /* ") as ROM (default: rom)\n" */ - /* " --ram= use - * (absolute or relative to " */ - /* ") as RAM (default: ram)\n" */ - /* " --state= use - * (absolute or relative " */ - /* "to ) as STATE (default: hp48)\n" - */ - /* " --port1= use - * (absolute or relative " */ - /* "to ) as PORT1 (default: port1)\n" - */ - /* " --port2= use - * (absolute or relative " */ - /* "to ) as PORT2 (default: port2)\n" - */ - /* " --serial-line= use as serial - * device default: " */ - /* "%s)\n" */ - /* " -V --verbose be verbose (default: - * false)\n" */ - /* " --x11 use X11 front-end - * (default: true)\n" */ - /* " --sdl2 use SDL2 front-end - * (default: false)\n" */ - /* " --tui use text front-end - * (default: false)\n" */ - /* " --tui-small use text small - * front-end (2×2 pixels per character) (default: " */ - /* "false)\n" */ - /* " --tui-tiny use text tiny - * front-end (2×4 pixels per character) (default: " */ - /* "false)\n" */ - /* " -t --use-terminal activate pseudo - * terminal interface (default: " */ - /* "true)\n" */ - /* " -s --use-serial activate serial - * interface (default: false)\n" */ - /* " --debug enable the - * debugger\n" */ - /* " -r --reset perform a reset on - * startup\n" */ - /* " -T --throttle try to emulate real - * speed (default: false)\n" */ - /* " --no-chrome only display the LCD - * (default: " */ - /* "false)\n" */ - /* " --fullscreen make the UI - * fullscreen " */ - /* "(default: false)\n" */ - /* " --scale= make the UI scale - * times " */ - /* "(default: 1.0)\n" */ - /* " --netbook make the UI - * horizontal (default: " */ - /* "false)\n" */ - /* " --visual= use x11 visual (default: " */ - /* "default), possible values: " */ - /* "\n" */ - /* " --small-font= use as - * small " */ - /* "font (default: %s)\n" */ - /* " --medium-font= use as - * medium " */ - /* "font (default: %s)\n" */ - /* " --large-font= use as - * large " */ - /* "font (default: %s)\n" */ - /* " --connection-font= use as " */ - /* "connection font (default: %s)\n" */ - /* " --mono make the UI - * monochrome (default: " */ - /* "false)\n" */ - /* " --gray make the UI - * grayscale (default: " */ - /* "false)\n" */ - /* " --leave-shift-keys _not_ mapping the - * shift keys to let them free for numbers (default: " */ - /* "false)\n" */ - /* " --inhibit-shutdown __tentative fix for - * stuck-on-OFF bug__ (default: " */ - /* "false)\n"; */ - /* while ( c != EOF ) { */ - /* c = getopt_long( argc, argv, optstring, long_options, &option_index - * ); */ - - /* switch ( c ) { */ - /* case 'h': */ - /* fprintf( stderr, help_text, config.progname, - * config.serialLine, config.smallFont, config.mediumFont, config.largeFont, - */ - /* config.connFont ); */ - /* exit( 0 ); */ - /* break; */ - /* case 'v': */ - /* fprintf( stderr, "%s %d.%d.%d\n", config.progname, - * VERSION_MAJOR, VERSION_MINOR, PATCHLEVEL ); */ - /* exit( 0 ); */ - /* break; */ - /* case 'c': */ - /* config_file = optarg; */ - /* break; */ - /* case 1000: */ - /* clopt_configDir = optarg; */ - /* break; */ - /* case 1010: */ - /* clopt_romFileName = optarg; */ - /* break; */ - /* case 1011: */ - /* clopt_ramFileName = optarg; */ - /* break; */ - /* case 1012: */ - /* clopt_stateFileName = optarg; */ - /* break; */ - /* case 1013: */ - /* clopt_port1FileName = optarg; */ - /* break; */ - /* case 1014: */ - /* clopt_port2FileName = optarg; */ - /* break; */ - /* case 1015: */ - /* clopt_serialLine = optarg; */ - /* break; */ - /* case 7110: */ - /* clopt_scale = atof( optarg ); */ - /* break; */ - /* case 8110: */ - /* clopt_x11_visual = optarg; */ - /* break; */ - /* case 8111: */ - /* clopt_smallFont = optarg; */ - /* break; */ - /* case 8112: */ - /* clopt_mediumFont = optarg; */ - /* break; */ - /* case 8113: */ - /* clopt_largeFont = optarg; */ - /* break; */ - /* case 8114: */ - /* clopt_connFont = optarg; */ - /* break; */ - /* case 9100: */ - /* clopt_frontend_type = FRONTEND_TEXT; */ - /* clopt_small = false; */ - /* clopt_tiny = false; */ - /* break; */ - /* case 9109: */ - /* fprintf( stdout, "`--small` is deprecated, please use - * `--tui-small` instead of `--tui --small`" ); */ - /* /\* break; *\/ /\* intentional fall-through *\/ */ - /* case 9110: */ - /* clopt_frontend_type = FRONTEND_TEXT; */ - /* clopt_small = true; */ - /* clopt_tiny = false; */ - /* break; */ - /* case 9119: */ - /* fprintf( stdout, "`--tiny` is deprecated, please use - * `--tui-tiny` instead of `--tui --tiny`" ); */ - /* /\* break; *\/ /\* intentional fall-through *\/ */ - /* case 9120: */ - /* clopt_frontend_type = FRONTEND_TEXT; */ - /* clopt_small = false; */ - /* clopt_tiny = true; */ - /* break; */ - /* case 'V': */ - /* clopt_verbose = true; */ - /* break; */ - /* case 't': */ - /* clopt_useTerminal = true; */ - /* break; */ - /* case 's': */ - /* clopt_useSerial = true; */ - /* break; */ - /* case 'r': */ - /* config.resetOnStartup = true; */ - /* break; */ - /* case 'T': */ - /* clopt_throttle = true; */ - /* break; */ - - /* case '?': */ - /* case ':': */ - /* exit( 0 ); */ - /* break; */ - /* default: */ - /* break; */ - /* } */ - /* } */ - - /* if ( optind < argc ) { */ - /* fprintf( stderr, "Invalid arguments : " ); */ - /* while ( optind < argc ) */ - /* fprintf( stderr, "%s\n", argv[ optind++ ] ); */ - /* fprintf( stderr, "\n" ); */ - /* } */ - - /* if ( !normalize_config_dir() ) */ - /* fprintf( stderr, "Configuration directory doesn't exist!\n" ); */ - - /* /\**********************\/ */ - /* /\* 1. read config.lua *\/ */ - /* /\**********************\/ */ - /* normalize_filename( config_file, normalized_config_file ); */ - /* if ( !config_read( normalized_config_file ) ) { */ - /* fprintf( stderr, "\nConfiguration file %s doesn't seem to exist or - * is invalid!\n", normalized_config_file ); */ - /* fprintf( stderr, "Continuing using default configuration as printed - * below.\n\n" ); */ - - /* fprintf( stderr, "You can solve this by running `mkdir -p %s && %s - * --print-config >> %s`\n\n", normalized_config_path, */ - /* config.progname, normalized_config_file ); */ - /* config.print_config = true; */ - /* } */ - - /* lua_getglobal( config_lua_values, "config_dir" ); */ - /* configDir = ( char* )luaL_optstring( config_lua_values, -1, "x48ng" ); - */ - - /* lua_getglobal( config_lua_values, "rom" ); */ - /* romFileName = ( char* )luaL_optstring( config_lua_values, -1, "rom" ); - */ - - /* lua_getglobal( config_lua_values, "ram" ); */ - /* ramFileName = ( char* )luaL_optstring( config_lua_values, -1, "ram" ); - */ - - /* lua_getglobal( config_lua_values, "state" ); */ - /* stateFileName = ( char* )luaL_optstring( config_lua_values, -1, "state" - * ); */ - - /* lua_getglobal( config_lua_values, "port1" ); */ - /* port1FileName = ( char* )luaL_optstring( config_lua_values, -1, "port1" - * ); */ - - /* lua_getglobal( config_lua_values, "port2" ); */ - /* port2FileName = ( char* )luaL_optstring( config_lua_values, -1, "port2" - * ); */ - - /* lua_getglobal( config_lua_values, "serial_line" ); */ - /* config.serialLine = ( char* )luaL_optstring( config_lua_values, -1, - * "/dev/ttyS0" ); */ - - /* lua_getglobal( config_lua_values, "pseudo_terminal" ); */ - /* config.useTerminal = lua_toboolean( config_lua_values, -1 ); */ - - /* lua_getglobal( config_lua_values, "serial" ); */ - /* config.useSerial = lua_toboolean( config_lua_values, -1 ); */ - - /* lua_getglobal( config_lua_values, "debugger" ); */ - /* config.useDebugger = lua_toboolean( config_lua_values, -1 ); */ - - /* lua_getglobal( config_lua_values, "throttle" ); */ - /* config.throttle = lua_toboolean( config_lua_values, -1 ); */ - - /* lua_getglobal( config_lua_values, "frontend" ); */ - /* #ifdef HAS_X11 */ - /* # define DEFAULT_FRONTEND "x11" */ - /* #elif HAS_SDL2 */ - /* # define DEFAULT_FRONTEND "sdl2" */ - /* #else */ - /* # define DEFAULT_FRONTEND "tui" */ - /* #endif */ - /* const char* svalue = luaL_optstring( config_lua_values, -1, - * DEFAULT_FRONTEND ); */ - /* if ( svalue != NULL ) { */ - /* if ( strcmp( svalue, "x11" ) == 0 ) */ - /* config.frontend_type = FRONTEND_X11; */ - /* if ( strcmp( svalue, "sdl2" ) == 0 ) */ - /* config.frontend_type = FRONTEND_SDL2; */ - /* if ( strcmp( svalue, "sdl" ) == 0 ) /\* retro-compatibility *\/ */ - /* config.frontend_type = FRONTEND_SDL2; */ - /* if ( strcmp( svalue, "tui" ) == 0 ) { */ - /* config.frontend_type = FRONTEND_TEXT; */ - /* config.small = false; */ - /* config.tiny = false; */ - /* } */ - /* if ( strcmp( svalue, "tui-small" ) == 0 ) { */ - /* config.frontend_type = FRONTEND_TEXT; */ - /* config.small = true; */ - /* config.tiny = false; */ - /* } */ - /* if ( strcmp( svalue, "tui-tiny" ) == 0 ) { */ - /* config.frontend_type = FRONTEND_TEXT; */ - /* config.small = false; */ - /* config.tiny = true; */ - /* } */ - /* } */ - - /* lua_getglobal( config_lua_values, "hide_chrome" ); */ - /* config.hide_chrome = lua_toboolean( config_lua_values, -1 ); */ - - /* lua_getglobal( config_lua_values, "fullscreen" ); */ - /* config.show_ui_fullscreen = lua_toboolean( config_lua_values, -1 ); */ - - /* lua_getglobal( config_lua_values, "scale" ); */ - /* config.scale = luaL_optnumber( config_lua_values, -1, 1.0 ); */ - - /* lua_getglobal( config_lua_values, "netbook" ); */ - /* config.netbook = lua_toboolean( config_lua_values, -1 ); */ - - /* lua_getglobal( config_lua_values, "mono" ); */ - /* config.mono = lua_toboolean( config_lua_values, -1 ); */ - - /* lua_getglobal( config_lua_values, "gray" ); */ - /* config.gray = lua_toboolean( config_lua_values, -1 ); */ - - /* /\* DEPRECATED *\/ */ - /* lua_getglobal( config_lua_values, "small" ); */ - /* config.small = lua_toboolean( config_lua_values, -1 ); */ - - /* /\* DEPRECATED *\/ */ - /* lua_getglobal( config_lua_values, "tiny" ); */ - /* config.tiny = lua_toboolean( config_lua_values, -1 ); */ - - /* lua_getglobal( config_lua_values, "leave_shift_keys" ); */ - /* config.leave_shift_keys = lua_toboolean( config_lua_values, -1 ); */ - - /* lua_getglobal( config_lua_values, "inhibit_shutdown" ); */ - /* config.inhibit_shutdown = lua_toboolean( config_lua_values, -1 ); */ - - /* lua_getglobal( config_lua_values, "x11_visual" ); */ - /* config.x11_visual = ( char* )luaL_optstring( config_lua_values, -1, - * "default" ); */ - - /* lua_getglobal( config_lua_values, "font_small" ); */ - /* config.smallFont = ( char* )luaL_optstring( config_lua_values, -1, - * "-*-fixed-bold-r-normal-*-14-*-*-*-*-*-iso8859-1" ); */ - - /* lua_getglobal( config_lua_values, "font_medium" ); */ - /* config.mediumFont = ( char* )luaL_optstring( config_lua_values, -1, - * "-*-fixed-bold-r-normal-*-15-*-*-*-*-*-iso8859-1" ); */ - - /* lua_getglobal( config_lua_values, "font_large" ); */ - /* config.largeFont = ( char* )luaL_optstring( config_lua_values, -1, - * "-*-fixed-medium-r-normal-*-20-*-*-*-*-*-iso8859-1" ); */ - - /* lua_getglobal( config_lua_values, "font_devices" ); */ - /* config.connFont = ( char* )luaL_optstring( config_lua_values, -1, - * "-*-fixed-medium-r-normal-*-12-*-*-*-*-*-iso8859-1" ); */ - - /* /\****************************************************\/ */ - /* /\* 2. treat command-line params which have priority *\/ */ - /* /\****************************************************\/ */ - /* if ( clopt_configDir != NULL ) */ - /* configDir = strdup( clopt_configDir ); */ - /* if ( clopt_romFileName != NULL ) */ - /* romFileName = strdup( clopt_romFileName ); */ - /* if ( clopt_ramFileName != NULL ) */ - /* ramFileName = strdup( clopt_ramFileName ); */ - /* if ( clopt_stateFileName != NULL ) */ - /* stateFileName = strdup( clopt_stateFileName ); */ - /* if ( clopt_port1FileName != NULL ) */ - /* port1FileName = strdup( clopt_port1FileName ); */ - /* if ( clopt_port2FileName != NULL ) */ - /* port2FileName = strdup( clopt_port2FileName ); */ - /* if ( clopt_serialLine != NULL ) */ - /* config.serialLine = strdup( clopt_serialLine ); */ - /* if ( clopt_x11_visual != NULL ) */ - /* config.x11_visual = strdup( clopt_x11_visual ); */ - /* if ( clopt_smallFont != NULL ) */ - /* config.smallFont = strdup( clopt_smallFont ); */ - /* if ( clopt_mediumFont != NULL ) */ - /* config.mediumFont = strdup( clopt_mediumFont ); */ - /* if ( clopt_largeFont != NULL ) */ - /* config.largeFont = strdup( clopt_largeFont ); */ - /* if ( clopt_connFont != NULL ) */ - /* config.connFont = strdup( clopt_connFont ); */ - - /* if ( clopt_verbose != -1 ) */ - /* config.verbose = clopt_verbose; */ - /* if ( clopt_useTerminal != -1 ) */ - /* config.useTerminal = clopt_useTerminal; */ - /* if ( clopt_useSerial != -1 ) */ - /* config.useSerial = clopt_useSerial; */ - /* if ( clopt_throttle != -1 ) */ - /* config.throttle = clopt_throttle; */ - /* if ( clopt_useDebugger != -1 ) */ - /* config.useDebugger = clopt_useDebugger; */ - /* if ( clopt_frontend_type != -1 ) */ - /* config.frontend_type = clopt_frontend_type; */ - /* if ( clopt_hide_chrome != -1 ) */ - /* config.hide_chrome = clopt_hide_chrome; */ - /* if ( clopt_show_ui_fullscreen != -1 ) */ - /* config.show_ui_fullscreen = clopt_show_ui_fullscreen; */ - /* if ( clopt_scale > 0.0 ) */ - /* config.scale = clopt_scale; */ - /* if ( clopt_netbook != -1 ) */ - /* config.netbook = clopt_netbook; */ - /* if ( clopt_mono != -1 ) */ - /* config.mono = clopt_mono; */ - /* if ( clopt_gray != -1 ) */ - /* config.gray = clopt_gray; */ - /* if ( clopt_small != -1 ) */ - /* config.small = clopt_small; */ - /* if ( clopt_tiny != -1 ) */ - /* config.tiny = clopt_tiny; */ - /* if ( clopt_leave_shift_keys != -1 ) */ - /* config.leave_shift_keys = clopt_leave_shift_keys; */ - /* if ( clopt_inhibit_shutdown != -1 ) */ - /* config.inhibit_shutdown = clopt_inhibit_shutdown; */ - - /* /\* After getting configs and params *\/ */ - /* /\* normalize config_dir again in case it's been modified *\/ */ - /* if ( !normalize_config_dir() ) */ - /* fprintf( stderr, "Configuration directory doesn't exist!\n" ); */ - - /* normalize_filenames(); */ - - /* config.print_config |= config.verbose; */ - /* if ( config.print_config ) { */ - /* fprintf( stdout, - * "--------------------------------------------------------------------------------\n" - * ); */ - /* fprintf( stdout, "-- Configuration file for x48ng\n" ); */ - /* fprintf( stdout, "-- This is a comment\n" ); */ - /* fprintf( stdout, "-- `config_dir` is relative to $XDG_CONFIG_HOME/, - * or $HOME/.config/ or absolute\n" ); */ - /* fprintf( stdout, "config_dir = \"%s\"\n", configDir ); */ - /* fprintf( stdout, "\n" ); */ - /* fprintf( stdout, "-- Pathes are either relative to `config_dir` or - * absolute\n" ); */ - /* fprintf( stdout, "rom = \"%s\"\n", romFileName ); */ - /* fprintf( stdout, "ram = \"%s\"\n", ramFileName ); */ - /* fprintf( stdout, "state = \"%s\"\n", stateFileName ); */ - /* fprintf( stdout, "port1 = \"%s\"\n", port1FileName ); */ - /* fprintf( stdout, "port2 = \"%s\"\n", port2FileName ); */ - /* fprintf( stdout, "\n" ); */ - /* fprintf( stdout, "pseudo_terminal = %s\n", config.useTerminal ? - * "true" : "false" ); */ - /* fprintf( stdout, "serial = %s\n", config.useSerial ? "true" : - * "false" ); */ - /* fprintf( stdout, "serial_line = \"%s\"\n", config.serialLine ); */ - /* fprintf( stdout, "\n" ); */ - /* fprintf( stdout, "verbose = %s\n", config.verbose ? "true" : - * "false" ); */ - /* fprintf( stdout, "debugger = %s\n", config.useDebugger ? "true" : - * "false" ); */ - /* fprintf( stdout, "throttle = %s\n", config.throttle ? "true" : - * "false" ); */ - /* fprintf( stdout, "\n" ); */ - /* fprintf( stdout, "--------------------\n" ); */ - /* fprintf( stdout, "-- User Interface --\n" ); */ - /* fprintf( stdout, "--------------------\n" ); */ - /* fprintf( stdout, "frontend = \"" ); */ - /* switch ( config.frontend_type ) { */ - /* case FRONTEND_X11: */ - /* fprintf( stdout, "x11" ); */ - /* break; */ - /* case FRONTEND_SDL2: */ - /* fprintf( stdout, "sdl2" ); */ - /* break; */ - /* case FRONTEND_TEXT: */ - /* if ( config.small ) */ - /* fprintf( stdout, "tui-small" ); */ - /* else if ( config.tiny ) */ - /* fprintf( stdout, "tui-tiny" ); */ - /* else */ - /* fprintf( stdout, "tui" ); */ - /* break; */ - /* } */ - /* fprintf( stdout, "\" -- possible values: \"x11\", \"sdl2\" \"tui\", - * \"tui-small\", \"tui-tiny\"\n" ); */ - /* fprintf( stdout, "hide_chrome = %s\n", config.hide_chrome ? "true" - * : "false" ); */ - /* fprintf( stdout, "fullscreen = %s\n", config.show_ui_fullscreen ? - * "true" : "false" ); */ - /* fprintf( stdout, "scale = %f -- applies only to sdl2\n", - * config.scale ); */ - /* fprintf( stdout, "mono = %s\n", config.mono ? "true" : "false" ); - */ - /* fprintf( stdout, "gray = %s\n", config.gray ? "true" : "false" ); - */ - /* fprintf( stdout, "leave_shift_keys = %s\n", config.leave_shift_keys - * ? "true" : "false" ); */ - /* fprintf( stdout, "inhibit_shutdown = %s\n", config.inhibit_shutdown - * ? "true" : "false" ); */ - /* fprintf( stdout, "\n" ); */ - /* fprintf( stdout, "x11_visual = \"%s\"\n", config.x11_visual ); */ - /* fprintf( stdout, "netbook = %s\n", config.netbook ? "true" : - * "false" ); */ - /* fprintf( stdout, "font_small = \"%s\"\n", config.smallFont ); */ - /* fprintf( stdout, "font_medium = \"%s\"\n", config.mediumFont ); */ - /* fprintf( stdout, "font_large = \"%s\"\n", config.largeFont ); */ - /* fprintf( stdout, "font_devices = \"%s\"\n", config.connFont ); */ - /* fprintf( stdout, - * "--------------------------------------------------------------------------------\n" - * ); */ - - /* if ( !config.verbose ) */ - /* exit( 0 ); */ - /* } */ - /* if ( config.verbose ) { */ - /* fprintf( stderr, "normalized_config_path = %s\n", - * normalized_config_path ); */ - /* fprintf( stderr, "normalized_rom_path = %s\n", normalized_rom_path - * ); */ - /* fprintf( stderr, "normalized_ram_path = %s\n", normalized_ram_path - * ); */ - /* fprintf( stderr, "normalized_state_path = %s\n", - * normalized_state_path ); */ - /* fprintf( stderr, "normalized_port1_path = %s\n", - * normalized_port1_path ); */ - /* fprintf( stderr, "normalized_port2_path = %s\n", - * normalized_port2_path ); */ - /* } */ - - /* return ( optind ); */ - return 0; + return &config; } diff --git a/src/config.h b/src/config.h index d650e3e..00eb664 100644 --- a/src/config.h +++ b/src/config.h @@ -3,66 +3,26 @@ #include -/* #define FRONTEND_TEXT 0 */ -/* #define FRONTEND_X11 1 */ -/* #define FRONTEND_SDL2 2 */ - typedef struct { char* progname; + bool gx; bool verbose; - /* bool print_config; */ - /* bool useTerminal; */ - /* bool useSerial; */ - /* bool useDebugger; */ - /* bool throttle; */ - /* bool resetOnStartup; */ - /* int frontend_type; */ - - /* char* serialLine; */ - bool leave_shift_keys; - /* bool inhibit_shutdown; */ bool mono; bool gray; - - /* tui */ - bool small; - bool tiny; - - /* sdl */ bool hide_chrome; bool show_ui_fullscreen; double scale; - /* /\* x11 *\/ */ - /* bool netbook; */ - /* char* name; */ - /* char* title; */ - /* char* x11_visual; */ - /* bool monoIcon; */ - /* bool iconic; */ - /* bool xrm; */ - /* char* smallFont; */ - /* char* mediumFont; */ - /* char* largeFont; */ - /* char* connFont; */ + char* wire_name; + char* ir_name; } config_t; -extern config_t config; - -/* #define MAX_LENGTH_FILENAME 2048 */ -/* extern char normalized_config_path[ MAX_LENGTH_FILENAME ]; */ -/* extern char normalized_config_file[ MAX_LENGTH_FILENAME ]; */ -/* extern char normalized_rom_path[ MAX_LENGTH_FILENAME ]; */ -/* extern char normalized_ram_path[ MAX_LENGTH_FILENAME ]; */ -/* extern char normalized_state_path[ MAX_LENGTH_FILENAME ]; */ -/* extern char normalized_port1_path[ MAX_LENGTH_FILENAME ]; */ -/* extern char normalized_port2_path[ MAX_LENGTH_FILENAME ]; */ /*************/ /* functions */ /*************/ -extern int config_init( int argc, char* argv[] ); +extern config_t* config_init( int argc, char* argv[] ); #endif /* !_CONFIG_H */ diff --git a/src/main.c b/src/main.c index 9ba0dfd..443c2d7 100644 --- a/src/main.c +++ b/src/main.c @@ -7,7 +7,7 @@ int main( int argc, char** argv ) // start_emulator(); /* (G)UI */ - start_UI( argc, argv ); + start_UI( config_init( argc, argv ) ); while ( true ) { ui_update_LCD(); diff --git a/src/ui.c b/src/ui.c index 303a1e7..a3b9828 100644 --- a/src/ui.c +++ b/src/ui.c @@ -2293,11 +2293,8 @@ int SmallTextWidth( const char* string, unsigned int length ) for ( unsigned int i = 0; i < length; i++ ) { if ( small_font[ ( int )string[ i ] ].h != 0 ) w += small_font[ ( int )string[ i ] ].w + 1; - else { - if ( config.verbose ) - fprintf( stderr, "Unknown small letter 0x00%x\n", ( int )string[ i ] ); + else w += 5; - } } return w; @@ -2309,21 +2306,18 @@ int BigTextWidth( const char* string, unsigned int length ) for ( unsigned int i = 0; i < length; i++ ) { if ( big_font[ ( int )string[ i ] ].h != 0 ) w += big_font[ ( int )string[ i ] ].w; - else { - if ( config.verbose ) - fprintf( stderr, "Unknown small letter 0x00%x\n", ( int )string[ i ] ); + else w += 7; - } } return w; } -void start_UI( int argc, char** argv ) +void start_UI( config_t* config ) { ui_init_LCD(); - init_sdl2_ui( argc, argv ); + init_sdl2_ui( config ); } void ui_stop( void ) { sdl2_ui_stop(); } diff --git a/src/ui.h b/src/ui.h index f81e180..1b75f86 100644 --- a/src/ui.h +++ b/src/ui.h @@ -1,6 +1,7 @@ #ifndef _UI_H #define _UI_H 1 +#include "config.h" #include "emulator.h" #define DISP_ROWS 64 @@ -16,7 +17,7 @@ extern unsigned char lcd_nibbles_buffer[ DISP_ROWS ][ NIBS_PER_BUFFER_ROW ]; /*************/ /* functions */ /*************/ -extern void init_sdl2_ui( int argc, char** argv ); +extern void init_sdl2_ui( config_t* config ); extern void sdl2_ui_stop( void ); /*************************************************/ @@ -45,7 +46,7 @@ extern void ( *ui_refresh_LCD )( void ); /* used in: main.c */ /*******************/ extern void ui_stop( void ); -extern void start_UI( int argc, char** argv ); +extern void start_UI( config_t* config ); extern void close_and_exit( void ); diff --git a/src/ui_inner.h b/src/ui_inner.h index cdcf094..1e35fa5 100644 --- a/src/ui_inner.h +++ b/src/ui_inner.h @@ -85,11 +85,9 @@ extern letter_t big_font[ 128 ]; extern color_t colors_sx[ NB_COLORS ]; extern color_t colors_gx[ NB_COLORS ]; -#define COLORS ( opt_gx ? colors_gx : colors_sx ) extern button_t buttons_sx[ NB_KEYS ]; extern button_t buttons_gx[ NB_KEYS ]; -#define BUTTONS ( opt_gx ? buttons_gx : buttons_sx ) extern ann_struct_t ann_tbl[ NB_ANNUNCIATORS ]; diff --git a/src/ui_sdl2.c b/src/ui_sdl2.c index f9f91f7..49fb562 100644 --- a/src/ui_sdl2.c +++ b/src/ui_sdl2.c @@ -12,16 +12,15 @@ #include -bool opt_gx = true; -char* wire_name = "/dummy/wire"; -char* ir_name = "/dummy/ir"; - #include "config.h" #include "emulator.h" #include "ui.h" #include "ui_inner.h" +#define COLORS ( config.gx ? colors_gx : colors_sx ) +#define BUTTONS ( config.gx ? buttons_gx : buttons_sx ) + #define KEYBOARD_HEIGHT ( BUTTONS[ LAST_HPKEY ].y + BUTTONS[ LAST_HPKEY ].h ) #define KEYBOARD_WIDTH ( BUTTONS[ LAST_HPKEY ].x + BUTTONS[ LAST_HPKEY ].w ) @@ -52,6 +51,8 @@ typedef struct on_off_sdl_textures_struct_t { /*************/ /* variables */ /*************/ +static config_t config; + static int display_offset_x, display_offset_y; color_t colors[ NB_COLORS ]; @@ -524,12 +525,12 @@ static void _draw_header( void ) int y; // insert the HP Logo - if ( opt_gx ) + if ( config.gx ) x -= 6; __draw_bitmap( x, 10, hp_width, hp_height, hp_bitmap, LOGO, LOGO_BACK ); - if ( !opt_gx ) { + if ( !config.gx ) { __draw_line( display_offset_x, 9, display_offset_x + hp_width - 1, 9, FRAME ); __draw_line( display_offset_x - 1, 10, display_offset_x - 1, 10 + hp_height - 1, FRAME ); __draw_line( display_offset_x, 10 + hp_height, display_offset_x + hp_width - 1, 10 + hp_height, FRAME ); @@ -537,7 +538,7 @@ static void _draw_header( void ) } // write the name of it - if ( opt_gx ) { + if ( config.gx ) { x = display_offset_x + DISPLAY_WIDTH - gx_128K_ram_width + gx_128K_ram_x_hot + 2; y = 10 + gx_128K_ram_y_hot; __draw_bitmap( x, y, gx_128K_ram_width, gx_128K_ram_height, gx_128K_ram_bitmap, LABEL, DISP_PAD ); @@ -689,8 +690,8 @@ static void _draw_key( int hpkey ) static void _draw_keypad( void ) { int x, y; - int pw = opt_gx ? 58 : 44; - int ph = opt_gx ? 48 : 9; + int pw = config.gx ? 58 : 44; + int ph = config.gx ? 48 : 9; int left_label_width, right_label_width; int space_char_width = SmallTextWidth( " ", 1 ); int total_top_labels_width; @@ -701,7 +702,7 @@ static void _draw_keypad( void ) x = KEYBOARD_OFFSET_X + BUTTONS[ i ].x; y = KEYBOARD_OFFSET_Y + BUTTONS[ i ].y - small_ascent - small_descent; - if ( opt_gx ) { + if ( config.gx ) { x -= 6; y -= 6; } else @@ -715,7 +716,7 @@ static void _draw_keypad( void ) x = KEYBOARD_OFFSET_X + BUTTONS[ i ].x + BUTTONS[ i ].w; y = KEYBOARD_OFFSET_Y + BUTTONS[ i ].y + BUTTONS[ i ].h; - if ( opt_gx ) { + if ( config.gx ) { x += 3; y += 1; } else { @@ -855,20 +856,20 @@ static void _draw_serial_devices_path( void ) char text[ 1024 ] = ""; if ( config.verbose ) { - fprintf( stderr, "wire_name: %s\n", wire_name ); - fprintf( stderr, "ir_name: %s\n", ir_name ); + fprintf( stderr, "wire_name: %s\n", config.wire_name ); + fprintf( stderr, "ir_name: %s\n", config.ir_name ); } - if ( wire_name ) { + if ( config.wire_name ) { strcat( text, "wire: " ); - strcat( text, wire_name ); + strcat( text, config.wire_name ); } - if ( ir_name ) { + if ( config.ir_name ) { if ( strlen( text ) > 0 ) strcat( text, " | " ); strcat( text, "IR: " ); - strcat( text, ir_name ); + strcat( text, config.ir_name ); } if ( strlen( text ) > 0 ) @@ -1096,8 +1097,10 @@ void sdl2_ui_stop( void ) SDL_DestroyWindow( window ); } -void init_sdl2_ui( int argc, char** argv ) +void init_sdl2_ui( config_t* conf ) { + config = *conf; + if ( config.verbose ) fprintf( stderr, "UI is sdl2\n" );