source: trunk/core/gui.c @ 600

Revision 600, 118.3 KB checked in by phyrephox, 4 years ago (diff)

+ added a nice little game - Connect Four (see http://en.wikipedia.org/wiki/Connect_Four )
game was written by CHDKLover & Kettmeister in the german forum, see http://chdk.kernreaktor.org/mantis/view.php?id=106 for more links

note: if we hear of reports that the binary is being to big for some cameras since the introduction of Connect 4, we are likely to disable it in the buildconf.inc (so people can compile it using the chdk shell or maybe another build server)

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