source: trunk/core/gui.c @ 533

Revision 533, 111.7 KB checked in by reyalp, 5 years ago (diff)

quickfix http://chdk.setepontos.com/index.php/topic,2426.0.html

zoom override is temporarily disabled

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