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