source: trunk/core/gui.c @ 577

Revision 577, 114.3 KB checked in by phyrephox, 4 years ago (diff)
  • enabled sd1100/ixus80 build again

about the video_control: perhaps it is worth digging out this old thread to check for ewavrs "2nd" way: http://chdk.setepontos.com/index.php/topic,952.msg18413.html#msg18413
i just uncommented this function from cameras that are KNOWN to crash using it. we need more reports.
also: this is a dirty workaround, it just wont show the fast movie control item in the menu of the reported cams. actually it should also be uncommented from the ubasic and lua function.
(added this quickfix because of this bugreport: http://chdk.kernreaktor.org/mantis/view.php?id=90)

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