source: trunk/core/gui.c @ 321

Revision 321, 80.1 KB checked in by fingalo, 5 years ago (diff)

+Added Ixus950sd850 from whoever's work
+Added user menu option for instant display on ALT

User menu. In OSD parameters.
To the user menu you can copy other menuitems to build your favorite menu. (Up to 10 entries)

  • User Menu Enable 'Off'.

User Menu not active.

  • User Menu Enable 'Edit'.

Goto to the User Menu and position on the line where you like to add entries.
Now just go to the menuitem (anywhere) you like to copy. Press FUNC/ERASE/SHOOT_HALF. It is now copied to usermenu (and you can select another and press FUNC/ERASE/SHOOT_HALF.
Pressing FUNC/ERASE/SHOOT_HALF (and 'Edit' mode) while in the User Menu will erase the menu item.

  • User Menu Enable 'On'.

Will replace the 'main menu' and use the 'user menu' as your first menu in ALT. Last entry is jump to Main Menu.

  • User Menu Enable 'On Direct'.

Will display the 'User Menu' as soon as you press ALT.
Pressing MENU now will display normal menu and now the 'normal' menu sequence follow. new

NOTE:
As cameras have different keyboards I used icz's proposal for the add key:
SHOOT_HALF for the following cameras:
ixus700_sd500, ixus800_sd700, a560, ixus850_sd800, ixus70_sd1000, ixus950_sd850
FUNC / ERASE for the rest.

Line 
1#include "stdlib.h"
2#include "platform.h"
3#include "core.h"
4#include "keyboard.h"
5#include "conf.h"
6#include "ubasic.h"
7#include "font.h"
8#include "lang.h"
9#include "gui.h"
10#include "gui_lang.h"
11#include "gui_draw.h"
12#include "gui_menu.h"
13#include "gui_palette.h"
14#include "gui_mbox.h"
15#include "gui_mpopup.h"
16#include "gui_reversi.h"
17#include "gui_sokoban.h"
18#include "gui_debug.h"
19#include "gui_fselect.h"
20#include "gui_batt.h"
21#include "gui_space.h"
22#include "gui_osd.h"
23#include "gui_read.h"
24#include "gui_calendar.h"
25#include "gui_bench.h"
26#include "gui_grid.h"
27#include "histogram.h"
28#include "script.h"
29#include "motion_detector.h"
30#include "raw.h"
31
32//-------------------------------------------------------------------
33
34#define OPTIONS_AUTOSAVE
35#define SPLASH_TIME               20
36
37//shortcuts
38//------------------------------------------------------------------
39// #define KEY_NONE (KEY_DUMMY+1)
40
41#if   defined(CAMERA_ixus700_sd500) || defined(CAMERA_ixus800_sd700) || defined(CAMERA_ixus65_sd630) || defined(CAMERA_a560) || defined(CAMERA_ixus850_sd800) || defined (CAMERA_ixus70_sd1000) || defined (CAMERA_ixus950_sd850) || defined(CAMERA_ixus55_sd450)
42//Alt mode
43 #define SHORTCUT_TOGGLE_RAW          KEY_DISPLAY
44 #define SHORTCUT_MF_TOGGLE           KEY_UP
45//Half press shoot button   
46 #define SHORTCUT_TOGGLE_HISTO        KEY_DOWN
47 #define SHORTCUT_TOGGLE_ZEBRA        KEY_MENU
48 #define SHORTCUT_TOGGLE_OSD          KEY_RIGHT
49//Alt mode & Manual mode   
50 #define SHORTCUT_SET_INFINITY        KEY_DISPLAY
51 #define SHORTCUT_SET_HYPERFOCAL      KEY_DOWN
52 
53#elif defined(CAMERA_g7) 
54//Alt mode
55 #define SHORTCUT_TOGGLE_RAW          KEY_ERASE
56//Half press shoot button   
57 #define SHORTCUT_TOGGLE_HISTO        KEY_DOWN
58 #define SHORTCUT_TOGGLE_ZEBRA        KEY_LEFT
59 #define SHORTCUT_TOGGLE_OSD          KEY_RIGHT
60//Alt mode & Manual mode 
61 #define SHORTCUT_SET_INFINITY        KEY_UP
62 #define SHORTCUT_SET_HYPERFOCAL      KEY_DOWN
63
64#elif defined(CAMERA_a460)
65//Alt mode
66 #define SHORTCUT_TOGGLE_RAW      KEY_DISPLAY
67 #define SHORTCUT_MF_TOGGLE       KEY_UP
68//Half press shoot button
69 #define SHORTCUT_TOGGLE_HISTO    KEY_UP
70 #define SHORTCUT_TOGGLE_ZEBRA    KEY_LEFT
71 #define SHORTCUT_TOGGLE_OSD      KEY_RIGHT
72//Alt mode & Manual mode 
73// #define SHORTCUT_SET_INFINITY    KEY_DISPLAY  // KEY_DISPLAY used for gui_subj_dist_override_koef_enum; KEY_LEFT/KEY_RIGHT used for gui_subj_dist_override_value_enum (because of no separate ZOOM_IN/OUT)
74 #define SHORTCUT_SET_HYPERFOCAL  KEY_DOWN
75
76#else
77
78//Alt mode
79 #define SHORTCUT_TOGGLE_RAW          KEY_ERASE
80//Half press shoot button   
81 #define SHORTCUT_TOGGLE_HISTO        KEY_UP
82 #define SHORTCUT_TOGGLE_ZEBRA        KEY_LEFT
83 #define SHORTCUT_TOGGLE_OSD          KEY_RIGHT
84//Alt mode & Manual mode 
85 #define SHORTCUT_SET_INFINITY        KEY_UP
86 #define SHORTCUT_SET_HYPERFOCAL      KEY_DOWN
87#endif
88
89
90// forward declarations
91//-------------------------------------------------------------------
92extern void dump_memory();
93
94static void gui_draw_osd();
95static void gui_draw_splash();
96void user_menu_save();
97void user_menu_restore();
98// Menu procs
99//-------------------------------------------------------------------
100static void gui_show_build_info(int arg);
101static void gui_show_memory_info(int arg);
102static void gui_draw_palette(int arg);
103static void gui_draw_reversi(int arg);
104static void gui_draw_sokoban(int arg);
105static void gui_draw_debug(int arg);
106static void gui_draw_bench(int arg);
107static void gui_draw_fselect(int arg);
108static void gui_draw_osd_le(int arg);
109static void gui_load_script(int arg);
110static void gui_draw_read(int arg);
111static void gui_draw_read_last(int arg);
112static void gui_draw_load_menu_rbf(int arg);
113static void gui_draw_load_rbf(int arg);
114static void gui_draw_calendar(int arg);
115static void gui_draw_load_lang(int arg);
116static void gui_menuproc_mkbootdisk(int arg);
117#ifndef OPTIONS_AUTOSAVE
118static void gui_menuproc_save(int arg);
119#endif
120static void gui_menuproc_reset(int arg);
121static void gui_grid_lines_load(int arg);
122static void gui_raw_develop(int arg);
123static void gui_menuproc_break_card(int arg);
124static void gui_menuproc_swap_patitons(int arg);
125static const char* gui_histo_show_enum(int change, int arg);
126static const char* gui_histo_mode_enum(int change, int arg);
127static const char* gui_histo_layout_enum(int change, int arg);
128static const char* gui_zebra_mode_enum(int change, int arg);
129static const char* gui_zebra_draw_osd_enum(int change, int arg);
130static const char* gui_font_enum(int change, int arg);
131static const char* gui_raw_prefix_enum(int change, int arg);
132static const char* gui_raw_ext_enum(int change, int arg);
133static const char* gui_raw_nr_enum(int change, int arg);
134static const char* gui_reader_codepage_enum(int change, int arg);
135static const char* gui_zoom_value_enum(int change, int arg);
136static const char* gui_show_values_enum(int change, int arg);
137static const char* gui_dof_show_value_enum(int change, int arg);
138#if defined(CAMERA_s2is) || defined(CAMERA_s3is) || defined(CAMERA_g7)
139static const char* gui_alt_mode_button_enum(int change, int arg);
140#endif
141static const char* gui_alt_power_enum(int change, int arg);
142static const char* gui_video_mode_enum(int change, int arg);
143static const char* gui_video_bitrate_enum(int change, int arg);
144static const char* gui_tv_bracket_values_enum(int change, int arg);
145static const char* gui_av_bracket_values_enum(int change, int arg);
146static const char* gui_iso_bracket_koef_enum(int change, int arg);
147static const char* gui_subj_dist_bracket_koef_enum(int change, int arg);
148static const char* gui_bracket_type_enum(int change, int arg);
149static const char* gui_av_override_enum(int change, int arg);
150static const char* gui_iso_override_koef_enum(int change, int arg);
151static const char* gui_tv_override_koef_enum(int change, int arg);
152static const char* gui_tv_override_value_enum(int change, int arg);
153static const char* gui_tv_enum_type_enum(int change, int arg);
154static const char* gui_subj_dist_override_value_enum(int change, int arg);
155static const char* gui_subj_dist_override_koef_enum(int change, int arg);
156static const char* gui_tv_exposure_order_enum(int change, int arg);
157static const char* gui_av_exposure_order_enum(int change, int arg);
158static const char* gui_iso_exposure_order_enum(int change, int arg);
159static const char* gui_nd_filter_state_enum(int change, int arg);
160//static const char* gui_tv_enum(int change, int arg);
161const char* gui_user_menu_show_enum(int change, int arg);
162
163void rinit();
164
165
166// Menu callbacks
167//-------------------------------------------------------------------
168static void cb_step_25();
169static void cb_perc();
170static void cb_volts();
171static void cb_space_perc();
172static void cb_space_mb();
173static void cb_battery_menu_change(unsigned int item);
174static void cb_zebra_restore_screen();
175static void cb_zebra_restore_osd();
176
177// Menu definition
178//-------------------------------------------------------------------
179static CMenuItem script_submenu_items_top[] = {
180    {LANG_MENU_SCRIPT_LOAD,             MENUITEM_PROC,                      (int*)gui_load_script },
181    {LANG_MENU_SCRIPT_DELAY,            MENUITEM_INT|MENUITEM_F_UNSIGNED,   &conf.script_shoot_delay },
182        // remote autostart
183        {LANG_MENU_SCRIPT_AUTOSTART,            MENUITEM_BOOL,                                          &conf.script_startup },
184
185#if !defined (CAMERA_a560) && !defined (CAMERA_a700)
186        {LANG_MENU_SCRIPT_REMOTE_ENABLE,        MENUITEM_BOOL,                                          &conf.remote_enable},
187#endif
188    {LANG_MENU_SCRIPT_CURRENT,          MENUITEM_SEPARATOR },
189    {(int)script_title,                 MENUITEM_TEXT },
190    {LANG_MENU_SCRIPT_PARAMS,           MENUITEM_SEPARATOR }
191};
192
193static CMenuItem script_submenu_items_bottom[] = {
194    {LANG_MENU_BACK,                    MENUITEM_UP },
195    {0}
196};
197
198static CMenuItem script_submenu_items[sizeof(script_submenu_items_top)/sizeof(script_submenu_items_top[0])+SCRIPT_NUM_PARAMS+
199                               sizeof(script_submenu_items_bottom)/sizeof(script_submenu_items_bottom[0])];
200static CMenu script_submenu = { LANG_MENU_SCRIPT_TITLE, NULL, script_submenu_items };
201
202
203static CMenuItem games_submenu_items[] = {
204    {LANG_MENU_GAMES_REVERSI,           MENUITEM_PROC,  (int*)gui_draw_reversi },
205    {LANG_MENU_GAMES_SOKOBAN,           MENUITEM_PROC,  (int*)gui_draw_sokoban },
206    {LANG_MENU_BACK,                    MENUITEM_UP },
207    {0}
208};
209static CMenu games_submenu = { LANG_MENU_GAMES_TITLE, NULL, games_submenu_items };
210
211
212static CMenuItem reader_submenu_items[] = {
213    {LANG_MENU_READ_OPEN_NEW,           MENUITEM_PROC,    (int*)gui_draw_read },
214    {LANG_MENU_READ_OPEN_LAST,          MENUITEM_PROC,    (int*)gui_draw_read_last },
215    {LANG_MENU_READ_SELECT_FONT,        MENUITEM_PROC,    (int*)gui_draw_load_rbf },
216    {LANG_MENU_READ_CODEPAGE,           MENUITEM_ENUM,    (int*)gui_reader_codepage_enum },
217    {LANG_MENU_READ_WORD_WRAP,          MENUITEM_BOOL,    &conf.reader_wrap_by_words },
218    {LANG_MENU_READ_AUTOSCROLL,         MENUITEM_BOOL,    &conf.reader_autoscroll },
219    {LANG_MENU_READ_AUTOSCROLL_DELAY,   MENUITEM_INT|MENUITEM_F_UNSIGNED|MENUITEM_F_MINMAX, &conf.reader_autoscroll_delay, MENU_MINMAX(0, 60) },
220    {LANG_MENU_BACK,                    MENUITEM_UP },
221    {0}
222};
223static CMenu reader_submenu = { LANG_MENU_READ_TITLE, NULL, reader_submenu_items };
224
225
226static CMenuItem misc_submenu_items[] = {
227    {LANG_MENU_MISC_FILE_BROWSER,       MENUITEM_PROC,    (int*)gui_draw_fselect },
228    {LANG_MENU_MISC_CALENDAR,           MENUITEM_PROC,    (int*)gui_draw_calendar },
229    {LANG_MENU_MISC_TEXT_READER,        MENUITEM_SUBMENU, (int*)&reader_submenu },
230    {LANG_MENU_MISC_GAMES,              MENUITEM_SUBMENU, (int*)&games_submenu },
231#if defined(CAMERA_a610) || defined(CAMERA_a620) || defined(CAMERA_a630) || defined(CAMERA_a640) || defined(CAMERA_a650) || defined (CAMERA_s2is) || defined (CAMERA_s3is) || defined (CAMERA_s5is)
232    {LANG_MENU_MISC_FLASHLIGHT,         MENUITEM_BOOL,    &conf.flashlight },
233#endif
234    {LANG_MENU_MISC_SHOW_SPLASH,        MENUITEM_BOOL,    &conf.splash_show },
235#if !defined(CAMERA_g7) && !defined (CAMERA_ixus700_sd500) && !defined (CAMERA_ixus800_sd700) && !defined (CAMERA_a560) && !defined (CAMERA_ixus850_sd800)  && !defined (CAMERA_ixus70_sd1000) && !defined (CAMERA_ixus950_sd850) && !defined (CAMERA_a460) && !defined(CAMERA_ixus55_sd450)
236    {LANG_MENU_MISC_ZOOM_FOR_MF,        MENUITEM_BOOL,    &conf.use_zoom_mf },
237#endif
238#if defined(CAMERA_s2is) || defined(CAMERA_s3is) || defined(CAMERA_g7)
239    {LANG_MENU_MISC_ALT_BUTTON,         MENUITEM_ENUM,    (int*)gui_alt_mode_button_enum },
240#endif
241    {LANG_MENU_MISC_DISABLE_LCD_OFF,    MENUITEM_ENUM,    (int*)gui_alt_power_enum },
242    {LANG_MENU_MISC_PALETTE,            MENUITEM_PROC,    (int*)gui_draw_palette },
243    {LANG_MENU_MISC_BUILD_INFO,         MENUITEM_PROC,    (int*)gui_show_build_info },
244    {LANG_MENU_MISC_MEMORY_INFO,        MENUITEM_PROC,    (int*)gui_show_memory_info },
245    {LANG_MENU_BACK,                    MENUITEM_UP },
246    {0},
247};
248static CMenu misc_submenu = { LANG_MENU_MISC_TITLE, NULL, misc_submenu_items };
249
250
251static CMenuItem debug_submenu_items[] = {
252    {LANG_MENU_DEBUG_SHOW_PROPCASES,    MENUITEM_BOOL,          &debug_propcase_show },
253    {LANG_MENU_DEBUG_SHOW_PARAMETER_DATA,        MENUITEM_BOOL,          &debug_pardata_show },
254    {LANG_MENU_DEBUG_PROPCASE_PAGE,     MENUITEM_INT|MENUITEM_F_UNSIGNED|MENUITEM_F_MINMAX,   &debug_propcase_page, MENU_MINMAX(0, 128) },
255    {LANG_MENU_DEBUG_SHOW_MISC_VALS,    MENUITEM_BOOL,          &debug_vals_show },
256    {LANG_MENU_DEBUG_MEMORY_BROWSER,    MENUITEM_PROC,          (int*)gui_draw_debug },
257    {LANG_MENU_DEBUG_BENCHMARK,         MENUITEM_PROC,          (int*)gui_draw_bench },
258    {LANG_MENU_DEBUG_DUMP_RAM,          MENUITEM_BOOL,          &conf.ns_enable_memdump },
259    {LANG_MENU_DEBUG_MAKE_BOOTABLE,     MENUITEM_PROC,          (int*)gui_menuproc_mkbootdisk },
260#if defined (CAMERA_MULTIPART)
261    {LANG_MENU_DEBUG_CREATE_MULTIPART , MENUITEM_PROC,          (int*)gui_menuproc_break_card },
262    {LANG_MENU_DEBUG_SWAP_PART,         MENUITEM_PROC,          (int*)gui_menuproc_swap_patitons },
263#endif
264    {LANG_MENU_BACK,                    MENUITEM_UP },
265    {0}
266};
267static CMenu debug_submenu = { LANG_MENU_DEBUG_TITLE, NULL, debug_submenu_items };
268
269
270static int voltage_step;
271static CMenuItem battery_submenu_items[] = {
272    {LANG_MENU_BATT_VOLT_MAX,           MENUITEM_INT|MENUITEM_ARG_ADDR_INC,     &conf.batt_volts_max,   (int)&voltage_step },
273    {LANG_MENU_BATT_VOLT_MIN,           MENUITEM_INT|MENUITEM_ARG_ADDR_INC,     &conf.batt_volts_min,   (int)&voltage_step },
274    {LANG_MENU_BATT_STEP_25,            MENUITEM_BOOL|MENUITEM_ARG_CALLBACK,    &conf.batt_step_25,     (int)cb_step_25 },     
275    {(int)"",                           MENUITEM_SEPARATOR },
276    {LANG_MENU_BATT_SHOW_PERCENT,       MENUITEM_BOOL|MENUITEM_ARG_CALLBACK,    &conf.batt_perc_show,   (int)cb_perc },
277    {LANG_MENU_BATT_SHOW_VOLTS,         MENUITEM_BOOL|MENUITEM_ARG_CALLBACK,    &conf.batt_volts_show,  (int)cb_volts },
278    {LANG_MENU_BATT_SHOW_ICON,          MENUITEM_BOOL,                          &conf.batt_icon_show },
279    {(int)"",                           MENUITEM_SEPARATOR },
280    {LANG_MENU_SPACE_SHOW_ICON,         MENUITEM_BOOL,                          &conf.space_icon_show },       
281    {LANG_MENU_SPACE_SHOW_PERCENT,      MENUITEM_BOOL|MENUITEM_ARG_CALLBACK,    &conf.space_perc_show,   (int)cb_space_perc },
282    {LANG_MENU_SPACE_SHOW_MB,           MENUITEM_BOOL|MENUITEM_ARG_CALLBACK,    &conf.space_mb_show,  (int)cb_space_mb },
283    {LANG_MENU_BACK,                    MENUITEM_UP },
284    {0}
285};
286static CMenu battery_submenu = { LANG_MENU_BATT_TITLE, cb_battery_menu_change, battery_submenu_items };
287
288static CMenuItem dof_submenu_items[] = {
289          {LANG_MENU_OSD_SHOW_DOF_CALC,            MENUITEM_ENUM,      (int*)gui_dof_show_value_enum },
290          {LANG_MENU_DOF_SUBJ_DIST_AS_NEAR_LIMIT,  MENUITEM_BOOL,      &conf.dof_subj_dist_as_near_limit},
291          {LANG_MENU_DOF_USE_EXIF_SUBJ_DIST,       MENUITEM_BOOL,      &conf.dof_use_exif_subj_dist},     
292          {LANG_MENU_DOF_SUBJ_DIST_IN_MISC,        MENUITEM_BOOL,      &conf.dof_subj_dist_in_misc},     
293          {LANG_MENU_DOF_NEAR_LIMIT_IN_MISC,       MENUITEM_BOOL,      &conf.dof_near_limit_in_misc},   
294      {LANG_MENU_DOF_FAR_LIMIT_IN_MISC,        MENUITEM_BOOL,                    &conf.dof_far_limit_in_misc}, 
295      {LANG_MENU_DOF_HYPERFOCAL_IN_MISC,       MENUITEM_BOOL,      &conf.dof_hyperfocal_in_misc},                               
296      {LANG_MENU_DOF_DEPTH_LIMIT_IN_MISC,      MENUITEM_BOOL,      &conf.dof_depth_in_misc},                   
297#if !defined(CAMERA_a650) && !defined(CAMERA_a720)
298      {LANG_MENU_DOF_DIST_FROM_LENS,           MENUITEM_BOOL,      &conf.dof_dist_from_lens},                   
299#endif     
300          {LANG_MENU_BACK,                         MENUITEM_UP },
301    {0}
302};
303static CMenu dof_submenu = { LANG_MENU_DOF_TITLE, /*cb_dof_menu_change*/ NULL, dof_submenu_items };
304
305static CMenuItem values_submenu_items[] = {
306          {LANG_MENU_OSD_SHOW_MISC_VALUES,           MENUITEM_ENUM,      (int*)gui_show_values_enum },
307         // {LANG_MENU_VALUES_SHOW_IN_REVIEW,   MENUITEM_BOOL,      &conf.values_show_in_review},
308          {LANG_MENU_SHOW_VALUES_IN_VIDEO,           MENUITEM_BOOL,      &conf.show_values_in_video},
309          {LANG_MENU_VALUES_SHOW_ZOOM,               MENUITEM_BOOL,      &conf.values_show_zoom},       
310          {LANG_MENU_OSD_ZOOM_VALUE,                 MENUITEM_ENUM,      (int*)gui_zoom_value_enum },   
311          {LANG_MENU_OSD_ZOOM_SCALE,                 MENUITEM_INT|MENUITEM_F_UNSIGNED|MENUITEM_F_MINMAX,  &conf.zoom_scale,   MENU_MINMAX(0, 1000)},   
312      {LANG_MENU_VALUES_SHOW_REAL_APERTURE,      MENUITEM_BOOL,      &conf.values_show_real_aperture},         
313      {LANG_MENU_VALUES_SHOW_REAL_ISO,           MENUITEM_BOOL,      &conf.values_show_real_iso},                       
314      {LANG_MENU_VALUES_SHOW_MARKET_ISO,         MENUITEM_BOOL,      &conf.values_show_market_iso},                             
315          {LANG_MENU_SHOW_ISO_ONLY_IN_AUTOISO_MODE,  MENUITEM_BOOL,          &conf.values_show_iso_only_in_autoiso_mode},                       
316      {LANG_MENU_VALUES_SHOW_EV_SETED,                   MENUITEM_BOOL,      &conf.values_show_ev_seted},
317      {LANG_MENU_VALUES_SHOW_EV_MEASURED,        MENUITEM_BOOL,          &conf.values_show_ev_measured},                               
318      {LANG_MENU_VALUES_SHOW_BV_SETED,                   MENUITEM_BOOL,      &conf.values_show_bv_seted},                                       
319      {LANG_MENU_VALUES_SHOW_BV_MEASURED,        MENUITEM_BOOL,      &conf.values_show_bv_measured},                                   
320      {LANG_MENU_VALUES_SHOW_OVEREXPOSURE,           MENUITEM_BOOL,      &conf.values_show_overexposure},       
321      {LANG_MENU_SHOW_CANON_OVEREXPOSURE,            MENUITEM_BOOL,      &conf.values_show_canon_overexposure},                                                 
322      {LANG_MENU_VALUES_SHOW_LUMINANCE,              MENUITEM_BOOL,      &conf.values_show_luminance},                                                 
323          {LANG_MENU_BACK,                           MENUITEM_UP },
324    {0}
325};
326static CMenu values_submenu = { LANG_MENU_OSD_VALUES_TITLE, /*cb_values_menu_change*/ NULL, values_submenu_items };
327
328static CMenuItem video_submenu_items[] = {
329          {LANG_MENU_VIDEO_MODE,              MENUITEM_ENUM,    (int*)gui_video_mode_enum},
330      {LANG_MENU_VIDEO_BITRATE,           MENUITEM_ENUM,    (int*)gui_video_bitrate_enum},
331      {LANG_MENU_VIDEO_QUALITY,           MENUITEM_INT|MENUITEM_F_UNSIGNED|MENUITEM_F_MINMAX,  &conf.video_quality, MENU_MINMAX(1, 99)},
332      {LANG_MENU_BACK,                    MENUITEM_UP },
333      {0}
334};
335static CMenu video_submenu = { LANG_MENU_VIDEO_PARAM_TITLE, NULL, video_submenu_items };
336
337static CMenuItem bracketing_in_continuous_submenu_items[] = {
338          {LANG_MENU_TV_BRACKET_VALUE,             MENUITEM_ENUM,    (int*)gui_tv_bracket_values_enum },
339#if !defined (CAMERA_ixus700_sd500) && !defined (CAMERA_ixus800_sd700) && !defined (CAMERA_ixus850_sd800) && !defined (CAMERA_ixus70_sd1000) && !defined (CAMERA_ixus950_sd850) && !defined (CAMERA_a560) && !defined (CAMERA_a460) && !defined(CAMERA_ixus55_sd450)
340          {LANG_MENU_AV_BRACKET_VALUE,             MENUITEM_ENUM,    (int*)gui_av_bracket_values_enum },
341#endif   
342          {LANG_MENU_ISO_BRACKET_VALUE,            MENUITEM_INT|MENUITEM_F_UNSIGNED|MENUITEM_F_MINMAX, &conf.iso_bracket_value, MENU_MINMAX(0, 100)},
343          {LANG_MENU_ISO_BRACKET_KOEF,             MENUITEM_ENUM,    (int*)gui_iso_bracket_koef_enum},
344#if !defined (CAMERA_ixus700_sd500)
345          {LANG_MENU_SUBJ_DIST_BRACKET_VALUE,      MENUITEM_INT|MENUITEM_F_UNSIGNED|MENUITEM_F_MINMAX, &conf.subj_dist_bracket_value, MENU_MINMAX(0, 100)},
346          {LANG_MENU_SUBJ_DIST_BRACKET_KOEF,       MENUITEM_ENUM,    (int*)gui_subj_dist_bracket_koef_enum},
347#endif   
348          {LANG_MENU_BRACKET_TYPE,                 MENUITEM_ENUM,    (int*)gui_bracket_type_enum },
349          {LANG_MENU_CLEAR_BRACKET_VALUES,        MENUITEM_BOOL,        (int*)&conf.clear_bracket},
350      {LANG_MENU_BACK,                         MENUITEM_UP },
351      {0}
352};
353static CMenu bracketing_in_continuous_submenu = { LANG_MENU_BRACKET_IN_CONTINUOUS_TITLE, NULL, bracketing_in_continuous_submenu_items };
354
355
356static CMenuItem exposure_submenu_items[] = {
357          {LANG_MENU_RECALC_EXPOSURE,         MENUITEM_BOOL,    &conf.recalc_exposure},
358          {LANG_MENU_TV_EXPOSURE_ORDER,       MENUITEM_ENUM,    (int*)gui_tv_exposure_order_enum},
359          {LANG_MENU_AV_EXPOSURE_ORDER,       MENUITEM_ENUM,    (int*)gui_av_exposure_order_enum},
360          {LANG_MENU_ISO_EXPOSURE_ORDER,          MENUITEM_ENUM,    (int*)gui_iso_exposure_order_enum},
361          {LANG_MENU_BACK,                    MENUITEM_UP },
362      {0}
363};
364static CMenu exposure_submenu = { LANG_MENU_EXPOSURE_TITLE, NULL, exposure_submenu_items };
365
366static CMenuItem operation_submenu_items[] = {
367          {LANG_MENU_OVERRIDE_TV_VALUE,        MENUITEM_ENUM,    (int*)gui_tv_override_value_enum},
368          {LANG_MENU_OVERRIDE_TV_KOEF,         MENUITEM_ENUM,    (int*)gui_tv_override_koef_enum},
369          {LANG_MENU_TV_ENUM_TYPE,             MENUITEM_ENUM,    (int*)gui_tv_enum_type_enum},
370#if !defined (CAMERA_ixus700_sd500) && !defined (CAMERA_ixus800_sd700) && !defined (CAMERA_a560) && !defined (CAMERA_ixus850_sd800) && !defined (CAMERA_ixus70_sd1000) && !defined (CAMERA_ixus950_sd850) && !defined (CAMERA_a460) && !defined(CAMERA_ixus55_sd450)
371          {LANG_MENU_OVERRIDE_AV_VALUE,        MENUITEM_ENUM,    (int*)gui_av_override_enum },
372#endif   
373#if defined (CAMERA_ixus700_sd500) || defined (CAMERA_ixus800_sd700) || defined (CAMERA_ixus850_sd800) || defined (CAMERA_ixus70_sd1000) || defined (CAMERA_ixus950_sd850) || defined (CAMERA_a560) || defined (CAMERA_a570) ||  defined (CAMERA_g7) || defined (CAMERA_a460) || defined(CAMERA_ixus55_sd450)
374      {LANG_MENU_OVERRIDE_ND_FILTER,       MENUITEM_ENUM,    (int*)gui_nd_filter_state_enum },
375#endif     
376          {LANG_MENU_OVERRIDE_ISO_VALUE,           MENUITEM_INT|MENUITEM_F_UNSIGNED|MENUITEM_F_MINMAX,  &conf.iso_override_value, MENU_MINMAX(0, 800)},
377          {LANG_MENU_OVERRIDE_ISO_KOEF,        MENUITEM_ENUM,    (int*)gui_iso_override_koef_enum},
378#if !defined (CAMERA_ixus700_sd500)
379      {LANG_MENU_OVERRIDE_SUBJ_DIST_VALUE, MENUITEM_ENUM,    (int*)gui_subj_dist_override_value_enum},
380          {LANG_MENU_OVERRIDE_SUBJ_DIST_KOEF,  MENUITEM_ENUM,    (int*)gui_subj_dist_override_koef_enum},
381#endif   
382          {LANG_MENU_BRACKET_IN_CONTINUOUS,        MENUITEM_SUBMENU, (int*)&bracketing_in_continuous_submenu },
383          {LANG_MENU_CLEAR_OVERRIDE_VALUES,    MENUITEM_BOOL,    (int*)&conf.clear_override},
384      //{LANG_MENU_EXPOSURE,                 MENUITEM_SUBMENU,    (int*)&exposure_submenu },
385          {LANG_MENU_BACK,                     MENUITEM_UP },
386     {0}
387};
388static CMenu operation_submenu = { LANG_MENU_OPERATION_PARAM_TITLE, NULL, operation_submenu_items };
389
390static CMenuItem grid_submenu_items[] = {
391    {LANG_MENU_SHOW_GRID,               MENUITEM_BOOL,          &conf.show_grid_lines },
392    {LANG_MENU_GRID_LOAD,               MENUITEM_PROC,          (int*)gui_grid_lines_load },
393    {LANG_MENU_GRID_CURRENT,            MENUITEM_SEPARATOR },
394    {(int)grid_title,                   MENUITEM_TEXT },
395    {(int)"",                           MENUITEM_SEPARATOR },
396    {LANG_MENU_GRID_FORCE_COLOR,        MENUITEM_BOOL,          &conf.grid_force_color },
397    {LANG_MENU_GRID_COLOR_LINE,         MENUITEM_COLOR_FG,      (int*)&conf.grid_color },
398    {LANG_MENU_GRID_COLOR_FILL,         MENUITEM_COLOR_BG,      (int*)&conf.grid_color },
399    {LANG_MENU_BACK,                    MENUITEM_UP },
400    {0}
401};
402static CMenu grid_submenu = { LANG_MENU_GRID_TITLE, NULL, grid_submenu_items };
403
404static CMenuItem visual_submenu_items[] = {
405    {LANG_MENU_VIS_LANG,                MENUITEM_PROC,      (int*)gui_draw_load_lang },
406    {LANG_MENU_VIS_OSD_FONT,            MENUITEM_ENUM,      (int*)gui_font_enum },
407    {LANG_MENU_VIS_MENU_FONT,           MENUITEM_PROC,      (int*)gui_draw_load_menu_rbf },
408    {LANG_MENU_VIS_COLORS,              MENUITEM_SEPARATOR },
409    {LANG_MENU_VIS_OSD_TEXT,            MENUITEM_COLOR_FG,  (int*)&conf.osd_color },
410    {LANG_MENU_VIS_OSD_BKG,             MENUITEM_COLOR_BG,  (int*)&conf.osd_color },
411    {LANG_MENU_VIS_OSD_WARNING,         MENUITEM_COLOR_FG,  (int*)&conf.osd_color_warn },
412    {LANG_MENU_VIS_OSD_WARNING_BKG,     MENUITEM_COLOR_BG,  (int*)&conf.osd_color_warn },
413    {LANG_MENU_VIS_HISTO,               MENUITEM_COLOR_FG,  (int*)&conf.histo_color },
414    {LANG_MENU_VIS_HISTO_BKG,           MENUITEM_COLOR_BG,  (int*)&conf.histo_color },
415    {LANG_MENU_VIS_HISTO_BORDER,        MENUITEM_COLOR_FG,  (int*)&conf.histo_color2 },
416    {LANG_MENU_VIS_HISTO_MARKERS,       MENUITEM_COLOR_BG,  (int*)&conf.histo_color2 },
417    {LANG_MENU_VIS_ZEBRA_UNDER,         MENUITEM_COLOR_BG,  (int*)&conf.zebra_color },
418    {LANG_MENU_VIS_ZEBRA_OVER,          MENUITEM_COLOR_FG,  (int*)&conf.zebra_color },
419    {LANG_MENU_VIS_BATT_ICON,           MENUITEM_COLOR_FG,  (int*)&conf.batt_icon_color },
420    {LANG_MENU_VIS_SPACE_ICON,           MENUITEM_COLOR_FG,  (int*)&conf.space_color },
421    {LANG_MENU_VIS_MENU_TEXT,           MENUITEM_COLOR_FG,  (int*)&conf.menu_color },
422    {LANG_MENU_VIS_MENU_BKG,            MENUITEM_COLOR_BG,  (int*)&conf.menu_color },
423    {LANG_MENU_VIS_READER_TEXT,         MENUITEM_COLOR_FG,  (int*)&conf.reader_color },
424    {LANG_MENU_VIS_READER_BKG,          MENUITEM_COLOR_BG,  (int*)&conf.reader_color },
425    {LANG_MENU_BACK,                    MENUITEM_UP },
426    {0}
427};
428static CMenu visual_submenu = { LANG_MENU_VIS_TITLE, NULL, visual_submenu_items };
429
430void blank_menu()
431{};
432
433static CMenuItem user_submenu_items[] = {
434        { LANG_MENU_ITEM_BLANK,      MENUITEM_PROC,  (int*)blank_menu,0},
435        { LANG_MENU_ITEM_BLANK,      MENUITEM_PROC,  (int*)blank_menu,0},
436        { LANG_MENU_ITEM_BLANK,      MENUITEM_PROC,  (int*)blank_menu,0},
437        { LANG_MENU_ITEM_BLANK,      MENUITEM_PROC,  (int*)blank_menu,0},
438        { LANG_MENU_ITEM_BLANK,      MENUITEM_PROC,  (int*)blank_menu,0},
439        { LANG_MENU_ITEM_BLANK,      MENUITEM_PROC,  (int*)blank_menu,0},
440        { LANG_MENU_ITEM_BLANK,      MENUITEM_PROC,  (int*)blank_menu,0},
441        { LANG_MENU_ITEM_BLANK,      MENUITEM_PROC,  (int*)blank_menu,0},
442        { LANG_MENU_ITEM_BLANK,      MENUITEM_PROC,  (int*)blank_menu,0},
443        { LANG_MENU_ITEM_BLANK,      MENUITEM_PROC,  (int*)blank_menu,0},
444        { LANG_MENU_MAIN_TITLE,      MENUITEM_PROC,  (int*)rinit},
445    {0}
446};
447static CMenu user_submenu = { LANG_MENU_USER_MENU, NULL, user_submenu_items };
448
449static CMenuItem osd_submenu_items[] = {
450    {LANG_MENU_OSD_SHOW,                MENUITEM_BOOL,      &conf.show_osd },
451    {LANG_MENU_USER_MENU,                       MENUITEM_SUBMENU,   (int*)&user_submenu},
452    {LANG_MENU_USER_MENU_ENABLE,                MENUITEM_ENUM,      (int*)gui_user_menu_show_enum },
453    {LANG_MENU_OSD_SHOW_STATES,         MENUITEM_BOOL,      &conf.show_state },
454   
455    {LANG_MENU_OSD_SHOW_CLOCK,          MENUITEM_BOOL,      &conf.show_clock },
456    {LANG_MENU_OSD_LAYOUT_EDITOR,       MENUITEM_PROC,      (int*)gui_draw_osd_le },
457    {LANG_MENU_OSD_VALUES,              MENUITEM_SUBMENU,   (int*)&values_submenu },
458    {LANG_MENU_OSD_DOF_CALC,            MENUITEM_SUBMENU,   (int*)&dof_submenu },
459    {LANG_MENU_OSD_BATT_PARAMS,         MENUITEM_SUBMENU,   (int*)&battery_submenu },
460    {LANG_MENU_OSD_GRID_PARAMS,         MENUITEM_SUBMENU,   (int*)&grid_submenu },
461    {LANG_MENU_OSD_SHOW_RAW_STATE,          MENUITEM_BOOL,      &conf.show_raw_state },   
462    {LANG_MENU_OSD_SHOW_REMAINING_RAW,  MENUITEM_BOOL,      &conf.show_remaining_raw },   
463    {LANG_MENU_OSD_SHOW_IN_REVIEW,      MENUITEM_BOOL,      &conf.show_osd_in_review},
464#ifndef OPTIONS_AUTOSAVE
465    {LANG_MENU_MAIN_SAVE_OPTIONS,       MENUITEM_PROC,      (int*)gui_menuproc_save },
466#endif
467    {LANG_MENU_BACK,                    MENUITEM_UP },
468    {0}
469};
470static CMenu osd_submenu = { LANG_MENU_OSD_TITLE, NULL, osd_submenu_items };
471
472static CMenuItem histo_submenu_items[] = {
473    {LANG_MENU_HISTO_SHOW,              MENUITEM_ENUM,      (int*)gui_histo_show_enum },
474    {LANG_MENU_HISTO_LAYOUT,            MENUITEM_ENUM,      (int*)gui_histo_layout_enum },
475    {LANG_MENU_HISTO_MODE,              MENUITEM_ENUM,      (int*)gui_histo_mode_enum },
476    {LANG_MENU_HISTO_EXP,               MENUITEM_BOOL,       &conf.show_overexp },
477    {LANG_MENU_HISTO_IGNORE_PEAKS,      MENUITEM_INT|MENUITEM_F_UNSIGNED|MENUITEM_F_MINMAX,  &conf.histo_ignore_boundary,   MENU_MINMAX(0, 32)},
478    {LANG_MENU_HISTO_MAGNIFY,           MENUITEM_BOOL,       &conf.histo_auto_ajust },
479    {LANG_MENU_HISTO_SHOW_EV_GRID,      MENUITEM_BOOL,       &conf.histo_show_ev_grid },
480    {LANG_MENU_BACK,                    MENUITEM_UP },
481    {0}
482};
483static CMenu histo_submenu = { LANG_MENU_HISTO_TITLE, NULL, histo_submenu_items };
484
485static CMenuItem raw_submenu_items[] = {
486    {LANG_MENU_RAW_SAVE,                MENUITEM_BOOL,      &conf.save_raw },
487    {LANG_MENU_RAW_NOISE_REDUCTION,     MENUITEM_ENUM,      (int*)gui_raw_nr_enum },
488    {LANG_MENU_RAW_FIRST_ONLY,          MENUITEM_BOOL,      &conf.raw_save_first_only },
489    {LANG_MENU_RAW_SAVE_IN_DIR,         MENUITEM_BOOL,      &conf.raw_in_dir },
490    {LANG_MENU_RAW_PREFIX,              MENUITEM_ENUM,      (int*)gui_raw_prefix_enum },
491    {LANG_MENU_RAW_EXTENSION,           MENUITEM_ENUM,      (int*)gui_raw_ext_enum },
492    {LANG_MENU_RAW_DEVELOP,             MENUITEM_PROC,      (int*)gui_raw_develop },
493    {LANG_MENU_BACK,                    MENUITEM_UP },
494    {0}
495};
496static CMenu raw_submenu = { LANG_MENU_RAW_TITLE, NULL, raw_submenu_items };
497
498
499static CMenuItem zebra_submenu_items[] = {
500    {LANG_MENU_ZEBRA_DRAW,              MENUITEM_BOOL,                            &conf.zebra_draw },
501    {LANG_MENU_ZEBRA_MODE,              MENUITEM_ENUM,                            (int*)gui_zebra_mode_enum },
502    {LANG_MENU_ZEBRA_UNDER,             MENUITEM_INT|MENUITEM_F_UNSIGNED|MENUITEM_F_MINMAX,  &conf.zebra_under,   MENU_MINMAX(0, 32)},
503    {LANG_MENU_ZEBRA_OVER,              MENUITEM_INT|MENUITEM_F_UNSIGNED|MENUITEM_F_MINMAX,  &conf.zebra_over,    MENU_MINMAX(0, 32)},
504    {LANG_MENU_ZEBRA_RESTORE_SCREEN,    MENUITEM_BOOL|MENUITEM_ARG_CALLBACK,      &conf.zebra_restore_screen,     (int)cb_zebra_restore_screen },
505    {LANG_MENU_ZEBRA_RESTORE_OSD,       MENUITEM_BOOL|MENUITEM_ARG_CALLBACK,      &conf.zebra_restore_osd,        (int)cb_zebra_restore_osd },
506    {LANG_MENU_ZEBRA_DRAW_OVER,         MENUITEM_ENUM,                            (int*)gui_zebra_draw_osd_enum },
507    {LANG_MENU_ZEBRA_MULTICHANNEL,      MENUITEM_BOOL,                            &conf.zebra_multichannel},   
508    {LANG_MENU_BACK,                    MENUITEM_UP },
509    {0}
510};
511static CMenu zebra_submenu = { LANG_MENU_ZEBRA_TITLE, NULL, zebra_submenu_items };
512
513
514static CMenuItem root_menu_items[] = {
515    {LANG_MENU_OPERATION_PARAM,         MENUITEM_SUBMENU,   (int*)&operation_submenu },
516    {LANG_MENU_MAIN_OSD_PARAM,          MENUITEM_SUBMENU,   (int*)&osd_submenu },
517#if !defined (CAMERA_a720) && !defined(CAMERA_a650)
518    {LANG_MENU_VIDEO_PARAM,             MENUITEM_SUBMENU,   (int*)&video_submenu },
519#endif
520    {LANG_MENU_MAIN_RAW_PARAM,          MENUITEM_SUBMENU,   (int*)&raw_submenu },
521    {LANG_MENU_MAIN_HISTO_PARAM,        MENUITEM_SUBMENU,   (int*)&histo_submenu },
522    {LANG_MENU_MAIN_ZEBRA_PARAM,        MENUITEM_SUBMENU,   (int*)&zebra_submenu },
523    {LANG_MENU_MAIN_SCRIPT_PARAM,       MENUITEM_SUBMENU,   (int*)&script_submenu },
524    {LANG_MENU_MAIN_VISUAL_PARAM,       MENUITEM_SUBMENU,   (int*)&visual_submenu },
525    {LANG_MENU_MAIN_MISC,               MENUITEM_SUBMENU,   (int*)&misc_submenu },
526    {LANG_MENU_MAIN_DEBUG,              MENUITEM_SUBMENU,   (int*)&debug_submenu },
527    {LANG_MENU_MAIN_RESET_OPTIONS,      MENUITEM_PROC,      (int*)gui_menuproc_reset },
528#ifndef OPTIONS_AUTOSAVE
529    {LANG_MENU_MAIN_SAVE_OPTIONS,       MENUITEM_PROC,      (int*)gui_menuproc_save },
530#endif
531    {0}
532};
533
534static CMenu root_menu = { LANG_MENU_MAIN_TITLE, NULL, root_menu_items };
535static int gui_user_menu_flag;
536
537void rinit(){
538        gui_menu_init(&root_menu);
539}
540
541static CMenuItem blank_menu_item = { LANG_MENU_ITEM_BLANK, MENUITEM_PROC, (int*)blank_menu,0};
542
543void add_user_menu(CMenuItem curr_menu_item, int* gui_menu_add_item, int del) {
544        if (*gui_menu_add_item<10){
545                if (del) {
546                        user_submenu_items[*gui_menu_add_item] = blank_menu_item;
547                } else {
548                        user_submenu_items[*gui_menu_add_item] = curr_menu_item;
549                        *gui_menu_add_item += 1;
550                }       
551        }
552}
553
554//-------------------------------------------------------------------
555void cb_step_25() {
556    voltage_step = (conf.batt_step_25)?25:1;
557}
558
559void cb_perc() {
560    conf.batt_volts_show=0;
561}
562
563void cb_volts() {
564    conf.batt_perc_show=0;
565}
566
567void cb_space_perc() {
568    conf.space_mb_show=0;
569}
570
571void cb_space_mb() {
572    conf.space_perc_show=0;
573}
574
575void cb_battery_menu_change(unsigned int item) {
576    switch (item) {
577        case 0: //Voltage MAX
578            if (conf.batt_volts_max<conf.batt_volts_min+25) {
579                conf.batt_volts_min = conf.batt_volts_max-25;
580            }
581            break;
582        case 1: //Voltage MIN
583            if (conf.batt_volts_min>conf.batt_volts_max-25) {
584                conf.batt_volts_max = conf.batt_volts_min+25;
585            }
586            break;
587        default:
588            break;
589    }
590}
591
592void cb_zebra_restore_screen() {
593    if (!conf.zebra_restore_screen)
594        conf.zebra_restore_osd = 0;
595}
596
597void cb_zebra_restore_osd() {
598    if (conf.zebra_restore_osd)
599        conf.zebra_restore_screen = 1;
600}
601
602//-------------------------------------------------------------------
603const char* gui_histo_mode_enum(int change, int arg) {
604    static const char* modes[]={ "Linear", "Log" };
605
606    conf.histo_mode+=change;
607    if (conf.histo_mode<0)
608        conf.histo_mode=(sizeof(modes)/sizeof(modes[0]))-1;
609    else if (conf.histo_mode>=(sizeof(modes)/sizeof(modes[0])))
610        conf.histo_mode=0;
611
612    histogram_set_mode(conf.histo_mode);
613
614    return modes[conf.histo_mode];
615}
616
617//-------------------------------------------------------------------
618const char* gui_histo_layout_enum(int change, int arg) {
619    static const char* modes[]={ "RGB", "Y", "RGB Y",  "R G B", "RGB all", "Y all", "Blend", "Blend Y"};
620
621    conf.histo_layout+=change;
622    if (conf.histo_layout<0)
623        conf.histo_layout=(sizeof(modes)/sizeof(modes[0]))-1;
624    else if (conf.histo_layout>=(sizeof(modes)/sizeof(modes[0])))
625        conf.histo_layout=0;
626
627    if (conf.histo_layout==OSD_HISTO_LAYOUT_Y || conf.histo_layout==OSD_HISTO_LAYOUT_Y_argb) {
628        histogram_set_main(HISTO_Y);
629    } else {
630        histogram_set_main(HISTO_RGB);
631    }
632
633    return modes[conf.histo_layout];
634}
635
636//-------------------------------------------------------------------
637const char* gui_font_enum(int change, int arg) {
638    static const char* fonts[]={ "Win1250", "Win1251", "Win1252", "Win1254", "Win1257"};
639
640    conf.font_cp+=change;
641    if (conf.font_cp<0)
642        conf.font_cp=(sizeof(fonts)/sizeof(fonts[0]))-1;
643    else if (conf.font_cp>=(sizeof(fonts)/sizeof(fonts[0])))
644        conf.font_cp=0;
645
646    if (change != 0) {
647        font_set(conf.font_cp);
648        if (!rbf_load(conf.menu_rbf_file))
649            rbf_load_from_8x16(current_font);
650        rbf_set_codepage(FONT_CP_WIN);
651        gui_menu_init(NULL);
652    }
653
654    return fonts[conf.font_cp];
655}
656
657//-------------------------------------------------------------------
658const char* gui_raw_prefix_enum(int change, int arg) {
659    static const char* prefixes[]={ "IMG_", "CRW_", "SND_"};
660
661    conf.raw_prefix+=change;
662    if (conf.raw_prefix<0)
663        conf.raw_prefix=(sizeof(prefixes)/sizeof(prefixes[0]))-1;
664    else if (conf.raw_prefix>=(sizeof(prefixes)/sizeof(prefixes[0])))
665        conf.raw_prefix=0;
666
667    return prefixes[conf.raw_prefix];
668}
669
670//-------------------------------------------------------------------
671const char* gui_raw_ext_enum(int change, int arg) {
672    static const char* exts[]={ ".JPG", ".CRW", ".CR2", ".THM", ".WAV"};
673
674    conf.raw_ext+=change;
675    if (conf.raw_ext<0)
676        conf.raw_ext=(sizeof(exts)/sizeof(exts[0]))-1;
677    else if (conf.raw_ext>=(sizeof(exts)/sizeof(exts[0])))
678        conf.raw_ext=0;
679
680    return exts[conf.raw_ext];
681}
682
683//-------------------------------------------------------------------
684const char* gui_raw_nr_enum(int change, int arg) {
685    static const char* modes[]={ "Auto", "Off", "On"};
686
687    conf.raw_nr+=change;
688    if (conf.raw_nr<0)
689        conf.raw_nr=(sizeof(modes)/sizeof(modes[0]))-1;
690    else if (conf.raw_nr>=(sizeof(modes)/sizeof(modes[0])))
691        conf.raw_nr=0;
692
693    return modes[conf.raw_nr];
694}
695
696//-------------------------------------------------------------------
697const char* gui_reader_codepage_enum(int change, int arg) {
698    static const char* cps[]={ "Win1251", "DOS"};
699
700    conf.reader_codepage+=change;
701    if (conf.reader_codepage<0)
702        conf.reader_codepage=(sizeof(cps)/sizeof(cps[0]))-1;
703    else if (conf.reader_codepage>=(sizeof(cps)/sizeof(cps[0])))
704        conf.reader_codepage=0;
705
706    return cps[conf.reader_codepage];
707}
708
709//-------------------------------------------------------------------
710const char* gui_zebra_mode_enum(int change, int arg) {
711    static const char* modes[]={ "Blink 1", "Blink 2", "Blink 3", "Solid", "Zebra 1", "Zebra 2" };
712
713    conf.zebra_mode+=change;
714    if (conf.zebra_mode<0)
715        conf.zebra_mode=(sizeof(modes)/sizeof(modes[0]))-1;
716    else if (conf.zebra_mode>=(sizeof(modes)/sizeof(modes[0])))
717        conf.zebra_mode=0;
718
719    return modes[conf.zebra_mode];
720}
721
722//-------------------------------------------------------------------
723const char* gui_zebra_draw_osd_enum(int change, int arg) {
724    static const char* modes[]={ "Nothing", "Histo", "OSD" };
725
726    conf.zebra_draw_osd+=change;
727    if (conf.zebra_draw_osd<0)
728        conf.zebra_draw_osd=(sizeof(modes)/sizeof(modes[0]))-1;
729    else if (conf.zebra_draw_osd>=(sizeof(modes)/sizeof(modes[0])))
730        conf.zebra_draw_osd=0;
731
732    return modes[conf.zebra_draw_osd];
733}
734
735//-------------------------------------------------------------------
736const char* gui_zoom_value_enum(int change, int arg) {
737    static const char* modes[]={ "X", "FL", "EFL" };
738
739    conf.zoom_value+=change;
740    if (conf.zoom_value<0)
741        conf.zoom_value=(sizeof(modes)/sizeof(modes[0]))-1;
742    else if (conf.zoom_value>=(sizeof(modes)/sizeof(modes[0])))
743        conf.zoom_value=0;
744
745    return modes[conf.zoom_value];
746}
747
748const char* gui_show_values_enum(int change, int arg) {
749    static const char* modes[]={ "Don't", "Always", "Shoot" };
750
751    conf.show_values+=change;
752    if (conf.show_values<0)
753        conf.show_values=(sizeof(modes)/sizeof(modes[0]))-1;
754    else if (conf.show_values>=(sizeof(modes)/sizeof(modes[0])))
755        conf.show_values=0;
756
757    return modes[conf.show_values];
758}
759
760const char* gui_nd_filter_state_enum(int change, int arg) {
761    static const char* modes[]={ "Off", "In", "Out" };
762
763    conf.nd_filter_state+=change;
764    if (conf.nd_filter_state<0)
765        conf.nd_filter_state=(sizeof(modes)/sizeof(modes[0]))-1;
766    else if (conf.nd_filter_state>=(sizeof(modes)/sizeof(modes[0])))
767        conf.nd_filter_state=0;
768
769    return modes[conf.nd_filter_state];
770}
771
772
773
774const char* gui_dof_show_value_enum(int change, int arg) {
775    static const char* modes[]={ "Don't", "Separate", "In Misc" };
776
777    conf.show_dof+=change;
778    if (conf.show_dof<0)
779        conf.show_dof=(sizeof(modes)/sizeof(modes[0]))-1;
780    else if (conf.show_dof>=(sizeof(modes)/sizeof(modes[0])))
781        conf.show_dof=0;
782
783    return modes[conf.show_dof];
784}
785
786
787const char* gui_histo_show_enum(int change, int arg) {
788    static const char* modes[]={ "Don't", "Always", "Shoot" };
789
790    conf.show_histo+=change;
791    if (conf.show_histo<0)
792        conf.show_histo=(sizeof(modes)/sizeof(modes[0]))-1;
793    else if (conf.show_histo>=(sizeof(modes)/sizeof(modes[0])))
794        conf.show_histo=0;
795
796    return modes[conf.show_histo];
797}
798
799//-------------------------------------------------------------------
800#if defined(CAMERA_s2is) || defined(CAMERA_s3is) || defined(CAMERA_g7)
801const char* gui_alt_mode_button_enum(int change, int arg) {
802#if defined(CAMERA_s2is) || defined(CAMERA_s3is)
803    static const char* names[]={ "Shrtcut", "Flash", "Timer", "ISO", "Video" };
804    static const int keys[]={ KEY_PRINT, KEY_FLASH, KEY_TIMER, KEY_ISO, KEY_VIDEO };
805#else
806    static const char* names[]={ "Print", "FE"};
807    static const int keys[]={ KEY_PRINT, KEY_MICROPHONE };
808#endif
809    int i;
810
811    for (i=0; i<sizeof(names)/sizeof(names[0]); ++i) {
812        if (conf.alt_mode_button==keys[i]) {
813            break;
814        }
815    }
816
817    i+=change;
818    if (i<0)
819        i=(sizeof(names)/sizeof(names[0]))-1;
820    else if (i>=(sizeof(names)/sizeof(names[0])))
821        i=0;
822
823    conf.alt_mode_button = keys[i];
824    kbd_set_alt_mode_key_mask(conf.alt_mode_button);
825    return names[i];
826}
827#endif
828
829//-------------------------------------------------------------------
830const char* gui_alt_power_enum(int change, int arg) {
831    static const char* modes[]={ "No", "Alt", "Script" };
832
833    conf.alt_prevent_shutdown+=change;
834    if (conf.alt_prevent_shutdown<0)
835        conf.alt_prevent_shutdown=(sizeof(modes)/sizeof(modes[0]))-1;
836    else if (conf.alt_prevent_shutdown>=(sizeof(modes)/sizeof(modes[0])))
837        conf.alt_prevent_shutdown=0;
838
839    return modes[conf.alt_prevent_shutdown];
840}
841const char* gui_video_mode_enum(int change, int arg) {
842    static const char* modes[]={ "Bitrate", "Quality"};
843
844    conf.video_mode+=change;
845    if (conf.video_mode<0)
846        conf.video_mode=(sizeof(modes)/sizeof(modes[0]))-1;
847    else if (conf.video_mode>=(sizeof(modes)/sizeof(modes[0])))
848        conf.video_mode=0;
849
850    return modes[conf.video_mode];
851}
852
853//-------------------------------------------------------------------
854const char* gui_video_bitrate_enum(int change, int arg) {
855    static const char* modes[]={ "0.25x", "0.5x","0.75x", "1x", "1.25x", "1.5x", "1.75x", "2x", "2.5x", "3x"};
856
857    conf.video_bitrate+=change;
858    if (conf.video_bitrate<0)
859        conf.video_bitrate=sizeof(modes)/sizeof(modes[0])-1;
860    else if (conf.video_bitrate>=(sizeof(modes)/sizeof(modes[0])))
861        conf.video_bitrate=0;
862
863    shooting_video_bitrate_change(conf.video_bitrate);
864
865    return modes[conf.video_bitrate];
866}
867
868
869//-------------------------------------------------------------------
870const char* gui_tv_bracket_values_enum(int change, int arg) {
871    static const char* modes[]={ "Off", "1/3 EV","2/3 EV", "1 EV", "1 1/3Ev", "1 2/3Ev", "2 Ev"};
872
873    conf.tv_bracket_value+=change;
874    if (conf.tv_bracket_value<0)
875        conf.tv_bracket_value=sizeof(modes)/sizeof(modes[0])-1;
876    else if (conf.tv_bracket_value>=(sizeof(modes)/sizeof(modes[0])))
877        conf.tv_bracket_value=0;
878
879    return modes[conf.tv_bracket_value];
880}
881
882const char* gui_av_bracket_values_enum(int change, int arg) {
883    static const char* modes[]={ "Off", "1/3 EV","2/3 EV", "1 EV", "1 1/3Ev", "1 2/3Ev", "2 Ev"};
884
885    conf.av_bracket_value+=change;
886    if (conf.av_bracket_value<0)
887        conf.av_bracket_value=sizeof(modes)/sizeof(modes[0])-1;
888    else if (conf.av_bracket_value>=(sizeof(modes)/sizeof(modes[0])))
889        conf.av_bracket_value=0;
890
891    return modes[conf.av_bracket_value];
892}
893
894const char* gui_subj_dist_bracket_koef_enum(int change, int arg) {
895    static const char* modes[]={"Off", "1", "10","100","1000"};
896
897    conf.subj_dist_bracket_koef+=change;
898    if (conf.subj_dist_bracket_koef<0)
899        conf.subj_dist_bracket_koef=sizeof(modes)/sizeof(modes[0])-1;
900    else if (conf.subj_dist_bracket_koef>=(sizeof(modes)/sizeof(modes[0])))
901        conf.subj_dist_bracket_koef=0;
902   
903    return modes[conf.subj_dist_bracket_koef];
904}
905
906const char* gui_iso_bracket_koef_enum(int change, int arg) {
907    static const char* modes[]={ "Off","1", "10","100"};
908
909    conf.iso_bracket_koef+=change;
910    if (conf.iso_bracket_koef<0)
911        conf.iso_bracket_koef=sizeof(modes)/sizeof(modes[0])-1;
912    else if (conf.iso_bracket_koef>=(sizeof(modes)/sizeof(modes[0])))
913        conf.iso_bracket_koef=0;
914   
915    return modes[conf.iso_bracket_koef];
916}
917
918const char* gui_bracket_type_enum(int change, int arg) {
919    static const char* modes[]={ "+/-", "-","+"};
920
921    conf.bracket_type+=change;
922    if (conf.bracket_type<0)
923        conf.bracket_type=0;
924    else if (conf.bracket_type>=(sizeof(modes)/sizeof(modes[0])))
925        conf.bracket_type=sizeof(modes)/sizeof(modes[0])-1;
926
927    return modes[conf.bracket_type];
928}
929
930const char* gui_tv_override_koef_enum(int change, int arg) {
931    static const char* modes[]={"Off", "1/100K", "1/10000", "1/1000","1/100","1/10", "1","10","100"};
932
933    conf.tv_override_koef+=change;
934   if (conf.tv_enum_type) {
935     if (conf.tv_override_koef<0)  conf.tv_override_koef=6;
936     else if (conf.tv_override_koef>6) conf.tv_override_koef=0;
937     else if (conf.tv_override_koef==1)  conf.tv_override_koef=6;
938     else if (conf.tv_override_koef==5)  conf.tv_override_koef=0;
939     else if (conf.tv_override_koef!=0 && conf.tv_override_koef!=6) conf.tv_override_koef=6;
940     }
941   else {
942    if (conf.tv_override_koef<0)
943        conf.tv_override_koef=sizeof(modes)/sizeof(modes[0])-1;
944    else if (conf.tv_override_koef>=(sizeof(modes)/sizeof(modes[0])))
945        conf.tv_override_koef=0;
946    }
947   
948    return modes[conf.tv_override_koef];
949}
950
951const char* gui_tv_override_value_enum(int change, int arg) {
952    static const char* modes[]={"64","50.8", "40.3", "32", "25.4","20","16", "12.7", "10","8", "6.3","5","4","3.2", "2.5","2", "1.6", "1.3", "1", "0.8", "0.6", "0.5", "0.4", "0.3", "1/4", "1/5", "1/6", "1/8", "1/10", "1/13", "1/15", "1/20", "1/25", "1/30", "1/40", "1/50", "1/60", "1/80", "1/100", "1/125", "1/160", "1/200", "1/250", "1/320", "1/400", "1/500", "1/640","1/800", "1/1000", "1/1250", "1/1600","1/2000","1/2500","1/3200","1/4000", "1/5000", "1/6400", "1/8000", "1/10000", "1/12500", "1/16000", "1/20000", "1/25000", "1/32000", "1/40000", "1/50000", "1/64000","1/80000", "1/100k"};
953
954    conf.tv_override_value+=change;
955    if (conf.tv_enum_type) {
956       if (conf.tv_override_value<0) {
957          conf.tv_override_value=sizeof(modes)/sizeof(modes[0])-1;
958        }
959       else if (conf.tv_override_value>=(sizeof(modes)/sizeof(modes[0])))
960         conf.tv_override_value=0;
961       return modes[conf.tv_override_value];
962     }
963     else
964      {
965       char * buf="";   
966       if (conf.tv_override_value<0) {
967          conf.tv_override_value=100;
968        }
969       else if (conf.tv_override_value>100)  conf.tv_override_value=0;
970       sprintf(buf, "%d",  conf.tv_override_value);
971       return buf;
972      }
973}
974
975const char* gui_tv_enum_type_enum(int change, int arg) {
976    static const char* modes[]={"Factor", "Ev Step"};
977
978    conf.tv_enum_type+=change;
979    if (conf.tv_enum_type<0)
980        conf.tv_enum_type=sizeof(modes)/sizeof(modes[0])-1;
981    else if (conf.tv_enum_type>=(sizeof(modes)/sizeof(modes[0])))
982        conf.tv_enum_type=0;
983    if (change) {
984      conf.tv_override_koef=6; 
985          if (conf.tv_enum_type) 
986             conf.tv_override_value=18;
987          else conf.tv_override_value=1;
988      }
989    return modes[conf.tv_enum_type];
990}
991
992
993const char* gui_iso_override_koef_enum(int change, int arg) {
994    static const char* modes[]={ "Off","1", "10","100"};
995
996    conf.iso_override_koef+=change;
997    if (conf.iso_override_koef<0)
998        conf.iso_override_koef=0;
999    else if (conf.iso_override_koef>=(sizeof(modes)/sizeof(modes[0])))
1000        conf.iso_override_koef=sizeof(modes)/sizeof(modes[0])-1;
1001   
1002    return modes[conf.iso_override_koef];
1003}
1004
1005const char* gui_subj_dist_override_value_enum(int change, int arg) {
1006        static const int koef[] = {0, 1,10,100,1000};
1007    static char buf[8];
1008    conf.subj_dist_override_value+=(change*koef[conf.subj_dist_override_koef]);
1009    if (conf.subj_dist_override_value<0)
1010        conf.subj_dist_override_value=MAX_DIST;
1011    else if (conf.subj_dist_override_value>MAX_DIST)
1012        conf.subj_dist_override_value=0;
1013    sprintf(buf, "%d", (int)conf.subj_dist_override_value);
1014    return buf;
1015}
1016
1017
1018const char* gui_subj_dist_override_koef_enum(int change, int arg) {
1019    static const char* modes[]={ "Off","1", "10","100","1000"};
1020
1021    conf.subj_dist_override_koef+=change;
1022    if (conf.subj_dist_override_koef<0) conf.subj_dist_override_koef=0;
1023    else if (conf.subj_dist_override_koef>=(sizeof(modes)/sizeof(modes[0])))
1024        conf.subj_dist_override_koef=sizeof(modes)/sizeof(modes[0])-1;
1025   
1026    return modes[conf.subj_dist_override_koef];
1027}
1028
1029/*
1030const char* gui_tv_exposure_order_enum(int change, int arg) {
1031    static const char* modes[]={ "Off", "1","2", "3"};
1032
1033    conf.tv_exposure_order+=change;
1034    if (conf.tv_exposure_order<0)
1035        conf.tv_exposure_order=0;
1036    else if (conf.tv_exposure_order>=(sizeof(modes)/sizeof(modes[0])))
1037        conf.tv_exposure_order=sizeof(modes)/sizeof(modes[0])-1;
1038    if((conf.tv_exposure_order>0) && (conf.av_exposure_order==conf.tv_exposure_order))
1039     {
1040       conf.av_exposure_order=0;
1041     }
1042    if((conf.tv_exposure_order>0) && (conf.iso_exposure_order==conf.tv_exposure_order))
1043     {
1044       conf.iso_exposure_order=0;
1045     }
1046
1047    return modes[conf.tv_exposure_order];
1048}
1049
1050const char* gui_av_exposure_order_enum(int change, int arg) {
1051    static const char* modes[]={ "Off", "1","2", "3"};
1052
1053    conf.av_exposure_order+=change;
1054    if (conf.av_exposure_order<0)
1055        conf.av_exposure_order=0;
1056    else if (conf.av_exposure_order>=(sizeof(modes)/sizeof(modes[0])))
1057        conf.av_exposure_order=sizeof(modes)/sizeof(modes[0])-1;
1058    if((conf.av_exposure_order>0) && (conf.tv_exposure_order==conf.av_exposure_order))
1059     {
1060       conf.tv_exposure_order=0;
1061     }
1062    if((conf.av_exposure_order>0) && (conf.iso_exposure_order==conf.av_exposure_order))
1063     {
1064       conf.iso_exposure_order=0;
1065     }
1066    return modes[conf.av_exposure_order];
1067}
1068
1069const char* gui_iso_exposure_order_enum(int change, int arg) {
1070    static const char* modes[]={ "Off", "1","2", "3"};
1071
1072    conf.iso_exposure_order+=change;
1073    if (conf.iso_exposure_order<0)
1074        conf.iso_exposure_order=0;
1075    else if (conf.iso_exposure_order>=(sizeof(modes)/sizeof(modes[0])))
1076        conf.iso_exposure_order=sizeof(modes)/sizeof(modes[0])-1;
1077    if((conf.iso_exposure_order>0) && (conf.tv_exposure_order==conf.iso_exposure_order))
1078     {
1079       conf.tv_exposure_order=0;
1080     }
1081    if((conf.iso_exposure_order>0) && (conf.av_exposure_order==conf.iso_exposure_order))
1082     {
1083       conf.av_exposure_order=0;
1084     }
1085
1086    return modes[conf.iso_exposure_order];
1087}
1088*/
1089const char* gui_av_override_enum(int change, int arg) {
1090    static char buf[8];
1091    short prop_id;
1092    conf.av_override_value+=change;
1093    if (conf.av_override_value<0) conf.av_override_value=shooting_get_aperture_sizes_table_size()+6;
1094    else if (conf.av_override_value>shooting_get_aperture_sizes_table_size()+6) conf.av_override_value=0;
1095    if (conf.av_override_value == 0)  return "Off";
1096    else {
1097     short prop_id=shooting_get_aperture_from_av96(shooting_get_av96_override_value());         
1098         sprintf(buf, "%d.%02d", (int)prop_id/100, (int)prop_id%100 );
1099         return buf;
1100        }
1101}
1102
1103const char* gui_user_menu_show_enum(int change, int arg) {
1104    static const char* modes[]={ "Off", "On","On Direct", "Edit" };
1105
1106        if (conf.user_menu_enable == 3) user_menu_save();
1107
1108    conf.user_menu_enable+=change;
1109    if (conf.user_menu_enable<0)
1110        conf.user_menu_enable=(sizeof(modes)/sizeof(modes[0]))-1;
1111    else if (conf.user_menu_enable>=(sizeof(modes)/sizeof(modes[0])))
1112        conf.user_menu_enable=0;
1113
1114    return modes[conf.user_menu_enable];
1115}
1116
1117//-------------------------------------------------------------------
1118void gui_update_script_submenu() {
1119    register int p=0, i;
1120
1121    for (i=0; i<sizeof(script_submenu_items_top)/sizeof(script_submenu_items_top[0]); ++p, ++i) {
1122        script_submenu_items[p]=script_submenu_items_top[i];
1123    }
1124    for (i=0; i<SCRIPT_NUM_PARAMS; ++i) {
1125        if (script_params[i][0]) {
1126            script_submenu_items[p].text=(int)script_params[i];
1127            script_submenu_items[p].type=MENUITEM_INT;
1128            script_submenu_items[p].value=&conf.ubasic_vars[i];
1129            ++p;
1130        }
1131    }
1132    for (i=0; i<sizeof(script_submenu_items_bottom)/sizeof(script_submenu_items_bottom[0]); ++p, ++i) {
1133        script_submenu_items[p]=script_submenu_items_bottom[i];
1134    }
1135}
1136
1137//-------------------------------------------------------------------
1138
1139void raw_fselect_cb(const char * filename){
1140 struct stat st;
1141 if (!filename) return;
1142 stat((char*)filename,&st);
1143 if (st.st_size!=hook_raw_size()) return;
1144 gui_mbox_init((int)"", LANG_RAW_DEVELOP_MESSAGE, MBOX_BTN_OK|MBOX_TEXT_CENTER, NULL);
1145 raw_prepare_develop((char*)filename);
1146}
1147
1148//-------------------------------------------------------------------
1149void gui_raw_develop(int arg){
1150 int m=mode_get();
1151 gui_fselect_init(LANG_RAW_DEVELOP_SELECT_FILE, "A/DCIM", raw_fselect_cb);
1152}
1153
1154//-------------------------------------------------------------------
1155
1156#if defined (CAMERA_MULTIPART)
1157void card_break_proc(unsigned int btn){
1158 if (btn==MBOX_BTN_YES) create_partitions();
1159}
1160
1161
1162static void gui_menuproc_break_card(int arg){
1163 gui_mbox_init(LANG_WARNING, LANG_PARTITIONS_CREATE_WARNING, MBOX_BTN_YES_NO|MBOX_DEF_BTN2|MBOX_TEXT_CENTER, card_break_proc);
1164}
1165
1166
1167static void gui_menuproc_swap_patitons(int arg){
1168 if (get_part_count()<2) gui_mbox_init(LANG_ERROR, LANG_ONLY_ONE_PARTITION, MBOX_BTN_OK|MBOX_TEXT_CENTER, NULL);
1169 else swap_partitions();
1170}
1171#endif
1172
1173//-------------------------------------------------------------------
1174static volatile enum Gui_Mode gui_mode;
1175static volatile int gui_restore;
1176static volatile int gui_in_redraw;
1177static int gui_splash, gui_splash_mode;
1178static char osd_buf[32];
1179#ifdef OPTIONS_AUTOSAVE
1180static Conf old_conf;
1181#endif
1182
1183//-------------------------------------------------------------------
1184void gui_init()
1185{
1186    gui_mode = GUI_MODE_NONE;
1187    gui_restore = 0;
1188    gui_in_redraw = 0;
1189    gui_splash = (conf.splash_show)?SPLASH_TIME:0;
1190    user_menu_restore();
1191    gui_lang_init();
1192    draw_init();
1193
1194    exposition_thresh = screen_size/500;
1195    voltage_step = (conf.batt_step_25)?25:1;
1196    load_bad_pixels_list("A/CHDK/badpixel");
1197}
1198
1199//-------------------------------------------------------------------
1200enum Gui_Mode gui_get_mode() {
1201    return gui_mode;
1202}
1203
1204//-------------------------------------------------------------------
1205void gui_set_mode(enum Gui_Mode mode) {
1206    gui_mode = mode;
1207}
1208
1209//-------------------------------------------------------------------
1210void gui_force_restore() {
1211    gui_restore = gui_in_redraw;
1212}
1213
1214//-------------------------------------------------------------------
1215void gui_redraw()
1216{
1217    enum Gui_Mode gui_mode_old;
1218    static int show_script_console=0;
1219
1220    if (gui_splash) {
1221        if (gui_splash>(SPLASH_TIME-4)) {
1222            gui_draw_splash();
1223        } else if (gui_splash==1 && (mode_get()&MODE_MASK) == gui_splash_mode && (gui_mode==GUI_MODE_NONE || gui_mode==GUI_MODE_ALT)) {
1224            draw_restore();
1225        }
1226        --gui_splash;
1227    }
1228
1229    gui_in_redraw = 1;
1230    gui_mode_old = gui_mode;
1231
1232    switch (gui_mode) {
1233        case GUI_MODE_MENU:
1234            gui_menu_draw();
1235            draw_txt_string(20, 14, "<CNF>", MAKE_COLOR(COLOR_ALT_BG, COLOR_FG));
1236            break;
1237        case GUI_MODE_ALT:
1238            gui_draw_osd();
1239            draw_txt_string(20, 14, "<ALT>", MAKE_COLOR(COLOR_ALT_BG, COLOR_FG));
1240            if ((mode_get()&MODE_MASK) == MODE_REC) {
1241                draw_txt_string(0, 14, script_title, MAKE_COLOR(COLOR_ALT_BG, COLOR_FG));
1242                if (state_kbd_script_run) show_script_console=5;
1243                if (show_script_console) {
1244                    --show_script_console;
1245                    md_draw_grid();
1246                    script_console_draw();
1247                }
1248            }
1249            break;
1250        case GUI_MODE_NONE:
1251            gui_draw_osd();
1252            break;
1253        case GUI_MODE_PALETTE:
1254            gui_palette_draw();
1255            break;
1256        case GUI_MODE_MBOX:
1257            gui_mbox_draw();
1258            break;
1259        case GUI_MODE_REVERSI:
1260            gui_reversi_draw();
1261            break;
1262        case GUI_MODE_SOKOBAN:
1263            gui_sokoban_draw();
1264            break;
1265        case GUI_MODE_DEBUG:
1266            gui_debug_draw();
1267            break;
1268        case GUI_MODE_FSELECT:
1269            gui_fselect_draw();
1270            break;
1271        case GUI_MODE_READ:
1272            gui_read_draw();
1273            break;
1274        case GUI_MODE_OSD:
1275            gui_osd_draw();
1276//            draw_txt_string(20, 14, "<OSD>", MAKE_COLOR(COLOR_ALT_BG, COLOR_FG));
1277            break;
1278        case GUI_MODE_CALENDAR:
1279            gui_calendar_draw();
1280            break;
1281        case GUI_MODE_BENCH:
1282            gui_bench_draw();
1283            break;
1284        case GUI_MODE_MPOPUP:
1285            gui_mpopup_draw();
1286            break;
1287        default:
1288            break;
1289    }
1290   
1291    gui_in_redraw = 0;
1292    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) {
1293        gui_restore = 0;
1294        if (gui_mode != GUI_MODE_REVERSI && gui_mode != GUI_MODE_SOKOBAN)
1295            draw_restore();
1296    }
1297}
1298
1299#ifdef OPTIONS_AUTOSAVE
1300//-------------------------------------------------------------------
1301static inline void conf_store_old_settings() {
1302    old_conf=conf;
1303}
1304
1305//-------------------------------------------------------------------
1306static inline int conf_save_new_settings_if_changed() {
1307    if (memcmp(&old_conf, &conf, sizeof(Conf)) != 0) {
1308                user_menu_save();
1309        conf_save();
1310        conf_store_old_settings();
1311        return 1;
1312    }
1313    return 0;
1314}
1315#endif
1316
1317
1318//-------------------------------------------------------------------
1319void gui_kbd_process()
1320{
1321    int clicked_key;
1322
1323    if (kbd_is_key_clicked(KEY_MENU)){
1324        switch (gui_mode) {
1325            case GUI_MODE_ALT:
1326                                if (conf.user_menu_enable == 1)
1327                                        gui_menu_init(&user_submenu);
1328                                else
1329                gui_menu_init(&root_menu);
1330                gui_mode = GUI_MODE_MENU;
1331                draw_restore();
1332                break;
1333            case GUI_MODE_MENU:
1334#ifdef OPTIONS_AUTOSAVE
1335                conf_save_new_settings_if_changed();
1336#endif
1337                                if (gui_user_menu_flag) {
1338                        gui_mode = GUI_MODE_MENU;
1339                                        gui_user_menu_flag = 0;
1340                                        gui_menu_init(&root_menu);
1341                                }
1342                                else
1343                gui_mode = GUI_MODE_ALT;
1344                draw_restore();
1345                break;
1346            case GUI_MODE_PALETTE:
1347            case GUI_MODE_REVERSI:
1348            case GUI_MODE_SOKOBAN:
1349            case GUI_MODE_DEBUG:
1350            case GUI_MODE_OSD:
1351            case GUI_MODE_CALENDAR:
1352            case GUI_MODE_BENCH:
1353                draw_restore();
1354                gui_mode = GUI_MODE_MENU;
1355                break;
1356            case GUI_MODE_FSELECT:
1357                gui_fselect_kbd_process();
1358                break;
1359            case GUI_MODE_READ:
1360                gui_read_kbd_process();
1361                draw_restore();
1362                gui_mode = GUI_MODE_MENU;
1363                break;
1364            default:
1365                break;
1366        }
1367        return;
1368    }
1369   
1370    switch (gui_mode) {
1371        case GUI_MODE_ALT:
1372            if (kbd_is_key_clicked(SHORTCUT_TOGGLE_RAW)) {
1373                if (conf.ns_enable_memdump) dump_memory();
1374#if defined (CAMERA_ixus800_sd700) || defined (CAMERA_ixus850_sd800) || defined (CAMERA_ixus70_sd1000) || defined (CAMERA_ixus950_sd850) || defined (CAMERA_a560) || defined (CAMERA_a460) || defined(CAMERA_ixus55_sd450)
1375                else if (!shooting_get_common_focus_mode())
1376#else               
1377                                else
1378#endif                                                 
1379                                   {conf.save_raw = !conf.save_raw;
1380                    draw_restore();
1381                   }
1382#if defined (CAMERA_a460)
1383                                else {
1384               if (conf.subj_dist_override_koef==4)
1385                  gui_subj_dist_override_koef_enum(-3,0);
1386               else
1387                  gui_subj_dist_override_koef_enum(1,0);
1388                                  }
1389#elif defined (CAMERA_ixus800_sd700) || defined (CAMERA_ixus850_sd800) || defined (CAMERA_ixus70_sd1000) || defined (CAMERA_ixus950_sd850) || defined (CAMERA_a560) || defined(CAMERA_ixus55_sd450)
1390                else
1391                                  {
1392                                  conf.subj_dist_override_value=MAX_DIST;       
1393                  shooting_set_focus(shooting_get_subject_distance_override_value(), SET_NOW);
1394                                  }
1395#endif                                                                     
1396            } else if (kbd_is_key_clicked(KEY_SET)) {
1397                gui_menu_init(&script_submenu);
1398                gui_mode = GUI_MODE_MENU;
1399                draw_restore();
1400            } else {
1401#if defined (CAMERA_ixus800_sd700) || defined (CAMERA_ixus850_sd800) || defined (CAMERA_ixus70_sd1000) || defined (CAMERA_ixus950_sd850) || defined (CAMERA_a560) || defined (CAMERA_a460) || defined(CAMERA_ixus55_sd450)
1402                        if (kbd_is_key_clicked(SHORTCUT_MF_TOGGLE)) {
1403                              if (conf.subj_dist_override_koef>0)
1404                                     conf.subj_dist_override_koef=0;
1405                              else conf.subj_dist_override_koef=1;
1406                              draw_restore();
1407                             }
1408                else if (shooting_get_common_focus_mode())
1409#elif !defined (CAMERA_ixus700_sd500)
1410               if (shooting_get_common_focus_mode())
1411#endif
1412#if !defined (CAMERA_ixus700_sd500)           
1413                          {
1414#if !defined (CAMERA_a460)
1415                                if (kbd_is_key_clicked(KEY_RIGHT)) {
1416                                  gui_subj_dist_override_koef_enum(1,0);
1417#if defined (CAMERA_ixus800_sd700) || defined (CAMERA_ixus850_sd800) || defined (CAMERA_ixus70_sd1000) || defined (CAMERA_ixus950_sd850) || defined (CAMERA_a560) || defined(CAMERA_ixus55_sd450)
1418                  if (conf.subj_dist_override_koef==0) conf.subj_dist_override_koef=1;
1419#endif
1420                  shooting_set_focus(shooting_get_subject_distance_override_value(), SET_NOW);
1421                                  }
1422                                else if (kbd_is_key_clicked(KEY_LEFT))
1423                                  {
1424                                  gui_subj_dist_override_koef_enum(-1,0);
1425#if defined (CAMERA_ixus800_sd700) || defined (CAMERA_ixus850_sd800) || defined (CAMERA_ixus70_sd1000) || defined (CAMERA_ixus950_sd850) || defined (CAMERA_a560) || defined(CAMERA_ixus55_sd450)
1426                  if (conf.subj_dist_override_koef==0) conf.subj_dist_override_koef=1;
1427#endif
1428                  shooting_set_focus(shooting_get_subject_distance_override_value(), SET_NOW);
1429                                  }
1430                                else if (kbd_is_key_clicked(SHORTCUT_SET_INFINITY))
1431                                  {
1432                                  conf.subj_dist_override_value=MAX_DIST;       
1433                  shooting_set_focus(shooting_get_subject_distance_override_value(), SET_NOW);
1434                                  }
1435                                else
1436#endif
1437                                if (kbd_is_key_clicked(SHORTCUT_SET_HYPERFOCAL))
1438                                  {     
1439                                  int m=mode_get()&MODE_SHOOTING_MASK;
1440                                  if ((m==MODE_M) || (m==MODE_AV))
1441                                    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()));
1442                                  else conf.subj_dist_override_value=(int)shooting_get_hyperfocal_distance();           
1443                  shooting_set_focus(shooting_get_subject_distance_override_value(), SET_NOW);
1444                                  }   
1445                                else 
1446                                switch (kbd_get_autoclicked_key()) {
1447#if defined (CAMERA_a460)
1448              case KEY_RIGHT:
1449#else
1450                                  case KEY_ZOOM_IN:
1451#endif
1452                  gui_subj_dist_override_value_enum(1,0);
1453                  shooting_set_focus(shooting_get_subject_distance_override_value(),SET_NOW);
1454                  break;
1455#if defined (CAMERA_a460)
1456              case KEY_LEFT:
1457#else
1458                 case KEY_ZOOM_OUT:
1459#endif
1460                  gui_subj_dist_override_value_enum(-1,0);
1461                  shooting_set_focus(shooting_get_subject_distance_override_value(), SET_NOW);
1462                  break;
1463                  }
1464              }
1465#endif                           
1466            }
1467            break;
1468        case GUI_MODE_MENU:
1469            gui_menu_kbd_process();
1470            break;
1471        case GUI_MODE_PALETTE:
1472            gui_palette_kbd_process();
1473            break;
1474        case GUI_MODE_MBOX:
1475            gui_mbox_kbd_process();
1476            break;
1477        case GUI_MODE_REVERSI:
1478            gui_reversi_kbd_process();
1479            break;
1480        case GUI_MODE_SOKOBAN:
1481            gui_sokoban_kbd_process();
1482            break;
1483        case GUI_MODE_DEBUG:
1484            gui_debug_kbd_process();
1485            break;
1486        case GUI_MODE_FSELECT:
1487            gui_fselect_kbd_process();
1488            break;
1489        case GUI_MODE_READ:
1490            gui_read_kbd_process();
1491            break;
1492        case GUI_MODE_OSD:
1493            gui_osd_kbd_process();
1494            break;
1495        case GUI_MODE_CALENDAR:
1496            gui_calendar_kbd_process();
1497            break;
1498        case GUI_MODE_BENCH:
1499            gui_bench_kbd_process();
1500            break;
1501        case GUI_MODE_MPOPUP:
1502            gui_mpopup_kbd_process();
1503             break;
1504        default:
1505            break;
1506    }
1507}
1508
1509//-------------------------------------------------------------------
1510void gui_kbd_enter()
1511{
1512    // XXX set custom palette
1513#ifdef OPTIONS_AUTOSAVE
1514    conf_store_old_settings();
1515#endif
1516    if ((conf.alt_prevent_shutdown == ALT_PREVENT_SHUTDOWN_ALT && !state_kbd_script_run)
1517        || conf.alt_prevent_shutdown == ALT_PREVENT_SHUTDOWN_ALT_SCRIPT) {
1518        disable_shutdown();
1519    }
1520    gui_mode = GUI_MODE_ALT;
1521
1522        gui_user_menu_flag = 0;
1523        if (conf.user_menu_enable == 2) {
1524                gui_menu_init(&user_submenu);
1525                gui_mode = GUI_MODE_MENU;
1526                draw_restore();
1527                gui_user_menu_flag = 1;
1528        }
1529
1530}
1531
1532//-------------------------------------------------------------------
1533void gui_kbd_leave()
1534{
1535    // XXX restore palette
1536#ifdef OPTIONS_AUTOSAVE
1537    conf_save_new_settings_if_changed();
1538#endif
1539    ubasic_error = 0;
1540    draw_restore();
1541    if (gui_mode == GUI_MODE_READ && !rbf_load(conf.menu_rbf_file))
1542        rbf_load_from_8x16(current_font);
1543    rbf_set_codepage(FONT_CP_WIN);
1544    enable_shutdown();
1545    gui_mode = GUI_MODE_NONE;
1546}
1547
1548//-------------------------------------------------------------------
1549extern long physw_status[3];
1550extern long GetPropertyCase(long opt_id, void *buf, long bufsize);
1551//extern int xxxx, eeee;
1552//-------------------------------------------------------------------
1553void gui_draw_osd() {
1554    unsigned int m, n = 0, mode_photo, mode_video;
1555    coord x;
1556    static int flashlight = 0, zebra = 0, zebra_init = 0, pressed = 0;
1557    static int half_disp_press_old=0;
1558    int half_disp_press;
1559   
1560    m = mode_get();
1561
1562    if (conf.flashlight && (m&MODE_SCREEN_OPENED) && (m&MODE_SCREEN_ROTATED) && (gui_mode==GUI_MODE_NONE /* || gui_mode==GUI_MODE_ALT */)) {
1563        draw_filled_rect(0, 0, screen_width-1, screen_height-1, MAKE_COLOR(COLOR_WHITE, COLOR_WHITE));
1564        flashlight = 1;
1565    }
1566    if (flashlight) {
1567        if ((!((m&MODE_SCREEN_OPENED) && (m&MODE_SCREEN_ROTATED))) || (gui_mode!=GUI_MODE_NONE /* && gui_mode!=GUI_MODE_ALT */)) {
1568            flashlight = 0;
1569            draw_restore();
1570        }
1571        return;
1572    }
1573   
1574    if (kbd_is_key_pressed(KEY_SHOOT_HALF)) {
1575        if (kbd_is_key_pressed(SHORTCUT_TOGGLE_ZEBRA)) {
1576            if (!pressed) {
1577                conf.zebra_draw = !conf.zebra_draw;
1578                if (zebra && !conf.zebra_draw) {
1579                    zebra = 0;
1580                    draw_restore();
1581                }
1582                pressed = 1;
1583            }
1584        }
1585         else if (kbd_is_key_pressed(SHORTCUT_TOGGLE_HISTO)) {
1586            if (!pressed) {
1587                if (++conf.show_histo>SHOW_HALF) conf.show_histo=0;
1588                if (!conf.show_histo) {
1589                    draw_restore();
1590                }
1591                pressed = 1;
1592            }
1593        } else if (kbd_is_key_pressed(SHORTCUT_TOGGLE_OSD)) {
1594            if (!pressed) {
1595                conf.show_osd = !conf.show_osd;
1596                if (!conf.show_osd) {
1597                    draw_restore();
1598                }
1599                pressed = 1;
1600            }
1601        } else {
1602            pressed = 0;
1603        }
1604    } else {
1605        pressed = 0;
1606    }
1607   
1608    mode_video = ((m&MODE_SHOOTING_MASK)==MODE_VIDEO_STD ||
1609                                 (m&MODE_SHOOTING_MASK)==MODE_VIDEO_SPEED || 
1610                                 (m&MODE_SHOOTING_MASK)==MODE_VIDEO_COMPACT ||
1611                                 (m&MODE_SHOOTING_MASK)==MODE_VIDEO_MY_COLORS ||
1612                                 (m&MODE_SHOOTING_MASK)==MODE_VIDEO_COLOR_ACCENT ||
1613                 (m&MODE_SHOOTING_MASK)==MODE_VIDEO_TIME_LAPSE);
1614   
1615   
1616    mode_photo = (m&MODE_MASK) == MODE_PLAY ||
1617                 !( mode_video ||
1618                                 (m&MODE_SHOOTING_MASK)==MODE_STITCH);
1619
1620    half_disp_press=mode_photo && kbd_is_key_pressed(KEY_SHOOT_HALF) && kbd_is_key_pressed(KEY_DISPLAY);
1621    if (half_disp_press && ! half_disp_press_old) draw_restore();
1622    half_disp_press_old=half_disp_press;
1623    if (half_disp_press) return;
1624
1625    if (conf.zebra_draw && gui_mode==GUI_MODE_NONE && kbd_is_key_pressed(KEY_SHOOT_HALF) && mode_photo) {
1626        if (!zebra_init) {
1627            zebra_init = 1;
1628            gui_osd_zebra_init();
1629        }
1630        zebra = gui_osd_draw_zebra();
1631    }
1632    if (zebra_init && !kbd_is_key_pressed(KEY_SHOOT_HALF)) {
1633        zebra_init = 0;
1634    }
1635    if (zebra) {
1636        if (!kbd_is_key_pressed(KEY_SHOOT_HALF)) {
1637            zebra = 0;
1638            draw_restore();
1639        }
1640        return;
1641    }
1642#if !defined (CAMERA_ixus700_sd500) && !defined (CAMERA_ixus800_sd700) && !defined (CAMERA_ixus850_sd800) && !defined (CAMERA_ixus70_sd1000) && !defined (CAMERA_ixus950_sd850) && !defined (CAMERA_a560) && !defined (CAMERA_a460) && !defined(CAMERA_ixus55_sd450)
1643    if (!(conf.show_osd && (canon_menu_active==(int)&canon_menu_active-4) && (canon_shoot_menu_active==0)))  return;   
1644#else
1645    if (!(conf.show_osd && (canon_menu_active==(int)&canon_menu_active-4) /*&& (canon_shoot_menu_active==0)*/ ))  return;
1646#endif 
1647
1648   
1649    if ((gui_mode==GUI_MODE_NONE || gui_mode==GUI_MODE_ALT) && (
1650     (kbd_is_key_pressed(KEY_SHOOT_HALF) && ((conf.show_histo==SHOW_HALF)/* || (m&MODE_MASK) == MODE_PLAY*/)) ||
1651     ((conf.show_histo==SHOW_ALWAYS)  &&  !((m&MODE_MASK) == MODE_PLAY) && (recreview_hold==0))
1652    ) &&
1653    (mode_photo || (m&MODE_SHOOTING_MASK)==MODE_STITCH)) {
1654        gui_osd_draw_histo();
1655    }
1656
1657    if ((m&MODE_MASK) == MODE_REC && (recreview_hold==0 || conf.show_osd_in_review) ) {
1658//        m &= MODE_SHOOTING_MASK;
1659//        if (m==MODE_SCN_WATER || m==MODE_SCN_NIGHT || m==MODE_SCN_CHILD || m==MODE_SCN_PARTY || m==MODE_STITCH ||
1660//            m==MODE_SCN_GRASS || m==MODE_SCN_SNOW  || m==MODE_SCN_BEACH || m==MODE_SCN_FIREWORK || m==MODE_VIDEO)
1661//            ++n;
1662
1663        if (conf.show_grid_lines) {
1664            gui_grid_draw_osd(1);
1665        }
1666        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 && conf.show_values_in_video) )) {
1667                 
1668           if (conf.show_dof!=DOF_DONT_SHOW) gui_osd_calc_dof();
1669           
1670           if (conf.show_dof==DOF_SHOW_IN_DOF) gui_osd_draw_dof(); 
1671           
1672           if (conf.values_show_real_iso || conf.values_show_market_iso || conf.values_show_ev_seted || conf.values_show_ev_measured || conf.values_show_bv_measured || conf.values_show_bv_seted || conf.values_show_overexposure || conf.values_show_canon_overexposure) gui_osd_calc_expo_param();                             
1673        }
1674        if (conf.show_state && !mode_video) gui_osd_draw_state();
1675        if (conf.save_raw && conf.show_raw_state && !mode_video) gui_osd_draw_raw_info();
1676       
1677            if ((conf.show_values==SHOW_ALWAYS && mode_photo) || (mode_video && conf.show_values_in_video) || ((kbd_is_key_pressed(KEY_SHOOT_HALF) || (recreview_hold==1)) && (conf.show_values==SHOW_HALF)))
1678                   gui_osd_draw_values(1);
1679        else if  (shooting_get_common_focus_mode() && mode_photo && conf.show_values && !(conf.show_dof==DOF_SHOW_IN_DOF) )   
1680           gui_osd_draw_values(2);
1681            else if  (conf.show_values==SHOW_HALF)
1682                   gui_osd_draw_values(0);   
1683    }
1684
1685
1686    if (recreview_hold==0) {
1687        gui_batt_draw_osd();
1688        gui_space_draw_osd();
1689    }
1690   
1691    if ((conf.show_clock) && (recreview_hold==0)) {
1692        gui_osd_draw_clock();
1693    }
1694
1695#if defined (CAMERA_ixus700_sd500) || defined (CAMERA_ixus800_sd700) || defined (CAMERA_ixus850_sd800) || defined (CAMERA_a460)
1696    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) {   
1697     strcpy(osd_buf,shooting_get_tv_str());
1698     strcat(osd_buf,"\"  F");
1699     strcat(osd_buf,shooting_get_av_str());
1700     draw_txt_string(22-strlen(osd_buf)/2, 14, osd_buf, conf.osd_color);
1701    }
1702#endif
1703
1704    if (debug_vals_show) {
1705//        long v=get_file_counter();
1706//      sprintf(osd_buf, "1:%03d-%04d  ", (v>>18)&0x3FF, (v>>4)&0x3FFF);
1707//      sprintf(osd_buf, "1:%d, %08X  ", xxxx, eeee);
1708        sprintf(osd_buf, "1:%8x  ", physw_status[0]);
1709        draw_txt_string(28, 10, osd_buf, conf.osd_color);
1710
1711        sprintf(osd_buf, "2:%8x  ", physw_status[1]);
1712        draw_txt_string(28, 11, osd_buf, conf.osd_color);
1713
1714        sprintf(osd_buf, "3:%8x  ", physw_status[2]);
1715        draw_txt_string(28, 12, osd_buf, conf.osd_color);
1716
1717//      sprintf(osd_buf, "4:%8x  ", vid_get_viewport_fb_d());
1718        sprintf(osd_buf, "4:%8x  ", get_usb_power(1));
1719        draw_txt_string(28, 13, osd_buf, conf.osd_color);
1720    }
1721
1722   {
1723        static char sbuf[100];
1724    int r,i, p, len;
1725    if (debug_propcase_show){
1726
1727        for (i=0;i<10;i++){
1728            r = 0;
1729            p = debug_propcase_page*10+i;
1730            get_property_case(p, &r, 4);
1731            sprintf(sbuf, "%3d: %d              ", p, r);sbuf[20]=0;
1732            draw_string(64,16+16*i,sbuf, conf.osd_color);
1733        }
1734    }
1735
1736if (debug_pardata_show){
1737        extern long* FlashParamsTable[];
1738        char s[30];
1739        int count;
1740
1741        for (i=0;i<10;i++){
1742            r = 0;
1743            p = debug_propcase_page*10+i;
1744            if (p>=get_flash_params_count())  sprintf(sbuf, "%3d: This parameter does not exists", p);
1745            else   {
1746             len=FlashParamsTable[p][1]>>16;
1747             if ((len==1)||(len==2)||(len==4)){
1748              get_parameter_data(p, &r, len);
1749              sprintf(sbuf, "%3d: %30d :%2d ", p, r,len);
1750              }
1751             else {
1752              if (len>=sizeof(s)) count=sizeof(s)-1; else count=len;
1753              get_parameter_data(p, &s, count);
1754              s[count]=0;
1755              sprintf(sbuf, "%3d: %30s :%2d ", p, s,len);
1756             }
1757            }
1758            draw_string(16,16+16*i,sbuf, conf.osd_color);
1759        }
1760    }
1761   }
1762
1763
1764    if (ubasic_error){
1765        const char *msg;
1766        if (ubasic_error >= UBASIC_E_ENDMARK) {
1767            msg = ubasic_errstrings[UBASIC_E_UNKNOWN_ERROR];
1768        } else {
1769            msg = ubasic_errstrings[ubasic_error];
1770        }
1771        sprintf(osd_buf, "uBASIC:%d %s ", ubasic_linenumber(), msg);
1772        draw_txt_string(0, 0, osd_buf, MAKE_COLOR(COLOR_RED, COLOR_YELLOW));
1773    }
1774}
1775
1776#ifndef OPTIONS_AUTOSAVE
1777//-------------------------------------------------------------------
1778void gui_menuproc_save(int arg)
1779{
1780    conf_save();
1781}
1782#endif
1783
1784//-------------------------------------------------------------------
1785static void gui_menuproc_reset_selected(unsigned int btn) {
1786    if (btn==MBOX_BTN_YES)
1787        conf_load_defaults();
1788}
1789
1790void gui_menuproc_reset(int arg)
1791{
1792    gui_mbox_init(LANG_MSG_RESET_OPTIONS_TITLE,
1793                  LANG_MSG_RESET_OPTIONS_TEXT,
1794                  MBOX_FUNC_RESTORE|MBOX_TEXT_CENTER|MBOX_BTN_YES_NO|MBOX_DEF_BTN2, gui_menuproc_reset_selected);
1795}
1796
1797//-------------------------------------------------------------------
1798void gui_draw_palette(int arg) {
1799    draw_restore();
1800    gui_palette_init(PALETTE_MODE_DEFAULT, 0x00, NULL);
1801    gui_mode = GUI_MODE_PALETTE;
1802}
1803
1804//-------------------------------------------------------------------
1805void gui_show_build_info(int arg) {
1806    static char buf[192];
1807
1808    sprintf(buf, lang_str(LANG_MSG_BUILD_INFO_TEXT), HDK_VERSION, BUILD_NUMBER, __DATE__, __TIME__, PLATFORM, PLATFORMSUB);
1809    gui_mbox_init(LANG_MSG_BUILD_INFO_TITLE, (int)buf, MBOX_FUNC_RESTORE|MBOX_TEXT_LEFT, NULL);
1810}
1811
1812//-------------------------------------------------------------------
1813void gui_show_memory_info(int arg) {
1814    static char buf[64];
1815    int size, l_size, d;
1816    char* ptr;
1817
1818    size = 16;
1819    while (1) {
1820        ptr= malloc(size);
1821        if (ptr) {
1822            free(ptr);
1823            size <<= 1;
1824        } else
1825            break;
1826    }
1827
1828    l_size = size;
1829    size >>= 1;
1830    d=1024;
1831    while (d) {
1832        ptr = malloc(size);
1833        if (ptr) {
1834            free(ptr);
1835            d = l_size-size;
1836            if (d<0) d=-d;
1837            l_size = size;
1838            size += d>>1;
1839        } else {
1840            d = size-l_size;
1841            if (d<0) d=-d;
1842            l_size = size;
1843            size -= d>>1;
1844        }
1845       
1846    }
1847   
1848    sprintf(buf, lang_str(LANG_MSG_MEMORY_INFO_TEXT), size-1);
1849    gui_mbox_init(LANG_MSG_MEMORY_INFO_TITLE, (int)buf, MBOX_FUNC_RESTORE|MBOX_TEXT_CENTER, NULL);
1850}
1851
1852//-------------------------------------------------------------------
1853void gui_draw_reversi(int arg) {
1854    if ((mode_get()&MODE_MASK) != MODE_PLAY) {
1855        gui_mbox_init(LANG_MSG_INFO_TITLE, LANG_MSG_SWITCH_TO_PLAY_MODE,
1856                      MBOX_FUNC_RESTORE|MBOX_TEXT_CENTER, NULL);
1857        return;
1858    }
1859    gui_mode = GUI_MODE_REVERSI;
1860    gui_reversi_init();
1861}
1862
1863//-------------------------------------------------------------------
1864void gui_draw_sokoban(int arg) {
1865    if ((mode_get()&MODE_MASK) != MODE_PLAY) {
1866        gui_mbox_init(LANG_MSG_INFO_TITLE, LANG_MSG_SWITCH_TO_PLAY_MODE,
1867                      MBOX_FUNC_RESTORE|MBOX_TEXT_CENTER, NULL);
1868        return;
1869    }
1870    gui_mode = GUI_MODE_SOKOBAN;
1871    gui_sokoban_init();
1872}
1873
1874//-------------------------------------------------------------------
1875void gui_draw_debug(int arg) {
1876//    gui_debug_init(0x2510);
1877//    gui_debug_init(0x127E0);
1878//    gui_debug_init(0x7F5B8);
1879//    gui_debug_init(malloc(16));
1880    gui_debug_init((void*)0xB054);
1881}
1882
1883//-------------------------------------------------------------------
1884void gui_draw_bench(int arg) {
1885    gui_mode = GUI_MODE_BENCH;
1886    gui_bench_init();
1887}
1888
1889//-------------------------------------------------------------------
1890void gui_draw_splash() {
1891    coord w, h, x, y;
1892    static const char *text[] = {
1893        "CHDK Firmware '" HDK_VERSION ", #" BUILD_NUMBER "'" ,
1894        "Build: " __DATE__ " " __TIME__ ,
1895        "Camera: " PLATFORM " - " PLATFORMSUB };
1896    int i, l;
1897    color cl = MAKE_COLOR((gui_splash_mode==MODE_REC)?0xDA:0xD9, COLOR_WHITE);
1898
1899    gui_splash_mode = (mode_get()&MODE_MASK);
1900
1901    h=sizeof(text)/sizeof(text[0])*FONT_HEIGHT+8;
1902    w=0;
1903    for (i=0; i<sizeof(text)/sizeof(text[0]); ++i) {
1904        l=strlen(text[i]);
1905        if (l>w) w=l;
1906    }
1907    w=w*FONT_WIDTH+10;
1908
1909    x = (screen_width-w)>>1; y = (screen_height-h)>>1;
1910    draw_filled_rect(x, y, x+w, y+h, cl);
1911    for (i=0; i<sizeof(text)/sizeof(text[0]); ++i) {
1912        draw_string(x+((w-strlen(text[i])*FONT_WIDTH)>>1), y+i*FONT_HEIGHT+4, text[i], cl);
1913    }
1914}
1915
1916//-------------------------------------------------------------------
1917void gui_draw_fselect(int arg) {
1918    gui_fselect_init(LANG_STR_FILE_BROWSER, "A", NULL);
1919}
1920
1921//-------------------------------------------------------------------
1922static void gui_load_script_selected(const char *fn) {
1923    if (fn)
1924        script_load(fn);
1925}
1926void gui_load_script(int arg) {
1927    DIR   *d;
1928    char  *path="A/CHDK/SCRIPTS";
1929
1930    // if exists "A/CHDK/SCRIPTS" go into
1931    d=opendir(path);
1932    if (d) {
1933        closedir(d);
1934    } else {
1935        path="A";
1936    }
1937
1938    gui_fselect_init(LANG_STR_SELECT_SCRIPT_FILE, path, gui_load_script_selected);
1939}
1940
1941//-------------------------------------------------------------------
1942static void gui_grid_lines_load_selected(const char *fn) {
1943    if (fn)
1944        grid_lines_load(fn);
1945}
1946void gui_grid_lines_load(int arg) {
1947    DIR   *d;
1948    char  *path="A/CHDK/GRIDS";
1949
1950    // if exists "A/CHDK/GRIDS" go into
1951    d=opendir(path);
1952    if (d) {
1953        closedir(d);
1954    } else {
1955        path="A";
1956    }
1957
1958    gui_fselect_init(LANG_STR_SELECT_GRID_FILE, path, gui_grid_lines_load_selected);
1959}
1960
1961//-------------------------------------------------------------------
1962void gui_draw_osd_le(int arg) {
1963    gui_mode = GUI_MODE_OSD;
1964    gui_osd_init();
1965}
1966
1967//-------------------------------------------------------------------
1968static void gui_draw_read_selected(const char *fn) {
1969    if (fn) {
1970        if (!rbf_load(conf.reader_rbf_file))
1971            rbf_load_from_8x16(current_font);
1972        rbf_set_codepage(conf.reader_codepage);
1973        gui_mode = GUI_MODE_READ;
1974        gui_read_init(fn);
1975    }
1976}
1977void gui_draw_read(int arg) {
1978    DIR   *d;
1979    char  *path="A/CHDK/BOOKS";
1980
1981    // if exists "A/CHDK/BOOKS" go into
1982    d=opendir(path);
1983    if (d) {
1984        closedir(d);
1985    } else {
1986        path="A";
1987    }
1988    gui_fselect_init(LANG_STR_SELECT_TEXT_FILE, path, gui_draw_read_selected);
1989}
1990
1991//-------------------------------------------------------------------
1992void gui_draw_read_last(int arg) {
1993    int fd;
1994   
1995    fd = open(conf.reader_file, O_RDONLY, 0777);
1996    if (fd >= 0) {
1997        close(fd);
1998        gui_draw_read_selected(conf.reader_file);
1999    } else {
2000        gui_draw_read(arg);
2001    }
2002}
2003
2004//-------------------------------------------------------------------
2005void gui_menuproc_mkbootdisk(int arg) {
2006    mark_filesystem_bootable();
2007}
2008
2009//-------------------------------------------------------------------
2010void gui_draw_calendar(int arg) {
2011    gui_mode = GUI_MODE_CALENDAR;
2012    gui_calendar_init();
2013}
2014
2015//-------------------------------------------------------------------
2016static void gui_draw_rbf_selected(const char *fn) {
2017    if (fn) {
2018        strcpy(conf.reader_rbf_file, fn);
2019    }
2020}
2021void gui_draw_load_rbf(int arg) {
2022    DIR   *d;
2023    char  *path="A/CHDK/FONTS";
2024
2025    // if exists "A/CHDK/FONTS" go into
2026    d=opendir(path);
2027    if (d) {
2028        closedir(d);
2029    } else {
2030        path="A";
2031    }
2032
2033    gui_fselect_init(LANG_STR_SELECT_FONT_FILE, path, gui_draw_rbf_selected);
2034}
2035
2036//-------------------------------------------------------------------
2037static void gui_draw_menu_rbf_selected(const char *fn) {
2038    if (fn) {
2039        strcpy(conf.menu_rbf_file, fn);
2040        if (!rbf_load(conf.menu_rbf_file))
2041            rbf_load_from_8x16(current_font);
2042        rbf_set_codepage(FONT_CP_WIN);
2043        gui_menu_init(NULL);
2044    }
2045}
2046void gui_draw_load_menu_rbf(int arg) {
2047    DIR   *d;
2048    char  *path="A/CHDK/FONTS";
2049
2050    // if exists "A/CHDK/FONTS" go into
2051    d=opendir(path);
2052    if (d) {
2053        closedir(d);
2054    } else {
2055        path="A";
2056    }
2057
2058    gui_fselect_init(LANG_STR_SELECT_FONT_FILE, path, gui_draw_menu_rbf_selected);
2059}
2060
2061//-------------------------------------------------------------------
2062static void gui_draw_lang_selected(const char *fn) {
2063    if (fn) {
2064        strcpy(conf.lang_file, fn);
2065        lang_load_from_file(conf.lang_file);
2066        gui_menu_init(NULL);
2067    }
2068}
2069void gui_draw_load_lang(int arg) {
2070    DIR   *d;
2071    char  *path="A/CHDK/LANG";
2072
2073    // if exists "A/CHDK/LANG" go into
2074    d=opendir(path);
2075    if (d) {
2076        closedir(d);
2077    } else {
2078        path="A";
2079    }
2080
2081    gui_fselect_init(LANG_STR_SELECT_LANG_FILE, path, gui_draw_lang_selected);
2082}
2083
2084int find_mnu(CMenu *curr_menu, int mnu, int count)
2085{
2086        int gui_menu_curr_item;
2087
2088        gui_menu_curr_item = 0;
2089        while(curr_menu->menu[gui_menu_curr_item].text) {
2090                if (curr_menu->menu[gui_menu_curr_item].text == mnu){
2091                        user_submenu_items[count] = curr_menu->menu[gui_menu_curr_item];
2092                        return 1;
2093                }
2094                if ((curr_menu->menu[gui_menu_curr_item].type & MENUITEM_MASK) == MENUITEM_SUBMENU)
2095                        if (find_mnu((CMenu*)(curr_menu->menu[gui_menu_curr_item].value), mnu, count)) return 1;
2096                gui_menu_curr_item++;
2097        }
2098        return 0;
2099}
2100
2101void user_menu_save() {
2102    int x;
2103        for (x=0; x<10; x++) {
2104                conf.user_menu_vars[x] = user_submenu_items[x].text;
2105        }
2106}
2107
2108void user_menu_restore() {
2109    int x;
2110        for (x=0; x<10; x++) {
2111                find_mnu(&root_menu, conf.user_menu_vars[x], x);
2112        }
2113}
Note: See TracBrowser for help on using the repository browser.