source: trunk/core/gui.c @ 955

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