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