source: trunk/core/gui.c @ 587

Revision 587, 125.9 KB checked in by msl, 2 years ago (diff)

Ergaenzung zur Revision 585

  • Betrifft alle Kameras

+ Anzeige der Revisionsnummer unter "Zeige Versions-Info"
+ Aktualisierung der Sprachdatei notwendig.

  • Property svn:eol-style set to native
Line 
1#include "stdlib.h"
2#include "platform.h"
3#include "core.h"
4#include "keyboard.h"
5#include "conf.h"
6#include "camera.h"
7#include "font.h"
8#include "lang.h"
9#include "gui.h"
10#include "gui_lang.h"
11#include "gui_draw.h"
12#include "gui_menu.h"
13#include "gui_palette.h"
14#include "gui_mbox.h"
15#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
28#ifdef OPT_GAME_TETRIS
29    #include "gui_tetris.h"
30#endif
31#include "console.h"
32#ifdef OPT_DEBUGGING
33    #include "gui_debug.h"
34#endif
35#include "gui_fselect.h"
36#include "gui_batt.h"
37#include "gui_usb.h"
38#include "gui_space.h"
39#include "gui_osd.h"
40#ifdef OPT_TEXTREADER
41    #include "gui_read.h"
42#endif
43#ifdef OPT_CALENDAR
44    #include "gui_calendar.h"
45#endif
46#ifdef OPT_DEBUGGING
47    #include "gui_bench.h"
48#endif
49#include "gui_grid.h"
50#include "histogram.h"
51#include "motion_detector.h"
52#include "raw.h"
53#ifdef OPT_CURVES
54    #include "curves.h"
55#endif
56#ifdef OPT_EDGEOVERLAY
57    #include "edgeoverlay.h"
58#endif
59#ifdef OPT_SCRIPTING
60    #include "script.h"
61    int script_params_has_changed=0;
62#endif
63//-------------------------------------------------------------------
64
65#define OPTIONS_AUTOSAVE
66#define SPLASH_TIME               20
67
68//shortcuts
69//------------------------------------------------------------------
70// #define KEY_NONE (KEY_DUMMY+1)
71
72#if !CAM_HAS_ERASE_BUTTON
73    //Alt mode
74    #define SHORTCUT_TOGGLE_RAW          KEY_DISPLAY
75    #define SHORTCUT_MF_TOGGLE           KEY_UP
76    //Half press shoot button   
77    #define SHORTCUT_TOGGLE_HISTO        KEY_DOWN
78    #define SHORTCUT_TOGGLE_ZEBRA        KEY_MENU
79    #define SHORTCUT_TOGGLE_OSD          KEY_RIGHT
80    #define SHORTCUT_DISABLE_OVERRIDES   KEY_LEFT
81    //Alt mode & Manual mode   
82    #define SHORTCUT_SET_INFINITY        KEY_DISPLAY
83    #define SHORTCUT_SET_HYPERFOCAL      KEY_DOWN
84    // For models without ZOOM_LEVER  (#if !CAM_HAS_ZOOM_LEVER)
85    // SHORTCUT_SET_INFINITY is not used
86    // KEY_DISPLAY is used for gui_subj_dist_override_koef_enum;
87    // KEY_LEFT/KEY_RIGHT is used for gui_subj_dist_override_value_enum (because of no separate ZOOM_IN/OUT)
88
89#elif defined(CAMERA_g7) || defined(CAMERA_sx10) || defined(CAMERA_sx1) ||defined(CAMERA_sx120is) || defined(CAMERA_sx20) || defined(CAMERA_sx30)
90    //Alt mode
91    #define SHORTCUT_TOGGLE_RAW          KEY_ERASE
92    //Half press shoot button   
93    #define SHORTCUT_TOGGLE_HISTO        KEY_DOWN
94    #define SHORTCUT_TOGGLE_ZEBRA        KEY_LEFT
95    #define SHORTCUT_TOGGLE_OSD          KEY_RIGHT
96    #define SHORTCUT_DISABLE_OVERRIDES   KEY_UP
97    //Alt mode & Manual mode 
98    #define SHORTCUT_SET_INFINITY        KEY_UP
99    #define SHORTCUT_SET_HYPERFOCAL      KEY_DOWN
100
101#elif defined(CAMERA_sx100is) || defined(CAMERA_sx110is)
102    //Alt mode
103    #define SHORTCUT_TOGGLE_RAW          KEY_ERASE
104    //Half press shoot button   
105    #define SHORTCUT_TOGGLE_HISTO        KEY_UP
106    #define SHORTCUT_TOGGLE_ZEBRA        KEY_DOWN
107    #define SHORTCUT_TOGGLE_OSD          KEY_RIGHT
108    #define SHORTCUT_DISABLE_OVERRIDES   KEY_LEFT
109    //Alt mode & Manual mode 
110    #define SHORTCUT_SET_INFINITY        KEY_UP
111    #define SHORTCUT_SET_HYPERFOCAL      KEY_DOWN
112
113#else
114
115    //Alt mode
116    #define SHORTCUT_TOGGLE_RAW          KEY_ERASE
117    //Half press shoot button   
118    #define SHORTCUT_TOGGLE_HISTO        KEY_UP
119    #define SHORTCUT_TOGGLE_ZEBRA        KEY_LEFT
120    #define SHORTCUT_TOGGLE_OSD          KEY_RIGHT
121    #define SHORTCUT_DISABLE_OVERRIDES   KEY_DOWN
122    //Alt mode & Manual mode 
123    #define SHORTCUT_SET_INFINITY        KEY_UP
124    #define SHORTCUT_SET_HYPERFOCAL      KEY_DOWN
125    #ifndef CAM_HAS_MANUAL_FOCUS
126        #define SHORTCUT_MF_TOGGLE       KEY_DISPLAY
127    #endif
128#endif
129
130#if CAM_HAS_ZOOM_LEVER
131    #define SHORTCUT_SD_SUB KEY_ZOOM_OUT
132    #define SHORTCUT_SD_ADD KEY_ZOOM_IN
133#endif
134
135// forward declarations
136//-------------------------------------------------------------------
137extern void dump_memory();
138// both from platform/generic/shooting.c
139extern const char* tv_override[];
140extern const int tv_override_amount;
141extern const int tv_override_zero_shift;
142
143static void gui_draw_osd();
144
145static void gui_draw_splash(char* logo, int logo_size);
146
147void user_menu_save();
148void user_menu_restore();
149// Menu procs
150//-------------------------------------------------------------------
151static void gui_show_build_info(int arg);
152static void gui_show_memory_info(int arg);
153static void gui_draw_palette(int arg);
154#ifdef OPT_GAME_REVERSI
155    static void gui_draw_reversi(int arg);
156#endif
157#ifdef OPT_GAME_SOKOBAN
158    static void gui_draw_sokoban(int arg);
159#endif
160#ifdef OPT_GAME_CONNECT4
161    static void gui_draw_4wins(int arg);
162#endif
163#ifdef OPT_GAME_MASTERMIND
164    static void gui_draw_mastermind(int arg);
165#endif
166#ifdef OPT_GAME_TETRIS
167    static void gui_draw_tetris(int arg);
168#endif
169#ifdef OPT_DEBUGGING
170    static void gui_draw_debug(int arg);
171    static void gui_draw_bench(int arg);
172#endif
173static void gui_draw_fselect(int arg);
174static void gui_draw_osd_le(int arg);
175#ifdef OPT_TEXTREADER
176    static void gui_draw_read(int arg);
177    static void gui_draw_read_last(int arg);
178#endif
179static void gui_draw_load_menu_rbf(int arg);
180static void gui_draw_load_symbol_rbf(int arg);      //AKA
181#ifdef OPT_TEXTREADER
182    static void gui_draw_load_rbf(int arg);
183#endif
184#ifdef OPT_CALENDAR
185    static void gui_draw_calendar(int arg);
186#endif
187static void gui_draw_load_lang(int arg);
188static void gui_menuproc_mkbootdisk(int arg);
189#ifdef OPT_DEBUGGING
190    void gui_compare_props(int arg);
191#endif
192#ifndef OPTIONS_AUTOSAVE
193    static void gui_menuproc_save(int arg);
194#endif
195static void gui_menuproc_reset(int arg);
196static void gui_grid_lines_load(int arg);
197static void gui_raw_develop(int arg);
198#ifdef OPT_DEBUGGING
199    static void gui_menuproc_break_card(int arg);
200#endif
201static void gui_menuproc_swap_partitions(int arg);
202static void gui_menuproc_reset_files(int arg);
203#ifdef OPT_CURVES
204    static void gui_load_curve_selected(const char *fn);
205    static void gui_load_curve(int arg);
206#endif
207static const char* gui_histo_show_enum(int change, int arg);
208static const char* gui_histo_mode_enum(int change, int arg);
209static const char* gui_temp_mode_enum(int change, int arg);
210static const char* gui_histo_layout_enum(int change, int arg);
211static const char* gui_zebra_mode_enum(int change, int arg);
212static const char* gui_zebra_draw_osd_enum(int change, int arg);
213static const char* gui_font_enum(int change, int arg);
214static const char* gui_raw_prefix_enum(int change, int arg);
215static const char* gui_raw_ext_enum(int change, int arg);
216static const char* gui_sub_batch_prefix_enum(int change, int arg);
217static const char* gui_sub_batch_ext_enum(int change, int arg);
218
219static const char* gui_raw_nr_enum(int change, int arg);
220static const char* gui_autoiso_shutter_enum(int change, int arg);
221#ifdef OPT_TEXTREADER
222    static const char* gui_reader_codepage_enum(int change, int arg);
223#endif
224static const char* gui_zoom_value_enum(int change, int arg);
225static const char* gui_show_values_enum(int change, int arg);
226static const char* gui_dof_show_value_enum(int change, int arg);
227#if CAM_ADJUSTABLE_ALT_BUTTON
228    static const char* gui_alt_mode_button_enum(int change, int arg);
229#endif
230static const char* gui_alt_power_enum(int change, int arg);
231static const char* gui_video_mode_enum(int change, int arg);
232static const char* gui_fast_ev_step(int change, int arg);
233#if CAM_QUALITY_OVERRIDE
234    static const char* gui_fast_image_quality(int change, int arg);
235#endif
236static const char* gui_video_bitrate_enum(int change, int arg);
237static const char* gui_tv_bracket_values_enum(int change, int arg);
238static const char* gui_av_bracket_values_enum(int change, int arg);
239static const char* gui_iso_bracket_koef_enum(int change, int arg);
240static const char* gui_subj_dist_bracket_koef_enum(int change, int arg);
241static const char* gui_bracket_type_enum(int change, int arg);
242static const char* gui_av_override_enum(int change, int arg);
243#if ZOOM_OVERRIDE
244    static const char* gui_zoom_override_enum(int change, int arg);
245#endif
246static const char* gui_iso_override_koef_enum(int change, int arg);
247static const char* gui_tv_override_koef_enum(int change, int arg);
248static const char* gui_tv_override_value_enum(int change, int arg);
249static const char* gui_tv_enum_type_enum(int change, int arg);
250static const char* gui_subj_dist_override_value_enum(int change, int arg);
251static const char* gui_subj_dist_override_koef_enum(int change, int arg);
252static const char* gui_nd_filter_state_enum(int change, int arg);
253//static const char* gui_tv_enum(int change, int arg);
254const char* gui_user_menu_show_enum(int change, int arg);
255static const char* gui_hide_osd_enum(int change, int arg);
256static const char* gui_show_clock_enum(int change, int arg);
257static const char* gui_clock_format_enum(int change, int arg);
258static const char* gui_clock_indicator_enum(int change, int arg);
259static const char* gui_clock_halfpress_enum(int change, int arg);
260static const char* gui_space_bar_enum(int change, int arg);
261static const char* gui_space_bar_size_enum(int change, int arg);
262static const char* gui_space_bar_width_enum(int change, int arg);
263static const char* gui_space_warn_type_enum(int change, int arg);
264static const char* gui_bad_pixel_enum(int change, int arg);
265static const char* gui_video_af_key_enum(int change, int arg);
266static const char* gui_show_movie_time(int change, int arg);
267static const char* gui_override_disable_enum(int change, int arg);
268#ifdef OPT_CURVES
269    static const char* gui_conf_curve_enum(int change, int arg);
270#endif
271#ifdef OPT_DEBUGGING
272    static const char* gui_debug_shortcut_enum(int change, int arg);
273    static const char* gui_debug_display_enum(int change, int arg);
274    static void gui_debug_shortcut(void);
275#endif
276
277#ifdef OPT_EDGEOVERLAY
278    static void gui_menuproc_edge_save(int arg);
279    static void gui_menuproc_edge_load(int arg);
280    static const char* gui_edge_pano_enum(int change, int arg);
281#endif
282
283#ifdef OPT_SCRIPTING
284static void gui_load_script(int arg);
285static void gui_load_script_default(int arg);
286static const char* gui_script_autostart_enum(int change, int arg);
287static const char* gui_script_param_set_enum(int change, int arg);
288#endif
289
290#if CAM_REMOTE
291    static const char* gui_show_usb_info_enum(int change, int arg);
292#endif
293void rinit();
294
295// Menu callbacks
296//-------------------------------------------------------------------
297static void cb_step_25();
298static void cb_perc();
299static void cb_volts();
300static void cb_space_perc();
301static void cb_space_mb();
302static void cb_battery_menu_change(unsigned int item);
303static void cb_zebra_restore_screen();
304static void cb_zebra_restore_osd();
305#if DNG_SUPPORT
306    static void cb_change_dng();
307    void gui_menuproc_badpixel_create(int arg);
308#endif
309#if defined (DNG_EXT_FROM)
310    static void cb_change_dng_usb_ext();
311#endif
312
313// for memory info, duplicated from lowlevel
314extern const char _start,_end;
315
316#ifdef OPT_DEBUGGING
317    static int debug_tasklist_start;
318    static int debug_display_direction=1;
319#endif
320
321// Menu definition
322//-------------------------------------------------------------------
323static CMenuItem remote_submenu_items[] = {
324    {0x71,LANG_MENU_REMOTE_ENABLE,              MENUITEM_BOOL,          &conf.remote_enable },
325    {0x0,LANG_MENU_SYNCHABLE_REMOTE,            MENUITEM_SEPARATOR },
326    {0x71,LANG_MENU_SYNCHABLE_REMOTE_ENABLE,    MENUITEM_BOOL,          &conf.ricoh_ca1_mode },   
327    {0x5c,LANG_MENU_SYNCH_ENABLE,               MENUITEM_BOOL,          &conf.synch_enable },   
328    {0x5c,LANG_MENU_SYNCH_DELAY_ENABLE,         MENUITEM_BOOL,          &conf.synch_delay_enable },   
329    {0x5c,LANG_MENU_SYNCH_DELAY_VALUE,          MENUITEM_INT|MENUITEM_F_UNSIGNED, &conf.synch_delay_value },   
330    {0x5c,LANG_MENU_SYNCH_DELAY_COARSE_VALUE,   MENUITEM_INT|MENUITEM_F_UNSIGNED, &conf.synch_delay_coarse_value },   
331    {0x5c,LANG_MENU_REMOTE_ZOOM_ENABLE,         MENUITEM_BOOL,          &conf.remote_zoom_enable },
332    {0x5f,LANG_MENU_REMOTE_ZOOM_TIMEOUT,        MENUITEM_INT|MENUITEM_F_UNSIGNED|MENUITEM_F_MINMAX, &conf.zoom_timeout, MENU_MINMAX(2,10) },
333    {0x51,LANG_MENU_BACK,                       MENUITEM_UP },
334    {0}
335};
336static CMenu remote_submenu = {0x86,LANG_MENU_REMOTE_PARAM_TITLE, NULL, remote_submenu_items };
337
338
339#ifdef OPT_SCRIPTING
340static CMenuItem script_submenu_items_top[] = {
341    {0x35,LANG_MENU_SCRIPT_LOAD,                MENUITEM_PROC,          (int*)gui_load_script },
342    {0x5f,LANG_MENU_SCRIPT_DELAY,               MENUITEM_INT|MENUITEM_F_UNSIGNED, &conf.script_shoot_delay },
343    // remote autostart
344    {0x5f,LANG_MENU_SCRIPT_AUTOSTART,           MENUITEM_ENUM,          (int*)gui_script_autostart_enum },
345
346#if CAM_REMOTE
347    {0x86,LANG_MENU_REMOTE_PARAM,               MENUITEM_SUBMENU,       (int*)&remote_submenu },
348    //{0x71,LANG_MENU_SCRIPT_REMOTE_ENABLE,       MENUITEM_BOOL,          &conf.remote_enable},
349#endif
350    {0x5d,LANG_MENU_SCRIPT_DEFAULT_VAL,         MENUITEM_PROC,          (int*)gui_load_script_default },
351    {0x5e,LANG_MENU_SCRIPT_PARAM_SET,           MENUITEM_ENUM,          (int*)gui_script_param_set_enum },
352    {0x5c,LANG_MENU_SCRIPT_PARAM_SAVE,          MENUITEM_BOOL,          &conf.script_param_save },   
353    {0x0,(int)script_title,                     MENUITEM_SEPARATOR },
354    //{0x0,LANG_MENU_SCRIPT_CURRENT,              MENUITEM_SEPARATOR },
355    //{0x0,(int)script_title,                     MENUITEM_TEXT },
356    //{0x0,LANG_MENU_SCRIPT_PARAMS,               MENUITEM_SEPARATOR }
357};
358
359static CMenuItem script_submenu_items_bottom[] = {
360    {0x51,LANG_MENU_BACK,                       MENUITEM_UP },
361    {0}
362};
363
364static CMenuItem script_submenu_items[sizeof(script_submenu_items_top)/sizeof(script_submenu_items_top[0])+SCRIPT_NUM_PARAMS+
365                               sizeof(script_submenu_items_bottom)/sizeof(script_submenu_items_bottom[0])];
366static CMenu script_submenu = {0x27,LANG_MENU_SCRIPT_TITLE, NULL, script_submenu_items };
367#endif
368
369static CMenuItem games_submenu_items[] = {
370#ifdef OPT_GAME_REVERSI
371    {0x38,LANG_MENU_GAMES_REVERSI,              MENUITEM_PROC,          (int*)gui_draw_reversi },
372#endif
373#ifdef OPT_GAME_SOKOBAN
374    {0x38,LANG_MENU_GAMES_SOKOBAN,              MENUITEM_PROC,          (int*)gui_draw_sokoban },
375#endif
376#ifdef OPT_GAME_CONNECT4
377    {0x38,LANG_MENU_GAMES_CONNECT4,             MENUITEM_PROC,          (int*)gui_draw_4wins },
378#endif
379#ifdef OPT_GAME_MASTERMIND
380    {0x38,LANG_MENU_GAMES_MASTERMIND,           MENUITEM_PROC,          (int*)gui_draw_mastermind },
381#endif
382#ifdef OPT_GAME_TETRIS
383    {0x38,LANG_MENU_GAMES_TETRIS,               MENUITEM_PROC,          (int*)gui_draw_tetris },
384#endif
385    {0x51,LANG_MENU_BACK,                       MENUITEM_UP },
386    {0}
387};
388static CMenu games_submenu = {0x38,LANG_MENU_GAMES_TITLE, NULL, games_submenu_items };
389
390static CMenuItem autoiso_submenu_items[] = {
391    {0x5c,LANG_MENU_AUTOISO_ENABLED,            MENUITEM_BOOL,          &conf.autoiso_enable },
392    {0x5f,LANG_MENU_AUTOISO_MIN_SHUTTER,        MENUITEM_ENUM,          (int*)gui_autoiso_shutter_enum },
393    {0x5f,LANG_MENU_AUTOISO_USER_FACTOR,        MENUITEM_INT|MENUITEM_F_UNSIGNED|MENUITEM_F_MINMAX, &conf.autoiso_user_factor, MENU_MINMAX(1, 8) },
394#if CAM_HAS_IS   
395    {0x5f,LANG_MENU_AUTOISO_IS_FACTOR,          MENUITEM_INT|MENUITEM_F_UNSIGNED|MENUITEM_F_MINMAX, &conf.autoiso_is_factor, MENU_MINMAX(1, 8) },
396#endif   
397    {0x5f,LANG_MENU_AUTOISO_MAX_ISO_HI,         MENUITEM_INT|MENUITEM_F_UNSIGNED|MENUITEM_F_MINMAX, &conf.autoiso_max_iso_hi, MENU_MINMAX(20, 160) },
398    {0x5f,LANG_MENU_AUTOISO_MAX_ISO_AUTO,       MENUITEM_INT|MENUITEM_F_UNSIGNED|MENUITEM_F_MINMAX, &conf.autoiso_max_iso_auto, MENU_MINMAX(10, 80) },
399    {0x5f,LANG_MENU_AUTOISO_MIN_ISO,            MENUITEM_INT|MENUITEM_F_UNSIGNED|MENUITEM_F_MINMAX, &conf.autoiso_min_iso, MENU_MINMAX(1, 20) },
400    {0x51,LANG_MENU_BACK,                       MENUITEM_UP },
401    {0}
402};
403static CMenu autoiso_submenu = {0x2d,LANG_MENU_AUTOISO_TITLE, NULL, autoiso_submenu_items };
404
405
406#ifdef OPT_TEXTREADER
407static CMenuItem reader_submenu_items[] = {
408    {0x35,LANG_MENU_READ_OPEN_NEW,              MENUITEM_PROC,          (int*)gui_draw_read },
409    {0x35,LANG_MENU_READ_OPEN_LAST,             MENUITEM_PROC,          (int*)gui_draw_read_last },
410    {0x35,LANG_MENU_READ_SELECT_FONT,           MENUITEM_PROC,          (int*)gui_draw_load_rbf },
411    {0x5f,LANG_MENU_READ_CODEPAGE,              MENUITEM_ENUM,          (int*)gui_reader_codepage_enum },
412    {0x5c,LANG_MENU_READ_WORD_WRAP,             MENUITEM_BOOL,          &conf.reader_wrap_by_words },
413    {0x5c,LANG_MENU_READ_AUTOSCROLL,            MENUITEM_BOOL,          &conf.reader_autoscroll },
414    {0x5f,LANG_MENU_READ_AUTOSCROLL_DELAY,      MENUITEM_INT|MENUITEM_F_UNSIGNED|MENUITEM_F_MINMAX, &conf.reader_autoscroll_delay, MENU_MINMAX(0, 60) },
415    {0x51,LANG_MENU_BACK,                       MENUITEM_UP },
416    {0}
417};
418static CMenu reader_submenu = {0x37,LANG_MENU_READ_TITLE, NULL, reader_submenu_items };
419#endif
420
421#ifdef OPT_DEBUGGING
422static CMenuItem debug_submenu_items[] = {
423    {0x5c,LANG_MENU_DEBUG_DISPLAY,              MENUITEM_ENUM,          (int*)gui_debug_display_enum },
424    {0x2a,LANG_MENU_DEBUG_PROPCASE_PAGE,        MENUITEM_INT|MENUITEM_F_UNSIGNED|MENUITEM_F_MINMAX,   &conf.debug_propcase_page, MENU_MINMAX(0, 128) },
425    {0x2a,LANG_MENU_DEBUG_TASKLIST_START,       MENUITEM_INT|MENUITEM_F_UNSIGNED|MENUITEM_F_MINMAX,   &debug_tasklist_start, MENU_MINMAX(0, 63) },
426    {0x5c,LANG_MENU_DEBUG_SHOW_MISC_VALS,       MENUITEM_BOOL,          &conf.debug_misc_vals_show },
427    {0x2a,LANG_MENU_DEBUG_MEMORY_BROWSER,       MENUITEM_PROC,          (int*)gui_draw_debug },
428    {0x2a,LANG_MENU_DEBUG_BENCHMARK,            MENUITEM_PROC,          (int*)gui_draw_bench },
429    {0x5c,LANG_MENU_DEBUG_SHORTCUT_ACTION,      MENUITEM_ENUM,          (int*)gui_debug_shortcut_enum },
430    {0x5c,LANG_MENU_RAW_TIMER,                  MENUITEM_BOOL,          &conf.raw_timer },
431#ifdef OPT_LUA
432    {0x5c,LANG_MENU_LUA_RESTART,                MENUITEM_BOOL,          &conf.debug_lua_restart_on_error },
433#endif
434#if CAM_MULTIPART
435    {0x33,LANG_MENU_DEBUG_CREATE_MULTIPART ,    MENUITEM_PROC,          (int*)gui_menuproc_break_card },
436#endif
437    {0x51,LANG_MENU_BACK,                       MENUITEM_UP },
438    {0}
439};
440static CMenu debug_submenu = {0x2a,LANG_MENU_DEBUG_TITLE, NULL, debug_submenu_items };
441#endif
442
443
444static CMenuItem misc_submenu_items[] = {
445    {0x35,LANG_MENU_MISC_FILE_BROWSER,          MENUITEM_PROC,          (int*)gui_draw_fselect },
446#ifdef OPT_CALENDAR
447    {0x36,LANG_MENU_MISC_CALENDAR,              MENUITEM_PROC,          (int*)gui_draw_calendar },
448#endif
449#ifdef OPT_TEXTREADER
450    {0x37,LANG_MENU_MISC_TEXT_READER,           MENUITEM_SUBMENU,       (int*)&reader_submenu },
451#endif
452#if defined (OPT_GAME_REVERSI) || (OPT_GAME_SOKOBAN || (OPT_GAME_CONNECT4) || OPT_GAME_MASTERMIND) || (OPT_GAME_TETRIS)
453    {0x38,LANG_MENU_MISC_GAMES,                 MENUITEM_SUBMENU,       (int*)&games_submenu },
454#endif
455#if CAM_SWIVEL_SCREEN
456    {0x28,LANG_MENU_MISC_FLASHLIGHT,            MENUITEM_BOOL,          &conf.flashlight },
457#endif
458    {0x5c,LANG_MENU_MISC_SHOW_SPLASH,           MENUITEM_BOOL,          &conf.splash_show },
459    {0x5c,LANG_MENU_MISC_START_SOUND,           MENUITEM_BOOL,          &conf.start_sound },
460#if CAM_USE_ZOOM_FOR_MF
461    {0x59,LANG_MENU_MISC_ZOOM_FOR_MF,           MENUITEM_BOOL,          &conf.use_zoom_mf },
462#endif
463#if CAM_ADJUSTABLE_ALT_BUTTON
464    {0x22,LANG_MENU_MISC_ALT_BUTTON,            MENUITEM_ENUM,          (int*)gui_alt_mode_button_enum },
465#endif
466    {0x5d,LANG_MENU_MISC_DISABLE_LCD_OFF,       MENUITEM_ENUM,          (int*)gui_alt_power_enum },
467    {0x65,LANG_MENU_MISC_PALETTE,               MENUITEM_PROC,          (int*)gui_draw_palette },
468    {0x80,LANG_MENU_MISC_BUILD_INFO,            MENUITEM_PROC,          (int*)gui_show_build_info },
469    {0x80,LANG_MENU_MISC_MEMORY_INFO,           MENUITEM_PROC,          (int*)gui_show_memory_info },
470    {0x33,LANG_MENU_DEBUG_MAKE_BOOTABLE,        MENUITEM_PROC,          (int*)gui_menuproc_mkbootdisk },
471#if CAM_MULTIPART
472    {0x33,LANG_MENU_DEBUG_SWAP_PART,            MENUITEM_PROC,          (int*)gui_menuproc_swap_partitions },
473#endif
474    {0x2b,LANG_MENU_MAIN_RESET_OPTIONS,         MENUITEM_PROC,          (int*)gui_menuproc_reset },
475#ifdef OPT_DEBUGGING
476    {0x2a,LANG_MENU_MAIN_DEBUG,                 MENUITEM_SUBMENU,       (int*)&debug_submenu },
477#endif
478    {0x86,LANG_MENU_REMOTE_PARAM,               MENUITEM_SUBMENU,       (int*)&remote_submenu },
479#if defined (DNG_EXT_FROM)
480    {0x71,LANG_MENU_DNG_VIA_USB,                MENUITEM_BOOL | MENUITEM_ARG_CALLBACK, &conf.dng_usb_ext , (int)cb_change_dng_usb_ext},
481#endif
482    {0x51,LANG_MENU_BACK,                       MENUITEM_UP },
483    {0},
484};
485static CMenu misc_submenu = {0x29,LANG_MENU_MISC_TITLE, NULL, misc_submenu_items };
486
487static int voltage_step;
488static CMenuItem battery_submenu_items[] = {
489    {0x66,LANG_MENU_BATT_VOLT_MAX,              MENUITEM_INT|MENUITEM_ARG_ADDR_INC,     &conf.batt_volts_max,   (int)&voltage_step },
490    {0x67,LANG_MENU_BATT_VOLT_MIN,              MENUITEM_INT|MENUITEM_ARG_ADDR_INC,     &conf.batt_volts_min,   (int)&voltage_step },
491    {0x68,LANG_MENU_BATT_STEP_25,               MENUITEM_BOOL|MENUITEM_ARG_CALLBACK,    &conf.batt_step_25,     (int)cb_step_25 },
492    {0x0,(int)"",                               MENUITEM_SEPARATOR },
493    {0x73,LANG_MENU_BATT_SHOW_PERCENT,          MENUITEM_BOOL|MENUITEM_ARG_CALLBACK,    &conf.batt_perc_show,   (int)cb_perc },
494    {0x73,LANG_MENU_BATT_SHOW_VOLTS,            MENUITEM_BOOL|MENUITEM_ARG_CALLBACK,    &conf.batt_volts_show,  (int)cb_volts },
495    {0x32,LANG_MENU_BATT_SHOW_ICON,             MENUITEM_BOOL,                          &conf.batt_icon_show },
496    {0x51,LANG_MENU_BACK,                       MENUITEM_UP },
497    {0}
498};
499static CMenu battery_submenu = {0x32,LANG_MENU_BATT_TITLE, cb_battery_menu_change, battery_submenu_items };
500
501static CMenuItem space_submenu_items[] = {
502    {0x5c,LANG_MENU_SPACE_SHOW_ICON,            MENUITEM_BOOL,          &conf.space_icon_show },
503    {0x69,LANG_MENU_SPACE_SHOW_BAR,             MENUITEM_ENUM,          (int*)gui_space_bar_enum },
504    {0x6a,LANG_MENU_SPACE_BAR_SIZE,             MENUITEM_ENUM,          (int*)gui_space_bar_size_enum },
505    {0x6b,LANG_MENU_SPACE_BAR_WIDTH,            MENUITEM_ENUM,          (int*)gui_space_bar_width_enum },
506    {0x5c,LANG_MENU_SPACE_SHOW_PERCENT,         MENUITEM_BOOL|MENUITEM_ARG_CALLBACK,    &conf.space_perc_show,   (int)cb_space_perc },
507    {0x5c,LANG_MENU_SPACE_SHOW_MB,              MENUITEM_BOOL|MENUITEM_ARG_CALLBACK,    &conf.space_mb_show,  (int)cb_space_mb },
508    {0x5f,LANG_MENU_SPACE_WARN_TYPE,            MENUITEM_ENUM,          (int*)gui_space_warn_type_enum },
509    {0x58,LANG_MENU_SPACE_WARN_PERCENT,         MENUITEM_INT|MENUITEM_F_UNSIGNED|MENUITEM_F_MINMAX,   &conf.space_perc_warn, MENU_MINMAX(1, 99) },
510    {0x58,LANG_MENU_SPACE_WARN_MB,              MENUITEM_INT|MENUITEM_F_UNSIGNED|MENUITEM_F_MINMAX,   &conf.space_mb_warn, MENU_MINMAX(1, 4000) },
511    {0x51,LANG_MENU_BACK,                       MENUITEM_UP },
512    {0}
513};
514static CMenu space_submenu = {0x33,LANG_MENU_OSD_SPACE_PARAMS_TITLE, NULL, space_submenu_items};
515
516static CMenuItem dof_submenu_items[] = {
517    {0x5f,LANG_MENU_OSD_SHOW_DOF_CALC,          MENUITEM_ENUM,          (int*)gui_dof_show_value_enum },
518    {0x5c,LANG_MENU_DOF_SUBJ_DIST_AS_NEAR_LIMIT, MENUITEM_BOOL,         &conf.dof_subj_dist_as_near_limit},
519    {0x5c,LANG_MENU_DOF_USE_EXIF_SUBJ_DIST,     MENUITEM_BOOL,          &conf.dof_use_exif_subj_dist},
520    {0x5c,LANG_MENU_DOF_SUBJ_DIST_IN_MISC,      MENUITEM_BOOL,          &conf.dof_subj_dist_in_misc},
521    {0x5c,LANG_MENU_DOF_NEAR_LIMIT_IN_MISC,     MENUITEM_BOOL,          &conf.dof_near_limit_in_misc},
522    {0x5c,LANG_MENU_DOF_FAR_LIMIT_IN_MISC,      MENUITEM_BOOL,          &conf.dof_far_limit_in_misc},
523    {0x5c,LANG_MENU_DOF_HYPERFOCAL_IN_MISC,     MENUITEM_BOOL,          &conf.dof_hyperfocal_in_misc},
524    {0x5c,LANG_MENU_DOF_DEPTH_LIMIT_IN_MISC,    MENUITEM_BOOL,          &conf.dof_depth_in_misc},
525    {0x51,LANG_MENU_BACK,                       MENUITEM_UP },
526    {0}
527};
528static CMenu dof_submenu = {0x31,LANG_MENU_DOF_TITLE, /*cb_dof_menu_change*/ NULL, dof_submenu_items };
529
530static CMenuItem values_submenu_items[] = {
531    {0x5f,LANG_MENU_OSD_SHOW_MISC_VALUES,       MENUITEM_ENUM,          (int*)gui_show_values_enum },
532    //{0x43,LANG_MENU_VALUES_SHOW_IN_REVIEW,      MENUITEM_BOOL,          &conf.values_show_in_review},
533    {0x5c,LANG_MENU_SHOW_VALUES_IN_VIDEO,       MENUITEM_BOOL,          &conf.show_values_in_video },
534    {0x5c,LANG_MENU_VALUES_SHOW_ZOOM,           MENUITEM_BOOL,          &conf.values_show_zoom },
535    {0x5f,LANG_MENU_OSD_ZOOM_VALUE,             MENUITEM_ENUM,          (int*)gui_zoom_value_enum },
536    {0x60,LANG_MENU_OSD_ZOOM_SCALE,             MENUITEM_INT|MENUITEM_F_UNSIGNED|MENUITEM_F_MINMAX,  &conf.zoom_scale,  MENU_MINMAX(0, 1000) },
537    {0x62,LANG_MENU_VALUES_SHOW_REAL_APERTURE,  MENUITEM_BOOL,          &conf.values_show_real_aperture },
538    {0x74,LANG_MENU_VALUES_SHOW_REAL_ISO,       MENUITEM_BOOL,          &conf.values_show_real_iso },
539    {0x74,LANG_MENU_VALUES_SHOW_MARKET_ISO,     MENUITEM_BOOL,          &conf.values_show_market_iso },
540    {0x2d,LANG_MENU_SHOW_ISO_ONLY_IN_AUTOISO_MODE, MENUITEM_BOOL,       &conf.values_show_iso_only_in_autoiso_mode },
541    {0x5c,LANG_MENU_VALUES_SHOW_EV_SETED,       MENUITEM_BOOL,          &conf.values_show_ev_seted },
542    {0x5c,LANG_MENU_VALUES_SHOW_EV_MEASURED,    MENUITEM_BOOL,          &conf.values_show_ev_measured },
543    {0x5c,LANG_MENU_VALUES_SHOW_BV_SETED,       MENUITEM_BOOL,          &conf.values_show_bv_seted },
544    {0x5c,LANG_MENU_VALUES_SHOW_BV_MEASURED,    MENUITEM_BOOL,          &conf.values_show_bv_measured },
545    {0x5c,LANG_MENU_VALUES_SHOW_OVEREXPOSURE,   MENUITEM_BOOL,          &conf.values_show_overexposure },
546    {0x5c,LANG_MENU_SHOW_CANON_OVEREXPOSURE,    MENUITEM_BOOL,          &conf.values_show_canon_overexposure },
547    {0x5c,LANG_MENU_VALUES_SHOW_LUMINANCE,      MENUITEM_BOOL,          &conf.values_show_luminance },
548    {0x51,LANG_MENU_BACK,                       MENUITEM_UP },
549    {0}
550};
551static CMenu values_submenu = {0x28,LANG_MENU_OSD_VALUES_TITLE, /*cb_values_menu_change*/ NULL, values_submenu_items };
552
553static CMenuItem clock_submenu_items[] = {
554    {0x5f,LANG_MENU_OSD_SHOW_CLOCK,             MENUITEM_ENUM,          (int*)gui_show_clock_enum },
555    {0x6d,LANG_MENU_OSD_CLOCK_FORMAT,           MENUITEM_ENUM,          (int*)gui_clock_format_enum },
556    {0x6c,LANG_MENU_OSD_CLOCK_INDICATOR,        MENUITEM_ENUM,          (int*)gui_clock_indicator_enum },
557    {0x6e,LANG_MENU_OSD_CLOCK_HALFPRESS,        MENUITEM_ENUM,          (int*)gui_clock_halfpress_enum },
558    {0x51,LANG_MENU_BACK,                       MENUITEM_UP },
559    {0}
560};
561static CMenu clock_submenu = {0x34,LANG_MENU_OSD_CLOCK_PARAMS_TITLE, NULL, clock_submenu_items };
562
563
564static CMenuItem video_submenu_items[] = {
565#if CAM_CHDK_HAS_EXT_VIDEO_MENU
566    {0x23,LANG_MENU_VIDEO_MODE,                 MENUITEM_ENUM,          (int*)gui_video_mode_enum },
567#if !CAM_VIDEO_QUALITY_ONLY
568    {0x5e,LANG_MENU_VIDEO_BITRATE,              MENUITEM_ENUM,          (int*)gui_video_bitrate_enum },
569#endif
570    {0x60,LANG_MENU_VIDEO_QUALITY,              MENUITEM_INT|MENUITEM_F_UNSIGNED|MENUITEM_F_MINMAX,  &conf.video_quality,  MENU_MINMAX(1, 99) },
571    {0x5c,LANG_MENU_CLEAR_VIDEO_VALUES,         MENUITEM_BOOL,          (int*)&conf.clear_video },
572#endif
573#if CAM_VIDEO_CONTROL
574    {0x5c,LANG_MENU_FAST_SWITCH_VIDEO,          MENUITEM_BOOL,          &conf.fast_movie_control },
575#endif
576#if CAM_CHDK_HAS_EXT_VIDEO_MENU
577    {0x5c,LANG_MENU_FAST_SWITCH_QUALITY_VIDEO,  MENUITEM_BOOL,          &conf.fast_movie_quality_control },
578#endif
579#if CAM_CAN_UNLOCK_OPTICAL_ZOOM_IN_VIDEO
580    {0x5c,LANG_MENU_OPTICAL_ZOOM_IN_VIDEO,      MENUITEM_BOOL,          &conf.unlock_optical_zoom_for_video },
581#endif
582#if CAM_CAN_MUTE_MICROPHONE
583    {0x83,LANG_MENU_MUTE_ON_ZOOM,               MENUITEM_BOOL,          &conf.mute_on_zoom },
584#endif
585#if CAM_AF_SCAN_DURING_VIDEO_RECORD
586    {0x82,LANG_MENU_VIDEO_AF_KEY,               MENUITEM_ENUM,          (int*)gui_video_af_key_enum },
587#endif
588    {0x5c,LANG_MENU_OSD_SHOW_VIDEO_TIME,        MENUITEM_ENUM,          (int*)gui_show_movie_time },
589    {0x60,LANG_MENU_OSD_SHOW_VIDEO_REFRESH,     MENUITEM_INT|MENUITEM_F_UNSIGNED|MENUITEM_F_MINMAX, &conf.show_movie_refresh,  MENU_MINMAX(1, 20) },
590    {0x51,LANG_MENU_BACK,                       MENUITEM_UP },
591    {0}
592};
593static CMenu video_submenu = {0x23,LANG_MENU_VIDEO_PARAM_TITLE, NULL, video_submenu_items };
594
595static CMenuItem bracketing_in_continuous_submenu_items[] = {
596    {0x63,LANG_MENU_TV_BRACKET_VALUE,           MENUITEM_ENUM,          (int*)gui_tv_bracket_values_enum },
597#if CAM_HAS_IRIS_DIAPHRAGM
598    {0x62,LANG_MENU_AV_BRACKET_VALUE,           MENUITEM_ENUM,          (int*)gui_av_bracket_values_enum },
599#endif 
600#if CAM_CAN_SD_OVERRIDE
601    {0x5e,LANG_MENU_SUBJ_DIST_BRACKET_VALUE,    MENUITEM_INT|MENUITEM_F_UNSIGNED|MENUITEM_F_MINMAX, &conf.subj_dist_bracket_value,  MENU_MINMAX(0, 100) },
602    {0x5f,LANG_MENU_SUBJ_DIST_BRACKET_KOEF,     MENUITEM_ENUM,          (int*)gui_subj_dist_bracket_koef_enum},
603#endif 
604    {0x74,LANG_MENU_ISO_BRACKET_VALUE,          MENUITEM_INT|MENUITEM_F_UNSIGNED|MENUITEM_F_MINMAX, &conf.iso_bracket_value,  MENU_MINMAX(0, 100) },
605    {0x5f,LANG_MENU_ISO_BRACKET_KOEF,           MENUITEM_ENUM,          (int*)gui_iso_bracket_koef_enum },
606    {0x60,LANG_MENU_BRACKET_TYPE,               MENUITEM_ENUM,          (int*)gui_bracket_type_enum },
607    {0x5b,LANG_MENU_CLEAR_BRACKET_VALUES,       MENUITEM_BOOL,          (int*)&conf.clear_bracket },
608    {0x5c,LANG_MENU_BRACKETING_ADD_RAW_SUFFIX,  MENUITEM_BOOL,          &conf.bracketing_add_raw_suffix },
609    {0x51,LANG_MENU_BACK,                       MENUITEM_UP },
610    {0}
611};
612static CMenu bracketing_in_continuous_submenu = {0x2c,LANG_MENU_BRACKET_IN_CONTINUOUS_TITLE, NULL, bracketing_in_continuous_submenu_items };
613
614static CMenuItem operation_submenu_items[] = {
615    {0x5c,LANG_MENU_OVERRIDE_DISABLE,           MENUITEM_ENUM,          (int*)gui_override_disable_enum},//&conf.override_disable },
616    {0x5c,LANG_MENU_OVERRIDE_DISABLE_ALL,       MENUITEM_BOOL,          &conf.override_disable_all },
617    {0x61,LANG_MENU_OVERRIDE_TV_VALUE,          MENUITEM_ENUM,          (int*)gui_tv_override_value_enum },
618    {0x5f,LANG_MENU_OVERRIDE_TV_KOEF,           MENUITEM_ENUM,          (int*)gui_tv_override_koef_enum },
619    {0x59,LANG_MENU_TV_ENUM_TYPE,               MENUITEM_ENUM,          (int*)gui_tv_enum_type_enum },
620#if CAM_HAS_IRIS_DIAPHRAGM
621    {0x62,LANG_MENU_OVERRIDE_AV_VALUE,          MENUITEM_ENUM,          (int*)gui_av_override_enum },
622#endif
623#if CAM_HAS_ND_FILTER
624    {0x62,LANG_MENU_OVERRIDE_ND_FILTER,         MENUITEM_ENUM,          (int*)gui_nd_filter_state_enum },
625#endif     
626#if CAM_CAN_SD_OVERRIDE 
627    {0x5e,LANG_MENU_OVERRIDE_SUBJ_DIST_VALUE,   MENUITEM_ENUM,          (int*)gui_subj_dist_override_value_enum },
628    {0x5f,LANG_MENU_OVERRIDE_SUBJ_DIST_KOEF,    MENUITEM_ENUM,          (int*)gui_subj_dist_override_koef_enum },
629#endif
630    {0x74,LANG_MENU_OVERRIDE_ISO_VALUE,         MENUITEM_INT|MENUITEM_F_UNSIGNED|MENUITEM_F_MINMAX,  &conf.iso_override_value,  MENU_MINMAX(0, 800) },
631    {0x5f,LANG_MENU_OVERRIDE_ISO_KOEF,          MENUITEM_ENUM,          (int*)gui_iso_override_koef_enum},
632#if ZOOM_OVERRIDE
633    {0x5c,LANG_MENU_OVERRIDE_ZOOM,              MENUITEM_BOOL,          &conf.zoom_override },
634    {0x5f,LANG_MENU_OVERRIDE_ZOOM_VALUE,        MENUITEM_ENUM,          (int*)gui_zoom_override_enum },   
635    {0x5c,LANG_MENU_CLEAR_ZOOM_OVERRIDE_VALUES, MENUITEM_BOOL,          (int*)&conf.clear_zoom_override},
636#endif
637    {0x2c,LANG_MENU_BRACKET_IN_CONTINUOUS,      MENUITEM_SUBMENU,       (int*)&bracketing_in_continuous_submenu },
638    {0x2d,LANG_MENU_AUTOISO,                    MENUITEM_SUBMENU,       (int*)&autoiso_submenu },
639    {0x5b,LANG_MENU_CLEAR_OVERRIDE_VALUES,      MENUITEM_BOOL,          (int*)&conf.clear_override },
640    {0x5c,LANG_MENU_MISC_FAST_EV,               MENUITEM_BOOL,          &conf.fast_ev },
641    {0x5f,LANG_MENU_MISC_FAST_EV_STEP,          MENUITEM_ENUM,          (int*)gui_fast_ev_step },
642#if CAM_REAR_CURTAIN
643    {0x5c, LANG_MENU_REAR_CURTAIN,              MENUITEM_BOOL,          &conf.flash_sync_curtain },
644#endif
645    {0x5c, LANG_MENU_FLASH_MANUAL_OVERRIDE,     MENUITEM_BOOL,          &conf.flash_manual_override },
646    {0x5f, LANG_MENU_FLASH_VIDEO_OVERRIDE_POWER, MENUITEM_INT|MENUITEM_F_UNSIGNED|MENUITEM_F_MINMAX, &conf.flash_video_override_power,  MENU_MINMAX(0, 2) },
647#if CAM_HAS_VIDEO_BUTTON
648    {0x5c, LANG_MENU_FLASH_VIDEO_OVERRIDE,      MENUITEM_BOOL,          &conf.flash_video_override },
649#endif
650#if CAM_QUALITY_OVERRIDE
651    {0x5c,LANG_MENU_MISC_IMAGE_QUALITY,         MENUITEM_ENUM,          (int*)gui_fast_image_quality },
652#endif
653    {0x51,LANG_MENU_BACK,                       MENUITEM_UP },
654    {0}
655};
656static CMenu operation_submenu = {0x21,LANG_MENU_OPERATION_PARAM_TITLE, NULL, operation_submenu_items };
657
658#ifdef OPT_EDGEOVERLAY
659static CMenuItem edge_overlay_submenu_items[] = {
660    {0x5c,LANG_MENU_EDGE_OVERLAY_ENABLE,        MENUITEM_BOOL,          &conf.edge_overlay_enable },
661    {0x5c,LANG_MENU_EDGE_FILTER,                MENUITEM_BOOL,          &conf.edge_overlay_filter },
662    {0x5f,LANG_MENU_EDGE_PANO,                  MENUITEM_ENUM,          (int*)gui_edge_pano_enum },
663    {0x5e,LANG_MENU_EDGE_PANO_OVERLAP,          MENUITEM_INT|MENUITEM_F_UNSIGNED|MENUITEM_F_MINMAX, &conf.edge_overlay_pano_overlap,  MENU_MINMAX(0, 100) },
664    {0x5c,LANG_MENU_EDGE_SHOW,                  MENUITEM_BOOL,          &conf.edge_overlay_show },
665    {0x5e,LANG_MENU_EDGE_OVERLAY_TRESH,         MENUITEM_INT|MENUITEM_F_UNSIGNED|MENUITEM_F_MINMAX, &conf.edge_overlay_thresh,  MENU_MINMAX(0, 255) },
666    {0x65,LANG_MENU_EDGE_OVERLAY_COLOR,         MENUITEM_COLOR_FG,      (int*)&conf.edge_overlay_color },
667    {0x5c,LANG_MENU_EDGE_PLAY,                  MENUITEM_BOOL,          &conf.edge_overlay_play }, //does not work on cams like s-series, which dont have a real "hardware" play/rec switch, need a workaround, probably another button
668    {0x33,LANG_MENU_EDGE_SAVE,                  MENUITEM_PROC,          (int*)gui_menuproc_edge_save },
669    {0x5c,LANG_MENU_EDGE_ZOOM,                  MENUITEM_BOOL,          &conf.edge_overlay_zoom },
670    {0x33,LANG_MENU_EDGE_LOAD,                  MENUITEM_PROC,          (int*)gui_menuproc_edge_load },
671    {0x51,LANG_MENU_BACK,                       MENUITEM_UP },
672    {0}
673};
674static CMenu edge_overlay_submenu = {0x7f,LANG_MENU_EDGE_OVERLAY_TITLE, NULL, edge_overlay_submenu_items };
675#endif
676
677static CMenuItem grid_submenu_items[] = {
678    {0x2f,LANG_MENU_SHOW_GRID,                  MENUITEM_BOOL,          &conf.show_grid_lines },
679    {0x35,LANG_MENU_GRID_LOAD,                  MENUITEM_PROC,          (int*)gui_grid_lines_load },
680    {0x0,LANG_MENU_GRID_CURRENT,                MENUITEM_SEPARATOR },
681    {0x0,(int)grid_title,                       MENUITEM_TEXT },
682    {0x0,(int)"",                               MENUITEM_SEPARATOR },
683    {0x5c,LANG_MENU_GRID_FORCE_COLOR,           MENUITEM_BOOL,          &conf.grid_force_color },
684    {0x65,LANG_MENU_GRID_COLOR_LINE,            MENUITEM_COLOR_FG,      (int*)&conf.grid_color },
685    {0x65,LANG_MENU_GRID_COLOR_FILL,            MENUITEM_COLOR_BG,      (int*)&conf.grid_color },
686    {0x51,LANG_MENU_BACK,                       MENUITEM_UP },
687    {0}
688};
689static CMenu grid_submenu = {0x2f,LANG_MENU_GRID_TITLE, NULL, grid_submenu_items };
690
691static CMenuItem visual_submenu_items[] = {
692    {0x35,LANG_MENU_VIS_LANG,                   MENUITEM_PROC,          (int*)gui_draw_load_lang },
693    {0x5f,LANG_MENU_VIS_OSD_FONT,               MENUITEM_ENUM,          (int*)gui_font_enum },
694    {0x35,LANG_MENU_VIS_MENU_FONT,              MENUITEM_PROC,          (int*)gui_draw_load_menu_rbf },
695    {0x35,LANG_MENU_VIS_MENU_SYMBOL_FONT,       MENUITEM_PROC,          (int*)gui_draw_load_symbol_rbf },
696    {0x80,LANG_MENU_RESET_FILES,                MENUITEM_PROC,          (int*)gui_menuproc_reset_files },
697    {0x0,LANG_MENU_VIS_COLORS,                  MENUITEM_SEPARATOR },
698    {0x65,LANG_MENU_VIS_OSD_TEXT,               MENUITEM_COLOR_FG,      (int*)&conf.osd_color },
699    {0x65,LANG_MENU_VIS_OSD_BKG,                MENUITEM_COLOR_BG,      (int*)&conf.osd_color },
700    {0x65,LANG_MENU_VIS_OSD_WARNING,            MENUITEM_COLOR_FG,      (int*)&conf.osd_color_warn },
701    {0x65,LANG_MENU_VIS_OSD_WARNING_BKG,        MENUITEM_COLOR_BG,      (int*)&conf.osd_color_warn },
702    {0x65,LANG_MENU_VIS_HISTO,                  MENUITEM_COLOR_FG,      (int*)&conf.histo_color },
703    {0x65,LANG_MENU_VIS_HISTO_BKG,              MENUITEM_COLOR_BG,      (int*)&conf.histo_color },
704    {0x65,LANG_MENU_VIS_HISTO_BORDER,           MENUITEM_COLOR_FG,      (int*)&conf.histo_color2 },
705    {0x65,LANG_MENU_VIS_HISTO_MARKERS,          MENUITEM_COLOR_BG,      (int*)&conf.histo_color2 },
706    {0x65,LANG_MENU_VIS_ZEBRA_UNDER,            MENUITEM_COLOR_BG,      (int*)&conf.zebra_color },
707    {0x65,LANG_MENU_VIS_ZEBRA_OVER,             MENUITEM_COLOR_FG,      (int*)&conf.zebra_color },
708    //{0x65,LANG_MENU_VIS_BATT_ICON,              MENUITEM_COLOR_FG,      (int*)&conf.batt_icon_color },
709    {0x65,LANG_MENU_VIS_SPACE_ICON,             MENUITEM_COLOR_FG,      (int*)&conf.space_color },
710    {0x65,LANG_MENU_VIS_SPACE_ICON_BKG,         MENUITEM_COLOR_BG,      (int*)&conf.space_color },   
711    {0x65,LANG_MENU_VIS_MENU_TEXT,              MENUITEM_COLOR_FG,      (int*)&conf.menu_color },
712    {0x65,LANG_MENU_VIS_MENU_BKG,               MENUITEM_COLOR_BG,      (int*)&conf.menu_color },
713    {0x65,LANG_MENU_VIS_MENU_TITLE_TEXT,        MENUITEM_COLOR_FG,      (int*)&conf.menu_title_color },
714    {0x65,LANG_MENU_VIS_MENU_TITLE_BKG,         MENUITEM_COLOR_BG,      (int*)&conf.menu_title_color },
715    {0x65,LANG_MENU_VIS_MENU_CURSOR_TEXT,       MENUITEM_COLOR_FG,      (int*)&conf.menu_cursor_color },
716    {0x65,LANG_MENU_VIS_MENU_CURSOR_BKG,        MENUITEM_COLOR_BG,      (int*)&conf.menu_cursor_color },
717    {0x65,LANG_MENU_VIS_MENU_SYMBOL_TEXT,       MENUITEM_COLOR_FG,      (int*)&conf.menu_symbol_color },
718    {0x65,LANG_MENU_VIS_MENU_SYMBOL_BKG,        MENUITEM_COLOR_BG,      (int*)&conf.menu_symbol_color },
719    {0x65,LANG_MENU_VIS_READER_TEXT,            MENUITEM_COLOR_FG,      (int*)&conf.reader_color },
720    {0x65,LANG_MENU_VIS_READER_BKG,             MENUITEM_COLOR_BG,      (int*)&conf.reader_color },
721    {0x65,LANG_MENU_VIS_OSD_OVERRIDE,           MENUITEM_COLOR_FG,      (int*)&conf.osd_color_override },
722    {0x65,LANG_MENU_VIS_OSD_OVERRIDE_BKG,       MENUITEM_COLOR_BG,      (int*)&conf.osd_color_override },
723    {0x51,LANG_MENU_BACK,                       MENUITEM_UP },
724    {0}
725};
726static CMenu visual_submenu = {0x28,LANG_MENU_VIS_TITLE, NULL, visual_submenu_items };
727
728/*
729 * 1 extra entry for the "Main menu" and 1 for null when the menu is full with user selections
730 * Compiler will zero init remaining portion of array so no there is no hidden relationship between
731 * this structure and the value of USER_MENU_ITEMS. The value of USER_MENU_ITEMS can be anything you
732 * wish and everything automagically works.
733*/
734 
735static CMenuItem user_submenu_items[USER_MENU_ITEMS + 2] = {
736    {0x20,LANG_MENU_MAIN_TITLE,                 MENUITEM_PROC,  (int*)rinit}
737};
738 
739static CMenu user_submenu = {0x2e,LANG_MENU_USER_MENU, NULL, user_submenu_items };
740
741static CMenuItem raw_state_submenu_items[] = {
742    {0x5c,LANG_MENU_OSD_SHOW_RAW_STATE,         MENUITEM_BOOL,          &conf.show_raw_state },   
743    {0x5c,LANG_MENU_OSD_SHOW_REMAINING_RAW,     MENUITEM_BOOL,          &conf.show_remaining_raw },   
744    {0x60,LANG_MENU_OSD_RAW_TRESHOLD,           MENUITEM_INT|MENUITEM_F_UNSIGNED|MENUITEM_F_MINMAX,  &conf.remaining_raw_treshold,  MENU_MINMAX(0, 200) },
745    {0x51,LANG_MENU_BACK,                       MENUITEM_UP },
746    {0}
747};
748
749static CMenu raw_state_submenu = {0x24,LANG_MENU_OSD_RAW_STATE_PARAMS_TITLE, NULL, raw_state_submenu_items };
750
751
752static CMenuItem osd_submenu_items[] = {
753    {0x5c,LANG_MENU_OSD_SHOW,                   MENUITEM_BOOL,          &conf.show_osd },
754    {0x5c,LANG_MENU_OSD_HIDE_PLAYBACK,          MENUITEM_ENUM,          (int*)gui_hide_osd_enum },
755    {0x81,LANG_MENU_VIS_MENU_CENTER,            MENUITEM_BOOL,          &conf.menu_center },
756    {0x81,LANG_MENU_SELECT_FIRST_ENTRY,         MENUITEM_BOOL,          &conf.menu_select_first_entry },       
757    {0x64,LANG_MENU_VIS_SYMBOL,                 MENUITEM_BOOL,          &conf.menu_symbol_enable },   
758    {0x2e,LANG_MENU_USER_MENU,                  MENUITEM_SUBMENU,       (int*)&user_submenu},
759    {0x5f,LANG_MENU_USER_MENU_ENABLE,           MENUITEM_ENUM,          (int*)gui_user_menu_show_enum },
760    {0x5c,LANG_MENU_USER_MENU_AS_ROOT,          MENUITEM_BOOL,          &conf.user_menu_as_root },
761    {0x5f,LANG_MENU_OSD_SHOW_STATES,            MENUITEM_BOOL,          &conf.show_state },
762    {0x5f,LANG_MENU_OSD_SHOW_TEMP,              MENUITEM_ENUM,          (int*)gui_temp_mode_enum },
763    {0x59,LANG_MENU_OSD_TEMP_FAHRENHEIT,        MENUITEM_BOOL,          &conf.temperature_unit},
764#if CAM_REMOTE
765    {0x71,LANG_MENU_USB_SHOW_INFO,              MENUITEM_ENUM,          (int*)gui_show_usb_info_enum },
766#endif
767    {0x72,LANG_MENU_OSD_LAYOUT_EDITOR,          MENUITEM_PROC,          (int*)gui_draw_osd_le },
768    {0x2f,LANG_MENU_OSD_GRID_PARAMS,            MENUITEM_SUBMENU,       (int*)&grid_submenu },
769    {0x22,LANG_MENU_OSD_VALUES,                 MENUITEM_SUBMENU,       (int*)&values_submenu },
770    {0x31,LANG_MENU_OSD_DOF_CALC,               MENUITEM_SUBMENU,       (int*)&dof_submenu },
771    {0x24,LANG_MENU_OSD_RAW_STATE_PARAMS,       MENUITEM_SUBMENU,       (int*)&raw_state_submenu },
772    {0x32,LANG_MENU_OSD_BATT_PARAMS,            MENUITEM_SUBMENU,       (int*)&battery_submenu },
773    {0x33,LANG_MENU_OSD_SPACE_PARAMS,           MENUITEM_SUBMENU,       (int*)&space_submenu },
774    {0x34,LANG_MENU_OSD_CLOCK_PARAMS,           MENUITEM_SUBMENU,       (int*)&clock_submenu },
775    {0x59,LANG_MENU_OSD_SHOW_IN_REVIEW,         MENUITEM_BOOL,          &conf.show_osd_in_review},
776#ifndef OPTIONS_AUTOSAVE
777    {0x5c,LANG_MENU_MAIN_SAVE_OPTIONS,          MENUITEM_PROC,          (int*)gui_menuproc_save },
778#endif
779    {0x51,LANG_MENU_BACK,                       MENUITEM_UP },
780    {0}
781};
782
783static CMenu osd_submenu = {0x22,LANG_MENU_OSD_TITLE, NULL, osd_submenu_items };
784
785static CMenuItem histo_submenu_items[] = {
786    {0x5f,LANG_MENU_HISTO_SHOW,                 MENUITEM_ENUM,          (int*)gui_histo_show_enum },
787    {0x6f,LANG_MENU_HISTO_LAYOUT,               MENUITEM_ENUM,          (int*)gui_histo_layout_enum },
788    {0x5f,LANG_MENU_HISTO_MODE,                 MENUITEM_ENUM,          (int*)gui_histo_mode_enum },
789    {0x5c,LANG_MENU_HISTO_EXP,                  MENUITEM_BOOL,          &conf.show_overexp },
790    {0x70,LANG_MENU_HISTO_IGNORE_PEAKS,         MENUITEM_INT|MENUITEM_F_UNSIGNED|MENUITEM_F_MINMAX,  &conf.histo_ignore_boundary,  MENU_MINMAX(0, 32) },
791    {0x5c,LANG_MENU_HISTO_MAGNIFY,              MENUITEM_BOOL,          &conf.histo_auto_ajust },
792    {0x5c,LANG_MENU_HISTO_SHOW_EV_GRID,         MENUITEM_BOOL,          &conf.histo_show_ev_grid },
793    {0x51,LANG_MENU_BACK,                       MENUITEM_UP },
794    {0}
795};
796static CMenu histo_submenu = {0x25,LANG_MENU_HISTO_TITLE, NULL, histo_submenu_items };
797
798static CMenuItem raw_exceptions_submenu_items[] = {
799#if defined CAM_HAS_VIDEO_BUTTON
800    {0x5c,LANG_MENU_RAW_SAVE_IN_VIDEO,          MENUITEM_BOOL,          &conf.save_raw_in_video },
801#endif
802#if defined(CAMERA_s3is)
803    {0x5c,LANG_MENU_RAW_SAVE_IN_SPORTS,         MENUITEM_BOOL,          &conf.save_raw_in_sports },
804#endif
805    {0x5c,LANG_MENU_RAW_SAVE_IN_BURST,          MENUITEM_BOOL,          &conf.save_raw_in_burst },
806    {0x5c,LANG_MENU_RAW_SAVE_IN_TIMER,          MENUITEM_BOOL,          &conf.save_raw_in_timer },
807    {0x5c,LANG_MENU_RAW_SAVE_IN_EDGEOVERLAY,    MENUITEM_BOOL,          &conf.save_raw_in_edgeoverlay },
808    {0x5c,LANG_MENU_RAW_SAVE_IN_AUTO,           MENUITEM_BOOL,          &conf.save_raw_in_auto },
809#if CAM_BRACKETING
810    {0x5c,LANG_MENU_RAW_SAVE_IN_EV_BRACKETING,  MENUITEM_BOOL,          &conf.save_raw_in_ev_bracketing },
811#endif
812    {0x5c,LANG_MENU_RAW_WARN,                   MENUITEM_BOOL,          &conf.raw_exceptions_warn },
813    {0x51,LANG_MENU_BACK,                       MENUITEM_UP },
814    {0}
815};
816static CMenu raw_exceptions_submenu = {0x59,LANG_MENU_OSD_RAW_EXCEPTIONS_PARAMS_TITLE, NULL, raw_exceptions_submenu_items };
817
818static CMenuItem raw_submenu_items[] = {
819    {0x5c,LANG_MENU_RAW_SAVE,                   MENUITEM_BOOL,          &conf.save_raw },
820    {0x59,LANG_MENU_OSD_RAW_EXCEPTIONS_PARAMS,  MENUITEM_SUBMENU,       (int*)&raw_exceptions_submenu },
821    {0x5f,LANG_MENU_RAW_NOISE_REDUCTION,        MENUITEM_ENUM,          (int*)gui_raw_nr_enum },
822    {0x5c,LANG_MENU_RAW_FIRST_ONLY,             MENUITEM_BOOL,          &conf.raw_save_first_only },
823    {0x5c,LANG_MENU_RAW_SAVE_IN_DIR,            MENUITEM_BOOL,          &conf.raw_in_dir },
824    {0x5f,LANG_MENU_RAW_PREFIX,                 MENUITEM_ENUM,          (int*)gui_raw_prefix_enum },
825    {0x5f,LANG_MENU_RAW_EXTENSION,              MENUITEM_ENUM,          (int*)gui_raw_ext_enum },
826    {0x5f,LANG_MENU_SUB_PREFIX,                 MENUITEM_ENUM,          (int*)gui_sub_batch_prefix_enum },
827    {0x5f,LANG_MENU_SUB_EXTENSION,              MENUITEM_ENUM,          (int*)gui_sub_batch_ext_enum },
828    {0x2a,LANG_MENU_RAW_DEVELOP,                MENUITEM_PROC,          (int*)gui_raw_develop },
829    {0x5c,LANG_MENU_BAD_PIXEL_REMOVAL,          MENUITEM_ENUM,          (int*)gui_bad_pixel_enum },
830#if DNG_SUPPORT
831    {0x5c,LANG_MENU_DNG_FORMAT,                 MENUITEM_BOOL | MENUITEM_ARG_CALLBACK, &conf.dng_raw , (int)cb_change_dng },
832    {0x5c,LANG_MENU_RAW_DNG_EXT,                MENUITEM_BOOL,          &conf.raw_dng_ext},
833    {0x2a,LANG_MENU_BADPIXEL_CREATE,            MENUITEM_PROC,          (int*)gui_menuproc_badpixel_create },
834#endif
835    {0x5c,LANG_MENU_RAW_CACHED,                 MENUITEM_BOOL,          &conf.raw_cache },
836    {0x51,LANG_MENU_BACK,                       MENUITEM_UP },
837    {0}
838};
839static CMenu raw_submenu = {0x24,LANG_MENU_RAW_TITLE, NULL, raw_submenu_items };
840
841static CMenuItem zebra_submenu_items[] = {
842    {0x5c,LANG_MENU_ZEBRA_DRAW,                 MENUITEM_BOOL,          &conf.zebra_draw },
843    {0x5f,LANG_MENU_ZEBRA_MODE,                 MENUITEM_ENUM,          (int*)gui_zebra_mode_enum },
844    {0x58,LANG_MENU_ZEBRA_UNDER,                MENUITEM_INT|MENUITEM_F_UNSIGNED|MENUITEM_F_MINMAX,  &conf.zebra_under,  MENU_MINMAX(0, 32) },
845    {0x57,LANG_MENU_ZEBRA_OVER,                 MENUITEM_INT|MENUITEM_F_UNSIGNED|MENUITEM_F_MINMAX,  &conf.zebra_over,   MENU_MINMAX(0, 32) },
846    {0x28,LANG_MENU_ZEBRA_RESTORE_SCREEN,       MENUITEM_BOOL|MENUITEM_ARG_CALLBACK,    &conf.zebra_restore_screen,     (int)cb_zebra_restore_screen },
847    {0x5c,LANG_MENU_ZEBRA_RESTORE_OSD,          MENUITEM_BOOL|MENUITEM_ARG_CALLBACK,    &conf.zebra_restore_osd,        (int)cb_zebra_restore_osd },
848    {0x5f,LANG_MENU_ZEBRA_DRAW_OVER,            MENUITEM_ENUM,          (int*)gui_zebra_draw_osd_enum },
849    {0x5c,LANG_MENU_ZEBRA_MULTICHANNEL,         MENUITEM_BOOL,          &conf.zebra_multichannel },
850    {0x51,LANG_MENU_BACK,                       MENUITEM_UP },
851    {0}
852};
853static CMenu zebra_submenu = {0x26,LANG_MENU_ZEBRA_TITLE, NULL, zebra_submenu_items };
854
855#ifdef OPT_CURVES
856static CMenuItem curve_submenu_items[] = {
857    {0x5f,LANG_MENU_CURVE_ENABLE,               MENUITEM_ENUM,          (int*)gui_conf_curve_enum },
858    {0x35,LANG_MENU_CURVE_LOAD,                 MENUITEM_PROC,          (int*)gui_load_curve },
859    {0x0,LANG_MENU_CURVE_CURRENT,               MENUITEM_SEPARATOR },
860    {0x0,(int)conf.curve_file,                  MENUITEM_TEXT },
861    {0x0,(int)"",                               MENUITEM_SEPARATOR },
862    {0x51,LANG_MENU_BACK,                       MENUITEM_UP },
863    {0}
864};
865static CMenu curve_submenu = {0x85,LANG_MENU_CURVE_PARAM_TITLE, NULL, curve_submenu_items };
866#endif
867
868static CMenuItem root_menu_items[] = {
869    {0x21,LANG_MENU_OPERATION_PARAM,            MENUITEM_SUBMENU,       (int*)&operation_submenu },
870    {0x23,LANG_MENU_VIDEO_PARAM,                MENUITEM_SUBMENU,       (int*)&video_submenu },
871    {0x24,LANG_MENU_MAIN_RAW_PARAM,             MENUITEM_SUBMENU,       (int*)&raw_submenu },
872#ifdef OPT_EDGEOVERLAY
873    {0x7f,LANG_MENU_EDGE_OVERLAY,               MENUITEM_SUBMENU,       (int*)&edge_overlay_submenu },
874#endif
875#ifdef OPT_CURVES
876    {0x85,LANG_MENU_CURVE_PARAM,                MENUITEM_SUBMENU,       (int*)&curve_submenu },
877#endif
878    {0x25,LANG_MENU_MAIN_HISTO_PARAM,           MENUITEM_SUBMENU,       (int*)&histo_submenu },
879    {0x26,LANG_MENU_MAIN_ZEBRA_PARAM,           MENUITEM_SUBMENU,       (int*)&zebra_submenu },
880    {0x22,LANG_MENU_MAIN_OSD_PARAM,             MENUITEM_SUBMENU,       (int*)&osd_submenu },
881    {0x28,LANG_MENU_MAIN_VISUAL_PARAM,          MENUITEM_SUBMENU,       (int*)&visual_submenu },
882#ifdef OPT_SCRIPTING
883    {0x27,LANG_MENU_MAIN_SCRIPT_PARAM,          MENUITEM_SUBMENU,       (int*)&script_submenu },
884#endif
885    {0x29,LANG_MENU_MAIN_MISC,                  MENUITEM_SUBMENU,       (int*)&misc_submenu },
886#ifndef OPTIONS_AUTOSAVE
887    {0x33,LANG_MENU_MAIN_SAVE_OPTIONS,          MENUITEM_PROC,          (int*)gui_menuproc_save },
888#endif
889    {0}
890};
891
892static CMenu root_menu = {0x20,LANG_MENU_MAIN_TITLE, NULL, root_menu_items };
893
894static int gui_user_menu_flag;
895
896static char buf[256];
897
898void rinit(){
899    gui_menu_init(&root_menu);
900}
901
902//-------------------------------------------------------------------
903void
904mod_user_menu(CMenuItem curr_menu_item, int* cur_memnu_item_indx, int mod) {
905int i;
906CMenuItem tmp_menu_item;
907    switch(mod) {
908
909        case 0:
910            /*
911            * Delete user menu entry by sliding all the lower valid/existing entries up.
912            */
913
914            if (*cur_memnu_item_indx == 0) /* don't allow deleting "user menu" */
915                break;
916            for(i = *cur_memnu_item_indx; user_submenu_items[i].text; i++) {
917                user_submenu_items[i] = user_submenu_items[i+1];
918            }
919 
920            /*
921            * there were no valid entries below this one, so
922            * the index pointer must be decremented.
923            */
924            if(!user_submenu_items[*cur_memnu_item_indx].text)
925                *cur_memnu_item_indx -= 1;
926            break;
927 
928        case 1:
929            /*
930            * Insert new Item at end of existing entries
931            */
932            for(i = 1; i < USER_MENU_ITEMS + 1; i++) {
933                if(!user_submenu_items[i].text) {
934                    user_submenu_items[i] = curr_menu_item;
935                    break;
936                }
937            }
938            break;
939 
940        case 2:
941            /*
942            * Move entry up
943            */
944            if((*cur_memnu_item_indx > 1)) {
945                tmp_menu_item = user_submenu_items[*cur_memnu_item_indx -1];
946                user_submenu_items[*cur_memnu_item_indx -1] = user_submenu_items[*cur_memnu_item_indx];
947                user_submenu_items[*cur_memnu_item_indx] = tmp_menu_item;
948                *cur_memnu_item_indx -=1;
949            }
950        break;
951
952        case 3:
953            /*
954            * Move entry down below next entry if next entry is not empty
955            */
956            if (*cur_memnu_item_indx == 0) /* don't allow moving "user menu" */
957                break;
958            if((*cur_memnu_item_indx < (USER_MENU_ITEMS)) && (user_submenu_items[*cur_memnu_item_indx +1].text)) {
959                tmp_menu_item = user_submenu_items[*cur_memnu_item_indx +1];
960                user_submenu_items[*cur_memnu_item_indx + 1] = user_submenu_items[*cur_memnu_item_indx];
961                user_submenu_items[*cur_memnu_item_indx] = tmp_menu_item;
962                *cur_memnu_item_indx +=1;
963            }
964            break;
965    }
966}
967
968//-------------------------------------------------------------------
969void cb_step_25() {
970    voltage_step = (conf.batt_step_25)?25:1;
971}
972
973void cb_perc() {
974    conf.batt_volts_show=0;
975}
976
977void cb_volts() {
978    conf.batt_perc_show=0;
979}
980
981void cb_space_perc() {
982    conf.space_mb_show=0;
983}
984
985void cb_space_mb() {
986    conf.space_perc_show=0;
987}
988
989void cb_battery_menu_change(unsigned int item) {
990    switch (item) {
991        case 0: //Voltage MAX
992            if (conf.batt_volts_max<conf.batt_volts_min+25) {
993                conf.batt_volts_min = conf.batt_volts_max-25;
994            }
995            break;
996        case 1: //Voltage MIN
997            if (conf.batt_volts_min>conf.batt_volts_max-25) {
998                conf.batt_volts_max = conf.batt_volts_min+25;
999            }
1000            break;
1001        default:
1002            break;
1003    }
1004}
1005
1006void cb_zebra_restore_screen() {
1007    if (!conf.zebra_restore_screen)
1008        conf.zebra_restore_osd = 0;
1009}
1010
1011void cb_zebra_restore_osd() {
1012    if (conf.zebra_restore_osd)
1013        conf.zebra_restore_screen = 1;
1014}
1015
1016#if DNG_SUPPORT
1017void cb_change_dng(){
1018     int old=conf.dng_raw;
1019     conf_change_dng();
1020     if ((old==1) && (conf.dng_raw==0)) gui_mbox_init(LANG_ERROR, LANG_CANNOT_OPEN_BADPIXEL_FILE, MBOX_BTN_OK|MBOX_TEXT_CENTER, NULL);
1021}
1022   
1023void gui_menuproc_badpixel_create(int arg) {
1024    create_badpixel_bin();
1025}
1026#endif
1027
1028#if defined (DNG_EXT_FROM)
1029    void cb_change_dng_usb_ext(){
1030     if (conf.dng_usb_ext) change_ext_to_dng(); else change_ext_to_default();
1031}
1032#endif
1033
1034/*
1035common code for "enum" menu items that just take a list of string values and don't require any special setters
1036would be better to have another menu item type that does this by default
1037save memory by eliminating dupe code
1038*/
1039static void gui_enum_value_change(int *value, int change, unsigned num_items) {
1040    *value+=change;
1041    if (*value<0)
1042        *value = num_items-1;
1043    else if (*value>=num_items)
1044        *value = 0;
1045}
1046
1047static const char* gui_change_simple_enum(int* value, int change, const char** items, unsigned num_items) {
1048    gui_enum_value_change(value, change, num_items);
1049    return items[*value];
1050}
1051
1052//-------------------------------------------------------------------
1053#if CAM_REMOTE
1054    const char* gui_show_usb_info_enum(int change, int arg) {
1055        static const char* modes[]={ "Off", "Icon", "Text"};
1056
1057        gui_enum_value_change(&conf.usb_info_enable,change,sizeof(modes)/sizeof(modes[0]));
1058
1059        return modes[conf.usb_info_enable];
1060    }
1061#endif
1062//-------------------------------------------------------------------
1063#ifdef OPT_CURVES
1064    const char* gui_conf_curve_enum(int change, int arg) {
1065        static const char* modes[]={ "None", "Custom", "+1EV", "+2EV", "Auto DR" };
1066
1067        gui_enum_value_change(&conf.curve_enable,change,sizeof(modes)/sizeof(modes[0]));
1068
1069        if(change)
1070            curve_init_mode();
1071        return modes[conf.curve_enable];
1072    }
1073#endif
1074//-------------------------------------------------------------------
1075const char* gui_script_autostart_enum(int change, int arg) {
1076    static const char* modes[]={ "Off", "On", "Once"};
1077
1078    return gui_change_simple_enum(&conf.script_startup,change,modes,sizeof(modes)/sizeof(modes[0]));
1079}
1080
1081#ifdef OPT_SCRIPTING
1082//-------------------------------------------------------------------
1083const char* gui_script_param_set_enum(int change, int arg) {
1084    static const char* modes[]={ "0", "1", "2", "3", "4", "5", "6", "7", "8", "9" };
1085
1086    if (change != 0) {
1087        if (conf.script_param_save) {
1088            save_params_values(0);
1089        }
1090        gui_enum_value_change(&conf.script_param_set,change,sizeof(modes)/sizeof(modes[0]));
1091
1092        if (!load_params_values(conf.script_file, 1, 0))
1093            script_load(conf.script_file, 0);
1094        gui_update_script_submenu();
1095    }
1096
1097    return modes[conf.script_param_set];
1098}
1099
1100//-------------------------------------------------------------------
1101void gui_update_script_submenu() {
1102    register int p=0, i;
1103
1104    for (i=0; i<sizeof(script_submenu_items_top)/sizeof(script_submenu_items_top[0]); ++p, ++i) {
1105        script_submenu_items[p]=script_submenu_items_top[i];
1106    }
1107    for (i=0; i<SCRIPT_NUM_PARAMS; ++i) {
1108        if (script_param_order[i]) {
1109            script_submenu_items[p].symbol=0x0;
1110            script_submenu_items[p].text=(int)script_params[script_param_order[i]-1];
1111            script_submenu_items[p].type=MENUITEM_INT;
1112            script_submenu_items[p].value=&conf.ubasic_vars[script_param_order[i]-1];
1113            ++p;
1114        }
1115    }
1116    for (i=0; i<sizeof(script_submenu_items_bottom)/sizeof(script_submenu_items_bottom[0]); ++p, ++i) {
1117        script_submenu_items[p]=script_submenu_items_bottom[i];
1118    }
1119}
1120
1121//-------------------------------------------------------------------
1122static void gui_load_script_selected(const char *fn) {
1123    if (fn)
1124        script_load(fn, 1);
1125}
1126
1127void gui_load_script(int arg) {
1128    DIR   *d;
1129    char  *path="A/CHDK/SCRIPTS";
1130
1131    // if exists "A/CHDK/SCRIPTS" go into
1132    d=opendir(path);
1133    if (d) {
1134        closedir(d);
1135    } else {
1136        path="A";
1137    }
1138
1139    gui_fselect_init(LANG_STR_SELECT_SCRIPT_FILE, path, gui_load_script_selected);
1140}
1141
1142void gui_load_script_default(int arg) {
1143    script_load(conf.script_file, 0);
1144    if (conf.script_param_save) {
1145        save_params_values(1);
1146    }
1147}
1148#endif
1149
1150//-------------------------------------------------------------------
1151const char* gui_override_disable_enum(int change, int arg) {
1152    static const char* modes[]={ "Off", "On", "Disabled"};
1153
1154    return gui_change_simple_enum(&conf.override_disable,change,modes,sizeof(modes)/sizeof(modes[0]));
1155}
1156
1157//-------------------------------------------------------------------
1158const char* gui_histo_mode_enum(int change, int arg) {
1159    static const char* modes[]={ "Linear", "Log" };
1160
1161    gui_enum_value_change(&conf.histo_mode,change,sizeof(modes)/sizeof(modes[0]));
1162
1163    histogram_set_mode(conf.histo_mode);
1164
1165    return modes[conf.histo_mode];
1166}
1167
1168//-------------------------------------------------------------------
1169const char* gui_temp_mode_enum(int change, int arg) {
1170    static const char* modes[]={ "Off", "Optical","CCD","Battery","all" };
1171
1172    return gui_change_simple_enum(&conf.show_temp,change,modes,sizeof(modes)/sizeof(modes[0]));
1173}
1174
1175//-------------------------------------------------------------------
1176const char* gui_histo_layout_enum(int change, int arg) {
1177    static const char* modes[]={ "RGB", "Y", "RGB Y",  "R G B", "RGB all", "Y all", "Blend", "Blend Y"};
1178
1179    gui_enum_value_change(&conf.histo_layout,change,sizeof(modes)/sizeof(modes[0]));
1180
1181    if (conf.histo_layout==OSD_HISTO_LAYOUT_Y || conf.histo_layout==OSD_HISTO_LAYOUT_Y_argb) {
1182        histogram_set_main(HISTO_Y);
1183    } else {
1184        histogram_set_main(HISTO_RGB);
1185    }
1186
1187    return modes[conf.histo_layout];
1188}
1189
1190//-------------------------------------------------------------------
1191const char* gui_font_enum(int change, int arg) {
1192    static const char* fonts[]={ "Win1250", "Win1251", "Win1252", "Win1253", "Win1254", "Win1257"};
1193
1194    gui_enum_value_change(&conf.font_cp,change,sizeof(fonts)/sizeof(fonts[0]));
1195
1196    if (change != 0) {
1197        font_set(conf.font_cp);
1198        if (!rbf_load(conf.menu_rbf_file))
1199            rbf_load_from_8x16(current_font);
1200        rbf_set_codepage(FONT_CP_WIN);
1201        gui_menu_init(NULL);
1202    }
1203
1204    return fonts[conf.font_cp];
1205}
1206
1207//-------------------------------------------------------------------
1208const char* gui_raw_prefix_enum(int change, int arg) {
1209    return gui_change_simple_enum(&conf.raw_prefix,change,img_prefixes,NUM_IMG_PREFIXES);
1210}
1211
1212//-------------------------------------------------------------------
1213const char* gui_raw_ext_enum(int change, int arg) {
1214    return gui_change_simple_enum(&conf.raw_ext,change,img_exts,NUM_IMG_EXTS);
1215}
1216
1217//-------------------------------------------------------------------
1218const char* gui_sub_batch_prefix_enum(int change, int arg) {
1219    return gui_change_simple_enum(&conf.sub_batch_prefix,change,img_prefixes,NUM_IMG_PREFIXES);
1220}
1221
1222//-------------------------------------------------------------------
1223const char* gui_sub_batch_ext_enum(int change, int arg) {
1224    return gui_change_simple_enum(&conf.sub_batch_ext,change,img_exts,NUM_IMG_EXTS);
1225}
1226
1227//-------------------------------------------------------------------
1228const char* gui_raw_nr_enum(int change, int arg) {
1229    static const char* modes[]={ "Auto", "Off", "On"};
1230
1231    return gui_change_simple_enum(&conf.raw_nr,change,modes,sizeof(modes)/sizeof(modes[0]));
1232}
1233
1234//-------------------------------------------------------------------
1235#ifdef OPT_TEXTREADER
1236const char* gui_reader_codepage_enum(int change, int arg) {
1237    static const char* cps[]={ "Win1251", "DOS"};
1238
1239    return gui_change_simple_enum(&conf.reader_codepage,change,cps,sizeof(cps)/sizeof(cps[0]));
1240}
1241#endif
1242//-------------------------------------------------------------------
1243const char* gui_autoiso_shutter_enum(int change, int arg) {
1244    static const char* shutter[]={ "Auto", "1/8s", "1/15s", "1/30s", "1/60s", "1/125s", "1/250s", "1/500s", "1/1000s"};
1245
1246    return gui_change_simple_enum(&conf.autoiso_shutter,change,shutter,sizeof(shutter)/sizeof(shutter[0]));
1247}
1248
1249//-------------------------------------------------------------------
1250const char* gui_zebra_mode_enum(int change, int arg) {
1251    static const char* modes[]={ "Blink 1", "Blink 2", "Blink 3", "Solid", "Zebra 1", "Zebra 2" };
1252
1253    return gui_change_simple_enum(&conf.zebra_mode,change,modes,sizeof(modes)/sizeof(modes[0]));
1254}
1255
1256//-------------------------------------------------------------------
1257const char* gui_zebra_draw_osd_enum(int change, int arg) {
1258    static const char* modes[]={ "Nothing", "Histo", "OSD" };
1259
1260    return gui_change_simple_enum(&conf.zebra_draw_osd,change,modes,sizeof(modes)/sizeof(modes[0]));
1261}
1262
1263//-------------------------------------------------------------------
1264const char* gui_zoom_value_enum(int change, int arg) {
1265    static const char* modes[]={ "X", "FL", "EFL" };
1266
1267    return gui_change_simple_enum(&conf.zoom_value,change,modes,sizeof(modes)/sizeof(modes[0]));
1268}
1269
1270const char* gui_show_values_enum(int change, int arg) {
1271    static const char* modes[]={ "Don't", "Always", "Shoot" };
1272
1273    return gui_change_simple_enum(&conf.show_values,change,modes,sizeof(modes)/sizeof(modes[0]));
1274}
1275
1276const char* gui_nd_filter_state_enum(int change, int arg) {
1277    static const char* modes[]={ "Off", "In", "Out" };
1278
1279    return gui_change_simple_enum(&conf.nd_filter_state,change,modes,sizeof(modes)/sizeof(modes[0]));
1280}
1281
1282const char* gui_dof_show_value_enum(int change, int arg) {
1283    static const char* modes[]={ "Don't", "Separate", "+Separate", "In Misc", "+In Misc" };
1284
1285    return gui_change_simple_enum(&conf.show_dof,change,modes,sizeof(modes)/sizeof(modes[0]));
1286}
1287
1288const char* gui_histo_show_enum(int change, int arg) {
1289    static const char* modes[]={ "Don't", "Always", "Shoot" };
1290
1291    return gui_change_simple_enum(&conf.show_histo,change,modes,sizeof(modes)/sizeof(modes[0]));
1292}
1293
1294const char* gui_show_clock_enum(int change, int arg) {
1295    static const char* modes[]={ "Don't", "Normal", "Seconds"};
1296
1297    return gui_change_simple_enum(&conf.show_clock,change,modes,sizeof(modes)/sizeof(modes[0]));
1298}
1299
1300const char* gui_hide_osd_enum(int change, int arg) {
1301    static const char* modes[]={ "Don't", "Playback", "Key DISP.", "both"};
1302
1303    return gui_change_simple_enum(&conf.hide_osd,change,modes,sizeof(modes)/sizeof(modes[0]));
1304}
1305
1306const char* gui_clock_format_enum(int change, int arg) {
1307    static const char* modes[]={ "24h", "12h"};
1308
1309    return gui_change_simple_enum(&conf.clock_format,change,modes,sizeof(modes)/sizeof(modes[0]));
1310}
1311
1312const char* gui_clock_indicator_enum(int change, int arg) {
1313    static const char* modes[]={ "PM", "P","."};
1314
1315    return gui_change_simple_enum(&conf.clock_indicator,change,modes,sizeof(modes)/sizeof(modes[0]));
1316}
1317
1318const char* gui_clock_halfpress_enum(int change, int arg) {
1319    static const char* modes[]={ "Full", "Seconds","Don't"};
1320
1321    return gui_change_simple_enum(&conf.clock_halfpress,change,modes,sizeof(modes)/sizeof(modes[0]));
1322}
1323
1324const char* gui_space_bar_enum(int change, int arg) {
1325    static const char* modes[]={ "Don't", "Horizontal", "Vertical"};
1326
1327    return gui_change_simple_enum(&conf.space_bar_show,change,modes,sizeof(modes)/sizeof(modes[0]));
1328}
1329
1330const char* gui_space_bar_size_enum(int change, int arg) {
1331    static const char* modes[]={ "1/4", "1/2", "1"};
1332
1333    return gui_change_simple_enum(&conf.space_bar_size,change,modes,sizeof(modes)/sizeof(modes[0]));
1334}
1335
1336const char* gui_space_bar_width_enum(int change, int arg) {
1337    static const char* modes[]={ "1", "2", "3","4","5","6","7","8","9","10"};
1338
1339    return gui_change_simple_enum(&conf.space_bar_width,change,modes,sizeof(modes)/sizeof(modes[0]));
1340}
1341
1342const char* gui_space_warn_type_enum(int change, int arg) {
1343    static const char* modes[]={ "Percent", "MB", "Don't"};
1344
1345    return gui_change_simple_enum(&conf.space_warn_type,change,modes,sizeof(modes)/sizeof(modes[0]));
1346}
1347
1348const char* gui_show_movie_time(int change, int arg) {
1349     static const char* modes[]={ "Don't", "hh:mm:ss", "KB/s","both"};
1350 
1351     return gui_change_simple_enum(&conf.show_movie_time,change,modes,sizeof(modes)/sizeof(modes[0]));
1352}
1353
1354//-------------------------------------------------------------------
1355#if CAM_ADJUSTABLE_ALT_BUTTON
1356    const char* gui_alt_mode_button_enum(int change, int arg) {
1357    #if defined(CAMERA_s2is) || defined(CAMERA_s3is) || defined(CAMERA_s5is)
1358        static const char* names[]={ "Shrtcut", "Flash", "Timer", "ISO", "Video" };
1359        static const int keys[]={ KEY_PRINT, KEY_FLASH, KEY_TIMER, KEY_ISO, KEY_VIDEO };
1360    #elif defined(CAMERA_g7)
1361        static const char* names[]={ "Print", "FE"};
1362        static const int keys[]={ KEY_PRINT, KEY_MICROPHONE };
1363    #elif defined(CAMERA_g9)
1364        static const char* names[]={ "Print", "FE"};
1365        static const int keys[]={ KEY_PRINT,  KEY_MICROPHONE };
1366    #elif defined(CAMERA_a650)
1367        static const char* names[]={ "Print", "ISO"};
1368        static const int keys[]={ KEY_PRINT, KEY_ISO };
1369    #elif defined(CAMERA_sx100is) || defined(CAMERA_sx110is)
1370        static const char* names[]={ "Print", "Face"};
1371        static const int keys[]={ KEY_PRINT, KEY_FACE };
1372    #elif defined(CAMERA_sx10) || defined(CAMERA_sx1) || defined(CAMERA_sx20) || defined(CAMERA_sx30)
1373        static const char* names[]={ "Shrtcut", "Flash", "Video"};
1374        static const int keys[]={ KEY_PRINT, KEY_FLASH, KEY_VIDEO };
1375    #elif defined(CAMERA_a570) || defined(CAMERA_a590) || defined(CAMERA_a720)
1376        static const char* names[]={ "Print", "Display"};
1377        static const int keys[] = {KEY_PRINT, KEY_DISPLAY};
1378    #else
1379        #error camera alt-buttons not defined
1380    #endif
1381        int i;
1382
1383        for (i=0; i<sizeof(names)/sizeof(names[0]); ++i) {
1384            if (conf.alt_mode_button==keys[i]) {
1385                break;
1386            }
1387        }
1388
1389        i+=change;
1390        if (i<0)
1391            i=(sizeof(names)/sizeof(names[0]))-1;
1392        else if (i>=(sizeof(names)/sizeof(names[0])))
1393            i=0;
1394
1395        conf.alt_mode_button = keys[i];
1396        kbd_set_alt_mode_key_mask(conf.alt_mode_button);
1397        return names[i];
1398    }
1399#endif
1400
1401//-------------------------------------------------------------------
1402const char* gui_alt_power_enum(int change, int arg) {
1403// Script option is retained even if scripting is disabled, otherwise conf values will change
1404// Equivalent to ALT
1405    static const char* modes[]={ "Never", "Alt", "Script", "Always" };
1406
1407    gui_enum_value_change(&conf.alt_prevent_shutdown,change,sizeof(modes)/sizeof(modes[0]));
1408       
1409    return modes[conf.alt_prevent_shutdown];
1410}
1411const char* gui_fast_ev_step(int change, int arg) {
1412    static const char* modes[]={"1/6 Ev","1/3 Ev","1/2 Ev", "2/3 Ev","5/6 Ev","1 Ev","1 1/6 Ev","1 1/3 Ev","1 1/2 Ev", "1 2/3 Ev","1 5/6 Ev","2 Ev","2 1/6 Ev","2 1/3 Ev","2 1/2 Ev", "2 2/3 Ev","2 5/6 Ev","3 Ev","3 1/6 Ev","3 1/3 Ev","3 1/2 Ev", "3 2/3 Ev","3 5/6 Ev","4 Ev"};
1413   
1414    return gui_change_simple_enum(&conf.fast_ev_step,change,modes,sizeof(modes)/sizeof(modes[0]));
1415}
1416#if CAM_QUALITY_OVERRIDE
1417    const char* gui_fast_image_quality(int change, int arg) {
1418    static const char* modes[]={"sup.fine","fine","normal","off"};
1419   
1420    return gui_change_simple_enum(&conf.fast_image_quality,change,modes,sizeof(modes)/sizeof(modes[0]));
1421    }
1422#endif
1423
1424const char* gui_video_mode_enum(int change, int arg) {
1425#if !CAM_VIDEO_QUALITY_ONLY
1426    static const char* modes[]={ "Bitrate", "Quality"};
1427#else
1428    static const char* modes[]={ "Default", "Quality"};
1429#endif
1430    return gui_change_simple_enum(&conf.video_mode,change,modes,sizeof(modes)/sizeof(modes[0]));
1431}
1432
1433//-------------------------------------------------------------------
1434const char* gui_video_bitrate_enum(int change, int arg) {
1435    gui_enum_value_change(&conf.video_bitrate,change,VIDEO_BITRATE_STEPS);
1436
1437    shooting_video_bitrate_change(conf.video_bitrate);
1438
1439    return video_bitrate_strings[conf.video_bitrate];
1440}
1441
1442//-------------------------------------------------------------------
1443const char* gui_tv_bracket_values_enum(int change, int arg) {
1444    static const char* modes[]={ "Off", "1/3 Ev","2/3 Ev", "1 Ev", "1 1/3Ev", "1 2/3Ev", "2 Ev", "2 1/3Ev", "2 2/3Ev", "3 Ev", "3 1/3Ev", "3 2/3Ev", "4 Ev"};
1445
1446    return gui_change_simple_enum(&conf.tv_bracket_value,change,modes,sizeof(modes)/sizeof(modes[0]));
1447}
1448
1449const char* gui_av_bracket_values_enum(int change, int arg) {
1450    static const char* modes[]={ "Off", "1/3 Ev","2/3 Ev", "1 Ev", "1 1/3Ev", "1 2/3Ev", "2 Ev", "2 1/3Ev", "2 2/3Ev", "3 Ev", "3 1/3Ev", "3 2/3Ev", "4 Ev"};
1451
1452    return gui_change_simple_enum(&conf.av_bracket_value,change,modes,sizeof(modes)/sizeof(modes[0]));
1453}
1454
1455const char* gui_subj_dist_bracket_koef_enum(int change, int arg) {
1456    static const char* modes[]={"Off", "1", "10","100","1000"};
1457
1458    return gui_change_simple_enum(&conf.subj_dist_bracket_koef,change,modes,sizeof(modes)/sizeof(modes[0]));
1459}
1460
1461const char* gui_iso_bracket_koef_enum(int change, int arg) {
1462    static const char* modes[]={ "Off","1", "10","100"};
1463
1464    return gui_change_simple_enum(&conf.iso_bracket_koef,change,modes,sizeof(modes)/sizeof(modes[0]));
1465}
1466
1467const char* gui_bracket_type_enum(int change, int arg) {
1468    static const char* modes[]={ "+/-", "-","+"};
1469
1470    return gui_change_simple_enum(&conf.bracket_type,change,modes,sizeof(modes)/sizeof(modes[0]));
1471}
1472
1473const char* gui_tv_override_koef_enum(int change, int arg) {
1474    static const char* modes[]={"Off", "1/100K", "1/10000", "1/1000","1/100","1/10", "1","10","100"};
1475
1476    conf.tv_override_koef+=change;
1477    if (conf.tv_enum_type) {
1478        if (conf.tv_override_koef<0)  conf.tv_override_koef=6;
1479        else if (conf.tv_override_koef>6) conf.tv_override_koef=0;
1480        else if (conf.tv_override_koef==1)       conf.tv_override_koef=6;
1481        else if (conf.tv_override_koef==5)       conf.tv_override_koef=0;
1482        else if (conf.tv_override_koef!=0 && conf.tv_override_koef!=6) conf.tv_override_koef=6;
1483    }
1484    else {
1485    if (conf.tv_override_koef<0)
1486        conf.tv_override_koef=sizeof(modes)/sizeof(modes[0])-1;
1487    else if (conf.tv_override_koef>=(sizeof(modes)/sizeof(modes[0])))
1488        conf.tv_override_koef=0;
1489    }
1490
1491    return modes[conf.tv_override_koef];
1492}
1493
1494const char* gui_tv_override_value_enum(int change, int arg) {
1495    /*
1496    static const char* modes[]={
1497    // add very long time exposures as approximately powers of 2, adding 15 exposures
1498    "2048","1625","1290","1024","812","645","512","406","322","256","203","161","128","101","80",
1499    "64","50.8", "40.3", "32", "25.4","20","16", "12.7", "10","8", "6.3","5","4","3.2", "2.5","2", "1.6", "1.3", "1", "0.8", "0.6", "0.5", "0.4", "0.3", "1/4", "1/5", "1/6", "1/8", "1/10", "1/13", "1/15", "1/20", "1/25", "1/30", "1/40", "1/50", "1/60", "1/80", "1/100", "1/125", "1/160", "1/200", "1/250", "1/320", "1/400", "1/500", "1/640","1/800", "1/1000", "1/1250", "1/1600","1/2000","1/2500","1/3200","1/4000", "1/5000", "1/6400", "1/8000", "1/10000", "1/12500", "1/16000", "1/20000", "1/25000", "1/32000", "1/40000", "1/50000", "1/64000","1/80000", "1/100k"};
1500    */
1501
1502    // XXX This array above is redundant with platform/generic/shooting.c, this should be avoided!
1503    conf.tv_override_value+=change;
1504    if (conf.tv_enum_type) {
1505       if (conf.tv_override_value<0) {
1506          conf.tv_override_value=tv_override_amount-1;
1507        }
1508       else if ((unsigned)conf.tv_override_value>=(tv_override_amount))
1509         conf.tv_override_value=0;
1510       return tv_override[conf.tv_override_value];
1511    }
1512    else {
1513        if (conf.tv_override_value<0) {
1514            conf.tv_override_value=100;
1515        }
1516        else if (conf.tv_override_value>100)  conf.tv_override_value=0;
1517            sprintf(buf, "%d",  conf.tv_override_value);
1518        return buf;
1519    }
1520}
1521
1522const char* gui_tv_enum_type_enum(int change, int arg) {
1523    static const char* modes[]={"Factor", "Ev Step"};
1524
1525    gui_enum_value_change(&conf.tv_enum_type,change,sizeof(modes)/sizeof(modes[0]));
1526    if (change) {
1527        conf.tv_override_koef=6;
1528        if (conf.tv_enum_type) 
1529            conf.tv_override_value=tv_override_zero_shift;
1530        else conf.tv_override_value=1;
1531    }
1532    return modes[conf.tv_enum_type];
1533}
1534
1535const char* gui_iso_override_koef_enum(int change, int arg) {
1536    static const char* modes[]={ "Off","1", "10","100"};
1537
1538    return gui_change_simple_enum(&conf.iso_override_koef,change,modes,sizeof(modes)/sizeof(modes[0]));
1539}
1540
1541const char* gui_subj_dist_override_value_enum(int change, int arg) {
1542    static const int koef[] = {0, 1,10,100,1000};
1543    conf.subj_dist_override_value+=(change*koef[conf.subj_dist_override_koef]);
1544    if (conf.subj_dist_override_value<0)
1545        conf.subj_dist_override_value=MAX_DIST;
1546    else if (conf.subj_dist_override_value>MAX_DIST)
1547        conf.subj_dist_override_value=0;
1548    sprintf(buf, "%d", (int)conf.subj_dist_override_value);
1549    return buf;
1550}
1551
1552const char* gui_subj_dist_override_koef_enum(int change, int arg) {
1553    static const char* modes[]={ "Off","1", "10","100","1000"};
1554
1555    return gui_change_simple_enum(&conf.subj_dist_override_koef,change,modes,sizeof(modes)/sizeof(modes[0]));
1556}
1557
1558const char* gui_av_override_enum(int change, int arg) {
1559    conf.av_override_value+=change;
1560    if (conf.av_override_value<0) conf.av_override_value=shooting_get_aperture_sizes_table_size()+6;
1561    else if (conf.av_override_value>shooting_get_aperture_sizes_table_size()+6) conf.av_override_value=0;
1562    if (conf.av_override_value == 0)  return "Off";
1563    else {
1564         short prop_id=shooting_get_aperture_from_av96(shooting_get_av96_override_value());             
1565         sprintf(buf, "%d.%02d", (int)prop_id/100, (int)prop_id%100 );
1566         return buf;
1567    }
1568}
1569
1570#if ZOOM_OVERRIDE
1571    const char* gui_zoom_override_enum(int change, int arg) {
1572        conf.zoom_override_value+=change;
1573        if (conf.zoom_override_value<0) conf.zoom_override_value=zoom_points-1;
1574        else if (conf.zoom_override_value>zoom_points-1) conf.zoom_override_value=0;
1575            sprintf(buf,"%i",conf.zoom_override_value);
1576            return buf;
1577    }
1578#endif
1579
1580const char* gui_user_menu_show_enum(int change, int arg) {
1581    static const char* modes[]={ "Off", "On","On Direct", "Edit" };
1582
1583    if (conf.user_menu_enable == 3) user_menu_save();
1584
1585    return gui_change_simple_enum(&conf.user_menu_enable,change,modes,sizeof(modes)/sizeof(modes[0]));
1586}
1587 
1588const char* gui_video_af_key_enum(int change, int arg) {
1589#if CAMERA_g12
1590    static const char* names[]={ "", "Shutter", "Set", "AE Lock"};
1591    static const int keys[]={0, KEY_SHOOT_HALF, KEY_SET, KEY_AE_LOCK };
1592#else
1593    static const char* names[]={ "", "Shutter", "Set"};
1594    static const int keys[]={0, KEY_SHOOT_HALF, KEY_SET };
1595#endif
1596    int i;
1597 
1598    for (i=0; i<sizeof(names)/sizeof(names[0]); ++i) {
1599        if (conf.video_af_key==keys[i]) {
1600            break;
1601        }
1602    }
1603 
1604    i+=change;
1605    if (i<0)
1606        i=(sizeof(names)/sizeof(names[0]))-1;
1607    else if (i>=(sizeof(names)/sizeof(names[0])))
1608        i=0;
1609 
1610    conf.video_af_key = keys[i];
1611    return names[i];
1612}
1613   
1614const char* gui_bad_pixel_enum(int change, int arg) {
1615    int modes[]={LANG_MENU_BAD_PIXEL_OFF, LANG_MENU_BAD_PIXEL_INTERPOLATION, LANG_MENU_BAD_PIXEL_RAW_CONVERTER};
1616   
1617    return lang_str((int)gui_change_simple_enum(&conf.bad_pixel_removal,change,(const char**)modes,sizeof(modes)/sizeof(modes[0])));
1618}
1619
1620//-------------------------------------------------------------------
1621void raw_fselect_cb(const char * filename){
1622    struct stat st;
1623    if (!filename) return;
1624    stat((char*)filename,&st);
1625    if (st.st_size!=hook_raw_size()) return;
1626    gui_mbox_init((int)"", LANG_RAW_DEVELOP_MESSAGE, MBOX_BTN_OK|MBOX_TEXT_CENTER, NULL);
1627    raw_prepare_develop((char*)filename);
1628}
1629
1630//-------------------------------------------------------------------
1631void gui_raw_develop(int arg){
1632    gui_fselect_init(LANG_RAW_DEVELOP_SELECT_FILE, "A/DCIM", raw_fselect_cb);
1633}
1634
1635//-------------------------------------------------------------------
1636static void gui_menuproc_reset_files(int arg){
1637    conf.lang_file[0] = 0;
1638    conf.menu_symbol_rbf_file[0] = 0;
1639    conf.menu_rbf_file[0] = 0;
1640    conf_save();
1641    gui_mbox_init(LANG_INFORMATION, LANG_MENU_RESTART_CAMERA, MBOX_BTN_OK|MBOX_TEXT_CENTER, NULL);
1642}
1643
1644//-------------------------------------------------------------------
1645#ifdef OPT_DEBUGGING
1646    #define TASKLIST_MAX_LINES 12 // probably as much as will fit on screen
1647    #define TASKLIST_NUM_TASKS 64 // should be enough ?
1648    static void gui_debug_draw_tasklist(void) {
1649    #ifndef CAM_DRYOS
1650        int tasklist[TASKLIST_NUM_TASKS]; // max number of tasks we will look at
1651        int n_tasks,n_show_tasks,show_start;
1652        const char *name;
1653        int i;
1654        n_tasks = task_id_list_get(tasklist,sizeof(tasklist)/sizeof(tasklist[0]));
1655        show_start = debug_tasklist_start;
1656        n_show_tasks = n_tasks - show_start;
1657        // auto adjust to show the last N tasks
1658        if(n_show_tasks < TASKLIST_MAX_LINES) {
1659            show_start = n_tasks - TASKLIST_MAX_LINES;
1660            if(show_start<0)
1661                show_start = 0;
1662             n_show_tasks = n_tasks - show_start;
1663        }
1664        else if( n_show_tasks > TASKLIST_MAX_LINES ) {
1665            n_show_tasks = TASKLIST_MAX_LINES;
1666        }
1667        sprintf(buf,"%d-%d of %d tasks %c",show_start,show_start+n_show_tasks,n_tasks,debug_display_direction > 0?'+':'-');
1668        draw_string(64,0,buf, conf.osd_color);
1669        for( i = 0;  i < n_show_tasks; i++ ) {
1670            // TODO get full task info
1671            name = task_name(tasklist[show_start+i]);
1672            if ( !name || !*name ) {
1673                name = "(unknown)";
1674            }
1675            sprintf(buf,"%10s %8X",name,tasklist[show_start+i]);
1676            draw_string(64,16+16*i,buf, conf.osd_color);
1677        }
1678    #endif //CAM_DRYOS
1679    }
1680
1681    #define DEBUG_DISPLAY_NONE   0
1682    #define DEBUG_DISPLAY_PROPS  1
1683    #define DEBUG_DISPLAY_PARAMS 2
1684    #define DEBUG_DISPLAY_TASKS  3
1685    static const char * gui_debug_shortcut_enum(int change, int arg) {
1686        static const char* modes[]={ "None", "DmpRAM", "Page", "CmpProps"};
1687
1688        return gui_change_simple_enum(&conf.debug_shortcut_action,change,modes,sizeof(modes)/sizeof(modes[0]));
1689    }
1690
1691    static const char * gui_debug_display_enum(int change, int arg) {
1692        static const char* modes[]={ "None", "Props", "Params", "Tasks"};
1693
1694        return gui_change_simple_enum(&conf.debug_display,change,modes,sizeof(modes)/sizeof(modes[0]));
1695    }
1696
1697    static void gui_debug_shortcut(void) {
1698        static int lastcall = -1;
1699        int t=get_tick_count();
1700        if ( lastcall != -1) {
1701            if (t-lastcall <= 400)
1702                debug_display_direction = -debug_display_direction;
1703        }
1704        lastcall=t;
1705        switch(conf.debug_shortcut_action) {
1706            case 1:
1707                dump_memory();
1708            break;
1709            case 2:
1710                if(conf.debug_display == DEBUG_DISPLAY_TASKS) {
1711                    debug_tasklist_start += debug_display_direction*(TASKLIST_MAX_LINES-2); // a little intentional overlap
1712                    if(debug_tasklist_start >= TASKLIST_NUM_TASKS || debug_tasklist_start < 0)
1713                        debug_tasklist_start = 0;
1714                }
1715                else if (conf.debug_display == DEBUG_DISPLAY_PROPS || conf.debug_display == DEBUG_DISPLAY_PARAMS) {
1716                    conf.debug_propcase_page += debug_display_direction*1;
1717                    if(conf.debug_propcase_page > 128 || conf.debug_propcase_page < 0)
1718                        conf.debug_propcase_page = 0;
1719                }
1720            break;
1721            case 3:
1722                gui_compare_props(1);
1723            break;
1724        }
1725    }
1726
1727#endif
1728
1729#if CAM_MULTIPART
1730    void card_break_proc(unsigned int btn){
1731     if (btn==MBOX_BTN_YES) create_partitions();
1732    }
1733
1734    #ifdef OPT_DEBUGGING
1735        static void gui_menuproc_break_card(int arg){
1736         gui_mbox_init(LANG_WARNING, LANG_PARTITIONS_CREATE_WARNING, MBOX_BTN_YES_NO|MBOX_DEF_BTN2|MBOX_TEXT_CENTER, card_break_proc);
1737        }
1738    #endif
1739
1740    static void gui_menuproc_swap_partitions(int arg){
1741     if (get_part_count()<2) gui_mbox_init(LANG_ERROR, LANG_ONLY_ONE_PARTITION, MBOX_BTN_OK|MBOX_TEXT_CENTER, NULL);
1742     else
1743        {
1744            swap_partitions();
1745            gui_mbox_init(LANG_INFORMATION, LANG_SOKOBAN_MSG_FINISH_TITLE, MBOX_BTN_OK|MBOX_TEXT_CENTER, NULL);
1746        }
1747    }
1748#endif
1749
1750//-------------------------------------------------------------------
1751static volatile enum Gui_Mode gui_mode;
1752static volatile int gui_restore;
1753static volatile int gui_in_redraw;
1754static int gui_splash, gui_splash_mode;
1755#ifdef OPTIONS_AUTOSAVE
1756    static Conf old_conf;
1757#endif
1758
1759//-------------------------------------------------------------------
1760void gui_init()
1761{
1762
1763    gui_mode = GUI_MODE_NONE;
1764    gui_restore = 0;
1765    gui_in_redraw = 0;
1766    if (conf.start_sound>0)
1767    {
1768        play_sound(4);
1769    }
1770    gui_splash = (conf.splash_show)?SPLASH_TIME:0;
1771    gui_lang_init();
1772    draw_init();
1773
1774    exposition_thresh = screen_size/500;
1775    voltage_step = (conf.batt_step_25)?25:1;
1776    load_bad_pixels_list("A/CHDK/badpixel");
1777    load_bad_pixels_list("A/CHDK/badpixel.txt");
1778#ifdef OPT_CURVES
1779    // initialize curves, loading files if required by current mode
1780    curve_init_mode();
1781#endif
1782
1783#if ZOOM_OVERRIDE
1784    // reyalp - need to do this in capt_seq
1785    // if (conf.zoom_override) shooting_set_zoom(conf.zoom_override_value);
1786#endif
1787}
1788
1789//-------------------------------------------------------------------
1790#ifdef OPT_CURVES
1791    static void gui_load_curve_selected(const char *fn) {
1792        if (fn) {
1793            // TODO we could sanity check here, but curve_set_type should fail gracefullish
1794            strcpy(conf.curve_file,fn);
1795            if(conf.curve_enable == 1)
1796                curve_init_mode();
1797        }
1798    }
1799
1800    //-------------------------------------------------------------------
1801    void gui_load_curve(int arg) {
1802        DIR   *d;
1803        char  *path = CURVE_DIR;
1804
1805        // if exists CURVE_DIR go into
1806        d=opendir(path);
1807        if (d) {
1808            closedir(d);
1809        } else {
1810            path="A";
1811        }
1812
1813        gui_fselect_init(LANG_STR_SELECT_CURVE_FILE, path, gui_load_curve_selected);
1814    }
1815
1816#endif
1817//-------------------------------------------------------------------
1818enum Gui_Mode gui_get_mode() {
1819    return gui_mode;
1820}
1821
1822//-------------------------------------------------------------------
1823void gui_set_mode(enum Gui_Mode mode) {
1824    gui_mode = mode;
1825}
1826
1827//-------------------------------------------------------------------
1828void gui_force_restore() {
1829    gui_restore = gui_in_redraw;
1830}
1831
1832static void gui_handle_splash(void) {
1833    static char *logo = NULL;
1834    static int logo_size;
1835    if (gui_splash) {
1836        static int need_logo=1; // don't use logo ptr, since we don't want to keep re-trying
1837        if(need_logo) {
1838            const char *logo_name="A/CHDK/DATA/logo_de.dat";
1839            FILE *fd;
1840            struct stat st;
1841            need_logo=0;
1842            if (stat(logo_name,&st) == 0) {
1843                logo_size=st.st_size;
1844                logo=malloc(logo_size);
1845                if(logo) {
1846                    fd = fopen(logo_name, "rb");
1847                    if(fd){
1848                        fread(logo,1,logo_size,fd);
1849                        fclose(fd);
1850                    }
1851                    else {
1852                        free(logo);
1853                        logo=NULL;
1854                        need_logo=1;
1855                    }
1856                }
1857            }
1858        }
1859        if (gui_splash>(SPLASH_TIME-4)) {
1860            gui_draw_splash(logo,logo_size);
1861           //   conf.show_osd = 0;
1862        } else if (gui_splash==1 && (mode_get()&MODE_MASK) == gui_splash_mode && (gui_mode==GUI_MODE_NONE || gui_mode==GUI_MODE_ALT)) {
1863            draw_restore();
1864           // conf.show_osd = 1; //had to uncomment in order to fix a bug with disappearing osd...
1865        }
1866        --gui_splash;
1867        if(!gui_splash) {
1868            free(logo);
1869            logo=NULL;
1870            need_logo=1;
1871        }
1872    }
1873}
1874
1875//-------------------------------------------------------------------
1876void gui_redraw()
1877{
1878    enum Gui_Mode gui_mode_old;
1879    static int show_md_grid=0;
1880
1881    gui_handle_splash();
1882
1883    gui_in_redraw = 1;
1884    gui_mode_old = gui_mode;
1885   
1886#if CAM_USES_ASPECT_CORRECTION //nandoide sept-2009
1887    //the different modes arises because games are designed on a 360x240 basis and are difficult to downscale to 320x240
1888    if (gui_mode == GUI_MODE_REVERSI || gui_mode == GUI_MODE_SOKOBAN || gui_mode == GUI_MODE_4WINS || gui_mode == GUI_MODE_MASTERMIND ||gui_mode == GUI_MODE_TETRIS) {
1889        draw_set_environment(aspect_xcorrection_games_360, aspect_ycorrection_games_360, GAMES_SCREEN_WIDTH, GAMES_SCREEN_HEIGHT);
1890    } else { //default
1891        //draw_set_environment(NULL, NULL, SCREENX, SCREENY);
1892        draw_set_environment(NULL, NULL, vid_get_bitmap_screen_width(), vid_get_bitmap_screen_height());
1893    }
1894#endif   
1895    switch (gui_mode) {
1896        case GUI_MODE_MENU:
1897            gui_menu_draw();
1898            //draw_txt_string(20, 14, "<CNF>", MAKE_COLOR(COLOR_ALT_BG, COLOR_FG));
1899            break;
1900        case GUI_MODE_ALT:
1901            gui_draw_osd();
1902#ifdef OPT_SCRIPTING
1903            draw_txt_string(20, 14, "<ALT>", MAKE_COLOR(COLOR_ALT_BG, COLOR_FG));
1904            if ((mode_get()&MODE_MASK) == MODE_REC) {
1905                draw_txt_string(0, 14, script_title, MAKE_COLOR(COLOR_ALT_BG, COLOR_FG));
1906                if (state_kbd_script_run) show_md_grid=5;
1907                if (show_md_grid) {
1908                    --show_md_grid;
1909                    md_draw_grid();
1910                }
1911            }
1912#endif
1913            console_draw();
1914            break;
1915        case GUI_MODE_NONE:
1916            gui_draw_osd();
1917            break;
1918        case GUI_MODE_PALETTE:
1919            gui_palette_draw();
1920            break;
1921        case GUI_MODE_MBOX:
1922            gui_mbox_draw();
1923            break;
1924#ifdef OPT_GAME_REVERSI
1925        case GUI_MODE_REVERSI:
1926            gui_reversi_draw();
1927            break;
1928#endif
1929#ifdef OPT_GAME_SOKOBAN
1930        case GUI_MODE_SOKOBAN:
1931            gui_sokoban_draw();
1932            break;
1933#endif
1934#ifdef OPT_GAME_CONNECT4
1935        case GUI_MODE_4WINS:
1936            gui_4wins_draw();
1937            break;
1938#endif
1939#ifdef OPT_GAME_MASTERMIND
1940        case GUI_MODE_MASTERMIND:
1941            gui_mastermind_draw();
1942            break;
1943#endif
1944#ifdef OPT_GAME_TETRIS
1945        case GUI_MODE_TETRIS:
1946            gui_tetris_draw();
1947            break;
1948#endif
1949#ifdef OPT_DEBUGGING
1950        case GUI_MODE_DEBUG:
1951            gui_debug_draw();
1952            break;
1953#endif
1954        case GUI_MODE_FSELECT:
1955            gui_fselect_draw();
1956            break;
1957#ifdef OPT_TEXTREADER
1958        case GUI_MODE_READ:
1959            gui_read_draw();
1960            break;
1961#endif
1962        case GUI_MODE_OSD:
1963            gui_osd_draw();
1964            //draw_txt_string(20, 14, "<OSD>", MAKE_COLOR(COLOR_ALT_BG, COLOR_FG));
1965            break;
1966#ifdef OPT_CALENDAR
1967        case GUI_MODE_CALENDAR:
1968            gui_calendar_draw();
1969            break;
1970#endif
1971#ifdef OPT_DEBUGGING
1972        case GUI_MODE_BENCH:
1973            gui_bench_draw();
1974            break;
1975#endif
1976        case GUI_MODE_MPOPUP:
1977            gui_mpopup_draw();
1978            break;
1979        default:
1980            break;
1981    }
1982
1983    gui_in_redraw = 0;
1984    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) {
1985        gui_restore = 0;
1986#if defined (OPT_GAME_REVERSI) || (OPT_GAME_SOKOBAN || (OPT_GAME_CONNECT4) || OPT_GAME_MASTERMIND)
1987        if (
1988    #ifdef OPT_GAME_REVERSI
1989                   gui_mode != GUI_MODE_REVERSI
1990    #endif
1991    #ifdef OPT_GAME_SOKOBAN
1992                && gui_mode != GUI_MODE_SOKOBAN
1993    #endif
1994    #ifdef OPT_GAME_CONNECT4
1995                && gui_mode != GUI_MODE_4WINS
1996    #endif
1997    #ifdef OPT_GAME_MASTERMIND
1998                && gui_mode != GUI_MODE_MASTERMIND
1999    #endif
2000    #ifdef OPT_GAME_TETRIS
2001                && gui_mode != GUI_MODE_TETRIS
2002    #endif
2003        )
2004        draw_restore();
2005#endif
2006    }
2007}
2008
2009#ifdef OPTIONS_AUTOSAVE
2010    //-------------------------------------------------------------------
2011    static inline void conf_store_old_settings() {
2012        old_conf=conf;
2013    }
2014
2015    //-------------------------------------------------------------------
2016    static inline int conf_save_new_settings_if_changed() {
2017        if (memcmp(&old_conf, &conf, sizeof(Conf)) != 0) {
2018            user_menu_save();
2019            conf_save();
2020            conf_store_old_settings();
2021            return 1;
2022        }
2023        return 0;
2024    }
2025#endif
2026
2027//-------------------------------------------------------------------
2028void gui_kbd_process()
2029{
2030    int clicked_key;
2031
2032    if (kbd_is_key_clicked(KEY_MENU)){
2033        switch (gui_mode) {
2034            case GUI_MODE_ALT:
2035                if (conf.user_menu_as_root && (conf.user_menu_enable != 0)) {
2036                    if (kbd_is_key_pressed(KEY_SHOOT_HALF))
2037                        gui_menu_init(&root_menu);
2038                    else
2039                        gui_menu_init(&user_submenu);
2040                }
2041                else {
2042                    if ((conf.user_menu_enable != 0) && kbd_is_key_pressed(KEY_SHOOT_HALF))
2043                        gui_menu_init(&user_submenu);
2044                    else
2045                        gui_menu_init(&root_menu);
2046                }
2047                gui_mode = GUI_MODE_MENU;
2048                draw_restore();
2049                break;
2050            case GUI_MODE_MENU:
2051#ifdef OPTIONS_AUTOSAVE
2052                conf_save_new_settings_if_changed();
2053#endif
2054                if (gui_user_menu_flag) {
2055                    gui_mode = GUI_MODE_MENU;
2056                    gui_user_menu_flag = 0;
2057                    gui_menu_init(&root_menu);
2058                }
2059                else
2060                gui_mode = GUI_MODE_ALT;
2061                draw_restore();
2062                break;
2063            case GUI_MODE_PALETTE:
2064#ifdef OPT_GAME_REVERSI
2065            case GUI_MODE_REVERSI:
2066#endif
2067#ifdef OPT_GAME_SOKOBAN
2068            case GUI_MODE_SOKOBAN:
2069#endif
2070#ifdef OPT_GAME_CONNECT4
2071            case GUI_MODE_4WINS:
2072#endif
2073#ifdef OPT_GAME_MASTERMIND
2074            case GUI_MODE_MASTERMIND:
2075#endif
2076#ifdef OPT_GAME_TETRIS
2077            case GUI_MODE_TETRIS:
2078#endif
2079#ifdef OPT_DEBUGGING
2080            case GUI_MODE_DEBUG:
2081#endif
2082            case GUI_MODE_OSD:
2083#ifdef OPT_CALENDAR
2084            case GUI_MODE_CALENDAR:
2085#endif
2086            case GUI_MODE_BENCH:
2087                draw_restore();
2088                gui_mode = GUI_MODE_MENU;
2089                break;
2090            case GUI_MODE_FSELECT:
2091                gui_fselect_kbd_process();
2092                break;
2093#ifdef OPT_TEXTREADER
2094            case GUI_MODE_READ:
2095                gui_read_kbd_process();
2096                draw_restore();
2097                gui_mode = GUI_MODE_MENU;
2098                break;
2099#endif
2100            default:
2101                break;
2102        }
2103        return;
2104    }
2105
2106    switch (gui_mode) {
2107        case GUI_MODE_ALT:
2108            if (kbd_is_key_clicked(SHORTCUT_TOGGLE_RAW)) {
2109                if (conf.debug_shortcut_action > 0) {
2110#ifdef OPT_DEBUGGING
2111                    gui_debug_shortcut();
2112#endif
2113}
2114#if !CAM_HAS_ERASE_BUTTON && CAM_CAN_SD_OVERRIDE
2115                if (!shooting_get_common_focus_mode())
2116#else               
2117                else
2118#endif
2119                    {conf.save_raw = !conf.save_raw;
2120                    draw_restore();
2121                   }
2122#if !CAM_HAS_ERASE_BUTTON && CAM_CAN_SD_OVERRIDE
2123                else {
2124    #if CAM_HAS_ZOOM_LEVER
2125                conf.subj_dist_override_value=MAX_DIST;
2126                shooting_set_focus(shooting_get_subject_distance_override_value(), SET_NOW);
2127    #else
2128                if (conf.subj_dist_override_koef==4)
2129                    gui_subj_dist_override_koef_enum(-3,0);
2130                else
2131                    gui_subj_dist_override_koef_enum(1,0);
2132    #endif
2133                }
2134#endif
2135#ifdef OPT_SCRIPTING
2136            } else if (kbd_is_key_clicked(KEY_SET)) {
2137                gui_menu_init(&script_submenu);
2138                gui_mode = GUI_MODE_MENU;
2139                draw_restore();
2140#endif
2141                } else {
2142#if !CAM_HAS_MANUAL_FOCUS && CAM_CAN_SD_OVERRIDE
2143                if (kbd_is_key_clicked(SHORTCUT_MF_TOGGLE)) {
2144                    if (conf.subj_dist_override_koef>0) {
2145                    UnlockAF();
2146                    conf.subj_dist_override_koef=0;
2147                } else {
2148                    DoAFLock();
2149                    conf.subj_dist_override_koef=1;
2150                }
2151                    draw_restore();
2152                }
2153                else if (shooting_get_common_focus_mode())
2154#elif CAM_CAN_SD_OVERRIDE
2155                if (shooting_get_common_focus_mode())
2156#endif
2157
2158#if CAM_CAN_SD_OVERRIDE           
2159                {
2160    #if CAM_HAS_ZOOM_LEVER
2161                if (kbd_is_key_clicked(KEY_RIGHT)) {
2162                    gui_subj_dist_override_koef_enum(1,0);
2163        #if !CAM_HAS_MANUAL_FOCUS
2164                    if (conf.subj_dist_override_koef==0) conf.subj_dist_override_koef=1;
2165        #endif
2166                    shooting_set_focus(shooting_get_subject_distance_override_value(), SET_NOW);
2167                }
2168                else if (kbd_is_key_clicked(KEY_LEFT))
2169                    {
2170                    gui_subj_dist_override_koef_enum(-1,0);
2171        #if !CAM_HAS_MANUAL_FOCUS
2172                    if (conf.subj_dist_override_koef==0) conf.subj_dist_override_koef=1;
2173        #endif
2174                    shooting_set_focus(shooting_get_subject_distance_override_value(), SET_NOW);
2175                    }
2176                else if (kbd_is_key_clicked(SHORTCUT_SET_INFINITY))
2177                    {
2178                    conf.subj_dist_override_value=MAX_DIST;     
2179                    shooting_set_focus(shooting_get_subject_distance_override_value(), SET_NOW);
2180                    }
2181                else
2182    #endif
2183                if (kbd_is_key_clicked(SHORTCUT_SET_HYPERFOCAL))
2184                    {
2185                    int m=mode_get()&MODE_SHOOTING_MASK;
2186                    if ((m==MODE_M) || (m==MODE_AV))
2187                        conf.subj_dist_override_value=(int)shooting_get_hyperfocal_distance_1e3_f(shooting_get_aperture_from_av96(shooting_get_user_av96()),get_focal_length(lens_get_zoom_point()))/1000;
2188                else conf.subj_dist_override_value=(int)shooting_get_hyperfocal_distance();             
2189                    shooting_set_focus(shooting_get_subject_distance_override_value(), SET_NOW);
2190                    }   
2191                else 
2192                    switch (kbd_get_autoclicked_key()) {
2193    #if CAM_HAS_ZOOM_LEVER
2194                    case KEY_ZOOM_IN:
2195    #else
2196                    case KEY_RIGHT:
2197    #endif
2198                        gui_subj_dist_override_value_enum(1,0);
2199                        shooting_set_focus(shooting_get_subject_distance_override_value(),SET_NOW);
2200                        break;
2201    #if CAM_HAS_ZOOM_LEVER
2202                    case KEY_ZOOM_OUT:
2203    #else
2204                    case KEY_LEFT:
2205    #endif
2206                        gui_subj_dist_override_value_enum(-1,0);
2207                        shooting_set_focus(shooting_get_subject_distance_override_value(), SET_NOW);
2208                        break;
2209                }
2210              }
2211#endif
2212            }
2213            break;
2214        case GUI_MODE_MENU:
2215            gui_menu_kbd_process();
2216            break;
2217        case GUI_MODE_PALETTE:
2218            gui_palette_kbd_process();
2219            break;
2220        case GUI_MODE_MBOX:
2221            gui_mbox_kbd_process();
2222            break;
2223#ifdef OPT_GAME_REVERSI
2224        case GUI_MODE_REVERSI:
2225            gui_reversi_kbd_process();
2226            break;
2227#endif
2228#ifdef OPT_GAME_SOKOBAN
2229        case GUI_MODE_SOKOBAN:
2230            gui_sokoban_kbd_process();
2231            break;
2232#endif
2233#ifdef OPT_GAME_CONNECT4
2234        case GUI_MODE_4WINS:
2235            gui_4wins_kbd_process();
2236            break;
2237#endif
2238#ifdef OPT_GAME_MASTERMIND
2239        case GUI_MODE_MASTERMIND:
2240            gui_mastermind_kbd_process();
2241            break;
2242#ifdef OPT_GAME_TETRIS
2243        case GUI_MODE_TETRIS:
2244            gui_tetris_kbd_process();
2245            break;
2246#endif
2247#endif
2248#ifdef OPT_DEBUGGING
2249        case GUI_MODE_DEBUG:
2250            gui_debug_kbd_process();
2251            break;
2252#endif
2253        case GUI_MODE_FSELECT:
2254            gui_fselect_kbd_process();
2255            break;
2256#ifdef OPT_TEXTREADER
2257        case GUI_MODE_READ:
2258            gui_read_kbd_process();
2259            break;
2260#endif
2261        case GUI_MODE_OSD:
2262            gui_osd_kbd_process();
2263            break;
2264#ifdef OPT_CALENDAR
2265        case GUI_MODE_CALENDAR:
2266            gui_calendar_kbd_process();
2267            break;
2268#endif
2269#ifdef OPT_DEBUGGING
2270        case GUI_MODE_BENCH:
2271            gui_bench_kbd_process();
2272            break;
2273#endif
2274        case GUI_MODE_MPOPUP:
2275            gui_mpopup_kbd_process();
2276            break;
2277        default:
2278            break;
2279    }
2280}
2281
2282//-------------------------------------------------------------------
2283void gui_kbd_enter()
2284{
2285    // XXX set custom palette
2286#ifdef OPTIONS_AUTOSAVE
2287    conf_store_old_settings();
2288#endif
2289    gui_mode = GUI_MODE_ALT;
2290   
2291    conf_update_prevent_shutdown();
2292   
2293    vid_turn_off_updates();
2294
2295    gui_user_menu_flag = 0;
2296    if (conf.user_menu_enable == 2) {
2297        gui_menu_init(&user_submenu);
2298        gui_mode = GUI_MODE_MENU;
2299        draw_restore();
2300        gui_user_menu_flag = 1;
2301    }
2302
2303}
2304
2305//-------------------------------------------------------------------
2306void gui_kbd_leave()
2307{
2308    // XXX restore palette
2309#ifdef OPTIONS_AUTOSAVE
2310    conf_save_new_settings_if_changed();
2311#endif
2312#ifdef OPT_UBASIC
2313    ubasic_error = UBASIC_E_NONE;
2314#endif
2315    draw_restore();
2316    if (gui_mode == GUI_MODE_READ && !rbf_load(conf.menu_rbf_file))
2317        rbf_load_from_8x16(current_font);
2318    rbf_set_codepage(FONT_CP_WIN);
2319    vid_turn_on_updates();
2320    gui_mode = GUI_MODE_NONE;
2321   
2322    conf_update_prevent_shutdown();
2323}
2324
2325//-------------------------------------------------------------------
2326void other_kbd_process(){
2327    int key;
2328#if CAM_AF_SCAN_DURING_VIDEO_RECORD
2329   
2330    if (movie_status==VIDEO_RECORD_IN_PROGRESS) {
2331        if (kbd_is_key_clicked(conf.video_af_key)) MakeAFScan();
2332    }
2333 
2334#endif
2335
2336#if CAM_CAN_UNLOCK_OPTICAL_ZOOM_IN_VIDEO
2337    // return from digital to optical zoom in video
2338    #if CAM_HAS_ZOOM_LEVER
2339        key=KEY_ZOOM_OUT;
2340    #else
2341        key=KEY_DOWN;
2342    #endif
2343        if (conf.unlock_optical_zoom_for_video && (movie_status==VIDEO_RECORD_IN_PROGRESS) &&  kbd_is_key_clicked(key)){
2344            short x;
2345            get_property_case(PROPCASE_DIGITAL_ZOOM_STATE, &x, sizeof(x));
2346            if (x) {
2347                get_property_case(PROPCASE_DIGITAL_ZOOM_POSITION, &x, sizeof(x));
2348    #if defined (CAMERA_s90)
2349        if (x==0) zoom_status=ZOOM_OPTICAL_MAX; //ERR99: No zoom back from digital to optical zoom possible if set to medium
2350    #elif defined (CAMERA_sx30) || defined (CAMERA_g12)         // can't find, crashes camera *******
2351    #else
2352        if (x==0) zoom_status=ZOOM_OPTICAL_MEDIUM;
2353    #endif
2354
2355            }
2356        }
2357#endif
2358
2359#if CAM_EV_IN_VIDEO
2360    if ((movie_status==VIDEO_RECORD_IN_PROGRESS) && !kbd_is_key_pressed(KEY_SHOOT_HALF)){
2361    #if CAM_HAS_ERASE_BUTTON
2362        if (kbd_is_key_clicked(KEY_ERASE)){
2363    #else
2364        #if !defined (CAMERA_a480) && !defined (CAMERA_a495)
2365            if (kbd_is_key_clicked(KEY_DISPLAY)){
2366        #else
2367            if (kbd_is_key_clicked(KEY_MENU)){
2368        #endif 
2369    #endif
2370    set_ev_video_avail(!get_ev_video_avail());
2371            }
2372    if (get_ev_video_avail()) {
2373        if (kbd_is_key_clicked(KEY_LEFT)){
2374        set_ev_video(get_ev_video()-1);
2375        }
2376        if (kbd_is_key_clicked(KEY_RIGHT)){
2377        set_ev_video(get_ev_video()+1);
2378        }
2379    }
2380        }
2381#endif
2382    }
2383
2384void gui_draw_debug_vals_osd() {
2385#ifdef OPT_DEBUGGING
2386    if (conf.debug_misc_vals_show) {
2387        //        long v=get_file_counter();
2388        //      sprintf(buf, "1:%03d-%04d  ", (v>>18)&0x3FF, (v>>4)&0x3FFF);
2389        //      sprintf(buf, "1:%d, %08X  ", xxxx, eeee);
2390        /*
2391        extern long physw_status[3];
2392        sprintf(buf, "1:%8x  ", physw_status[0]);
2393        draw_txt_string(28, 10, buf, conf.osd_color);
2394
2395        sprintf(buf, "2:%8x  ", physw_status[1]);
2396        draw_txt_string(28, 11, buf, conf.osd_color);
2397
2398        sprintf(buf, "3:%8x  ", physw_status[2]);
2399        draw_txt_string(28, 12, buf, conf.osd_color);
2400
2401        //      sprintf(buf, "4:%8x  ", vid_get_viewport_fb_d());
2402        */
2403        sprintf(buf, "u:%8x  ", get_usb_power(1));
2404        draw_txt_string(28,  9, buf, conf.osd_color);
2405
2406        sprintf(buf, "1:%8x  ", (void*) (*(int*)conf.mem_view_addr_init));
2407        draw_txt_string(28, 10, buf, conf.osd_color);
2408
2409    extern volatile long focus_busy;
2410        sprintf(buf, "f:%8x  ", focus_busy);
2411        draw_txt_string(28, 11, buf, conf.osd_color);
2412
2413    extern volatile long zoom_busy;
2414        sprintf(buf, "z:%8x  ", zoom_busy);
2415        draw_txt_string(28, 12, buf, conf.osd_color);
2416
2417        // some cameras missing zoom_status
2418        #if 0
2419        sprintf(buf, "t:%8x  ", zoom_status);
2420        draw_txt_string(28, 13, buf, conf.osd_color);
2421        #endif
2422
2423    }
2424    {
2425        int r,i, p, len;
2426        if (conf.debug_display == DEBUG_DISPLAY_PROPS){
2427
2428            for (i=0;i<10;i++){
2429                r = 0;
2430                p = conf.debug_propcase_page*10+i;
2431                get_property_case(p, &r, 4);
2432                sprintf(buf, "%3d: %d              ", p, r);
2433                buf[20]=0;
2434                draw_string(64,16+16*i,buf, conf.osd_color);
2435            }
2436        }
2437
2438        if (conf.debug_display == DEBUG_DISPLAY_PARAMS){
2439            extern long* FlashParamsTable[];
2440            char s[30];
2441            int count;
2442
2443            for (i=0;i<10;i++){
2444                r = 0;
2445                p = conf.debug_propcase_page*10+i;
2446                if (p>=get_flash_params_count()) {
2447                    sprintf(buf, "%3d: This parameter does not exists", p);
2448                } else  {
2449                    len=FlashParamsTable[p][1]>>16;
2450                    if ((len==1)||(len==2)||(len==4)){
2451                        get_parameter_data(p, &r, len);
2452                        sprintf(buf, "%3d: %30d :%2d ", p, r,len);
2453                    }
2454                    else {
2455                        if (len>=sizeof(s)) count=sizeof(s)-1; else count=len;
2456                        get_parameter_data(p, &s, count);
2457                        s[count]=0;
2458                        sprintf(buf, "%3d: %30s :%2d ", p, s,len);
2459                    }
2460                }
2461                draw_string(16,16+16*i,buf, conf.osd_color);
2462            }
2463        }
2464    }
2465
2466    if(conf.debug_display == DEBUG_DISPLAY_TASKS) {
2467            gui_debug_draw_tasklist();
2468    }
2469#endif
2470}
2471//-------------------------------------------------------------------
2472void gui_draw_osd() {
2473    unsigned int m, mode_photo, mode_video;
2474#if CAM_SWIVEL_SCREEN
2475    static int flashlight = 0;
2476#endif
2477    static int pressed = 0;
2478    static int half_disp_press_old=0;
2479    int half_disp_press;
2480    int need_restore = 0;
2481    m = mode_get();
2482
2483// uncomment if you want debug values always on top
2484// gui_draw_debug_vals_osd();
2485
2486#if CAM_SWIVEL_SCREEN
2487    if (conf.flashlight && (m&MODE_SCREEN_OPENED) && (m&MODE_SCREEN_ROTATED) && (gui_mode==GUI_MODE_NONE /* || gui_mode==GUI_MODE_ALT */)) {
2488        draw_filled_rect(0, 0, screen_width-1, screen_height-1, MAKE_COLOR(COLOR_WHITE, COLOR_WHITE));
2489        flashlight = 1;
2490    }
2491    if (flashlight) {
2492        if ((!((m&MODE_SCREEN_OPENED) && (m&MODE_SCREEN_ROTATED))) || (gui_mode!=GUI_MODE_NONE /* && gui_mode!=GUI_MODE_ALT */)) {
2493            flashlight = 0;
2494            need_restore = 1;
2495        } else {
2496            return;
2497        }
2498    }
2499#endif
2500   
2501    if (kbd_is_key_pressed(KEY_SHOOT_HALF)) {
2502        if (kbd_is_key_pressed(SHORTCUT_TOGGLE_ZEBRA)) {
2503            if (!pressed) {
2504                conf.zebra_draw = !conf.zebra_draw;
2505                if (!conf.zebra_draw) {
2506                    need_restore = 1;
2507                }
2508                pressed = 1;
2509            }
2510        } else if (kbd_is_key_pressed(SHORTCUT_TOGGLE_HISTO)) {
2511            if (!pressed) {
2512                if (++conf.show_histo>SHOW_HALF) conf.show_histo=0;
2513                if (!conf.show_histo) {
2514                    need_restore = 1;
2515                }
2516                pressed = 1;
2517            }
2518        } else if (kbd_is_key_pressed(SHORTCUT_TOGGLE_OSD)) {
2519            if (!pressed) {
2520                conf.show_osd = !conf.show_osd;
2521                if (!conf.show_osd) {
2522                    need_restore = 1;
2523                }
2524                pressed = 1;
2525            }
2526        } else if (kbd_is_key_pressed(SHORTCUT_DISABLE_OVERRIDES)) {
2527             if (!pressed) {
2528                 if (conf.override_disable < 2) conf.override_disable = !conf.override_disable;
2529                 if (!conf.show_osd) {
2530                    need_restore = 1;
2531                 }
2532                 pressed = 1;
2533             }
2534        }
2535#if !CAM_HAS_MANUAL_FOCUS && CAM_HAS_ZOOM_LEVER && CAM_CAN_SD_OVERRIDE
2536        // Todo, check for AF and if its running, don't override
2537                else if (kbd_is_key_pressed(SHORTCUT_SD_SUB)) {
2538            if (!pressed) {
2539                            if (!(conf.override_disable==1) && shooting_can_focus() && shooting_get_common_focus_mode()) {
2540                                gui_subj_dist_override_value_enum(-1,0);
2541                                shooting_set_focus(shooting_get_subject_distance_override_value(),SET_NOW);
2542                //pressed = 1;
2543                            }
2544            }
2545        } else if (kbd_is_key_pressed(SHORTCUT_SD_ADD)) {
2546            if (!pressed) {
2547                            if (!(conf.override_disable==1) && shooting_can_focus() && shooting_get_common_focus_mode()) {
2548                                gui_subj_dist_override_value_enum(1,0);
2549                                shooting_set_focus(shooting_get_subject_distance_override_value(),SET_NOW);
2550                //pressed = 1;
2551                            }
2552            }
2553        }
2554#endif
2555                else {
2556            pressed = 0;
2557        }
2558    } else {
2559        pressed = 0;
2560    }
2561   
2562    // TODO some of the ifs below should probably use this
2563    mode_video = MODE_IS_VIDEO(m);
2564
2565    mode_photo = (m&MODE_MASK) == MODE_PLAY ||
2566                !( mode_video ||
2567                (m&MODE_SHOOTING_MASK)==MODE_STITCH);
2568
2569    half_disp_press=mode_photo && kbd_is_key_pressed(KEY_SHOOT_HALF) && kbd_is_key_pressed(KEY_DISPLAY);
2570    if (half_disp_press && ! half_disp_press_old)
2571        need_restore = 1;
2572    half_disp_press_old=half_disp_press;
2573
2574    if (need_restore)
2575        draw_restore();
2576
2577    if (half_disp_press)
2578        return;
2579
2580    if (gui_osd_draw_zebra(conf.zebra_draw && gui_mode==GUI_MODE_NONE &&
2581                            kbd_is_key_pressed(KEY_SHOOT_HALF) && mode_photo &&
2582                            !state_kbd_script_run)) {// no zebra when script running, to save mem
2583        return; // if zebra drawn, we're done
2584    }
2585#if !CAM_SHOW_OSD_IN_SHOOT_MENU
2586      if (!(conf.show_osd && (canon_menu_active==(int)&canon_menu_active-4) && (canon_shoot_menu_active==0)))  return;   
2587#else
2588      if (!(conf.show_osd && (canon_menu_active==(int)&canon_menu_active-4) /*&& (canon_shoot_menu_active==0)*/ ))  return;
2589#endif 
2590
2591   
2592    if ((gui_mode==GUI_MODE_NONE || gui_mode==GUI_MODE_ALT) && (
2593     (kbd_is_key_pressed(KEY_SHOOT_HALF) && ((conf.show_histo==SHOW_HALF)/* || (m&MODE_MASK) == MODE_PLAY*/)) ||
2594     ((conf.show_histo==SHOW_ALWAYS)  &&  /* !((m&MODE_MASK) == MODE_PLAY) && */ (recreview_hold==0))
2595    ) &&
2596    (mode_photo || (m&MODE_SHOOTING_MASK)==MODE_STITCH)) {
2597        gui_osd_draw_histo();
2598    }
2599
2600    if ((m&MODE_MASK) == MODE_REC && (recreview_hold==0 || conf.show_osd_in_review) ) {
2601        if (conf.show_grid_lines) {
2602            gui_grid_draw_osd(1);
2603        }
2604        if ((gui_mode==GUI_MODE_NONE || gui_mode==GUI_MODE_ALT) && (((kbd_is_key_pressed(KEY_SHOOT_HALF) || (state_kbd_script_run) || (shooting_get_common_focus_mode())) && (mode_photo || (m&MODE_SHOOTING_MASK)==MODE_STITCH )) || ((mode_video || movie_status > 1) && conf.show_values_in_video) )) {
2605 
2606           if (conf.show_dof!=DOF_DONT_SHOW) gui_osd_calc_dof();
2607           
2608           if ((conf.show_dof==DOF_SHOW_IN_DOF) || (conf.show_dof==DOF_SHOW_IN_DOF_EX)) gui_osd_draw_dof(); 
2609           
2610           if (conf.values_show_real_iso || conf.values_show_market_iso || conf.values_show_ev_seted || conf.values_show_ev_measured || conf.values_show_bv_measured || conf.values_show_bv_seted || conf.values_show_overexposure || conf.values_show_canon_overexposure || conf.values_show_luminance) gui_osd_calc_expo_param();                       
2611        }
2612        if (conf.show_state) gui_osd_draw_state();
2613        if (conf.save_raw && conf.show_raw_state && !mode_video && (!kbd_is_key_pressed(KEY_SHOOT_HALF))) gui_osd_draw_raw_info();
2614       
2615        if ((conf.show_values==SHOW_ALWAYS && mode_photo) || ((mode_video || movie_status > 1)&& conf.show_values_in_video) || ((kbd_is_key_pressed(KEY_SHOOT_HALF) || (recreview_hold==1)) && (conf.show_values==SHOW_HALF)))
2616            gui_osd_draw_values(1);
2617        else if  (shooting_get_common_focus_mode() && mode_photo && conf.show_values && !((conf.show_dof==DOF_SHOW_IN_DOF) || (conf.show_dof==DOF_SHOW_IN_DOF_EX)))   
2618           gui_osd_draw_values(2);
2619        else if  (conf.show_values==SHOW_HALF)
2620            gui_osd_draw_values(0);   
2621    }
2622
2623
2624    if ((recreview_hold==0) &&  (!kbd_is_key_pressed(KEY_SHOOT_HALF) &&  (  ((m&MODE_MASK) == MODE_REC) || (!((m&MODE_MASK) == MODE_REC) &&  !((conf.hide_osd == 1) || (conf.hide_osd == 3)) )) && !(((conf.hide_osd == 2) || (conf.hide_osd == 3))&& (shooting_get_prop(PROPCASE_DISPLAY_MODE) == 1))))   {
2625        gui_batt_draw_osd();
2626        gui_space_draw_osd();
2627        gui_usb_draw_osd();
2628        if (conf.fast_ev && !mode_video && (m&MODE_MASK) == MODE_REC ) gui_osd_draw_ev();
2629    }
2630   
2631    if ((conf.show_clock) && (recreview_hold==0) &&  ((!kbd_is_key_pressed(KEY_SHOOT_HALF) &&  (  ((m&MODE_MASK) == MODE_REC) || (!((m&MODE_MASK) == MODE_REC) &&  !((conf.hide_osd == 1) || (conf.hide_osd == 3)) )) && !(((conf.hide_osd == 2) || (conf.hide_osd == 3))&& (shooting_get_prop(PROPCASE_DISPLAY_MODE) == 1)))|| (conf.clock_halfpress==0) )) {
2632        gui_osd_draw_clock(0,0,0);
2633    }
2634    else if ((conf.show_clock) && (recreview_hold==0) &&  kbd_is_key_pressed(KEY_SHOOT_HALF) && conf.clock_halfpress==1) {
2635        gui_osd_draw_seconds();
2636    }
2637 
2638    if ((conf.show_temp>0) && (recreview_hold==0) &&  ((!kbd_is_key_pressed(KEY_SHOOT_HALF) &&  (  ((m&MODE_MASK) == MODE_REC) || (!((m&MODE_MASK) == MODE_REC) &&  !((conf.hide_osd == 1) || (conf.hide_osd == 3)) )) && !(((conf.hide_osd == 2) || (conf.hide_osd == 3))&& (shooting_get_prop(PROPCASE_DISPLAY_MODE) == 1)) )|| (conf.clock_halfpress==0) )) {
2639        gui_osd_draw_temp();
2640    }
2641    if (conf.show_movie_time > 0 && (mode_video || movie_status > 1)) {
2642        gui_osd_draw_movie_time_left();
2643    }
2644 
2645#if CAM_DRAW_EXPOSITION
2646    if (gui_mode==GUI_MODE_NONE && kbd_is_key_pressed(KEY_SHOOT_HALF) && ((m&MODE_MASK)==MODE_REC) && ((m&MODE_SHOOTING_MASK))!=MODE_VIDEO_STD && (m&MODE_SHOOTING_MASK)!=MODE_VIDEO_COMPACT) {
2647     strcpy(buf,shooting_get_tv_str());
2648     strcat(buf,"\"  F");
2649     strcat(buf,shooting_get_av_str());
2650     draw_txt_string(22-strlen(buf)/2, 14, buf, conf.osd_color);
2651    }
2652#endif
2653
2654#if CAM_EV_IN_VIDEO
2655    if (movie_status==VIDEO_RECORD_IN_PROGRESS) gui_osd_draw_ev_video(get_ev_video_avail());
2656#endif
2657
2658    gui_draw_debug_vals_osd();
2659
2660#ifdef OPT_UBASIC
2661    if (ubasic_error){
2662    const char *msg;
2663        if (ubasic_error >= UBASIC_E_ENDMARK) {
2664            msg = ubasic_errstrings[UBASIC_E_UNKNOWN_ERROR];
2665        } else {
2666        msg = ubasic_errstrings[ubasic_error];
2667    }
2668    sprintf(buf, "uBASIC:%d %s ", ubasic_linenumber(), msg);
2669    draw_txt_string(0, 0, buf, MAKE_COLOR(COLOR_RED, COLOR_YELLOW));
2670    }
2671#endif
2672}
2673
2674#ifndef OPTIONS_AUTOSAVE
2675//-------------------------------------------------------------------
2676void gui_menuproc_save(int arg)
2677{
2678    conf_save();
2679}
2680#endif
2681
2682//-------------------------------------------------------------------
2683static void gui_menuproc_reset_selected(unsigned int btn) {
2684    if (btn==MBOX_BTN_YES)
2685        conf_load_defaults();
2686}
2687
2688void gui_menuproc_reset(int arg)
2689{
2690    gui_mbox_init(LANG_MSG_RESET_OPTIONS_TITLE,
2691                  LANG_MSG_RESET_OPTIONS_TEXT,
2692                  MBOX_FUNC_RESTORE|MBOX_TEXT_CENTER|MBOX_BTN_YES_NO|MBOX_DEF_BTN2, gui_menuproc_reset_selected);
2693}
2694
2695//-------------------------------------------------------------------
2696void gui_draw_palette(int arg) {
2697    draw_restore();
2698    gui_palette_init(PALETTE_MODE_DEFAULT, 0x00, NULL);
2699    gui_mode = GUI_MODE_PALETTE;
2700}
2701
2702//-------------------------------------------------------------------
2703void gui_show_build_info(int arg) {
2704    static char comp[64];
2705
2706#ifdef __GNUC__
2707# ifndef __GNUC_PATCHLEVEL__
2708# define __GNUC_PATCHLEVEL 0
2709# endif
2710    sprintf(comp, "GCC %d.%d.%d", __GNUC__ ,__GNUC_MINOR__,__GNUC_PATCHLEVEL__ );
2711#else
2712    sprintf(comp, "UNKNOWN" );
2713#endif
2714    sprintf(buf, lang_str(LANG_MSG_BUILD_INFO_TEXT), HDK_VERSION, BUILD_NUMBER, BUILD_SVNREV, __DATE__, __TIME__, PLATFORM, PLATFORMSUB, comp);
2715    gui_mbox_init(LANG_MSG_BUILD_INFO_TITLE, (int)buf, MBOX_FUNC_RESTORE|MBOX_TEXT_LEFT, NULL);
2716}
2717
2718//-------------------------------------------------------------------
2719void gui_show_memory_info(int arg) {
2720    sprintf(buf, lang_str(LANG_MSG_MEMORY_INFO_TEXT), core_get_free_memory(), MEMISOSIZE, &_start, &_end);
2721    gui_mbox_init(LANG_MSG_MEMORY_INFO_TITLE, (int)buf, MBOX_FUNC_RESTORE|MBOX_TEXT_CENTER, NULL);
2722}
2723
2724//-------------------------------------------------------------------
2725#ifdef OPT_GAME_REVERSI
2726void gui_draw_reversi(int arg) {
2727    if ((mode_get()&MODE_MASK) != MODE_PLAY) {
2728        gui_mbox_init(LANG_MSG_INFO_TITLE, LANG_MSG_SWITCH_TO_PLAY_MODE,
2729                      MBOX_FUNC_RESTORE|MBOX_TEXT_CENTER, NULL);
2730        return;
2731    }
2732   
2733    #if CAM_USES_ASPECT_CORRECTION //nandoide sept-2009
2734      draw_set_environment(aspect_xcorrection_games_360, aspect_ycorrection_games_360, GAMES_SCREEN_WIDTH, GAMES_SCREEN_HEIGHT);
2735    #endif
2736    gui_mode = GUI_MODE_REVERSI;
2737    gui_reversi_init();
2738}
2739#endif
2740
2741//-------------------------------------------------------------------
2742#ifdef OPT_GAME_SOKOBAN
2743void gui_draw_sokoban(int arg) {
2744    if ((mode_get()&MODE_MASK) != MODE_PLAY) {
2745        gui_mbox_init(LANG_MSG_INFO_TITLE, LANG_MSG_SWITCH_TO_PLAY_MODE,
2746                      MBOX_FUNC_RESTORE|MBOX_TEXT_CENTER, NULL);
2747        return;
2748    }
2749    #if CAM_USES_ASPECT_CORRECTION //nandoide sept-2009
2750      draw_set_environment(aspect_xcorrection_games_360, aspect_ycorrection_games_360, GAMES_SCREEN_WIDTH, GAMES_SCREEN_HEIGHT);
2751    #endif
2752    if ( gui_sokoban_init() )
2753        gui_mode = GUI_MODE_SOKOBAN;
2754}
2755#endif
2756//-------------------------------------------------------------------
2757#ifdef OPT_GAME_CONNECT4
2758void gui_draw_4wins(int arg) {
2759    if ((mode_get()&MODE_MASK) != MODE_PLAY) {
2760        gui_mbox_init(LANG_MSG_INFO_TITLE, LANG_MSG_SWITCH_TO_PLAY_MODE,
2761                      MBOX_FUNC_RESTORE|MBOX_TEXT_CENTER, NULL);
2762        return;
2763    }
2764    #if CAM_USES_ASPECT_CORRECTION //nandoide sept-2009
2765      draw_set_environment(aspect_xcorrection_games_360, aspect_ycorrection_games_360, GAMES_SCREEN_WIDTH, GAMES_SCREEN_HEIGHT);
2766    #endif
2767    if ( gui_4wins_init() )
2768        gui_mode = GUI_MODE_4WINS;
2769}
2770#endif
2771//-------------------------------------------------------------------
2772#ifdef OPT_GAME_MASTERMIND
2773void gui_draw_mastermind(int arg) {
2774    if ((mode_get()&MODE_MASK) != MODE_PLAY) {
2775        gui_mbox_init(LANG_MSG_INFO_TITLE, LANG_MSG_SWITCH_TO_PLAY_MODE,
2776                      MBOX_FUNC_RESTORE|MBOX_TEXT_CENTER, NULL);
2777        return;
2778    }
2779    #if CAM_USES_ASPECT_CORRECTION //nandoide sept-2009
2780     draw_set_environment(aspect_xcorrection_games_360, aspect_ycorrection_games_360, GAMES_SCREEN_WIDTH, GAMES_SCREEN_HEIGHT);
2781    #endif
2782    if ( gui_mastermind_init() )
2783        gui_mode = GUI_MODE_MASTERMIND;
2784}
2785#endif
2786//-------------------------------------------------------------------
2787#ifdef OPT_GAME_TETRIS
2788void gui_draw_tetris(int arg) {
2789    if ((mode_get()&MODE_MASK) != MODE_PLAY) {
2790        gui_mbox_init(LANG_MSG_INFO_TITLE, LANG_MSG_SWITCH_TO_PLAY_MODE,
2791                      MBOX_FUNC_RESTORE|MBOX_TEXT_CENTER, NULL);
2792        return;
2793    }
2794    #if CAM_USES_ASPECT_CORRECTION //nandoide sept-2009
2795        draw_set_environment(aspect_xcorrection_games_360, aspect_ycorrection_games_360, GAMES_SCREEN_WIDTH, GAMES_SCREEN_HEIGHT);
2796    #endif
2797    gui_mode = GUI_MODE_TETRIS;
2798    gui_tetris_init();
2799}
2800#endif
2801//-------------------------------------------------------------------
2802#ifdef OPT_DEBUGGING
2803void gui_draw_debug(int arg) {
2804//    gui_debug_init(0x2510);
2805//    gui_debug_init(0x127E0);
2806//    gui_debug_init(0x7F5B8);
2807//    gui_debug_init(malloc(16));
2808    gui_debug_init((void*)conf.mem_view_addr_init);
2809}
2810#endif
2811//-------------------------------------------------------------------
2812#ifdef OPT_DEBUGGING
2813void gui_draw_bench(int arg) {
2814    gui_mode = GUI_MODE_BENCH;
2815    gui_bench_init();
2816}
2817#endif
2818//-------------------------------------------------------------------
2819
2820#define LOGO_WIDTH  169
2821#define LOGO_HEIGHT 74
2822
2823void gui_draw_splash(char* logo, int logo_size) {
2824    coord w, h, x, y;
2825    static const char *text[] = {
2826        "CHDK Version '" HDK_VERSION " " BUILD_NUMBER "-" BUILD_SVNREV "'" ,
2827        "Build: " __DATE__ " " __TIME__ ,
2828        "Camera: " PLATFORM " - " PLATFORMSUB };
2829    int i, l;
2830    color cl = MAKE_COLOR(COLOR_RED, COLOR_WHITE);
2831
2832    gui_splash_mode = (mode_get()&MODE_MASK);
2833   
2834    h=sizeof(text)/sizeof(text[0])*FONT_HEIGHT+8;
2835    w=0;
2836    for (i=0; i<sizeof(text)/sizeof(text[0]); ++i) {
2837        l=strlen(text[i]);
2838        if (l>w) w=l;
2839    }
2840    w=w*FONT_WIDTH+10;
2841
2842    x = (screen_width-w)>>1; y = ((screen_height-h)>>1) + 20;
2843    draw_filled_round_rect(x, y, x+w, y+h, MAKE_COLOR(COLOR_RED, COLOR_RED));
2844    for (i=0; i<sizeof(text)/sizeof(text[0]); ++i) {
2845        draw_string(x+((w-strlen(text[i])*FONT_WIDTH)>>1), y+i*FONT_HEIGHT+4, text[i], cl);
2846    }
2847    if(logo){
2848      int pos;
2849      int mx=0;
2850      int my=0;
2851      int offset_x = (screen_width-LOGO_WIDTH)>>1;
2852      int offset_y = ((screen_height-LOGO_HEIGHT)>>1) - 42;
2853      const color color_lookup[8] = {COLOR_BLACK,
2854                                    COLOR_SPLASH_RED/*0x2E redish*/,
2855                                    COLOR_RED,
2856                                    COLOR_GREY /*0x3D*/,
2857                                    COLOR_SPLASH_GREY /*0x1F*/,
2858                                    COLOR_SPLASH_PINK /*0x21 pinkish*/,
2859                                    COLOR_TRANSPARENT /*0x00*/,
2860                                    COLOR_WHITE /*0x11*/};
2861      for(pos=0; pos<logo_size; pos++){
2862          char data = logo[pos];
2863          color c = color_lookup[(data>>5) & 0x07];
2864          for(i=0; i<(data&0x1F)+1; i++){
2865              if (c!=0x00){
2866                  draw_pixel(offset_x+mx,offset_y+my,c);
2867              }
2868              if (mx==LOGO_WIDTH){
2869                  mx=0;
2870                  my++;
2871              }else{
2872                  mx++;
2873              }     
2874          }
2875      }
2876    }
2877}
2878
2879//-------------------------------------------------------------------
2880void gui_draw_fselect(int arg) {
2881    gui_fselect_init(LANG_STR_FILE_BROWSER, "A", NULL);
2882}
2883
2884//-------------------------------------------------------------------
2885static void gui_grid_lines_load_selected(const char *fn) {
2886    if (fn)
2887        grid_lines_load(fn);
2888}
2889void gui_grid_lines_load(int arg) {
2890    DIR   *d;
2891    char  *path="A/CHDK/GRIDS";
2892
2893    // if exists "A/CHDK/GRIDS" go into
2894    d=opendir(path);
2895    if (d) {
2896        closedir(d);
2897    } else {
2898        path="A";
2899    }
2900
2901    gui_fselect_init(LANG_STR_SELECT_GRID_FILE, path, gui_grid_lines_load_selected);
2902}
2903
2904//-------------------------------------------------------------------
2905void gui_draw_osd_le(int arg) {
2906    gui_mode = GUI_MODE_OSD;
2907    gui_osd_init();
2908}
2909
2910//-------------------------------------------------------------------
2911#ifdef OPT_TEXTREADER
2912static void gui_draw_read_selected(const char *fn) {
2913    if (fn) {
2914        if (!rbf_load(conf.reader_rbf_file))
2915            rbf_load_from_8x16(current_font);
2916        rbf_set_codepage(conf.reader_codepage);
2917        gui_mode = GUI_MODE_READ;
2918        gui_read_init(fn);
2919    }
2920}
2921void gui_draw_read(int arg) {
2922    DIR   *d;
2923    char  *path="A/CHDK/BOOKS";
2924
2925    // if exists "A/CHDK/BOOKS" go into
2926    d=opendir(path);
2927    if (d) {
2928        closedir(d);
2929    } else {
2930        path="A";
2931    }
2932    gui_fselect_init(LANG_STR_SELECT_TEXT_FILE, path, gui_draw_read_selected);
2933}
2934
2935//-------------------------------------------------------------------
2936void gui_draw_read_last(int arg) {
2937    int fd;
2938   
2939    fd = open(conf.reader_file, O_RDONLY, 0777);
2940    if (fd >= 0) {
2941        close(fd);
2942        gui_draw_read_selected(conf.reader_file);
2943    } else {
2944        gui_draw_read(arg);
2945    }
2946}
2947#endif
2948
2949//-------------------------------------------------------------------
2950void gui_menuproc_mkbootdisk(int arg) {
2951    mark_filesystem_bootable();
2952}
2953
2954#ifdef OPT_EDGEOVERLAY
2955    static void gui_load_edge_selected( const char* fn ) {
2956        if( fn )
2957        load_edge_overlay(fn);
2958    }
2959
2960    void gui_menuproc_edge_save(int arg) {
2961        save_edge_overlay();
2962    }
2963
2964    void gui_menuproc_edge_load(int arg) {
2965        DIR   *d;
2966        char  *path = EDGE_SAVE_DIR;
2967
2968        // if exists, go into
2969        d=opendir(path);
2970        if (d) {
2971            closedir(d);
2972        } else {
2973            path="A";
2974        }
2975
2976        gui_fselect_init(LANG_MENU_EDGE_LOAD, path, gui_load_edge_selected);
2977    }
2978#endif
2979
2980//-------------------------------------------------------------------
2981#ifdef OPT_CALENDAR
2982    void gui_draw_calendar(int arg) {
2983        gui_mode = GUI_MODE_CALENDAR;
2984        gui_calendar_init();
2985    }
2986#endif
2987//-------------------------------------------------------------------
2988static void gui_draw_rbf_selected(const char *fn) {
2989    if (fn) {
2990        strcpy(conf.reader_rbf_file, fn);
2991    }
2992}
2993#ifdef OPT_TEXTREADER
2994    void gui_draw_load_rbf(int arg) {
2995        DIR   *d;
2996        char  *path="A/CHDK/FONTS";
2997
2998        // if exists "A/CHDK/FONTS" go into
2999        d=opendir(path);
3000        if (d) {
3001            closedir(d);
3002        } else {
3003            path="A";
3004        }
3005
3006        gui_fselect_init(LANG_STR_SELECT_FONT_FILE, path, gui_draw_rbf_selected);
3007    }
3008#endif
3009//-------------------------------------------------------------------
3010static void gui_draw_menu_rbf_selected(const char *fn) {
3011    if (fn) {
3012        strcpy(conf.menu_rbf_file, fn);
3013        if (!rbf_load(conf.menu_rbf_file))
3014            rbf_load_from_8x16(current_font);
3015        rbf_set_codepage(FONT_CP_WIN);
3016        gui_menu_init(NULL);
3017    }
3018}
3019void gui_draw_load_menu_rbf(int arg) {
3020    DIR   *d;
3021    char  *path="A/CHDK/FONTS";
3022
3023    // if exists "A/CHDK/FONTS" go into
3024    d=opendir(path);
3025    if (d) {
3026        closedir(d);
3027    } else {
3028        path="A";
3029    }
3030
3031    gui_fselect_init(LANG_STR_SELECT_FONT_FILE, path, gui_draw_menu_rbf_selected);
3032}
3033
3034//-------------------------------------------------------------------
3035static void gui_draw_symbol_rbf_selected(const char *fn) {
3036    if (fn) {
3037        strcpy(conf.menu_symbol_rbf_file, fn);
3038        if(!rbf_load_symbol(conf.menu_symbol_rbf_file)) conf.menu_symbol_enable=0;              //AKA
3039        gui_menu_init(NULL);
3040    }
3041}
3042void gui_draw_load_symbol_rbf(int arg) {
3043    DIR   *d;
3044    char  *path="A/CHDK/SYMBOLS";
3045
3046    // if exists "A/CHDK/FONTS" go into
3047    d=opendir(path);
3048    if (d) {
3049        closedir(d);
3050    } else {
3051        path="A";
3052    }
3053
3054    gui_fselect_init(LANG_STR_SELECT_SYMBOL_FILE, path, gui_draw_symbol_rbf_selected);
3055}
3056
3057//-------------------------------------------------------------------
3058static void gui_draw_lang_selected(const char *fn) {
3059    if (fn) {
3060        strcpy(conf.lang_file, fn);
3061        lang_load_from_file(conf.lang_file);
3062        gui_menu_init(NULL);
3063    }
3064}
3065void gui_draw_load_lang(int arg) {
3066    DIR   *d;
3067    char  *path="A/CHDK/LANG";
3068
3069    // if exists "A/CHDK/LANG" go into
3070    d=opendir(path);
3071    if (d) {
3072        closedir(d);
3073    } else {
3074        path="A";
3075    }
3076
3077    gui_fselect_init(LANG_STR_SELECT_LANG_FILE, path, gui_draw_lang_selected);
3078}
3079
3080int find_mnu(CMenu *curr_menu, int mnu, int count)
3081{
3082    int gui_menu_curr_item;
3083
3084    gui_menu_curr_item = 0;
3085    while(curr_menu->menu[gui_menu_curr_item].text) {
3086        if (curr_menu->menu[gui_menu_curr_item].text == mnu){
3087            user_submenu_items[count] = curr_menu->menu[gui_menu_curr_item];
3088            return 1;
3089        }
3090        if ((curr_menu->menu[gui_menu_curr_item].type & MENUITEM_MASK) == MENUITEM_SUBMENU)
3091            if (curr_menu->menu[gui_menu_curr_item].text != LANG_MENU_USER_MENU)
3092                if (find_mnu((CMenu*)(curr_menu->menu[gui_menu_curr_item].value), mnu, count)) return 1;
3093        gui_menu_curr_item++;
3094    }
3095    return 0;
3096}
3097
3098void user_menu_save() {
3099    int x;
3100    for (x=0; x<USER_MENU_ITEMS; x++) {
3101        /*
3102        * First entry in user_submenu_items is reserved for the "Main Menu"
3103        * conf.user_menu_vars only traks/saves the real user entries.
3104        */
3105        conf.user_menu_vars[x] = user_submenu_items[x+1].text;
3106    }
3107}
3108 
3109void user_menu_restore() {
3110     int x;
3111    for (x=0; x<USER_MENU_ITEMS; x++) {
3112        /*
3113        * First entry in user_submenu_items is reserved for the "Main Menu"
3114        * conf.user_menu_vars only traks/saves the real user entries.
3115        */
3116        find_mnu(&root_menu, conf.user_menu_vars[x], x+1);
3117    }
3118}
3119
3120#ifdef OPT_EDGEOVERLAY
3121    static const char* gui_edge_pano_enum(int change, int arg)
3122    {
3123        static const char* modes[]={ "Off", "Right", "Down", "Left", "Up", "Free"};
3124
3125        return gui_change_simple_enum(&conf.edge_overlay_pano,change,modes,sizeof(modes)/sizeof(modes[0]));
3126    }
3127#endif
3128
3129#ifdef OPT_DEBUGGING
3130
3131    void gui_compare_props(int arg)
3132    {
3133        #define NUM_PROPS 512
3134        // never freed, but not allocated unless prop compare is used once
3135        static int *props = NULL;
3136        int i;
3137        int p;
3138        int c;
3139
3140        if( props )
3141        { // we have previous data set! do a comparison
3142            c = 0;
3143            for( i = 0; i < NUM_PROPS; ++i )
3144            {
3145                p = shooting_get_prop(i);
3146                if( props[i] != p )
3147                {
3148                    ++c;
3149                    sprintf(buf,"%4d is %8d was %8d",i,p,props[i]);
3150                    draw_string(16,16*c,buf,MAKE_COLOR(COLOR_BLACK,COLOR_YELLOW));
3151                }
3152                props[i] = p;
3153                if( c == 12 )
3154                {
3155                    ++c;
3156                    sprintf(buf,"%s","Waiting 15 Seconds");
3157                    draw_string(16,16*c,buf,MAKE_COLOR(COLOR_BLACK,COLOR_YELLOW));
3158                    msleep(15000);
3159                    c = 0;
3160                }
3161            }
3162            ++c;
3163            sprintf(buf,"%s","Press <ALT> to leave");
3164            draw_string(16,16*c,buf,MAKE_COLOR(COLOR_BLACK,COLOR_YELLOW));
3165        }
3166        else
3167        {
3168        // no previous data was set so we save the data initially
3169            props = (int *)malloc(NUM_PROPS*sizeof(int));
3170            if(props) {
3171                for( i = 0; i < NUM_PROPS; ++i )
3172                {
3173                    props[i] = shooting_get_prop(i);
3174                }
3175            }
3176        }
3177    }
3178
3179#endif
Note: See TracBrowser for help on using the repository browser.