Changeset 1505 for trunk/core/gui.c


Ignore:
Timestamp:
12/26/11 01:24:43 (18 months ago)
Author:
reyalp
Message:

merge tsvstar module code from reyalp-flt branch, + fixups for r1499, see http://chdk.setepontos.com/index.php?topic=847.msg77690#msg77690 and following posts
NOTE modules in CHDK/MODULES are now required for CHDK to work properly. On multi-partition cards, this goes on the large card.
Adds tetris and snake, originally contributed by elektro255 in http://chdk.setepontos.com/index.php?topic=2925.0

Location:
trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk

  • trunk/core/gui.c

    r1497 r1505  
    1414#include "gui_mbox.h" 
    1515#include "gui_mpopup.h" 
    16 #ifdef OPT_GAME_REVERSI 
    17 #include "gui_reversi.h" 
    18 #endif 
    19 #ifdef OPT_GAME_SOKOBAN 
    20 #include "gui_sokoban.h" 
    21 #endif 
    22 #ifdef OPT_GAME_CONNECT4 
    23 #include "gui_4wins.h" 
    24 #endif 
    25 #ifdef OPT_GAME_MASTERMIND 
    26 #include "gui_mastermind.h" 
    27 #endif 
    2816#include "console.h" 
    2917#ifdef OPT_DEBUGGING 
    3018#include "gui_debug.h" 
    31 #include "gui_bench.h" 
    3219#endif 
    3320#include "gui_fselect.h" 
     
    3926        #include "gui_read.h" 
    4027#endif 
    41 #ifdef OPT_CALENDAR 
    42         #include "gui_calendar.h" 
    43 #endif 
    4428#include "gui_grid.h" 
    4529#include "histogram.h" 
     
    5135#endif 
    5236#ifdef OPT_EDGEOVERLAY 
    53         #include "edgeoverlay.h" 
     37        #include "modules.h" 
    5438#endif 
    5539#ifdef OPT_SCRIPTING 
     
    5741    int script_params_has_changed=0; 
    5842#endif 
     43#include "module_load.h" 
     44 
    5945//------------------------------------------------------------------- 
    6046 
     
    160146static void gui_show_build_info(int arg); 
    161147static void gui_show_memory_info(int arg); 
    162 static void gui_draw_palette(int arg); 
    163 static void gui_draw_reversi(int arg); 
    164 static void gui_draw_sokoban(int arg); 
    165 static void gui_draw_4wins(int arg); 
    166 static void gui_draw_mastermind(int arg); 
     148static void     gui_modules_menu_load(); 
     149 
    167150#ifdef OPT_DEBUGGING 
    168         static void gui_draw_debug(int arg); 
    169         static void gui_draw_bench(int arg); 
    170151    void gui_compare_props(int arg); 
    171152    static void gui_menuproc_break_card(int arg); 
     
    318299#endif 
    319300 
    320 static CMenuItem games_submenu_items[] = { 
    321 #ifdef OPT_GAME_REVERSI 
    322     MENU_ITEM(0x38,LANG_MENU_GAMES_REVERSI,           MENUITEM_PROC,  gui_draw_reversi, 0 ), 
    323 #endif 
    324 #ifdef OPT_GAME_SOKOBAN 
    325     MENU_ITEM(0x38,LANG_MENU_GAMES_SOKOBAN,           MENUITEM_PROC,  gui_draw_sokoban, 0 ), 
    326 #endif 
    327 #ifdef OPT_GAME_CONNECT4 
    328     MENU_ITEM(0x38,LANG_MENU_GAMES_CONNECT4,             MENUITEM_PROC,  gui_draw_4wins, 0 ), 
    329 #endif 
    330 #ifdef OPT_GAME_MASTERMIND 
    331     MENU_ITEM(0x38,LANG_MENU_GAMES_MASTERMIND,           MENUITEM_PROC,  gui_draw_mastermind, 0 ), 
    332 #endif 
    333     MENU_ITEM(0x51,LANG_MENU_BACK,                    MENUITEM_UP, 0, 0 ), 
    334     {0} 
    335 }; 
    336 static CMenu games_submenu = {0x38,LANG_MENU_GAMES_TITLE, NULL, games_submenu_items }; 
    337  
    338301static const char* gui_autoiso_shutter_modes[] = { "Auto", "1/8s", "1/15s", "1/30s", "1/60s", "1/125s", "1/250s", "1/500s", "1/1000s"}; 
    339302static CMenuItem autoiso_submenu_items[] = { 
     
    377340    MENU_ITEM(0x2a,LANG_MENU_DEBUG_TASKLIST_START,    MENUITEM_INT|MENUITEM_F_UNSIGNED|MENUITEM_F_MINMAX,   &debug_tasklist_start, MENU_MINMAX(0, 63) ), 
    378341    MENU_ITEM(0x5c,LANG_MENU_DEBUG_SHOW_MISC_VALS,    MENUITEM_BOOL,          &conf.debug_misc_vals_show, 0 ), 
    379     MENU_ITEM(0x2a,LANG_MENU_DEBUG_MEMORY_BROWSER,    MENUITEM_PROC,          gui_draw_debug, 0 ), 
    380     MENU_ITEM(0x2a,LANG_MENU_DEBUG_BENCHMARK,         MENUITEM_PROC,          gui_draw_bench, 0 ), 
    381342    MENU_ENUM2(0x5c,LANG_MENU_DEBUG_SHORTCUT_ACTION,  &conf.debug_shortcut_action, gui_debug_shortcut_modes ), 
    382343    MENU_ITEM(0x5c,LANG_MENU_RAW_TIMER,               MENUITEM_BOOL,          &conf.raw_timer, 0 ), 
     
    397358static CMenuItem misc_submenu_items[] = { 
    398359    MENU_ITEM(0x35,LANG_MENU_MISC_FILE_BROWSER,       MENUITEM_PROC,    gui_draw_fselect, 0 ), 
    399 #ifdef OPT_CALENDAR 
    400     MENU_ITEM(0x36,LANG_MENU_MISC_CALENDAR,           MENUITEM_PROC,    gui_draw_calendar, 0 ), 
    401 #endif 
     360    MENU_ITEM(0x65,(int)"Modules",                        MENUITEM_TEXT,    0, 0 ), 
    402361#ifdef OPT_TEXTREADER 
    403362    MENU_ITEM(0x37,LANG_MENU_MISC_TEXT_READER,        MENUITEM_SUBMENU, &reader_submenu, 0 ), 
    404 #endif 
    405 #if defined (OPT_GAME_REVERSI) || (OPT_GAME_SOKOBAN || (OPT_GAME_CONNECT4) || OPT_GAME_MASTERMIND) 
    406     MENU_ITEM(0x38,LANG_MENU_MISC_GAMES,              MENUITEM_SUBMENU, &games_submenu, 0 ), 
    407363#endif 
    408364#if CAM_SWIVEL_SCREEN 
     
    418374#endif 
    419375    MENU_ITEM(0x5d,LANG_MENU_MISC_DISABLE_LCD_OFF,    MENUITEM_ENUM,    gui_alt_power_enum, 0 ), 
    420     MENU_ITEM(0x65,LANG_MENU_MISC_PALETTE,            MENUITEM_PROC,    gui_draw_palette, 0 ), 
    421376    MENU_ITEM(0x80,LANG_MENU_MISC_BUILD_INFO,         MENUITEM_PROC,    gui_show_build_info, 0 ), 
    422377    MENU_ITEM(0x80,LANG_MENU_MISC_MEMORY_INFO,        MENUITEM_PROC,    gui_show_memory_info, 0 ), 
     
    10851040    gui_enum_value_change(&conf.curve_enable,change,sizeof(modes)/sizeof(modes[0])); 
    10861041 
    1087         if(change) 
     1042        if(change && curve_init_mode) 
    10881043                curve_init_mode(); 
    10891044    return modes[conf.curve_enable]; 
     
    11381093 
    11391094void gui_load_script(int arg) { 
    1140     gui_fselect_init(LANG_STR_SELECT_SCRIPT_FILE, conf.script_file, "A/CHDK/SCRIPTS", gui_load_script_selected); 
     1095    module_fselect_init(LANG_STR_SELECT_SCRIPT_FILE, conf.script_file, "A/CHDK/SCRIPTS", gui_load_script_selected); 
    11411096} 
    11421097 
     
    15171472void gui_raw_develop(int arg){ 
    15181473 int m=mode_get(); 
    1519  gui_fselect_init(LANG_RAW_DEVELOP_SELECT_FILE, "A/DCIM", "A", raw_fselect_cb); 
     1474 module_fselect_init(LANG_RAW_DEVELOP_SELECT_FILE, "A/DCIM", "A", raw_fselect_cb); 
    15201475} 
    15211476 
     
    16301585 
    16311586//------------------------------------------------------------------- 
    1632 static volatile enum Gui_Mode gui_mode; 
     1587static volatile gui_mode_t gui_mode;    // current gui mode. if <GUI_MODE_LASTIDX - idx in guiHandlers (core modes), otherwise pointer to gui_handler object (module modes) 
     1588 
    16331589static volatile int gui_restore; 
    16341590static volatile int gui_in_redraw; 
     
    16381594static Conf old_conf; 
    16391595#endif 
     1596 
     1597extern gui_handler guiHandlers[]; 
    16401598 
    16411599//------------------------------------------------------------------- 
     
    16501608    } 
    16511609    gui_splash = (conf.splash_show)?SPLASH_TIME:0; 
     1610 
     1611        gui_modules_menu_load(); 
    16521612    user_menu_restore(); 
    16531613    gui_lang_init(); 
     
    16601620#ifdef OPT_CURVES 
    16611621        // initialize curves, loading files if required by current mode 
    1662         curve_init_mode(); 
     1622        //curve_init_mode();    // @tsv it will be initialize on first load 
    16631623#endif 
    16641624#if ZOOM_OVERRIDE 
     
    16661626//              if (conf.zoom_override) shooting_set_zoom(conf.zoom_override_value); 
    16671627#endif 
     1628} 
     1629 
     1630 
     1631//------------------------------------------------------------------- 
     1632void gui_modules_menu_load(int arg){ 
     1633 
     1634        misc_submenu_items[1].type=MENUITEM_TEXT; 
     1635 
     1636        unsigned int argv[] ={  (unsigned int)MODULES_PATH, 
     1637                                                        (unsigned int)(&misc_submenu_items[1]) 
     1638                                                 }; 
     1639        module_run("modmenu.flt", 0, 2,argv, UNLOAD_IF_ERR ); 
    16681640} 
    16691641 
     
    16741646                // TODO we could sanity check here, but curve_set_type should fail gracefullish 
    16751647                strcpy(conf.curve_file,fn); 
    1676                 if(conf.curve_enable == 1) 
     1648                if(conf.curve_enable == 1 && curve_init_mode) 
    16771649                        curve_init_mode(); 
    16781650        } 
     
    16811653//------------------------------------------------------------------- 
    16821654void gui_load_curve(int arg) { 
    1683     gui_fselect_init(LANG_STR_SELECT_CURVE_FILE, conf.curve_file, CURVE_DIR, gui_load_curve_selected); 
    1684 } 
    1685  
    1686 #endif 
    1687 //------------------------------------------------------------------- 
    1688 enum Gui_Mode gui_get_mode() { 
     1655    module_fselect_init(LANG_STR_SELECT_CURVE_FILE, conf.curve_file, CURVE_DIR, gui_load_curve_selected); 
     1656} 
     1657 
     1658#endif 
     1659 
     1660 
     1661// Small hack: use understandable name to reused data member 
     1662#define binded_gui_mode_ptr kbd_process 
     1663 
     1664//------------------------------------------------------------------- 
     1665gui_mode_t gui_get_mode() { 
     1666    if ( gui_mode >= GUI_MODE_COUNT ) 
     1667        { 
     1668                int mode; 
     1669                for (mode=0;mode<GUI_MODE_COUNT;mode++) 
     1670                { 
     1671                        if ( (guiHandlers[mode].flags & GUI_MODE_FLAG_ALIAS) &&  
     1672                                        guiHandlers[mode].binded_gui_mode_ptr == (void*)gui_mode )  
     1673                                return mode; 
     1674                } 
     1675        } 
    16891676    return gui_mode; 
    16901677} 
    16911678 
    16921679//------------------------------------------------------------------- 
    1693 void gui_set_mode(enum Gui_Mode mode) { 
     1680void gui_set_mode(gui_mode_t mode)  
     1681{ 
     1682        if ( gui_mode == mode ) 
     1683                return; 
     1684 
     1685        if (  mode < GUI_MODE_COUNT &&  
     1686                  (guiHandlers[mode].flags & GUI_MODE_FLAG_ALIAS) )  
     1687        { 
     1688                mode = (unsigned int)guiHandlers[mode].binded_gui_mode_ptr;  
     1689        } 
     1690 
     1691        // Sanity check for case module pointer - is this really gui_handler 
     1692    if ( mode >= GUI_MODE_COUNT && ((gui_handler*)mode)->magicnum != GUI_MODE_MAGICNUM ) { 
     1693                // If sanity failed (module is unload) - set to default mode 
     1694        gui_mode = GUI_MODE_NONE; 
     1695                draw_restore(); 
     1696                return; 
     1697        } 
     1698         
    16941699#ifdef CAM_TOUCHSCREEN_UI 
    16951700    if (((gui_mode == 0) != (mode == 0)) ||                         // Change from GUI_MODE_NONE to any other or vice-versa 
     
    16991704    gui_mode = mode; 
    17001705} 
     1706 
     1707//------------------------------------------------------------------- 
     1708// PURPOSE: bind module struct to  
     1709// RETUN: 0 - fail, 1 - ok 
     1710int gui_bind_mode(int core_mode, gui_handler* handler) { 
     1711 
     1712        // sanity checks 
     1713    if ( core_mode >= GUI_MODE_COUNT || 
     1714                (guiHandlers[core_mode].flags & GUI_MODE_FLAG_ALIAS)==0 
     1715           ) 
     1716                return 0; 
     1717 
     1718        if ( handler && handler->magicnum != GUI_MODE_MAGICNUM ) 
     1719                return 0; 
     1720 
     1721        // check is this module is already binded (loaded with different name) 
     1722        gui_handler* bind_gui_handler = (gui_handler*)guiHandlers[core_mode].binded_gui_mode_ptr; 
     1723        if ( bind_gui_handler && bind_gui_handler->magicnum == GUI_MODE_MAGICNUM ) 
     1724                return 0; 
     1725 
     1726        guiHandlers[core_mode].binded_gui_mode_ptr = (void*)handler; 
     1727        return 1; 
     1728} 
     1729 
     1730#undef binded_gui_mode_ptr 
     1731 
    17011732 
    17021733//------------------------------------------------------------------- 
     
    19611992} 
    19621993 
    1963 // Menu button handled for text reader 
    1964 #ifdef OPT_TEXTREADER 
    1965 void gui_read_kbd_process_menu_btn() 
    1966 { 
    1967     gui_read_kbd_process(); 
    1968     gui_default_kbd_process_menu_btn(); 
    1969 } 
    1970 #endif 
    1971  
    19721994// Menu button handled for Menu mode 
    19731995void gui_menu_kbd_process_menu_btn() 
     
    19882010 
    19892011//------------------------------------------------------------------- 
    1990 // Structure to store gui redraw and kbd process handlers for each mode 
    1991 typedef struct 
     2012// GUI handler table (entries must be in the same order and have the same number of entries as Gui_Mode enum) 
     2013gui_handler guiHandlers[GUI_MODE_COUNT] = 
    19922014{ 
    1993     void (*redraw)(void);                   // Called to redraw screen 
    1994     void (*kbd_process)(void);              // Main button handler for mode 
    1995     void (*kbd_process_menu_btn)(void);     // Menu button handler for mode 
    1996 } gui_handler; 
    1997  
    1998 // GUI handler table (entries must be in the same order and have the same number of entries as Gui_Mode enum) 
    1999 gui_handler guiHandlers[] = 
    2000 { 
    2001     /*GUI_MODE_NONE*/           { gui_draw_osd,         0,                          0 }, 
    2002     /*GUI_MODE_ALT*/            { gui_chdk_draw,        gui_chdk_kbd_process,       gui_chdk_kbd_process_menu_btn }, 
    2003     /*GUI_MODE_MENU*/           { gui_menu_draw,        gui_menu_kbd_process,       gui_menu_kbd_process_menu_btn }, 
    2004     /*GUI_MODE_PALETTE*/        { gui_palette_draw,     gui_palette_kbd_process,    gui_default_kbd_process_menu_btn }, 
    2005     /*GUI_MODE_MBOX*/           { gui_mbox_draw,        gui_mbox_kbd_process,       0 }, 
    2006 #ifdef OPT_GAME_REVERSI 
    2007     /*GUI_MODE_REVERSI*/        { gui_reversi_draw,     gui_reversi_kbd_process,    gui_default_kbd_process_menu_btn }, 
    2008 #else 
    2009                                 { 0, 0, 0 }, 
    2010 #endif 
    2011 #ifdef OPT_GAME_SOKOBAN 
    2012     /*GUI_MODE_SOKOBAN*/        { gui_sokoban_draw,     gui_sokoban_kbd_process,    gui_default_kbd_process_menu_btn }, 
    2013 #else 
    2014                                 { 0, 0, 0 }, 
    2015 #endif 
    2016 #ifdef OPT_DEBUGGING 
    2017     /*GUI_MODE_DEBUG*/          { gui_debug_draw,       gui_debug_kbd_process,      gui_default_kbd_process_menu_btn }, 
    2018 #else 
    2019                                 { 0, 0, 0 }, 
    2020 #endif 
    2021     /*GUI_MODE_FSELECT*/        { gui_fselect_draw,     gui_fselect_kbd_process,    gui_fselect_kbd_process }, 
    2022 #ifdef OPT_TEXTREADER 
    2023     /*GUI_MODE_READ*/           { gui_read_draw,        gui_read_kbd_process,       gui_read_kbd_process_menu_btn }, 
    2024 #else 
    2025                                 { 0, 0, 0 }, 
    2026 #endif 
    2027     /*GUI_MODE_OSD*/            { gui_osd_draw,         gui_osd_kbd_process,        gui_default_kbd_process_menu_btn }, 
    2028 #ifdef OPT_CALENDAR 
    2029     /*GUI_MODE_CALENDAR*/       { gui_calendar_draw,    gui_calendar_kbd_process,   gui_default_kbd_process_menu_btn }, 
    2030 #else 
    2031                                 { 0, 0, 0 }, 
    2032 #endif 
    2033 #ifdef OPT_DEBUGGING 
    2034     /*GUI_MODE_BENCH*/          { gui_bench_draw,       gui_bench_kbd_process,      gui_default_kbd_process_menu_btn }, 
    2035 #else 
    2036                                 { 0, 0, 0 }, 
    2037 #endif 
    2038     /*GUI_MODE_MPOPUP*/         { gui_mpopup_draw,      gui_mpopup_kbd_process,     gui_mpopup_kbd_process }, 
    2039 #ifdef OPT_GAME_CONNECT4 
    2040     /*GUI_MODE_4WINS*/          { gui_4wins_draw,       gui_4wins_kbd_process,      gui_default_kbd_process_menu_btn }, 
    2041 #else 
    2042                                 { 0, 0, 0 }, 
    2043 #endif 
    2044 #ifdef OPT_GAME_MASTERMIND 
    2045     /*GUI_MODE_MASTERMIND*/     { gui_mastermind_draw,  gui_mastermind_kbd_process, gui_default_kbd_process_menu_btn }, 
    2046 #else 
    2047                                 { 0, 0, 0 }, 
    2048 #endif 
     2015    /*GUI_MODE_NONE*/           { gui_draw_osd,         0,                          0,                                                          0,                                                                      GUI_MODE_MAGICNUM }, 
     2016    /*GUI_MODE_ALT*/            { gui_chdk_draw,        gui_chdk_kbd_process,       gui_chdk_kbd_process_menu_btn,      0,                                                                      GUI_MODE_MAGICNUM },             
     2017    /*GUI_MODE_MENU*/           { gui_menu_draw,        gui_menu_kbd_process,       gui_menu_kbd_process_menu_btn,      0,                                                                      GUI_MODE_MAGICNUM }, 
     2018    /*GUI_MODE_ALIAS_PALETTE*/  { 0,                                    0,                                              0,                                                              GUI_MODE_FLAG_ALIAS,                            GUI_MODE_MAGICNUM }, 
     2019    /*GUI_MODE_MBOX*/           { gui_mbox_draw,        gui_mbox_kbd_process,       0,                                                          GUI_MODE_FLAG_NORESTORE_ON_SWITCH,      GUI_MODE_MAGICNUM }, 
     2020    /*GUI_MODE_ALIAS_FSELECT*/  { 0,                                    0,                                              0,                                                              GUI_MODE_FLAG_ALIAS,                            GUI_MODE_MAGICNUM }, 
     2021    /*GUI_MODE_OSD*/            { gui_osd_draw,         gui_osd_kbd_process,        gui_default_kbd_process_menu_btn, 0,                                                                 GUI_MODE_MAGICNUM },           // THIS IS OSD LAYOUT EDITOR 
     2022    /*GUI_MODE_ALIAS_MPOPUP*/   { 0,                                    0,                                              0,                                                              GUI_MODE_FLAG_ALIAS,                            GUI_MODE_MAGICNUM }, 
    20492023}; 
     2024 
    20502025 
    20512026//------------------------------------------------------------------- 
     
    20532028void gui_redraw() 
    20542029{ 
    2055     enum Gui_Mode gui_mode_old; 
     2030    static gui_mode_t gui_mode_prev_tick = GUI_MODE_NONE; 
     2031    gui_mode_t gui_mode_old; 
     2032 
     2033    static int flag_gui_enforce_redraw = 0; 
    20562034 
    20572035#ifdef CAM_DETECT_SCREEN_ERASE 
     
    20592037    { 
    20602038        draw_set_guard(); 
    2061         gui_menu_force_redraw(); 
    2062         gui_fselect_force_redraw(); 
     2039 
     2040                flag_gui_enforce_redraw |= GUI_REDRAWFLAG_ERASEGUARD; 
     2041        //gui_menu_force_redraw(); 
     2042        //gui_fselect_force_redraw();   //@tsv 
    20632043#ifdef CAM_TOUCHSCREEN_UI 
    20642044        extern int redraw_buttons; 
     
    20792059 
    20802060    // Call redraw handler 
    2081     if (guiHandlers[gui_mode].redraw) guiHandlers[gui_mode].redraw(); 
     2061        gui_handler* cur_gui_handler = (gui_mode<GUI_MODE_COUNT)? (&guiHandlers[gui_mode]) : (gui_handler*)gui_mode; 
     2062    if (cur_gui_handler->redraw) cur_gui_handler->redraw(flag_gui_enforce_redraw); 
     2063        flag_gui_enforce_redraw=0; 
    20822064 
    20832065    // Forced redraw if needed 
    20842066    gui_in_redraw = 0; 
    2085     if ((gui_mode_old != gui_mode && (gui_mode_old != GUI_MODE_NONE && gui_mode_old != GUI_MODE_ALT) && (gui_mode != GUI_MODE_MBOX && gui_mode != GUI_MODE_MPOPUP)) || gui_restore) { 
    2086         if (gui_restore) gui_menu_force_redraw(); 
     2067        cur_gui_handler = (gui_mode<GUI_MODE_COUNT)? (&guiHandlers[gui_mode]) : (gui_handler*)gui_mode; 
     2068    if ((gui_mode_old != gui_mode  
     2069                        && (gui_mode_old != GUI_MODE_NONE && gui_mode_old != GUI_MODE_ALT)  
     2070                        && !(cur_gui_handler->flags & GUI_MODE_FLAG_NORESTORE_ON_SWITCH))  
     2071            || gui_restore )  
     2072        { 
     2073 
     2074        if (gui_restore) 
     2075                        flag_gui_enforce_redraw |= GUI_REDRAWFLAG_DRAW_RESTORED; 
    20872076        gui_restore = 0; 
    2088         if (gui_mode != GUI_MODE_REVERSI && gui_mode != GUI_MODE_SOKOBAN && gui_mode != GUI_MODE_4WINS && gui_mode != GUI_MODE_MASTERMIND) 
     2077 
     2078        if ( !( cur_gui_handler->flags & GUI_MODE_FLAG_NODRAWRESTORE) ) 
    20892079            draw_restore(); 
    20902080    } 
     2081 
     2082        if ( gui_mode_prev_tick != gui_mode ) { 
     2083                flag_gui_enforce_redraw |= GUI_REDRAWFLAG_MODE_WAS_CHANGED; 
     2084                gui_mode_prev_tick = gui_mode; 
     2085        } 
    20912086} 
    20922087 
     
    20952090void gui_kbd_process() 
    20962091{ 
     2092        gui_handler* cur_gui_handler = (gui_mode<GUI_MODE_COUNT)? (&guiHandlers[gui_mode]) : (gui_handler*)gui_mode;     
     2093 
    20972094    // Call menu button handler if menu button pressed 
    20982095    if (kbd_is_key_clicked(KEY_MENU)) 
    20992096    { 
    2100         if (guiHandlers[gui_mode].kbd_process_menu_btn) guiHandlers[gui_mode].kbd_process_menu_btn(); 
     2097        if (cur_gui_handler->kbd_process_menu_btn) cur_gui_handler->kbd_process_menu_btn(); 
    21012098        return; 
    21022099    } 
    21032100 
    21042101    // Call mode handler for other buttons 
    2105     if (guiHandlers[gui_mode].kbd_process) guiHandlers[gui_mode].kbd_process(); 
     2102    if (cur_gui_handler->kbd_process) cur_gui_handler->kbd_process(); 
    21062103} 
    21072104 
     
    21432140#endif 
    21442141    draw_restore(); 
    2145     if (gui_mode == GUI_MODE_READ && !rbf_load(conf.menu_rbf_file)) 
    2146         rbf_load_from_8x16(current_font); 
    21472142    rbf_set_codepage(FONT_CP_WIN); 
    21482143    vid_turn_on_updates(); 
    21492144    gui_set_mode(GUI_MODE_NONE); 
     2145 
     2146        // Unload all modules which are marked as safe to unload 
     2147        module_async_unload_allrunned(0); 
    21502148 
    21512149        conf_update_prevent_shutdown(); 
     
    26072605 
    26082606//------------------------------------------------------------------- 
    2609 void gui_draw_palette(int arg) { 
    2610     draw_restore(); 
    2611     gui_palette_init(PALETTE_MODE_DEFAULT, 0x00, NULL); 
    2612     gui_set_mode(GUI_MODE_PALETTE); 
    2613 } 
    2614  
    2615 //------------------------------------------------------------------- 
    26162607void gui_show_build_info(int arg) { 
    26172608    static char buf[192]; 
     
    26392630 
    26402631//------------------------------------------------------------------- 
    2641 #ifdef OPT_GAME_REVERSI 
    2642 void gui_draw_reversi(int arg) { 
    2643     if ((mode_get()&MODE_MASK) != MODE_PLAY) { 
    2644         gui_mbox_init(LANG_MSG_INFO_TITLE, LANG_MSG_SWITCH_TO_PLAY_MODE, 
    2645                       MBOX_FUNC_RESTORE|MBOX_TEXT_CENTER, NULL); 
    2646         return; 
    2647     } 
    2648  
    2649     gui_set_mode(GUI_MODE_REVERSI); 
    2650     gui_reversi_init(); 
    2651 } 
    2652 #endif 
    2653  
    2654 //------------------------------------------------------------------- 
    2655 #ifdef OPT_GAME_SOKOBAN 
    2656 void gui_draw_sokoban(int arg) { 
    2657     if ((mode_get()&MODE_MASK) != MODE_PLAY) { 
    2658         gui_mbox_init(LANG_MSG_INFO_TITLE, LANG_MSG_SWITCH_TO_PLAY_MODE, 
    2659                       MBOX_FUNC_RESTORE|MBOX_TEXT_CENTER, NULL); 
    2660         return; 
    2661     } 
    2662     if ( gui_sokoban_init() ) 
    2663         gui_set_mode(GUI_MODE_SOKOBAN); 
    2664 } 
    2665 #endif 
    2666 //------------------------------------------------------------------- 
    2667 #ifdef OPT_GAME_CONNECT4 
    2668 void gui_draw_4wins(int arg) { 
    2669     if ((mode_get()&MODE_MASK) != MODE_PLAY) { 
    2670         gui_mbox_init(LANG_MSG_INFO_TITLE, LANG_MSG_SWITCH_TO_PLAY_MODE, 
    2671                       MBOX_FUNC_RESTORE|MBOX_TEXT_CENTER, NULL); 
    2672         return; 
    2673     } 
    2674     if ( gui_4wins_init() ) 
    2675         gui_set_mode(GUI_MODE_4WINS); 
    2676 } 
    2677 #endif 
    2678 //------------------------------------------------------------------- 
    2679 #ifdef OPT_GAME_MASTERMIND 
    2680 void gui_draw_mastermind(int arg) { 
    2681     if ((mode_get()&MODE_MASK) != MODE_PLAY) { 
    2682         gui_mbox_init(LANG_MSG_INFO_TITLE, LANG_MSG_SWITCH_TO_PLAY_MODE, 
    2683                       MBOX_FUNC_RESTORE|MBOX_TEXT_CENTER, NULL); 
    2684         return; 
    2685     } 
    2686     if ( gui_mastermind_init() ) 
    2687         gui_set_mode(GUI_MODE_MASTERMIND); 
    2688 } 
    2689 #endif 
    2690 //------------------------------------------------------------------- 
    2691 #ifdef OPT_DEBUGGING 
    2692 void gui_draw_debug(int arg) { 
    2693 //    gui_debug_init(0x2510); 
    2694 //    gui_debug_init(0x127E0); 
    2695 //    gui_debug_init(0x7F5B8); 
    2696 //    gui_debug_init(malloc(16)); 
    2697     gui_debug_init((void*)conf.mem_view_addr_init); 
    2698 } 
    2699  
    2700 //------------------------------------------------------------------- 
    2701 void gui_draw_bench(int arg) { 
    2702     gui_set_mode(GUI_MODE_BENCH); 
    2703     gui_bench_init(); 
    2704 } 
    2705 #endif 
    2706 //------------------------------------------------------------------- 
    2707  
     2632void gui_menu_run_fltmodule(int arg) { 
     2633    module_run((char*)arg, 0, 0,0, UNLOAD_IF_ERR); 
     2634} 
     2635 
     2636//------------------------------------------------------------------- 
    27082637void gui_draw_splash(char* logo, int logo_size) { 
    27092638    coord w, h, x, y; 
     
    27642693//------------------------------------------------------------------- 
    27652694void gui_draw_fselect(int arg) { 
    2766     gui_fselect_init(LANG_STR_FILE_BROWSER, "A", "A", NULL); 
     2695    module_fselect_init(LANG_STR_FILE_BROWSER, "A", "A", NULL); 
    27672696} 
    27682697 
     
    27732702} 
    27742703void gui_grid_lines_load(int arg) { 
    2775     gui_fselect_init(LANG_STR_SELECT_GRID_FILE, conf.grid_lines_file, "A/CHDK/GRIDS", gui_grid_lines_load_selected); 
     2704    module_fselect_init(LANG_STR_SELECT_GRID_FILE, conf.grid_lines_file, "A/CHDK/GRIDS", gui_grid_lines_load_selected); 
    27762705} 
    27772706 
     
    27892718            rbf_load_from_8x16(current_font); 
    27902719        rbf_set_codepage(conf.reader_codepage); 
    2791         gui_set_mode(GUI_MODE_READ); 
    2792         gui_read_init(fn); 
     2720 
     2721                unsigned int argv[] ={ (unsigned int)fn }; 
     2722                module_run("txtread.flt", 0, sizeof(argv)/sizeof(argv[0]), argv, UNLOAD_IF_ERR); 
    27932723    } 
    27942724} 
    27952725 
    27962726void gui_draw_read(int arg) { 
    2797     gui_fselect_init(LANG_STR_SELECT_TEXT_FILE, conf.reader_file, "A/CHDK/BOOKS", gui_draw_read_selected); 
     2727    module_fselect_init_w_mode(LANG_STR_SELECT_TEXT_FILE, conf.reader_file, "A/CHDK/BOOKS", gui_draw_read_selected, 1); 
    27982728    void gui_fselect_set_key_redraw(int n); 
    2799     gui_fselect_set_key_redraw(1); 
     2729    //gui_fselect_set_key_redraw(1);    @tsv 
    28002730} 
    28012731 
     
    28182748#ifdef OPT_EDGEOVERLAY 
    28192749static void gui_load_edge_selected( const char* fn ) { 
    2820     if( fn ) 
    2821         load_edge_overlay(fn); 
     2750    if( fn && module_edgeovr_load()) 
     2751                load_edge_overlay(fn); 
    28222752} 
    28232753 
    28242754void gui_menuproc_edge_save(int arg) { 
    2825     save_edge_overlay(); 
     2755        if ( module_edgeovr_load() ) 
     2756        save_edge_overlay(); 
    28262757} 
    28272758 
    28282759void gui_menuproc_edge_load(int arg) { 
    2829     gui_fselect_init(LANG_MENU_EDGE_LOAD, EDGE_SAVE_DIR, EDGE_SAVE_DIR, gui_load_edge_selected); 
    2830 } 
    2831 #endif 
    2832  
    2833 //------------------------------------------------------------------- 
    2834 #ifdef OPT_CALENDAR 
    2835 void gui_draw_calendar(int arg) { 
    2836     gui_set_mode(GUI_MODE_CALENDAR); 
    2837     gui_calendar_init(); 
    2838 } 
    2839 #endif 
     2760    module_fselect_init(LANG_MENU_EDGE_LOAD, EDGE_SAVE_DIR, EDGE_SAVE_DIR, gui_load_edge_selected); 
     2761} 
     2762#endif 
     2763 
    28402764//------------------------------------------------------------------- 
    28412765#ifdef OPT_TEXTREADER 
     
    28462770} 
    28472771void gui_draw_load_rbf(int arg) { 
    2848     gui_fselect_init(LANG_STR_SELECT_FONT_FILE, conf.reader_rbf_file, "A/CHDK/FONTS", gui_draw_rbf_selected); 
     2772    module_fselect_init(LANG_STR_SELECT_FONT_FILE, conf.reader_rbf_file, "A/CHDK/FONTS", gui_draw_rbf_selected); 
    28492773} 
    28502774#endif 
     
    28602784} 
    28612785void gui_draw_load_menu_rbf(int arg) { 
    2862     gui_fselect_init(LANG_STR_SELECT_FONT_FILE, conf.menu_rbf_file, "A/CHDK/FONTS", gui_draw_menu_rbf_selected); 
     2786    module_fselect_init(LANG_STR_SELECT_FONT_FILE, conf.menu_rbf_file, "A/CHDK/FONTS", gui_draw_menu_rbf_selected); 
    28632787} 
    28642788 
     
    28722796} 
    28732797void gui_draw_load_symbol_rbf(int arg) { 
    2874     gui_fselect_init(LANG_STR_SELECT_SYMBOL_FILE, conf.menu_symbol_rbf_file, "A/CHDK/SYMBOLS", gui_draw_symbol_rbf_selected); 
     2798    module_fselect_init(LANG_STR_SELECT_SYMBOL_FILE, conf.menu_symbol_rbf_file, "A/CHDK/SYMBOLS", gui_draw_symbol_rbf_selected); 
    28752799} 
    28762800 
     
    28842808} 
    28852809void gui_draw_load_lang(int arg) { 
    2886     gui_fselect_init(LANG_STR_SELECT_LANG_FILE, conf.lang_file, "A/CHDK/LANG", gui_draw_lang_selected); 
    2887 } 
    2888  
    2889 int find_mnu(CMenu *curr_menu, int mnu, int count) 
     2810    module_fselect_init(LANG_STR_SELECT_LANG_FILE, conf.lang_file, "A/CHDK/LANG", gui_draw_lang_selected); 
     2811} 
     2812 
     2813CMenuItem* find_mnu(CMenu *curr_menu, int itemid ) 
    28902814{ 
    28912815        int gui_menu_curr_item; 
     2816        CMenuItem* rv=0; 
     2817 
     2818        if ( itemid==0 ) 
     2819                return 0;                
    28922820 
    28932821        gui_menu_curr_item = 0; 
    28942822        while(curr_menu->menu[gui_menu_curr_item].text) { 
    2895                 if (curr_menu->menu[gui_menu_curr_item].text == mnu){ 
    2896                         user_submenu_items[count] = curr_menu->menu[gui_menu_curr_item]; 
    2897                         return 1; 
     2823                if ( lang_strhash31(curr_menu->menu[gui_menu_curr_item].text) == itemid){ 
     2824                        return (CMenuItem*) &(curr_menu->menu[gui_menu_curr_item]); 
    28982825                } 
    28992826                if ((curr_menu->menu[gui_menu_curr_item].type & MENUITEM_MASK) == MENUITEM_SUBMENU) 
    2900                         if (curr_menu->menu[gui_menu_curr_item].text != LANG_MENU_USER_MENU) 
    2901                                 if (find_mnu((CMenu*)(curr_menu->menu[gui_menu_curr_item].value), mnu, count)) return 1; 
     2827                        if (curr_menu->menu[gui_menu_curr_item].text != LANG_MENU_USER_MENU) { 
     2828                                rv = find_mnu((CMenu*)(curr_menu->menu[gui_menu_curr_item].value), itemid); 
     2829                                if ( rv ) 
     2830                                        return rv; 
     2831                        } 
    29022832                gui_menu_curr_item++; 
    29032833        } 
     
    29122842                 * conf.user_menu_vars only traks/saves the real user entries. 
    29132843                 */ 
    2914                 conf.user_menu_vars[x] = user_submenu_items[x+1].text; 
     2844                conf.user_menu_vars[x] = lang_strhash31(user_submenu_items[x+1].text); 
    29152845        } 
    29162846} 
    29172847 
    29182848void user_menu_restore() { 
    2919      int x; 
     2849    int x; 
     2850        CMenuItem* item=0; 
     2851 
    29202852        for (x=0; x<USER_MENU_ITEMS; x++) { 
    29212853                /* 
     
    29232855                 * conf.user_menu_vars only traks/saves the real user entries. 
    29242856                 */ 
    2925                 find_mnu(&root_menu, conf.user_menu_vars[x], x+1); 
     2857                 item = find_mnu(&root_menu, conf.user_menu_vars[x]); 
     2858                 if ( item ) 
     2859                        user_submenu_items[x+1] = *item; 
    29262860        } 
    29272861} 
Note: See TracChangeset for help on using the changeset viewer.