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