1*17296Sopcode /*
2*17296Sopcode  * @(#)sun.c	1.1	10/21/84
3*17296Sopcode  *
4*17296Sopcode  * SUN specific routines for the SUN Gremlin picture editor.
5*17296Sopcode  *
6*17296Sopcode  * Mark Opperman (opcode@monet.BERKELEY)
7*17296Sopcode  *
8*17296Sopcode  */
9*17296Sopcode 
10*17296Sopcode #include <suntool/tool_hs.h>
11*17296Sopcode #include <suntool/menu.h>
12*17296Sopcode #include <sys/file.h>
13*17296Sopcode #include "gremlin.h"
14*17296Sopcode 
15*17296Sopcode 
16*17296Sopcode /* imports from main.c */
17*17296Sopcode 
18*17296Sopcode extern tool_fd, pix_fd, menu_fd, text_fd;
19*17296Sopcode extern struct pixfont *text_pf;
20*17296Sopcode 
21*17296Sopcode /* locals */
22*17296Sopcode 
23*17296Sopcode struct prompt prt = { {PROMPT_FLEXIBLE, PROMPT_FLEXIBLE,
24*17296Sopcode 		       PROMPT_FLEXIBLE, PROMPT_FLEXIBLE},
25*17296Sopcode 		       0, (struct pixfont *) NULL, (char *) NULL };
26*17296Sopcode 
27*17296Sopcode /*
28*17296Sopcode  * Flush all input events for a window.
29*17296Sopcode  */
flush_window_input(windowfd)30*17296Sopcode flush_window_input(windowfd)
31*17296Sopcode int windowfd;
32*17296Sopcode {
33*17296Sopcode     int nfds, readfds, writefds, exceptfds;
34*17296Sopcode     struct timeval timeout;
35*17296Sopcode     struct inputevent ie;
36*17296Sopcode 
37*17296Sopcode     do {
38*17296Sopcode 	readfds = 1 << windowfd;
39*17296Sopcode 	writefds = 0;
40*17296Sopcode 	exceptfds = 0;
41*17296Sopcode 	timeout.tv_sec = 0L;
42*17296Sopcode 	timeout.tv_usec = 0L;
43*17296Sopcode 
44*17296Sopcode 	nfds = select(20, &readfds, &writefds, &exceptfds, &timeout);
45*17296Sopcode 	if (nfds > 0)
46*17296Sopcode 	    input_readevent(windowfd, &ie);
47*17296Sopcode     } while (nfds > 0);
48*17296Sopcode }
49*17296Sopcode 
50*17296Sopcode 
51*17296Sopcode /*
52*17296Sopcode  * Display user prompt and wait for affirmative (MS_LEFT)
53*17296Sopcode  * or negative (MS_MIDDLE or MS_RIGHT) input event.
54*17296Sopcode  * Return TRUE if OK to do it, FALSE if not OK.
55*17296Sopcode  * This routine flushes the input event queue for the windowfd
56*17296Sopcode  * handling the prompt.
57*17296Sopcode  */
prompt_ok(windowfd,msg)58*17296Sopcode prompt_ok(windowfd, msg)
59*17296Sopcode int windowfd;
60*17296Sopcode char *msg;
61*17296Sopcode {
62*17296Sopcode     struct inputmask im, button_im;
63*17296Sopcode     struct inputevent ie;
64*17296Sopcode     int designee;
65*17296Sopcode 
66*17296Sopcode     win_getinputmask(windowfd, &im, &designee);
67*17296Sopcode 
68*17296Sopcode     input_imnull(&button_im);
69*17296Sopcode     win_setinputcodebit(&button_im, MS_LEFT);
70*17296Sopcode     win_setinputcodebit(&button_im, MS_MIDDLE);
71*17296Sopcode     win_setinputcodebit(&button_im, MS_RIGHT);
72*17296Sopcode     win_setinputmask(windowfd, &button_im, NULL, WIN_NULLLINK);
73*17296Sopcode 
74*17296Sopcode     prt.prt_font = text_pf;
75*17296Sopcode     prt.prt_windowfd = windowfd;
76*17296Sopcode     prt.prt_text = msg;
77*17296Sopcode 
78*17296Sopcode     flush_window_input(windowfd);
79*17296Sopcode 
80*17296Sopcode     menu_prompt(&prt, &ie, windowfd);
81*17296Sopcode 
82*17296Sopcode     win_setinputmask(windowfd, &im, NULL, designee);
83*17296Sopcode 
84*17296Sopcode     return(ie.ie_code == MS_LEFT);
85*17296Sopcode }
86*17296Sopcode 
87*17296Sopcode /*
88*17296Sopcode  * draw box with upper left corner at (x0, y0)
89*17296Sopcode  * lower right corner at (x1, y1);
90*17296Sopcode  */
91*17296Sopcode pw_box(pw, x0, y0, x1, y1, op, value)
92*17296Sopcode struct pixwin *pw;
93*17296Sopcode register x0, y0, x1, y1;
94*17296Sopcode int op, value;
95*17296Sopcode {
96*17296Sopcode     pw_vector(pw, x0, y0, x1, y0, op, value);
97*17296Sopcode     pw_vector(pw, x1, y0, x1, y1, op, value);
98*17296Sopcode     pw_vector(pw, x1, y1, x0, y1, op, value);
99*17296Sopcode     pw_vector(pw, x0, y1, x0, y0, op, value);
100*17296Sopcode }
101*17296Sopcode 
102*17296Sopcode 
103*17296Sopcode /*
104*17296Sopcode  * wait for input from any button.
105*17296Sopcode  */
get_any_button()106*17296Sopcode get_any_button()
107*17296Sopcode {
108*17296Sopcode     int nfds, readfds, writefds, exceptfds;
109*17296Sopcode     struct inputevent ie;
110*17296Sopcode 
111*17296Sopcode     for (;;) {
112*17296Sopcode 	readfds = (1<<tool_fd) | (1<<pix_fd) | (1<<menu_fd) | (1<<text_fd);
113*17296Sopcode 	writefds = 0;
114*17296Sopcode 	exceptfds = 0;
115*17296Sopcode 
116*17296Sopcode 	nfds = select(20, &readfds, &writefds,
117*17296Sopcode 				    &exceptfds, (struct timeval *) NULL);
118*17296Sopcode 	if (nfds > 0) {
119*17296Sopcode 	    if (readfds & (1 << menu_fd))
120*17296Sopcode 		input_readevent(menu_fd, &ie);
121*17296Sopcode 	    else if (readfds & (1 << pix_fd))
122*17296Sopcode 		input_readevent(pix_fd, &ie);
123*17296Sopcode 	    else if (readfds & (1 << text_fd))
124*17296Sopcode 		input_readevent(text_fd, &ie);
125*17296Sopcode 	    else /* tool window input event */
126*17296Sopcode 		input_readevent(tool_fd, &ie);
127*17296Sopcode 
128*17296Sopcode 	    if ((ie.ie_code == MS_LEFT) || (ie.ie_code == MS_MIDDLE) ||
129*17296Sopcode 					   (ie.ie_code == MS_RIGHT))
130*17296Sopcode                 break;
131*17296Sopcode 	}
132*17296Sopcode     }
133*17296Sopcode }
134