source: trunk/core/gui.c @ 531

Revision 531, 111.6 KB checked in by phyrephox, 5 years ago (diff)
  • increased version number to reflect for latest changes from previous revisions

+ added zoom override. first installment allows you to set a specific zoom value (on s3is for example between 0 and 128, on a620 between 0 and 8) that will be set upon starting the cam in record mode. Extra Photo Operations -> Zoom Override. You can disable and enable it there (default: off), also you can set the startup behaviour (there isnt much working right now :D). In the future: Not only set the zoom steps (in accurate int) but maybe set it using mm & factor (much like the shutter override menu stuff to allow for easing setting using "mnemonics"). Also will implement ZOOM BRACKETING. could be done via script, but then again everything could be done via script ;) Also i am wondering if i should focus after zooming. Also the zoom override should work like this, that no matter what value of zoom you set using the zoom lever, before each pic is taken the zoom will be set to the value you specified in the menu (much like shutter & aperture override). Also maybe implement the feature so that it remembers the actual zoom value you set (via lever/button) before shutting off the cam - and restore it when you power it on again!?
This feature works a) as somehow a "C" (custom mode in which you can save a few settings that will be remembered even when you shut off the cam) mode for cameras that dont have it and b) for studio photogs or other situations where you need the zoom in a fixed value over a long period of time. Noticed a bug: when you use this feature to zet zoom upon startup, you cant zoom out using the zoomlever, unless you zoom out before - i guess it is because the camera thinks you are still in wide (zoom 0). i guess one can fix that, dunno how though (yet).

+ added czech language file

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