1 /*
2  * Create and destroy the time adjustment popup. It specidies a time offset,
3  * and timezone and daylight saving adjustment.
4  *
5  *	destroy_adjust_popup()
6  *	create_adjust_popup()
7  */
8 
9 #include <stdio.h>
10 #include <stdlib.h>
11 #include <time.h>
12 #include <Xm/Xm.h>
13 #include <Xm/DialogS.h>
14 #include <Xm/Form.h>
15 #include <Xm/Frame.h>
16 #include <Xm/RowColumn.h>
17 #include <Xm/LabelP.h>
18 #include <Xm/LabelG.h>
19 #include <Xm/PushBP.h>
20 #include <Xm/PushBG.h>
21 #include <Xm/ToggleB.h>
22 #include <Xm/Text.h>
23 #include <Xm/TextF.h>
24 #include <Xm/Protocols.h>
25 #include "cal.h"
26 
27 static void done_callback  (Widget, int, XmToggleButtonCallbackStruct *);
28 static void guess_callback (Widget, int, XmToggleButtonCallbackStruct *);
29 static void dst_callback   (Widget, int, XmToggleButtonCallbackStruct *);
30 static void adjust_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 edit	edit;		/* info about entry being edited */
35 extern struct config	config;		/* global configuration data */
36 extern XtAppContext	app;		/* application handle */
37 extern struct mainmenu	mainmenu;	/* all important main window widgets */
38 extern Pixel		color[NCOLS];	/* colors: COL_* */
39 extern XFontStruct	*font[NFONTS];	/* fonts: FONT_* */
40 extern struct plist	*mainlist;	/* list of all schedule entries */
41 
42 static BOOL		have_shell;	/* message popup exists if TRUE */
43 static Widget		shell;		/* popup menu shell */
44 static Widget		time_w;		/* current time display */
45 static Widget		adjust_w;	/* time adjustment text widget */
46 static Widget		tzone_w;	/* timezone text widget */
47 static Widget		toggle0_w;	/* radio button for dst on */
48 static Widget		toggle1_w;	/* radio button for dst off */
49 static Widget		toggle2_w;	/* radio button for auto dst */
50 static Widget		toggle3_w;	/* radio button for system dst */
51 static Widget		begin_w;	/* daylight saving begin text widget */
52 static Widget		end_w;		/* daylight saving end text widget */
53 
54 
55 /*
56  * print current time, once a second and when a button is pressed
57  */
58 
print_times(void)59 static void print_times(void)
60 {
61 	int			hour, min, sec;
62 
63 	sec = get_time();
64 	if (config.smallmonth)
65 		print_button(mainmenu.time,	mktimestring(sec, FALSE));
66 	else
67 		print_button(mainmenu.time, "%s   %s",
68 						mkdatestring(sec),
69 						mktimestring(sec, FALSE));
70 	hour = (sec / 3600) % 24;
71 	min  = (sec / 60) % 60;
72 	sec %= 60;
73 	set_tzone();
74 	print_icon_name();
75 	if (config.ampm)
76 		print_button(time_w, "%2d:%02d:%02d%c", hour%12 ? hour%12 : 12,
77 						min, sec, "ap"[hour >= 12]);
78 	else
79 		print_button(time_w, "%02d:%02d:%02d", hour, min, sec);
80 }
81 
82 /*ARGSUSED*/
sec_timer_callback(UNUSED XtPointer data,UNUSED XtIntervalId * id)83 static void sec_timer_callback(
84 	UNUSED XtPointer	data,		/* not used */
85 	UNUSED XtIntervalId	*id)		/* not used */
86 {
87 	if (have_shell) {
88 		print_times();
89 		XtAppAddTimeOut(app, 1000, sec_timer_callback, 0);
90 	}
91 }
92 
93 
94 /*
95  * print text into all text widgets
96  */
97 
print_text_buttons(void)98 static void print_text_buttons(void)
99 {
100 	Arg			args;
101 	time_t			t;
102 
103 	t = config.adjust_time < 0 ? -config.adjust_time : config.adjust_time;
104 	print_text_button(adjust_w, "%c %d:%02d:%02d",
105 				config.adjust_time < 0 ? '-' : '+',
106 				t/3600, (t/60)%60, t%60);
107 
108 	t = config.raw_tzone < 0 ? -config.raw_tzone : config.raw_tzone;
109 	print_text_button(tzone_w, "%c %d:%02d",
110 				config.raw_tzone < 0 ? '-' : '+',
111 				t/3600, (t/60)%60);
112 
113 	if (config.dst_flag == 2) {
114 		print_text_button(begin_w, "%d", config.dst_begin);
115 		print_text_button(end_w,   "%d", config.dst_end);
116 		XtSetArg(args, XmNsensitive, TRUE);
117 	} else {
118 		print_text_button(begin_w, "");
119 		print_text_button(end_w,   "");
120 		XtSetArg(args, XmNsensitive, FALSE);
121 	}
122 	XtSetValues(begin_w, &args, 1);
123 	XtSetValues(end_w,   &args, 1);
124 }
125 
126 
127 /*
128  * retrieve texts from text widgets, store everything in config
129  */
130 
eval_menu_texts(void)131 static void eval_menu_texts(void)
132 {
133 	char		*string;	/* contents of text widget */
134 
135 	string = XmTextGetString(adjust_w);
136 	config.adjust_time = *string=='+' ?  parse_timestring(string+1, TRUE) :
137 			     *string=='-' ? -parse_timestring(string+1, TRUE)
138 					  :  parse_timestring(string,   TRUE);
139 	XtFree(string);
140 
141 	string = XmTextGetString(tzone_w);
142 	config.raw_tzone   = *string=='+' ?  parse_timestring(string+1, TRUE) :
143 			     *string=='-' ? -parse_timestring(string+1, TRUE)
144 					  :  parse_timestring(string,   TRUE);
145 	XtFree(string);
146 
147 	string = XmTextGetString(begin_w);
148 	config.dst_begin = atoi(string);
149 	XtFree(string);
150 
151 	string = XmTextGetString(end_w);
152 	config.dst_end = atoi(string);
153 	XtFree(string);
154 
155 	set_tzone();
156 }
157 
158 
159 /*
160  * destroy a popup. Remove it from the screen, and destroy its widgets.
161  * It's too much trouble to keep them for next time.
162  */
163 
destroy_adjust_popup(void)164 void destroy_adjust_popup(void)
165 {
166 	if (have_shell) {
167 		eval_menu_texts();
168 		XtPopdown(shell);
169 		XTDESTROYWIDGET(shell);
170 		have_shell = FALSE;
171 		mainlist->modified = TRUE;
172 		write_mainlist();
173 		resynchronize_daemon();
174 	}
175 }
176 
177 
178 /*
179  * create an adjust popup as a separate application shell. The popup is
180  * initialized with data from config.
181  */
182 
create_adjust_popup(void)183 void create_adjust_popup(void)
184 {
185 	Widget			form, frame, form2, form3, radio, w, w2;
186 	Arg			args[20];
187 	int			n;
188 	Atom			closewindow;
189 
190 	destroy_adjust_popup();
191 
192 	n = 0;
193 	XtSetArg(args[n], XmNdeleteResponse,	XmDO_NOTHING);		n++;
194 	XtSetArg(args[n], XmNiconic,		False);			n++;
195 	shell = XtCreatePopupShell(_("Adjust Time"),
196 			applicationShellWidgetClass, toplevel, args, n);
197 #	ifdef EDITRES
198 	XtAddEventHandler(shell, (EventMask)0, TRUE,
199  			_XEditResCheckMessages, NULL);
200 #	endif
201 	set_icon(shell, 1);
202 	form = XtCreateManagedWidget("adjform1", xmFormWidgetClass,
203 			shell, NULL, 0);
204 	XtAddCallback(form, XmNhelpCallback, (XtCallbackProc)help_callback,
205 			(XtPointer)"adj");
206 
207 							/*-- current time --*/
208 	n = 0;
209 	XtSetArg(args[n], XmNtopAttachment,	XmATTACH_FORM);		n++;
210 	XtSetArg(args[n], XmNtopOffset,		16);			n++;
211 	XtSetArg(args[n], XmNleftAttachment,	XmATTACH_FORM);		n++;
212 	XtSetArg(args[n], XmNrightAttachment,	XmATTACH_FORM);		n++;
213 	time_w = XtCreateManagedWidget(" ", xmLabelWidgetClass,
214 			form, args, n);
215 							/*-- adjust time --*/
216 	n = 0;
217 	XtSetArg(args[n], XmNtopAttachment,	XmATTACH_WIDGET);	n++;
218 	XtSetArg(args[n], XmNtopWidget,		time_w);		n++;
219 	XtSetArg(args[n], XmNtopOffset,		16);			n++;
220 	XtSetArg(args[n], XmNleftAttachment,	XmATTACH_FORM);		n++;
221 	XtSetArg(args[n], XmNleftOffset,	8);			n++;
222 	XtSetArg(args[n], XmNrightAttachment,	XmATTACH_FORM);		n++;
223 	XtSetArg(args[n], XmNrightOffset,	8);			n++;
224 	XtSetArg(args[n], XmNshadowType,	XmSHADOW_ETCHED_IN);	n++;
225 	frame = XtCreateManagedWidget("", xmFrameWidgetClass,
226 			form, args, n);
227 	form2 = XtCreateManagedWidget("adjform2", xmFormWidgetClass,
228 			frame, NULL, 0);
229 	XtAddCallback(form2, XmNhelpCallback, (XtCallbackProc)help_callback,
230 			(XtPointer)"adj_time");
231 	n = 0;
232 	XtSetArg(args[n], XmNtopAttachment,	XmATTACH_FORM);		n++;
233 	XtSetArg(args[n], XmNtopOffset,		12);			n++;
234 	XtSetArg(args[n], XmNleftAttachment,	XmATTACH_FORM);		n++;
235 	XtSetArg(args[n], XmNleftOffset,	8);			n++;
236 	w = XtCreateManagedWidget(_("Add"), xmLabelWidgetClass,
237 			form2, args, n);
238 	n = 0;
239 	XtSetArg(args[n], XmNtopAttachment,	XmATTACH_FORM);		n++;
240 	XtSetArg(args[n], XmNtopOffset,		8);			n++;
241 	XtSetArg(args[n], XmNbottomAttachment,	XmATTACH_FORM);		n++;
242 	XtSetArg(args[n], XmNbottomOffset,	8);			n++;
243 	XtSetArg(args[n], XmNleftAttachment,	XmATTACH_WIDGET);	n++;
244 	XtSetArg(args[n], XmNleftWidget,	w);			n++;
245 	XtSetArg(args[n], XmNleftOffset,	16);			n++;
246 	XtSetArg(args[n], XmNwidth,		140);			n++;
247 	XtSetArg(args[n], XmNrecomputeSize,	False);			n++;
248 	XtSetArg(args[n], XmNpendingDelete,	True);			n++;
249 	XtSetArg(args[n], XmNhighlightThickness,0);			n++;
250 	XtSetArg(args[n], XmNbackground,	color[COL_TEXTBACK]);	n++;
251 	adjust_w = XtCreateManagedWidget("", xmTextFieldWidgetClass,
252 			form2, args, n);
253 	XtAddCallback(adjust_w, XmNactivateCallback, (XtCallbackProc)
254 			adjust_callback, (XtPointer)NULL);
255 	n = 0;
256 	XtSetArg(args[n], XmNtopAttachment,	XmATTACH_FORM);		n++;
257 	XtSetArg(args[n], XmNtopOffset,		12);			n++;
258 	XtSetArg(args[n], XmNleftAttachment,	XmATTACH_WIDGET);	n++;
259 	XtSetArg(args[n], XmNleftWidget,	adjust_w);		n++;
260 	XtSetArg(args[n], XmNleftOffset,	16);			n++;
261 	w = XtCreateManagedWidget(_("(h:m:s) to system time"),
262 			xmLabelWidgetClass, form2, args, n);
263 							/*-- adjust tzone --*/
264 	n = 0;
265 	XtSetArg(args[n], XmNtopAttachment,	XmATTACH_WIDGET);	n++;
266 	XtSetArg(args[n], XmNtopWidget,		frame);			n++;
267 	XtSetArg(args[n], XmNtopOffset,		8);			n++;
268 	XtSetArg(args[n], XmNleftAttachment,	XmATTACH_FORM);		n++;
269 	XtSetArg(args[n], XmNleftOffset,	8);			n++;
270 	XtSetArg(args[n], XmNrightAttachment,	XmATTACH_FORM);		n++;
271 	XtSetArg(args[n], XmNrightOffset,	8);			n++;
272 	XtSetArg(args[n], XmNshadowType,	XmSHADOW_ETCHED_IN);	n++;
273 	frame = XtCreateManagedWidget("", xmFrameWidgetClass,
274 			form, args, n);
275 	form2 = XtCreateManagedWidget("adjform3", xmFormWidgetClass,
276 			frame, NULL, 0);
277 	XtAddCallback(form2, XmNhelpCallback, (XtCallbackProc)help_callback,
278 			(XtPointer)"adj_dst");
279 
280 	n = 0;
281 	XtSetArg(args[n], XmNtopAttachment,	XmATTACH_FORM);		n++;
282 	XtSetArg(args[n], XmNtopOffset,		8);			n++;
283 	XtSetArg(args[n], XmNleftAttachment,	XmATTACH_FORM);		n++;
284 	XtSetArg(args[n], XmNleftOffset,	8);			n++;
285 	w2 = XtCreateManagedWidget(_("Timezone is GMT"), xmLabelWidgetClass,
286 			form2, args, n);
287 	XtAddCallback(w2, XmNhelpCallback, (XtCallbackProc)help_callback,
288 			(XtPointer)"adj_zone");
289 
290 	n = 0;
291 	XtSetArg(args[n], XmNtopAttachment,	XmATTACH_FORM);		n++;
292 	XtSetArg(args[n], XmNtopOffset,		4);			n++;
293 	XtSetArg(args[n], XmNleftAttachment,	XmATTACH_WIDGET);	n++;
294 	XtSetArg(args[n], XmNleftWidget,	w2);			n++;
295 	XtSetArg(args[n], XmNleftOffset,	16);			n++;
296 	XtSetArg(args[n], XmNwidth,		100);			n++;
297 	XtSetArg(args[n], XmNrecomputeSize,	False);			n++;
298 	XtSetArg(args[n], XmNpendingDelete,	True);			n++;
299 	XtSetArg(args[n], XmNhighlightThickness,0);			n++;
300 	XtSetArg(args[n], XmNbackground,	color[COL_TEXTBACK]);	n++;
301 	tzone_w = XtCreateManagedWidget("", xmTextFieldWidgetClass,
302 			form2, args, n);
303 	XtAddCallback(tzone_w, XmNactivateCallback, (XtCallbackProc)
304 			adjust_callback, (XtPointer)NULL);
305 	n = 0;
306 	XtSetArg(args[n], XmNtopAttachment,	XmATTACH_FORM);		n++;
307 	XtSetArg(args[n], XmNtopOffset,		8);			n++;
308 	XtSetArg(args[n], XmNleftAttachment,	XmATTACH_WIDGET);	n++;
309 	XtSetArg(args[n], XmNleftWidget,	tzone_w);		n++;
310 	XtSetArg(args[n], XmNleftOffset,	16);			n++;
311 	w = XtCreateManagedWidget(_("(h:m)"), xmLabelWidgetClass,
312 			form2, args, n);
313 							/*-- dst radio --*/
314 	n = 0;
315 	XtSetArg(args[n], XmNtopAttachment,	XmATTACH_WIDGET);	n++;
316 	XtSetArg(args[n], XmNtopWidget,		w2);			n++;
317 	XtSetArg(args[n], XmNleftAttachment,	XmATTACH_FORM);		n++;
318 	form3 = XtCreateManagedWidget("adjform2", xmFormWidgetClass,
319 			form2, args, n);
320 	n = 0;
321 	XtSetArg(args[n], XmNtopAttachment,	XmATTACH_FORM);		n++;
322 	XtSetArg(args[n], XmNtopOffset,		24);			n++;
323 	XtSetArg(args[n], XmNleftAttachment,	XmATTACH_FORM);		n++;
324 	XtSetArg(args[n], XmNleftOffset,	8);			n++;
325 	w = XtCreateManagedWidget(_("Daylight Saving is"), xmLabelWidgetClass,
326 			form3, args, n);
327 
328 	n = 0;
329 	XtSetArg(args[n], XmNtopAttachment,	XmATTACH_FORM);		n++;
330 	XtSetArg(args[n], XmNtopOffset,		20);			n++;
331 	XtSetArg(args[n], XmNleftAttachment,	XmATTACH_WIDGET);	n++;
332 	XtSetArg(args[n], XmNleftWidget,	w);			n++;
333 	XtSetArg(args[n], XmNleftOffset,	16);			n++;
334 	XtSetArg(args[n], XmNhighlightThickness,0);			n++;
335 	XtSetArg(args[n], XmNspacing,		4);			n++;
336 	radio = XmCreateRadioBox(form3, "radio", args, n);
337 
338 	n = 0;
339 	XtSetArg(args[n], XmNindicatorType,	XmONE_OF_MANY);		n++;
340 	XtSetArg(args[n], XmNselectColor,	color[COL_TOGGLE]);	n++;
341 	XtSetArg(args[n], XmNhighlightThickness,0);			n++;
342 	XtSetArg(args[n], XmNset,		config.dst_flag==3);	n++;
343 	toggle3_w = XtCreateManagedWidget(_("use system time"),
344 			xmToggleButtonWidgetClass,
345 			radio, args, n);
346 	XtAddCallback(toggle3_w, XmNvalueChangedCallback, (XtCallbackProc)
347 			dst_callback, (XtPointer)3);
348 	n = 0;
349 	XtSetArg(args[n], XmNindicatorType,	XmONE_OF_MANY);		n++;
350 	XtSetArg(args[n], XmNselectColor,	color[COL_TOGGLE]);	n++;
351 	XtSetArg(args[n], XmNhighlightThickness,0);			n++;
352 	XtSetArg(args[n], XmNset,		config.dst_flag==0);	n++;
353 	toggle0_w = XtCreateManagedWidget(_("always on"),
354 			xmToggleButtonWidgetClass,
355 			radio, args, n);
356 	XtAddCallback(toggle0_w, XmNvalueChangedCallback, (XtCallbackProc)
357 			dst_callback, (XtPointer)0);
358 	n = 0;
359 	XtSetArg(args[n], XmNindicatorType,	XmONE_OF_MANY);		n++;
360 	XtSetArg(args[n], XmNselectColor,	color[COL_TOGGLE]);	n++;
361 	XtSetArg(args[n], XmNhighlightThickness,0);			n++;
362 	XtSetArg(args[n], XmNset,		config.dst_flag==1);	n++;
363 	toggle1_w = XtCreateManagedWidget(_("always off"),
364 			xmToggleButtonWidgetClass,
365 			radio, args, n);
366 	XtAddCallback(toggle1_w, XmNvalueChangedCallback, (XtCallbackProc)
367 			dst_callback, (XtPointer)1);
368 	n = 0;
369 	XtSetArg(args[n], XmNindicatorType,	XmONE_OF_MANY);		n++;
370 	XtSetArg(args[n], XmNselectColor,	color[COL_TOGGLE]);	n++;
371 	XtSetArg(args[n], XmNhighlightThickness,0);			n++;
372 	XtSetArg(args[n], XmNset,		config.dst_flag==2);	n++;
373 	toggle2_w = XtCreateManagedWidget(_("automatic"),
374 			xmToggleButtonWidgetClass,
375 			radio, args, n);
376 	XtAddCallback(toggle2_w, XmNvalueChangedCallback, (XtCallbackProc)
377 			dst_callback, (XtPointer)2);
378 
379 							/*-- dst day range --*/
380 	n = 0;
381 	XtSetArg(args[n], XmNtopAttachment,	XmATTACH_WIDGET);	n++;
382 	XtSetArg(args[n], XmNtopWidget,		form3);			n++;
383 	XtSetArg(args[n], XmNtopOffset,		24);			n++;
384 	XtSetArg(args[n], XmNleftAttachment,	XmATTACH_FORM);		n++;
385 	XtSetArg(args[n], XmNleftOffset,	8);			n++;
386 	w = XtCreateManagedWidget(_("Automatic DST from Julian day"),
387 			xmLabelWidgetClass,
388 			form2, args, n);
389 
390 	n = 0;
391 	XtSetArg(args[n], XmNtopAttachment,	XmATTACH_WIDGET);	n++;
392 	XtSetArg(args[n], XmNtopWidget,		form3);			n++;
393 	XtSetArg(args[n], XmNtopOffset,		20);			n++;
394 	XtSetArg(args[n], XmNleftAttachment,	XmATTACH_WIDGET);	n++;
395 	XtSetArg(args[n], XmNleftWidget,	w);			n++;
396 	XtSetArg(args[n], XmNleftOffset,	16);			n++;
397 	XtSetArg(args[n], XmNwidth,		60);			n++;
398 	XtSetArg(args[n], XmNrecomputeSize,	False);			n++;
399 	XtSetArg(args[n], XmNpendingDelete,	True);			n++;
400 	XtSetArg(args[n], XmNhighlightThickness,0);			n++;
401 	XtSetArg(args[n], XmNbackground,	color[COL_TEXTBACK]);	n++;
402 	begin_w = XtCreateManagedWidget("", xmTextFieldWidgetClass,
403 			form2, args, n);
404 	XtAddCallback(begin_w, XmNactivateCallback, (XtCallbackProc)
405 			adjust_callback, (XtPointer)NULL);
406 	n = 0;
407 	XtSetArg(args[n], XmNtopAttachment,	XmATTACH_WIDGET);	n++;
408 	XtSetArg(args[n], XmNtopWidget,		form3);			n++;
409 	XtSetArg(args[n], XmNtopOffset,		24);			n++;
410 	XtSetArg(args[n], XmNleftAttachment,	XmATTACH_WIDGET);	n++;
411 	XtSetArg(args[n], XmNleftWidget,	begin_w);		n++;
412 	XtSetArg(args[n], XmNleftOffset,	16);			n++;
413 	w = XtCreateManagedWidget(_("to"), xmLabelWidgetClass,
414 			form2, args, n);
415 	n = 0;
416 	XtSetArg(args[n], XmNtopAttachment,	XmATTACH_WIDGET);	n++;
417 	XtSetArg(args[n], XmNtopWidget,		form3);			n++;
418 	XtSetArg(args[n], XmNtopOffset,		20);			n++;
419 	XtSetArg(args[n], XmNbottomAttachment,	XmATTACH_FORM);		n++;
420 	XtSetArg(args[n], XmNbottomOffset,	8);			n++;
421 	XtSetArg(args[n], XmNleftAttachment,	XmATTACH_WIDGET);	n++;
422 	XtSetArg(args[n], XmNleftWidget,	w);			n++;
423 	XtSetArg(args[n], XmNleftOffset,	16);			n++;
424 	XtSetArg(args[n], XmNrightAttachment,	XmATTACH_FORM);		n++;
425 	XtSetArg(args[n], XmNrightOffset,	8);			n++;
426 	XtSetArg(args[n], XmNwidth,		60);			n++;
427 	XtSetArg(args[n], XmNrecomputeSize,	False);			n++;
428 	XtSetArg(args[n], XmNpendingDelete,	True);			n++;
429 	XtSetArg(args[n], XmNhighlightThickness,0);			n++;
430 	XtSetArg(args[n], XmNbackground,	color[COL_TEXTBACK]);	n++;
431 	end_w = XtCreateManagedWidget("", xmTextFieldWidgetClass,
432 			form2, args, n);
433 	XtAddCallback(end_w, XmNactivateCallback, (XtCallbackProc)
434 			adjust_callback, (XtPointer)NULL);
435 
436 							/*-- buttons --*/
437 	n = 0;
438 	XtSetArg(args[n], XmNtopAttachment,	XmATTACH_WIDGET);	n++;
439 	XtSetArg(args[n], XmNtopWidget,		frame);			n++;
440 	XtSetArg(args[n], XmNtopOffset,		16);			n++;
441 	XtSetArg(args[n], XmNbottomAttachment,	XmATTACH_FORM);		n++;
442 	XtSetArg(args[n], XmNbottomOffset,	8);			n++;
443 	XtSetArg(args[n], XmNrightAttachment,	XmATTACH_FORM);		n++;
444 	XtSetArg(args[n], XmNrightOffset,	8);			n++;
445 	XtSetArg(args[n], XmNwidth,		80);			n++;
446 	w = XtCreateManagedWidget(_("Done"), xmPushButtonWidgetClass,
447 			form, args, n);
448 	XtAddCallback(w, XmNactivateCallback, (XtCallbackProc)
449 			done_callback, (XtPointer)0);
450 	XtAddCallback(w, XmNhelpCallback, (XtCallbackProc)
451 			help_callback, (XtPointer)"adj_done");
452 
453 	n = 0;
454 	XtSetArg(args[n], XmNtopAttachment,	XmATTACH_WIDGET);	n++;
455 	XtSetArg(args[n], XmNtopWidget,		frame);			n++;
456 	XtSetArg(args[n], XmNtopOffset,		16);			n++;
457 	XtSetArg(args[n], XmNbottomAttachment,	XmATTACH_FORM);		n++;
458 	XtSetArg(args[n], XmNbottomOffset,	8);			n++;
459 	XtSetArg(args[n], XmNrightAttachment,	XmATTACH_WIDGET);	n++;
460 	XtSetArg(args[n], XmNrightWidget,	w);			n++;
461 	XtSetArg(args[n], XmNrightOffset,	8);			n++;
462 	XtSetArg(args[n], XmNwidth,		80);			n++;
463 	w = XtCreateManagedWidget(_("Help"), xmPushButtonWidgetClass,
464 			form, args, n);
465 	XtAddCallback(w, XmNactivateCallback, (XtCallbackProc)
466 			help_callback, (XtPointer)"adj");
467 	XtAddCallback(w, XmNhelpCallback,     (XtCallbackProc)
468 			help_callback, (XtPointer)"adj");
469 
470 	n = 0;
471 	XtSetArg(args[n], XmNtopAttachment,	XmATTACH_WIDGET);	n++;
472 	XtSetArg(args[n], XmNtopWidget,		frame);			n++;
473 	XtSetArg(args[n], XmNtopOffset,		16);			n++;
474 	XtSetArg(args[n], XmNbottomAttachment,	XmATTACH_FORM);		n++;
475 	XtSetArg(args[n], XmNbottomOffset,	8);			n++;
476 	XtSetArg(args[n], XmNrightAttachment,	XmATTACH_WIDGET);	n++;
477 	XtSetArg(args[n], XmNrightWidget,	w);			n++;
478 	XtSetArg(args[n], XmNrightOffset,	8);			n++;
479 	XtSetArg(args[n], XmNwidth,		80);			n++;
480 	w = XtCreateManagedWidget(_("Guess"), xmPushButtonWidgetClass,
481 			form, args, n);
482 	XtAddCallback(w, XmNactivateCallback, (XtCallbackProc)
483 			guess_callback, (XtPointer)0);
484 	XtAddCallback(w, XmNhelpCallback, (XtCallbackProc)
485 			help_callback, (XtPointer)"adj_guess");
486 
487 	XtManageChild(radio);
488 	XtPopup(shell, XtGrabNone);
489 	print_text_buttons();
490 	print_times();
491 
492 	closewindow = XmInternAtom(display, "WM_DELETE_WINDOW", False);
493 	XmAddWMProtocolCallback(shell, closewindow, (XtCallbackProc)
494 			done_callback, (XtPointer)shell);
495 	have_shell = TRUE;
496 	XtAppAddTimeOut(app, 1000, sec_timer_callback, 0);
497 }
498 
499 
500 /*-------------------------------------------------- callbacks --------------*/
501 /*
502  * All of these routines are direct X callbacks.
503  */
504 
505 /*ARGSUSED*/
done_callback(UNUSED Widget widget,UNUSED int item,UNUSED XmToggleButtonCallbackStruct * data)506 static void done_callback(
507 	UNUSED Widget			widget,
508 	UNUSED int			item,
509 	UNUSED XmToggleButtonCallbackStruct*data)
510 {
511 	destroy_adjust_popup();
512 }
513 
514 
515 /*ARGSUSED*/
guess_callback(UNUSED Widget widget,UNUSED int item,UNUSED XmToggleButtonCallbackStruct * data)516 static void guess_callback(
517 	UNUSED Widget			widget,
518 	UNUSED int			item,
519 	UNUSED XmToggleButtonCallbackStruct*data)
520 {
521 	Arg				args;
522 
523 	guess_tzone();
524 	set_tzone();
525 	XtSetArg(args, XmNset, FALSE);
526 	XtSetValues(toggle0_w, &args, 1);
527 	XtSetValues(toggle1_w, &args, 1);
528 	XtSetValues(toggle3_w, &args, 1);
529 	XtSetArg(args, XmNset, TRUE);
530 	XtSetValues(toggle2_w, &args, 1);
531 	print_text_buttons();
532 	print_times();
533 }
534 
535 
536 /*ARGSUSED*/
dst_callback(UNUSED Widget widget,int item,XmToggleButtonCallbackStruct * data)537 static void dst_callback(
538 	UNUSED Widget			widget,
539 	int				item,
540 	XmToggleButtonCallbackStruct	*data)
541 {
542 	if (data->set) {
543 		config.dst_flag = item;
544 		print_text_buttons();
545 		print_times();
546 	}
547 }
548 
549 
550 /*ARGSUSED*/
adjust_callback(UNUSED Widget widget,UNUSED int item,UNUSED XmToggleButtonCallbackStruct * data)551 static void adjust_callback(
552 	UNUSED Widget			widget,
553 	UNUSED int			item,
554 	UNUSED XmToggleButtonCallbackStruct*data)
555 {
556 	eval_menu_texts();
557 	print_text_buttons();
558 	print_times();
559 }
560