source: trunk/core/gui.c @ 522

Revision 522, 110.8 KB checked in by reyalp, 5 years ago (diff)
  • Made games compile time optional. Set or unset OPT_GAME_* in root makefile.inc
  • Moved sokoban levels from static data (gui_sokoban_levels.h) to file CHDK/GAMES/SOKOBAN.LEV

See http://chdk.setepontos.com/index.php/topic,688.msg21578.html#msg21578 for details

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