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