1 /* $Header: /home/yav/xpx/RCS/message.c,v 1.12 1995/11/23 16:28:39 yav Exp $
2 * xpx message
3 * written by yav (UHD98984@pcvan.or.jp)
4 */
5
6 #include <X11/Xlib.h>
7 #include <X11/Xutil.h>
8
9 #include "headers.h"
10 #include "xpx.h"
11 #include "work.h"
12 #define PUBLIC_MESSAGE_C
13 #include "extern.h"
14
15 #define MSGLINEMAX 16
16 #define MSGLINESPACE 20
17 #define MSGWIDTH 400
18 #define MSGHEIGHT (MSGLINESPACE*MSGLINEMAX)
19
20 char rcsid_message[] = "$Id: message.c,v 1.12 1995/11/23 16:28:39 yav Exp $";
21
22 char *errname = NULL;
23 int errcode = 1;
24 static Window messagewin;
25 static MENU msgline[MSGLINEMAX+1];
26
27 #ifdef HAVE_STDARG_H
error(const char * format,...)28 int error(
29 #if NeedFunctionPrototypes
30 const char *format, ...)
31 #else
32 format)
33 char *format;
34 #endif
35 {
36 va_list ap;
37
38 va_start(ap, format);
39 if (errname != NULL)
40 fprintf(stderr, " %s:", errname);
41 vfprintf(stderr, format, ap);
42 fprintf(stderr, "\007\n");
43 va_end(ap);
44 return errcode;
45 }
46 #else /* HAVE_STDARG_H */
47 #ifdef HAVE_VARARGS_H
error(va_alist)48 int error(va_alist)
49 va_dcl
50 {
51 va_list ap;
52 char *format;
53
54 va_start(ap);
55 if (errname != NULL)
56 fprintf(stderr, " %s: ", errname);
57 format = va_arg(ap, char *);
58 vfprintf(stderr, format, ap);
59 fprintf(stderr, "\007\n");
60 va_end(ap);
61 return errcode;
62 }
63 #else /* HAVE_VARARGS_H */
error(char * format)64 int error(
65 #if NeedFunctionPrototypes
66 char *format)
67 #else
68 format)
69 char *format;
70 #endif
71 {
72 if (errname != NULL)
73 fprintf(stderr, "\n%s: ", errname);
74 vfprintf(stderr, format, &format + 1);
75 fprintf(stderr, "\007\n");
76 return errcode;
77 }
78 #endif /* HAVE_VARARGS_H */
79 #endif /* HAVE_STDARG_H */
80
81 static int current_line = 0;
82
map_message_window()83 void map_message_window()
84 {
85 XMapRaised(dsp, messagewin);
86 }
87
message_scroll()88 void message_scroll()
89 {
90 int i;
91 char *s;
92
93 s = msgline[0].str;
94 for (i = 0; i < MSGLINEMAX-1; i++) {
95 msgline[i].str = msgline[i+1].str;
96 redraw_window(msgline[i].win);
97 }
98 *s = '\0';
99 msgline[i].str = s;
100 }
101
message_store(str)102 void message_store(str)
103 char *str;
104 {
105 char *p;
106
107 for (;;) {
108 p = strchr(str, '\n');
109 if (p != NULL)
110 *p++ = '\0';
111 strncat(msgline[current_line].str, str, msgline[current_line].strlen);
112 redraw_window(msgline[current_line].win);
113 if (p == NULL)
114 break;
115 /* new line */
116 if (++current_line >= MSGLINEMAX) {
117 message_scroll();
118 current_line = MSGLINEMAX-1;
119 }
120 str = p;
121 }
122 }
123
124 #ifdef HAVE_STDARG_H
message(const char * format,...)125 void message(
126 #if NeedFunctionPrototypes
127 const char *format, ...)
128 #else
129 format)
130 char *format;
131 #endif
132 {
133 va_list ap;
134 char buf[1024];
135
136 va_start(ap, format);
137 if (*format == '!') {
138 map_message_window();
139 format++;
140 }
141 vsprintf(buf, format, ap);
142 message_store(buf);
143 va_end(ap);
144 }
145 #else /* HAVE_STDARG_H */
146 #ifdef HAVE_VARARGS_H
message(va_alist)147 void message(va_alist)
148 va_dcl
149 {
150 va_list ap;
151 char *format;
152 char buf[1024];
153
154 va_start(ap);
155 format = va_arg(ap, char *);
156 if (*format == '!') {
157 map_message_window();
158 format++;
159 }
160 vsprintf(buf, format, ap);
161 message_store(buf);
162 va_end(ap);
163 }
164 #else /* HAVE_VARARGS_H */
message(char * format)165 int message(
166 #if NeedFunctionPrototypes
167 char *format)
168 #else
169 format)
170 char *format;
171 #endif
172 {
173 char buf[1024];
174
175 if (*format == '!') {
176 map_message_window();
177 format++;
178 }
179 vsprintf(buf, format, &format + 1);
180 message_store(buf);
181 }
182 #endif /* HAVE_VARARGS_H */
183 #endif /* HAVE_STDARG_H */
184
185
186 int msgev(
187 #if NeedFunctionPrototypes
188 MENU *,
189 XEvent *
190 #endif
191 );
192
create_message_window()193 int create_message_window()
194 {
195 int i, y;
196 MENU *p;
197
198 create_toplevel_window(&messagewin, "message", "", MSGWIDTH, MSGHEIGHT);
199 XSelectInput(dsp, messagewin, ExposureMask);
200
201 p = msgline;
202 y = 0;
203 for (i = 0; i < MSGLINEMAX; i++) {
204 bzero(p, sizeof(*p));
205 p->n = i;
206 p->y = y;
207 p->w = MSGWIDTH+400;
208 p->h = MSGLINESPACE;
209 p->mode = MenuModeMaskLeft;
210 p->im = ExposureMask|ButtonPressMask;
211 p->event = msgev;
212 p->strlen = 64;
213 p++;
214 y += MSGLINESPACE;
215 }
216 p->n = -1;
217 menuwin_create(msgline, messagewin, 0, 0);
218 return 0;
219 }
220
unmap_message_window()221 void unmap_message_window()
222 {
223 XUnmapWindow(dsp, messagewin);
224 }
225
close_message_window()226 void close_message_window()
227 {
228 XDestroyWindow(dsp, messagewin);
229 }
230
msgev(p,ev)231 int msgev(p, ev)
232 MENU *p;
233 XEvent *ev;
234 {
235 switch(ev->type) {
236 case ButtonPress:
237 unmap_message_window();
238 return 1;
239 }
240 return 0;
241 }
242
243 /* End of file */
244