source: trunk/core/gui.c @ 813

Revision 813, 126.2 KB checked in by reyalp, 4 years ago (diff)

jpeg quality override from ADamb, allows "super fine" on sx200. http://chdk.setepontos.com/index.php/topic,3994.msg40880.html#msg40880

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