source: trunk/core/gui.c @ 576

Revision 576, 114.2 KB checked in by phyrephox, 5 years ago (diff)

+ added preliminary support for the g9 100g (and 100f) - see http://chdk.setepontos.com/index.php/topic,2342.msg24443.html#msg24443
comment: needs the other firmwares as well
todo: fix the ixus80 / compiler isse, add a590, up the version to 0.7.9 - fix more bugs, release 0.8.0 RC, get things tested and fixed - make release party for 0.8.0!

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