0000: 2f 2a 20 54 68 69 73 20 66 69 6c 65 20 62 61 73 /* This file bas
0010: 65 64 20 6f 6e 20 6d 65 6e 75 5f 73 63 72 6f 6c ed on menu_scrol
0020: 6c 2e 63 20 66 72 6f 6d 3a 0a 68 74 74 70 3a 2f l.c from:.http:/
0030: 2f 74 6c 64 70 2e 6f 72 67 2f 48 4f 57 54 4f 2f /tldp.org/HOWTO/
0040: 4e 43 55 52 53 45 53 2d 50 72 6f 67 72 61 6d 6d NCURSES-Programm
0050: 69 6e 67 2d 48 4f 57 54 4f 2f 69 6e 74 72 6f 2e ing-HOWTO/intro.
0060: 68 74 6d 6c 20 2a 2f 0a 23 69 6e 63 6c 75 64 65 html */.#include
0070: 20 3c 63 75 72 73 65 73 2e 68 3e 0a 23 69 6e 63 <curses.h>.#inc
0080: 6c 75 64 65 20 3c 6d 65 6e 75 2e 68 3e 0a 23 69 lude <menu.h>.#i
0090: 6e 63 6c 75 64 65 20 3c 6d 61 74 68 2e 68 3e 0a nclude <math.h>.
00a0: 23 69 6e 63 6c 75 64 65 20 3c 73 74 64 6c 69 62 #include <stdlib
00b0: 2e 68 3e 0a 0a 2f 2a 20 4c 65 61 72 6e 69 6e 67 .h>../* Learning
00c0: 20 6e 6f 74 65 73 20 2d 20 54 68 69 73 20 69 73 notes - This is
00d0: 20 61 20 6d 61 63 72 6f 20 74 68 61 74 20 69 73 a macro that is
00e0: 20 65 78 70 61 6e 64 65 64 20 28 74 65 78 74 20 expanded (text
00f0: 73 75 62 73 74 69 74 75 74 69 6f 6e 29 20 62 65 substitution) be
0100: 66 6f 72 65 20 63 6f 6d 70 69 6c 69 6e 67 20 2a fore compiling *
0110: 2f 0a 23 64 65 66 69 6e 65 20 41 52 52 41 59 5f /.#define ARRAY_
0120: 53 49 5a 45 28 61 29 20 28 73 69 7a 65 6f 66 28 SIZE(a) (sizeof(
0130: 61 29 20 2f 20 73 69 7a 65 6f 66 28 61 5b 30 5d a) / sizeof(a[0]
0140: 29 29 0a 0a 63 68 61 72 20 2a 65 78 70 6f 73 75 ))..char *exposu
0150: 72 65 5f 61 72 72 61 79 5b 5d 20 3d 20 7b 0a 09 re_array[] = {..
0160: 22 2d 36 22 2c 0a 09 22 2d 35 22 2c 0a 09 22 2d "-6",.."-5",.."-
0170: 34 22 2c 0a 09 22 2d 33 22 2c 0a 09 22 2d 32 22 4",.."-3",.."-2"
0180: 2c 0a 09 22 2d 31 22 2c 0a 09 22 30 22 2c 0a 09 ,.."-1",.."0",..
0190: 22 31 22 2c 0a 09 22 32 22 2c 0a 09 22 33 22 2c "1",.."2",.."3",
01a0: 0a 09 22 34 22 2c 0a 09 22 35 22 2c 0a 09 22 36 .."4",.."5",.."6
01b0: 22 2c 0a 09 22 37 22 2c 0a 09 22 38 22 2c 0a 09 ",.."7",.."8",..
01c0: 22 39 22 2c 0a 09 22 31 30 22 2c 0a 09 22 31 31 "9",.."10",.."11
01d0: 22 2c 0a 09 22 31 32 22 2c 0a 09 22 31 33 22 2c ",.."12",.."13",
01e0: 0a 09 22 31 34 22 2c 0a 09 22 31 35 22 2c 0a 09 .."14",.."15",..
01f0: 22 31 36 22 2c 0a 09 4e 55 4c 4c 0a 7d 3b 0a 0a "16",..NULL.};..
0200: 63 68 61 72 20 2a 69 73 6f 5f 61 72 72 61 79 5b char *iso_array[
0210: 5d 20 3d 20 7b 0a 09 22 35 30 22 2c 0a 09 22 31 ] = {.."50",.."1
0220: 30 30 22 2c 0a 09 22 32 30 30 22 2c 0a 09 22 34 00",.."200",.."4
0230: 30 30 22 2c 0a 09 22 38 30 30 22 2c 0a 09 22 31 00",.."800",.."1
0240: 36 30 30 22 2c 0a 09 22 33 32 30 30 22 2c 0a 09 600",.."3200",..
0250: 4e 55 4c 4c 0a 7d 3b 0a 0a 63 68 61 72 20 2a 73 NULL.};..char *s
0260: 68 75 74 74 65 72 5f 61 72 72 61 79 5b 5d 20 3d hutter_array[] =
0270: 20 7b 0a 09 22 4f 56 45 52 22 2c 0a 09 22 31 2f {.."OVER",.."1/
0280: 31 30 30 30 22 2c 0a 09 22 31 2f 35 30 30 22 2c 1000",.."1/500",
0290: 0a 09 22 31 2f 32 35 30 22 2c 0a 09 22 31 2f 31 .."1/250",.."1/1
02a0: 32 35 22 2c 0a 09 22 31 2f 36 30 22 2c 0a 09 22 25",.."1/60",.."
02b0: 31 2f 33 30 22 2c 0a 09 22 31 2f 31 35 22 2c 0a 1/30",.."1/15",.
02c0: 09 22 31 2f 38 22 2c 0a 09 22 31 2f 34 22 2c 0a ."1/8",.."1/4",.
02d0: 09 22 31 2f 32 22 2c 0a 09 22 31 22 2c 0a 09 22 ."1/2",.."1",.."
02e0: 55 4e 44 45 52 22 2c 0a 09 4e 55 4c 4c 0a 7d 3b UNDER",..NULL.};
02f0: 0a 0a 63 68 61 72 20 2a 61 70 65 72 74 75 72 65 ..char *aperture
0300: 5f 61 72 72 61 79 5b 5d 20 3d 20 7b 0a 09 22 55 _array[] = {.."U
0310: 4e 44 45 52 22 2c 0a 09 22 66 2f 31 2e 34 22 2c NDER",.."f/1.4",
0320: 0a 09 22 66 2f 32 22 2c 0a 09 22 66 2f 32 2e 38 .."f/2",.."f/2.8
0330: 22 2c 0a 09 22 66 2f 34 22 2c 0a 09 22 66 2f 35 ",.."f/4",.."f/5
0340: 2e 36 22 2c 0a 09 22 66 2f 38 22 2c 0a 09 22 66 .6",.."f/8",.."f
0350: 2f 31 31 22 2c 0a 09 22 66 2f 31 36 22 2c 0a 09 /11",.."f/16",..
0360: 22 4f 56 45 52 22 2c 0a 09 4e 55 4c 4c 0a 7d 3b "OVER",..NULL.};
0370: 0a 0a 49 54 45 4d 20 2a 2a 65 78 70 6f 73 75 72 ..ITEM **exposur
0380: 65 5f 69 74 65 6d 73 3b 0a 49 54 45 4d 20 2a 2a e_items;.ITEM **
0390: 69 73 6f 5f 69 74 65 6d 73 3b 0a 49 54 45 4d 20 iso_items;.ITEM
03a0: 2a 2a 73 68 75 74 74 65 72 5f 69 74 65 6d 73 3b **shutter_items;
03b0: 0a 49 54 45 4d 20 2a 2a 61 70 65 72 74 75 72 65 .ITEM **aperture
03c0: 5f 69 74 65 6d 73 3b 0a 4d 45 4e 55 20 2a 65 78 _items;.MENU *ex
03d0: 70 6f 73 75 72 65 5f 6d 65 6e 75 3b 0a 4d 45 4e posure_menu;.MEN
03e0: 55 20 2a 69 73 6f 5f 6d 65 6e 75 3b 0a 4d 45 4e U *iso_menu;.MEN
03f0: 55 20 2a 73 68 75 74 74 65 72 5f 6d 65 6e 75 3b U *shutter_menu;
0400: 0a 4d 45 4e 55 20 2a 61 70 65 72 74 75 72 65 5f .MENU *aperture_
0410: 6d 65 6e 75 3b 0a 57 49 4e 44 4f 57 20 2a 65 78 menu;.WINDOW *ex
0420: 70 6f 73 75 72 65 5f 77 69 6e 3b 0a 57 49 4e 44 posure_win;.WIND
0430: 4f 57 20 2a 69 73 6f 5f 77 69 6e 3b 0a 57 49 4e OW *iso_win;.WIN
0440: 44 4f 57 20 2a 73 68 75 74 74 65 72 5f 77 69 6e DOW *shutter_win
0450: 3b 0a 57 49 4e 44 4f 57 20 2a 61 70 65 72 74 75 ;.WINDOW *apertu
0460: 72 65 5f 77 69 6e 3b 0a 0a 76 6f 69 64 20 73 65 re_win;..void se
0470: 6c 65 63 74 69 6f 6e 28 63 68 61 72 20 2a 6e 61 lection(char *na
0480: 6d 65 29 3b 0a 76 6f 69 64 20 72 65 6d 6f 76 65 me);.void remove
0490: 5f 6d 65 6e 75 28 49 54 45 4d 20 2a 2a 69 74 65 _menu(ITEM **ite
04a0: 6d 73 2c 20 4d 45 4e 55 20 2a 6d 65 6e 2c 20 69 ms, MENU *men, i
04b0: 6e 74 20 6e 29 3b 0a 76 6f 69 64 20 70 72 69 6e nt n);.void prin
04c0: 74 5f 69 6e 5f 6d 69 64 64 6c 65 28 57 49 4e 44 t_in_middle(WIND
04d0: 4f 57 20 2a 77 69 6e 2c 20 69 6e 74 20 73 74 61 OW *win, int sta
04e0: 72 74 79 2c 20 69 6e 74 20 73 74 61 72 74 78 2c rty, int startx,
04f0: 20 69 6e 74 20 77 69 64 74 68 2c 20 63 68 61 72 int width, char
0500: 20 2a 73 74 72 69 6e 67 2c 20 63 68 74 79 70 65 *string, chtype
0510: 20 63 6f 6c 6f 72 29 3b 0a 4d 45 4e 55 20 2a 61 color);.MENU *a
0520: 64 64 5f 6d 65 6e 75 28 49 54 45 4d 20 2a 2a 69 dd_menu(ITEM **i
0530: 74 65 6d 73 29 3b 0a 57 49 4e 44 4f 57 20 2a 61 tems);.WINDOW *a
0540: 64 64 5f 77 69 6e 64 6f 77 28 69 6e 74 20 78 70 dd_window(int xp
0550: 6f 73 2c 20 63 68 61 72 20 2a 74 69 74 6c 65 29 os, char *title)
0560: 3b 0a 49 54 45 4d 20 2a 2a 61 64 64 5f 69 74 65 ;.ITEM **add_ite
0570: 6d 28 63 68 61 72 20 2a 2a 61 72 72 61 79 2c 20 m(char **array,
0580: 69 6e 74 20 6e 29 3b 0a 69 6e 74 20 65 78 70 6f int n);.int expo
0590: 73 75 72 65 28 69 6e 74 20 69 73 6f 29 3b 0a 64 sure(int iso);.d
05a0: 6f 75 62 6c 65 20 73 68 75 74 74 65 72 28 69 6e ouble shutter(in
05b0: 74 20 65 78 70 6f 73 75 72 65 2c 20 64 6f 75 62 t exposure, doub
05c0: 6c 65 20 61 70 65 72 74 75 72 65 29 3b 0a 64 6f le aperture);.do
05d0: 75 62 6c 65 20 61 70 65 72 74 75 72 65 28 69 6e uble aperture(in
05e0: 74 20 65 78 70 6f 73 75 72 65 2c 20 64 6f 75 62 t exposure, doub
05f0: 6c 65 20 73 68 75 74 74 65 72 29 3b 0a 69 6e 74 le shutter);.int
0600: 20 6e 65 61 72 65 73 74 5f 6d 61 74 63 68 28 64 nearest_match(d
0610: 6f 75 62 6c 65 20 78 2c 20 69 6e 74 20 6d 65 6e ouble x, int men
0620: 75 2c 20 69 6e 74 20 6e 5f 61 72 72 61 79 29 3b u, int n_array);
0630: 0a 64 6f 75 62 6c 65 20 66 72 61 63 74 69 6f 6e .double fraction
0640: 5f 74 6f 5f 64 6f 75 62 6c 65 28 63 68 61 72 20 _to_double(char
0650: 2a 66 72 61 63 74 69 6f 6e 29 3b 0a 2f 2a 20 4e *fraction);./* N
0660: 6f 20 6f 6e 65 20 77 69 6c 6c 20 65 76 65 72 20 o one will ever
0670: 6e 65 65 64 20 6d 6f 72 65 20 74 68 61 6e 20 39 need more than 9
0680: 20 62 79 74 65 73 21 20 2a 2f 0a 63 68 61 72 20 bytes! */.char
0690: 65 78 70 6f 73 75 72 65 5f 73 65 6c 5b 39 5d 20 exposure_sel[9]
06a0: 3d 20 22 22 3b 0a 63 68 61 72 20 69 73 6f 5f 73 = "";.char iso_s
06b0: 65 6c 5b 39 5d 20 3d 20 22 22 3b 0a 63 68 61 72 el[9] = "";.char
06c0: 20 73 68 75 74 74 65 72 5f 73 65 6c 5b 39 5d 20 shutter_sel[9]
06d0: 3d 20 22 22 3b 0a 63 68 61 72 20 61 70 65 72 74 = "";.char apert
06e0: 75 72 65 5f 73 65 6c 5b 39 5d 20 3d 20 22 22 3b ure_sel[9] = "";
06f0: 0a 69 6e 74 20 73 65 6c 65 63 74 69 6f 6e 5f 63 .int selection_c
0700: 6f 75 6e 74 65 72 20 3d 20 31 3b 0a 69 6e 74 20 ounter = 1;.int
0710: 6d 65 6e 75 5f 63 6f 75 6e 74 65 72 20 3d 20 31 menu_counter = 1
0720: 3b 0a 0a 69 6e 74 20 6d 61 69 6e 28 29 20 7b 0a ;..int main() {.
0730: 09 69 6e 74 20 63 3b 0a 09 4d 45 4e 55 20 2a 2a .int c;..MENU **
0740: 6d 65 6e 75 3b 0a 09 57 49 4e 44 4f 57 20 2a 2a menu;..WINDOW **
0750: 77 69 6e 3b 0a 09 69 6e 74 20 69 3b 0a 09 69 6e win;..int i;..in
0760: 74 20 6e 5f 65 78 70 6f 73 75 72 65 3b 0a 09 69 t n_exposure;..i
0770: 6e 74 20 6e 5f 69 73 6f 3b 0a 09 69 6e 74 20 6e nt n_iso;..int n
0780: 5f 73 68 75 74 74 65 72 3b 0a 09 69 6e 74 20 6e _shutter;..int n
0790: 5f 61 70 65 72 74 75 72 65 3b 0a 0a 09 2f 2a 20 _aperture;.../*
07a0: 49 6e 69 74 69 61 6c 69 7a 65 20 63 75 72 73 65 Initialize curse
07b0: 73 20 2a 2f 0a 09 69 6e 69 74 73 63 72 28 29 3b s */..initscr();
07c0: 0a 09 73 74 61 72 74 5f 63 6f 6c 6f 72 28 29 3b ..start_color();
07d0: 0a 09 63 62 72 65 61 6b 28 29 3b 0a 09 6e 6f 65 ..cbreak();..noe
07e0: 63 68 6f 28 29 3b 0a 09 6b 65 79 70 61 64 28 73 cho();..keypad(s
07f0: 74 64 73 63 72 2c 20 54 52 55 45 29 3b 0a 09 69 tdscr, TRUE);..i
0800: 6e 69 74 5f 70 61 69 72 28 31 2c 20 43 4f 4c 4f nit_pair(1, COLO
0810: 52 5f 52 45 44 2c 20 43 4f 4c 4f 52 5f 42 4c 41 R_RED, COLOR_BLA
0820: 43 4b 29 3b 0a 09 69 6e 69 74 5f 70 61 69 72 28 CK);..init_pair(
0830: 32 2c 20 43 4f 4c 4f 52 5f 43 59 41 4e 2c 20 43 2, COLOR_CYAN, C
0840: 4f 4c 4f 52 5f 42 4c 41 43 4b 29 3b 0a 0a 09 2f OLOR_BLACK);.../
0850: 2a 20 43 72 65 61 74 65 20 69 74 65 6d 73 20 2a * Create items *
0860: 2f 0a 09 2f 2a 20 43 61 6e 27 74 20 72 65 61 6c /../* Can't real
0870: 6c 79 20 61 76 6f 69 64 20 66 69 6e 64 69 6e 67 ly avoid finding
0880: 20 61 72 72 61 79 20 73 69 7a 65 73 20 68 65 72 array sizes her
0890: 65 20 2a 2f 0a 09 6e 5f 65 78 70 6f 73 75 72 65 e */..n_exposure
08a0: 20 3d 20 41 52 52 41 59 5f 53 49 5a 45 28 65 78 = ARRAY_SIZE(ex
08b0: 70 6f 73 75 72 65 5f 61 72 72 61 79 29 3b 0a 09 posure_array);..
08c0: 6e 5f 69 73 6f 20 3d 20 41 52 52 41 59 5f 53 49 n_iso = ARRAY_SI
08d0: 5a 45 28 69 73 6f 5f 61 72 72 61 79 29 3b 0a 09 ZE(iso_array);..
08e0: 6e 5f 73 68 75 74 74 65 72 20 3d 20 41 52 52 41 n_shutter = ARRA
08f0: 59 5f 53 49 5a 45 28 73 68 75 74 74 65 72 5f 61 Y_SIZE(shutter_a
0900: 72 72 61 79 29 3b 0a 09 6e 5f 61 70 65 72 74 75 rray);..n_apertu
0910: 72 65 20 3d 20 41 52 52 41 59 5f 53 49 5a 45 28 re = ARRAY_SIZE(
0920: 61 70 65 72 74 75 72 65 5f 61 72 72 61 79 29 3b aperture_array);
0930: 0a 09 65 78 70 6f 73 75 72 65 5f 69 74 65 6d 73 ..exposure_items
0940: 20 3d 20 61 64 64 5f 69 74 65 6d 28 65 78 70 6f = add_item(expo
0950: 73 75 72 65 5f 61 72 72 61 79 2c 20 6e 5f 65 78 sure_array, n_ex
0960: 70 6f 73 75 72 65 29 3b 0a 09 69 73 6f 5f 69 74 posure);..iso_it
0970: 65 6d 73 20 3d 20 61 64 64 5f 69 74 65 6d 28 69 ems = add_item(i
0980: 73 6f 5f 61 72 72 61 79 2c 20 6e 5f 69 73 6f 29 so_array, n_iso)
0990: 3b 0a 09 61 70 65 72 74 75 72 65 5f 69 74 65 6d ;..aperture_item
09a0: 73 20 3d 20 61 64 64 5f 69 74 65 6d 28 61 70 65 s = add_item(ape
09b0: 72 74 75 72 65 5f 61 72 72 61 79 2c 20 6e 5f 61 rture_array, n_a
09c0: 70 65 72 74 75 72 65 29 3b 0a 09 73 68 75 74 74 perture);..shutt
09d0: 65 72 5f 69 74 65 6d 73 20 3d 20 61 64 64 5f 69 er_items = add_i
09e0: 74 65 6d 28 73 68 75 74 74 65 72 5f 61 72 72 61 tem(shutter_arra
09f0: 79 2c 20 6e 5f 73 68 75 74 74 65 72 29 3b 0a 09 y, n_shutter);..
0a00: 65 78 70 6f 73 75 72 65 5f 6d 65 6e 75 20 3d 20 exposure_menu =
0a10: 61 64 64 5f 6d 65 6e 75 28 65 78 70 6f 73 75 72 add_menu(exposur
0a20: 65 5f 69 74 65 6d 73 29 3b 0a 09 69 73 6f 5f 6d e_items);..iso_m
0a30: 65 6e 75 20 3d 20 61 64 64 5f 6d 65 6e 75 28 69 enu = add_menu(i
0a40: 73 6f 5f 69 74 65 6d 73 29 3b 0a 09 73 68 75 74 so_items);..shut
0a50: 74 65 72 5f 6d 65 6e 75 20 3d 20 61 64 64 5f 6d ter_menu = add_m
0a60: 65 6e 75 28 73 68 75 74 74 65 72 5f 69 74 65 6d enu(shutter_item
0a70: 73 29 3b 0a 09 61 70 65 72 74 75 72 65 5f 6d 65 s);..aperture_me
0a80: 6e 75 20 3d 20 61 64 64 5f 6d 65 6e 75 28 61 70 nu = add_menu(ap
0a90: 65 72 74 75 72 65 5f 69 74 65 6d 73 29 3b 0a 09 erture_items);..
0aa0: 65 78 70 6f 73 75 72 65 5f 77 69 6e 20 3d 20 61 exposure_win = a
0ab0: 64 64 5f 77 69 6e 64 6f 77 28 34 2c 20 22 45 56 dd_window(4, "EV
0ac0: 22 29 3b 0a 09 69 73 6f 5f 77 69 6e 20 3d 20 61 ");..iso_win = a
0ad0: 64 64 5f 77 69 6e 64 6f 77 28 34 35 2c 20 22 49 dd_window(45, "I
0ae0: 53 4f 22 29 3b 0a 09 73 68 75 74 74 65 72 5f 77 SO");..shutter_w
0af0: 69 6e 20 3d 20 61 64 64 5f 77 69 6e 64 6f 77 28 in = add_window(
0b00: 38 36 2c 20 22 53 68 75 74 74 65 72 22 29 3b 0a 86, "Shutter");.
0b10: 09 61 70 65 72 74 75 72 65 5f 77 69 6e 20 3d 20 .aperture_win =
0b20: 61 64 64 5f 77 69 6e 64 6f 77 28 31 32 37 2c 20 add_window(127,
0b30: 22 41 70 65 72 74 75 72 65 22 29 3b 0a 09 2f 2a "Aperture");../*
0b40: 20 44 6f 6e 27 74 20 6b 6e 6f 77 20 68 6f 77 20 Don't know how
0b50: 74 6f 20 61 76 6f 69 64 20 74 68 65 20 72 65 70 to avoid the rep
0b60: 69 74 69 6f 6e 20 62 65 6c 6f 77 20 2a 2f 0a 09 ition below */..
0b70: 73 65 74 5f 6d 65 6e 75 5f 77 69 6e 28 65 78 70 set_menu_win(exp
0b80: 6f 73 75 72 65 5f 6d 65 6e 75 2c 20 65 78 70 6f osure_menu, expo
0b90: 73 75 72 65 5f 77 69 6e 29 3b 0a 09 73 65 74 5f sure_win);..set_
0ba0: 6d 65 6e 75 5f 77 69 6e 28 69 73 6f 5f 6d 65 6e menu_win(iso_men
0bb0: 75 2c 20 69 73 6f 5f 77 69 6e 29 3b 0a 09 73 65 u, iso_win);..se
0bc0: 74 5f 6d 65 6e 75 5f 77 69 6e 28 73 68 75 74 74 t_menu_win(shutt
0bd0: 65 72 5f 6d 65 6e 75 2c 20 73 68 75 74 74 65 72 er_menu, shutter
0be0: 5f 77 69 6e 29 3b 0a 09 73 65 74 5f 6d 65 6e 75 _win);..set_menu
0bf0: 5f 77 69 6e 28 61 70 65 72 74 75 72 65 5f 6d 65 _win(aperture_me
0c00: 6e 75 2c 20 61 70 65 72 74 75 72 65 5f 77 69 6e nu, aperture_win
0c10: 29 3b 0a 09 73 65 74 5f 6d 65 6e 75 5f 73 75 62 );..set_menu_sub
0c20: 28 65 78 70 6f 73 75 72 65 5f 6d 65 6e 75 2c 20 (exposure_menu,
0c30: 64 65 72 77 69 6e 28 65 78 70 6f 73 75 72 65 5f derwin(exposure_
0c40: 77 69 6e 2c 20 36 2c 20 33 38 2c 20 33 2c 20 31 win, 6, 38, 3, 1
0c50: 29 29 3b 0a 09 73 65 74 5f 6d 65 6e 75 5f 73 75 ));..set_menu_su
0c60: 62 28 69 73 6f 5f 6d 65 6e 75 2c 20 64 65 72 77 b(iso_menu, derw
0c70: 69 6e 28 69 73 6f 5f 77 69 6e 2c 20 36 2c 20 33 in(iso_win, 6, 3
0c80: 38 2c 20 33 2c 20 31 29 29 3b 0a 09 73 65 74 5f 8, 3, 1));..set_
0c90: 6d 65 6e 75 5f 73 75 62 28 73 68 75 74 74 65 72 menu_sub(shutter
0ca0: 5f 6d 65 6e 75 2c 20 64 65 72 77 69 6e 28 73 68 _menu, derwin(sh
0cb0: 75 74 74 65 72 5f 77 69 6e 2c 20 36 2c 20 33 38 utter_win, 6, 38
0cc0: 2c 20 33 2c 20 31 29 29 3b 0a 09 73 65 74 5f 6d , 3, 1));..set_m
0cd0: 65 6e 75 5f 73 75 62 28 61 70 65 72 74 75 72 65 enu_sub(aperture
0ce0: 5f 6d 65 6e 75 2c 20 64 65 72 77 69 6e 28 61 70 _menu, derwin(ap
0cf0: 65 72 74 75 72 65 5f 77 69 6e 2c 20 36 2c 20 33 erture_win, 6, 3
0d00: 38 2c 20 33 2c 20 31 29 29 3b 0a 09 70 6f 73 74 8, 3, 1));..post
0d10: 5f 6d 65 6e 75 28 65 78 70 6f 73 75 72 65 5f 6d _menu(exposure_m
0d20: 65 6e 75 29 3b 0a 09 70 6f 73 74 5f 6d 65 6e 75 enu);..post_menu
0d30: 28 69 73 6f 5f 6d 65 6e 75 29 3b 0a 09 70 6f 73 (iso_menu);..pos
0d40: 74 5f 6d 65 6e 75 28 73 68 75 74 74 65 72 5f 6d t_menu(shutter_m
0d50: 65 6e 75 29 3b 0a 09 70 6f 73 74 5f 6d 65 6e 75 enu);..post_menu
0d60: 28 61 70 65 72 74 75 72 65 5f 6d 65 6e 75 29 3b (aperture_menu);
0d70: 0a 09 77 72 65 66 72 65 73 68 28 65 78 70 6f 73 ..wrefresh(expos
0d80: 75 72 65 5f 77 69 6e 29 3b 0a 09 77 72 65 66 72 ure_win);..wrefr
0d90: 65 73 68 28 69 73 6f 5f 77 69 6e 29 3b 0a 09 77 esh(iso_win);..w
0da0: 72 65 66 72 65 73 68 28 73 68 75 74 74 65 72 5f refresh(shutter_
0db0: 77 69 6e 29 3b 0a 09 77 72 65 66 72 65 73 68 28 win);..wrefresh(
0dc0: 61 70 65 72 74 75 72 65 5f 77 69 6e 29 3b 0a 09 aperture_win);..
0dd0: 61 74 74 72 6f 6e 28 43 4f 4c 4f 52 5f 50 41 49 attron(COLOR_PAI
0de0: 52 28 32 29 29 3b 0a 09 6d 76 70 72 69 6e 74 77 R(2));..mvprintw
0df0: 28 4c 49 4e 45 53 20 2d 20 32 2c 20 30 2c 20 22 (LINES - 2, 0, "
0e00: 53 65 6c 65 63 74 20 45 56 22 29 3b 0a 09 6d 76 Select EV");..mv
0e10: 70 72 69 6e 74 77 28 4c 49 4e 45 53 20 2d 20 31 printw(LINES - 1
0e20: 2c 20 30 2c 20 22 41 72 72 6f 77 20 6b 65 79 73 , 0, "Arrow keys
0e30: 20 74 6f 20 6e 61 76 69 67 61 74 65 2c 20 45 6e to navigate, En
0e40: 74 65 72 20 74 6f 20 73 65 6c 65 63 74 2c 20 51 ter to select, Q
0e50: 20 74 6f 20 65 78 69 74 22 29 3b 0a 09 61 74 74 to exit");..att
0e60: 72 6f 66 66 28 43 4f 4c 4f 52 5f 50 41 49 52 28 roff(COLOR_PAIR(
0e70: 32 29 29 3b 0a 09 72 65 66 72 65 73 68 28 29 3b 2));..refresh();
0e80: 0a 0a 09 2f 2a 20 53 65 74 20 64 65 66 61 75 6c .../* Set defaul
0e90: 74 20 6d 65 6e 75 20 2a 2f 0a 09 6d 65 6e 75 20 t menu */..menu
0ea0: 3d 20 26 65 78 70 6f 73 75 72 65 5f 6d 65 6e 75 = &exposure_menu
0eb0: 3b 0a 09 77 69 6e 20 3d 20 26 65 78 70 6f 73 75 ;..win = &exposu
0ec0: 72 65 5f 77 69 6e 3b 0a 0a 09 77 68 69 6c 65 28 re_win;...while(
0ed0: 28 63 20 3d 20 67 65 74 63 68 28 29 29 20 21 3d (c = getch()) !=
0ee0: 20 38 31 29 20 7b 20 2f 2a 20 38 31 20 69 73 20 81) { /* 81 is
0ef0: 51 20 2a 2f 0a 09 09 73 77 69 74 63 68 28 63 29 Q */...switch(c)
0f00: 20 7b 0a 09 09 09 63 61 73 65 20 4b 45 59 5f 4c {....case KEY_L
0f10: 45 46 54 3a 0a 09 09 09 09 69 66 20 28 73 65 6c EFT:.....if (sel
0f20: 65 63 74 69 6f 6e 5f 63 6f 75 6e 74 65 72 20 3e ection_counter >
0f30: 20 32 29 20 7b 0a 09 09 09 09 09 6d 65 6e 75 5f 2) {......menu_
0f40: 63 6f 75 6e 74 65 72 20 3d 20 33 3b 0a 09 09 09 counter = 3;....
0f50: 09 09 6d 65 6e 75 20 3d 20 26 73 68 75 74 74 65 ..menu = &shutte
0f60: 72 5f 6d 65 6e 75 3b 0a 09 09 09 09 09 77 69 6e r_menu;......win
0f70: 20 3d 20 26 73 68 75 74 74 65 72 5f 77 69 6e 3b = &shutter_win;
0f80: 0a 09 09 09 09 7d 0a 09 09 09 09 62 72 65 61 6b .....}.....break
0f90: 3b 0a 09 09 09 63 61 73 65 20 4b 45 59 5f 52 49 ;....case KEY_RI
0fa0: 47 48 54 3a 0a 09 09 09 09 69 66 20 28 73 65 6c GHT:.....if (sel
0fb0: 65 63 74 69 6f 6e 5f 63 6f 75 6e 74 65 72 20 3e ection_counter >
0fc0: 20 32 29 20 7b 0a 09 09 09 09 09 6d 65 6e 75 5f 2) {......menu_
0fd0: 63 6f 75 6e 74 65 72 20 3d 20 34 3b 0a 09 09 09 counter = 4;....
0fe0: 09 09 6d 65 6e 75 20 3d 20 26 61 70 65 72 74 75 ..menu = &apertu
0ff0: 72 65 5f 6d 65 6e 75 3b 0a 09 09 09 09 09 77 69 re_menu;......wi
1000: 6e 20 3d 20 26 61 70 65 72 74 75 72 65 5f 77 69 n = &aperture_wi
1010: 6e 3b 0a 09 09 09 09 7d 0a 09 09 09 09 62 72 65 n;.....}.....bre
1020: 61 6b 3b 0a 09 09 09 63 61 73 65 20 4b 45 59 5f ak;....case KEY_
1030: 44 4f 57 4e 3a 0a 09 09 09 09 6d 65 6e 75 5f 64 DOWN:.....menu_d
1040: 72 69 76 65 72 28 2a 6d 65 6e 75 2c 20 52 45 51 river(*menu, REQ
1050: 5f 44 4f 57 4e 5f 49 54 45 4d 29 3b 0a 09 09 09 _DOWN_ITEM);....
1060: 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 .break;....case
1070: 4b 45 59 5f 55 50 3a 0a 09 09 09 09 6d 65 6e 75 KEY_UP:.....menu
1080: 5f 64 72 69 76 65 72 28 2a 6d 65 6e 75 2c 20 52 _driver(*menu, R
1090: 45 51 5f 55 50 5f 49 54 45 4d 29 3b 0a 09 09 09 EQ_UP_ITEM);....
10a0: 09 62 72 65 61 6b 3b 0a 09 09 09 63 61 73 65 20 .break;....case
10b0: 31 30 3a 20 7b 20 2f 2a 20 45 4e 54 45 52 20 2a 10: { /* ENTER *
10c0: 2f 0a 09 09 09 09 49 54 45 4d 20 2a 63 75 72 3b /.....ITEM *cur;
10d0: 0a 09 09 09 09 76 6f 69 64 20 28 2a 70 29 28 63 .....void (*p)(c
10e0: 68 61 72 20 2a 29 3b 0a 0a 09 09 09 09 63 75 72 har *);......cur
10f0: 20 3d 20 63 75 72 72 65 6e 74 5f 69 74 65 6d 28 = current_item(
1100: 2a 6d 65 6e 75 29 3b 0a 09 09 09 09 70 20 3d 20 *menu);.....p =
1110: 69 74 65 6d 5f 75 73 65 72 70 74 72 28 63 75 72 item_userptr(cur
1120: 29 3b 0a 09 09 09 09 2f 2a 20 4c 65 61 72 6e 69 );...../* Learni
1130: 6e 67 20 6e 6f 74 65 73 20 2d 20 44 6f 6e 27 74 ng notes - Don't
1140: 20 75 6e 64 65 72 73 74 61 6e 64 20 74 68 69 73 understand this
1150: 20 62 69 74 2e 20 49 73 20 74 68 69 73 20 61 20 bit. Is this a
1160: 66 75 6e 63 74 69 6f 6e 20 70 6f 69 6e 74 65 72 function pointer
1170: 3f 20 2a 2f 0a 09 09 09 09 70 28 28 63 68 61 72 ? */.....p((char
1180: 20 2a 29 69 74 65 6d 5f 6e 61 6d 65 28 63 75 72 *)item_name(cur
1190: 29 29 3b 0a 09 09 09 09 2f 2a 20 4e 65 65 64 20 ));...../* Need
11a0: 74 6f 20 69 67 6f 72 65 20 6f 76 65 72 2f 75 6e to igore over/un
11b0: 64 65 72 20 69 66 20 73 65 6c 65 63 74 65 64 2c der if selected,
11c0: 20 70 72 6f 62 61 62 6c 79 20 65 61 73 69 65 72 probably easier
11d0: 20 74 68 61 6e 20 74 72 79 20 74 6f 20 70 72 65 than try to pre
11e0: 76 65 6e 74 20 73 65 6c 65 63 74 69 6f 6e 20 2a vent selection *
11f0: 2f 0a 09 09 09 09 69 66 20 28 21 28 28 73 74 72 /.....if (!((str
1200: 63 6d 70 28 22 4f 56 45 52 22 2c 20 73 68 75 74 cmp("OVER", shut
1210: 74 65 72 5f 73 65 6c 29 20 3d 3d 20 30 29 0a 09 ter_sel) == 0)..
1220: 09 09 09 09 09 7c 7c 20 28 73 74 72 63 6d 70 28 .....|| (strcmp(
1230: 22 55 4e 44 45 52 22 2c 20 73 68 75 74 74 65 72 "UNDER", shutter
1240: 5f 73 65 6c 29 20 3d 3d 20 30 29 20 0a 09 09 09 _sel) == 0) ....
1250: 09 09 09 7c 7c 20 28 73 74 72 63 6d 70 28 22 4f ...|| (strcmp("O
1260: 56 45 52 22 2c 20 61 70 65 72 74 75 72 65 5f 73 VER", aperture_s
1270: 65 6c 29 20 3d 3d 20 30 29 20 0a 09 09 09 09 09 el) == 0) ......
1280: 09 7c 7c 20 28 73 74 72 63 6d 70 28 22 55 4e 44 .|| (strcmp("UND
1290: 45 52 22 2c 20 61 70 65 72 74 75 72 65 5f 73 65 ER", aperture_se
12a0: 6c 29 20 3d 3d 20 30 29 29 29 20 7b 0a 09 09 09 l) == 0))) {....
12b0: 09 09 73 77 69 74 63 68 20 28 73 65 6c 65 63 74 ..switch (select
12c0: 69 6f 6e 5f 63 6f 75 6e 74 65 72 29 20 7b 0a 09 ion_counter) {..
12d0: 09 09 09 09 09 63 61 73 65 20 31 3a 20 7b 20 2f .....case 1: { /
12e0: 2a 20 45 78 70 6f 73 75 72 65 20 73 65 6c 65 63 * Exposure selec
12f0: 74 65 64 20 2a 2f 0a 09 09 09 09 09 09 09 73 65 ted */........se
1300: 6c 65 63 74 69 6f 6e 5f 63 6f 75 6e 74 65 72 20 lection_counter
1310: 2b 3d 20 31 3b 0a 09 09 09 09 09 09 09 6d 65 6e += 1;........men
1320: 75 5f 63 6f 75 6e 74 65 72 20 2b 3d 20 31 3b 0a u_counter += 1;.
1330: 09 09 09 09 09 09 09 6d 6f 76 65 28 4c 49 4e 45 .......move(LINE
1340: 53 20 2d 20 32 2c 20 30 29 3b 0a 09 09 09 09 09 S - 2, 0);......
1350: 09 09 63 6c 72 74 6f 65 6f 6c 28 29 3b 0a 09 09 ..clrtoeol();...
1360: 09 09 09 09 09 6d 76 70 72 69 6e 74 77 28 4c 49 .....mvprintw(LI
1370: 4e 45 53 20 2d 20 32 2c 20 30 2c 20 22 53 65 6c NES - 2, 0, "Sel
1380: 65 63 74 20 49 53 4f 22 29 3b 0a 09 09 09 09 09 ect ISO");......
1390: 09 09 72 65 66 72 65 73 68 28 29 3b 0a 09 09 09 ..refresh();....
13a0: 09 09 09 09 6d 65 6e 75 20 3d 20 26 69 73 6f 5f ....menu = &iso_
13b0: 6d 65 6e 75 3b 0a 09 09 09 09 09 09 09 77 69 6e menu;........win
13c0: 20 3d 20 26 69 73 6f 5f 77 69 6e 3b 0a 09 09 09 = &iso_win;....
13d0: 09 09 09 7d 0a 09 09 09 09 09 09 62 72 65 61 6b ...}.......break
13e0: 3b 0a 09 09 09 09 09 09 63 61 73 65 20 32 3a 20 ;.......case 2:
13f0: 7b 20 2f 2a 20 49 53 4f 20 53 65 6c 65 63 74 65 { /* ISO Selecte
1400: 64 20 2a 2f 0a 09 09 09 09 09 09 09 73 65 6c 65 d */........sele
1410: 63 74 69 6f 6e 5f 63 6f 75 6e 74 65 72 20 2b 3d ction_counter +=
1420: 20 31 3b 0a 09 09 09 09 09 09 09 6d 65 6e 75 5f 1;........menu_
1430: 63 6f 75 6e 74 65 72 20 2b 3d 20 31 3b 0a 09 09 counter += 1;...
1440: 09 09 09 09 09 6d 6f 76 65 28 4c 49 4e 45 53 20 .....move(LINES
1450: 2d 20 32 2c 20 30 29 3b 0a 09 09 09 09 09 09 09 - 2, 0);........
1460: 63 6c 72 74 6f 65 6f 6c 28 29 3b 0a 09 09 09 09 clrtoeol();.....
1470: 09 09 09 6d 76 70 72 69 6e 74 77 28 4c 49 4e 45 ...mvprintw(LINE
1480: 53 20 2d 20 32 2c 20 30 2c 20 22 53 65 6c 65 63 S - 2, 0, "Selec
1490: 74 20 53 68 75 74 74 65 72 20 6f 72 20 41 70 65 t Shutter or Ape
14a0: 72 74 75 72 65 22 29 3b 0a 09 09 09 09 09 09 09 rture");........
14b0: 72 65 66 72 65 73 68 28 29 3b 0a 09 09 09 09 09 refresh();......
14c0: 09 09 6d 65 6e 75 20 3d 20 26 73 68 75 74 74 65 ..menu = &shutte
14d0: 72 5f 6d 65 6e 75 3b 0a 09 09 09 09 09 09 09 77 r_menu;........w
14e0: 69 6e 20 3d 20 26 73 68 75 74 74 65 72 5f 77 69 in = &shutter_wi
14f0: 6e 3b 0a 09 09 09 09 09 09 7d 0a 09 09 09 09 09 n;.......}......
1500: 09 62 72 65 61 6b 3b 0a 09 09 09 09 09 09 63 61 .break;.......ca
1510: 73 65 20 33 3a 20 7b 20 2f 2a 20 53 68 75 74 74 se 3: { /* Shutt
1520: 65 72 20 6f 72 20 41 70 65 72 74 75 72 65 20 73 er or Aperture s
1530: 65 6c 65 63 74 65 64 20 2a 2f 0a 09 09 09 09 09 elected */......
1540: 09 09 69 66 20 28 73 74 72 63 6d 70 28 22 22 2c ..if (strcmp("",
1550: 20 73 68 75 74 74 65 72 5f 73 65 6c 29 20 3d 3d shutter_sel) ==
1560: 20 30 29 20 7b 0a 09 09 09 09 09 09 09 09 63 68 0) {.........ch
1570: 61 72 20 61 70 65 72 74 75 72 65 5f 73 65 6c 5f ar aperture_sel_
1580: 5b 34 5d 20 3d 20 22 22 3b 0a 09 09 09 09 09 09 [4] = "";.......
1590: 09 09 73 74 72 6e 63 70 79 28 61 70 65 72 74 75 ..strncpy(apertu
15a0: 72 65 5f 73 65 6c 5f 2c 20 61 70 65 72 74 75 72 re_sel_, apertur
15b0: 65 5f 73 65 6c 2b 32 2c 20 33 29 3b 0a 09 09 09 e_sel+2, 3);....
15c0: 09 09 09 09 09 2f 2a 20 55 73 69 6e 67 20 6d 65 ...../* Using me
15d0: 6e 75 5f 64 72 69 76 65 72 20 74 6f 20 67 6f 20 nu_driver to go
15e0: 75 70 2f 64 6f 77 6e 20 74 6f 20 66 6f 72 63 65 up/down to force
15f0: 20 72 65 66 72 65 73 68 20 61 6e 64 20 63 6f 72 refresh and cor
1600: 72 65 63 74 20 68 69 67 68 6c 69 67 68 74 69 6e rect highlightin
1610: 67 20 2a 2f 0a 09 09 09 09 09 09 09 09 6d 65 6e g */.........men
1620: 75 5f 64 72 69 76 65 72 28 73 68 75 74 74 65 72 u_driver(shutter
1630: 5f 6d 65 6e 75 2c 20 52 45 51 5f 53 43 52 5f 55 _menu, REQ_SCR_U
1640: 50 41 47 45 29 3b 0a 09 09 09 09 09 09 09 09 6d PAGE);.........m
1650: 65 6e 75 5f 64 72 69 76 65 72 28 73 68 75 74 74 enu_driver(shutt
1660: 65 72 5f 6d 65 6e 75 2c 20 52 45 51 5f 53 43 52 er_menu, REQ_SCR
1670: 5f 44 50 41 47 45 29 3b 0a 09 09 09 09 09 09 09 _DPAGE);........
1680: 09 2f 2a 20 54 68 65 72 65 20 69 73 20 70 72 6f ./* There is pro
1690: 62 61 62 6c 79 20 61 20 6e 69 63 65 72 20 77 61 bably a nicer wa
16a0: 79 20 74 6f 20 66 6f 72 6d 61 74 20 74 68 65 20 y to format the
16b0: 62 65 6c 6f 77 20 2a 2f 0a 09 09 09 09 09 09 09 below */........
16c0: 09 73 65 74 5f 6d 65 6e 75 5f 70 61 74 74 65 72 .set_menu_patter
16d0: 6e 28 0a 09 09 09 09 09 09 09 09 09 73 68 75 74 n(..........shut
16e0: 74 65 72 5f 6d 65 6e 75 2c 0a 09 09 09 09 09 09 ter_menu,.......
16f0: 09 09 09 73 68 75 74 74 65 72 5f 61 72 72 61 79 ...shutter_array
1700: 5b 6e 65 61 72 65 73 74 5f 6d 61 74 63 68 28 0a [nearest_match(.
1710: 09 09 09 09 09 09 09 09 09 09 73 68 75 74 74 65 ..........shutte
1720: 72 28 65 78 70 6f 73 75 72 65 28 61 74 6f 69 28 r(exposure(atoi(
1730: 69 73 6f 5f 73 65 6c 29 29 2c 20 73 74 72 74 6f iso_sel)), strto
1740: 64 28 61 70 65 72 74 75 72 65 5f 73 65 6c 5f 2c d(aperture_sel_,
1750: 20 4e 55 4c 4c 29 29 2c 0a 09 09 09 09 09 09 09 NULL)),........
1760: 09 09 09 33 2c 0a 09 09 09 09 09 09 09 09 09 09 ...3,...........
1770: 6e 5f 73 68 75 74 74 65 72 0a 09 09 09 09 09 09 n_shutter.......
1780: 09 09 09 29 5d 0a 09 09 09 09 09 09 09 09 29 3b ...)].........);
1790: 0a 09 09 09 09 09 09 09 09 6d 65 6e 75 5f 64 72 .........menu_dr
17a0: 69 76 65 72 28 73 68 75 74 74 65 72 5f 6d 65 6e iver(shutter_men
17b0: 75 2c 20 52 45 51 5f 44 4f 57 4e 5f 49 54 45 4d u, REQ_DOWN_ITEM
17c0: 29 3b 0a 09 09 09 09 09 09 09 09 6d 65 6e 75 5f );.........menu_
17d0: 64 72 69 76 65 72 28 73 68 75 74 74 65 72 5f 6d driver(shutter_m
17e0: 65 6e 75 2c 20 52 45 51 5f 55 50 5f 49 54 45 4d enu, REQ_UP_ITEM
17f0: 29 3b 0a 09 09 09 09 09 09 09 09 77 72 65 66 72 );.........wrefr
1800: 65 73 68 28 73 68 75 74 74 65 72 5f 77 69 6e 29 esh(shutter_win)
1810: 3b 0a 09 09 09 09 09 09 09 7d 0a 09 09 09 09 09 ;........}......
1820: 09 09 69 66 20 28 73 74 72 63 6d 70 28 22 22 2c ..if (strcmp("",
1830: 20 61 70 65 72 74 75 72 65 5f 73 65 6c 29 20 3d aperture_sel) =
1840: 3d 20 30 29 20 7b 0a 09 09 09 09 09 09 09 09 6d = 0) {.........m
1850: 65 6e 75 5f 64 72 69 76 65 72 28 61 70 65 72 74 enu_driver(apert
1860: 75 72 65 5f 6d 65 6e 75 2c 20 52 45 51 5f 53 43 ure_menu, REQ_SC
1870: 52 5f 55 50 41 47 45 29 3b 0a 09 09 09 09 09 09 R_UPAGE);.......
1880: 09 09 6d 65 6e 75 5f 64 72 69 76 65 72 28 61 70 ..menu_driver(ap
1890: 65 72 74 75 72 65 5f 6d 65 6e 75 2c 20 52 45 51 erture_menu, REQ
18a0: 5f 53 43 52 5f 44 50 41 47 45 29 3b 0a 09 09 09 _SCR_DPAGE);....
18b0: 09 09 09 09 09 73 65 74 5f 6d 65 6e 75 5f 70 61 .....set_menu_pa
18c0: 74 74 65 72 6e 28 0a 09 09 09 09 09 09 09 09 09 ttern(..........
18d0: 61 70 65 72 74 75 72 65 5f 6d 65 6e 75 2c 0a 09 aperture_menu,..
18e0: 09 09 09 09 09 09 09 09 61 70 65 72 74 75 72 65 ........aperture
18f0: 5f 61 72 72 61 79 5b 6e 65 61 72 65 73 74 5f 6d _array[nearest_m
1900: 61 74 63 68 28 0a 09 09 09 09 09 09 09 09 09 09 atch(...........
1910: 61 70 65 72 74 75 72 65 28 65 78 70 6f 73 75 72 aperture(exposur
1920: 65 28 61 74 6f 69 28 69 73 6f 5f 73 65 6c 29 29 e(atoi(iso_sel))
1930: 2c 20 66 72 61 63 74 69 6f 6e 5f 74 6f 5f 64 6f , fraction_to_do
1940: 75 62 6c 65 28 73 68 75 74 74 65 72 5f 73 65 6c uble(shutter_sel
1950: 29 29 2c 0a 09 09 09 09 09 09 09 09 09 09 34 2c )),...........4,
1960: 0a 09 09 09 09 09 09 09 09 09 09 6e 5f 61 70 65 ...........n_ape
1970: 72 74 75 72 65 0a 09 09 09 09 09 09 09 09 09 29 rture..........)
1980: 5d 0a 09 09 09 09 09 09 09 09 29 3b 0a 09 09 09 ].........);....
1990: 09 09 09 09 09 6d 65 6e 75 5f 64 72 69 76 65 72 .....menu_driver
19a0: 28 61 70 65 72 74 75 72 65 5f 6d 65 6e 75 2c 20 (aperture_menu,
19b0: 52 45 51 5f 44 4f 57 4e 5f 49 54 45 4d 29 3b 0a REQ_DOWN_ITEM);.
19c0: 09 09 09 09 09 09 09 09 6d 65 6e 75 5f 64 72 69 ........menu_dri
19d0: 76 65 72 28 61 70 65 72 74 75 72 65 5f 6d 65 6e ver(aperture_men
19e0: 75 2c 20 52 45 51 5f 55 50 5f 49 54 45 4d 29 3b u, REQ_UP_ITEM);
19f0: 0a 09 09 09 09 09 09 09 09 77 72 65 66 72 65 73 .........wrefres
1a00: 68 28 61 70 65 72 74 75 72 65 5f 77 69 6e 29 3b h(aperture_win);
1a10: 0a 09 09 09 09 09 09 09 7d 0a 09 09 09 09 09 09 ........}.......
1a20: 09 2f 2a 20 43 6c 65 61 72 20 74 68 65 20 73 65 ./* Clear the se
1a30: 6c 65 63 74 69 6f 6e 73 20 66 6f 72 20 6e 65 78 lections for nex
1a40: 74 20 74 69 6d 65 20 2a 2f 0a 09 09 09 09 09 09 t time */.......
1a50: 09 73 74 72 63 70 79 28 69 73 6f 5f 73 65 6c 2c .strcpy(iso_sel,
1a60: 20 22 22 29 3b 0a 09 09 09 09 09 09 09 73 74 72 "");........str
1a70: 63 70 79 28 73 68 75 74 74 65 72 5f 73 65 6c 2c cpy(shutter_sel,
1a80: 20 22 22 29 3b 0a 09 09 09 09 09 09 09 73 74 72 "");........str
1a90: 63 70 79 28 61 70 65 72 74 75 72 65 5f 73 65 6c cpy(aperture_sel
1aa0: 2c 20 22 22 29 3b 0a 09 09 09 09 09 09 09 2f 2a , "");......../*
1ab0: 20 41 6e 64 20 73 65 74 20 64 65 66 61 75 6c 74 And set default
1ac0: 73 20 62 61 63 6b 20 74 6f 20 73 74 61 72 74 20 s back to start
1ad0: 2a 2f 0a 09 09 09 09 09 09 09 73 65 6c 65 63 74 */........select
1ae0: 69 6f 6e 5f 63 6f 75 6e 74 65 72 20 3d 20 31 3b ion_counter = 1;
1af0: 0a 09 09 09 09 09 09 09 6d 65 6e 75 5f 63 6f 75 ........menu_cou
1b00: 6e 74 65 72 20 3d 20 31 3b 0a 09 09 09 09 09 09 nter = 1;.......
1b10: 09 6d 65 6e 75 20 3d 20 26 65 78 70 6f 73 75 72 .menu = &exposur
1b20: 65 5f 6d 65 6e 75 3b 0a 09 09 09 09 09 09 09 77 e_menu;........w
1b30: 69 6e 20 3d 20 26 65 78 70 6f 73 75 72 65 5f 77 in = &exposure_w
1b40: 69 6e 3b 0a 09 09 09 09 09 09 09 6d 6f 76 65 28 in;........move(
1b50: 4c 49 4e 45 53 20 2d 20 32 2c 20 30 29 3b 0a 09 LINES - 2, 0);..
1b60: 09 09 09 09 09 09 63 6c 72 74 6f 65 6f 6c 28 29 ......clrtoeol()
1b70: 3b 0a 09 09 09 09 09 09 09 6d 76 70 72 69 6e 74 ;........mvprint
1b80: 77 28 4c 49 4e 45 53 20 2d 20 32 2c 20 30 2c 20 w(LINES - 2, 0,
1b90: 22 53 65 6c 65 63 74 20 45 56 22 29 3b 0a 09 09 "Select EV");...
1ba0: 09 09 09 09 09 72 65 66 72 65 73 68 28 29 3b 0a .....refresh();.
1bb0: 09 09 09 09 09 09 7d 0a 09 09 09 09 09 09 62 72 ......}.......br
1bc0: 65 61 6b 3b 0a 09 09 09 09 09 7d 0a 09 09 09 09 eak;......}.....
1bd0: 7d 0a 09 09 09 09 2f 2a 20 49 66 20 6f 76 65 72 }...../* If over
1be0: 2f 75 6e 64 65 72 20 6e 65 65 64 20 74 6f 20 63 /under need to c
1bf0: 6c 65 61 72 20 73 65 6c 65 63 74 69 6f 6e 20 73 lear selection s
1c00: 6f 20 6b 6e 6f 77 20 77 68 69 63 68 20 69 73 20 o know which is
1c10: 62 6c 61 6e 6b 20 77 68 65 6e 20 61 20 70 72 6f blank when a pro
1c20: 70 65 72 20 73 65 6c 65 63 74 69 6f 6e 20 69 73 per selection is
1c30: 20 6d 61 64 65 20 2a 2f 0a 09 09 09 09 69 66 20 made */.....if
1c40: 28 28 73 74 72 63 6d 70 28 22 4f 56 45 52 22 2c ((strcmp("OVER",
1c50: 20 73 68 75 74 74 65 72 5f 73 65 6c 29 20 3d 3d shutter_sel) ==
1c60: 20 30 29 20 7c 7c 20 28 73 74 72 63 6d 70 28 22 0) || (strcmp("
1c70: 55 4e 44 45 52 22 2c 20 73 68 75 74 74 65 72 5f UNDER", shutter_
1c80: 73 65 6c 29 20 3d 3d 20 30 29 29 20 7b 0a 09 09 sel) == 0)) {...
1c90: 09 09 09 73 74 72 63 70 79 28 73 68 75 74 74 65 ...strcpy(shutte
1ca0: 72 5f 73 65 6c 2c 20 22 22 29 3b 0a 09 09 09 09 r_sel, "");.....
1cb0: 7d 0a 09 09 09 09 69 66 20 28 28 73 74 72 63 6d }.....if ((strcm
1cc0: 70 28 22 4f 56 45 52 22 2c 20 61 70 65 72 74 75 p("OVER", apertu
1cd0: 72 65 5f 73 65 6c 29 20 3d 3d 20 30 29 20 7c 7c re_sel) == 0) ||
1ce0: 20 28 73 74 72 63 6d 70 28 22 55 4e 44 45 52 22 (strcmp("UNDER"
1cf0: 2c 20 61 70 65 72 74 75 72 65 5f 73 65 6c 29 20 , aperture_sel)
1d00: 3d 3d 20 30 29 29 20 7b 0a 09 09 09 09 09 73 74 == 0)) {......st
1d10: 72 63 70 79 28 61 70 65 72 74 75 72 65 5f 73 65 rcpy(aperture_se
1d20: 6c 2c 20 22 22 29 3b 0a 09 09 09 09 7d 0a 09 09 l, "");.....}...
1d30: 09 7d 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09 7d .}....break;...}
1d40: 0a 09 09 77 72 65 66 72 65 73 68 28 2a 77 69 6e ...wrefresh(*win
1d50: 29 3b 0a 09 7d 09 0a 09 2f 2a 20 55 6e 70 6f 73 );..}.../* Unpos
1d60: 74 20 61 6e 64 20 66 72 65 65 20 61 6c 6c 20 74 t and free all t
1d70: 68 65 20 6d 65 6d 6f 72 79 20 74 61 6b 65 6e 20 he memory taken
1d80: 75 70 20 2a 2f 0a 09 72 65 6d 6f 76 65 5f 6d 65 up */..remove_me
1d90: 6e 75 28 65 78 70 6f 73 75 72 65 5f 69 74 65 6d nu(exposure_item
1da0: 73 2c 20 65 78 70 6f 73 75 72 65 5f 6d 65 6e 75 s, exposure_menu
1db0: 2c 20 6e 5f 65 78 70 6f 73 75 72 65 29 3b 0a 09 , n_exposure);..
1dc0: 72 65 6d 6f 76 65 5f 6d 65 6e 75 28 69 73 6f 5f remove_menu(iso_
1dd0: 69 74 65 6d 73 2c 20 69 73 6f 5f 6d 65 6e 75 2c items, iso_menu,
1de0: 20 6e 5f 69 73 6f 29 3b 0a 09 72 65 6d 6f 76 65 n_iso);..remove
1df0: 5f 6d 65 6e 75 28 73 68 75 74 74 65 72 5f 69 74 _menu(shutter_it
1e00: 65 6d 73 2c 20 73 68 75 74 74 65 72 5f 6d 65 6e ems, shutter_men
1e10: 75 2c 20 6e 5f 73 68 75 74 74 65 72 29 3b 0a 09 u, n_shutter);..
1e20: 72 65 6d 6f 76 65 5f 6d 65 6e 75 28 61 70 65 72 remove_menu(aper
1e30: 74 75 72 65 5f 69 74 65 6d 73 2c 20 61 70 65 72 ture_items, aper
1e40: 74 75 72 65 5f 6d 65 6e 75 2c 20 6e 5f 61 70 65 ture_menu, n_ape
1e50: 72 74 75 72 65 29 3b 0a 09 65 6e 64 77 69 6e 28 rture);..endwin(
1e60: 29 3b 0a 7d 0a 0a 2f 2a 20 42 65 6c 6f 77 20 70 );.}../* Below p
1e70: 6f 69 6e 74 65 72 20 63 6f 6e 66 69 67 75 72 61 ointer configura
1e80: 74 69 6f 6e 20 66 69 67 75 72 65 64 20 6f 75 74 tion figured out
1e90: 20 66 72 6f 6d 3a 0a 20 2a 20 68 74 74 70 73 3a from:. * https:
1ea0: 2f 2f 67 69 74 68 75 62 2e 63 6f 6d 2f 59 75 72 //github.com/Yur
1eb0: 69 63 6b 68 2f 50 73 79 63 68 6f 2d 54 65 74 72 ickh/Psycho-Tetr
1ec0: 69 73 2f 62 6c 6f 62 2f 6d 61 73 74 65 72 2f 73 is/blob/master/s
1ed0: 72 63 2f 6d 65 6e 75 2e 63 23 4c 39 20 2a 2f 0a rc/menu.c#L9 */.
1ee0: 49 54 45 4d 20 2a 2a 61 64 64 5f 69 74 65 6d 28 ITEM **add_item(
1ef0: 63 68 61 72 20 2a 2a 61 72 72 61 79 2c 20 69 6e char **array, in
1f00: 74 20 6e 29 20 7b 0a 09 69 6e 74 20 69 3b 0a 09 t n) {..int i;..
1f10: 49 54 45 4d 20 2a 2a 6c 6f 63 61 6c 5f 69 74 65 ITEM **local_ite
1f20: 6d 73 3b 0a 0a 09 6c 6f 63 61 6c 5f 69 74 65 6d ms;...local_item
1f30: 73 20 3d 20 28 49 54 45 4d 20 2a 2a 29 63 61 6c s = (ITEM **)cal
1f40: 6c 6f 63 28 6e 2c 20 73 69 7a 65 6f 66 28 49 54 loc(n, sizeof(IT
1f50: 45 4d 20 2a 29 29 3b 0a 09 66 6f 72 28 69 20 3d EM *));..for(i =
1f60: 20 30 3b 20 69 3c 6e 3b 20 2b 2b 69 29 20 7b 0a 0; i<n; ++i) {.
1f70: 09 09 6c 6f 63 61 6c 5f 69 74 65 6d 73 5b 69 5d ..local_items[i]
1f80: 20 3d 20 6e 65 77 5f 69 74 65 6d 28 61 72 72 61 = new_item(arra
1f90: 79 5b 69 5d 2c 20 61 72 72 61 79 5b 69 5d 29 3b y[i], array[i]);
1fa0: 0a 09 09 73 65 74 5f 69 74 65 6d 5f 75 73 65 72 ...set_item_user
1fb0: 70 74 72 28 6c 6f 63 61 6c 5f 69 74 65 6d 73 5b ptr(local_items[
1fc0: 69 5d 2c 20 73 65 6c 65 63 74 69 6f 6e 29 3b 0a i], selection);.
1fd0: 09 7d 0a 09 72 65 74 75 72 6e 20 6c 6f 63 61 6c .}..return local
1fe0: 5f 69 74 65 6d 73 3b 0a 7d 0a 0a 4d 45 4e 55 20 _items;.}..MENU
1ff0: 2a 61 64 64 5f 6d 65 6e 75 28 49 54 45 4d 20 2a *add_menu(ITEM *
2000: 2a 69 74 65 6d 73 29 20 7b 0a 09 4d 45 4e 55 20 *items) {..MENU
2010: 2a 6c 6f 63 61 6c 5f 6d 65 6e 75 3b 0a 0a 09 6c *local_menu;...l
2020: 6f 63 61 6c 5f 6d 65 6e 75 20 3d 20 6e 65 77 5f ocal_menu = new_
2030: 6d 65 6e 75 28 28 49 54 45 4d 20 2a 2a 29 69 74 menu((ITEM **)it
2040: 65 6d 73 29 3b 0a 09 73 65 74 5f 6d 65 6e 75 5f ems);..set_menu_
2050: 66 6f 72 6d 61 74 28 6c 6f 63 61 6c 5f 6d 65 6e format(local_men
2060: 75 2c 20 35 2c 20 31 29 3b 0a 09 73 65 74 5f 6d u, 5, 1);..set_m
2070: 65 6e 75 5f 6d 61 72 6b 28 6c 6f 63 61 6c 5f 6d enu_mark(local_m
2080: 65 6e 75 2c 20 22 20 2a 20 22 29 3b 0a 09 72 65 enu, " * ");..re
2090: 74 75 72 6e 20 6c 6f 63 61 6c 5f 6d 65 6e 75 3b turn local_menu;
20a0: 0a 7d 0a 0a 57 49 4e 44 4f 57 20 2a 61 64 64 5f .}..WINDOW *add_
20b0: 77 69 6e 64 6f 77 28 69 6e 74 20 78 70 6f 73 2c window(int xpos,
20c0: 20 63 68 61 72 20 2a 74 69 74 6c 65 29 20 7b 0a char *title) {.
20d0: 09 57 49 4e 44 4f 57 20 2a 6c 6f 63 61 6c 5f 77 .WINDOW *local_w
20e0: 69 6e 3b 0a 0a 09 6c 6f 63 61 6c 5f 77 69 6e 20 in;...local_win
20f0: 3d 20 6e 65 77 77 69 6e 28 31 30 2c 20 34 30 2c = newwin(10, 40,
2100: 20 34 2c 20 78 70 6f 73 29 3b 0a 09 6b 65 79 70 4, xpos);..keyp
2110: 61 64 28 6c 6f 63 61 6c 5f 77 69 6e 2c 20 54 52 ad(local_win, TR
2120: 55 45 29 3b 0a 09 62 6f 78 28 6c 6f 63 61 6c 5f UE);..box(local_
2130: 77 69 6e 2c 20 30 2c 20 30 29 3b 0a 09 70 72 69 win, 0, 0);..pri
2140: 6e 74 5f 69 6e 5f 6d 69 64 64 6c 65 28 6c 6f 63 nt_in_middle(loc
2150: 61 6c 5f 77 69 6e 2c 20 31 2c 20 30 2c 20 34 30 al_win, 1, 0, 40
2160: 2c 20 74 69 74 6c 65 2c 20 43 4f 4c 4f 52 5f 50 , title, COLOR_P
2170: 41 49 52 28 31 29 29 3b 0a 09 6d 76 77 61 64 64 AIR(1));..mvwadd
2180: 63 68 28 6c 6f 63 61 6c 5f 77 69 6e 2c 20 32 2c ch(local_win, 2,
2190: 20 30 2c 20 41 43 53 5f 4c 54 45 45 29 3b 0a 09 0, ACS_LTEE);..
21a0: 6d 76 77 68 6c 69 6e 65 28 6c 6f 63 61 6c 5f 77 mvwhline(local_w
21b0: 69 6e 2c 20 32 2c 20 31 2c 20 41 43 53 5f 48 4c in, 2, 1, ACS_HL
21c0: 49 4e 45 2c 20 33 38 29 3b 0a 09 6d 76 77 61 64 INE, 38);..mvwad
21d0: 64 63 68 28 6c 6f 63 61 6c 5f 77 69 6e 2c 20 32 dch(local_win, 2
21e0: 2c 20 33 39 2c 20 41 43 53 5f 52 54 45 45 29 3b , 39, ACS_RTEE);
21f0: 0a 09 72 65 74 75 72 6e 20 6c 6f 63 61 6c 5f 77 ..return local_w
2200: 69 6e 3b 0a 7d 0a 0a 76 6f 69 64 20 72 65 6d 6f in;.}..void remo
2210: 76 65 5f 6d 65 6e 75 28 49 54 45 4d 20 2a 2a 69 ve_menu(ITEM **i
2220: 74 65 6d 73 2c 20 4d 45 4e 55 20 2a 6d 65 6e 2c tems, MENU *men,
2230: 20 69 6e 74 20 6e 29 20 7b 0a 09 69 6e 74 20 69 int n) {..int i
2240: 3b 0a 0a 09 75 6e 70 6f 73 74 5f 6d 65 6e 75 28 ;...unpost_menu(
2250: 6d 65 6e 29 3b 0a 09 66 72 65 65 5f 6d 65 6e 75 men);..free_menu
2260: 28 6d 65 6e 29 3b 0a 09 66 6f 72 28 69 20 3d 20 (men);..for(i =
2270: 30 3b 20 69 20 3c 20 6e 3b 20 2b 2b 69 29 0a 09 0; i < n; ++i)..
2280: 09 66 72 65 65 5f 69 74 65 6d 28 69 74 65 6d 73 .free_item(items
2290: 5b 69 5d 29 3b 0a 7d 0a 0a 76 6f 69 64 20 70 72 [i]);.}..void pr
22a0: 69 6e 74 5f 69 6e 5f 6d 69 64 64 6c 65 28 57 49 int_in_middle(WI
22b0: 4e 44 4f 57 20 2a 77 69 6e 2c 20 69 6e 74 20 73 NDOW *win, int s
22c0: 74 61 72 74 79 2c 20 69 6e 74 20 73 74 61 72 74 tarty, int start
22d0: 78 2c 20 69 6e 74 20 77 69 64 74 68 2c 20 63 68 x, int width, ch
22e0: 61 72 20 2a 73 74 72 69 6e 67 2c 20 63 68 74 79 ar *string, chty
22f0: 70 65 20 63 6f 6c 6f 72 29 20 7b 0a 09 69 6e 74 pe color) {..int
2300: 20 6c 65 6e 67 74 68 2c 20 78 2c 20 79 3b 0a 09 length, x, y;..
2310: 66 6c 6f 61 74 20 74 65 6d 70 3b 0a 0a 09 69 66 float temp;...if
2320: 28 77 69 6e 20 3d 3d 20 4e 55 4c 4c 29 0a 09 09 (win == NULL)...
2330: 77 69 6e 20 3d 20 73 74 64 73 63 72 3b 0a 09 67 win = stdscr;..g
2340: 65 74 79 78 28 77 69 6e 2c 20 79 2c 20 78 29 3b etyx(win, y, x);
2350: 0a 09 69 66 28 73 74 61 72 74 78 20 21 3d 20 30 ..if(startx != 0
2360: 29 0a 09 09 78 20 3d 20 73 74 61 72 74 78 3b 0a )...x = startx;.
2370: 09 69 66 28 73 74 61 72 74 79 20 21 3d 20 30 29 .if(starty != 0)
2380: 0a 09 09 79 20 3d 20 73 74 61 72 74 79 3b 0a 09 ...y = starty;..
2390: 69 66 28 77 69 64 74 68 20 3d 3d 20 30 29 0a 09 if(width == 0)..
23a0: 09 77 69 64 74 68 20 3d 20 38 30 3b 0a 0a 09 6c .width = 80;...l
23b0: 65 6e 67 74 68 20 3d 20 73 74 72 6c 65 6e 28 73 ength = strlen(s
23c0: 74 72 69 6e 67 29 3b 0a 09 74 65 6d 70 20 3d 20 tring);..temp =
23d0: 28 77 69 64 74 68 20 2d 20 6c 65 6e 67 74 68 29 (width - length)
23e0: 2f 20 32 3b 0a 09 78 20 3d 20 73 74 61 72 74 78 / 2;..x = startx
23f0: 20 2b 20 28 69 6e 74 29 74 65 6d 70 3b 0a 09 77 + (int)temp;..w
2400: 61 74 74 72 6f 6e 28 77 69 6e 2c 20 63 6f 6c 6f attron(win, colo
2410: 72 29 3b 0a 09 6d 76 77 70 72 69 6e 74 77 28 77 r);..mvwprintw(w
2420: 69 6e 2c 20 79 2c 20 78 2c 20 22 25 73 22 2c 20 in, y, x, "%s",
2430: 73 74 72 69 6e 67 29 3b 0a 09 77 61 74 74 72 6f string);..wattro
2440: 66 66 28 77 69 6e 2c 20 63 6f 6c 6f 72 29 3b 0a ff(win, color);.
2450: 09 72 65 66 72 65 73 68 28 29 3b 0a 7d 0a 0a 76 .refresh();.}..v
2460: 6f 69 64 20 73 65 6c 65 63 74 69 6f 6e 28 63 68 oid selection(ch
2470: 61 72 20 2a 6e 61 6d 65 29 20 7b 0a 09 73 77 69 ar *name) {..swi
2480: 74 63 68 28 6d 65 6e 75 5f 63 6f 75 6e 74 65 72 tch(menu_counter
2490: 29 20 7b 0a 09 09 63 61 73 65 20 31 3a 0a 09 09 ) {...case 1:...
24a0: 09 73 74 72 63 70 79 28 65 78 70 6f 73 75 72 65 .strcpy(exposure
24b0: 5f 73 65 6c 2c 20 6e 61 6d 65 29 3b 0a 09 09 09 _sel, name);....
24c0: 62 72 65 61 6b 3b 0a 09 09 63 61 73 65 20 32 3a break;...case 2:
24d0: 0a 09 09 09 73 74 72 63 70 79 28 69 73 6f 5f 73 ....strcpy(iso_s
24e0: 65 6c 2c 20 6e 61 6d 65 29 3b 0a 09 09 09 62 72 el, name);....br
24f0: 65 61 6b 3b 0a 09 09 63 61 73 65 20 33 3a 0a 09 eak;...case 3:..
2500: 09 09 73 74 72 63 70 79 28 73 68 75 74 74 65 72 ..strcpy(shutter
2510: 5f 73 65 6c 2c 20 6e 61 6d 65 29 3b 0a 09 09 09 _sel, name);....
2520: 62 72 65 61 6b 3b 0a 09 09 63 61 73 65 20 34 3a break;...case 4:
2530: 0a 09 09 09 73 74 72 63 70 79 28 61 70 65 72 74 ....strcpy(apert
2540: 75 72 65 5f 73 65 6c 2c 20 6e 61 6d 65 29 3b 0a ure_sel, name);.
2550: 09 09 09 62 72 65 61 6b 3b 0a 09 7d 0a 7d 0a 0a ...break;..}.}..
2560: 69 6e 74 20 65 78 70 6f 73 75 72 65 20 28 69 6e int exposure (in
2570: 74 20 69 73 6f 29 20 7b 0a 09 69 6e 74 20 65 76 t iso) {..int ev
2580: 31 30 30 3b 0a 09 65 76 31 30 30 20 3d 20 31 35 100;..ev100 = 15
2590: 3b 0a 09 72 65 74 75 72 6e 20 65 76 31 30 30 20 ;..return ev100
25a0: 2b 20 28 6c 6f 67 20 28 69 73 6f 20 2f 20 31 30 + (log (iso / 10
25b0: 30 29 20 2f 20 6c 6f 67 20 28 32 29 29 3b 0a 7d 0) / log (2));.}
25c0: 0a 0a 64 6f 75 62 6c 65 20 73 68 75 74 74 65 72 ..double shutter
25d0: 20 28 69 6e 74 20 65 78 70 6f 73 75 72 65 2c 20 (int exposure,
25e0: 64 6f 75 62 6c 65 20 61 70 65 72 74 75 72 65 29 double aperture)
25f0: 20 7b 0a 09 2f 2a 20 45 56 20 3d 20 6c 6f 67 32 {../* EV = log2
2600: 20 28 4e 5e 32 2f 74 29 20 2a 2f 0a 09 72 65 74 (N^2/t) */..ret
2610: 75 72 6e 20 70 6f 77 28 61 70 65 72 74 75 72 65 urn pow(aperture
2620: 2c 20 32 29 20 2f 20 70 6f 77 28 32 2c 20 65 78 , 2) / pow(2, ex
2630: 70 6f 73 75 72 65 29 3b 0a 7d 0a 0a 64 6f 75 62 posure);.}..doub
2640: 6c 65 20 61 70 65 72 74 75 72 65 20 28 69 6e 74 le aperture (int
2650: 20 65 78 70 6f 73 75 72 65 2c 20 64 6f 75 62 6c exposure, doubl
2660: 65 20 73 68 75 74 74 65 72 29 20 7b 0a 09 2f 2a e shutter) {../*
2670: 20 45 56 20 3d 20 6c 6f 67 32 20 28 4e 5e 32 2f EV = log2 (N^2/
2680: 74 29 20 2a 2f 0a 09 72 65 74 75 72 6e 20 73 71 t) */..return sq
2690: 72 74 28 70 6f 77 28 32 2c 20 65 78 70 6f 73 75 rt(pow(2, exposu
26a0: 72 65 29 20 2a 20 73 68 75 74 74 65 72 29 3b 0a re) * shutter);.
26b0: 7d 0a 0a 69 6e 74 20 6e 65 61 72 65 73 74 5f 6d }..int nearest_m
26c0: 61 74 63 68 20 28 64 6f 75 62 6c 65 20 78 2c 20 atch (double x,
26d0: 69 6e 74 20 6d 65 6e 75 2c 20 69 6e 74 20 6e 5f int menu, int n_
26e0: 61 72 72 61 79 29 20 7b 0a 09 2f 2a 20 4e 65 65 array) {../* Nee
26f0: 64 20 74 6f 20 73 65 61 72 63 68 20 61 72 72 61 d to search arra
2700: 79 20 66 6f 72 20 63 6c 6f 73 65 73 74 20 6d 61 y for closest ma
2710: 74 63 68 20 2a 2f 0a 09 69 6e 74 20 6e 3b 0a 09 tch */..int n;..
2720: 69 6e 74 20 64 69 66 66 5f 69 64 78 20 3d 20 31 int diff_idx = 1
2730: 3b 0a 09 63 68 61 72 20 61 72 72 61 79 5f 76 61 ;..char array_va
2740: 6c 75 65 5f 73 74 72 5b 39 5d 3b 0a 09 64 6f 75 lue_str[9];..dou
2750: 62 6c 65 20 61 72 72 61 79 5f 76 61 6c 75 65 5f ble array_value_
2760: 64 62 3b 0a 09 64 6f 75 62 6c 65 20 64 69 66 66 db;..double diff
2770: 3b 0a 0a 09 2f 2a 20 4e 65 65 64 20 61 20 73 74 ;.../* Need a st
2780: 61 72 74 69 6e 67 20 76 61 6c 75 65 20 66 6f 72 arting value for
2790: 20 64 69 66 66 65 72 65 6e 63 65 20 2a 2f 0a 09 difference */..
27a0: 73 77 69 74 63 68 28 6d 65 6e 75 29 20 7b 0a 09 switch(menu) {..
27b0: 09 63 61 73 65 20 33 3a 0a 09 09 09 61 72 72 61 .case 3:....arra
27c0: 79 5f 76 61 6c 75 65 5f 64 62 20 3d 20 66 72 61 y_value_db = fra
27d0: 63 74 69 6f 6e 5f 74 6f 5f 64 6f 75 62 6c 65 28 ction_to_double(
27e0: 73 68 75 74 74 65 72 5f 61 72 72 61 79 5b 31 5d shutter_array[1]
27f0: 29 3b 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09 63 );....break;...c
2800: 61 73 65 20 34 3a 0a 09 09 09 73 74 72 6e 63 70 ase 4:....strncp
2810: 79 28 61 72 72 61 79 5f 76 61 6c 75 65 5f 73 74 y(array_value_st
2820: 72 2c 20 61 70 65 72 74 75 72 65 5f 61 72 72 61 r, aperture_arra
2830: 79 5b 31 5d 2b 32 2c 20 34 29 3b 0a 09 09 09 61 y[1]+2, 4);....a
2840: 72 72 61 79 5f 76 61 6c 75 65 5f 64 62 20 3d 20 rray_value_db =
2850: 73 74 72 74 6f 64 28 61 72 72 61 79 5f 76 61 6c strtod(array_val
2860: 75 65 5f 73 74 72 2c 20 4e 55 4c 4c 29 3b 0a 09 ue_str, NULL);..
2870: 09 09 62 72 65 61 6b 3b 0a 09 7d 0a 09 64 69 66 ..break;..}..dif
2880: 66 20 3d 20 66 61 62 73 28 61 72 72 61 79 5f 76 f = fabs(array_v
2890: 61 6c 75 65 5f 64 62 20 2d 20 78 29 3b 0a 09 2f alue_db - x);../
28a0: 2a 20 4c 6f 74 73 20 6f 66 20 72 65 70 65 74 69 * Lots of repeti
28b0: 74 69 6f 6e 20 68 65 72 65 20 62 75 74 20 70 6f tion here but po
28c0: 69 6e 74 65 72 73 20 74 6f 20 61 72 72 61 79 73 inters to arrays
28d0: 20 73 65 65 6d 20 74 6f 20 62 65 20 61 20 62 61 seem to be a ba
28e0: 64 20 74 68 69 6e 67 20 2a 2f 0a 09 73 77 69 74 d thing */..swit
28f0: 63 68 28 6d 65 6e 75 29 20 7b 0a 09 09 63 61 73 ch(menu) {...cas
2900: 65 20 33 3a 0a 09 09 09 66 6f 72 20 28 20 6e 20 e 3:....for ( n
2910: 3d 20 32 3b 20 6e 20 3c 20 6e 5f 61 72 72 61 79 = 2; n < n_array
2920: 2d 32 3b 20 2b 2b 6e 20 29 20 7b 0a 09 09 09 09 -2; ++n ) {.....
2930: 61 72 72 61 79 5f 76 61 6c 75 65 5f 64 62 20 3d array_value_db =
2940: 20 66 72 61 63 74 69 6f 6e 5f 74 6f 5f 64 6f 75 fraction_to_dou
2950: 62 6c 65 28 73 68 75 74 74 65 72 5f 61 72 72 61 ble(shutter_arra
2960: 79 5b 6e 5d 29 3b 0a 09 09 09 09 69 66 20 28 66 y[n]);.....if (f
2970: 61 62 73 28 61 72 72 61 79 5f 76 61 6c 75 65 5f abs(array_value_
2980: 64 62 20 2d 20 78 29 20 3c 20 64 69 66 66 29 20 db - x) < diff)
2990: 7b 0a 09 09 09 09 09 64 69 66 66 5f 69 64 78 20 {......diff_idx
29a0: 3d 20 6e 3b 0a 09 09 09 09 09 64 69 66 66 20 3d = n;......diff =
29b0: 20 66 61 62 73 28 61 72 72 61 79 5f 76 61 6c 75 fabs(array_valu
29c0: 65 5f 64 62 20 2d 20 78 29 3b 0a 09 09 09 09 7d e_db - x);.....}
29d0: 0a 09 09 09 7d 0a 09 09 09 2f 2a 20 43 68 65 63 ....}..../* Chec
29e0: 6b 20 69 66 20 61 74 20 65 78 74 72 65 6d 69 74 k if at extremit
29f0: 69 65 73 20 61 6e 64 20 74 68 65 6e 20 69 66 20 ies and then if
2a00: 75 6e 64 65 72 2f 6f 76 65 72 20 65 78 70 6f 73 under/over expos
2a10: 65 64 20 2a 2f 0a 09 09 09 69 66 20 28 64 69 66 ed */....if (dif
2a20: 66 5f 69 64 78 20 3d 3d 20 31 29 20 7b 0a 09 09 f_idx == 1) {...
2a30: 09 09 69 66 20 28 64 69 66 66 20 3e 3d 20 66 72 ..if (diff >= fr
2a40: 61 63 74 69 6f 6e 5f 74 6f 5f 64 6f 75 62 6c 65 action_to_double
2a50: 28 73 68 75 74 74 65 72 5f 61 72 72 61 79 5b 31 (shutter_array[1
2a60: 5d 29 2f 32 29 20 7b 20 0a 09 09 09 09 09 2f 2a ])/2) { ....../*
2a70: 20 64 69 66 66 20 69 73 20 67 72 65 61 74 65 72 diff is greater
2a80: 20 74 68 61 6e 20 64 69 66 66 20 6f 66 20 6e 65 than diff of ne
2a90: 78 74 20 6f 6e 65 20 64 6f 77 6e 20 6d 69 6e 75 xt one down minu
2aa0: 73 20 6d 61 78 2f 6d 69 6e 20 2a 2f 0a 09 09 09 s max/min */....
2ab0: 09 09 64 69 66 66 5f 69 64 78 20 3d 20 30 3b 0a ..diff_idx = 0;.
2ac0: 09 09 09 09 7d 0a 09 09 09 7d 0a 09 09 09 69 66 ....}....}....if
2ad0: 20 28 64 69 66 66 5f 69 64 78 20 3d 3d 20 6e 5f (diff_idx == n_
2ae0: 61 72 72 61 79 2d 33 29 20 7b 0a 09 09 09 09 69 array-3) {.....i
2af0: 66 20 28 64 69 66 66 20 3e 3d 20 66 72 61 63 74 f (diff >= fract
2b00: 69 6f 6e 5f 74 6f 5f 64 6f 75 62 6c 65 28 73 68 ion_to_double(sh
2b10: 75 74 74 65 72 5f 61 72 72 61 79 5b 6e 5f 61 72 utter_array[n_ar
2b20: 72 61 79 2d 33 5d 29 2a 32 29 20 7b 0a 09 09 09 ray-3])*2) {....
2b30: 09 09 64 69 66 66 5f 69 64 78 20 3d 20 6e 5f 61 ..diff_idx = n_a
2b40: 72 72 61 79 2d 32 3b 09 0a 09 09 09 09 7d 0a 09 rray-2;......}..
2b50: 09 09 7d 0a 09 09 09 62 72 65 61 6b 3b 0a 09 09 ..}....break;...
2b60: 63 61 73 65 20 34 3a 0a 09 09 09 66 6f 72 20 28 case 4:....for (
2b70: 20 6e 20 3d 20 32 3b 20 6e 20 3c 20 6e 5f 61 72 n = 2; n < n_ar
2b80: 72 61 79 2d 32 3b 20 2b 2b 6e 20 29 20 7b 0a 09 ray-2; ++n ) {..
2b90: 09 09 09 73 74 72 6e 63 70 79 28 61 72 72 61 79 ...strncpy(array
2ba0: 5f 76 61 6c 75 65 5f 73 74 72 2c 20 61 70 65 72 _value_str, aper
2bb0: 74 75 72 65 5f 61 72 72 61 79 5b 6e 5d 2b 32 2c ture_array[n]+2,
2bc0: 20 34 29 3b 0a 09 09 09 09 61 72 72 61 79 5f 76 4);.....array_v
2bd0: 61 6c 75 65 5f 64 62 20 3d 20 73 74 72 74 6f 64 alue_db = strtod
2be0: 28 61 72 72 61 79 5f 76 61 6c 75 65 5f 73 74 72 (array_value_str
2bf0: 2c 20 4e 55 4c 4c 29 3b 0a 09 09 09 09 69 66 20 , NULL);.....if
2c00: 28 66 61 62 73 28 61 72 72 61 79 5f 76 61 6c 75 (fabs(array_valu
2c10: 65 5f 64 62 20 2d 20 78 29 20 3c 20 64 69 66 66 e_db - x) < diff
2c20: 29 20 7b 20 0a 09 09 09 09 09 64 69 66 66 5f 69 ) { ......diff_i
2c30: 64 78 20 3d 20 6e 3b 0a 09 09 09 09 09 64 69 66 dx = n;......dif
2c40: 66 20 3d 20 66 61 62 73 28 61 72 72 61 79 5f 76 f = fabs(array_v
2c50: 61 6c 75 65 5f 64 62 20 2d 20 78 29 3b 0a 09 09 alue_db - x);...
2c60: 09 09 7d 0a 09 09 09 7d 0a 09 09 09 2f 2a 20 41 ..}....}..../* A
2c70: 70 65 72 74 75 72 65 73 20 73 69 6d 69 6c 61 72 pertures similar
2c80: 6c 79 2e 20 41 6c 74 68 6f 75 67 68 20 70 72 6f ly. Although pro
2c90: 67 72 65 73 73 69 6f 6e 20 69 73 20 66 69 64 64 gression is fidd
2ca0: 6c 69 65 72 2e 2a 2f 0a 09 09 09 69 66 20 28 64 lier.*/....if (d
2cb0: 69 66 66 5f 69 64 78 20 3d 3d 20 31 29 20 7b 0a iff_idx == 1) {.
2cc0: 09 09 09 09 73 74 72 6e 63 70 79 28 61 72 72 61 ....strncpy(arra
2cd0: 79 5f 76 61 6c 75 65 5f 73 74 72 2c 20 61 70 65 y_value_str, ape
2ce0: 72 74 75 72 65 5f 61 72 72 61 79 5b 31 5d 2b 32 rture_array[1]+2
2cf0: 2c 20 34 29 3b 0a 09 09 09 09 61 72 72 61 79 5f , 4);.....array_
2d00: 76 61 6c 75 65 5f 64 62 20 3d 20 73 74 72 74 6f value_db = strto
2d10: 64 28 61 72 72 61 79 5f 76 61 6c 75 65 5f 73 74 d(array_value_st
2d20: 72 2c 20 4e 55 4c 4c 29 3b 0a 09 09 09 09 69 66 r, NULL);.....if
2d30: 20 28 64 69 66 66 20 3e 3d 20 61 72 72 61 79 5f (diff >= array_
2d40: 76 61 6c 75 65 5f 64 62 2f 73 71 72 74 28 32 2e value_db/sqrt(2.
2d50: 30 29 29 20 7b 0a 09 09 09 09 09 2f 2a 20 64 69 0)) {....../* di
2d60: 66 66 20 69 73 20 67 72 65 61 74 65 72 20 74 68 ff is greater th
2d70: 61 6e 20 64 69 66 66 20 6f 66 20 6e 65 78 74 20 an diff of next
2d80: 6f 6e 65 20 64 6f 77 6e 20 6d 69 6e 75 73 20 6d one down minus m
2d90: 61 78 2f 6d 69 6e 20 2a 2f 0a 09 09 09 09 09 64 ax/min */......d
2da0: 69 66 66 5f 69 64 78 20 3d 20 30 3b 0a 09 09 09 iff_idx = 0;....
2db0: 09 7d 0a 09 09 09 7d 0a 09 09 09 69 66 20 28 64 .}....}....if (d
2dc0: 69 66 66 5f 69 64 78 20 3d 3d 20 6e 5f 61 72 72 iff_idx == n_arr
2dd0: 61 79 2d 33 29 20 7b 0a 09 09 09 09 73 74 72 6e ay-3) {.....strn
2de0: 63 70 79 28 61 72 72 61 79 5f 76 61 6c 75 65 5f cpy(array_value_
2df0: 73 74 72 2c 20 61 70 65 72 74 75 72 65 5f 61 72 str, aperture_ar
2e00: 72 61 79 5b 6e 5f 61 72 72 61 79 2d 33 5d 2b 32 ray[n_array-3]+2
2e10: 2c 20 34 29 3b 0a 09 09 09 09 61 72 72 61 79 5f , 4);.....array_
2e20: 76 61 6c 75 65 5f 64 62 20 3d 20 73 74 72 74 6f value_db = strto
2e30: 64 28 61 72 72 61 79 5f 76 61 6c 75 65 5f 73 74 d(array_value_st
2e40: 72 2c 20 4e 55 4c 4c 29 3b 0a 09 09 09 09 69 66 r, NULL);.....if
2e50: 20 28 64 69 66 66 20 3e 3d 20 61 72 72 61 79 5f (diff >= array_
2e60: 76 61 6c 75 65 5f 64 62 2a 73 71 72 74 28 32 2e value_db*sqrt(2.
2e70: 30 29 29 20 7b 0a 09 09 09 09 09 64 69 66 66 5f 0)) {......diff_
2e80: 69 64 78 20 3d 20 6e 5f 61 72 72 61 79 2d 32 3b idx = n_array-2;
2e90: 09 0a 09 09 09 09 7d 0a 09 09 09 7d 0a 0a 09 09 ......}....}....
2ea0: 09 62 72 65 61 6b 3b 0a 09 7d 0a 09 72 65 74 75 .break;..}..retu
2eb0: 72 6e 20 64 69 66 66 5f 69 64 78 3b 0a 7d 0a 0a rn diff_idx;.}..
2ec0: 64 6f 75 62 6c 65 20 66 72 61 63 74 69 6f 6e 5f double fraction_
2ed0: 74 6f 5f 64 6f 75 62 6c 65 28 63 68 61 72 20 2a to_double(char *
2ee0: 66 72 61 63 74 69 6f 6e 29 20 7b 0a 09 64 6f 75 fraction) {..dou
2ef0: 62 6c 65 20 66 72 61 63 74 69 6f 6e 5f 61 73 5f ble fraction_as_
2f00: 64 62 3b 0a 09 63 68 61 72 20 64 65 6e 6f 6d 69 db;..char denomi
2f10: 6e 61 74 6f 72 5b 39 5d 3b 0a 09 63 68 61 72 20 nator[9];..char
2f20: 2a 70 74 72 20 3d 20 73 74 72 73 74 72 28 66 72 *ptr = strstr(fr
2f30: 61 63 74 69 6f 6e 2c 20 22 2f 22 29 3b 0a 0a 09 action, "/");...
2f40: 69 66 20 28 70 74 72 29 20 7b 0a 09 09 2f 2a 74 if (ptr) {.../*t
2f50: 68 65 6e 20 73 70 6c 69 74 2a 2f 0a 09 09 73 74 hen split*/...st
2f60: 72 6e 63 70 79 28 64 65 6e 6f 6d 69 6e 61 74 6f rncpy(denominato
2f70: 72 2c 20 66 72 61 63 74 69 6f 6e 2b 32 2c 20 35 r, fraction+2, 5
2f80: 29 3b 0a 09 09 66 72 61 63 74 69 6f 6e 5f 61 73 );...fraction_as
2f90: 5f 64 62 20 3d 20 31 20 2f 20 73 74 72 74 6f 64 _db = 1 / strtod
2fa0: 28 64 65 6e 6f 6d 69 6e 61 74 6f 72 2c 20 4e 55 (denominator, NU
2fb0: 4c 4c 29 3b 0a 09 7d 0a 09 65 6c 73 65 20 7b 0a LL);..}..else {.
2fc0: 09 09 66 72 61 63 74 69 6f 6e 5f 61 73 5f 64 62 ..fraction_as_db
2fd0: 20 3d 20 73 74 72 74 6f 64 28 66 72 61 63 74 69 = strtod(fracti
2fe0: 6f 6e 2c 20 4e 55 4c 4c 29 3b 0a 09 7d 0a 09 72 on, NULL);..}..r
2ff0: 65 74 75 72 6e 20 66 72 61 63 74 69 6f 6e 5f 61 eturn fraction_a
3000: 73 5f 64 62 3b 0a 7d 0a 0a 2f 2a 20 44 65 62 75 s_db;.}../* Debu
3010: 67 20 6c 69 6e 65 73 0a 20 2a 20 73 70 72 69 6e g lines. * sprin
3020: 74 66 28 74 65 6d 70 2c 20 22 25 66 22 2c 20 78 tf(temp, "%f", x
3030: 29 3b 0a 20 2a 20 6d 76 70 72 69 6e 74 77 28 4c );. * mvprintw(L
3040: 49 4e 45 53 20 2d 20 34 2c 20 30 2c 20 74 65 6d INES - 4, 0, tem
3050: 70 29 3b 0a 20 2a 20 72 65 66 72 65 73 68 28 29 p);. * refresh()
3060: 3b 2a 2f 0a ;*/.