source: trunk/core/gui.c @ 987

Revision 987, 126.9 KB checked in by reyalp, 2 years ago (diff)

make prop compare not waste memory if not used, clean up some obsolete commented code

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