source: branches/juciphox/core/gui.c @ 479

Revision 479, 112.2 KB checked in by phyrephox, 5 years ago (diff)

+ added taskviewer by reyalp http://chdk.setepontos.com/index.php/topic,2110.msg19622.html#msg19622
+ added Fishpeppers Boot Logo from here: http://chdk.setepontos.com/index.php/topic,2122.0.html
+ raw subtract for filebrowser by reyalp - http://chdk.setepontos.com/index.php/topic,2099.msg19362.html#msg19362

  • makefile changes:

added several docs in the /docs dir, these are "catted" together during compilation -> one big readme file's gonna be put into the zip. Also includes camera specific notes, if existing (placeholders for now) (thx for helping with this, Hacki).

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