source: trunk/core/gui.c @ 613

Revision 613, 119.8 KB checked in by phyrephox, 4 years ago (diff)

+ added new feature (By PlasmaHH) - compare Propcases
Usage: go to debug menu, go to "ALT +/- debug action", set to "CmpProps?" (Compare propcases)
then in alt-mode, press the +/- button to initialize it (all current propcases are then saved)
then after you made changes in the camera (canon menu) you enter alt-mode, press +/- button - you will see all the props that have changed, until you exit alt-mode
if there are more than 12 changed propcases, after 15 seconds it will show the next entries. this is not convenient, but i couldnt come up with a better way for now.
on the other hand: it's not clever changing so many things at once (in-camera) to find out propcases. one at a time is the better solution.

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