source: trunk/core/gui.c @ 999

Revision 999, 119.6 KB checked in by reyalp, 3 years ago (diff)

fix compile waring from r988

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