source: trunk/core/gui.c @ 551

Revision 551, 113.4 KB checked in by phyrephox, 5 years ago (diff)

+ added feature: in bracketing mode you now have the option to add a suffix to the raw filename, so that later you can easily identifiy the raws that were created during bracketing. it is disabled at default, and can be enabled in the bracketing submenu (or should it be moved to the raw submenu?). idea & patch by rr807 in the german forum, see http://www.wirklemms.de/chdk/forum/viewtopic.php?p=4482#4482 & http://chdk.kernreaktor.org/mantis/view.php?id=86. btw if you enable this, it is likely that your raw files cant be seen by the PC anymore when you connect your cam via usb cable to it, so use your cardreader (also note that dng4-ps will not find the corresponding jpgs!)
+ added compiler info to buildinfo (changed all lang files accordingly). shows the compiler version - found in PlasmaHHs diff @ http://plasmahh.projectiwear.org/chdk.html (rest will follow soon, need PlasmaHHs help though)
+ added option to show temperature in fahrenheit (up to now it was coupled with time format) http://chdk.kernreaktor.org/mantis/view.php?id=34

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