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