source: trunk/core/gui.c @ 1022

Revision 1022, 119.3 KB checked in by reyalP, 2 years ago (diff)

merge chdkde rev 465 - generic switch_mode_usb, smart buffer size for PTP. Thanks CHDKLover

  • Property svn:eol-style set to native
Line 
1#include "stdlib.h"
2#include "platform.h"
3#include "core.h"
4#include "keyboard.h"
5#include "conf.h"
6#include "camera.h"
7#include "font.h"
8#include "lang.h"
9#include "gui.h"
10#include "gui_lang.h"
11#include "gui_draw.h"
12#include "gui_menu.h"
13#include "gui_palette.h"
14#include "gui_mbox.h"
15#include "gui_mpopup.h"
16#include "gui_reversi.h"
17#include "gui_sokoban.h"
18#include "gui_4wins.h"
19#include "gui_mastermind.h"
20#include "console.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) || defined(CAMERA_sx30)
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/*
1009common code for "enum" menu items that just take a list of string values and don't require any special setters
1010would be better to have another menu item type that does this by default
1011save memory by eliminating dupe code
1012*/
1013static void gui_enum_value_change(int *value, int change, unsigned num_items) {
1014    *value+=change;
1015    if (*value<0)
1016        *value = num_items-1;
1017    else if (*value>=num_items)
1018        *value = 0;
1019}
1020static const char* gui_change_simple_enum(int* value, int change, const char** items, unsigned num_items) {
1021        gui_enum_value_change(value, change, num_items);
1022    return items[*value];
1023}
1024
1025//-------------------------------------------------------------------
1026#ifdef OPT_CURVES
1027const char* gui_conf_curve_enum(int change, int arg) {
1028    static const char* modes[]={ "None", "Custom", "+1EV", "+2EV", "Auto DR" };
1029
1030    gui_enum_value_change(&conf.curve_enable,change,sizeof(modes)/sizeof(modes[0]));
1031
1032        if(change)
1033                curve_init_mode();
1034    return modes[conf.curve_enable];
1035}
1036#endif
1037//-------------------------------------------------------------------
1038const char* gui_script_autostart_enum(int change, int arg) {
1039    static const char* modes[]={ "Off", "On", "Once"};
1040        return gui_change_simple_enum(&conf.script_startup,change,modes,sizeof(modes)/sizeof(modes[0]));
1041}
1042
1043//-------------------------------------------------------------------
1044const char* gui_script_param_set_enum(int change, int arg) {
1045    static const char* modes[]={ "0", "1", "2", "3", "4", "5", "6", "7", "8", "9" };
1046
1047    if (change != 0) {
1048        if (conf.script_param_save) {
1049            save_params_values(0);
1050        }
1051                gui_enum_value_change(&conf.script_param_set,change,sizeof(modes)/sizeof(modes[0]));
1052
1053        if (!load_params_values(conf.script_file, 1, 0))
1054            script_load(conf.script_file, 0);
1055        gui_update_script_submenu();
1056    }
1057
1058    return modes[conf.script_param_set];
1059}
1060
1061
1062//-------------------------------------------------------------------
1063const char* gui_override_disable_enum(int change, int arg) {
1064    static const char* modes[]={ "Off", "On", "Disabled"};
1065        return gui_change_simple_enum(&conf.override_disable,change,modes,sizeof(modes)/sizeof(modes[0]));
1066}
1067
1068//-------------------------------------------------------------------
1069const char* gui_histo_mode_enum(int change, int arg) {
1070    static const char* modes[]={ "Linear", "Log" };
1071
1072        gui_enum_value_change(&conf.histo_mode,change,sizeof(modes)/sizeof(modes[0]));
1073
1074    histogram_set_mode(conf.histo_mode);
1075
1076    return modes[conf.histo_mode];
1077}
1078
1079//-------------------------------------------------------------------
1080const char* gui_temp_mode_enum(int change, int arg) {
1081    static const char* modes[]={ "Off", "Optical","CCD","Battery","all" };
1082        return gui_change_simple_enum(&conf.show_temp,change,modes,sizeof(modes)/sizeof(modes[0]));
1083}
1084
1085//-------------------------------------------------------------------
1086const char* gui_histo_layout_enum(int change, int arg) {
1087    static const char* modes[]={ "RGB", "Y", "RGB Y",  "R G B", "RGB all", "Y all", "Blend", "Blend Y"};
1088
1089        gui_enum_value_change(&conf.histo_layout,change,sizeof(modes)/sizeof(modes[0]));
1090
1091    if (conf.histo_layout==OSD_HISTO_LAYOUT_Y || conf.histo_layout==OSD_HISTO_LAYOUT_Y_argb) {
1092        histogram_set_main(HISTO_Y);
1093    } else {
1094        histogram_set_main(HISTO_RGB);
1095    }
1096
1097    return modes[conf.histo_layout];
1098}
1099
1100//-------------------------------------------------------------------
1101const char* gui_font_enum(int change, int arg) {
1102    static const char* fonts[]={ "Win1250", "Win1251", "Win1252", "Win1253", "Win1254", "Win1257"};
1103
1104        gui_enum_value_change(&conf.font_cp,change,sizeof(fonts)/sizeof(fonts[0]));
1105
1106    if (change != 0) {
1107        font_set(conf.font_cp);
1108        if (!rbf_load(conf.menu_rbf_file))
1109            rbf_load_from_8x16(current_font);
1110        rbf_set_codepage(FONT_CP_WIN);
1111        gui_menu_init(NULL);
1112    }
1113
1114    return fonts[conf.font_cp];
1115}
1116
1117//-------------------------------------------------------------------
1118const char* gui_raw_prefix_enum(int change, int arg) {
1119        return gui_change_simple_enum(&conf.raw_prefix,change,img_prefixes,NUM_IMG_PREFIXES);
1120}
1121
1122//-------------------------------------------------------------------
1123const char* gui_raw_ext_enum(int change, int arg) {
1124        return gui_change_simple_enum(&conf.raw_ext,change,img_exts,NUM_IMG_EXTS);
1125}
1126
1127//-------------------------------------------------------------------
1128const char* gui_sub_batch_prefix_enum(int change, int arg) {
1129        return gui_change_simple_enum(&conf.sub_batch_prefix,change,img_prefixes,NUM_IMG_PREFIXES);
1130}
1131
1132//-------------------------------------------------------------------
1133const char* gui_sub_batch_ext_enum(int change, int arg) {
1134        return gui_change_simple_enum(&conf.sub_batch_ext,change,img_exts,NUM_IMG_EXTS);
1135}
1136
1137//-------------------------------------------------------------------
1138const char* gui_raw_nr_enum(int change, int arg) {
1139    static const char* modes[]={ "Auto", "Off", "On"};
1140        return gui_change_simple_enum(&conf.raw_nr,change,modes,sizeof(modes)/sizeof(modes[0]));
1141}
1142
1143//-------------------------------------------------------------------
1144#ifdef OPT_TEXTREADER
1145const char* gui_reader_codepage_enum(int change, int arg) {
1146    static const char* cps[]={ "Win1251", "DOS"};
1147        return gui_change_simple_enum(&conf.reader_codepage,change,cps,sizeof(cps)/sizeof(cps[0]));
1148}
1149#endif
1150//-------------------------------------------------------------------
1151const char* gui_autoiso_shutter_enum(int change, int arg) {
1152    static const char* shutter[]={ "Auto", "1/8s", "1/15s", "1/30s", "1/60s", "1/125s", "1/250s", "1/500s", "1/1000s"};
1153        return gui_change_simple_enum(&conf.autoiso_shutter,change,shutter,sizeof(shutter)/sizeof(shutter[0]));
1154}
1155
1156//-------------------------------------------------------------------
1157const char* gui_zebra_mode_enum(int change, int arg) {
1158    static const char* modes[]={ "Blink 1", "Blink 2", "Blink 3", "Solid", "Zebra 1", "Zebra 2" };
1159        return gui_change_simple_enum(&conf.zebra_mode,change,modes,sizeof(modes)/sizeof(modes[0]));
1160}
1161
1162//-------------------------------------------------------------------
1163const char* gui_zebra_draw_osd_enum(int change, int arg) {
1164    static const char* modes[]={ "Nothing", "Histo", "OSD" };
1165        return gui_change_simple_enum(&conf.zebra_draw_osd,change,modes,sizeof(modes)/sizeof(modes[0]));
1166}
1167
1168//-------------------------------------------------------------------
1169const char* gui_zoom_value_enum(int change, int arg) {
1170    static const char* modes[]={ "X", "FL", "EFL" };
1171        return gui_change_simple_enum(&conf.zoom_value,change,modes,sizeof(modes)/sizeof(modes[0]));
1172}
1173
1174const char* gui_show_values_enum(int change, int arg) {
1175    static const char* modes[]={ "Don't", "Always", "Shoot" };
1176        return gui_change_simple_enum(&conf.show_values,change,modes,sizeof(modes)/sizeof(modes[0]));
1177}
1178
1179const char* gui_nd_filter_state_enum(int change, int arg) {
1180    static const char* modes[]={ "Off", "In", "Out" };
1181        return gui_change_simple_enum(&conf.nd_filter_state,change,modes,sizeof(modes)/sizeof(modes[0]));
1182}
1183
1184const char* gui_dof_show_value_enum(int change, int arg) {
1185    static const char* modes[]={ "Don't", "Separate", "In Misc" };
1186        return gui_change_simple_enum(&conf.show_dof,change,modes,sizeof(modes)/sizeof(modes[0]));
1187}
1188
1189const char* gui_histo_show_enum(int change, int arg) {
1190    static const char* modes[]={ "Don't", "Always", "Shoot" };
1191        return gui_change_simple_enum(&conf.show_histo,change,modes,sizeof(modes)/sizeof(modes[0]));
1192}
1193
1194const char* gui_show_clock_enum(int change, int arg) {
1195    static const char* modes[]={ "Don't", "Normal", "Seconds"};
1196        return gui_change_simple_enum(&conf.show_clock,change,modes,sizeof(modes)/sizeof(modes[0]));
1197}
1198
1199const char* gui_hide_osd_enum(int change, int arg) {
1200    static const char* modes[]={ "Don't", "In Playback", "On Disp Press", "both"};
1201        return gui_change_simple_enum(&conf.hide_osd,change,modes,sizeof(modes)/sizeof(modes[0]));
1202}
1203
1204const char* gui_clock_format_enum(int change, int arg) {
1205    static const char* modes[]={ "24h", "12h"};
1206        return gui_change_simple_enum(&conf.clock_format,change,modes,sizeof(modes)/sizeof(modes[0]));
1207}
1208
1209const char* gui_clock_indicator_enum(int change, int arg) {
1210    static const char* modes[]={ "PM", "P","."};
1211        return gui_change_simple_enum(&conf.clock_indicator,change,modes,sizeof(modes)/sizeof(modes[0]));
1212}
1213
1214const char* gui_clock_halfpress_enum(int change, int arg) {
1215    static const char* modes[]={ "Full", "Seconds","Don't"};
1216        return gui_change_simple_enum(&conf.clock_halfpress,change,modes,sizeof(modes)/sizeof(modes[0]));
1217}
1218
1219const char* gui_space_bar_enum(int change, int arg) {
1220    static const char* modes[]={ "Don't", "Horizontal", "Vertical"};
1221        return gui_change_simple_enum(&conf.space_bar_show,change,modes,sizeof(modes)/sizeof(modes[0]));
1222}
1223
1224const char* gui_space_bar_size_enum(int change, int arg) {
1225    static const char* modes[]={ "1/4", "1/2", "1"};
1226        return gui_change_simple_enum(&conf.space_bar_size,change,modes,sizeof(modes)/sizeof(modes[0]));
1227}
1228
1229const char* gui_space_bar_width_enum(int change, int arg) {
1230    static const char* modes[]={ "1", "2", "3","4","5","6","7","8","9","10"};
1231        return gui_change_simple_enum(&conf.space_bar_width,change,modes,sizeof(modes)/sizeof(modes[0]));
1232}
1233
1234const char* gui_space_warn_type_enum(int change, int arg) {
1235    static const char* modes[]={ "Percent", "MB", "Don't"};
1236        return gui_change_simple_enum(&conf.space_warn_type,change,modes,sizeof(modes)/sizeof(modes[0]));
1237}
1238
1239const char* gui_show_movie_time(int change, int arg) {
1240    static const char* modes[]={ "Don't", "hh:mm:ss", "KB/s","both"};
1241        return gui_change_simple_enum(&conf.show_movie_time,change,modes,sizeof(modes)/sizeof(modes[0]));
1242}
1243
1244//-------------------------------------------------------------------
1245#if CAM_ADJUSTABLE_ALT_BUTTON
1246const char* gui_alt_mode_button_enum(int change, int arg) {
1247#if defined(CAMERA_s2is) || defined(CAMERA_s3is) || defined(CAMERA_s5is)
1248    static const char* names[]={ "Shrtcut", "Flash", "Timer", "ISO", "Video" };
1249    static const int keys[]={ KEY_PRINT, KEY_FLASH, KEY_TIMER, KEY_ISO, KEY_VIDEO };
1250#elif defined(CAMERA_g7)
1251    static const char* names[]={ "Print", "FE"};
1252    static const int keys[]={ KEY_PRINT, KEY_MICROPHONE };
1253#elif defined(CAMERA_g9)
1254    static const char* names[]={ "Print", "FE"};
1255    static const int keys[]={ KEY_PRINT,  KEY_MICROPHONE };
1256#elif defined(CAMERA_a650)
1257    static const char* names[]={ "Print", "ISO"};
1258    static const int keys[]={ KEY_PRINT, KEY_ISO };
1259#elif defined(CAMERA_sx100is) || defined(CAMERA_sx110is)
1260    static const char* names[]={ "Print", "Face"};
1261    static const int keys[]={ KEY_PRINT, KEY_FACE };
1262#elif defined(CAMERA_sx10) || defined(CAMERA_sx1) || defined(CAMERA_sx20) || defined(CAMERA_sx30)
1263    static const char* names[]={ "Shrtcut", "Flash", "Video"};
1264    static const int keys[]={ KEY_PRINT, KEY_FLASH, KEY_VIDEO };
1265#elif defined(CAMERA_a570) || defined(CAMERA_a590) || defined(CAMERA_a720)
1266    static const char* names[]={ "Print", "Display"};
1267    static const int keys[] = {KEY_PRINT, KEY_DISPLAY};
1268#else
1269    #error camera alt-buttons not defined
1270#endif
1271    int i;
1272
1273    for (i=0; i<sizeof(names)/sizeof(names[0]); ++i) {
1274        if (conf.alt_mode_button==keys[i]) {
1275            break;
1276        }
1277    }
1278
1279    i+=change;
1280    if (i<0)
1281        i=(sizeof(names)/sizeof(names[0]))-1;
1282    else if (i>=(sizeof(names)/sizeof(names[0])))
1283        i=0;
1284
1285    conf.alt_mode_button = keys[i];
1286    kbd_set_alt_mode_key_mask(conf.alt_mode_button);
1287    return names[i];
1288}
1289#endif
1290
1291//-------------------------------------------------------------------
1292const char* gui_alt_power_enum(int change, int arg) {
1293    static const char* modes[]={ "Never", "Alt", "Script","Always" };
1294        gui_enum_value_change(&conf.alt_prevent_shutdown,change,sizeof(modes)/sizeof(modes[0]));
1295       
1296        conf_update_prevent_shutdown();
1297
1298    return modes[conf.alt_prevent_shutdown];
1299}
1300const char* gui_fast_ev_step(int change, int arg) {
1301    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"};
1302        return gui_change_simple_enum(&conf.fast_ev_step,change,modes,sizeof(modes)/sizeof(modes[0]));
1303}
1304#if CAM_QUALITY_OVERRIDE
1305const char* gui_fast_image_quality(int change, int arg) {
1306    static const char* modes[]={"sup.fine","fine","normal","off"};
1307        return gui_change_simple_enum(&conf.fast_image_quality,change,modes,sizeof(modes)/sizeof(modes[0]));
1308}
1309#endif
1310
1311const char* gui_video_mode_enum(int change, int arg) {
1312#if !CAM_VIDEO_QUALITY_ONLY
1313    static const char* modes[]={ "Bitrate", "Quality"};
1314#else
1315    static const char* modes[]={ "Default", "Quality"};
1316#endif
1317        return gui_change_simple_enum(&conf.video_mode,change,modes,sizeof(modes)/sizeof(modes[0]));
1318}
1319
1320//-------------------------------------------------------------------
1321const char* gui_video_bitrate_enum(int change, int arg) {
1322        gui_enum_value_change(&conf.video_bitrate,change,VIDEO_BITRATE_STEPS);
1323
1324    shooting_video_bitrate_change(conf.video_bitrate);
1325
1326    return video_bitrate_strings[conf.video_bitrate];
1327}
1328
1329
1330//-------------------------------------------------------------------
1331const char* gui_tv_bracket_values_enum(int change, int arg) {
1332    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"};
1333        return gui_change_simple_enum(&conf.tv_bracket_value,change,modes,sizeof(modes)/sizeof(modes[0]));
1334}
1335
1336const char* gui_av_bracket_values_enum(int change, int arg) {
1337    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"};
1338        return gui_change_simple_enum(&conf.av_bracket_value,change,modes,sizeof(modes)/sizeof(modes[0]));
1339}
1340
1341const char* gui_subj_dist_bracket_koef_enum(int change, int arg) {
1342    static const char* modes[]={"Off", "1", "10","100","1000"};
1343        return gui_change_simple_enum(&conf.subj_dist_bracket_koef,change,modes,sizeof(modes)/sizeof(modes[0]));
1344}
1345
1346const char* gui_iso_bracket_koef_enum(int change, int arg) {
1347    static const char* modes[]={ "Off","1", "10","100"};
1348        return gui_change_simple_enum(&conf.iso_bracket_koef,change,modes,sizeof(modes)/sizeof(modes[0]));
1349}
1350
1351const char* gui_bracket_type_enum(int change, int arg) {
1352    static const char* modes[]={ "+/-", "-","+"};
1353        return gui_change_simple_enum(&conf.bracket_type,change,modes,sizeof(modes)/sizeof(modes[0]));
1354}
1355
1356const char* gui_tv_override_koef_enum(int change, int arg) {
1357    static const char* modes[]={"Off", "1/100K", "1/10000", "1/1000","1/100","1/10", "1","10","100"};
1358
1359    conf.tv_override_koef+=change;
1360   if (conf.tv_enum_type) {
1361     if (conf.tv_override_koef<0)  conf.tv_override_koef=6;
1362     else if (conf.tv_override_koef>6) conf.tv_override_koef=0;
1363     else if (conf.tv_override_koef==1)  conf.tv_override_koef=6;
1364     else if (conf.tv_override_koef==5)  conf.tv_override_koef=0;
1365     else if (conf.tv_override_koef!=0 && conf.tv_override_koef!=6) conf.tv_override_koef=6;
1366     }
1367   else {
1368    if (conf.tv_override_koef<0)
1369        conf.tv_override_koef=sizeof(modes)/sizeof(modes[0])-1;
1370    else if (conf.tv_override_koef>=(sizeof(modes)/sizeof(modes[0])))
1371        conf.tv_override_koef=0;
1372    }
1373   
1374    return modes[conf.tv_override_koef];
1375}
1376
1377const char* gui_tv_override_value_enum(int change, int arg) {
1378        /*
1379    static const char* modes[]={
1380    // add very long time exposures as approximately powers of 2, adding 15 exposures
1381    "2048","1625","1290","1024","812","645","512","406","322","256","203","161","128","101","80",
1382                "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"};
1383                */
1384    static char *buf;
1385
1386        // XXX This array above is redundant with platform/generic/shooting.c, this should be avoided!
1387    conf.tv_override_value+=change;
1388    if (conf.tv_enum_type) {
1389       if (conf.tv_override_value<0) {
1390          conf.tv_override_value=tv_override_amount-1;
1391        }
1392       else if ((unsigned)conf.tv_override_value>=(tv_override_amount))
1393         conf.tv_override_value=0;
1394       return tv_override[conf.tv_override_value];
1395     }
1396     else
1397      {
1398       if (conf.tv_override_value<0) {
1399          conf.tv_override_value=100;
1400        }
1401       else if (conf.tv_override_value>100)  conf.tv_override_value=0;
1402       if(!buf) buf=malloc(4);
1403       if(!buf) return "";
1404       sprintf(buf, "%d",  conf.tv_override_value);
1405       return buf;
1406      }
1407}
1408
1409const char* gui_tv_enum_type_enum(int change, int arg) {
1410    static const char* modes[]={"Factor", "Ev Step"};
1411
1412    gui_enum_value_change(&conf.tv_enum_type,change,sizeof(modes)/sizeof(modes[0]));
1413    if (change) {
1414        conf.tv_override_koef=6;       
1415        if (conf.tv_enum_type) 
1416            conf.tv_override_value=tv_override_zero_shift;
1417        else conf.tv_override_value=1;
1418    }
1419    return modes[conf.tv_enum_type];
1420}
1421
1422
1423const char* gui_iso_override_koef_enum(int change, int arg) {
1424    static const char* modes[]={ "Off","1", "10","100"};
1425        return gui_change_simple_enum(&conf.iso_override_koef,change,modes,sizeof(modes)/sizeof(modes[0]));
1426}
1427
1428const char* gui_subj_dist_override_value_enum(int change, int arg) {
1429        static const int koef[] = {0, 1,10,100,1000};
1430    static char buf[8];
1431    conf.subj_dist_override_value+=(change*koef[conf.subj_dist_override_koef]);
1432    if (conf.subj_dist_override_value<0)
1433        conf.subj_dist_override_value=MAX_DIST;
1434    else if (conf.subj_dist_override_value>MAX_DIST)
1435        conf.subj_dist_override_value=0;
1436    sprintf(buf, "%d", (int)conf.subj_dist_override_value);
1437    return buf;
1438}
1439
1440
1441const char* gui_subj_dist_override_koef_enum(int change, int arg) {
1442    static const char* modes[]={ "Off","1", "10","100","1000"};
1443        return gui_change_simple_enum(&conf.subj_dist_override_koef,change,modes,sizeof(modes)/sizeof(modes[0]));
1444}
1445
1446/*
1447const char* gui_tv_exposure_order_enum(int change, int arg) {
1448    static const char* modes[]={ "Off", "1","2", "3"};
1449
1450    conf.tv_exposure_order+=change;
1451    if (conf.tv_exposure_order<0)
1452        conf.tv_exposure_order=0;
1453    else if (conf.tv_exposure_order>=(sizeof(modes)/sizeof(modes[0])))
1454        conf.tv_exposure_order=sizeof(modes)/sizeof(modes[0])-1;
1455    if((conf.tv_exposure_order>0) && (conf.av_exposure_order==conf.tv_exposure_order))
1456     {
1457       conf.av_exposure_order=0;
1458     }
1459    if((conf.tv_exposure_order>0) && (conf.iso_exposure_order==conf.tv_exposure_order))
1460     {
1461       conf.iso_exposure_order=0;
1462     }
1463
1464    return modes[conf.tv_exposure_order];
1465}
1466
1467const char* gui_av_exposure_order_enum(int change, int arg) {
1468    static const char* modes[]={ "Off", "1","2", "3"};
1469
1470    conf.av_exposure_order+=change;
1471    if (conf.av_exposure_order<0)
1472        conf.av_exposure_order=0;
1473    else if (conf.av_exposure_order>=(sizeof(modes)/sizeof(modes[0])))
1474        conf.av_exposure_order=sizeof(modes)/sizeof(modes[0])-1;
1475    if((conf.av_exposure_order>0) && (conf.tv_exposure_order==conf.av_exposure_order))
1476     {
1477       conf.tv_exposure_order=0;
1478     }
1479    if((conf.av_exposure_order>0) && (conf.iso_exposure_order==conf.av_exposure_order))
1480     {
1481       conf.iso_exposure_order=0;
1482     }
1483    return modes[conf.av_exposure_order];
1484}
1485
1486const char* gui_iso_exposure_order_enum(int change, int arg) {
1487    static const char* modes[]={ "Off", "1","2", "3"};
1488
1489    conf.iso_exposure_order+=change;
1490    if (conf.iso_exposure_order<0)
1491        conf.iso_exposure_order=0;
1492    else if (conf.iso_exposure_order>=(sizeof(modes)/sizeof(modes[0])))
1493        conf.iso_exposure_order=sizeof(modes)/sizeof(modes[0])-1;
1494    if((conf.iso_exposure_order>0) && (conf.tv_exposure_order==conf.iso_exposure_order))
1495     {
1496       conf.tv_exposure_order=0;
1497     }
1498    if((conf.iso_exposure_order>0) && (conf.av_exposure_order==conf.iso_exposure_order))
1499     {
1500       conf.av_exposure_order=0;
1501     }
1502
1503    return modes[conf.iso_exposure_order];
1504}
1505*/
1506const char* gui_av_override_enum(int change, int arg) {
1507    static char buf[8];
1508    short prop_id;
1509    conf.av_override_value+=change;
1510    if (conf.av_override_value<0) conf.av_override_value=shooting_get_aperture_sizes_table_size()+6;
1511    else if (conf.av_override_value>shooting_get_aperture_sizes_table_size()+6) conf.av_override_value=0;
1512    if (conf.av_override_value == 0)  return "Off";
1513    else {
1514     short prop_id=shooting_get_aperture_from_av96(shooting_get_av96_override_value());         
1515         sprintf(buf, "%d.%02d", (int)prop_id/100, (int)prop_id%100 );
1516         return buf;
1517        }
1518}
1519
1520#if ZOOM_OVERRIDE
1521const char* gui_zoom_override_enum(int change, int arg) {
1522    static char buf[3];
1523    conf.zoom_override_value+=change;
1524    if (conf.zoom_override_value<0) conf.zoom_override_value=zoom_points-1;
1525    else if (conf.zoom_override_value>zoom_points-1) conf.zoom_override_value=0;
1526                sprintf(buf,"%i",conf.zoom_override_value);
1527                return buf;
1528}
1529#endif
1530
1531const char* gui_user_menu_show_enum(int change, int arg) {
1532    static const char* modes[]={ "Off", "On","On Direct", "Edit" };
1533
1534        if (conf.user_menu_enable == 3) user_menu_save();
1535        return gui_change_simple_enum(&conf.user_menu_enable,change,modes,sizeof(modes)/sizeof(modes[0]));
1536}
1537 
1538const char* gui_video_af_key_enum(int change, int arg){
1539#if CAMERA_g12
1540    static const char* names[]={ "", "Shutter", "Set", "AE Lock"};
1541    static const int keys[]={0, KEY_SHOOT_HALF, KEY_SET, KEY_AE_LOCK };
1542#else
1543    static const char* names[]={ "", "Shutter", "Set"};
1544    static const int keys[]={0, KEY_SHOOT_HALF, KEY_SET };
1545#endif
1546    int i;
1547 
1548    for (i=0; i<sizeof(names)/sizeof(names[0]); ++i) {
1549        if (conf.video_af_key==keys[i]) {
1550            break;
1551        }
1552    }
1553 
1554    i+=change;
1555    if (i<0)
1556        i=(sizeof(names)/sizeof(names[0]))-1;
1557    else if (i>=(sizeof(names)/sizeof(names[0])))
1558        i=0;
1559 
1560    conf.video_af_key = keys[i];
1561    return names[i];
1562}
1563   
1564const char* gui_bad_pixel_enum(int change, int arg) {
1565    int modes[]={LANG_MENU_BAD_PIXEL_OFF, LANG_MENU_BAD_PIXEL_INTERPOLATION, LANG_MENU_BAD_PIXEL_RAW_CONVERTER};
1566        return lang_str((int)gui_change_simple_enum(&conf.bad_pixel_removal,change,(const char **)modes,sizeof(modes)/sizeof(modes[0])));
1567}
1568 
1569//-------------------------------------------------------------------
1570void gui_update_script_submenu() {
1571    register int p=0, i;
1572
1573    for (i=0; i<sizeof(script_submenu_items_top)/sizeof(script_submenu_items_top[0]); ++p, ++i) {
1574        script_submenu_items[p]=script_submenu_items_top[i];
1575    }
1576    for (i=0; i<SCRIPT_NUM_PARAMS; ++i) {
1577        if (script_param_order[i]) {
1578            script_submenu_items[p].symbol=0x0;
1579            script_submenu_items[p].text=(int)script_params[script_param_order[i]-1];
1580            script_submenu_items[p].type=MENUITEM_INT;
1581            script_submenu_items[p].value=&conf.ubasic_vars[script_param_order[i]-1];
1582            ++p;
1583        }
1584    }
1585    for (i=0; i<sizeof(script_submenu_items_bottom)/sizeof(script_submenu_items_bottom[0]); ++p, ++i) {
1586        script_submenu_items[p]=script_submenu_items_bottom[i];
1587    }
1588}
1589
1590//-------------------------------------------------------------------
1591
1592void raw_fselect_cb(const char * filename){
1593 struct stat st;
1594 if (!filename) return;
1595 stat((char*)filename,&st);
1596 if (st.st_size!=hook_raw_size()) return;
1597 gui_mbox_init((int)"", LANG_RAW_DEVELOP_MESSAGE, MBOX_BTN_OK|MBOX_TEXT_CENTER, NULL);
1598 raw_prepare_develop((char*)filename);
1599}
1600
1601//-------------------------------------------------------------------
1602void gui_raw_develop(int arg){
1603 int m=mode_get();
1604 gui_fselect_init(LANG_RAW_DEVELOP_SELECT_FILE, "A/DCIM", raw_fselect_cb);
1605}
1606
1607//-------------------------------------------------------------------
1608
1609static void gui_menuproc_reset_files(int arg){
1610conf.lang_file[0] = 0;
1611conf.menu_symbol_rbf_file[0] = 0;
1612conf.menu_rbf_file[0] = 0;
1613conf_save();
1614gui_mbox_init(LANG_INFORMATION, LANG_MENU_RESTART_CAMERA, MBOX_BTN_OK|MBOX_TEXT_CENTER, NULL);
1615
1616}
1617
1618//-------------------------------------------------------------------
1619#ifdef OPT_DEBUGGING
1620#define TASKLIST_MAX_LINES 12 // probably as much as will fit on screen
1621#define TASKLIST_NUM_TASKS 64 // should be enough ?
1622static void gui_debug_draw_tasklist(void) {
1623#ifndef CAM_DRYOS
1624    int tasklist[TASKLIST_NUM_TASKS]; // max number of tasks we will look at
1625    char buf[40]; // a single line of the list
1626    int n_tasks,n_show_tasks,show_start;
1627    const char *name;
1628    int i;
1629    n_tasks = task_id_list_get(tasklist,sizeof(tasklist)/sizeof(tasklist[0]));
1630    show_start = debug_tasklist_start;
1631    n_show_tasks = n_tasks - show_start;
1632    // auto adjust to show the last N tasks
1633    if(n_show_tasks < TASKLIST_MAX_LINES) {
1634        show_start = n_tasks - TASKLIST_MAX_LINES;
1635        if(show_start<0)
1636            show_start = 0;
1637         n_show_tasks = n_tasks - show_start;
1638    }
1639    else if( n_show_tasks > TASKLIST_MAX_LINES ) {
1640        n_show_tasks = TASKLIST_MAX_LINES;
1641    }
1642    sprintf(buf,"%d-%d of %d tasks %c",show_start,show_start+n_show_tasks,n_tasks,debug_display_direction > 0?'+':'-');
1643    draw_string(64,0,buf, conf.osd_color);
1644    for( i = 0;  i < n_show_tasks; i++ ) {
1645        // TODO get full task info
1646        name = task_name(tasklist[show_start+i]);
1647        if ( !name || !*name ) {
1648            name = "(unknown)";
1649        }
1650        sprintf(buf,"%10s %8X",name,tasklist[show_start+i]);
1651        draw_string(64,16+16*i,buf, conf.osd_color);
1652    }
1653#endif //CAM_DRYOS
1654}
1655
1656#define DEBUG_DISPLAY_NONE 0
1657#define DEBUG_DISPLAY_PROPS 1
1658#define DEBUG_DISPLAY_PARAMS 2
1659#define DEBUG_DISPLAY_TASKS 3
1660static const char * gui_debug_shortcut_enum(int change, int arg) {
1661    static const char* modes[]={ "None", "DmpRAM", "Page", "CmpProps"};
1662        return gui_change_simple_enum(&conf.debug_shortcut_action,change,modes,sizeof(modes)/sizeof(modes[0]));
1663}
1664
1665static const char * gui_debug_display_enum(int change, int arg) {
1666    static const char* modes[]={ "None", "Props", "Params", "Tasks"};
1667        return gui_change_simple_enum(&conf.debug_display,change,modes,sizeof(modes)/sizeof(modes[0]));
1668}
1669
1670static void gui_debug_shortcut(void) {
1671    static int lastcall = -1;
1672    int t=get_tick_count();
1673    if ( lastcall != -1) {
1674        if (t-lastcall <= 400)
1675            debug_display_direction = -debug_display_direction;
1676    }
1677    lastcall=t;
1678    switch(conf.debug_shortcut_action) {
1679        case 1:
1680            dump_memory();
1681        break;
1682        case 2:
1683            if(conf.debug_display == DEBUG_DISPLAY_TASKS) {
1684                debug_tasklist_start += debug_display_direction*(TASKLIST_MAX_LINES-2); // a little intentional overlap
1685                if(debug_tasklist_start >= TASKLIST_NUM_TASKS || debug_tasklist_start < 0)
1686                    debug_tasklist_start = 0;
1687            }
1688            else if (conf.debug_display == DEBUG_DISPLAY_PROPS || conf.debug_display == DEBUG_DISPLAY_PARAMS) {
1689                conf.debug_propcase_page += debug_display_direction*1;
1690                if(conf.debug_propcase_page > 128 || conf.debug_propcase_page < 0)
1691                    conf.debug_propcase_page = 0;
1692            }
1693        break;
1694        case 3:
1695            gui_compare_props(1);
1696        break;
1697    }
1698}
1699
1700//-------------------------------------------------------------------
1701#endif
1702
1703#if CAM_MULTIPART
1704void card_break_proc(unsigned int btn){
1705 if (btn==MBOX_BTN_YES) create_partitions();
1706}
1707
1708
1709#ifdef OPT_DEBUGGING
1710static void gui_menuproc_break_card(int arg){
1711 gui_mbox_init(LANG_WARNING, LANG_PARTITIONS_CREATE_WARNING, MBOX_BTN_YES_NO|MBOX_DEF_BTN2|MBOX_TEXT_CENTER, card_break_proc);
1712}
1713#endif
1714
1715static void gui_menuproc_swap_patitons(int arg){
1716 if (get_part_count()<2) gui_mbox_init(LANG_ERROR, LANG_ONLY_ONE_PARTITION, MBOX_BTN_OK|MBOX_TEXT_CENTER, NULL);
1717 else
1718        {
1719                swap_partitions();
1720                gui_mbox_init(LANG_INFORMATION, LANG_SOKOBAN_MSG_FINISH_TITLE, MBOX_BTN_OK|MBOX_TEXT_CENTER, NULL);
1721        }
1722}
1723#endif
1724
1725//-------------------------------------------------------------------
1726static volatile enum Gui_Mode gui_mode;
1727static volatile int gui_restore;
1728static volatile int gui_in_redraw;
1729static int gui_splash, gui_splash_mode;
1730static char osd_buf[32];
1731#ifdef OPTIONS_AUTOSAVE
1732static Conf old_conf;
1733#endif
1734
1735//-------------------------------------------------------------------
1736void gui_init()
1737{
1738
1739    gui_mode = GUI_MODE_NONE;
1740    gui_restore = 0;
1741    gui_in_redraw = 0;
1742    if (conf.start_sound>0)
1743    {
1744        play_sound(4);
1745    }
1746    gui_splash = (conf.splash_show)?SPLASH_TIME:0;
1747    user_menu_restore();
1748    gui_lang_init();
1749    draw_init();
1750
1751    exposition_thresh = screen_size/500;
1752    voltage_step = (conf.batt_step_25)?25:1;
1753    load_bad_pixels_list("A/CHDK/badpixel");
1754    load_bad_pixels_list("A/CHDK/badpixel.txt");
1755#ifdef OPT_CURVES
1756        // initialize curves, loading files if required by current mode
1757        curve_init_mode();
1758#endif         
1759#if ZOOM_OVERRIDE
1760// reyalp - need to do this in capt_seq
1761//              if (conf.zoom_override) shooting_set_zoom(conf.zoom_override_value);
1762#endif
1763}
1764
1765//-------------------------------------------------------------------
1766#ifdef OPT_CURVES
1767static void gui_load_curve_selected(const char *fn) {
1768        if (fn) {
1769                // TODO we could sanity check here, but curve_set_type should fail gracefullish
1770                strcpy(conf.curve_file,fn);
1771                if(conf.curve_enable == 1)
1772                        curve_init_mode();
1773        }
1774}
1775
1776//-------------------------------------------------------------------
1777void gui_load_curve(int arg) {
1778    DIR   *d;
1779    char  *path = CURVE_DIR;
1780
1781    // if exists CURVE_DIR go into
1782    d=opendir(path);
1783    if (d) {
1784        closedir(d);
1785    } else {
1786        path="A";
1787    }
1788
1789    gui_fselect_init(LANG_STR_SELECT_CURVE_FILE, path, gui_load_curve_selected);
1790}
1791
1792#endif
1793//-------------------------------------------------------------------
1794enum Gui_Mode gui_get_mode() {
1795    return gui_mode;
1796}
1797
1798//-------------------------------------------------------------------
1799void gui_set_mode(enum Gui_Mode mode) {
1800    gui_mode = mode;
1801}
1802
1803//-------------------------------------------------------------------
1804void gui_force_restore() {
1805    gui_restore = gui_in_redraw;
1806}
1807
1808static void gui_handle_splash(void) {
1809        static char *logo = NULL;
1810    static int logo_size;
1811    if (gui_splash) {
1812                static int need_logo=1; // don't use logo ptr, since we don't want to keep re-trying
1813                if(need_logo) {
1814                const char *logo_name="A/CHDK/DATA/logo.dat";
1815            FILE *fd;
1816            struct stat st;
1817                        need_logo=0;
1818            if (stat(logo_name,&st) == 0) {
1819                                logo_size=st.st_size;
1820                                logo=malloc(logo_size);
1821                                if(logo) {
1822                                        fd = fopen(logo_name, "rb");
1823                                        if(fd){
1824                                                fread(logo,1,logo_size,fd);
1825                                                fclose(fd);
1826                                        }
1827                                        else {
1828                                                free(logo);
1829                                                logo=NULL;
1830                                        }
1831                }
1832                        }
1833                }
1834        if (gui_splash>(SPLASH_TIME-4)) {
1835            gui_draw_splash(logo,logo_size);
1836           //   conf.show_osd = 0;
1837        } else if (gui_splash==1 && (mode_get()&MODE_MASK) == gui_splash_mode && (gui_mode==GUI_MODE_NONE || gui_mode==GUI_MODE_ALT)) {
1838            draw_restore();
1839           // conf.show_osd = 1; //had to uncomment in order to fix a bug with disappearing osd...
1840        }
1841        --gui_splash;
1842                if(!gui_splash) {
1843                        free(logo);
1844                }
1845    }
1846}
1847
1848//-------------------------------------------------------------------
1849void gui_redraw()
1850{
1851    enum Gui_Mode gui_mode_old;
1852    static int show_md_grid=0;
1853
1854        gui_handle_splash();
1855
1856    gui_in_redraw = 1;
1857    gui_mode_old = gui_mode;
1858   
1859    #if CAM_USES_ASPECT_CORRECTION //nandoide sept-2009
1860    //the different modes arises because games are designed on a 360x240 basis and are difficult to downscale to 320x240
1861    if (gui_mode == GUI_MODE_REVERSI || gui_mode == GUI_MODE_SOKOBAN || gui_mode == GUI_MODE_4WINS || gui_mode == GUI_MODE_MASTERMIND) {
1862      draw_set_environment(aspect_xcorrection_games_360, aspect_ycorrection_games_360, GAMES_SCREEN_WIDTH, GAMES_SCREEN_HEIGHT);
1863   } else { //default
1864//      draw_set_environment(NULL, NULL, SCREENX, SCREENY);
1865      draw_set_environment(NULL, NULL, vid_get_bitmap_screen_width(), vid_get_bitmap_screen_height());
1866   }
1867    #endif   
1868    switch (gui_mode) {
1869        case GUI_MODE_MENU:
1870            gui_menu_draw();
1871//            draw_txt_string(20, 14, "<CNF>", MAKE_COLOR(COLOR_ALT_BG, COLOR_FG));
1872            break;
1873        case GUI_MODE_ALT:
1874            gui_draw_osd();
1875            draw_txt_string(20, 14, "<ALT>", MAKE_COLOR(COLOR_ALT_BG, COLOR_FG));
1876            if ((mode_get()&MODE_MASK) == MODE_REC) {
1877                draw_txt_string(0, 14, script_title, MAKE_COLOR(COLOR_ALT_BG, COLOR_FG));
1878                if (state_kbd_script_run) show_md_grid=5;
1879                if (show_md_grid) {
1880                    --show_md_grid;
1881                    md_draw_grid();
1882                }
1883            }
1884            console_draw();
1885            break;
1886        case GUI_MODE_NONE:
1887            gui_draw_osd();
1888            break;
1889        case GUI_MODE_PALETTE:
1890            gui_palette_draw();
1891            break;
1892        case GUI_MODE_MBOX:
1893            gui_mbox_draw();
1894            break;
1895#ifdef OPT_GAME_REVERSI
1896        case GUI_MODE_REVERSI:
1897            gui_reversi_draw();
1898            break;
1899#endif
1900#ifdef OPT_GAME_SOKOBAN
1901        case GUI_MODE_SOKOBAN:
1902            gui_sokoban_draw();
1903            break;
1904#endif
1905#ifdef OPT_GAME_CONNECT4
1906        case GUI_MODE_4WINS:
1907            gui_4wins_draw();
1908            break;
1909#endif
1910#ifdef OPT_GAME_MASTERMIND
1911        case GUI_MODE_MASTERMIND:
1912            gui_mastermind_draw();
1913            break;
1914#endif
1915#ifdef OPT_DEBUGGING
1916        case GUI_MODE_DEBUG:
1917            gui_debug_draw();
1918            break;
1919#endif
1920        case GUI_MODE_FSELECT:
1921            gui_fselect_draw();
1922            break;
1923#ifdef OPT_TEXTREADER
1924        case GUI_MODE_READ:
1925            gui_read_draw();
1926            break;
1927#endif
1928        case GUI_MODE_OSD:
1929            gui_osd_draw();
1930//            draw_txt_string(20, 14, "<OSD>", MAKE_COLOR(COLOR_ALT_BG, COLOR_FG));
1931            break;
1932#ifdef OPT_CALENDAR
1933        case GUI_MODE_CALENDAR:
1934            gui_calendar_draw();
1935            break;
1936#endif
1937#ifdef OPT_DEBUGGING
1938        case GUI_MODE_BENCH:
1939            gui_bench_draw();
1940            break;
1941#endif
1942        case GUI_MODE_MPOPUP:
1943            gui_mpopup_draw();
1944            break;
1945        default:
1946            break;
1947    }
1948   
1949    gui_in_redraw = 0;
1950    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) {
1951        gui_restore = 0;
1952        if (gui_mode != GUI_MODE_REVERSI && gui_mode != GUI_MODE_SOKOBAN && gui_mode != GUI_MODE_4WINS && gui_mode != GUI_MODE_MASTERMIND)
1953            draw_restore();
1954    }
1955}
1956
1957#ifdef OPTIONS_AUTOSAVE
1958//-------------------------------------------------------------------
1959static inline void conf_store_old_settings() {
1960    old_conf=conf;
1961}
1962
1963//-------------------------------------------------------------------
1964static inline int conf_save_new_settings_if_changed() {
1965    if (memcmp(&old_conf, &conf, sizeof(Conf)) != 0) {
1966                user_menu_save();
1967        conf_save();
1968        conf_store_old_settings();
1969        return 1;
1970    }
1971    return 0;
1972}
1973#endif
1974
1975
1976//-------------------------------------------------------------------
1977void gui_kbd_process()
1978{
1979    int clicked_key;
1980
1981    if (kbd_is_key_clicked(KEY_MENU)){
1982        switch (gui_mode) {
1983            case GUI_MODE_ALT:
1984                                if (conf.user_menu_as_root && (conf.user_menu_enable != 0)) {
1985                                if (kbd_is_key_pressed(KEY_SHOOT_HALF))
1986                                        gui_menu_init(&root_menu);
1987                                else
1988                gui_menu_init(&user_submenu);
1989                                }
1990                                else {
1991                                if ((conf.user_menu_enable != 0) && kbd_is_key_pressed(KEY_SHOOT_HALF))
1992                                        gui_menu_init(&user_submenu);
1993                                else
1994                gui_menu_init(&root_menu);
1995                                }
1996                gui_mode = GUI_MODE_MENU;
1997                draw_restore();
1998                break;
1999            case GUI_MODE_MENU:
2000#ifdef OPTIONS_AUTOSAVE
2001                conf_save_new_settings_if_changed();
2002#endif
2003                                if (gui_user_menu_flag) {
2004                        gui_mode = GUI_MODE_MENU;
2005                                        gui_user_menu_flag = 0;
2006                                        gui_menu_init(&root_menu);
2007                                }
2008                                else
2009                gui_mode = GUI_MODE_ALT;
2010                draw_restore();
2011                break;
2012            case GUI_MODE_PALETTE:
2013            case GUI_MODE_REVERSI:
2014            case GUI_MODE_SOKOBAN:
2015            case GUI_MODE_4WINS:
2016                        case GUI_MODE_MASTERMIND:
2017#ifdef OPT_DEBUGGING
2018            case GUI_MODE_DEBUG:
2019#endif
2020            case GUI_MODE_OSD:
2021#ifdef OPT_CALENDAR
2022            case GUI_MODE_CALENDAR:
2023#endif
2024            case GUI_MODE_BENCH:
2025                draw_restore();
2026                gui_mode = GUI_MODE_MENU;
2027                break;
2028            case GUI_MODE_FSELECT:
2029                gui_fselect_kbd_process();
2030                break;
2031#ifdef OPT_TEXTREADER
2032            case GUI_MODE_READ:
2033                gui_read_kbd_process();
2034                draw_restore();
2035                gui_mode = GUI_MODE_MENU;
2036                break;
2037#endif
2038            default:
2039                break;
2040        }
2041        return;
2042    }
2043   
2044    switch (gui_mode) {
2045        case GUI_MODE_ALT:
2046            if (kbd_is_key_clicked(SHORTCUT_TOGGLE_RAW)) {
2047                if (conf.debug_shortcut_action > 0) {
2048#ifdef OPT_DEBUGGING
2049                                        gui_debug_shortcut();
2050#endif
2051}
2052#if !CAM_HAS_ERASE_BUTTON && CAM_CAN_SD_OVERRIDE
2053                if (!shooting_get_common_focus_mode())
2054#else               
2055                                else
2056#endif                                                 
2057                                   {conf.save_raw = !conf.save_raw;
2058                    draw_restore();
2059                   }
2060#if !CAM_HAS_ERASE_BUTTON && CAM_CAN_SD_OVERRIDE
2061                                else {
2062   #if CAM_HAS_ZOOM_LEVER
2063               conf.subj_dist_override_value=MAX_DIST;
2064               shooting_set_focus(shooting_get_subject_distance_override_value(), SET_NOW);
2065   #else
2066               if (conf.subj_dist_override_koef==4)
2067                  gui_subj_dist_override_koef_enum(-3,0);
2068               else
2069                  gui_subj_dist_override_koef_enum(1,0);
2070   #endif
2071                                }
2072#endif
2073            } else if (kbd_is_key_clicked(KEY_SET)) {
2074                gui_menu_init(&script_submenu);
2075                gui_mode = GUI_MODE_MENU;
2076                draw_restore();
2077            } else {
2078#if !CAM_HAS_MANUAL_FOCUS && CAM_CAN_SD_OVERRIDE
2079                        if (kbd_is_key_clicked(SHORTCUT_MF_TOGGLE)) {
2080                              if (conf.subj_dist_override_koef>0)
2081                                     conf.subj_dist_override_koef=0;
2082                              else conf.subj_dist_override_koef=1;
2083                              draw_restore();
2084                             }
2085                else if (shooting_get_common_focus_mode())
2086#elif CAM_CAN_SD_OVERRIDE
2087               if (shooting_get_common_focus_mode())
2088#endif
2089
2090#if CAM_CAN_SD_OVERRIDE           
2091                          {
2092  #if CAM_HAS_ZOOM_LEVER
2093                                if (kbd_is_key_clicked(KEY_RIGHT)) {
2094                                  gui_subj_dist_override_koef_enum(1,0);
2095    #if !CAM_HAS_MANUAL_FOCUS
2096                  if (conf.subj_dist_override_koef==0) conf.subj_dist_override_koef=1;
2097    #endif
2098                  shooting_set_focus(shooting_get_subject_distance_override_value(), SET_NOW);
2099                                  }
2100                                else if (kbd_is_key_clicked(KEY_LEFT))
2101                                  {
2102                                  gui_subj_dist_override_koef_enum(-1,0);
2103    #if !CAM_HAS_MANUAL_FOCUS
2104                  if (conf.subj_dist_override_koef==0) conf.subj_dist_override_koef=1;
2105    #endif
2106                  shooting_set_focus(shooting_get_subject_distance_override_value(), SET_NOW);
2107                                  }
2108                                else if (kbd_is_key_clicked(SHORTCUT_SET_INFINITY))
2109                                  {
2110                                  conf.subj_dist_override_value=MAX_DIST;       
2111                  shooting_set_focus(shooting_get_subject_distance_override_value(), SET_NOW);
2112                                  }
2113                                else
2114  #endif
2115                                if (kbd_is_key_clicked(SHORTCUT_SET_HYPERFOCAL))
2116                                  {     
2117                                  int m=mode_get()&MODE_SHOOTING_MASK;
2118                                  if ((m==MODE_M) || (m==MODE_AV))
2119                                    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()));
2120                                  else conf.subj_dist_override_value=(int)shooting_get_hyperfocal_distance();           
2121                  shooting_set_focus(shooting_get_subject_distance_override_value(), SET_NOW);
2122                                  }   
2123                                else 
2124                  switch (kbd_get_autoclicked_key()) {
2125  #if CAM_HAS_ZOOM_LEVER
2126                    case KEY_ZOOM_IN:
2127  #else
2128                    case KEY_RIGHT:
2129  #endif
2130                        gui_subj_dist_override_value_enum(1,0);
2131                        shooting_set_focus(shooting_get_subject_distance_override_value(),SET_NOW);
2132                        break;
2133  #if CAM_HAS_ZOOM_LEVER
2134                    case KEY_ZOOM_OUT:
2135  #else
2136                    case KEY_LEFT:
2137  #endif
2138                        gui_subj_dist_override_value_enum(-1,0);
2139                        shooting_set_focus(shooting_get_subject_distance_override_value(), SET_NOW);
2140                        break;
2141                  }
2142              }
2143#endif                           
2144            }
2145            break;
2146        case GUI_MODE_MENU:
2147            gui_menu_kbd_process();
2148            break;
2149        case GUI_MODE_PALETTE:
2150            gui_palette_kbd_process();
2151            break;
2152        case GUI_MODE_MBOX:
2153            gui_mbox_kbd_process();
2154            break;
2155#ifdef OPT_GAME_REVERSI
2156        case GUI_MODE_REVERSI:
2157            gui_reversi_kbd_process();
2158            break;
2159#endif
2160#ifdef OPT_GAME_SOKOBAN
2161        case GUI_MODE_SOKOBAN:
2162            gui_sokoban_kbd_process();
2163            break;
2164#endif
2165#ifdef OPT_GAME_CONNECT4
2166        case GUI_MODE_4WINS:
2167            gui_4wins_kbd_process();
2168            break;
2169#endif
2170#ifdef OPT_GAME_MASTERMIND
2171        case GUI_MODE_MASTERMIND:
2172            gui_mastermind_kbd_process();
2173            break;
2174#endif
2175#ifdef OPT_DEBUGGING
2176        case GUI_MODE_DEBUG:
2177            gui_debug_kbd_process();
2178            break;
2179#endif
2180        case GUI_MODE_FSELECT:
2181            gui_fselect_kbd_process();
2182            break;
2183#ifdef OPT_TEXTREADER
2184        case GUI_MODE_READ:
2185            gui_read_kbd_process();
2186            break;
2187#endif
2188        case GUI_MODE_OSD:
2189            gui_osd_kbd_process();
2190            break;
2191#ifdef OPT_CALENDAR
2192        case GUI_MODE_CALENDAR:
2193            gui_calendar_kbd_process();
2194            break;
2195#endif
2196#ifdef OPT_DEBUGGING
2197        case GUI_MODE_BENCH:
2198            gui_bench_kbd_process();
2199            break;
2200#endif
2201        case GUI_MODE_MPOPUP:
2202            gui_mpopup_kbd_process();
2203             break;
2204        default:
2205            break;
2206    }
2207}
2208
2209//-------------------------------------------------------------------
2210void gui_kbd_enter()
2211{
2212    // XXX set custom palette
2213#ifdef OPTIONS_AUTOSAVE
2214    conf_store_old_settings();
2215#endif
2216    gui_mode = GUI_MODE_ALT;
2217
2218        conf_update_prevent_shutdown();
2219
2220    vid_turn_off_updates();
2221
2222        gui_user_menu_flag = 0;
2223        if (conf.user_menu_enable == 2) {
2224                gui_menu_init(&user_submenu);
2225                gui_mode = GUI_MODE_MENU;
2226                draw_restore();
2227                gui_user_menu_flag = 1;
2228        }
2229
2230}
2231
2232//-------------------------------------------------------------------
2233void gui_kbd_leave()
2234{
2235    // XXX restore palette
2236#ifdef OPTIONS_AUTOSAVE
2237    conf_save_new_settings_if_changed();
2238#endif
2239    ubasic_error = 0;
2240    draw_restore();
2241    if (gui_mode == GUI_MODE_READ && !rbf_load(conf.menu_rbf_file))
2242        rbf_load_from_8x16(current_font);
2243    rbf_set_codepage(FONT_CP_WIN);
2244    vid_turn_on_updates();
2245    gui_mode = GUI_MODE_NONE;
2246
2247        conf_update_prevent_shutdown();
2248}
2249//-------------------------------------------------------------------
2250 
2251void other_kbd_process(){
2252 int key;
2253#if CAM_AF_SCAN_DURING_VIDEO_RECORD
2254   
2255 if (movie_status==VIDEO_RECORD_IN_PROGRESS) {
2256  if (kbd_is_key_clicked(conf.video_af_key)) MakeAFScan();
2257 }
2258 
2259#endif
2260
2261#if CAM_CAN_UNLOCK_OPTICAL_ZOOM_IN_VIDEO
2262 // return from digital to optical zoom in video
2263#if CAM_HAS_ZOOM_LEVER
2264   key=KEY_ZOOM_OUT;
2265#else
2266   key=KEY_DOWN;
2267#endif
2268    if (conf.unlock_optical_zoom_for_video && (movie_status==VIDEO_RECORD_IN_PROGRESS) &&  kbd_is_key_clicked(key)){
2269     short x;
2270     get_property_case(PROPCASE_DIGITAL_ZOOM_STATE, &x, sizeof(x));
2271     if (x) {
2272      get_property_case(PROPCASE_DIGITAL_ZOOM_POSITION, &x, sizeof(x));
2273#if defined (CAMERA_s90)
2274          if (x==0) zoom_status=ZOOM_OPTICAL_MAX; //ERR99: No zoom back from digital to optical zoom possible if set to medium
2275#elif defined (CAMERA_sx30)     || defined (CAMERA_g12)         // can't find, crashes camera *******
2276#else
2277          if (x==0) zoom_status=ZOOM_OPTICAL_MEDIUM;
2278#endif
2279
2280     }
2281    }
2282#endif
2283
2284#if CAM_EV_IN_VIDEO
2285 if ((movie_status==VIDEO_RECORD_IN_PROGRESS) && !kbd_is_key_pressed(KEY_SHOOT_HALF)){
2286  #if CAM_HAS_ERASE_BUTTON
2287  if (kbd_is_key_clicked(KEY_ERASE)){
2288  #else
2289  #if !defined (CAMERA_a480)
2290  if (kbd_is_key_clicked(KEY_DISPLAY)){
2291  #else
2292  if (kbd_is_key_clicked(KEY_MENU)){
2293  #endif
2294  #endif
2295   set_ev_video_avail(!get_ev_video_avail());
2296  }
2297  if (get_ev_video_avail()) {
2298   if (kbd_is_key_clicked(KEY_LEFT)) {
2299    set_ev_video(get_ev_video()-1);
2300   }
2301   if (kbd_is_key_clicked(KEY_RIGHT)){
2302    set_ev_video(get_ev_video()+1);
2303   }
2304  }
2305 }
2306#endif
2307}
2308
2309void gui_draw_debug_vals_osd() {
2310#ifdef OPT_DEBUGGING
2311    if (conf.debug_misc_vals_show) {
2312        //        long v=get_file_counter();
2313        //      sprintf(osd_buf, "1:%03d-%04d  ", (v>>18)&0x3FF, (v>>4)&0x3FFF);
2314        //      sprintf(osd_buf, "1:%d, %08X  ", xxxx, eeee);
2315        /*
2316        extern long physw_status[3];
2317        sprintf(osd_buf, "1:%8x  ", physw_status[0]);
2318        draw_txt_string(28, 10, osd_buf, conf.osd_color);
2319
2320        sprintf(osd_buf, "2:%8x  ", physw_status[1]);
2321        draw_txt_string(28, 11, osd_buf, conf.osd_color);
2322
2323        sprintf(osd_buf, "3:%8x  ", physw_status[2]);
2324        draw_txt_string(28, 12, osd_buf, conf.osd_color);
2325
2326        //      sprintf(osd_buf, "4:%8x  ", vid_get_viewport_fb_d());
2327        */
2328        sprintf(osd_buf, "u:%8x  ", get_usb_power(1));
2329        draw_txt_string(28,  9, osd_buf, conf.osd_color);
2330
2331        sprintf(osd_buf, "1:%8x  ", (void*) (*(int*)conf.mem_view_addr_init));
2332        draw_txt_string(28, 10, osd_buf, conf.osd_color);
2333
2334    extern volatile long focus_busy;
2335        sprintf(osd_buf, "f:%8x  ", focus_busy);
2336        draw_txt_string(28, 11, osd_buf, conf.osd_color);
2337
2338    extern volatile long zoom_busy;
2339        sprintf(osd_buf, "z:%8x  ", zoom_busy);
2340        draw_txt_string(28, 12, osd_buf, conf.osd_color);
2341
2342        // some cameras missing zoom_status
2343        #if 0
2344        sprintf(osd_buf, "t:%8x  ", zoom_status);
2345        draw_txt_string(28, 13, osd_buf, conf.osd_color);
2346        #endif
2347
2348    }
2349    {
2350        static char sbuf[100];
2351        int r,i, p, len;
2352        if (conf.debug_display == DEBUG_DISPLAY_PROPS){
2353
2354            for (i=0;i<10;i++){
2355                r = 0;
2356                p = conf.debug_propcase_page*10+i;
2357                get_property_case(p, &r, 4);
2358                sprintf(sbuf, "%3d: %d              ", p, r);
2359                sbuf[20]=0;
2360                draw_string(64,16+16*i,sbuf, conf.osd_color);
2361            }
2362        }
2363
2364        if (conf.debug_display == DEBUG_DISPLAY_PARAMS){
2365            extern long* FlashParamsTable[];
2366            char s[30];
2367            int count;
2368
2369            for (i=0;i<10;i++){
2370                r = 0;
2371                p = conf.debug_propcase_page*10+i;
2372                if (p>=get_flash_params_count()) {
2373                    sprintf(sbuf, "%3d: This parameter does not exists", p);
2374                } else  {
2375                    len=FlashParamsTable[p][1]>>16;
2376                    if ((len==1)||(len==2)||(len==4)){
2377                        get_parameter_data(p, &r, len);
2378                        sprintf(sbuf, "%3d: %30d :%2d ", p, r,len);
2379                    }
2380                    else {
2381                        if (len>=sizeof(s)) count=sizeof(s)-1; else count=len;
2382                        get_parameter_data(p, &s, count);
2383                        s[count]=0;
2384                        sprintf(sbuf, "%3d: %30s :%2d ", p, s,len);
2385                    }
2386                }
2387                draw_string(16,16+16*i,sbuf, conf.osd_color);
2388            }
2389        }
2390    }
2391
2392    if(conf.debug_display == DEBUG_DISPLAY_TASKS) {
2393            gui_debug_draw_tasklist();
2394    }
2395#endif
2396}
2397//-------------------------------------------------------------------
2398//extern int xxxx, eeee;
2399//-------------------------------------------------------------------
2400void gui_draw_osd() {
2401    unsigned int m, /*n = 0,*/ mode_photo, mode_video;
2402    coord x;
2403#if CAM_SWIVEL_SCREEN
2404    static int flashlight = 0;
2405#endif
2406    static int pressed = 0;
2407    static int half_disp_press_old=0;
2408    int half_disp_press;
2409    int need_restore = 0;
2410    m = mode_get();
2411
2412// uncomment if you want debug values always on top
2413//      gui_draw_debug_vals_osd();
2414
2415#if CAM_SWIVEL_SCREEN
2416    if (conf.flashlight && (m&MODE_SCREEN_OPENED) && (m&MODE_SCREEN_ROTATED) && (gui_mode==GUI_MODE_NONE /* || gui_mode==GUI_MODE_ALT */)) {
2417        draw_filled_rect(0, 0, screen_width-1, screen_height-1, MAKE_COLOR(COLOR_WHITE, COLOR_WHITE));
2418        flashlight = 1;
2419    }
2420    if (flashlight) {
2421        if ((!((m&MODE_SCREEN_OPENED) && (m&MODE_SCREEN_ROTATED))) || (gui_mode!=GUI_MODE_NONE /* && gui_mode!=GUI_MODE_ALT */)) {
2422            flashlight = 0;
2423                        need_restore = 1;
2424        } else {
2425                        return;
2426                }
2427    }
2428#endif
2429   
2430    if (kbd_is_key_pressed(KEY_SHOOT_HALF)) {
2431        if (kbd_is_key_pressed(SHORTCUT_TOGGLE_ZEBRA)) {
2432            if (!pressed) {
2433                conf.zebra_draw = !conf.zebra_draw;
2434                if (!conf.zebra_draw) {
2435                                        need_restore = 1;
2436                }
2437                pressed = 1;
2438            }
2439        } else if (kbd_is_key_pressed(SHORTCUT_TOGGLE_HISTO)) {
2440            if (!pressed) {
2441                if (++conf.show_histo>SHOW_HALF) conf.show_histo=0;
2442                if (!conf.show_histo) {
2443                                        need_restore = 1;
2444                }
2445                pressed = 1;
2446            }
2447        } else if (kbd_is_key_pressed(SHORTCUT_TOGGLE_OSD)) {
2448            if (!pressed) {
2449                conf.show_osd = !conf.show_osd;
2450                if (!conf.show_osd) {
2451                                        need_restore = 1;
2452                }
2453                pressed = 1;
2454            }
2455        } else if (kbd_is_key_pressed(SHORTCUT_DISABLE_OVERRIDES)) {
2456             if (!pressed) {
2457                 if (conf.override_disable < 2) conf.override_disable = !conf.override_disable;
2458                 if (!conf.show_osd) {
2459                                        need_restore = 1;
2460                 }
2461                 pressed = 1;
2462             }
2463        } else {
2464            pressed = 0;
2465        }
2466    } else {
2467        pressed = 0;
2468    }
2469   
2470        // TODO some of the ifs below should probably use this
2471        mode_video = MODE_IS_VIDEO(m);
2472
2473    mode_photo = (m&MODE_MASK) == MODE_PLAY ||
2474                 !( mode_video ||
2475                                 (m&MODE_SHOOTING_MASK)==MODE_STITCH);
2476
2477    half_disp_press=mode_photo && kbd_is_key_pressed(KEY_SHOOT_HALF) && kbd_is_key_pressed(KEY_DISPLAY);
2478    if (half_disp_press && ! half_disp_press_old)
2479                need_restore = 1;
2480    half_disp_press_old=half_disp_press;
2481
2482        if (need_restore)
2483                draw_restore();
2484
2485    if (half_disp_press)
2486                return;
2487
2488        if (gui_osd_draw_zebra(conf.zebra_draw && gui_mode==GUI_MODE_NONE &&
2489                                                        kbd_is_key_pressed(KEY_SHOOT_HALF) && mode_photo &&
2490                                                        !state_kbd_script_run)) {// no zebra when script running, to save mem
2491                return; // if zebra drawn, we're done
2492        }
2493#if !CAM_SHOW_OSD_IN_SHOOT_MENU
2494      if (!(conf.show_osd && (canon_menu_active==(int)&canon_menu_active-4) && (canon_shoot_menu_active==0)))  return;   
2495#else
2496      if (!(conf.show_osd && (canon_menu_active==(int)&canon_menu_active-4) /*&& (canon_shoot_menu_active==0)*/ ))  return;
2497#endif 
2498
2499   
2500    if ((gui_mode==GUI_MODE_NONE || gui_mode==GUI_MODE_ALT) && (
2501     (kbd_is_key_pressed(KEY_SHOOT_HALF) && ((conf.show_histo==SHOW_HALF)/* || (m&MODE_MASK) == MODE_PLAY*/)) ||
2502     ((conf.show_histo==SHOW_ALWAYS)  &&  !((m&MODE_MASK) == MODE_PLAY) && (recreview_hold==0))
2503    ) &&
2504    (mode_photo || (m&MODE_SHOOTING_MASK)==MODE_STITCH)) {
2505        gui_osd_draw_histo();
2506    }
2507
2508    if ((m&MODE_MASK) == MODE_REC && (recreview_hold==0 || conf.show_osd_in_review) ) {
2509        if (conf.show_grid_lines) {
2510            gui_grid_draw_osd(1);
2511        }
2512        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) )) {
2513                 
2514           if (conf.show_dof!=DOF_DONT_SHOW) gui_osd_calc_dof();
2515           
2516           if (conf.show_dof==DOF_SHOW_IN_DOF) gui_osd_draw_dof(); 
2517           
2518           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();                       
2519        }
2520        if (conf.show_state) gui_osd_draw_state();
2521        if (conf.save_raw && conf.show_raw_state && !mode_video && (!kbd_is_key_pressed(KEY_SHOOT_HALF))) gui_osd_draw_raw_info();
2522       
2523            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)))
2524                   gui_osd_draw_values(1);
2525        else if  (shooting_get_common_focus_mode() && mode_photo && conf.show_values && !(conf.show_dof==DOF_SHOW_IN_DOF) )   
2526           gui_osd_draw_values(2);
2527            else if  (conf.show_values==SHOW_HALF)
2528                   gui_osd_draw_values(0);   
2529    }
2530
2531
2532    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))))   {
2533        gui_batt_draw_osd();
2534        gui_space_draw_osd();
2535        if (conf.fast_ev && !mode_video && (m&MODE_MASK) == MODE_REC ) gui_osd_draw_ev();
2536    }
2537   
2538    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) )) {
2539        gui_osd_draw_clock(0,0,0);
2540    }
2541    else if ((conf.show_clock) && (recreview_hold==0) &&  kbd_is_key_pressed(KEY_SHOOT_HALF) && conf.clock_halfpress==1) {
2542        gui_osd_draw_seconds();
2543    }
2544 
2545    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) )) {
2546        gui_osd_draw_temp();
2547    }
2548    if (conf.show_movie_time > 0 && (mode_video || movie_status > 1)) {
2549        gui_osd_draw_movie_time_left();
2550    }
2551 
2552#if CAM_DRAW_EXPOSITION
2553    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) {
2554     strcpy(osd_buf,shooting_get_tv_str());
2555     strcat(osd_buf,"\"  F");
2556     strcat(osd_buf,shooting_get_av_str());
2557     draw_txt_string(22-strlen(osd_buf)/2, 14, osd_buf, conf.osd_color);
2558    }
2559#endif
2560
2561#if CAM_EV_IN_VIDEO
2562    if (movie_status==VIDEO_RECORD_IN_PROGRESS) gui_osd_draw_ev_video(get_ev_video_avail());
2563#endif
2564
2565        gui_draw_debug_vals_osd();
2566
2567    if (ubasic_error){
2568        const char *msg;
2569        if (ubasic_error >= UBASIC_E_ENDMARK) {
2570            msg = ubasic_errstrings[UBASIC_E_UNKNOWN_ERROR];
2571        } else {
2572            msg = ubasic_errstrings[ubasic_error];
2573        }
2574        sprintf(osd_buf, "uBASIC:%d %s ", ubasic_linenumber(), msg);
2575        draw_txt_string(0, 0, osd_buf, MAKE_COLOR(COLOR_RED, COLOR_YELLOW));
2576    }
2577}
2578
2579#ifndef OPTIONS_AUTOSAVE
2580//-------------------------------------------------------------------
2581void gui_menuproc_save(int arg)
2582{
2583    conf_save();
2584}
2585#endif
2586
2587//-------------------------------------------------------------------
2588static void gui_menuproc_reset_selected(unsigned int btn) {
2589    if (btn==MBOX_BTN_YES)
2590        conf_load_defaults();
2591}
2592
2593void gui_menuproc_reset(int arg)
2594{
2595    gui_mbox_init(LANG_MSG_RESET_OPTIONS_TITLE,
2596                  LANG_MSG_RESET_OPTIONS_TEXT,
2597                  MBOX_FUNC_RESTORE|MBOX_TEXT_CENTER|MBOX_BTN_YES_NO|MBOX_DEF_BTN2, gui_menuproc_reset_selected);
2598}
2599
2600//-------------------------------------------------------------------
2601void gui_draw_palette(int arg) {
2602    draw_restore();
2603    gui_palette_init(PALETTE_MODE_DEFAULT, 0x00, NULL);
2604    gui_mode = GUI_MODE_PALETTE;
2605}
2606
2607//-------------------------------------------------------------------
2608void gui_show_build_info(int arg) {
2609    static char buf[192];
2610    static char comp[64];
2611
2612#ifdef __GNUC__
2613# ifndef __GNUC_PATCHLEVEL__
2614# define __GNUC_PATCHLEVEL 0
2615# endif
2616    sprintf(comp, "GCC %d.%d.%d", __GNUC__ ,__GNUC_MINOR__,__GNUC_PATCHLEVEL__ );
2617#else
2618    sprintf(comp, "UNKNOWN" );
2619#endif
2620    sprintf(buf, lang_str(LANG_MSG_BUILD_INFO_TEXT), HDK_VERSION, BUILD_NUMBER, __DATE__, __TIME__, PLATFORM, PLATFORMSUB, comp);
2621gui_mbox_init(LANG_MSG_BUILD_INFO_TITLE, (int)buf, MBOX_FUNC_RESTORE|MBOX_TEXT_LEFT, NULL);
2622}
2623
2624//-------------------------------------------------------------------
2625void gui_show_memory_info(int arg) {
2626    static char buf[64];
2627   
2628    sprintf(buf, lang_str(LANG_MSG_MEMORY_INFO_TEXT), core_get_free_memory(), MEMISOSIZE, &_start, &_end);
2629    gui_mbox_init(LANG_MSG_MEMORY_INFO_TITLE, (int)buf, MBOX_FUNC_RESTORE|MBOX_TEXT_CENTER, NULL);
2630}
2631
2632//-------------------------------------------------------------------
2633#ifdef OPT_GAME_REVERSI
2634void gui_draw_reversi(int arg) {
2635    if ((mode_get()&MODE_MASK) != MODE_PLAY) {
2636        gui_mbox_init(LANG_MSG_INFO_TITLE, LANG_MSG_SWITCH_TO_PLAY_MODE,
2637                      MBOX_FUNC_RESTORE|MBOX_TEXT_CENTER, NULL);
2638        return;
2639    }
2640   
2641    #if CAM_USES_ASPECT_CORRECTION //nandoide sept-2009
2642      draw_set_environment(aspect_xcorrection_games_360, aspect_ycorrection_games_360, GAMES_SCREEN_WIDTH, GAMES_SCREEN_HEIGHT);
2643    #endif
2644    gui_mode = GUI_MODE_REVERSI;
2645    gui_reversi_init();
2646}
2647#endif
2648
2649//-------------------------------------------------------------------
2650#ifdef OPT_GAME_SOKOBAN
2651void gui_draw_sokoban(int arg) {
2652    if ((mode_get()&MODE_MASK) != MODE_PLAY) {
2653        gui_mbox_init(LANG_MSG_INFO_TITLE, LANG_MSG_SWITCH_TO_PLAY_MODE,
2654                      MBOX_FUNC_RESTORE|MBOX_TEXT_CENTER, NULL);
2655        return;
2656    }
2657    #if CAM_USES_ASPECT_CORRECTION //nandoide sept-2009
2658      draw_set_environment(aspect_xcorrection_games_360, aspect_ycorrection_games_360, GAMES_SCREEN_WIDTH, GAMES_SCREEN_HEIGHT);
2659    #endif
2660    if ( gui_sokoban_init() )
2661        gui_mode = GUI_MODE_SOKOBAN;
2662}
2663#endif
2664//-------------------------------------------------------------------
2665#ifdef OPT_GAME_CONNECT4
2666void gui_draw_4wins(int arg) {
2667    if ((mode_get()&MODE_MASK) != MODE_PLAY) {
2668        gui_mbox_init(LANG_MSG_INFO_TITLE, LANG_MSG_SWITCH_TO_PLAY_MODE,
2669                      MBOX_FUNC_RESTORE|MBOX_TEXT_CENTER, NULL);
2670        return;
2671    }
2672    #if CAM_USES_ASPECT_CORRECTION //nandoide sept-2009
2673      draw_set_environment(aspect_xcorrection_games_360, aspect_ycorrection_games_360, GAMES_SCREEN_WIDTH, GAMES_SCREEN_HEIGHT);
2674    #endif
2675    if ( gui_4wins_init() )
2676        gui_mode = GUI_MODE_4WINS;
2677}
2678#endif
2679//-------------------------------------------------------------------
2680#ifdef OPT_GAME_MASTERMIND
2681void gui_draw_mastermind(int arg) {
2682    if ((mode_get()&MODE_MASK) != MODE_PLAY) {
2683        gui_mbox_init(LANG_MSG_INFO_TITLE, LANG_MSG_SWITCH_TO_PLAY_MODE,
2684                      MBOX_FUNC_RESTORE|MBOX_TEXT_CENTER, NULL);
2685        return;
2686    }
2687    #if CAM_USES_ASPECT_CORRECTION //nandoide sept-2009
2688     draw_set_environment(aspect_xcorrection_games_360, aspect_ycorrection_games_360, GAMES_SCREEN_WIDTH, GAMES_SCREEN_HEIGHT);
2689    #endif
2690   if ( gui_mastermind_init() )
2691        gui_mode = GUI_MODE_MASTERMIND;
2692}
2693#endif
2694//-------------------------------------------------------------------
2695#ifdef OPT_DEBUGGING
2696void gui_draw_debug(int arg) {
2697//    gui_debug_init(0x2510);
2698//    gui_debug_init(0x127E0);
2699//    gui_debug_init(0x7F5B8);
2700//    gui_debug_init(malloc(16));
2701    gui_debug_init((void*)conf.mem_view_addr_init);
2702}
2703#endif
2704//-------------------------------------------------------------------
2705#ifdef OPT_DEBUGGING
2706void gui_draw_bench(int arg) {
2707    gui_mode = GUI_MODE_BENCH;
2708    gui_bench_init();
2709}
2710#endif
2711//-------------------------------------------------------------------
2712
2713void gui_draw_splash(char* logo, int logo_size) {
2714    coord w, h, x, y;
2715    static const char *text[] = {
2716        "CHDK Firmware '" HDK_VERSION " " BUILD_NUMBER "'" ,
2717        "Build: " __DATE__ " " __TIME__ ,
2718        "Camera: " PLATFORM " - " PLATFORMSUB };
2719    int i, l;
2720    color cl = MAKE_COLOR(COLOR_RED, COLOR_WHITE);
2721
2722    gui_splash_mode = (mode_get()&MODE_MASK);
2723   
2724    h=sizeof(text)/sizeof(text[0])*FONT_HEIGHT+8;
2725    w=0;
2726    for (i=0; i<sizeof(text)/sizeof(text[0]); ++i) {
2727        l=strlen(text[i]);
2728        if (l>w) w=l;
2729    }
2730    w=w*FONT_WIDTH+10;
2731
2732    x = (screen_width-w)>>1; y = ((screen_height-h)>>1) + 20;
2733    draw_filled_round_rect(x, y, x+w, y+h, MAKE_COLOR(COLOR_RED, COLOR_RED));
2734    for (i=0; i<sizeof(text)/sizeof(text[0]); ++i) {
2735        draw_string(x+((w-strlen(text[i])*FONT_WIDTH)>>1), y+i*FONT_HEIGHT+4, text[i], cl);
2736    }
2737    if(logo){
2738      int pos;
2739      int mx=0;
2740      int my=0;
2741      int offset_x = (screen_width-150)>>1;
2742      int offset_y = ((screen_height-84)>>1) - 42;
2743      const color color_lookup[8] = {COLOR_BLACK,
2744                                                                        COLOR_SPLASH_RED/*0x2E redish*/,
2745                                                                        COLOR_RED,
2746                                                                        COLOR_GREY /*0x3D*/,
2747                                                                        COLOR_SPLASH_GREY /*0x1F*/,
2748                                                                        COLOR_SPLASH_PINK /*0x21 pinkish*/,
2749                                                                        COLOR_TRANSPARENT /*0x00*/,
2750                                                                        COLOR_WHITE /*0x11*/};
2751      for(pos=0; pos<logo_size; pos++){
2752          char data = logo[pos];
2753          color c = color_lookup[(data>>5) & 0x07];
2754          for(i=0; i<(data&0x1F)+1; i++){
2755              if (c!=0x00){
2756                  draw_pixel(offset_x+mx,offset_y+my,c);
2757              }
2758              if (mx==149){
2759                  mx=0;
2760                  my++;
2761              }else{
2762                  mx++;
2763              }     
2764          }
2765      }
2766    }
2767}
2768
2769//-------------------------------------------------------------------
2770void gui_draw_fselect(int arg) {
2771    gui_fselect_init(LANG_STR_FILE_BROWSER, "A", NULL);
2772}
2773
2774//-------------------------------------------------------------------
2775static void gui_load_script_selected(const char *fn) {
2776    if (fn)
2777        script_load(fn, 1);
2778}
2779void gui_load_script(int arg) {
2780    DIR   *d;
2781    char  *path="A/CHDK/SCRIPTS";
2782
2783    // if exists "A/CHDK/SCRIPTS" go into
2784    d=opendir(path);
2785    if (d) {
2786        closedir(d);
2787    } else {
2788        path="A";
2789    }
2790
2791    gui_fselect_init(LANG_STR_SELECT_SCRIPT_FILE, path, gui_load_script_selected);
2792}
2793
2794void gui_load_script_default(int arg) {
2795    script_load(conf.script_file, 0);
2796    if (conf.script_param_save) {
2797        save_params_values(1);
2798    }
2799}
2800
2801
2802//-------------------------------------------------------------------
2803static void gui_grid_lines_load_selected(const char *fn) {
2804    if (fn)
2805        grid_lines_load(fn);
2806}
2807void gui_grid_lines_load(int arg) {
2808    DIR   *d;
2809    char  *path="A/CHDK/GRIDS";
2810
2811    // if exists "A/CHDK/GRIDS" go into
2812    d=opendir(path);
2813    if (d) {
2814        closedir(d);
2815    } else {
2816        path="A";
2817    }
2818
2819    gui_fselect_init(LANG_STR_SELECT_GRID_FILE, path, gui_grid_lines_load_selected);
2820}
2821
2822//-------------------------------------------------------------------
2823void gui_draw_osd_le(int arg) {
2824    gui_mode = GUI_MODE_OSD;
2825    gui_osd_init();
2826}
2827
2828//-------------------------------------------------------------------
2829#ifdef OPT_TEXTREADER
2830static void gui_draw_read_selected(const char *fn) {
2831    if (fn) {
2832        if (!rbf_load(conf.reader_rbf_file))
2833            rbf_load_from_8x16(current_font);
2834        rbf_set_codepage(conf.reader_codepage);
2835        gui_mode = GUI_MODE_READ;
2836        gui_read_init(fn);
2837    }
2838}
2839void gui_draw_read(int arg) {
2840    DIR   *d;
2841    char  *path="A/CHDK/BOOKS";
2842
2843    // if exists "A/CHDK/BOOKS" go into
2844    d=opendir(path);
2845    if (d) {
2846        closedir(d);
2847    } else {
2848        path="A";
2849    }
2850    gui_fselect_init(LANG_STR_SELECT_TEXT_FILE, path, gui_draw_read_selected);
2851}
2852
2853//-------------------------------------------------------------------
2854void gui_draw_read_last(int arg) {
2855    int fd;
2856   
2857    fd = open(conf.reader_file, O_RDONLY, 0777);
2858    if (fd >= 0) {
2859        close(fd);
2860        gui_draw_read_selected(conf.reader_file);
2861    } else {
2862        gui_draw_read(arg);
2863    }
2864}
2865#endif
2866
2867//-------------------------------------------------------------------
2868void gui_menuproc_mkbootdisk(int arg) {
2869    mark_filesystem_bootable();
2870}
2871
2872#ifdef OPT_EDGEOVERLAY
2873static void gui_load_edge_selected( const char* fn ) {
2874    if( fn )
2875        load_edge_overlay(fn);
2876}
2877
2878void gui_menuproc_edge_save(int arg) {
2879    save_edge_overlay();
2880}
2881
2882void gui_menuproc_edge_load(int arg) {
2883    DIR   *d;
2884    char  *path = EDGE_SAVE_DIR;
2885    const char* fn;
2886
2887    // if exists, go into
2888    d=opendir(path);
2889    if (d) {
2890        closedir(d);
2891    } else {
2892        path="A";
2893    }
2894
2895    gui_fselect_init(LANG_MENU_EDGE_LOAD, path, gui_load_edge_selected);
2896}
2897#endif
2898
2899//-------------------------------------------------------------------
2900#ifdef OPT_CALENDAR
2901void gui_draw_calendar(int arg) {
2902    gui_mode = GUI_MODE_CALENDAR;
2903    gui_calendar_init();
2904}
2905#endif
2906//-------------------------------------------------------------------
2907static void gui_draw_rbf_selected(const char *fn) {
2908    if (fn) {
2909        strcpy(conf.reader_rbf_file, fn);
2910    }
2911}
2912#ifdef OPT_TEXTREADER
2913void gui_draw_load_rbf(int arg) {
2914    DIR   *d;
2915    char  *path="A/CHDK/FONTS";
2916
2917    // if exists "A/CHDK/FONTS" go into
2918    d=opendir(path);
2919    if (d) {
2920        closedir(d);
2921    } else {
2922        path="A";
2923    }
2924
2925    gui_fselect_init(LANG_STR_SELECT_FONT_FILE, path, gui_draw_rbf_selected);
2926}
2927#endif
2928//-------------------------------------------------------------------
2929static void gui_draw_menu_rbf_selected(const char *fn) {
2930    if (fn) {
2931        strcpy(conf.menu_rbf_file, fn);
2932        if (!rbf_load(conf.menu_rbf_file))
2933            rbf_load_from_8x16(current_font);
2934        rbf_set_codepage(FONT_CP_WIN);
2935        gui_menu_init(NULL);
2936    }
2937}
2938void gui_draw_load_menu_rbf(int arg) {
2939    DIR   *d;
2940    char  *path="A/CHDK/FONTS";
2941
2942    // if exists "A/CHDK/FONTS" go into
2943    d=opendir(path);
2944    if (d) {
2945        closedir(d);
2946    } else {
2947        path="A";
2948    }
2949
2950    gui_fselect_init(LANG_STR_SELECT_FONT_FILE, path, gui_draw_menu_rbf_selected);
2951}
2952
2953//-------------------------------------------------------------------
2954static void gui_draw_symbol_rbf_selected(const char *fn) {
2955    if (fn) {
2956        strcpy(conf.menu_symbol_rbf_file, fn);
2957        if(!rbf_load_symbol(conf.menu_symbol_rbf_file)) conf.menu_symbol_enable=0;              //AKA
2958        gui_menu_init(NULL);
2959    }
2960}
2961void gui_draw_load_symbol_rbf(int arg) {
2962    DIR   *d;
2963    char  *path="A/CHDK/SYMBOLS";
2964
2965    // if exists "A/CHDK/FONTS" go into
2966    d=opendir(path);
2967    if (d) {
2968        closedir(d);
2969    } else {
2970        path="A";
2971    }
2972
2973    gui_fselect_init(LANG_STR_SELECT_SYMBOL_FILE, path, gui_draw_symbol_rbf_selected);
2974}
2975
2976//-------------------------------------------------------------------
2977static void gui_draw_lang_selected(const char *fn) {
2978    if (fn) {
2979        strcpy(conf.lang_file, fn);
2980        lang_load_from_file(conf.lang_file);
2981        gui_menu_init(NULL);
2982    }
2983}
2984void gui_draw_load_lang(int arg) {
2985    DIR   *d;
2986    char  *path="A/CHDK/LANG";
2987
2988    // if exists "A/CHDK/LANG" go into
2989    d=opendir(path);
2990    if (d) {
2991        closedir(d);
2992    } else {
2993        path="A";
2994    }
2995
2996    gui_fselect_init(LANG_STR_SELECT_LANG_FILE, path, gui_draw_lang_selected);
2997}
2998
2999int find_mnu(CMenu *curr_menu, int mnu, int count)
3000{
3001        int gui_menu_curr_item;
3002
3003        gui_menu_curr_item = 0;
3004        while(curr_menu->menu[gui_menu_curr_item].text) {
3005                if (curr_menu->menu[gui_menu_curr_item].text == mnu){
3006                        user_submenu_items[count] = curr_menu->menu[gui_menu_curr_item];
3007                        return 1;
3008                }
3009                if ((curr_menu->menu[gui_menu_curr_item].type & MENUITEM_MASK) == MENUITEM_SUBMENU)
3010                        if (curr_menu->menu[gui_menu_curr_item].text != LANG_MENU_USER_MENU)
3011                                if (find_mnu((CMenu*)(curr_menu->menu[gui_menu_curr_item].value), mnu, count)) return 1;
3012                gui_menu_curr_item++;
3013        }
3014        return 0;
3015}
3016
3017void user_menu_save() {
3018    int x;
3019        for (x=0; x<USER_MENU_ITEMS; x++) {
3020                /*
3021                 * First entry in user_submenu_items is reserved for the "Main Menu"
3022                 * conf.user_menu_vars only traks/saves the real user entries.
3023                 */
3024                conf.user_menu_vars[x] = user_submenu_items[x+1].text;
3025        }
3026}
3027 
3028void user_menu_restore() {
3029     int x;
3030        for (x=0; x<USER_MENU_ITEMS; x++) {
3031                /*
3032                 * First entry in user_submenu_items is reserved for the "Main Menu"
3033                 * conf.user_menu_vars only traks/saves the real user entries.
3034                 */
3035                find_mnu(&root_menu, conf.user_menu_vars[x], x+1);
3036        }
3037}
3038
3039#ifdef OPT_EDGEOVERLAY
3040static const char* gui_edge_pano_enum(int change, int arg)
3041{
3042    static const char* modes[]={ "Off", "Right", "Down", "Left", "Up", "Free"};
3043        return gui_change_simple_enum(&conf.edge_overlay_pano,change,modes,sizeof(modes)/sizeof(modes[0]));
3044}
3045#endif
3046
3047#ifdef OPT_DEBUGGING
3048
3049void gui_compare_props(int arg)
3050{
3051        #define NUM_PROPS 512
3052        // never freed, but not allocated unless prop compare is used once
3053        static int *props = NULL;
3054        char buf[64];
3055        int i;
3056        int p;
3057        int c;
3058
3059        if( props )
3060        { // we have previous data set! do a comparison
3061                c = 0;
3062                for( i = 0; i < NUM_PROPS; ++i )
3063                {
3064                        p = shooting_get_prop(i);
3065                        if( props[i] != p )
3066                        {
3067                                ++c;
3068                                sprintf(buf,"%4d is %8d was %8d",i,p,props[i]);
3069                                draw_string(16,16*c,buf,MAKE_COLOR(COLOR_BLACK,COLOR_YELLOW));
3070                        }
3071                        props[i] = p;
3072                        if( c == 12 )
3073                        {
3074                                ++c;
3075                                sprintf(buf,"%s","Waiting 15 Seconds");
3076                                draw_string(16,16*c,buf,MAKE_COLOR(COLOR_BLACK,COLOR_YELLOW));
3077                                msleep(15000);
3078                                c = 0;
3079                        }
3080                }
3081                ++c;
3082                sprintf(buf,"%s","Press <ALT> to leave");
3083                draw_string(16,16*c,buf,MAKE_COLOR(COLOR_BLACK,COLOR_YELLOW));
3084        }
3085        else
3086        {
3087        // no previous data was set so we save the data initially
3088                props = (int *)malloc(NUM_PROPS*sizeof(int));
3089                if(props) {
3090                        for( i = 0; i < NUM_PROPS; ++i )
3091                        {
3092                                props[i] = shooting_get_prop(i);
3093                        }
3094                }
3095        }
3096}
3097
3098#endif
Note: See TracBrowser for help on using the repository browser.