1 #include <stdio.h>
2 #include <sys/time.h>
3 #include <X11/Xlib.h>
4 #include <X11/Xutil.h>
5 
6 #include "ztypes.h"
7 #include "xio.h"
8 
9 #define LEFTMARGIN 4
10 #define TOPMARGIN 3
11 #define TIMEOUT (3) /* in seconds. preference? */
12 
13 static int messwin_x, messwin_y, messwin_w, messwin_h;
14 static char *message;
15 static int messagelen, message_size;
16 static int messagesticky;
17 static struct timeval messagetime;
18 
19 #ifdef __STDC__
xmess_init()20 void xmess_init()
21 #else
22 void xmess_init()
23 #endif
24 {
25     message_size = 80;
26     message = (char *)malloc(message_size * sizeof(char));
27     messagelen = 0;
28     strcpy(message, "");
29     messagesticky = TRUE;
30 }
31 
32 #ifdef __STDC__
xmess_resize(int xpos,int ypos,int width,int height)33 void xmess_resize(int xpos, int ypos, int width, int height)
34 #else
35 void xmess_resize(xpos, ypos, width, height)
36 int xpos;
37 int ypos;
38 int width;
39 int height;
40 #endif
41 {
42     messwin_x = xpos;
43     messwin_y = ypos;
44     messwin_w = width;
45     messwin_h = height;
46 
47     xmess_redraw();
48 }
49 
50 #ifdef __STDC__
xmess_redraw()51 void xmess_redraw()
52 #else
53 void xmess_redraw()
54 #endif
55 {
56     XDrawLine(xiodpy, xiowin, gcblack, messwin_x, messwin_y, messwin_x+messwin_w, messwin_y);
57     if (messagelen)
58 	XDrawString(xiodpy, xiowin, gcfont[0], messwin_x+LEFTMARGIN, messwin_y+TOPMARGIN+lineheightoff, message, messagelen);
59 }
60 
61 #ifdef __STDC__
xmess_set_message(char * str,int sticky)62 void xmess_set_message(char *str, int sticky)
63 #else
64 void xmess_set_message(str, sticky)
65 char *str;
66 int sticky;
67 #endif
68 {
69     struct timezone tz;
70 
71     if (!str)
72 	str = "";
73     messagelen = strlen(str);
74     if (messagelen >= message_size) {
75 	while (messagelen >= message_size)
76 	    message_size *= 2;
77 	message = (char *)realloc(message, message_size * sizeof(char));
78     }
79     strcpy(message, str);
80     XClearArea(xiodpy, xiowin, messwin_x, messwin_y+1, messwin_w, messwin_h-1, FALSE);
81     if (messagelen)
82 	XDrawString(xiodpy, xiowin, gcfont[0], messwin_x+LEFTMARGIN, messwin_y+TOPMARGIN+lineheightoff, message, messagelen);
83 
84     messagesticky = sticky;
85     gettimeofday(&messagetime, &tz);
86     messagetime.tv_sec += TIMEOUT;
87 }
88 
89 #ifdef __STDC__
xmess_check_timeout()90 void xmess_check_timeout()
91 #else
92 void xmess_check_timeout()
93 #endif
94 {
95     struct timezone tz;
96     struct timeval tv;
97 
98     if (messagesticky)
99 	return;
100 
101     gettimeofday(&tv, &tz);
102     if (tv.tv_sec > messagetime.tv_sec
103 	|| (tv.tv_sec == messagetime.tv_sec && tv.tv_usec > messagetime.tv_usec)) {
104 	xmess_set_message(NULL, TRUE);
105     }
106 }
107