1 /*
2 * Create the notifier window and everything in it. Only the Dismiss button
3 * has a callback, which terminates everything. The <msg> argument points
4 * to the text to fill the scrollable text window with; it is read-only.
5 */
6
7 #include <stdio.h>
8 #include <stdlib.h>
9 #include <Xm/Xm.h>
10 #include <Xm/MainW.h>
11 #include <Xm/Form.h>
12 #include <Xm/LabelP.h>
13 #include <Xm/PushBP.h>
14 #include <Xm/PushBG.h>
15 #include <Xm/Text.h>
16 #include "notifier.h"
17
18 #define SNOOZE_PERIOD 5*60*1000 /* snooze time in milliseconds */
19
20 /* gcc soesn't support turning off stupid warning messages selectively */
21 #if defined(__GNUC__)
22 #define UNUSED __attribute__((unused)) /* Flag variable as unused */
23 #else /* not __GNUC__ */
24 #define UNUSED
25 #endif
26
27 static void snooze_callback (Widget, int, XmToggleButtonCallbackStruct *);
28
29 extern Display *display; /* everybody uses the same server */
30 extern XtAppContext app; /* application handle for timer */
31 extern GC gc; /* everybody uses this context */
32 extern Pixel color[NCOLS]; /* colors: COL_* */
33 extern Pixel bkcolor; /* background color (COL_*) */
34 static Widget mainwindow; /* for popdown/popup by snooze */
35
36
create_widgets(Widget toplevel,char * title,char * subtitle,char * msg)37 void create_widgets(
38 Widget toplevel,
39 char *title, /* title string */
40 char *subtitle, /* subtitle string */
41 char *msg) /* message text */
42 {
43 Widget form, w, snooze, dismiss;
44 XmString string;
45 Arg args[20];
46 int n;
47 int nlines=0, nchars=0;
48 char *p;
49
50 for (n=0, p=msg; *p; p++) /* count x/y size of text */
51 if (*p != '\n')
52 n++;
53 else {
54 nlines++;
55 if (n > nchars)
56 nchars = n;
57 n = 0;
58 }
59 if (n) {
60 nlines++;
61 if (n > nchars)
62 nchars = n;
63 }
64 if (nchars > 80)
65 nchars = 80;
66 if (nlines > 20)
67 nlines = 20;
68
69 mainwindow = XtCreateManagedWidget("mainwindow",
70 xmMainWindowWidgetClass, toplevel, NULL, 0);
71 n = 0;
72 XtSetArg(args[n], XmNbackground, color[bkcolor]); n++;
73 form = XtCreateWidget("form", xmFormWidgetClass,
74 mainwindow, args, n);
75
76 n = 0; /* title */
77 string = XmStringCreateSimple(title);
78 XtSetArg(args[n], XmNtopAttachment, XmATTACH_FORM); n++;
79 XtSetArg(args[n], XmNtopOffset, 12); n++;
80 XtSetArg(args[n], XmNleftAttachment, XmATTACH_FORM); n++;
81 XtSetArg(args[n], XmNleftOffset, 8); n++;
82 XtSetArg(args[n], XmNrightAttachment, XmATTACH_FORM); n++;
83 XtSetArg(args[n], XmNrightOffset, 8); n++;
84 XtSetArg(args[n], XmNbackground, color[bkcolor]); n++;
85 XtSetArg(args[n], XmNlabelString, string); n++;
86 w = XtCreateManagedWidget("title", xmLabelWidgetClass,
87 form, args, n);
88 XmStringFree(string);
89
90 if (subtitle && *subtitle) { /* subtitle */
91 n = 0;
92 string = XmStringCreateSimple(subtitle);
93 XtSetArg(args[n], XmNtopAttachment, XmATTACH_WIDGET); n++;
94 XtSetArg(args[n], XmNtopWidget, w); n++;
95 XtSetArg(args[n], XmNtopOffset, 0); n++;
96 XtSetArg(args[n], XmNleftAttachment, XmATTACH_FORM); n++;
97 XtSetArg(args[n], XmNleftOffset, 8); n++;
98 XtSetArg(args[n], XmNrightAttachment, XmATTACH_FORM); n++;
99 XtSetArg(args[n], XmNrightOffset, 8); n++;
100 XtSetArg(args[n], XmNbackground, color[bkcolor]); n++;
101 XtSetArg(args[n], XmNlabelString, string); n++;
102 w = XtCreateManagedWidget("subtitle", xmLabelWidgetClass,
103 form, args, n);
104 XmStringFree(string);
105 }
106
107 n = 0; /* snooze */
108 XtSetArg(args[n], XmNbottomAttachment, XmATTACH_FORM); n++;
109 XtSetArg(args[n], XmNbottomOffset, 12); n++;
110 XtSetArg(args[n], XmNleftAttachment, XmATTACH_FORM); n++;
111 XtSetArg(args[n], XmNleftOffset, 12); n++;
112 XtSetArg(args[n], XmNhighlightThickness,0); n++;
113 XtSetArg(args[n], XmNbackground, color[bkcolor]); n++;
114 snooze = XtCreateManagedWidget("Snooze 5 min", xmPushButtonWidgetClass,
115 form, args, n);
116 XtAddCallback(snooze, XmNactivateCallback, (XtCallbackProc)
117 snooze_callback, (XtPointer)0);
118
119 n = 0; /* dismiss */
120 XtSetArg(args[n], XmNbottomAttachment, XmATTACH_FORM); n++;
121 XtSetArg(args[n], XmNbottomOffset, 12); n++;
122 XtSetArg(args[n], XmNleftAttachment, XmATTACH_WIDGET); n++;
123 XtSetArg(args[n], XmNleftWidget, snooze); n++;
124 XtSetArg(args[n], XmNleftOffset, 8); n++;
125 XtSetArg(args[n], XmNrightAttachment, XmATTACH_FORM); n++;
126 XtSetArg(args[n], XmNrightOffset, 12); n++;
127 XtSetArg(args[n], XmNhighlightThickness,0); n++;
128 XtSetArg(args[n], XmNbackground, color[bkcolor]); n++;
129 dismiss = XtCreateManagedWidget("Dismiss", xmPushButtonWidgetClass,
130 form, args, n);
131 XtAddCallback(dismiss, XmNactivateCallback, (XtCallbackProc)
132 exit, (XtPointer)0);
133
134 n = 0; /* message */
135 XtSetArg(args[n], XmNtopAttachment, XmATTACH_WIDGET); n++;
136 XtSetArg(args[n], XmNtopWidget, w); n++;
137 XtSetArg(args[n], XmNtopOffset, 12); n++;
138 XtSetArg(args[n], XmNbottomAttachment, XmATTACH_WIDGET); n++;
139 XtSetArg(args[n], XmNbottomWidget, snooze); n++;
140 XtSetArg(args[n], XmNbottomOffset, 16); n++;
141 XtSetArg(args[n], XmNleftAttachment, XmATTACH_FORM); n++;
142 XtSetArg(args[n], XmNleftOffset, 12); n++;
143 XtSetArg(args[n], XmNrightAttachment, XmATTACH_FORM); n++;
144 XtSetArg(args[n], XmNrightOffset, 12); n++;
145 XtSetArg(args[n], XmNrows, nlines); n++;
146 XtSetArg(args[n], XmNcolumns, nchars+1); n++;
147 XtSetArg(args[n], XmNbackground, color[bkcolor]); n++;
148 XtSetArg(args[n], XmNhighlightThickness,0); n++;
149 XtSetArg(args[n], XmNeditable, False); n++;
150 XtSetArg(args[n], XmNeditMode, XmMULTI_LINE_EDIT); n++;
151 XtSetArg(args[n], XmNvalue, msg); n++;
152 if (nlines) {
153 w = XmCreateScrolledText(form, "message", args, n);
154 XtManageChild(w);
155 }
156
157 XtManageChild(form);
158 }
159
160
161 /*
162 * snooze was pressed. Pop the window down for five minutes.
163 */
164
165 /*ARGSUSED*/
timer_callback(UNUSED XtPointer data,UNUSED XtIntervalId * id)166 static void timer_callback(
167 UNUSED XtPointer data, /* not used */
168 UNUSED XtIntervalId *id) /* not used */
169 {
170 XtPopup(XtParent(mainwindow), XtGrabNone);
171 XBell(display, 0);
172 XBell(display, 0);
173 }
174
175
176 /*ARGSUSED*/
snooze_callback(UNUSED Widget widget,UNUSED int item,UNUSED XmToggleButtonCallbackStruct * data)177 static void snooze_callback(
178 UNUSED Widget widget,
179 UNUSED int item,
180 UNUSED XmToggleButtonCallbackStruct*data)
181 {
182 XtPopdown(XtParent(mainwindow));
183 XtUnmapWidget(XtParent(mainwindow));
184 XtAppAddTimeOut(app, SNOOZE_PERIOD, timer_callback, 0);
185 }
186