1 /*
2  * Create and destroy the calendar view config menu, which shows global,
3  * month, and week options. It's all called "week range" for historical
4  * reasons, guess what this file did originally. This is called from the
5  * Config pulldown.
6  *
7  *	destroy_calconfig_popup()
8  *	create_calconfig_popup()
9  */
10 
11 #include <stdio.h>
12 #include <stdlib.h>
13 #include <time.h>
14 #include <Xm/Xm.h>
15 #include <Xm/DialogS.h>
16 #include <Xm/Form.h>
17 #include <Xm/Frame.h>
18 #include <Xm/RowColumn.h>
19 #include <Xm/LabelP.h>
20 #include <Xm/LabelG.h>
21 #include <Xm/PushBP.h>
22 #include <Xm/PushBG.h>
23 #include <Xm/ToggleB.h>
24 #include <Xm/TextF.h>
25 #include <Xm/ScrolledW.h>
26 #include <Xm/Protocols.h>
27 #include "cal.h"
28 
29 static void flag_callback	(Widget, int, XmToggleButtonCallbackStruct *);
30 static void done_callback	(Widget, int, XmToggleButtonCallbackStruct *);
31 
32 extern Display		*display;	/* everybody uses the same server */
33 extern Widget		toplevel;	/* top-level shell for icon name */
34 extern struct config	config;		/* global configuration data */
35 extern Pixel		color[NCOLS];	/* colors: COL_* */
36 extern struct plist	*mainlist;	/* list of all schedule entries */
37 extern struct mainmenu	mainmenu;	/* all important main window widgets */
38 
39 static BOOL		have_shell;	/* message popup exists if TRUE */
40 static Widget		shell;		/* popup menu shell */
41 static Widget		ndays;		/* # of days in week text widgets */
42 static Widget		defwarn;	/* default warning string */
43 static Widget		min, max;	/* min and max hour text widgets */
44 
45 
46 /*
47  * destroy a popup. Remove it from the screen, and destroy its widgets.
48  * It's too much trouble to keep them for next time.
49  */
50 
destroy_calconfig_popup(void)51 void destroy_calconfig_popup(void)
52 {
53 	char			*string;	/* contents of text widget */
54 	int			n, b, e;
55 	BOOL			dummy;
56 
57 	if (have_shell) {
58 		string = XmTextFieldGetString(ndays);
59 		n = atoi(string);
60 		XtFree(string);
61 
62 		string = XmTextFieldGetString(defwarn);
63 		parse_warnstring(string, &config.early_time,
64 					 &config.late_time, &dummy);
65 		XtFree(string);
66 
67 		string = XmTextFieldGetString(min);
68 		b = atoi(string);
69 		XtFree(string);
70 
71 		string = XmTextFieldGetString(max);
72 		e = atoi(string);
73 		XtFree(string);
74 
75 		if (e == 0)	e = 24;
76 		if (e <= b)	e = e+1;
77 		if (e > 24)	e = 24;
78 		if (e <= b)	b = e-1;
79 
80 		config.week_ndays = n < 1 ? 1 : n > NDAYS ? NDAYS : n;
81 		config.week_minhour  = b;
82 		config.week_maxhour  = e;
83 
84 		XtPopdown(shell);
85 		XTDESTROYWIDGET(shell);
86 		have_shell = FALSE;
87 		mainlist->modified = TRUE;
88 		write_mainlist();
89 		draw_week_calendar(NULL);
90 		draw_day_calendar(NULL);
91 	}
92 }
93 
94 
95 /*
96  * create a week view range popup as a separate application shell. The
97  * popup is initialized with data from config.
98  */
99 
create_calconfig_popup(void)100 void create_calconfig_popup(void)
101 {
102 	Widget			root, scroll, form, frame, form2, w, w2, help;
103 	Arg			args[20];
104 	int			n, a, b;
105 	Atom			closewindow;
106 	Dimension		xs=0, ys=0;
107 
108 	destroy_calconfig_popup();
109 
110 	n = 0;
111 	XtSetArg(args[n], XmNdeleteResponse,	XmDO_NOTHING);		n++;
112 	XtSetArg(args[n], XmNiconic,		False);			n++;
113 	shell = XtCreatePopupShell(_("Calendar view configuration"),
114 			applicationShellWidgetClass, toplevel, args, n);
115 #	ifdef EDITRES
116 	XtAddEventHandler(shell, (EventMask)0, TRUE,
117  			_XEditResCheckMessages, NULL);
118 #	endif
119 	set_icon(shell, 1);
120 	root = XtCreateManagedWidget("rangeform0", xmFormWidgetClass,
121 			shell, NULL, 0);
122 	n = 0;
123 	XtSetArg(args[n], XmNtopAttachment,	XmATTACH_FORM);		n++;
124 	XtSetArg(args[n], XmNbottomAttachment,	XmATTACH_FORM);		n++;
125 	XtSetArg(args[n], XmNleftAttachment,	XmATTACH_FORM);		n++;
126 	XtSetArg(args[n], XmNrightAttachment,	XmATTACH_FORM);		n++;
127 	XtSetArg(args[n], XmNshadowThickness,	0);			n++;
128 	XtSetArg(args[n], XmNscrollingPolicy,	XmVARIABLE);		n++;
129 	scroll = XtCreateManagedWidget("scroll", xmScrolledWindowWidgetClass,
130 			root, args, n);
131 	XtAddCallback(scroll, XmNhelpCallback, (XtCallbackProc)help_callback,
132 			(XtPointer)"calconfig");
133 	form = XtCreateManagedWidget("rangeform0", xmFormWidgetClass,
134 			scroll, NULL, 0);
135 
136 							/*-- buttons --*/
137 	n = 0;
138 	XtSetArg(args[n], XmNbottomAttachment,	XmATTACH_FORM);		n++;
139 	XtSetArg(args[n], XmNbottomOffset,	8);			n++;
140 	XtSetArg(args[n], XmNrightAttachment,	XmATTACH_FORM);		n++;
141 	XtSetArg(args[n], XmNrightOffset,	8);			n++;
142 	XtSetArg(args[n], XmNwidth,		80);			n++;
143 	w = XtCreateManagedWidget(_("Done"), xmPushButtonWidgetClass,
144 			form, args, n);
145 	XtAddCallback(w, XmNactivateCallback, (XtCallbackProc)
146 			done_callback, (XtPointer)0);
147 	XtAddCallback(w, XmNhelpCallback, (XtCallbackProc)
148 			help_callback, (XtPointer) "range_done");
149 
150 	n = 0;
151 	XtSetArg(args[n], XmNbottomAttachment,	XmATTACH_FORM);		n++;
152 	XtSetArg(args[n], XmNbottomOffset,	8);			n++;
153 	XtSetArg(args[n], XmNrightAttachment,	XmATTACH_WIDGET);	n++;
154 	XtSetArg(args[n], XmNrightWidget,	w);			n++;
155 	XtSetArg(args[n], XmNrightOffset,	8);			n++;
156 	XtSetArg(args[n], XmNwidth,		80);			n++;
157 	help = XtCreateManagedWidget(_("Help"), xmPushButtonWidgetClass,
158 			form, args, n);
159 	XtAddCallback(help, XmNactivateCallback, (XtCallbackProc)
160 			help_callback, (XtPointer)"calconfig");
161 	XtAddCallback(help, XmNhelpCallback, (XtCallbackProc)
162 			help_callback, (XtPointer)"calconfig");
163 
164 						/*------------- global ------*/
165 	n = 0;
166 	XtSetArg(args[n], XmNtopAttachment,	XmATTACH_FORM);		n++;
167 	XtSetArg(args[n], XmNtopOffset,		8);			n++;
168 	XtSetArg(args[n], XmNleftAttachment,	XmATTACH_FORM);		n++;
169 	XtSetArg(args[n], XmNleftOffset,	8);			n++;
170 	XtSetArg(args[n], XmNhighlightThickness,0);			n++;
171 	w = XtCreateManagedWidget(_("Global options:"),
172 			xmLabelWidgetClass, form, args, n);
173 
174 							/*-- frame --*/
175 	n = 0;
176 	XtSetArg(args[n], XmNtopAttachment,	XmATTACH_WIDGET);	n++;
177 	XtSetArg(args[n], XmNtopWidget,		w);			n++;
178 	XtSetArg(args[n], XmNleftAttachment,	XmATTACH_FORM);		n++;
179 	XtSetArg(args[n], XmNleftOffset,	8);			n++;
180 	XtSetArg(args[n], XmNrightAttachment,	XmATTACH_FORM);		n++;
181 	XtSetArg(args[n], XmNrightOffset,	8);			n++;
182 	XtSetArg(args[n], XmNshadowType,	XmSHADOW_ETCHED_IN);	n++;
183 	frame = XtCreateManagedWidget("", xmFrameWidgetClass,
184 			form, args, n);
185 	form2 = XtCreateManagedWidget("rangeform2", xmFormWidgetClass,
186 			frame, NULL, 0);
187 							/*-- share mainwin --*/
188 	n = 0;
189 	XtSetArg(args[n], XmNselectColor,	color[COL_TOGGLE]);	n++;
190 	XtSetArg(args[n], XmNtopAttachment,	XmATTACH_FORM);		n++;
191 	XtSetArg(args[n], XmNleftAttachment,	XmATTACH_FORM);		n++;
192 	XtSetArg(args[n], XmNleftOffset,	8);			n++;
193 	XtSetArg(args[n], XmNhighlightThickness,0);			n++;
194 	XtSetArg(args[n], XmNset,		config.share_mainwin);	n++;
195 	w = XtCreateManagedWidget(_("Use main window for all views"),
196 			xmToggleButtonWidgetClass, form2, args, n);
197 	XtAddCallback(w, XmNvalueChangedCallback, (XtCallbackProc)
198 			flag_callback, (XtPointer)14);
199 	XtAddCallback(w, XmNhelpCallback, (XtCallbackProc)
200 			help_callback, (XtPointer)"global_flags");
201 
202 							/*-- sunday 1st --*/
203 	n = 0;
204 	XtSetArg(args[n], XmNselectColor,	color[COL_TOGGLE]);	n++;
205 	XtSetArg(args[n], XmNtopAttachment,	XmATTACH_WIDGET);	n++;
206 	XtSetArg(args[n], XmNtopWidget,		w);			n++;
207 	XtSetArg(args[n], XmNtopOffset,		4);			n++;
208 	XtSetArg(args[n], XmNleftAttachment,	XmATTACH_FORM);		n++;
209 	XtSetArg(args[n], XmNleftOffset,	8);			n++;
210 	XtSetArg(args[n], XmNhighlightThickness,0);			n++;
211 	XtSetArg(args[n], XmNset,		config.sunday_first);	n++;
212 	w = XtCreateManagedWidget(_("Week begins with Sunday"),
213 			xmToggleButtonWidgetClass, form2, args, n);
214 	XtAddCallback(w, XmNvalueChangedCallback, (XtCallbackProc)
215 			flag_callback, (XtPointer)0);
216 	XtAddCallback(w, XmNhelpCallback, (XtCallbackProc)
217 			help_callback, (XtPointer)"global_flags");
218 
219 							/*-- m/d/y --*/
220 	n = 0;
221 	XtSetArg(args[n], XmNselectColor,	color[COL_TOGGLE]);	n++;
222 	XtSetArg(args[n], XmNtopAttachment,	XmATTACH_WIDGET);	n++;
223 	XtSetArg(args[n], XmNtopWidget,		w);			n++;
224 	XtSetArg(args[n], XmNtopOffset,		4);			n++;
225 	XtSetArg(args[n], XmNleftAttachment,	XmATTACH_FORM);		n++;
226 	XtSetArg(args[n], XmNleftOffset,	8);			n++;
227 	XtSetArg(args[n], XmNhighlightThickness,0);			n++;
228 	XtSetArg(args[n], XmNset,		config.mmddyy);		n++;
229 	w = XtCreateManagedWidget(_("Month/day/year date format"),
230 			xmToggleButtonWidgetClass, form2, args, n);
231 	XtAddCallback(w, XmNvalueChangedCallback, (XtCallbackProc)
232 			flag_callback, (XtPointer)1);
233 	XtAddCallback(w, XmNhelpCallback, (XtCallbackProc)
234 			help_callback, (XtPointer)"global_flags");
235 
236 							/*-- am/pm --*/
237 	n = 0;
238 	XtSetArg(args[n], XmNselectColor,	color[COL_TOGGLE]);	n++;
239 	XtSetArg(args[n], XmNtopAttachment,	XmATTACH_WIDGET);	n++;
240 	XtSetArg(args[n], XmNtopWidget,		w);			n++;
241 	XtSetArg(args[n], XmNtopOffset,		4);			n++;
242 	XtSetArg(args[n], XmNleftAttachment,	XmATTACH_FORM);		n++;
243 	XtSetArg(args[n], XmNleftOffset,	8);			n++;
244 	XtSetArg(args[n], XmNhighlightThickness,0);			n++;
245 	XtSetArg(args[n], XmNset,		config.ampm);		n++;
246 	w = XtCreateManagedWidget(_("12-hour am/pm time format"),
247 			xmToggleButtonWidgetClass, form2, args, n);
248 	XtAddCallback(w, XmNvalueChangedCallback, (XtCallbackProc)
249 			flag_callback, (XtPointer)2);
250 	XtAddCallback(w, XmNhelpCallback, (XtCallbackProc)
251 			help_callback, (XtPointer)"global_flags");
252 
253 							/*-- autodelete --*/
254 	n = 0;
255 	XtSetArg(args[n], XmNselectColor,	color[COL_TOGGLE]);	n++;
256 	XtSetArg(args[n], XmNtopAttachment,	XmATTACH_WIDGET);	n++;
257 	XtSetArg(args[n], XmNtopWidget,		w);			n++;
258 	XtSetArg(args[n], XmNtopOffset,		4);			n++;
259 	XtSetArg(args[n], XmNleftAttachment,	XmATTACH_FORM);		n++;
260 	XtSetArg(args[n], XmNleftOffset,	8);			n++;
261 	XtSetArg(args[n], XmNhighlightThickness,0);			n++;
262 	XtSetArg(args[n], XmNset,		config.autodel);	n++;
263 	w = XtCreateManagedWidget(_("Auto-delete past entries"),
264 			xmToggleButtonWidgetClass, form2, args, n);
265 	XtAddCallback(w, XmNvalueChangedCallback, (XtCallbackProc)
266 			flag_callback, (XtPointer)3);
267 	XtAddCallback(w, XmNhelpCallback, (XtCallbackProc)
268 			help_callback, (XtPointer)"global_flags");
269 
270 							/*-- insecure script */
271 	n = 0;
272 	XtSetArg(args[n], XmNselectColor,	color[COL_TOGGLE]);	n++;
273 	XtSetArg(args[n], XmNtopAttachment,	XmATTACH_WIDGET);	n++;
274 	XtSetArg(args[n], XmNtopWidget,		w);			n++;
275 	XtSetArg(args[n], XmNtopOffset,		4);			n++;
276 	XtSetArg(args[n], XmNleftAttachment,	XmATTACH_FORM);		n++;
277 	XtSetArg(args[n], XmNleftOffset,	8);			n++;
278 	XtSetArg(args[n], XmNhighlightThickness,0);			n++;
279 	XtSetArg(args[n], XmNset,		config.insecure_script);n++;
280 	w = XtCreateManagedWidget(_("Run netplan scripts (security risk!)"),
281 			xmToggleButtonWidgetClass, form2, args, n);
282 	XtAddCallback(w, XmNvalueChangedCallback, (XtCallbackProc)
283 			flag_callback, (XtPointer)15);
284 	XtAddCallback(w, XmNhelpCallback, (XtCallbackProc)
285 			help_callback, (XtPointer)"global_flags");
286 
287 							/*-- owner only --*/
288 	n = 0;
289 	XtSetArg(args[n], XmNselectColor,	color[COL_TOGGLE]);	n++;
290 	XtSetArg(args[n], XmNtopAttachment,	XmATTACH_WIDGET);	n++;
291 	XtSetArg(args[n], XmNtopWidget,		w);			n++;
292 	XtSetArg(args[n], XmNtopOffset,		4);			n++;
293 	XtSetArg(args[n], XmNleftAttachment,	XmATTACH_FORM);		n++;
294 	XtSetArg(args[n], XmNleftOffset,	8);			n++;
295 	XtSetArg(args[n], XmNhighlightThickness,0);			n++;
296 	XtSetArg(args[n], XmNset,		config.owner_only);	n++;
297 	XtSetArg(args[n], XmNsensitive,		!all_files_served());	n++;
298 	w = w2 = XtCreateManagedWidget(_("Only owner can write appt files"),
299 			xmToggleButtonWidgetClass, form2, args, n);
300 	XtAddCallback(w, XmNvalueChangedCallback, (XtCallbackProc)
301 			flag_callback,(XtPointer)11);
302 	XtAddCallback(w, XmNhelpCallback, (XtCallbackProc)
303 			help_callback, (XtPointer)"global_flags");
304 
305 							/*-- default warn --*/
306 	n = 0;
307 	XtSetArg(args[n], XmNtopAttachment,	XmATTACH_WIDGET);	n++;
308 	XtSetArg(args[n], XmNtopWidget,		w2);			n++;
309 	XtSetArg(args[n], XmNtopOffset,		8);			n++;
310 	XtSetArg(args[n], XmNleftAttachment,	XmATTACH_FORM);		n++;
311 	XtSetArg(args[n], XmNleftOffset,	8);			n++;
312 	XtSetArg(args[n], XmNhighlightThickness,0);			n++;
313 	w = XtCreateManagedWidget(_("Default warnings:"),
314 			xmLabelWidgetClass, form2, args, n);
315 	XtAddCallback(w, XmNhelpCallback, (XtCallbackProc)
316 			help_callback, (XtPointer)"range_defwarn");
317 	n = 0;
318 	XtSetArg(args[n], XmNtopAttachment,	XmATTACH_WIDGET);	n++;
319 	XtSetArg(args[n], XmNtopWidget,		w2);			n++;
320 	XtSetArg(args[n], XmNtopOffset,		4);			n++;
321 	XtSetArg(args[n], XmNleftAttachment,	XmATTACH_WIDGET);	n++;
322 	XtSetArg(args[n], XmNleftWidget,	w);			n++;
323 	XtSetArg(args[n], XmNleftOffset,	16);			n++;
324 	XtSetArg(args[n], XmNbottomAttachment,	XmATTACH_FORM);		n++;
325 	XtSetArg(args[n], XmNbottomOffset,	4);			n++;
326 	XtSetArg(args[n], XmNwidth,		120);			n++;
327 	XtSetArg(args[n], XmNrecomputeSize,	False);			n++;
328 	XtSetArg(args[n], XmNpendingDelete,	True);			n++;
329 	XtSetArg(args[n], XmNhighlightThickness,0);			n++;
330 	XtSetArg(args[n], XmNbackground,	color[COL_TEXTBACK]);	n++;
331 	defwarn = XtCreateManagedWidget(" ", xmTextFieldWidgetClass,
332 			form2, args, n);
333 	XtAddCallback(defwarn, XmNhelpCallback, (XtCallbackProc)
334 			help_callback, (XtPointer)"range_defwarn");
335 
336 						/*------------- month -------*/
337 	n = 0;
338 	XtSetArg(args[n], XmNtopAttachment,	XmATTACH_WIDGET);	n++;
339 	XtSetArg(args[n], XmNtopWidget,		frame);			n++;
340 	XtSetArg(args[n], XmNtopOffset,		8);			n++;
341 	XtSetArg(args[n], XmNleftAttachment,	XmATTACH_FORM);		n++;
342 	XtSetArg(args[n], XmNleftOffset,	8);			n++;
343 	XtSetArg(args[n], XmNhighlightThickness,0);			n++;
344 	w = XtCreateManagedWidget(_("Month view options:"),
345 			xmLabelWidgetClass, form, args, n);
346 
347 							/*-- frame --*/
348 	n = 0;
349 	XtSetArg(args[n], XmNtopAttachment,	XmATTACH_WIDGET);	n++;
350 	XtSetArg(args[n], XmNtopWidget,		w);			n++;
351 	XtSetArg(args[n], XmNleftAttachment,	XmATTACH_FORM);		n++;
352 	XtSetArg(args[n], XmNleftOffset,	8);			n++;
353 	XtSetArg(args[n], XmNrightAttachment,	XmATTACH_FORM);		n++;
354 	XtSetArg(args[n], XmNrightOffset,	8);			n++;
355 	XtSetArg(args[n], XmNshadowType,	XmSHADOW_ETCHED_IN);	n++;
356 	frame = XtCreateManagedWidget("", xmFrameWidgetClass,
357 			form, args, n);
358 	form2 = XtCreateManagedWidget("rangeform2", xmFormWidgetClass,
359 			frame, NULL, 0);
360 							/*-- julian --*/
361 	n = 0;
362 	XtSetArg(args[n], XmNselectColor,	color[COL_TOGGLE]);	n++;
363 	XtSetArg(args[n], XmNtopAttachment,	XmATTACH_WIDGET);	n++;
364 	XtSetArg(args[n], XmNtopAttachment,	XmATTACH_FORM);		n++;
365 	XtSetArg(args[n], XmNleftAttachment,	XmATTACH_FORM);		n++;
366 	XtSetArg(args[n], XmNleftOffset,	8);			n++;
367 	XtSetArg(args[n], XmNhighlightThickness,0);			n++;
368 	XtSetArg(args[n], XmNset,		config.julian);		n++;
369 	w = XtCreateManagedWidget(_("Show Julian dates"),
370 			xmToggleButtonWidgetClass, form2, args, n);
371 	XtAddCallback(w, XmNvalueChangedCallback, (XtCallbackProc)
372 			flag_callback, (XtPointer)4);
373 	XtAddCallback(w, XmNhelpCallback, (XtCallbackProc)
374 			help_callback, (XtPointer)"month_flags");
375 
376 							/*-- week num --*/
377 	n = 0;
378 	XtSetArg(args[n], XmNselectColor,	color[COL_TOGGLE]);	n++;
379 	XtSetArg(args[n], XmNtopAttachment,	XmATTACH_WIDGET);	n++;
380 	XtSetArg(args[n], XmNtopWidget,		w);			n++;
381 	XtSetArg(args[n], XmNtopOffset,		4);			n++;
382 	XtSetArg(args[n], XmNleftAttachment,	XmATTACH_FORM);		n++;
383 	XtSetArg(args[n], XmNleftOffset,	8);			n++;
384 	XtSetArg(args[n], XmNhighlightThickness,0);			n++;
385 	XtSetArg(args[n], XmNset,		config.weeknum);	n++;
386 	w = XtCreateManagedWidget(_("Show week numbers"),
387 			xmToggleButtonWidgetClass, form2, args, n);
388 	XtAddCallback(w, XmNvalueChangedCallback, (XtCallbackProc)
389 			flag_callback, (XtPointer)5);
390 	XtAddCallback(w, XmNhelpCallback, (XtCallbackProc)
391 			help_callback, (XtPointer)"month_flags");
392 
393 							/*-- gps week --*/
394 	n = 0;
395 	XtSetArg(args[n], XmNselectColor,	color[COL_TOGGLE]);	n++;
396 	XtSetArg(args[n], XmNtopAttachment,	XmATTACH_WIDGET);	n++;
397 	XtSetArg(args[n], XmNtopWidget,		w);			n++;
398 	XtSetArg(args[n], XmNtopOffset,		4);			n++;
399 	XtSetArg(args[n], XmNleftAttachment,	XmATTACH_FORM);		n++;
400 	XtSetArg(args[n], XmNleftOffset,	8);			n++;
401 	XtSetArg(args[n], XmNhighlightThickness,0);			n++;
402 	XtSetArg(args[n], XmNset,		config.gpsweek);	n++;
403 	w = XtCreateManagedWidget(_("Use GPS week numbers"),
404 			xmToggleButtonWidgetClass, form2, args, n);
405 	XtAddCallback(w, XmNvalueChangedCallback, (XtCallbackProc)
406 			flag_callback,(XtPointer)13);
407 	XtAddCallback(w, XmNhelpCallback, (XtCallbackProc)
408 			help_callback, (XtPointer)"month_flags");
409 
410 							/*-- full week --*/
411 	n = 0;
412 	XtSetArg(args[n], XmNselectColor,	color[COL_TOGGLE]);	n++;
413 	XtSetArg(args[n], XmNtopAttachment,	XmATTACH_WIDGET);	n++;
414 	XtSetArg(args[n], XmNtopWidget,		w);			n++;
415 	XtSetArg(args[n], XmNtopOffset,		4);			n++;
416 	XtSetArg(args[n], XmNleftAttachment,	XmATTACH_FORM);		n++;
417 	XtSetArg(args[n], XmNleftOffset,	8);			n++;
418 	XtSetArg(args[n], XmNhighlightThickness,0);			n++;
419 	XtSetArg(args[n], XmNset,		config.fullweek);	n++;
420 	w = XtCreateManagedWidget(_("First week is first full week"),
421 			xmToggleButtonWidgetClass, form2, args, n);
422 	XtAddCallback(w, XmNvalueChangedCallback, (XtCallbackProc)
423 			flag_callback, (XtPointer)6);
424 	XtAddCallback(w, XmNhelpCallback, (XtCallbackProc)
425 			help_callback, (XtPointer)"month_flags");
426 
427 							/*-- Thu week --*/
428 	n = 0;
429 	XtSetArg(args[n], XmNselectColor,	color[COL_TOGGLE]);	n++;
430 	XtSetArg(args[n], XmNtopAttachment,	XmATTACH_WIDGET);	n++;
431 	XtSetArg(args[n], XmNtopWidget,		w);			n++;
432 	XtSetArg(args[n], XmNtopOffset,		4);			n++;
433 	XtSetArg(args[n], XmNleftAttachment,	XmATTACH_FORM);		n++;
434 	XtSetArg(args[n], XmNleftOffset,	8);			n++;
435 	XtSetArg(args[n], XmNhighlightThickness,0);			n++;
436 	XtSetArg(args[n], XmNset,		config.thu_week);	n++;
437 	w = XtCreateManagedWidget(_("First week is first week with Thursday"),
438 			xmToggleButtonWidgetClass, form2, args, n);
439 	XtAddCallback(w, XmNvalueChangedCallback, (XtCallbackProc)
440 			flag_callback,(XtPointer)16);
441 	XtAddCallback(w, XmNhelpCallback, (XtCallbackProc)
442 			help_callback, (XtPointer)"month_flags");
443 
444 							/*-- color code --*/
445 	n = 0;
446 	XtSetArg(args[n], XmNselectColor,	color[COL_TOGGLE]);	n++;
447 	XtSetArg(args[n], XmNtopAttachment,	XmATTACH_WIDGET);	n++;
448 	XtSetArg(args[n], XmNtopWidget,		w);			n++;
449 	XtSetArg(args[n], XmNtopOffset,		4);			n++;
450 	XtSetArg(args[n], XmNleftAttachment,	XmATTACH_FORM);		n++;
451 	XtSetArg(args[n], XmNleftOffset,	8);			n++;
452 	XtSetArg(args[n], XmNhighlightThickness,0);			n++;
453 	XtSetArg(args[n], XmNset,		config.colorcode_m);	n++;
454 	w = XtCreateManagedWidget(_("Colored background for other files"),
455 			xmToggleButtonWidgetClass, form2, args, n);
456 	XtAddCallback(w, XmNvalueChangedCallback, (XtCallbackProc)
457 			flag_callback, (XtPointer)7);
458 	XtAddCallback(w, XmNhelpCallback, (XtCallbackProc)
459 			help_callback, (XtPointer)"month_flags");
460 
461 							/*-- no past --*/
462 	n = 0;
463 	XtSetArg(args[n], XmNselectColor,	color[COL_TOGGLE]);	n++;
464 	XtSetArg(args[n], XmNtopAttachment,	XmATTACH_WIDGET);	n++;
465 	XtSetArg(args[n], XmNtopWidget,		w);			n++;
466 	XtSetArg(args[n], XmNtopOffset,		4);			n++;
467 	XtSetArg(args[n], XmNleftAttachment,	XmATTACH_FORM);		n++;
468 	XtSetArg(args[n], XmNleftOffset,	8);			n++;
469 	XtSetArg(args[n], XmNhighlightThickness,0);			n++;
470 	XtSetArg(args[n], XmNset,		config.nopast);		n++;
471 	w = XtCreateManagedWidget(_("Don't show past entries in today's box"),
472 			xmToggleButtonWidgetClass, form2, args, n);
473 	XtAddCallback(w, XmNvalueChangedCallback, (XtCallbackProc)
474 			flag_callback, (XtPointer)8);
475 	XtAddCallback(w, XmNhelpCallback, (XtCallbackProc)
476 			help_callback, (XtPointer)"month_flags");
477 
478 
479 						/*------------- week --------*/
480 	n = 0;
481 	XtSetArg(args[n], XmNtopAttachment,	XmATTACH_WIDGET);	n++;
482 	XtSetArg(args[n], XmNtopWidget,		frame);			n++;
483 	XtSetArg(args[n], XmNtopOffset,		8);			n++;
484 	XtSetArg(args[n], XmNleftAttachment,	XmATTACH_FORM);		n++;
485 	XtSetArg(args[n], XmNleftOffset,	8);			n++;
486 	XtSetArg(args[n], XmNhighlightThickness,0);			n++;
487 	w = XtCreateManagedWidget(_("Week and Day view options:"),
488 			xmLabelWidgetClass, form, args, n);
489 
490 							/*-- frame --*/
491 	n = 0;
492 	XtSetArg(args[n], XmNtopAttachment,	XmATTACH_WIDGET);	n++;
493 	XtSetArg(args[n], XmNtopWidget,		w);			n++;
494 	XtSetArg(args[n], XmNbottomAttachment,	XmATTACH_WIDGET);	n++;
495 	XtSetArg(args[n], XmNbottomWidget,	help);			n++;
496 	XtSetArg(args[n], XmNbottomOffset,	16);			n++;
497 	XtSetArg(args[n], XmNleftAttachment,	XmATTACH_FORM);		n++;
498 	XtSetArg(args[n], XmNleftOffset,	8);			n++;
499 	XtSetArg(args[n], XmNrightAttachment,	XmATTACH_FORM);		n++;
500 	XtSetArg(args[n], XmNrightOffset,	8);			n++;
501 	XtSetArg(args[n], XmNshadowType,	XmSHADOW_ETCHED_IN);	n++;
502 	w = XtCreateManagedWidget("", xmFrameWidgetClass,
503 			form, args, n);
504 	form2 = XtCreateManagedWidget("rangeform2", xmFormWidgetClass,
505 			w, NULL, 0);
506 							/*-- # of days --*/
507 	n = 0;
508 	XtSetArg(args[n], XmNtopAttachment,	XmATTACH_FORM);		n++;
509 	XtSetArg(args[n], XmNtopOffset,		10);			n++;
510 	XtSetArg(args[n], XmNleftAttachment,	XmATTACH_FORM);		n++;
511 	XtSetArg(args[n], XmNleftOffset,	8);			n++;
512 	XtSetArg(args[n], XmNhighlightThickness,0);			n++;
513 	w = XtCreateManagedWidget(_("Week view contains"),
514 			xmLabelWidgetClass, form2, args, n);
515 	XtAddCallback(w, XmNhelpCallback, (XtCallbackProc)
516 			help_callback, (XtPointer)"range_ndays");
517 	n = 0;
518 	XtSetArg(args[n], XmNtopAttachment,	XmATTACH_FORM);		n++;
519 	XtSetArg(args[n], XmNtopOffset,		8);			n++;
520 	XtSetArg(args[n], XmNleftAttachment,	XmATTACH_WIDGET);	n++;
521 	XtSetArg(args[n], XmNleftWidget,	w);			n++;
522 	XtSetArg(args[n], XmNleftOffset,	16);			n++;
523 	XtSetArg(args[n], XmNwidth,		80);			n++;
524 	XtSetArg(args[n], XmNrecomputeSize,	False);			n++;
525 	XtSetArg(args[n], XmNpendingDelete,	True);			n++;
526 	XtSetArg(args[n], XmNhighlightThickness,0);			n++;
527 	XtSetArg(args[n], XmNbackground,	color[COL_TEXTBACK]);	n++;
528 	ndays = XtCreateManagedWidget(" ", xmTextFieldWidgetClass,
529 			form2, args, n);
530 	XtAddCallback(ndays, XmNhelpCallback, (XtCallbackProc)
531 			help_callback, (XtPointer)"range_ndays");
532 	n = 0;
533 	XtSetArg(args[n], XmNtopAttachment,	XmATTACH_FORM);		n++;
534 	XtSetArg(args[n], XmNtopOffset,		10);			n++;
535 	XtSetArg(args[n], XmNleftAttachment,	XmATTACH_WIDGET);	n++;
536 	XtSetArg(args[n], XmNleftWidget,	ndays);			n++;
537 	XtSetArg(args[n], XmNleftOffset,	16);			n++;
538 	XtSetArg(args[n], XmNhighlightThickness,0);			n++;
539 	XtCreateManagedWidget(_("days"), xmLabelWidgetClass,
540 			form2, args, n);
541 	XtAddCallback(w, XmNhelpCallback, (XtCallbackProc)
542 			help_callback, (XtPointer)"range_ndays");
543 
544 							/*-- min --*/
545 	n = 0;
546 	XtSetArg(args[n], XmNtopAttachment,	XmATTACH_WIDGET);	n++;
547 	XtSetArg(args[n], XmNtopWidget,		ndays);			n++;
548 	XtSetArg(args[n], XmNtopOffset,		6);			n++;
549 	XtSetArg(args[n], XmNleftAttachment,	XmATTACH_FORM);		n++;
550 	XtSetArg(args[n], XmNleftOffset,	8);			n++;
551 	XtSetArg(args[n], XmNhighlightThickness,0);			n++;
552 	w = XtCreateManagedWidget(_("Begin view at"),
553 			xmLabelWidgetClass, form2, args, n);
554 	XtAddCallback(w, XmNhelpCallback, (XtCallbackProc)
555 			help_callback, (XtPointer)"range_min");
556 	n = 0;
557 	XtSetArg(args[n], XmNtopAttachment,	XmATTACH_WIDGET);	n++;
558 	XtSetArg(args[n], XmNtopWidget,		ndays);			n++;
559 	XtSetArg(args[n], XmNtopOffset,		4);			n++;
560 	XtSetArg(args[n], XmNleftAttachment, XmATTACH_OPPOSITE_WIDGET);	n++;
561 	XtSetArg(args[n], XmNleftWidget,	ndays);			n++;
562 	XtSetArg(args[n], XmNwidth,		80);			n++;
563 	XtSetArg(args[n], XmNrecomputeSize,	False);			n++;
564 	XtSetArg(args[n], XmNpendingDelete,	True);			n++;
565 	XtSetArg(args[n], XmNhighlightThickness,0);			n++;
566 	XtSetArg(args[n], XmNbackground,	color[COL_TEXTBACK]);	n++;
567 	min = XtCreateManagedWidget(" ", xmTextFieldWidgetClass,
568 			form2, args, n);
569 	XtAddCallback(min, XmNhelpCallback, (XtCallbackProc)
570 			help_callback, (XtPointer)"range_min");
571 	n = 0;
572 	XtSetArg(args[n], XmNtopAttachment,	XmATTACH_WIDGET);	n++;
573 	XtSetArg(args[n], XmNtopWidget,		ndays);			n++;
574 	XtSetArg(args[n], XmNtopOffset,		6);			n++;
575 	XtSetArg(args[n], XmNleftAttachment,	XmATTACH_WIDGET);	n++;
576 	XtSetArg(args[n], XmNleftWidget,	min);			n++;
577 	XtSetArg(args[n], XmNleftOffset,	16);			n++;
578 	XtSetArg(args[n], XmNhighlightThickness,0);			n++;
579 	XtCreateManagedWidget(_("o'clock"), xmLabelWidgetClass,
580 			form2, args, n);
581 	XtAddCallback(w, XmNhelpCallback, (XtCallbackProc)
582 			help_callback, (XtPointer)"range_min");
583 
584 							/*-- max --*/
585 	n = 0;
586 	XtSetArg(args[n], XmNtopAttachment,	XmATTACH_WIDGET);	n++;
587 	XtSetArg(args[n], XmNtopWidget,		min);			n++;
588 	XtSetArg(args[n], XmNtopOffset,		6);			n++;
589 	XtSetArg(args[n], XmNleftAttachment,	XmATTACH_FORM);		n++;
590 	XtSetArg(args[n], XmNleftOffset,	8);			n++;
591 	XtSetArg(args[n], XmNhighlightThickness,0);			n++;
592 	w = XtCreateManagedWidget(_("End view at"),
593 			xmLabelWidgetClass, form2, args, n);
594 	XtAddCallback(w, XmNhelpCallback, (XtCallbackProc)
595 			help_callback, (XtPointer)"range_max");
596 	n = 0;
597 	XtSetArg(args[n], XmNtopAttachment,	XmATTACH_WIDGET);	n++;
598 	XtSetArg(args[n], XmNtopWidget,		min);			n++;
599 	XtSetArg(args[n], XmNtopOffset,		4);			n++;
600 	XtSetArg(args[n], XmNleftAttachment, XmATTACH_OPPOSITE_WIDGET);	n++;
601 	XtSetArg(args[n], XmNleftWidget,	ndays);			n++;
602 	XtSetArg(args[n], XmNwidth,		80);			n++;
603 	XtSetArg(args[n], XmNrecomputeSize,	False);			n++;
604 	XtSetArg(args[n], XmNpendingDelete,	True);			n++;
605 	XtSetArg(args[n], XmNhighlightThickness,0);			n++;
606 	XtSetArg(args[n], XmNbackground,	color[COL_TEXTBACK]);	n++;
607 	max = XtCreateManagedWidget("", xmTextFieldWidgetClass,
608 			form2, args, n);
609 	XtAddCallback(max, XmNhelpCallback, (XtCallbackProc)
610 			help_callback, (XtPointer)"range_max");
611 	n = 0;
612 	XtSetArg(args[n], XmNtopAttachment,	XmATTACH_WIDGET);	n++;
613 	XtSetArg(args[n], XmNtopWidget,		min);			n++;
614 	XtSetArg(args[n], XmNtopOffset,		6);			n++;
615 	XtSetArg(args[n], XmNleftAttachment,	XmATTACH_WIDGET);	n++;
616 	XtSetArg(args[n], XmNleftWidget,	min);			n++;
617 	XtSetArg(args[n], XmNleftOffset,	16);			n++;
618 	XtSetArg(args[n], XmNhighlightThickness,0);			n++;
619 	XtCreateManagedWidget(_("o'clock"), xmLabelWidgetClass,
620 			form2, args, n);
621 	XtAddCallback(w, XmNhelpCallback, (XtCallbackProc)
622 			help_callback, (XtPointer)"range_max");
623 
624 							/*-- show warnings --*/
625 	n = 0;
626 	XtSetArg(args[n], XmNselectColor,	color[COL_TOGGLE]);	n++;
627 	XtSetArg(args[n], XmNtopAttachment,	XmATTACH_WIDGET);	n++;
628 	XtSetArg(args[n], XmNtopWidget,		max);			n++;
629 	XtSetArg(args[n], XmNtopOffset,		8);			n++;
630 	XtSetArg(args[n], XmNleftAttachment,	XmATTACH_FORM);		n++;
631 	XtSetArg(args[n], XmNleftOffset,	8);			n++;
632 	XtSetArg(args[n], XmNhighlightThickness,0);			n++;
633 	XtSetArg(args[n], XmNset,		config.weekwarn);	n++;
634 	w = XtCreateManagedWidget(_("Show advance-warning times"),
635 			xmToggleButtonWidgetClass,
636 			form2, args, n);
637 	XtAddCallback(w, XmNvalueChangedCallback, (XtCallbackProc)
638 			flag_callback,(XtPointer)9);
639 	XtAddCallback(w, XmNhelpCallback, (XtCallbackProc)
640 			help_callback, (XtPointer)"range_warn");
641 
642 							/*-- show filename --*/
643 	n = 0;
644 	XtSetArg(args[n], XmNselectColor,	color[COL_TOGGLE]);	n++;
645 	XtSetArg(args[n], XmNtopAttachment,	XmATTACH_WIDGET);	n++;
646 	XtSetArg(args[n], XmNtopWidget,		w);			n++;
647 	XtSetArg(args[n], XmNtopOffset,		4);			n++;
648 	XtSetArg(args[n], XmNleftAttachment,	XmATTACH_FORM);		n++;
649 	XtSetArg(args[n], XmNleftOffset,	8);			n++;
650 	XtSetArg(args[n], XmNhighlightThickness,0);			n++;
651 	XtSetArg(args[n], XmNset,		config.weekuser);	n++;
652 	w = XtCreateManagedWidget(_("Show file names in bar labels"),
653 			xmToggleButtonWidgetClass,
654 			form2, args, n);
655 	XtAddCallback(w, XmNvalueChangedCallback, (XtCallbackProc)
656 			flag_callback,(XtPointer)10);
657 	XtAddCallback(w, XmNhelpCallback, (XtCallbackProc)
658 			help_callback, (XtPointer)"range_user");
659 
660 							/*-- notime bars --*/
661 	n = 0;
662 	XtSetArg(args[n], XmNselectColor,	color[COL_TOGGLE]);	n++;
663 	XtSetArg(args[n], XmNtopAttachment,	XmATTACH_WIDGET);	n++;
664 	XtSetArg(args[n], XmNtopWidget,		w);			n++;
665 	XtSetArg(args[n], XmNtopOffset,		4);			n++;
666 	XtSetArg(args[n], XmNleftAttachment,	XmATTACH_FORM);		n++;
667 	XtSetArg(args[n], XmNleftOffset,	8);			n++;
668 	XtSetArg(args[n], XmNhighlightThickness,0);			n++;
669 	XtSetArg(args[n], XmNset,		config.week_bignotime);	n++;
670 	w = XtCreateManagedWidget(_("Large bars for week entries without time"),
671 			xmToggleButtonWidgetClass,
672 			form2, args, n);
673 	XtAddCallback(w, XmNvalueChangedCallback, (XtCallbackProc)
674 			flag_callback, (XtPointer)12);
675 	XtAddCallback(w, XmNhelpCallback, (XtCallbackProc)
676 			help_callback, (XtPointer)"range_user");
677 
678 							/*-- extra times --*/
679 	n = 0;
680 	XtSetArg(args[n], XmNselectColor,	color[COL_TOGGLE]);	n++;
681 	XtSetArg(args[n], XmNtopAttachment,	XmATTACH_WIDGET);	n++;
682 	XtSetArg(args[n], XmNtopWidget,		w);			n++;
683 	XtSetArg(args[n], XmNtopOffset,		4);			n++;
684 	XtSetArg(args[n], XmNleftAttachment,	XmATTACH_FORM);		n++;
685 	XtSetArg(args[n], XmNleftOffset,	8);			n++;
686 	XtSetArg(args[n], XmNhighlightThickness,0);			n++;
687 	XtSetArg(args[n], XmNset,		config.moretimecols);	n++;
688 	w = XtCreateManagedWidget(_("Insert extra time columns and rows"),
689 			xmToggleButtonWidgetClass,
690 			form2, args, n);
691 	XtAddCallback(w, XmNvalueChangedCallback, (XtCallbackProc)
692 			flag_callback, (XtPointer)17);
693 	XtAddCallback(w, XmNhelpCallback, (XtCallbackProc)
694 			help_callback, (XtPointer)"range_user");
695 
696 	XtRealizeWidget(shell);
697 	closewindow = XmInternAtom(display, "WM_DELETE_WINDOW", False);
698 	XmAddWMProtocolCallback(shell, closewindow, (XtCallbackProc)
699 			done_callback, (XtPointer)shell);
700 	XtSetArg(args[0], XmNwidth,  &xs);
701 	XtSetArg(args[1], XmNheight, &ys);
702 	XtGetValues(form, args, 2);
703 	XtSetArg(args[0], XmNwidth,  xs+8);
704 	XtSetArg(args[1], XmNheight, ys+8);
705 	XtSetValues(shell, args, 2);
706 	XtPopup(shell, XtGrabNone);
707 
708 	a = config.early_time / 60;
709 	b = config.late_time  / 60;
710 	print_text_button(defwarn, a&&b ? "%d, %d" : a ? "%d" : "", a?a:b, b);
711 	print_text_button(ndays,   "%d", config.week_ndays);
712 	print_text_button(min,     "%d", config.week_minhour);
713 	print_text_button(max,     "%d", config.week_maxhour);
714 
715 	have_shell = TRUE;
716 }
717 
718 
719 /*-------------------------------------------------- callbacks --------------*/
720 /*
721  * All of these routines are direct X callbacks.
722  */
723 
724 /*ARGSUSED*/
done_callback(UNUSED Widget widget,UNUSED int item,UNUSED XmToggleButtonCallbackStruct * data)725 static void done_callback(
726 	UNUSED Widget			widget,
727 	UNUSED int			item,
728 	UNUSED XmToggleButtonCallbackStruct*data)
729 {
730 	destroy_calconfig_popup();
731 }
732 
733 
734 static BOOL *flagptr[] = {
735 	&config.sunday_first, &config.mmddyy, &config.ampm, &config.autodel,
736 	&config.julian, &config.weeknum, &config.fullweek, &config.colorcode_m,
737 	&config.nopast, &config.weekwarn,&config.weekuser, &config.owner_only,
738 	&config.week_bignotime, &config.gpsweek, &config.share_mainwin,
739 	&config.insecure_script, &config.thu_week, &config.moretimecols
740 };
741 
742 /*ARGSUSED*/
flag_callback(Widget widget,int item,XmToggleButtonCallbackStruct * data)743 static void flag_callback(
744 	Widget				widget,
745 	int				item,
746 	XmToggleButtonCallbackStruct	*data)
747 {
748 	*flagptr[item] = data->set;
749 	if (flagptr[item] == &config.owner_only) {
750 		read_mainlist();
751 		if (!config.owner_only)
752 			multiple_writer_warning_popup(widget);
753 	}
754 	if (flagptr[item] == &config.share_mainwin && !config.share_mainwin) {
755 		destroy_year_menu();
756 		destroy_week_menu();
757 		destroy_yov_menu();
758 		destroy_day_menu();
759 		create_view('m');
760 	}
761 	mainlist->modified = TRUE;
762 	update_all_listmenus(TRUE);
763 	redraw_all_views();
764 	print_icon_name();
765 	if (config.smallmonth)
766 		print_button(mainmenu.time, mktimestring(get_time(), FALSE));
767 	else
768 		print_button(mainmenu.time, "%s   %s",
769 					    mkdatestring(get_time()),
770 					    mktimestring(get_time(), FALSE));
771 }
772