source: trunk/core/gui.c @ 884

Revision 884, 126.6 KB checked in by ewavr, 3 years ago (diff)

added A480 1.00B

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