117289Sopcode /*
2*17650Sopcode  * @(#)menu.c	1.2  01/03/85
317289Sopcode  *
417289Sopcode  * Menu subwindow routines for the SUN Gremlin picture editor.
517289Sopcode  *
617289Sopcode  * Mark Opperman (opcode@monet.BERKELEY)
717289Sopcode  *
817289Sopcode  */
917289Sopcode 
1017289Sopcode #include <suntool/tool_hs.h>
1117289Sopcode #include <suntool/menu.h>
1217289Sopcode #include <errno.h>
1317289Sopcode #include "gremlin.h"
1417289Sopcode #include "icondata.h"
1517289Sopcode 
1617289Sopcode /* imports from graphics.c */
1717289Sopcode 
1817289Sopcode extern GRCurrentSetOn();
1917289Sopcode 
2017289Sopcode /*  imports from short.c */
2117289Sopcode 
2217289Sopcode extern int adj[];
2317289Sopcode 
2417289Sopcode /* imports from text.c */
2517289Sopcode 
2617289Sopcode extern TxMsgOK();
2717289Sopcode 
2817289Sopcode /* imports from sun.c */
2917289Sopcode 
3017289Sopcode extern pw_box();
3117289Sopcode 
3217289Sopcode /* imports from main.c */
3317289Sopcode 
3417289Sopcode extern Artmode;			/* type of point layed down */
3517289Sopcode extern Adjustment;
3617289Sopcode extern Alignment;
3717289Sopcode extern GravityOn;
3817289Sopcode extern menu_fd;
3917289Sopcode extern struct pixfont *text_pf;
4017289Sopcode extern struct rect menu_size;
4117289Sopcode extern ELT *MEN[];
4217289Sopcode extern SymbolicLines;
4317289Sopcode extern FLASH_READY;
4417289Sopcode 
45*17650Sopcode extern (*lastcommand)();	/* previous command */
46*17650Sopcode extern lasttext;		/* TRUE if previous cmd uses text input */
4717289Sopcode 
48*17650Sopcode /* forward references */
49*17650Sopcode 
50*17650Sopcode extern align_up();
51*17650Sopcode extern align_down();
52*17650Sopcode 
53*17650Sopcode 
5417289Sopcode #define M_CLEAR_POINTS (caddr_t) 1
5517289Sopcode #define M_SHOW_POINTS (caddr_t) 2
5617289Sopcode #define M_GRIPE (caddr_t) 3
5717289Sopcode #define M_POINT (caddr_t) 4
5817289Sopcode 
5917289Sopcode struct menuitem misc_items[] = {
6017289Sopcode     { MENU_IMAGESTRING, "Clear Points", M_CLEAR_POINTS},
6117289Sopcode     { MENU_IMAGESTRING, "Show Points", M_SHOW_POINTS},
6217289Sopcode     { MENU_IMAGESTRING, "Gripe", M_GRIPE},
6317289Sopcode     { MENU_IMAGESTRING, "Point", M_POINT}
6417289Sopcode };
6517289Sopcode 
6617289Sopcode struct menu misc_menu = {
6717289Sopcode     MENU_IMAGESTRING, "Misc",
6817289Sopcode     sizeof(misc_items) / sizeof(struct menuitem), misc_items, 0, 0
6917289Sopcode };
7017289Sopcode 
7117289Sopcode struct menu *misc_menu_stack = &misc_menu;
7217289Sopcode 
7317289Sopcode #define M_EDIT (caddr_t) 1
7417289Sopcode #define M_PATH (caddr_t) 2
7517289Sopcode #define M_READ (caddr_t) 3
7617289Sopcode #define M_SAVE_SET (caddr_t) 4
7717289Sopcode #define M_WRITE (caddr_t) 5
7817289Sopcode 
7917289Sopcode struct menuitem file_items[] = {
8017289Sopcode     { MENU_IMAGESTRING, "Edit", M_EDIT},
8117289Sopcode     { MENU_IMAGESTRING, "Path", M_PATH},
8217289Sopcode     { MENU_IMAGESTRING, "Read", M_READ},
8317289Sopcode     { MENU_IMAGESTRING, "Save Set", M_SAVE_SET},
8417289Sopcode     { MENU_IMAGESTRING, "Write", M_WRITE}
8517289Sopcode };
8617289Sopcode 
8717289Sopcode struct menu file_menu = {
8817289Sopcode     MENU_IMAGESTRING, "File",
8917289Sopcode     sizeof(file_items) / sizeof(struct menuitem), file_items, 0, 0
9017289Sopcode };
9117289Sopcode 
9217289Sopcode struct menu *file_menu_stack = &file_menu;
9317289Sopcode 
9417289Sopcode int icon_x, icon_y;	/* location of currently selected menu icon */
9517289Sopcode int icon_last = -1;	/* menu index of currently selected menu icon */
9617289Sopcode int just_x, just_y;	/* location of justify marker within justify icon */
9717289Sopcode int just_last = -1;	/* justify index of currently selected mode */
9817289Sopcode struct pixrect *save_just_pr;
9917289Sopcode 
10017289Sopcode #define MNReverseJustify()  pw_write(menu_pw, just_x + 1, just_y, 5, 5, \
10117289Sopcode 		     PIX_SRC ^ PIX_DST, &dot_pr, 0, 0)
10217289Sopcode 
10317289Sopcode /* imports from main.c */
10417289Sopcode 
10517289Sopcode extern struct pixwin *menu_pw;
10617289Sopcode extern struct toolsw *menu_sw;
10717289Sopcode extern CFONT;
10817289Sopcode extern CSIZE;
10917289Sopcode extern CJUST;
11017289Sopcode extern CBRUSH;
11117289Sopcode extern CSTIPPLE;
11217289Sopcode 
11317289Sopcode /* imports from help.c */
11417289Sopcode 
11517289Sopcode extern justify_help(), help(), horizontal_help(), vertical_help(),
11617289Sopcode        size1_help(), size2_help(), size3_help(), size4_help(),
11717289Sopcode        roman_help(), italics_help(), bold_help(), special_help(),
11817289Sopcode        scale_help(), move_help(), hmirror_help(), vmirror_help(),
11917289Sopcode        include_help(), linestyle_help(), align_help(), pan_help(),
12017289Sopcode        polygon_help(), bpolygon_help(),
12117289Sopcode        get1_help(), get2_help(), get3_help(), get4_help(),
12217289Sopcode        put1_help(), put2_help(), put3_help(), put4_help(),
12317289Sopcode        brush1_help(), brush2_help(), brush3_help(),
12417289Sopcode        brush4_help(), brush5_help(), brush6_help(),
12517289Sopcode        stipple1_help(), stipple2_help(), stipple3_help(), stipple4_help(),
12617289Sopcode        stipple5_help(), stipple6_help(), stipple7_help(), stipple8_help(),
12717289Sopcode        copy_help(), arrow_help(), text_help(), misc_help(), undo_help(),
12817289Sopcode        erase_help(), movepoint_help(), rotate_help(), filecabinet_help(),
12917289Sopcode        boxinc_help(), manhattan_help(), gravity_help(), arc_help(),
13017289Sopcode        curve_help(), vector_help(), box_help(), grid_help(),
13117289Sopcode        littlepoint_help(), menusw_help();
13217289Sopcode 
13317289Sopcode /* imports from sunlong.c */
13417289Sopcode 
13517289Sopcode extern LGBrush1(), LGBrush2(), LGBrush3(),
13617289Sopcode        LGBrush4(), LGBrush5(), LGBrush6(),
137*17650Sopcode        LGClearPoints(), LGPath(), LGEdit(),
13817289Sopcode        LGFont1(), LGFont2(), LGFont3(), LGFont4(),
13917289Sopcode        LGGet1(), LGGet2(), LGGet3(), LGGet4(),
14017289Sopcode        LGGripe(), LGHMirror(),
14117289Sopcode        LGHAdjust(), LGIncludeSet(), LGLineStyle(), LGLittlePoint(),
14217289Sopcode        LGMBrush1(), LGMBrush2(), LGMBrush3(),
14317289Sopcode        LGMBrush4(), LGMBrush5(), LGMBrush6(), LGMCurve(),
14417289Sopcode        LGMFont1(), LGMFont2(), LGMFont3(), LGMFont4(),
14517289Sopcode        LGMJustify(), LGMPan(),
14617289Sopcode        LGMSize1(), LGMSize2(), LGMSize3(), LGMSize4(),
14717289Sopcode        LGMStipple1(), LGMStipple2(), LGMStipple3(), LGMStipple4(),
14817289Sopcode        LGMStipple5(), LGMStipple6(), LGMStipple7(), LGMStipple8(),
14917289Sopcode        LGMText(), LGMPoint(), LGMVector(), nop(), LGPan(),
15017289Sopcode        LGPolygon(), LGBPolygon(), LGMPolygon(), LGMBPolygon(),
15117289Sopcode        LGOPoint(), LGRead(), LGSave(), LGShowPoints(),
15217289Sopcode        LGSize1(), LGSize2(), LGSize3(), LGSize4(),
15317289Sopcode        LGStipple1(), LGStipple2(), LGStipple3(), LGStipple4(),
15417289Sopcode        LGStipple5(), LGStipple6(), LGStipple7(), LGStipple8(),
15517289Sopcode        LGText(), LGUndo(), LGVAdjust(), LGVMirror(), LGWrite();
15617289Sopcode 
15717289Sopcode 
15817289Sopcode /* imports from short.c */
15917289Sopcode 
16017289Sopcode extern SHArrow(), SHBox(), SHCopy(), SHDefineSet(), SHDrawArc(), SHDrawCurve(),
16117289Sopcode        SHDrawVector(), SHErase(), SHGravity(), SHGrid(), SHMAdjust(),
16217289Sopcode        SHSave1(), SHSave2(), SHSave3(), SHSave4(),
16317289Sopcode        SHRotate(), SHScale(), SHSetArea(), SHMSetArea(), SHTranslate();
16417289Sopcode 
16517289Sopcode /* imports from suntools */
16617289Sopcode 
16717289Sopcode extern struct menuitem *menu_display();
16817289Sopcode 
16917289Sopcode /* justify_mark marks the text handle positions for the JUSTIFY icon
17017289Sopcode    relative to the icon's upper left corner */
17117289Sopcode 
17217289Sopcode struct pr_pos justify_mark[9];
17317289Sopcode 
17417289Sopcode /* just_to_indx maps the justification values (TOPLEFT, ..., BOTRIGHT)
17517289Sopcode    to the corresponding index in the justify_mark array */
17617289Sopcode 
17717289Sopcode int just_to_indx[] = { 6, 8, 4, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 5, 7 };
17817289Sopcode 
17917289Sopcode /* indx_to_just maps the internal justification values (0, ..., 8)
18017289Sopcode    to the gremlin justification values (TOPLEFT, ..., BOTRIGHT) */
18117289Sopcode 
18217289Sopcode int indx_to_just[] = { TOPLEFT, TOPCENT, TOPRIGHT,
18317289Sopcode 		       CENTLEFT, CENTCENT, CENTRIGHT,
18417289Sopcode 		       BOTLEFT, BOTCENT, BOTRIGHT };
18517289Sopcode 
18617289Sopcode struct _menu menu[] = {
18717289Sopcode #define M_SIZE1 0
18817289Sopcode     { MENU_LEFT + ICON_BORDER + MENU_X * 0,
18917289Sopcode       MENU_TOP +  ICON_BORDER + MENU_Y * 1, &size1_pr,
19017289Sopcode       LGSize1, LGMSize1, size1_help },
19117289Sopcode 
19217289Sopcode #define M_ROMAN (M_SIZE1+1)
19317289Sopcode     { MENU_LEFT + ICON_BORDER + MENU_X * 2,
19417289Sopcode       MENU_TOP  + ICON_BORDER + MENU_Y * 2, &roman_pr,
19517289Sopcode       LGFont1, LGMFont1, roman_help },
19617289Sopcode 
19717289Sopcode #define M_JUSTIFY (M_ROMAN+1)
19817289Sopcode     { MENU_LEFT + ICON_BORDER + MENU_X * 2,
19917289Sopcode       MENU_TOP  + ICON_BORDER + MENU_Y * 1, &justify_pr,
20017289Sopcode       nop, nop, nop },
20117289Sopcode 
20217289Sopcode #define M_SCALE (M_JUSTIFY+1)
20317289Sopcode     { MENU_LEFT + ICON_BORDER + MENU_X * 0,
20417289Sopcode       MENU_TOP  + ICON_BORDER + MENU_Y * 9, &scale_pr,
20517289Sopcode       SHScale, nop, scale_help },
20617289Sopcode 
20717289Sopcode #define M_TRANSLATE (M_SCALE+1)
20817289Sopcode     { MENU_LEFT + ICON_BORDER + MENU_X * 0,
20917289Sopcode       MENU_TOP  + ICON_BORDER + MENU_Y * 8, &move_pr,
21017289Sopcode       SHTranslate, nop, move_help },
21117289Sopcode 
21217289Sopcode #define M_HMIRROR (M_TRANSLATE+1)
21317289Sopcode     { MENU_LEFT + ICON_BORDER + MENU_X * 0,
21417289Sopcode       MENU_TOP  + ICON_BORDER + MENU_Y * 11, &hmirror_pr,
21517289Sopcode       LGHMirror, nop, hmirror_help },
21617289Sopcode 
21717289Sopcode #define M_VMIRROR (M_HMIRROR+1)
21817289Sopcode     { MENU_LEFT + ICON_BORDER + MENU_X * 1,
21917289Sopcode       MENU_TOP  + ICON_BORDER + MENU_Y * 11, &vmirror_pr,
22017289Sopcode       LGVMirror, nop, vmirror_help },
22117289Sopcode 
22217289Sopcode #define M_DEFINE_SET (M_VMIRROR+1)
22317289Sopcode     { MENU_LEFT + ICON_BORDER + MENU_X * 2,
22417289Sopcode       MENU_TOP  + ICON_BORDER + MENU_Y * 14, &include_pr,
22517289Sopcode       SHDefineSet, LGIncludeSet, include_help },
22617289Sopcode 
22717289Sopcode #define M_PUT1 (M_DEFINE_SET+1)
22817289Sopcode     { MENU_LEFT + ICON_BORDER + MENU_X * 0,
22917289Sopcode       MENU_TOP  + ICON_BORDER + MENU_Y * 15, &put1_pr,
23017289Sopcode       SHSave1, nop, put1_help },
23117289Sopcode 
23217289Sopcode #define M_PUT3 (M_PUT1+1)
23317289Sopcode     { MENU_LEFT + ICON_BORDER + MENU_X * 0,
23417289Sopcode       MENU_TOP  + ICON_BORDER + MENU_Y * 16, &put3_pr,
23517289Sopcode       SHSave3, nop, put3_help },
23617289Sopcode 
23717289Sopcode #define M_HORZ_ADJUST (M_PUT3+1)
23817289Sopcode     { MENU_LEFT + ICON_BORDER + MENU_X * 0,
23917289Sopcode       MENU_TOP  + ICON_BORDER + MENU_Y * 17, &horizontal_pr,
24017289Sopcode       LGHAdjust, nop, horizontal_help },
24117289Sopcode 
24217289Sopcode #define M_VERT_ADJUST (M_HORZ_ADJUST+1)
24317289Sopcode     { MENU_LEFT + ICON_BORDER + MENU_X * 0,
24417289Sopcode       MENU_TOP  + ICON_BORDER + MENU_Y * 18, &vertical_pr,
24517289Sopcode       LGVAdjust, nop, vertical_help },
24617289Sopcode 
24717289Sopcode #define M_STIPPLE1 (M_VERT_ADJUST+1)
24817289Sopcode     { MENU_LEFT + ICON_BORDER + MENU_X * 0,
24917289Sopcode       MENU_TOP  + ICON_BORDER + MENU_Y * 3, &white_pr,
25017289Sopcode       LGStipple1, LGMStipple1, stipple1_help },
25117289Sopcode 
25217289Sopcode #define M_STIPPLE5 (M_STIPPLE1+1)
25317289Sopcode     { MENU_LEFT + ICON_BORDER + MENU_X * 1,
25417289Sopcode       MENU_TOP  + ICON_BORDER + MENU_Y * 3, &stipple5_pr,
25517289Sopcode       LGStipple5, LGMStipple5, stipple5_help },
25617289Sopcode 
25717289Sopcode #define M_SIZE2 (M_STIPPLE5+1)
25817289Sopcode     { MENU_LEFT + ICON_BORDER + MENU_X * 1,
25917289Sopcode       MENU_TOP  + ICON_BORDER + MENU_Y * 1, &size2_pr,
26017289Sopcode       LGSize2, LGMSize2, size2_help },
26117289Sopcode 
26217289Sopcode #define M_ITALICS (M_SIZE2+1)
26317289Sopcode     { MENU_LEFT + ICON_BORDER + MENU_X * 3,
26417289Sopcode       MENU_TOP  + ICON_BORDER + MENU_Y * 2, &italics_pr,
26517289Sopcode       LGFont2, LGMFont2, italics_help },
26617289Sopcode 
26717289Sopcode #define M_COPY (M_ITALICS+1)
26817289Sopcode     { MENU_LEFT + ICON_BORDER + MENU_X * 1,
26917289Sopcode       MENU_TOP  + ICON_BORDER + MENU_Y * 8, &copy_pr,
27017289Sopcode       SHCopy, nop, copy_help },
27117289Sopcode 
27217289Sopcode #define M_ERASE (M_COPY+1)
27317289Sopcode     { MENU_LEFT + ICON_BORDER + MENU_X * 1,
27417289Sopcode       MENU_TOP  + ICON_BORDER + MENU_Y * 9, &erase_pr,
27517289Sopcode       SHErase, nop, erase_help },
27617289Sopcode 
27717289Sopcode #define M_MOVE_POINT (M_ERASE+1)
27817289Sopcode     { MENU_LEFT + ICON_BORDER + MENU_X * 1,
27917289Sopcode       MENU_TOP  + ICON_BORDER + MENU_Y * 10, &movepoint_pr,
28017289Sopcode       LGMPoint, nop, movepoint_help },
28117289Sopcode 
28217289Sopcode #define M_ROTATE (M_MOVE_POINT+1)
28317289Sopcode     { MENU_LEFT + ICON_BORDER + MENU_X * 0,
28417289Sopcode       MENU_TOP  + ICON_BORDER + MENU_Y * 10, &rotate_pr,
28517289Sopcode       SHRotate, nop, rotate_help },
28617289Sopcode 
28717289Sopcode #define M_FILE (M_ROTATE+1)
28817289Sopcode     { MENU_LEFT + ICON_BORDER + MENU_X * 2,
28917289Sopcode       MENU_TOP  + ICON_BORDER + MENU_Y * 13, &filecabinet_pr,
29017289Sopcode       nop, nop, filecabinet_help },
29117289Sopcode 
29217289Sopcode #define M_PAN (M_FILE+1)
29317289Sopcode     { MENU_LEFT + ICON_BORDER + MENU_X * 1,
29417289Sopcode       MENU_TOP  + ICON_BORDER + MENU_Y * 14, &pan_pr,
29517289Sopcode       LGPan, LGMPan, pan_help },
29617289Sopcode 
29717289Sopcode #define M_SET_AREA (M_PAN+1)
29817289Sopcode     { MENU_LEFT + ICON_BORDER + MENU_X * 3,
29917289Sopcode       MENU_TOP  + ICON_BORDER + MENU_Y * 14, &boxinc_pr,
30017289Sopcode       SHSetArea, SHMSetArea, boxinc_help },
30117289Sopcode 
30217289Sopcode #define M_PUT2 (M_SET_AREA+1)
30317289Sopcode     { MENU_LEFT + ICON_BORDER + MENU_X * 1,
30417289Sopcode       MENU_TOP  + ICON_BORDER + MENU_Y * 15, &put2_pr,
30517289Sopcode       SHSave2, nop, put2_help },
30617289Sopcode 
30717289Sopcode #define M_PUT4 (M_PUT2+1)
30817289Sopcode     { MENU_LEFT + ICON_BORDER + MENU_X * 1,
30917289Sopcode       MENU_TOP  + ICON_BORDER + MENU_Y * 16, &put4_pr,
31017289Sopcode       SHSave4, nop, put4_help },
31117289Sopcode 
31217289Sopcode #define M_MANHATTAN_ADJUST (M_PUT4+1)
31317289Sopcode     { MENU_LEFT + ICON_BORDER + MENU_X * 1,
31417289Sopcode       MENU_TOP  + ICON_BORDER + MENU_Y * 17, &horvert_pr,
31517289Sopcode       SHMAdjust, nop, manhattan_help },
31617289Sopcode 
31717289Sopcode #define M_GRAVITY (M_MANHATTAN_ADJUST+1)
31817289Sopcode     { MENU_LEFT + ICON_BORDER + MENU_X * 1,
31917289Sopcode       MENU_TOP  + ICON_BORDER + MENU_Y * 18, &gravity_pr,
32017289Sopcode       SHGravity, nop, gravity_help },
32117289Sopcode 
32217289Sopcode #define M_STIPPLE6 (M_GRAVITY+1)
32317289Sopcode     { MENU_LEFT + ICON_BORDER + MENU_X * 1,
32417289Sopcode       MENU_TOP  + ICON_BORDER + MENU_Y * 4, &stipple6_pr,
32517289Sopcode       LGStipple6, LGMStipple6, stipple6_help },
32617289Sopcode 
32717289Sopcode #define M_STIPPLE2 (M_STIPPLE6+1)
32817289Sopcode     { MENU_LEFT + ICON_BORDER + MENU_X * 0,
32917289Sopcode       MENU_TOP  + ICON_BORDER + MENU_Y * 4, &gray_pr,
33017289Sopcode       LGStipple2, LGMStipple2, stipple2_help },
33117289Sopcode 
33217289Sopcode #define M_SIZE3 (M_STIPPLE2+1)
33317289Sopcode     { MENU_LEFT + ICON_BORDER + MENU_X * 0,
33417289Sopcode       MENU_TOP  + ICON_BORDER + MENU_Y * 2, &size3_pr,
33517289Sopcode       LGSize3, LGMSize3, size3_help },
33617289Sopcode 
33717289Sopcode #define M_BOLD (M_SIZE3+1)
33817289Sopcode     { MENU_LEFT + ICON_BORDER + MENU_X * 2,
33917289Sopcode       MENU_TOP  + ICON_BORDER + MENU_Y * 3, &bold_pr,
34017289Sopcode       LGFont3, LGMFont3, bold_help },
34117289Sopcode 
34217289Sopcode #define M_BRUSH1 (M_BOLD+1)
34317289Sopcode     { MENU_LEFT + ICON_BORDER + MENU_X * 3,
34417289Sopcode       MENU_TOP  + ICON_BORDER + MENU_Y * 4, &dotted_pr,
34517289Sopcode       LGBrush1, LGMBrush1, brush1_help },
34617289Sopcode 
34717289Sopcode #define M_BRUSH2 (M_BRUSH1+1)
34817289Sopcode     { MENU_LEFT + ICON_BORDER + MENU_X * 3,
34917289Sopcode       MENU_TOP  + ICON_BORDER + MENU_Y * 6, &broken_pr,
35017289Sopcode       LGBrush2, LGMBrush2, brush2_help },
35117289Sopcode 
35217289Sopcode #define M_BRUSH3 (M_BRUSH2+1)
35317289Sopcode     { MENU_LEFT + ICON_BORDER + MENU_X * 2,
35417289Sopcode       MENU_TOP  + ICON_BORDER + MENU_Y * 6, &thick_pr,
35517289Sopcode       LGBrush3, LGMBrush3, brush3_help },
35617289Sopcode 
35717289Sopcode #define M_TEXT (M_BRUSH3+1)
35817289Sopcode     { MENU_LEFT + ICON_BORDER + MENU_X * 2,
35917289Sopcode       MENU_TOP  + ICON_BORDER + MENU_Y * 8, &text_pr,
36017289Sopcode       LGText, LGMText, text_help },
36117289Sopcode 
36217289Sopcode #define M_BPOLYGON (M_TEXT+1)
36317289Sopcode     { MENU_LEFT + ICON_BORDER + MENU_X * 2,
36417289Sopcode       MENU_TOP  + ICON_BORDER + MENU_Y * 9, &bpolygon_pr,
36517289Sopcode       LGBPolygon, LGMBPolygon, bpolygon_help },
36617289Sopcode 
36717289Sopcode #define M_POLYGON (M_BPOLYGON+1)
36817289Sopcode     { MENU_LEFT + ICON_BORDER + MENU_X * 2,
36917289Sopcode       MENU_TOP  + ICON_BORDER + MENU_Y * 10, &polygon_pr,
37017289Sopcode       LGPolygon, LGMPolygon, polygon_help },
37117289Sopcode 
37217289Sopcode #define M_ARROW (M_POLYGON+1)
37317289Sopcode     { MENU_LEFT + ICON_BORDER + MENU_X * 2,
37417289Sopcode       MENU_TOP  + ICON_BORDER + MENU_Y * 11, &arrow_pr,
37517289Sopcode       SHArrow, nop, arrow_help },
37617289Sopcode 
37717289Sopcode #define M_HELP (M_ARROW+1)
37817289Sopcode     { MENU_LEFT + ICON_BORDER + MENU_X * 1,
37917289Sopcode       MENU_TOP  + ICON_BORDER + MENU_Y * 13, &question_pr,
38017289Sopcode       help, help, help },
38117289Sopcode 
38217289Sopcode #define M_MISC (M_HELP+1)
38317289Sopcode     { MENU_LEFT + ICON_BORDER + MENU_X * 0,
38417289Sopcode       MENU_TOP  + ICON_BORDER + MENU_Y * 14, &misc_pr,
38517289Sopcode       nop, nop, misc_help },
38617289Sopcode 
38717289Sopcode #define M_GET1 (M_MISC+1)
38817289Sopcode     { MENU_LEFT + ICON_BORDER + MENU_X * 2,
38917289Sopcode       MENU_TOP  + ICON_BORDER + MENU_Y * 15, &get1_pr,
39017289Sopcode       LGGet1, nop, get1_help },
39117289Sopcode 
39217289Sopcode #define M_GET3 (M_GET1+1)
39317289Sopcode     { MENU_LEFT + ICON_BORDER + MENU_X * 2,
39417289Sopcode       MENU_TOP  + ICON_BORDER + MENU_Y * 16, &get3_pr,
39517289Sopcode       LGGet3, nop, get3_help },
39617289Sopcode 
39717289Sopcode #define M_LINESTYLE (M_GET3+1)
39817289Sopcode     { MENU_LEFT + ICON_BORDER + MENU_X * 0,
39917289Sopcode       MENU_TOP  + ICON_BORDER + MENU_Y * 13, &linestyle_pr,
40017289Sopcode       LGLineStyle, nop, linestyle_help },
40117289Sopcode 
40217289Sopcode #define M_ALIGN (M_LINESTYLE+1)
40317289Sopcode     { MENU_LEFT + ICON_BORDER + MENU_X * 2,
40417289Sopcode       MENU_TOP  + ICON_BORDER + MENU_Y * 17, &align_pr,
40517289Sopcode       nop, nop, align_help },
40617289Sopcode 
40717289Sopcode #define M_STIPPLE3 (M_ALIGN+1)
40817289Sopcode     { MENU_LEFT + ICON_BORDER + MENU_X * 0,
40917289Sopcode       MENU_TOP  + ICON_BORDER + MENU_Y * 5, &_50_pr,
41017289Sopcode       LGStipple3, LGMStipple3, stipple3_help },
41117289Sopcode 
41217289Sopcode #define M_STIPPLE7 (M_STIPPLE3+1)
41317289Sopcode     { MENU_LEFT + ICON_BORDER + MENU_X * 1,
41417289Sopcode       MENU_TOP  + ICON_BORDER + MENU_Y * 5, &stipple7_pr,
41517289Sopcode       LGStipple7, LGMStipple7, stipple7_help },
41617289Sopcode 
41717289Sopcode #define M_STIPPLE8 (M_STIPPLE7+1)
41817289Sopcode     { MENU_LEFT + ICON_BORDER + MENU_X * 1,
41917289Sopcode       MENU_TOP  + ICON_BORDER + MENU_Y * 6, &stipple8_pr,
42017289Sopcode       LGStipple8, LGMStipple8, stipple8_help },
42117289Sopcode 
42217289Sopcode #define M_STIPPLE4 (M_STIPPLE8+1)
42317289Sopcode     { MENU_LEFT + ICON_BORDER + MENU_X * 0,
42417289Sopcode       MENU_TOP  + ICON_BORDER + MENU_Y * 6, &black_pr,
42517289Sopcode       LGStipple4, LGMStipple4, stipple4_help },
42617289Sopcode 
42717289Sopcode #define M_SIZE4 (M_STIPPLE4+1)
42817289Sopcode     { MENU_LEFT + ICON_BORDER + MENU_X * 1,
42917289Sopcode       MENU_TOP  + ICON_BORDER + MENU_Y * 2, &size4_pr,
43017289Sopcode       LGSize4, LGMSize4, size4_help },
43117289Sopcode 
43217289Sopcode #define M_SPECIAL (M_SIZE4+1)
43317289Sopcode     { MENU_LEFT + ICON_BORDER + MENU_X * 3,
43417289Sopcode       MENU_TOP  + ICON_BORDER + MENU_Y * 3, &special_pr,
43517289Sopcode       LGFont4 , LGMFont4, special_help },
43617289Sopcode 
43717289Sopcode #define M_BRUSH4 (M_SPECIAL+1)
43817289Sopcode     { MENU_LEFT + ICON_BORDER + MENU_X * 3,
43917289Sopcode       MENU_TOP  + ICON_BORDER + MENU_Y * 5, &dashed_pr,
44017289Sopcode       LGBrush4, LGMBrush4, brush4_help },
44117289Sopcode 
44217289Sopcode #define M_BRUSH5 (M_BRUSH4+1)
44317289Sopcode     { MENU_LEFT + ICON_BORDER + MENU_X * 2,
44417289Sopcode       MENU_TOP  + ICON_BORDER + MENU_Y * 4, &narrow_pr,
44517289Sopcode       LGBrush5, LGMBrush5, brush5_help },
44617289Sopcode 
44717289Sopcode #define M_BRUSH6 (M_BRUSH5+1)
44817289Sopcode     { MENU_LEFT + ICON_BORDER + MENU_X * 2,
44917289Sopcode       MENU_TOP  + ICON_BORDER + MENU_Y * 5, &medium_pr,
45017289Sopcode       LGBrush6, LGMBrush6, brush6_help },
45117289Sopcode 
45217289Sopcode #define M_DRAW_ARC (M_BRUSH6+1)
45317289Sopcode     { MENU_LEFT + ICON_BORDER + MENU_X * 3,
45417289Sopcode       MENU_TOP  + ICON_BORDER + MENU_Y * 8, &arc_pr,
45517289Sopcode       SHDrawArc, nop, arc_help },
45617289Sopcode 
45717289Sopcode #define M_DRAW_CURVE (M_DRAW_ARC+1)
45817289Sopcode     { MENU_LEFT + ICON_BORDER + MENU_X * 3,
45917289Sopcode       MENU_TOP  + ICON_BORDER + MENU_Y * 9, &curve_pr,
46017289Sopcode       SHDrawCurve, LGMCurve, curve_help },
46117289Sopcode 
46217289Sopcode #define M_DRAW_VECTOR (M_DRAW_CURVE+1)
46317289Sopcode     { MENU_LEFT + ICON_BORDER + MENU_X * 3,
46417289Sopcode       MENU_TOP  + ICON_BORDER + MENU_Y * 10, &vector_pr,
46517289Sopcode       SHDrawVector, LGMVector, vector_help },
46617289Sopcode 
46717289Sopcode #define M_BOX (M_DRAW_VECTOR+1)
46817289Sopcode     { MENU_LEFT + ICON_BORDER + MENU_X * 3,
46917289Sopcode       MENU_TOP  + ICON_BORDER + MENU_Y * 11, &box_pr,
47017289Sopcode       SHBox, nop, box_help },
47117289Sopcode 
47217289Sopcode #define M_UNDO (M_BOX+1)
47317289Sopcode     { MENU_LEFT + ICON_BORDER + MENU_X * 3,
47417289Sopcode       MENU_TOP  + ICON_BORDER + MENU_Y * 13, &undo_pr,
47517289Sopcode       LGUndo, nop, undo_help },
47617289Sopcode 
47717289Sopcode #define M_GET2 (M_UNDO+1)
47817289Sopcode     { MENU_LEFT + ICON_BORDER + MENU_X * 3,
47917289Sopcode       MENU_TOP  + ICON_BORDER + MENU_Y * 15, &get2_pr,
48017289Sopcode       LGGet2, nop, get2_help },
48117289Sopcode 
48217289Sopcode #define M_GET4 (M_GET2+1)
48317289Sopcode     { MENU_LEFT + ICON_BORDER + MENU_X * 3,
48417289Sopcode       MENU_TOP  + ICON_BORDER + MENU_Y * 16, &get4_pr,
48517289Sopcode       LGGet4, nop, get4_help },
48617289Sopcode 
48717289Sopcode #define M_GRID (M_GET4+1)
48817289Sopcode     { MENU_LEFT + ICON_BORDER + MENU_X * 3,
48917289Sopcode       MENU_TOP  + ICON_BORDER + MENU_Y * 18, &grid_pr,
49017289Sopcode       SHGrid, nop, grid_help },
49117289Sopcode 
49217289Sopcode #define M_LITTLE_POINT (M_GRID+1)
49317289Sopcode     { MENU_LEFT + ICON_BORDER + MENU_X * 2,
49417289Sopcode       MENU_TOP  + ICON_BORDER + MENU_Y * 18, &littlepoint_pr,
49517289Sopcode       LGLittlePoint, nop, littlepoint_help },
49617289Sopcode 
49717289Sopcode     { -1, -1, (struct pixrect *)0, (int(*)())0 }
49817289Sopcode };
49917289Sopcode 
50017289Sopcode 
50117289Sopcode /*
50217289Sopcode  * Following is a map of brushes and mode made available to the
50317289Sopcode  * outside world for selection of these items for highlighting.
50417289Sopcode  * The numbers indicate the items location in the menu.
50517289Sopcode  */
50617289Sopcode 
50717289Sopcode int HiBuffer[] = { M_PUT1, M_PUT2, M_PUT3, M_PUT4 };	/* user symbols */
50817289Sopcode int HiFont[] = { M_ROMAN, M_ITALICS, M_BOLD, M_SPECIAL };
50917289Sopcode int HiSize[] = { M_SIZE1, M_SIZE2, M_SIZE3, M_SIZE4 };
51017289Sopcode int HiBrush[] = { M_BRUSH1, M_BRUSH2, M_BRUSH3,
51117289Sopcode 		   M_BRUSH4, M_BRUSH5, M_BRUSH6 };	/* brushes */
51217289Sopcode int HiMode[] = { M_HORZ_ADJUST, M_VERT_ADJUST, M_MANHATTAN_ADJUST,
51317289Sopcode 		  M_GRAVITY };			/* horz, vert, man, grav. */
51417289Sopcode int HiStipple[] = { M_STIPPLE1, M_STIPPLE2, M_STIPPLE3, M_STIPPLE4,
51517289Sopcode 		    M_STIPPLE5, M_STIPPLE6, M_STIPPLE7, M_STIPPLE8 };
51617289Sopcode int HiArtMode = M_LITTLE_POINT;
51717289Sopcode int HiLineStyle = M_LINESTYLE;
51817289Sopcode 
51917289Sopcode 
52017289Sopcode 
52117289Sopcode /*
52217289Sopcode  * This routine initializatizes the positioning of menu items -
52317289Sopcode  * currently only necessary for the justify icon.
52417289Sopcode  */
MNInitMenu()52517289Sopcode MNInitMenu()
52617289Sopcode {
52717289Sopcode     int justify_x, justify_y;
52817289Sopcode     int i;
52917289Sopcode 
53017289Sopcode     justify_x = menu[M_JUSTIFY].menu_x;
53117289Sopcode     justify_y = menu[M_JUSTIFY].menu_y;
53217289Sopcode 
53317289Sopcode     for (i=0; i<9; i++) {
53417289Sopcode 	switch (i % 3) {
53517289Sopcode 	    case 0:		/* left */
53617289Sopcode 		justify_mark[i].x = justify_x - 1;
53717289Sopcode 		break;
53817289Sopcode 	    case 1:		/* center */
53917289Sopcode 		justify_mark[i].x = justify_x + 18;
54017289Sopcode 		break;
54117289Sopcode 	    case 2:		/* right */
54217289Sopcode 		justify_mark[i].x = justify_x + 35;
54317289Sopcode 		break;
54417289Sopcode 	}
54517289Sopcode 
54617289Sopcode 	switch (i / 3) {
54717289Sopcode 	    case 0:		/* top */
54817289Sopcode 		justify_mark[i].y = justify_y - 2;
54917289Sopcode 		break;
55017289Sopcode 	    case 1:		/* center */
55117289Sopcode 		justify_mark[i].y = justify_y + 5;
55217289Sopcode 		break;
55317289Sopcode 	    case 2:		/* bottom */
55417289Sopcode 		justify_mark[i].y = justify_y + 12;
55517289Sopcode 		break;
55617289Sopcode 	}
55717289Sopcode     }
55817289Sopcode 
55917289Sopcode     if ((save_just_pr = mem_create(6, 6, 1)) == NULL) {
56017289Sopcode 	printf("cannot create save_just_pr.\n");
56117289Sopcode 	exit(1);
56217289Sopcode     }
56317289Sopcode }  /* end MNInitMenu */
56417289Sopcode 
56517289Sopcode 
56617289Sopcode /*
56717289Sopcode  * This routine displays the menu defined by initmenu
56817289Sopcode  */
MNDisplayMenu()56917289Sopcode MNDisplayMenu()
57017289Sopcode {
57117289Sopcode     register i;
57217289Sopcode     register struct _menu *m;
57317289Sopcode     char buf[4];
57417289Sopcode 
57517289Sopcode     pw_text(menu_pw, 28, menu[M_SIZE1].menu_y - MENU_Y + TEXT_BASELINE,
57617289Sopcode 		PIX_SRC | PIX_DST, text_pf, "styles");
57717289Sopcode     pw_text(menu_pw, 24, menu[M_DRAW_ARC].menu_y - MENU_Y + TEXT_BASELINE,
57817289Sopcode 		PIX_SRC | PIX_DST, text_pf, "drawing");
57917289Sopcode     pw_text(menu_pw, 32, menu[M_FILE].menu_y - MENU_Y + TEXT_BASELINE,
58017289Sopcode 		PIX_SRC | PIX_DST, text_pf, "other");
58117289Sopcode 
58217289Sopcode     pw_box(menu_pw, 2, 2,
58317289Sopcode 		MENUSW_WIDTH - 3, menu[M_BRUSH2].menu_y + ICON_SIZE + 3,
58417289Sopcode 		PIX_SRC | PIX_DST, 1);
58517289Sopcode     pw_box(menu_pw, 2, menu[M_DRAW_ARC].menu_y - MENU_Y - 2,
58617289Sopcode 		MENUSW_WIDTH - 3, menu[M_BOX].menu_y + ICON_SIZE + 3,
58717289Sopcode 		PIX_SRC | PIX_DST, 1);
58817289Sopcode     pw_box(menu_pw, 2, menu[M_FILE].menu_y - MENU_Y - 2,
58917289Sopcode 		MENUSW_WIDTH - 3, 509
59017289Sopcode 		/*menu[M_LITTLE_POINT].menu_y + ICON_SIZE + 3*/,
59117289Sopcode 		PIX_SRC | PIX_DST, 1);
59217289Sopcode 
59317289Sopcode     i = 0;
59417289Sopcode     do {
59517289Sopcode 	m = &menu[i];
59617289Sopcode 	pw_write(menu_pw, m->menu_x, m->menu_y,
59717289Sopcode 			m->menu_icon->pr_width, m->menu_icon->pr_height,
59817289Sopcode 			PIX_SRC, m->menu_icon, 0, 0);
59917289Sopcode 
60017289Sopcode 	if (is_stipple(m->menu_icon)) {
60117289Sopcode 	    pw_write(menu_pw, m->menu_x, m->menu_y,
60217289Sopcode 			openbox_pr.pr_width, openbox_pr.pr_height,
60317289Sopcode 			PIX_SRC | PIX_DST, &openbox_pr, 0, 0);
60417289Sopcode 	}
60517289Sopcode     } while (menu[++i].menu_x != -1);
60617289Sopcode 
60717289Sopcode     if (Adjustment != NOADJ)
60817289Sopcode 	MNHighLt(HiMode[adj[Adjustment]]);
60917289Sopcode 
61017289Sopcode     if (GravityOn)
61117289Sopcode 	MNHighLt(HiMode[3]);
61217289Sopcode 
61317289Sopcode     if (!SymbolicLines)
61417289Sopcode 	MNHighLt(HiLineStyle);
61517289Sopcode 
61617289Sopcode     if (!Artmode)
61717289Sopcode 	MNHighLt(HiArtMode);
61817289Sopcode 
61917289Sopcode     MNHighLt(HiFont[CFONT-1]);
62017289Sopcode     MNHighLt(HiSize[CSIZE-1]);
62117289Sopcode     MNHighLt(HiBrush[CBRUSH-1]);
62217289Sopcode     MNHighLt(HiStipple[CSTIPPLE-1]);
62317289Sopcode 
62417289Sopcode     pw_read(save_just_pr, 0, 0, 6, 6, PIX_SRC, menu_pw,
62517289Sopcode 			    justify_mark[just_to_indx[CJUST]].x,
62617289Sopcode 			    justify_mark[just_to_indx[CJUST]].y);
62717289Sopcode 
62817289Sopcode     pw_write(menu_pw, justify_mark[just_to_indx[CJUST]].x + 1,
62917289Sopcode 			    justify_mark[just_to_indx[CJUST]].y,
63017289Sopcode 			    5, 5, PIX_SRC, &dot_pr, 0, 0);
63117289Sopcode 
63217289Sopcode     for (i = 0; i<NUSER; ++i) {
63317289Sopcode 	if (!DBNullelt(MEN[i]))
63417289Sopcode 	    MNHighLt(HiBuffer[i]);
63517289Sopcode     }
63617289Sopcode 
63717289Sopcode     sprintf(buf, "%3d", Alignment);
63817289Sopcode     pw_text(menu_pw, menu[M_ALIGN].menu_x + 16,
63917289Sopcode 		     menu[M_ALIGN].menu_y + 12,
64017289Sopcode 		     PIX_SRC ^ PIX_DST, text_pf, buf);
64117289Sopcode }
64217289Sopcode 
64317289Sopcode 
menu_left(ie)64417289Sopcode menu_left(ie)
64517289Sopcode register struct inputevent *ie;
64617289Sopcode {
64717289Sopcode     register index;
64817289Sopcode 
64917289Sopcode     TxMsgOK();
650*17650Sopcode     lasttext = FALSE;
65117289Sopcode 
65217289Sopcode     if ((index = icon_last) >= 0) {
65317289Sopcode 	if (index == M_ALIGN) {
654*17650Sopcode 	    lastcommand = align_up;
655*17650Sopcode 	    align_up();
65617289Sopcode 	    return;
65717289Sopcode 	}
65817289Sopcode 
65917289Sopcode 	/* current set on, un-highlight icon */
66017289Sopcode 	GRCurrentSetOn();
66117289Sopcode 	MNReverse(index);
66217289Sopcode 	icon_last = -1;
66317289Sopcode 
66417289Sopcode 	if (index == M_FILE) {
66517289Sopcode 	    menu_filer(ie);
66617289Sopcode 	    return;
66717289Sopcode 	}
66817289Sopcode 
66917289Sopcode 	if (index == M_MISC) {
67017289Sopcode 	    menu_misc(ie);
67117289Sopcode 	    return;
67217289Sopcode 	}
67317289Sopcode 
674*17650Sopcode 	lastcommand = menu[index].menu_function;
675*17650Sopcode 	if (index == M_TEXT)
676*17650Sopcode 	    lasttext = TRUE;
677*17650Sopcode 	(*lastcommand)();
678*17650Sopcode 	/* (*(menu[index].menu_function))(); */
67917289Sopcode 	FLASH_READY = 0;	/* don't flash; it may have taken a while */
68017289Sopcode 	return;
68117289Sopcode     }
68217289Sopcode 
68317289Sopcode     if (just_last >= 0) {	/* in JUSTIFY icon */
68417289Sopcode 	/* un-highlight */
68517289Sopcode 	MNReverseJustify();
68617289Sopcode 
68717289Sopcode 	/* update justification mode */
68817289Sopcode 	pw_write(menu_pw, justify_mark[just_to_indx[CJUST]].x,
68917289Sopcode 			justify_mark[just_to_indx[CJUST]].y,
69017289Sopcode 			6, 6, PIX_SRC, save_just_pr, 0, 0);
69117289Sopcode 
69217289Sopcode 	CJUST = indx_to_just[just_last];
69317289Sopcode 
69417289Sopcode 	pw_read(save_just_pr, 0, 0, 6, 6, PIX_SRC, menu_pw,
69517289Sopcode 			justify_mark[just_to_indx[CJUST]].x,
69617289Sopcode 			justify_mark[just_to_indx[CJUST]].y);
69717289Sopcode 
69817289Sopcode 	pw_write(menu_pw, justify_mark[just_to_indx[CJUST]].x + 1,
69917289Sopcode 			justify_mark[just_to_indx[CJUST]].y,
70017289Sopcode 			5, 5, PIX_SRC, &dot_pr, 0, 0);
70117289Sopcode 	just_last = -1;
70217289Sopcode     }
70317289Sopcode }
70417289Sopcode 
70517289Sopcode 
menu_middle(ie)70617289Sopcode menu_middle(ie)
70717289Sopcode register struct inputevent *ie;
70817289Sopcode {
70917289Sopcode     register index;
71017289Sopcode 
71117289Sopcode     TxMsgOK();
712*17650Sopcode     lasttext = FALSE;
71317289Sopcode 
71417289Sopcode     if ((index = icon_last) >= 0) {
71517289Sopcode 	if (index == M_ALIGN) {
716*17650Sopcode 	    lastcommand = align_down;
717*17650Sopcode 	    align_down();
71817289Sopcode 	    return;
71917289Sopcode 	}
72017289Sopcode 
72117289Sopcode 	/* current set on, un-highlight icon */
72217289Sopcode 	GRCurrentSetOn();
72317289Sopcode 	MNReverse(index);
72417289Sopcode 	icon_last = -1;
72517289Sopcode 
726*17650Sopcode 	lastcommand = menu[index].menu_modify;
727*17650Sopcode 	(*lastcommand)();
728*17650Sopcode 	if (index == M_TEXT)
729*17650Sopcode 	    lasttext = TRUE;
730*17650Sopcode 	/* (*(menu[index].menu_modify))(); */
73117289Sopcode 	FLASH_READY = 0;	/* don't flash; it may have taken a while */
73217289Sopcode 	return;
73317289Sopcode     }
73417289Sopcode 
73517289Sopcode     if ((index = just_last) >= 0) {
73617289Sopcode 	just_last = -1;
73717289Sopcode 
73817289Sopcode 	/* current set on, un-highlight icon */
73917289Sopcode 	GRCurrentSetOn();
74017289Sopcode 	MNReverseJustify();
74117289Sopcode 
74217289Sopcode 	LGMJustify(indx_to_just[index]);
74317289Sopcode     }
74417289Sopcode }
74517289Sopcode 
74617289Sopcode 
menu_right(ie)74717289Sopcode menu_right(ie)
74817289Sopcode register struct inputevent *ie;
74917289Sopcode {
75017289Sopcode     register index;
75117289Sopcode 
75217289Sopcode     TxMsgOK();
75317289Sopcode 
75417289Sopcode     if ((index = icon_last) >= 0) {
75517289Sopcode 	icon_last = -1;
75617289Sopcode 
75717289Sopcode 	/* un-highlight icon */
75817289Sopcode 	MNReverse(index);
75917289Sopcode 
76017289Sopcode 	(*(menu[index].menu_help))();
76117289Sopcode 	return;
76217289Sopcode     }
76317289Sopcode 
76417289Sopcode     if ((index = just_last) >= 0) {
76517289Sopcode 	just_last = -1;
76617289Sopcode 
76717289Sopcode 	/* un-highlight icon */
76817289Sopcode 	MNReverseJustify();
76917289Sopcode 
77017289Sopcode 	justify_help();
77117289Sopcode 	return;
77217289Sopcode     }
77317289Sopcode 
77417289Sopcode     menusw_help();
77517289Sopcode }
77617289Sopcode 
77717289Sopcode 
menu_winexit(ie)77817289Sopcode menu_winexit(ie)
77917289Sopcode register struct inputevent *ie;
78017289Sopcode {
78117289Sopcode     if (icon_last >= 0) {
78217289Sopcode 	MNReverse(icon_last);
78317289Sopcode 	icon_last = -1;
78417289Sopcode     }
78517289Sopcode     else if (just_last >= 0) {
78617289Sopcode 	MNReverseJustify();
78717289Sopcode 	just_last = -1;
78817289Sopcode     }
78917289Sopcode 
79017289Sopcode     /* check if leaving left or bottom edge of menu subwindow */
79117289Sopcode     if ((ie->ie_locx < 0) || (ie->ie_locy >= menu_size.r_height))
79217289Sopcode 	GRCurrentSetOn();
79317289Sopcode }
79417289Sopcode 
79517289Sopcode 
796*17650Sopcode /*
797*17650Sopcode  * Move align to next higher value.
798*17650Sopcode  */
align_up()799*17650Sopcode align_up()
800*17650Sopcode {
801*17650Sopcode     menu_align(TRUE);
802*17650Sopcode }
803*17650Sopcode 
804*17650Sopcode 
805*17650Sopcode /*
806*17650Sopcode  * Move align to next lower value.
807*17650Sopcode  */
align_down()808*17650Sopcode align_down()
809*17650Sopcode {
810*17650Sopcode     menu_align(FALSE);
811*17650Sopcode }
812*17650Sopcode 
813*17650Sopcode 
81417289Sopcode #define ALIGNMAX 512
menu_align(up)81517289Sopcode menu_align(up)
81617289Sopcode int up;
81717289Sopcode {
81817289Sopcode     char buf[4];
81917289Sopcode 
82017289Sopcode 
82117289Sopcode     sprintf(buf, "%3d", Alignment);
82217289Sopcode     pw_text(menu_pw, menu[M_ALIGN].menu_x + 16,
82317289Sopcode 		     menu[M_ALIGN].menu_y + 12,
82417289Sopcode 		     PIX_SRC ^ PIX_DST, text_pf, buf);
82517289Sopcode 
82617289Sopcode     if (up) {
82717289Sopcode 	if ((Alignment <<= 1) > ALIGNMAX)
82817289Sopcode 	    Alignment = 1;
82917289Sopcode     }
83017289Sopcode     else {
83117289Sopcode 	if ((Alignment >>= 1) == 0)
83217289Sopcode 	    Alignment = ALIGNMAX;
83317289Sopcode     }
83417289Sopcode 
83517289Sopcode     sprintf(buf, "%3d", Alignment);
83617289Sopcode     pw_text(menu_pw, menu[M_ALIGN].menu_x + 16,
83717289Sopcode 		     menu[M_ALIGN].menu_y + 12,
83817289Sopcode 		     PIX_SRC ^ PIX_DST, text_pf, buf);
83917289Sopcode }
84017289Sopcode 
84117289Sopcode 
menu_filer(ie)84217289Sopcode menu_filer(ie)
84317289Sopcode register struct inputevent *ie;
84417289Sopcode {
84517289Sopcode     register struct menuitem *item;
84617289Sopcode 
84717289Sopcode     item = menu_display(&file_menu_stack, ie, menu_fd);
84817289Sopcode 
84917289Sopcode     if (item == (struct menuitem *) NULL)
85017289Sopcode 	return;
85117289Sopcode 
85217289Sopcode     switch (item->mi_data) {
85317289Sopcode 	case M_EDIT:
854*17650Sopcode 	    lastcommand = LGEdit;
85517289Sopcode 	    break;
85617289Sopcode 	case M_PATH:
857*17650Sopcode 	    lastcommand = LGPath;
85817289Sopcode 	    break;
85917289Sopcode 	case M_READ:
860*17650Sopcode 	    lastcommand = LGRead;
86117289Sopcode 	    break;
86217289Sopcode 	case M_SAVE_SET:
863*17650Sopcode 	    lastcommand = LGSave;
86417289Sopcode 	    break;
86517289Sopcode 	case M_WRITE:
866*17650Sopcode 	    lastcommand = LGWrite;
86717289Sopcode 	    break;
86817289Sopcode 	default:
869*17650Sopcode 	    return;
87017289Sopcode     }
871*17650Sopcode     (*lastcommand)();
872*17650Sopcode     lasttext = TRUE;
87317289Sopcode }
87417289Sopcode 
87517289Sopcode 
menu_misc(ie)87617289Sopcode menu_misc(ie)
87717289Sopcode register struct inputevent *ie;
87817289Sopcode {
87917289Sopcode     register struct menuitem *item;
88017289Sopcode 
88117289Sopcode     item = menu_display(&misc_menu_stack, ie, menu_fd);
88217289Sopcode 
88317289Sopcode     if (item == (struct menuitem *) NULL)
88417289Sopcode 	return;
88517289Sopcode 
88617289Sopcode     switch (item->mi_data) {
88717289Sopcode 	case M_CLEAR_POINTS:
888*17650Sopcode 	    lastcommand = LGClearPoints;
88917289Sopcode 	    break;
89017289Sopcode 	case M_SHOW_POINTS:
891*17650Sopcode 	    lastcommand = LGShowPoints;
89217289Sopcode 	    break;
89317289Sopcode 	case M_GRIPE:
894*17650Sopcode 	    lastcommand = LGGripe;
89517289Sopcode 	    break;
89617289Sopcode 	case M_POINT:
897*17650Sopcode 	    lastcommand = LGOPoint;
898*17650Sopcode 	    lasttext = TRUE;
89917289Sopcode 	    break;
90017289Sopcode 	default:
901*17650Sopcode 	    return;
90217289Sopcode     }
903*17650Sopcode     (*lastcommand)();
90417289Sopcode }
90517289Sopcode 
90617289Sopcode 
90717289Sopcode /*
90817289Sopcode  *  find justification mode determined by (x, y) screen position
90917289Sopcode  *  return -1 if not in justify icon
91017289Sopcode  */
just_index(x,y)91117289Sopcode just_index(x, y)
91217289Sopcode register x;
91317289Sopcode register y;
91417289Sopcode {
91517289Sopcode     x -= menu[M_JUSTIFY].menu_x - 1;
91617289Sopcode     y -= menu[M_JUSTIFY].menu_y - 2;
91717289Sopcode 
91817289Sopcode     if ((x > 41) || (x < 0) || (y > 19) || (y < 0))
91917289Sopcode 	return(-1);
92017289Sopcode     else
92117289Sopcode 	return((y / 7) * 3 + (x / 14));
92217289Sopcode }
92317289Sopcode 
92417289Sopcode 
mouse_move(ie)92517289Sopcode mouse_move(ie)
92617289Sopcode register struct inputevent *ie;
92717289Sopcode {
92817289Sopcode     register index, in_icon, in_xy;
92917289Sopcode 
93017289Sopcode     /* handle justify icon as a special case */
93117289Sopcode     if ((index = just_index(ie->ie_locx, ie->ie_locy)) >= 0) {
93217289Sopcode 	if (icon_last >= 0) {	/* erase last highlighted icon */
93317289Sopcode 	    MNReverse(icon_last);
93417289Sopcode 	    icon_last = -1;
93517289Sopcode 	}
93617289Sopcode 
93717289Sopcode 	if (just_last >= 0)	/* erase current justification marker */
93817289Sopcode 	    MNReverseJustify();
93917289Sopcode 
94017289Sopcode 	just_x = justify_mark[index].x;
94117289Sopcode 	just_y = justify_mark[index].y;
94217289Sopcode 	just_last = index;
94317289Sopcode 	MNReverseJustify();
94417289Sopcode 	return;
94517289Sopcode     }
94617289Sopcode 
94717289Sopcode 
94817289Sopcode     /* ... not currently in justify icon */
94917289Sopcode 
95017289Sopcode     if (just_last >= 0) {	/* previously in justify icon */
95117289Sopcode 	MNReverseJustify();
95217289Sopcode 	just_last = -1;
95317289Sopcode     }
95417289Sopcode 
95517289Sopcode     in_xy = ((index = MNFindMenuItem(ie->ie_locx, ie->ie_locy)) >= 0);
95617289Sopcode     in_icon = (icon_last >= 0);
95717289Sopcode 
95817289Sopcode     switch ((in_xy << 1) | in_icon) {
95917289Sopcode 	case 0:		/* was outside still outside */
96017289Sopcode 	    break;
96117289Sopcode 	case 1:		/* was inside now outside */
96217289Sopcode 	    MNReverse(icon_last);
96317289Sopcode 	    icon_last = -1;
96417289Sopcode 	    break;
96517289Sopcode 	case 2:		/* was outside now inside */
96617289Sopcode 	    icon_x = menu[index].menu_x;
96717289Sopcode 	    icon_y = menu[index].menu_y;
96817289Sopcode 	    MNReverse(icon_last = index);
96917289Sopcode 	    break;
97017289Sopcode 	case 3:		/* was inside still inside */
97117289Sopcode 	    if ((icon_y != menu[index].menu_y) ||
97217289Sopcode 		(icon_x != menu[index].menu_x)) {
97317289Sopcode 		MNReverse(icon_last);
97417289Sopcode 		icon_x = menu[index].menu_x;
97517289Sopcode 		icon_y = menu[index].menu_y;
97617289Sopcode 		MNReverse(icon_last = index);
97717289Sopcode 	    }
97817289Sopcode 	    break;
97917289Sopcode     }
98017289Sopcode }
98117289Sopcode 
98217289Sopcode 
98317289Sopcode /*
98417289Sopcode  *  return index into menu[] for icon at (x, y)
98517289Sopcode  */
MNFindMenuItem(x,y)98617289Sopcode MNFindMenuItem(x, y)
98717289Sopcode int x, y;
98817289Sopcode {
98917289Sopcode     register struct _menu *m;
99017289Sopcode     register mleft, mright, mtop, mbottom;
99117289Sopcode     int i;
99217289Sopcode 
99317289Sopcode     i = 0;
99417289Sopcode 
99517289Sopcode     do {
99617289Sopcode 	m = &menu[i];
99717289Sopcode 	mleft = m->menu_x;
99817289Sopcode 	mtop = m->menu_y;
99917289Sopcode 	mright = mleft + m->menu_icon->pr_width - 1;
100017289Sopcode 	mbottom = mtop + m->menu_icon->pr_height - 1;
100117289Sopcode 
100217289Sopcode 	if ((x <= mright) && (y <= mbottom) && (x >= mleft) && (y >= mtop))
1003*17650Sopcode 	    return(i);
100417289Sopcode 
100517289Sopcode     } while (menu[++i].menu_x != -1);
100617289Sopcode 
100717289Sopcode     return(-1);		/* not found */
100817289Sopcode 
100917289Sopcode } /* end MNFindMenuItem */
101017289Sopcode 
101117289Sopcode 
101217289Sopcode /*
101317289Sopcode  *  Highlight menu item specified by menu array index.
101417289Sopcode  */
MNHighLt(index)101517289Sopcode MNHighLt(index)
101617289Sopcode int index;
101717289Sopcode {
101817289Sopcode     pw_write(menu_pw, menu[index].menu_x-2, menu[index].menu_y-2,
101917289Sopcode 		    bigopenbox_pr.pr_width, bigopenbox_pr.pr_height,
102017289Sopcode 		    PIX_SRC | PIX_DST, &bigopenbox_pr, 0, 0);
102117289Sopcode }
102217289Sopcode 
102317289Sopcode 
102417289Sopcode /*
102517289Sopcode  *  Un-highlight menu item specified by menu array index.
102617289Sopcode  */
MNUnHighLt(index)102717289Sopcode MNUnHighLt(index)
102817289Sopcode int index;
102917289Sopcode {
103017289Sopcode     pw_write(menu_pw, menu[index].menu_x - 2, menu[index].menu_y - 2,
103117289Sopcode 		    bigopenbox_pr.pr_width, bigopenbox_pr.pr_height,
103217289Sopcode 		    PIX_NOT(PIX_SRC) & PIX_DST, &bigopenbox_pr, 0, 0);
103317289Sopcode }
103417289Sopcode 
103517289Sopcode 
103617289Sopcode /*
103717289Sopcode  *  Reverse video menu item specified by menu array index.
103817289Sopcode  */
MNReverse(index)103917289Sopcode MNReverse(index)
104017289Sopcode int index;
104117289Sopcode {
104217289Sopcode     pw_write(menu_pw, menu[index].menu_x - 2, menu[index].menu_y - 2,
104317289Sopcode 		    menu[index].menu_icon->pr_width + 4,
104417289Sopcode 		    menu[index].menu_icon->pr_height + 4,
104517289Sopcode 		    PIX_SRC ^ PIX_DST, &bigblack_pr, 0, 0);
104617289Sopcode }
1047