source: trunk/core/gui.c @ 316

Revision 316, 79.4 KB checked in by cail, 5 years ago (diff)

ixus65 support onto trunk
many bugs, but it works

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_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_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_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_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_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 };
535
536void rinit(){
537        gui_menu_init(&root_menu);
538}
539
540static CMenuItem blank_menu_item = { LANG_MENU_ITEM_BLANK, MENUITEM_PROC, (int*)blank_menu,0};
541
542void add_user_menu(CMenuItem curr_menu_item, int* gui_menu_add_item, int del) {
543        if (*gui_menu_add_item<10){
544                if (del) {
545                        user_submenu_items[*gui_menu_add_item] = blank_menu_item;
546                } else {
547                        user_submenu_items[*gui_menu_add_item] = curr_menu_item;
548                        *gui_menu_add_item += 1;
549                }       
550        }
551}
552
553//-------------------------------------------------------------------
554void cb_step_25() {
555    voltage_step = (conf.batt_step_25)?25:1;
556}
557
558void cb_perc() {
559    conf.batt_volts_show=0;
560}
561
562void cb_volts() {
563    conf.batt_perc_show=0;
564}
565
566void cb_space_perc() {
567    conf.space_mb_show=0;
568}
569
570void cb_space_mb() {
571    conf.space_perc_show=0;
572}
573
574void cb_battery_menu_change(unsigned int item) {
575    switch (item) {
576        case 0: //Voltage MAX
577            if (conf.batt_volts_max<conf.batt_volts_min+25) {
578                conf.batt_volts_min = conf.batt_volts_max-25;
579            }
580            break;
581        case 1: //Voltage MIN
582            if (conf.batt_volts_min>conf.batt_volts_max-25) {
583                conf.batt_volts_max = conf.batt_volts_min+25;
584            }
585            break;
586        default:
587            break;
588    }
589}
590
591void cb_zebra_restore_screen() {
592    if (!conf.zebra_restore_screen)
593        conf.zebra_restore_osd = 0;
594}
595
596void cb_zebra_restore_osd() {
597    if (conf.zebra_restore_osd)
598        conf.zebra_restore_screen = 1;
599}
600
601//-------------------------------------------------------------------
602const char* gui_histo_mode_enum(int change, int arg) {
603    static const char* modes[]={ "Linear", "Log" };
604
605    conf.histo_mode+=change;
606    if (conf.histo_mode<0)
607        conf.histo_mode=(sizeof(modes)/sizeof(modes[0]))-1;
608    else if (conf.histo_mode>=(sizeof(modes)/sizeof(modes[0])))
609        conf.histo_mode=0;
610
611    histogram_set_mode(conf.histo_mode);
612
613    return modes[conf.histo_mode];
614}
615
616//-------------------------------------------------------------------
617const char* gui_histo_layout_enum(int change, int arg) {
618    static const char* modes[]={ "RGB", "Y", "RGB Y",  "R G B", "RGB all", "Y all", "Blend", "Blend Y"};
619
620    conf.histo_layout+=change;
621    if (conf.histo_layout<0)
622        conf.histo_layout=(sizeof(modes)/sizeof(modes[0]))-1;
623    else if (conf.histo_layout>=(sizeof(modes)/sizeof(modes[0])))
624        conf.histo_layout=0;
625
626    if (conf.histo_layout==OSD_HISTO_LAYOUT_Y || conf.histo_layout==OSD_HISTO_LAYOUT_Y_argb) {
627        histogram_set_main(HISTO_Y);
628    } else {
629        histogram_set_main(HISTO_RGB);
630    }
631
632    return modes[conf.histo_layout];
633}
634
635//-------------------------------------------------------------------
636const char* gui_font_enum(int change, int arg) {
637    static const char* fonts[]={ "Win1250", "Win1251", "Win1252", "Win1254", "Win1257"};
638
639    conf.font_cp+=change;
640    if (conf.font_cp<0)
641        conf.font_cp=(sizeof(fonts)/sizeof(fonts[0]))-1;
642    else if (conf.font_cp>=(sizeof(fonts)/sizeof(fonts[0])))
643        conf.font_cp=0;
644
645    if (change != 0) {
646        font_set(conf.font_cp);
647        if (!rbf_load(conf.menu_rbf_file))
648            rbf_load_from_8x16(current_font);
649        rbf_set_codepage(FONT_CP_WIN);
650        gui_menu_init(NULL);
651    }
652
653    return fonts[conf.font_cp];
654}
655
656//-------------------------------------------------------------------
657const char* gui_raw_prefix_enum(int change, int arg) {
658    static const char* prefixes[]={ "IMG_", "CRW_", "SND_"};
659
660    conf.raw_prefix+=change;
661    if (conf.raw_prefix<0)
662        conf.raw_prefix=(sizeof(prefixes)/sizeof(prefixes[0]))-1;
663    else if (conf.raw_prefix>=(sizeof(prefixes)/sizeof(prefixes[0])))
664        conf.raw_prefix=0;
665
666    return prefixes[conf.raw_prefix];
667}
668
669//-------------------------------------------------------------------
670const char* gui_raw_ext_enum(int change, int arg) {
671    static const char* exts[]={ ".JPG", ".CRW", ".CR2", ".THM", ".WAV"};
672
673    conf.raw_ext+=change;
674    if (conf.raw_ext<0)
675        conf.raw_ext=(sizeof(exts)/sizeof(exts[0]))-1;
676    else if (conf.raw_ext>=(sizeof(exts)/sizeof(exts[0])))
677        conf.raw_ext=0;
678
679    return exts[conf.raw_ext];
680}
681
682//-------------------------------------------------------------------
683const char* gui_raw_nr_enum(int change, int arg) {
684    static const char* modes[]={ "Auto", "Off", "On"};
685
686    conf.raw_nr+=change;
687    if (conf.raw_nr<0)
688        conf.raw_nr=(sizeof(modes)/sizeof(modes[0]))-1;
689    else if (conf.raw_nr>=(sizeof(modes)/sizeof(modes[0])))
690        conf.raw_nr=0;
691
692    return modes[conf.raw_nr];
693}
694
695//-------------------------------------------------------------------
696const char* gui_reader_codepage_enum(int change, int arg) {
697    static const char* cps[]={ "Win1251", "DOS"};
698
699    conf.reader_codepage+=change;
700    if (conf.reader_codepage<0)
701        conf.reader_codepage=(sizeof(cps)/sizeof(cps[0]))-1;
702    else if (conf.reader_codepage>=(sizeof(cps)/sizeof(cps[0])))
703        conf.reader_codepage=0;
704
705    return cps[conf.reader_codepage];
706}
707
708//-------------------------------------------------------------------
709const char* gui_zebra_mode_enum(int change, int arg) {
710    static const char* modes[]={ "Blink 1", "Blink 2", "Blink 3", "Solid", "Zebra 1", "Zebra 2" };
711
712    conf.zebra_mode+=change;
713    if (conf.zebra_mode<0)
714        conf.zebra_mode=(sizeof(modes)/sizeof(modes[0]))-1;
715    else if (conf.zebra_mode>=(sizeof(modes)/sizeof(modes[0])))
716        conf.zebra_mode=0;
717
718    return modes[conf.zebra_mode];
719}
720
721//-------------------------------------------------------------------
722const char* gui_zebra_draw_osd_enum(int change, int arg) {
723    static const char* modes[]={ "Nothing", "Histo", "OSD" };
724
725    conf.zebra_draw_osd+=change;
726    if (conf.zebra_draw_osd<0)
727        conf.zebra_draw_osd=(sizeof(modes)/sizeof(modes[0]))-1;
728    else if (conf.zebra_draw_osd>=(sizeof(modes)/sizeof(modes[0])))
729        conf.zebra_draw_osd=0;
730
731    return modes[conf.zebra_draw_osd];
732}
733
734//-------------------------------------------------------------------
735const char* gui_zoom_value_enum(int change, int arg) {
736    static const char* modes[]={ "X", "FL", "EFL" };
737
738    conf.zoom_value+=change;
739    if (conf.zoom_value<0)
740        conf.zoom_value=(sizeof(modes)/sizeof(modes[0]))-1;
741    else if (conf.zoom_value>=(sizeof(modes)/sizeof(modes[0])))
742        conf.zoom_value=0;
743
744    return modes[conf.zoom_value];
745}
746
747const char* gui_show_values_enum(int change, int arg) {
748    static const char* modes[]={ "Don't", "Always", "Shoot" };
749
750    conf.show_values+=change;
751    if (conf.show_values<0)
752        conf.show_values=(sizeof(modes)/sizeof(modes[0]))-1;
753    else if (conf.show_values>=(sizeof(modes)/sizeof(modes[0])))
754        conf.show_values=0;
755
756    return modes[conf.show_values];
757}
758
759const char* gui_nd_filter_state_enum(int change, int arg) {
760    static const char* modes[]={ "Off", "In", "Out" };
761
762    conf.nd_filter_state+=change;
763    if (conf.nd_filter_state<0)
764        conf.nd_filter_state=(sizeof(modes)/sizeof(modes[0]))-1;
765    else if (conf.nd_filter_state>=(sizeof(modes)/sizeof(modes[0])))
766        conf.nd_filter_state=0;
767
768    return modes[conf.nd_filter_state];
769}
770
771
772
773const char* gui_dof_show_value_enum(int change, int arg) {
774    static const char* modes[]={ "Don't", "Separate", "In Misc" };
775
776    conf.show_dof+=change;
777    if (conf.show_dof<0)
778        conf.show_dof=(sizeof(modes)/sizeof(modes[0]))-1;
779    else if (conf.show_dof>=(sizeof(modes)/sizeof(modes[0])))
780        conf.show_dof=0;
781
782    return modes[conf.show_dof];
783}
784
785
786const char* gui_histo_show_enum(int change, int arg) {
787    static const char* modes[]={ "Don't", "Always", "Shoot" };
788
789    conf.show_histo+=change;
790    if (conf.show_histo<0)
791        conf.show_histo=(sizeof(modes)/sizeof(modes[0]))-1;
792    else if (conf.show_histo>=(sizeof(modes)/sizeof(modes[0])))
793        conf.show_histo=0;
794
795    return modes[conf.show_histo];
796}
797
798//-------------------------------------------------------------------
799#if defined(CAMERA_s2is) || defined(CAMERA_s3is) || defined(CAMERA_g7)
800const char* gui_alt_mode_button_enum(int change, int arg) {
801#if defined(CAMERA_s2is) || defined(CAMERA_s3is)
802    static const char* names[]={ "Shrtcut", "Flash", "Timer", "ISO", "Video" };
803    static const int keys[]={ KEY_PRINT, KEY_FLASH, KEY_TIMER, KEY_ISO, KEY_VIDEO };
804#else
805    static const char* names[]={ "Print", "FE"};
806    static const int keys[]={ KEY_PRINT, KEY_MICROPHONE };
807#endif
808    int i;
809
810    for (i=0; i<sizeof(names)/sizeof(names[0]); ++i) {
811        if (conf.alt_mode_button==keys[i]) {
812            break;
813        }
814    }
815
816    i+=change;
817    if (i<0)
818        i=(sizeof(names)/sizeof(names[0]))-1;
819    else if (i>=(sizeof(names)/sizeof(names[0])))
820        i=0;
821
822    conf.alt_mode_button = keys[i];
823    kbd_set_alt_mode_key_mask(conf.alt_mode_button);
824    return names[i];
825}
826#endif
827
828//-------------------------------------------------------------------
829const char* gui_alt_power_enum(int change, int arg) {
830    static const char* modes[]={ "No", "Alt", "Script" };
831
832    conf.alt_prevent_shutdown+=change;
833    if (conf.alt_prevent_shutdown<0)
834        conf.alt_prevent_shutdown=(sizeof(modes)/sizeof(modes[0]))-1;
835    else if (conf.alt_prevent_shutdown>=(sizeof(modes)/sizeof(modes[0])))
836        conf.alt_prevent_shutdown=0;
837
838    return modes[conf.alt_prevent_shutdown];
839}
840const char* gui_video_mode_enum(int change, int arg) {
841    static const char* modes[]={ "Bitrate", "Quality"};
842
843    conf.video_mode+=change;
844    if (conf.video_mode<0)
845        conf.video_mode=(sizeof(modes)/sizeof(modes[0]))-1;
846    else if (conf.video_mode>=(sizeof(modes)/sizeof(modes[0])))
847        conf.video_mode=0;
848
849    return modes[conf.video_mode];
850}
851
852//-------------------------------------------------------------------
853const char* gui_video_bitrate_enum(int change, int arg) {
854    static const char* modes[]={ "0.25x", "0.5x","0.75x", "1x", "1.25x", "1.5x", "1.75x", "2x", "2.5x", "3x"};
855
856    conf.video_bitrate+=change;
857    if (conf.video_bitrate<0)
858        conf.video_bitrate=sizeof(modes)/sizeof(modes[0])-1;
859    else if (conf.video_bitrate>=(sizeof(modes)/sizeof(modes[0])))
860        conf.video_bitrate=0;
861
862    shooting_video_bitrate_change(conf.video_bitrate);
863
864    return modes[conf.video_bitrate];
865}
866
867
868//-------------------------------------------------------------------
869const char* gui_tv_bracket_values_enum(int change, int arg) {
870    static const char* modes[]={ "Off", "1/3 EV","2/3 EV", "1 EV", "1 1/3Ev", "1 2/3Ev", "2 Ev"};
871
872    conf.tv_bracket_value+=change;
873    if (conf.tv_bracket_value<0)
874        conf.tv_bracket_value=sizeof(modes)/sizeof(modes[0])-1;
875    else if (conf.tv_bracket_value>=(sizeof(modes)/sizeof(modes[0])))
876        conf.tv_bracket_value=0;
877
878    return modes[conf.tv_bracket_value];
879}
880
881const char* gui_av_bracket_values_enum(int change, int arg) {
882    static const char* modes[]={ "Off", "1/3 EV","2/3 EV", "1 EV", "1 1/3Ev", "1 2/3Ev", "2 Ev"};
883
884    conf.av_bracket_value+=change;
885    if (conf.av_bracket_value<0)
886        conf.av_bracket_value=sizeof(modes)/sizeof(modes[0])-1;
887    else if (conf.av_bracket_value>=(sizeof(modes)/sizeof(modes[0])))
888        conf.av_bracket_value=0;
889
890    return modes[conf.av_bracket_value];
891}
892
893const char* gui_subj_dist_bracket_koef_enum(int change, int arg) {
894    static const char* modes[]={"Off", "1", "10","100","1000"};
895
896    conf.subj_dist_bracket_koef+=change;
897    if (conf.subj_dist_bracket_koef<0)
898        conf.subj_dist_bracket_koef=sizeof(modes)/sizeof(modes[0])-1;
899    else if (conf.subj_dist_bracket_koef>=(sizeof(modes)/sizeof(modes[0])))
900        conf.subj_dist_bracket_koef=0;
901   
902    return modes[conf.subj_dist_bracket_koef];
903}
904
905const char* gui_iso_bracket_koef_enum(int change, int arg) {
906    static const char* modes[]={ "Off","1", "10","100"};
907
908    conf.iso_bracket_koef+=change;
909    if (conf.iso_bracket_koef<0)
910        conf.iso_bracket_koef=sizeof(modes)/sizeof(modes[0])-1;
911    else if (conf.iso_bracket_koef>=(sizeof(modes)/sizeof(modes[0])))
912        conf.iso_bracket_koef=0;
913   
914    return modes[conf.iso_bracket_koef];
915}
916
917const char* gui_bracket_type_enum(int change, int arg) {
918    static const char* modes[]={ "+/-", "-","+"};
919
920    conf.bracket_type+=change;
921    if (conf.bracket_type<0)
922        conf.bracket_type=0;
923    else if (conf.bracket_type>=(sizeof(modes)/sizeof(modes[0])))
924        conf.bracket_type=sizeof(modes)/sizeof(modes[0])-1;
925
926    return modes[conf.bracket_type];
927}
928
929const char* gui_tv_override_koef_enum(int change, int arg) {
930    static const char* modes[]={"Off", "1/100K", "1/10000", "1/1000","1/100","1/10", "1","10","100"};
931
932    conf.tv_override_koef+=change;
933   if (conf.tv_enum_type) {
934     if (conf.tv_override_koef<0)  conf.tv_override_koef=6;
935     else if (conf.tv_override_koef>6) conf.tv_override_koef=0;
936     else if (conf.tv_override_koef==1)  conf.tv_override_koef=6;
937     else if (conf.tv_override_koef==5)  conf.tv_override_koef=0;
938     else if (conf.tv_override_koef!=0 && conf.tv_override_koef!=6) conf.tv_override_koef=6;
939     }
940   else {
941    if (conf.tv_override_koef<0)
942        conf.tv_override_koef=sizeof(modes)/sizeof(modes[0])-1;
943    else if (conf.tv_override_koef>=(sizeof(modes)/sizeof(modes[0])))
944        conf.tv_override_koef=0;
945    }
946   
947    return modes[conf.tv_override_koef];
948}
949
950const char* gui_tv_override_value_enum(int change, int arg) {
951    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"};
952
953    conf.tv_override_value+=change;
954    if (conf.tv_enum_type) {
955       if (conf.tv_override_value<0) {
956          conf.tv_override_value=sizeof(modes)/sizeof(modes[0])-1;
957        }
958       else if (conf.tv_override_value>=(sizeof(modes)/sizeof(modes[0])))
959         conf.tv_override_value=0;
960       return modes[conf.tv_override_value];
961     }
962     else
963      {
964       char * buf="";   
965       if (conf.tv_override_value<0) {
966          conf.tv_override_value=100;
967        }
968       else if (conf.tv_override_value>100)  conf.tv_override_value=0;
969       sprintf(buf, "%d",  conf.tv_override_value);
970       return buf;
971      }
972}
973
974const char* gui_tv_enum_type_enum(int change, int arg) {
975    static const char* modes[]={"Factor", "Ev Step"};
976
977    conf.tv_enum_type+=change;
978    if (conf.tv_enum_type<0)
979        conf.tv_enum_type=sizeof(modes)/sizeof(modes[0])-1;
980    else if (conf.tv_enum_type>=(sizeof(modes)/sizeof(modes[0])))
981        conf.tv_enum_type=0;
982    if (change) {
983      conf.tv_override_koef=6; 
984          if (conf.tv_enum_type) 
985             conf.tv_override_value=18;
986          else conf.tv_override_value=1;
987      }
988    return modes[conf.tv_enum_type];
989}
990
991
992const char* gui_iso_override_koef_enum(int change, int arg) {
993    static const char* modes[]={ "Off","1", "10","100"};
994
995    conf.iso_override_koef+=change;
996    if (conf.iso_override_koef<0)
997        conf.iso_override_koef=0;
998    else if (conf.iso_override_koef>=(sizeof(modes)/sizeof(modes[0])))
999        conf.iso_override_koef=sizeof(modes)/sizeof(modes[0])-1;
1000   
1001    return modes[conf.iso_override_koef];
1002}
1003
1004const char* gui_subj_dist_override_value_enum(int change, int arg) {
1005        static const int koef[] = {0, 1,10,100,1000};
1006    static char buf[8];
1007    conf.subj_dist_override_value+=(change*koef[conf.subj_dist_override_koef]);
1008    if (conf.subj_dist_override_value<0)
1009        conf.subj_dist_override_value=MAX_DIST;
1010    else if (conf.subj_dist_override_value>MAX_DIST)
1011        conf.subj_dist_override_value=0;
1012    sprintf(buf, "%d", (int)conf.subj_dist_override_value);
1013    return buf;
1014}
1015
1016
1017const char* gui_subj_dist_override_koef_enum(int change, int arg) {
1018    static const char* modes[]={ "Off","1", "10","100","1000"};
1019
1020    conf.subj_dist_override_koef+=change;
1021    if (conf.subj_dist_override_koef<0) conf.subj_dist_override_koef=0;
1022    else if (conf.subj_dist_override_koef>=(sizeof(modes)/sizeof(modes[0])))
1023        conf.subj_dist_override_koef=sizeof(modes)/sizeof(modes[0])-1;
1024   
1025    return modes[conf.subj_dist_override_koef];
1026}
1027
1028/*
1029const char* gui_tv_exposure_order_enum(int change, int arg) {
1030    static const char* modes[]={ "Off", "1","2", "3"};
1031
1032    conf.tv_exposure_order+=change;
1033    if (conf.tv_exposure_order<0)
1034        conf.tv_exposure_order=0;
1035    else if (conf.tv_exposure_order>=(sizeof(modes)/sizeof(modes[0])))
1036        conf.tv_exposure_order=sizeof(modes)/sizeof(modes[0])-1;
1037    if((conf.tv_exposure_order>0) && (conf.av_exposure_order==conf.tv_exposure_order))
1038     {
1039       conf.av_exposure_order=0;
1040     }
1041    if((conf.tv_exposure_order>0) && (conf.iso_exposure_order==conf.tv_exposure_order))
1042     {
1043       conf.iso_exposure_order=0;
1044     }
1045
1046    return modes[conf.tv_exposure_order];
1047}
1048
1049const char* gui_av_exposure_order_enum(int change, int arg) {
1050    static const char* modes[]={ "Off", "1","2", "3"};
1051
1052    conf.av_exposure_order+=change;
1053    if (conf.av_exposure_order<0)
1054        conf.av_exposure_order=0;
1055    else if (conf.av_exposure_order>=(sizeof(modes)/sizeof(modes[0])))
1056        conf.av_exposure_order=sizeof(modes)/sizeof(modes[0])-1;
1057    if((conf.av_exposure_order>0) && (conf.tv_exposure_order==conf.av_exposure_order))
1058     {
1059       conf.tv_exposure_order=0;
1060     }
1061    if((conf.av_exposure_order>0) && (conf.iso_exposure_order==conf.av_exposure_order))
1062     {
1063       conf.iso_exposure_order=0;
1064     }
1065    return modes[conf.av_exposure_order];
1066}
1067
1068const char* gui_iso_exposure_order_enum(int change, int arg) {
1069    static const char* modes[]={ "Off", "1","2", "3"};
1070
1071    conf.iso_exposure_order+=change;
1072    if (conf.iso_exposure_order<0)
1073        conf.iso_exposure_order=0;
1074    else if (conf.iso_exposure_order>=(sizeof(modes)/sizeof(modes[0])))
1075        conf.iso_exposure_order=sizeof(modes)/sizeof(modes[0])-1;
1076    if((conf.iso_exposure_order>0) && (conf.tv_exposure_order==conf.iso_exposure_order))
1077     {
1078       conf.tv_exposure_order=0;
1079     }
1080    if((conf.iso_exposure_order>0) && (conf.av_exposure_order==conf.iso_exposure_order))
1081     {
1082       conf.av_exposure_order=0;
1083     }
1084
1085    return modes[conf.iso_exposure_order];
1086}
1087*/
1088const char* gui_av_override_enum(int change, int arg) {
1089    static char buf[8];
1090    short prop_id;
1091    conf.av_override_value+=change;
1092    if (conf.av_override_value<0) conf.av_override_value=shooting_get_aperture_sizes_table_size()+6;
1093    else if (conf.av_override_value>shooting_get_aperture_sizes_table_size()+6) conf.av_override_value=0;
1094    if (conf.av_override_value == 0)  return "Off";
1095    else {
1096     short prop_id=shooting_get_aperture_from_av96(shooting_get_av96_override_value());         
1097         sprintf(buf, "%d.%02d", (int)prop_id/100, (int)prop_id%100 );
1098         return buf;
1099        }
1100}
1101
1102const char* gui_user_menu_show_enum(int change, int arg) {
1103    static const char* modes[]={ "Off", "On", "Edit" };
1104
1105        if (conf.user_menu_enable == 2) user_menu_save();
1106
1107    conf.user_menu_enable+=change;
1108    if (conf.user_menu_enable<0)
1109        conf.user_menu_enable=(sizeof(modes)/sizeof(modes[0]))-1;
1110    else if (conf.user_menu_enable>=(sizeof(modes)/sizeof(modes[0])))
1111        conf.user_menu_enable=0;
1112
1113    return modes[conf.user_menu_enable];
1114}
1115
1116//-------------------------------------------------------------------
1117void gui_update_script_submenu() {
1118    register int p=0, i;
1119
1120    for (i=0; i<sizeof(script_submenu_items_top)/sizeof(script_submenu_items_top[0]); ++p, ++i) {
1121        script_submenu_items[p]=script_submenu_items_top[i];
1122    }
1123    for (i=0; i<SCRIPT_NUM_PARAMS; ++i) {
1124        if (script_params[i][0]) {
1125            script_submenu_items[p].text=(int)script_params[i];
1126            script_submenu_items[p].type=MENUITEM_INT;
1127            script_submenu_items[p].value=&conf.ubasic_vars[i];
1128            ++p;
1129        }
1130    }
1131    for (i=0; i<sizeof(script_submenu_items_bottom)/sizeof(script_submenu_items_bottom[0]); ++p, ++i) {
1132        script_submenu_items[p]=script_submenu_items_bottom[i];
1133    }
1134}
1135
1136//-------------------------------------------------------------------
1137
1138void raw_fselect_cb(const char * filename){
1139 struct stat st;
1140 if (!filename) return;
1141 stat((char*)filename,&st);
1142 if (st.st_size!=hook_raw_size()) return;
1143 gui_mbox_init((int)"", LANG_RAW_DEVELOP_MESSAGE, MBOX_BTN_OK|MBOX_TEXT_CENTER, NULL);
1144 raw_prepare_develop((char*)filename);
1145}
1146
1147//-------------------------------------------------------------------
1148void gui_raw_develop(int arg){
1149 int m=mode_get();
1150 gui_fselect_init(LANG_RAW_DEVELOP_SELECT_FILE, "A/DCIM", raw_fselect_cb);
1151}
1152
1153//-------------------------------------------------------------------
1154
1155#if defined (CAMERA_MULTIPART)
1156void card_break_proc(unsigned int btn){
1157 if (btn==MBOX_BTN_YES) create_partitions();
1158}
1159
1160
1161static void gui_menuproc_break_card(int arg){
1162 gui_mbox_init(LANG_WARNING, LANG_PARTITIONS_CREATE_WARNING, MBOX_BTN_YES_NO|MBOX_DEF_BTN2|MBOX_TEXT_CENTER, card_break_proc);
1163}
1164
1165
1166static void gui_menuproc_swap_patitons(int arg){
1167 if (get_part_count()<2) gui_mbox_init(LANG_ERROR, LANG_ONLY_ONE_PARTITION, MBOX_BTN_OK|MBOX_TEXT_CENTER, NULL);
1168 else swap_partitions();
1169}
1170#endif
1171
1172//-------------------------------------------------------------------
1173static volatile enum Gui_Mode gui_mode;
1174static volatile int gui_restore;
1175static volatile int gui_in_redraw;
1176static int gui_splash, gui_splash_mode;
1177static char osd_buf[32];
1178#ifdef OPTIONS_AUTOSAVE
1179static Conf old_conf;
1180#endif
1181
1182//-------------------------------------------------------------------
1183void gui_init()
1184{
1185    gui_mode = GUI_MODE_NONE;
1186    gui_restore = 0;
1187    gui_in_redraw = 0;
1188    gui_splash = (conf.splash_show)?SPLASH_TIME:0;
1189    user_menu_restore();
1190    gui_lang_init();
1191    draw_init();
1192
1193    exposition_thresh = screen_size/500;
1194    voltage_step = (conf.batt_step_25)?25:1;
1195    load_bad_pixels_list("A/CHDK/badpixel");
1196}
1197
1198//-------------------------------------------------------------------
1199enum Gui_Mode gui_get_mode() {
1200    return gui_mode;
1201}
1202
1203//-------------------------------------------------------------------
1204void gui_set_mode(enum Gui_Mode mode) {
1205    gui_mode = mode;
1206}
1207
1208//-------------------------------------------------------------------
1209void gui_force_restore() {
1210    gui_restore = gui_in_redraw;
1211}
1212
1213//-------------------------------------------------------------------
1214void gui_redraw()
1215{
1216    enum Gui_Mode gui_mode_old;
1217    static int show_script_console=0;
1218
1219    if (gui_splash) {
1220        if (gui_splash>(SPLASH_TIME-4)) {
1221            gui_draw_splash();
1222        } else if (gui_splash==1 && (mode_get()&MODE_MASK) == gui_splash_mode && (gui_mode==GUI_MODE_NONE || gui_mode==GUI_MODE_ALT)) {
1223            draw_restore();
1224        }
1225        --gui_splash;
1226    }
1227
1228    gui_in_redraw = 1;
1229    gui_mode_old = gui_mode;
1230
1231    switch (gui_mode) {
1232        case GUI_MODE_MENU:
1233            gui_menu_draw();
1234            draw_txt_string(20, 14, "<CNF>", MAKE_COLOR(COLOR_ALT_BG, COLOR_FG));
1235            break;
1236        case GUI_MODE_ALT:
1237            gui_draw_osd();
1238            draw_txt_string(20, 14, "<ALT>", MAKE_COLOR(COLOR_ALT_BG, COLOR_FG));
1239            if ((mode_get()&MODE_MASK) == MODE_REC) {
1240                draw_txt_string(0, 14, script_title, MAKE_COLOR(COLOR_ALT_BG, COLOR_FG));
1241                if (state_kbd_script_run) show_script_console=5;
1242                if (show_script_console) {
1243                    --show_script_console;
1244                    md_draw_grid();
1245                    script_console_draw();
1246                }
1247            }
1248            break;
1249        case GUI_MODE_NONE:
1250            gui_draw_osd();
1251            break;
1252        case GUI_MODE_PALETTE:
1253            gui_palette_draw();
1254            break;
1255        case GUI_MODE_MBOX:
1256            gui_mbox_draw();
1257            break;
1258        case GUI_MODE_REVERSI:
1259            gui_reversi_draw();
1260            break;
1261        case GUI_MODE_SOKOBAN:
1262            gui_sokoban_draw();
1263            break;
1264        case GUI_MODE_DEBUG:
1265            gui_debug_draw();
1266            break;
1267        case GUI_MODE_FSELECT:
1268            gui_fselect_draw();
1269            break;
1270        case GUI_MODE_READ:
1271            gui_read_draw();
1272            break;
1273        case GUI_MODE_OSD:
1274            gui_osd_draw();
1275//            draw_txt_string(20, 14, "<OSD>", MAKE_COLOR(COLOR_ALT_BG, COLOR_FG));
1276            break;
1277        case GUI_MODE_CALENDAR:
1278            gui_calendar_draw();
1279            break;
1280        case GUI_MODE_BENCH:
1281            gui_bench_draw();
1282            break;
1283        case GUI_MODE_MPOPUP:
1284            gui_mpopup_draw();
1285            break;
1286        default:
1287            break;
1288    }
1289   
1290    gui_in_redraw = 0;
1291    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) {
1292        gui_restore = 0;
1293        if (gui_mode != GUI_MODE_REVERSI && gui_mode != GUI_MODE_SOKOBAN)
1294            draw_restore();
1295    }
1296}
1297
1298#ifdef OPTIONS_AUTOSAVE
1299//-------------------------------------------------------------------
1300static inline void conf_store_old_settings() {
1301    old_conf=conf;
1302}
1303
1304//-------------------------------------------------------------------
1305static inline int conf_save_new_settings_if_changed() {
1306    if (memcmp(&old_conf, &conf, sizeof(Conf)) != 0) {
1307                user_menu_save();
1308        conf_save();
1309        conf_store_old_settings();
1310        return 1;
1311    }
1312    return 0;
1313}
1314#endif
1315
1316
1317//-------------------------------------------------------------------
1318void gui_kbd_process()
1319{
1320    int clicked_key;
1321
1322    if (kbd_is_key_clicked(KEY_MENU)){
1323        switch (gui_mode) {
1324            case GUI_MODE_ALT:
1325                                if (conf.user_menu_enable == 1)
1326                                        gui_menu_init(&user_submenu);
1327                                else
1328                gui_menu_init(&root_menu);
1329                gui_mode = GUI_MODE_MENU;
1330                draw_restore();
1331                break;
1332            case GUI_MODE_MENU:
1333#ifdef OPTIONS_AUTOSAVE
1334                conf_save_new_settings_if_changed();
1335#endif
1336                gui_mode = GUI_MODE_ALT;
1337                draw_restore();
1338                break;
1339            case GUI_MODE_PALETTE:
1340            case GUI_MODE_REVERSI:
1341            case GUI_MODE_SOKOBAN:
1342            case GUI_MODE_DEBUG:
1343            case GUI_MODE_OSD:
1344            case GUI_MODE_CALENDAR:
1345            case GUI_MODE_BENCH:
1346                draw_restore();
1347                gui_mode = GUI_MODE_MENU;
1348                break;
1349            case GUI_MODE_FSELECT:
1350                gui_fselect_kbd_process();
1351                break;
1352            case GUI_MODE_READ:
1353                gui_read_kbd_process();
1354                draw_restore();
1355                gui_mode = GUI_MODE_MENU;
1356                break;
1357            default:
1358                break;
1359        }
1360        return;
1361    }
1362   
1363    switch (gui_mode) {
1364        case GUI_MODE_ALT:
1365            if (kbd_is_key_clicked(SHORTCUT_TOGGLE_RAW)) {
1366                if (conf.ns_enable_memdump) dump_memory();
1367#if defined (CAMERA_ixus800_sd700) || defined (CAMERA_ixus850_sd800) || defined (CAMERA_ixus70_sd1000) || defined (CAMERA_a560) || defined (CAMERA_a460) || defined(CAMERA_ixus55_sd450)
1368                else if (!shooting_get_common_focus_mode())
1369#else               
1370                                else
1371#endif                                                 
1372                                   {conf.save_raw = !conf.save_raw;
1373                    draw_restore();
1374                   }
1375#if defined (CAMERA_a460)
1376                                else {
1377               if (conf.subj_dist_override_koef==4)
1378                  gui_subj_dist_override_koef_enum(-3,0);
1379               else
1380                  gui_subj_dist_override_koef_enum(1,0);
1381                                  }
1382#elif defined (CAMERA_ixus800_sd700) || defined (CAMERA_ixus850_sd800) || defined (CAMERA_ixus70_sd1000) || defined (CAMERA_a560) || defined(CAMERA_ixus55_sd450)
1383                else
1384                                  {
1385                                  conf.subj_dist_override_value=MAX_DIST;       
1386                  shooting_set_focus(shooting_get_subject_distance_override_value(), SET_NOW);
1387                                  }
1388#endif                                                                     
1389            } else if (kbd_is_key_clicked(KEY_SET)) {
1390                gui_menu_init(&script_submenu);
1391                gui_mode = GUI_MODE_MENU;
1392                draw_restore();
1393            } else {
1394#if defined (CAMERA_ixus800_sd700) || defined (CAMERA_ixus850_sd800) || defined (CAMERA_ixus70_sd1000) || defined (CAMERA_a560) || defined (CAMERA_a460) || defined(CAMERA_ixus55_sd450)
1395                        if (kbd_is_key_clicked(SHORTCUT_MF_TOGGLE)) {
1396                              if (conf.subj_dist_override_koef>0)
1397                                     conf.subj_dist_override_koef=0;
1398                              else conf.subj_dist_override_koef=1;
1399                              draw_restore();
1400                             }
1401                else if (shooting_get_common_focus_mode())
1402#elif !defined (CAMERA_ixus700_sd500)
1403               if (shooting_get_common_focus_mode())
1404#endif
1405#if !defined (CAMERA_ixus700_sd500)           
1406                          {
1407#if !defined (CAMERA_a460)
1408                                if (kbd_is_key_clicked(KEY_RIGHT)) {
1409                                  gui_subj_dist_override_koef_enum(1,0);
1410#if defined (CAMERA_ixus800_sd700) || defined (CAMERA_ixus850_sd800) || defined (CAMERA_ixus70_sd1000) || defined (CAMERA_a560) || defined(CAMERA_ixus55_sd450)
1411                  if (conf.subj_dist_override_koef==0) conf.subj_dist_override_koef=1;
1412#endif
1413                  shooting_set_focus(shooting_get_subject_distance_override_value(), SET_NOW);
1414                                  }
1415                                else if (kbd_is_key_clicked(KEY_LEFT))
1416                                  {
1417                                  gui_subj_dist_override_koef_enum(-1,0);
1418#if defined (CAMERA_ixus800_sd700) || defined (CAMERA_ixus850_sd800) || defined (CAMERA_ixus70_sd1000) || defined (CAMERA_a560) || defined(CAMERA_ixus55_sd450)
1419                  if (conf.subj_dist_override_koef==0) conf.subj_dist_override_koef=1;
1420#endif
1421                  shooting_set_focus(shooting_get_subject_distance_override_value(), SET_NOW);
1422                                  }
1423                                else if (kbd_is_key_clicked(SHORTCUT_SET_INFINITY))
1424                                  {
1425                                  conf.subj_dist_override_value=MAX_DIST;       
1426                  shooting_set_focus(shooting_get_subject_distance_override_value(), SET_NOW);
1427                                  }
1428                                else
1429#endif
1430                                if (kbd_is_key_clicked(SHORTCUT_SET_HYPERFOCAL))
1431                                  {     
1432                                  int m=mode_get()&MODE_SHOOTING_MASK;
1433                                  if ((m==MODE_M) || (m==MODE_AV))
1434                                    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()));
1435                                  else conf.subj_dist_override_value=(int)shooting_get_hyperfocal_distance();           
1436                  shooting_set_focus(shooting_get_subject_distance_override_value(), SET_NOW);
1437                                  }   
1438                                else 
1439                                switch (kbd_get_autoclicked_key()) {
1440#if defined (CAMERA_a460)
1441              case KEY_RIGHT:
1442#else
1443                                  case KEY_ZOOM_IN:
1444#endif
1445                  gui_subj_dist_override_value_enum(1,0);
1446                  shooting_set_focus(shooting_get_subject_distance_override_value(),SET_NOW);
1447                  break;
1448#if defined (CAMERA_a460)
1449              case KEY_LEFT:
1450#else
1451                 case KEY_ZOOM_OUT:
1452#endif
1453                  gui_subj_dist_override_value_enum(-1,0);
1454                  shooting_set_focus(shooting_get_subject_distance_override_value(), SET_NOW);
1455                  break;
1456                  }
1457              }
1458#endif                           
1459            }
1460            break;
1461        case GUI_MODE_MENU:
1462            gui_menu_kbd_process();
1463            break;
1464        case GUI_MODE_PALETTE:
1465            gui_palette_kbd_process();
1466            break;
1467        case GUI_MODE_MBOX:
1468            gui_mbox_kbd_process();
1469            break;
1470        case GUI_MODE_REVERSI:
1471            gui_reversi_kbd_process();
1472            break;
1473        case GUI_MODE_SOKOBAN:
1474            gui_sokoban_kbd_process();
1475            break;
1476        case GUI_MODE_DEBUG:
1477            gui_debug_kbd_process();
1478            break;
1479        case GUI_MODE_FSELECT:
1480            gui_fselect_kbd_process();
1481            break;
1482        case GUI_MODE_READ:
1483            gui_read_kbd_process();
1484            break;
1485        case GUI_MODE_OSD:
1486            gui_osd_kbd_process();
1487            break;
1488        case GUI_MODE_CALENDAR:
1489            gui_calendar_kbd_process();
1490            break;
1491        case GUI_MODE_BENCH:
1492            gui_bench_kbd_process();
1493            break;
1494        case GUI_MODE_MPOPUP:
1495            gui_mpopup_kbd_process();
1496             break;
1497        default:
1498            break;
1499    }
1500}
1501
1502//-------------------------------------------------------------------
1503void gui_kbd_enter()
1504{
1505    // XXX set custom palette
1506#ifdef OPTIONS_AUTOSAVE
1507    conf_store_old_settings();
1508#endif
1509    if ((conf.alt_prevent_shutdown == ALT_PREVENT_SHUTDOWN_ALT && !state_kbd_script_run)
1510        || conf.alt_prevent_shutdown == ALT_PREVENT_SHUTDOWN_ALT_SCRIPT) {
1511        disable_shutdown();
1512    }
1513    gui_mode = GUI_MODE_ALT;
1514}
1515
1516//-------------------------------------------------------------------
1517void gui_kbd_leave()
1518{
1519    // XXX restore palette
1520#ifdef OPTIONS_AUTOSAVE
1521    conf_save_new_settings_if_changed();
1522#endif
1523    ubasic_error = 0;
1524    draw_restore();
1525    if (gui_mode == GUI_MODE_READ && !rbf_load(conf.menu_rbf_file))
1526        rbf_load_from_8x16(current_font);
1527    rbf_set_codepage(FONT_CP_WIN);
1528    enable_shutdown();
1529    gui_mode = GUI_MODE_NONE;
1530}
1531
1532//-------------------------------------------------------------------
1533extern long physw_status[3];
1534extern long GetPropertyCase(long opt_id, void *buf, long bufsize);
1535//extern int xxxx, eeee;
1536//-------------------------------------------------------------------
1537void gui_draw_osd() {
1538    unsigned int m, n = 0, mode_photo, mode_video;
1539    coord x;
1540    static int flashlight = 0, zebra = 0, zebra_init = 0, pressed = 0;
1541    static int half_disp_press_old=0;
1542    int half_disp_press;
1543   
1544    m = mode_get();
1545
1546    if (conf.flashlight && (m&MODE_SCREEN_OPENED) && (m&MODE_SCREEN_ROTATED) && (gui_mode==GUI_MODE_NONE /* || gui_mode==GUI_MODE_ALT */)) {
1547        draw_filled_rect(0, 0, screen_width-1, screen_height-1, MAKE_COLOR(COLOR_WHITE, COLOR_WHITE));
1548        flashlight = 1;
1549    }
1550    if (flashlight) {
1551        if ((!((m&MODE_SCREEN_OPENED) && (m&MODE_SCREEN_ROTATED))) || (gui_mode!=GUI_MODE_NONE /* && gui_mode!=GUI_MODE_ALT */)) {
1552            flashlight = 0;
1553            draw_restore();
1554        }
1555        return;
1556    }
1557   
1558    if (kbd_is_key_pressed(KEY_SHOOT_HALF)) {
1559        if (kbd_is_key_pressed(SHORTCUT_TOGGLE_ZEBRA)) {
1560            if (!pressed) {
1561                conf.zebra_draw = !conf.zebra_draw;
1562                if (zebra && !conf.zebra_draw) {
1563                    zebra = 0;
1564                    draw_restore();
1565                }
1566                pressed = 1;
1567            }
1568        }
1569         else if (kbd_is_key_pressed(SHORTCUT_TOGGLE_HISTO)) {
1570            if (!pressed) {
1571                if (++conf.show_histo>SHOW_HALF) conf.show_histo=0;
1572                if (!conf.show_histo) {
1573                    draw_restore();
1574                }
1575                pressed = 1;
1576            }
1577        } else if (kbd_is_key_pressed(SHORTCUT_TOGGLE_OSD)) {
1578            if (!pressed) {
1579                conf.show_osd = !conf.show_osd;
1580                if (!conf.show_osd) {
1581                    draw_restore();
1582                }
1583                pressed = 1;
1584            }
1585        } else {
1586            pressed = 0;
1587        }
1588    } else {
1589        pressed = 0;
1590    }
1591   
1592    mode_video = ((m&MODE_SHOOTING_MASK)==MODE_VIDEO_STD ||
1593                                 (m&MODE_SHOOTING_MASK)==MODE_VIDEO_SPEED || 
1594                                 (m&MODE_SHOOTING_MASK)==MODE_VIDEO_COMPACT ||
1595                                 (m&MODE_SHOOTING_MASK)==MODE_VIDEO_MY_COLORS ||
1596                                 (m&MODE_SHOOTING_MASK)==MODE_VIDEO_COLOR_ACCENT ||
1597                 (m&MODE_SHOOTING_MASK)==MODE_VIDEO_TIME_LAPSE);
1598   
1599   
1600    mode_photo = (m&MODE_MASK) == MODE_PLAY ||
1601                 !( mode_video ||
1602                                 (m&MODE_SHOOTING_MASK)==MODE_STITCH);
1603
1604    half_disp_press=mode_photo && kbd_is_key_pressed(KEY_SHOOT_HALF) && kbd_is_key_pressed(KEY_DISPLAY);
1605    if (half_disp_press && ! half_disp_press_old) draw_restore();
1606    half_disp_press_old=half_disp_press;
1607    if (half_disp_press) return;
1608
1609    if (conf.zebra_draw && gui_mode==GUI_MODE_NONE && kbd_is_key_pressed(KEY_SHOOT_HALF) && mode_photo) {
1610        if (!zebra_init) {
1611            zebra_init = 1;
1612            gui_osd_zebra_init();
1613        }
1614        zebra = gui_osd_draw_zebra();
1615    }
1616    if (zebra_init && !kbd_is_key_pressed(KEY_SHOOT_HALF)) {
1617        zebra_init = 0;
1618    }
1619    if (zebra) {
1620        if (!kbd_is_key_pressed(KEY_SHOOT_HALF)) {
1621            zebra = 0;
1622            draw_restore();
1623        }
1624        return;
1625    }
1626#if !defined (CAMERA_ixus700_sd500) && !defined (CAMERA_ixus800_sd700) && !defined (CAMERA_ixus850_sd800) && !defined (CAMERA_ixus70_sd1000) && !defined (CAMERA_a560) && !defined (CAMERA_a460) && !defined(CAMERA_ixus55_sd450)
1627    if (!(conf.show_osd && (canon_menu_active==(int)&canon_menu_active-4) && (canon_shoot_menu_active==0)))  return;   
1628#else
1629    if (!(conf.show_osd && (canon_menu_active==(int)&canon_menu_active-4) /*&& (canon_shoot_menu_active==0)*/ ))  return;
1630#endif 
1631
1632   
1633    if ((gui_mode==GUI_MODE_NONE || gui_mode==GUI_MODE_ALT) && (
1634     (kbd_is_key_pressed(KEY_SHOOT_HALF) && ((conf.show_histo==SHOW_HALF)/* || (m&MODE_MASK) == MODE_PLAY*/)) ||
1635     ((conf.show_histo==SHOW_ALWAYS)  &&  !((m&MODE_MASK) == MODE_PLAY) && (recreview_hold==0))
1636    ) &&
1637    (mode_photo || (m&MODE_SHOOTING_MASK)==MODE_STITCH)) {
1638        gui_osd_draw_histo();
1639    }
1640
1641    if ((m&MODE_MASK) == MODE_REC && (recreview_hold==0 || conf.show_osd_in_review) ) {
1642//        m &= MODE_SHOOTING_MASK;
1643//        if (m==MODE_SCN_WATER || m==MODE_SCN_NIGHT || m==MODE_SCN_CHILD || m==MODE_SCN_PARTY || m==MODE_STITCH ||
1644//            m==MODE_SCN_GRASS || m==MODE_SCN_SNOW  || m==MODE_SCN_BEACH || m==MODE_SCN_FIREWORK || m==MODE_VIDEO)
1645//            ++n;
1646
1647        if (conf.show_grid_lines) {
1648            gui_grid_draw_osd(1);
1649        }
1650        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) )) {
1651                 
1652           if (conf.show_dof!=DOF_DONT_SHOW) gui_osd_calc_dof();
1653           
1654           if (conf.show_dof==DOF_SHOW_IN_DOF) gui_osd_draw_dof(); 
1655           
1656           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();                             
1657        }
1658        if (conf.show_state && !mode_video) gui_osd_draw_state();
1659        if (conf.save_raw && conf.show_raw_state && !mode_video) gui_osd_draw_raw_info();
1660       
1661            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)))
1662                   gui_osd_draw_values(1);
1663        else if  (shooting_get_common_focus_mode() && mode_photo && conf.show_values && !(conf.show_dof==DOF_SHOW_IN_DOF) )   
1664           gui_osd_draw_values(2);
1665            else if  (conf.show_values==SHOW_HALF)
1666                   gui_osd_draw_values(0);   
1667    }
1668
1669
1670    if (recreview_hold==0) {
1671        gui_batt_draw_osd();
1672        gui_space_draw_osd();
1673    }
1674   
1675    if ((conf.show_clock) && (recreview_hold==0)) {
1676        gui_osd_draw_clock();
1677    }
1678
1679#if defined (CAMERA_ixus700_sd500) || defined (CAMERA_ixus800_sd700) || defined (CAMERA_ixus850_sd800) || defined (CAMERA_a460)
1680    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) {   
1681     strcpy(osd_buf,shooting_get_tv_str());
1682     strcat(osd_buf,"\"  F");
1683     strcat(osd_buf,shooting_get_av_str());
1684     draw_txt_string(22-strlen(osd_buf)/2, 14, osd_buf, conf.osd_color);
1685    }
1686#endif
1687
1688    if (debug_vals_show) {
1689//        long v=get_file_counter();
1690//      sprintf(osd_buf, "1:%03d-%04d  ", (v>>18)&0x3FF, (v>>4)&0x3FFF);
1691//      sprintf(osd_buf, "1:%d, %08X  ", xxxx, eeee);
1692        sprintf(osd_buf, "1:%8x  ", physw_status[0]);
1693        draw_txt_string(28, 10, osd_buf, conf.osd_color);
1694
1695        sprintf(osd_buf, "2:%8x  ", physw_status[1]);
1696        draw_txt_string(28, 11, osd_buf, conf.osd_color);
1697
1698        sprintf(osd_buf, "3:%8x  ", physw_status[2]);
1699        draw_txt_string(28, 12, osd_buf, conf.osd_color);
1700
1701//      sprintf(osd_buf, "4:%8x  ", vid_get_viewport_fb_d());
1702        sprintf(osd_buf, "4:%8x  ", get_usb_power(1));
1703        draw_txt_string(28, 13, osd_buf, conf.osd_color);
1704    }
1705
1706   {
1707        static char sbuf[100];
1708    int r,i, p, len;
1709    if (debug_propcase_show){
1710
1711        for (i=0;i<10;i++){
1712            r = 0;
1713            p = debug_propcase_page*10+i;
1714            get_property_case(p, &r, 4);
1715            sprintf(sbuf, "%3d: %d              ", p, r);sbuf[20]=0;
1716            draw_string(64,16+16*i,sbuf, conf.osd_color);
1717        }
1718    }
1719
1720if (debug_pardata_show){
1721        extern long* FlashParamsTable[];
1722        char s[30];
1723        int count;
1724
1725        for (i=0;i<10;i++){
1726            r = 0;
1727            p = debug_propcase_page*10+i;
1728            if (p>=get_flash_params_count())  sprintf(sbuf, "%3d: This parameter does not exists", p);
1729            else   {
1730             len=FlashParamsTable[p][1]>>16;
1731             if ((len==1)||(len==2)||(len==4)){
1732              get_parameter_data(p, &r, len);
1733              sprintf(sbuf, "%3d: %30d :%2d ", p, r,len);
1734              }
1735             else {
1736              if (len>=sizeof(s)) count=sizeof(s)-1; else count=len;
1737              get_parameter_data(p, &s, count);
1738              s[count]=0;
1739              sprintf(sbuf, "%3d: %30s :%2d ", p, s,len);
1740             }
1741            }
1742            draw_string(16,16+16*i,sbuf, conf.osd_color);
1743        }
1744    }
1745   }
1746
1747
1748    if (ubasic_error){
1749        const char *msg;
1750        if (ubasic_error >= UBASIC_E_ENDMARK) {
1751            msg = ubasic_errstrings[UBASIC_E_UNKNOWN_ERROR];
1752        } else {
1753            msg = ubasic_errstrings[ubasic_error];
1754        }
1755        sprintf(osd_buf, "uBASIC:%d %s ", ubasic_linenumber(), msg);
1756        draw_txt_string(0, 0, osd_buf, MAKE_COLOR(COLOR_RED, COLOR_YELLOW));
1757    }
1758}
1759
1760#ifndef OPTIONS_AUTOSAVE
1761//-------------------------------------------------------------------
1762void gui_menuproc_save(int arg)
1763{
1764    conf_save();
1765}
1766#endif
1767
1768//-------------------------------------------------------------------
1769static void gui_menuproc_reset_selected(unsigned int btn) {
1770    if (btn==MBOX_BTN_YES)
1771        conf_load_defaults();
1772}
1773
1774void gui_menuproc_reset(int arg)
1775{
1776    gui_mbox_init(LANG_MSG_RESET_OPTIONS_TITLE,
1777                  LANG_MSG_RESET_OPTIONS_TEXT,
1778                  MBOX_FUNC_RESTORE|MBOX_TEXT_CENTER|MBOX_BTN_YES_NO|MBOX_DEF_BTN2, gui_menuproc_reset_selected);
1779}
1780
1781//-------------------------------------------------------------------
1782void gui_draw_palette(int arg) {
1783    draw_restore();
1784    gui_palette_init(PALETTE_MODE_DEFAULT, 0x00, NULL);
1785    gui_mode = GUI_MODE_PALETTE;
1786}
1787
1788//-------------------------------------------------------------------
1789void gui_show_build_info(int arg) {
1790    static char buf[192];
1791
1792    sprintf(buf, lang_str(LANG_MSG_BUILD_INFO_TEXT), HDK_VERSION, BUILD_NUMBER, __DATE__, __TIME__, PLATFORM, PLATFORMSUB);
1793    gui_mbox_init(LANG_MSG_BUILD_INFO_TITLE, (int)buf, MBOX_FUNC_RESTORE|MBOX_TEXT_LEFT, NULL);
1794}
1795
1796//-------------------------------------------------------------------
1797void gui_show_memory_info(int arg) {
1798    static char buf[64];
1799    int size, l_size, d;
1800    char* ptr;
1801
1802    size = 16;
1803    while (1) {
1804        ptr= malloc(size);
1805        if (ptr) {
1806            free(ptr);
1807            size <<= 1;
1808        } else
1809            break;
1810    }
1811
1812    l_size = size;
1813    size >>= 1;
1814    d=1024;
1815    while (d) {
1816        ptr = malloc(size);
1817        if (ptr) {
1818            free(ptr);
1819            d = l_size-size;
1820            if (d<0) d=-d;
1821            l_size = size;
1822            size += d>>1;
1823        } else {
1824            d = size-l_size;
1825            if (d<0) d=-d;
1826            l_size = size;
1827            size -= d>>1;
1828        }
1829       
1830    }
1831   
1832    sprintf(buf, lang_str(LANG_MSG_MEMORY_INFO_TEXT), size-1);
1833    gui_mbox_init(LANG_MSG_MEMORY_INFO_TITLE, (int)buf, MBOX_FUNC_RESTORE|MBOX_TEXT_CENTER, NULL);
1834}
1835
1836//-------------------------------------------------------------------
1837void gui_draw_reversi(int arg) {
1838    if ((mode_get()&MODE_MASK) != MODE_PLAY) {
1839        gui_mbox_init(LANG_MSG_INFO_TITLE, LANG_MSG_SWITCH_TO_PLAY_MODE,
1840                      MBOX_FUNC_RESTORE|MBOX_TEXT_CENTER, NULL);
1841        return;
1842    }
1843    gui_mode = GUI_MODE_REVERSI;
1844    gui_reversi_init();
1845}
1846
1847//-------------------------------------------------------------------
1848void gui_draw_sokoban(int arg) {
1849    if ((mode_get()&MODE_MASK) != MODE_PLAY) {
1850        gui_mbox_init(LANG_MSG_INFO_TITLE, LANG_MSG_SWITCH_TO_PLAY_MODE,
1851                      MBOX_FUNC_RESTORE|MBOX_TEXT_CENTER, NULL);
1852        return;
1853    }
1854    gui_mode = GUI_MODE_SOKOBAN;
1855    gui_sokoban_init();
1856}
1857
1858//-------------------------------------------------------------------
1859void gui_draw_debug(int arg) {
1860//    gui_debug_init(0x2510);
1861//    gui_debug_init(0x127E0);
1862//    gui_debug_init(0x7F5B8);
1863//    gui_debug_init(malloc(16));
1864    gui_debug_init((void*)0xB054);
1865}
1866
1867//-------------------------------------------------------------------
1868void gui_draw_bench(int arg) {
1869    gui_mode = GUI_MODE_BENCH;
1870    gui_bench_init();
1871}
1872
1873//-------------------------------------------------------------------
1874void gui_draw_splash() {
1875    coord w, h, x, y;
1876    static const char *text[] = {
1877        "CHDK Firmware '" HDK_VERSION ", #" BUILD_NUMBER "'" ,
1878        "Build: " __DATE__ " " __TIME__ ,
1879        "Camera: " PLATFORM " - " PLATFORMSUB };
1880    int i, l;
1881    color cl = MAKE_COLOR((gui_splash_mode==MODE_REC)?0xDA:0xD9, COLOR_WHITE);
1882
1883    gui_splash_mode = (mode_get()&MODE_MASK);
1884
1885    h=sizeof(text)/sizeof(text[0])*FONT_HEIGHT+8;
1886    w=0;
1887    for (i=0; i<sizeof(text)/sizeof(text[0]); ++i) {
1888        l=strlen(text[i]);
1889        if (l>w) w=l;
1890    }
1891    w=w*FONT_WIDTH+10;
1892
1893    x = (screen_width-w)>>1; y = (screen_height-h)>>1;
1894    draw_filled_rect(x, y, x+w, y+h, cl);
1895    for (i=0; i<sizeof(text)/sizeof(text[0]); ++i) {
1896        draw_string(x+((w-strlen(text[i])*FONT_WIDTH)>>1), y+i*FONT_HEIGHT+4, text[i], cl);
1897    }
1898}
1899
1900//-------------------------------------------------------------------
1901void gui_draw_fselect(int arg) {
1902    gui_fselect_init(LANG_STR_FILE_BROWSER, "A", NULL);
1903}
1904
1905//-------------------------------------------------------------------
1906static void gui_load_script_selected(const char *fn) {
1907    if (fn)
1908        script_load(fn);
1909}
1910void gui_load_script(int arg) {
1911    DIR   *d;
1912    char  *path="A/CHDK/SCRIPTS";
1913
1914    // if exists "A/CHDK/SCRIPTS" go into
1915    d=opendir(path);
1916    if (d) {
1917        closedir(d);
1918    } else {
1919        path="A";
1920    }
1921
1922    gui_fselect_init(LANG_STR_SELECT_SCRIPT_FILE, path, gui_load_script_selected);
1923}
1924
1925//-------------------------------------------------------------------
1926static void gui_grid_lines_load_selected(const char *fn) {
1927    if (fn)
1928        grid_lines_load(fn);
1929}
1930void gui_grid_lines_load(int arg) {
1931    DIR   *d;
1932    char  *path="A/CHDK/GRIDS";
1933
1934    // if exists "A/CHDK/GRIDS" go into
1935    d=opendir(path);
1936    if (d) {
1937        closedir(d);
1938    } else {
1939        path="A";
1940    }
1941
1942    gui_fselect_init(LANG_STR_SELECT_GRID_FILE, path, gui_grid_lines_load_selected);
1943}
1944
1945//-------------------------------------------------------------------
1946void gui_draw_osd_le(int arg) {
1947    gui_mode = GUI_MODE_OSD;
1948    gui_osd_init();
1949}
1950
1951//-------------------------------------------------------------------
1952static void gui_draw_read_selected(const char *fn) {
1953    if (fn) {
1954        if (!rbf_load(conf.reader_rbf_file))
1955            rbf_load_from_8x16(current_font);
1956        rbf_set_codepage(conf.reader_codepage);
1957        gui_mode = GUI_MODE_READ;
1958        gui_read_init(fn);
1959    }
1960}
1961void gui_draw_read(int arg) {
1962    DIR   *d;
1963    char  *path="A/CHDK/BOOKS";
1964
1965    // if exists "A/CHDK/BOOKS" go into
1966    d=opendir(path);
1967    if (d) {
1968        closedir(d);
1969    } else {
1970        path="A";
1971    }
1972    gui_fselect_init(LANG_STR_SELECT_TEXT_FILE, path, gui_draw_read_selected);
1973}
1974
1975//-------------------------------------------------------------------
1976void gui_draw_read_last(int arg) {
1977    int fd;
1978   
1979    fd = open(conf.reader_file, O_RDONLY, 0777);
1980    if (fd >= 0) {
1981        close(fd);
1982        gui_draw_read_selected(conf.reader_file);
1983    } else {
1984        gui_draw_read(arg);
1985    }
1986}
1987
1988//-------------------------------------------------------------------
1989void gui_menuproc_mkbootdisk(int arg) {
1990    mark_filesystem_bootable();
1991}
1992
1993//-------------------------------------------------------------------
1994void gui_draw_calendar(int arg) {
1995    gui_mode = GUI_MODE_CALENDAR;
1996    gui_calendar_init();
1997}
1998
1999//-------------------------------------------------------------------
2000static void gui_draw_rbf_selected(const char *fn) {
2001    if (fn) {
2002        strcpy(conf.reader_rbf_file, fn);
2003    }
2004}
2005void gui_draw_load_rbf(int arg) {
2006    DIR   *d;
2007    char  *path="A/CHDK/FONTS";
2008
2009    // if exists "A/CHDK/FONTS" go into
2010    d=opendir(path);
2011    if (d) {
2012        closedir(d);
2013    } else {
2014        path="A";
2015    }
2016
2017    gui_fselect_init(LANG_STR_SELECT_FONT_FILE, path, gui_draw_rbf_selected);
2018}
2019
2020//-------------------------------------------------------------------
2021static void gui_draw_menu_rbf_selected(const char *fn) {
2022    if (fn) {
2023        strcpy(conf.menu_rbf_file, fn);
2024        if (!rbf_load(conf.menu_rbf_file))
2025            rbf_load_from_8x16(current_font);
2026        rbf_set_codepage(FONT_CP_WIN);
2027        gui_menu_init(NULL);
2028    }
2029}
2030void gui_draw_load_menu_rbf(int arg) {
2031    DIR   *d;
2032    char  *path="A/CHDK/FONTS";
2033
2034    // if exists "A/CHDK/FONTS" go into
2035    d=opendir(path);
2036    if (d) {
2037        closedir(d);
2038    } else {
2039        path="A";
2040    }
2041
2042    gui_fselect_init(LANG_STR_SELECT_FONT_FILE, path, gui_draw_menu_rbf_selected);
2043}
2044
2045//-------------------------------------------------------------------
2046static void gui_draw_lang_selected(const char *fn) {
2047    if (fn) {
2048        strcpy(conf.lang_file, fn);
2049        lang_load_from_file(conf.lang_file);
2050        gui_menu_init(NULL);
2051    }
2052}
2053void gui_draw_load_lang(int arg) {
2054    DIR   *d;
2055    char  *path="A/CHDK/LANG";
2056
2057    // if exists "A/CHDK/LANG" go into
2058    d=opendir(path);
2059    if (d) {
2060        closedir(d);
2061    } else {
2062        path="A";
2063    }
2064
2065    gui_fselect_init(LANG_STR_SELECT_LANG_FILE, path, gui_draw_lang_selected);
2066}
2067
2068int find_mnu(CMenu *curr_menu, int mnu, int count)
2069{
2070        int gui_menu_curr_item;
2071
2072        gui_menu_curr_item = 0;
2073        while(curr_menu->menu[gui_menu_curr_item].text) {
2074                if (curr_menu->menu[gui_menu_curr_item].text == mnu){
2075                        user_submenu_items[count] = curr_menu->menu[gui_menu_curr_item];
2076                        return 1;
2077                }
2078                if ((curr_menu->menu[gui_menu_curr_item].type & MENUITEM_MASK) == MENUITEM_SUBMENU)
2079                        if (find_mnu((CMenu*)(curr_menu->menu[gui_menu_curr_item].value), mnu, count)) return 1;
2080                gui_menu_curr_item++;
2081        }
2082        return 0;
2083}
2084
2085void user_menu_save() {
2086    int x;
2087        for (x=0; x<10; x++) {
2088                conf.user_menu_vars[x] = user_submenu_items[x].text;
2089        }
2090}
2091
2092void user_menu_restore() {
2093    int x;
2094        for (x=0; x<10; x++) {
2095                find_mnu(&root_menu, conf.user_menu_vars[x], x);
2096        }
2097}
Note: See TracBrowser for help on using the repository browser.