1 /*
2 * year menu widgets.
3 *
4 * destroy_year_menu() Destroy the year window an its
5 * contents
6 * create_year_menu() Create a year calendar for curr_year
7 * and put a year view into it
8 */
9
10 #include <stdio.h>
11 #include <stdlib.h>
12 #include <time.h>
13 #include <Xm/Xm.h>
14 #include <Xm/DialogS.h>
15 #include <Xm/Form.h>
16 #include <Xm/Frame.h>
17 #include <Xm/RowColumn.h>
18 #include <Xm/LabelP.h>
19 #include <Xm/ArrowBP.h>
20 #include <Xm/ArrowBG.h>
21 #include <Xm/PushBP.h>
22 #include <Xm/PushBG.h>
23 #include <Xm/Text.h>
24 #include <Xm/ScrolledW.h>
25 #include <Xm/DrawingA.h>
26 #include <Xm/Protocols.h>
27 #include "cal.h"
28
29 static void done_callback (Widget, int, XmToggleButtonCallbackStruct *);
30 static void year_cal_callback (Widget, int, XmDrawingAreaCallbackStruct *);
31
32 extern Display *display; /* everybody uses the same server */
33 extern GC gc; /* everybody uses this context */
34 extern Widget toplevel; /* top-level shell */
35 extern struct mainmenu mainmenu; /* all important window widgets */
36 extern Widget mainwindow; /* popup menus hang off main window */
37 extern struct config config; /* global configuration data */
38 extern struct plist *mainlist; /* list of all schedule entries */
39 extern XFontStruct *font[NFONTS]; /* fonts: FONT_* */
40 extern Pixel color[NCOLS]; /* colors: COL_* */
41
42 static Widget shell; /* view window, or 0 if deinstalled */
43 static Widget parent_form; /* if in mainwindow, parent form */
44
45
46 /*
47 * destroy the year menu. Remove it from the screen, and destroy its widgets.
48 * It's too much trouble to keep them for next time.
49 */
50
destroy_year_menu(void)51 void destroy_year_menu(void)
52 {
53 if (shell) {
54 if (!parent_form)
55 XtPopdown(shell);
56 XTDESTROYWIDGET(shell);
57 shell = 0;
58 mainmenu.yearcal = 0;
59 }
60 }
61
62
63 /*
64 * create the year menu.
65 * There should be buttons for Quit, next/prev year, next/prev 6 months.
66 */
67
create_year_menu(Widget parent)68 void create_year_menu(
69 Widget parent)
70 {
71 Arg args[15];
72 int n;
73 Atom closewindow;
74 Widget form, scroll;
75 Dimension xs, ys;
76
77 xs = 2*config.year_margin+ 4*config.yearbox_xs*7+ 3*config.year_gap +4;
78 ys = 2*config.year_margin+ 1*config.year_title +
79 3*config.yearbox_ys*8+ 3*config.year_gap +4;
80
81 form = create_view_form(&shell, parent_form = parent, 'y',
82 xs, ys, _("Year View"));
83 if (!form) {
84 draw_year_calendar(NULL);
85 return;
86 }
87 XtAddCallback(form, XmNhelpCallback, (XtCallbackProc)
88 help_callback, (XtPointer)"year");
89
90 n = 0;
91 XtSetArg(args[n], XmNtopAttachment, XmATTACH_FORM); n++;
92 XtSetArg(args[n], XmNbottomAttachment, XmATTACH_FORM); n++;
93 XtSetArg(args[n], XmNleftAttachment, XmATTACH_FORM); n++;
94 XtSetArg(args[n], XmNrightAttachment, XmATTACH_FORM); n++;
95 XtSetArg(args[n], XmNtopOffset, 8); n++;
96 XtSetArg(args[n], XmNbottomOffset, 8); n++;
97 XtSetArg(args[n], XmNleftOffset, 8); n++;
98 XtSetArg(args[n], XmNrightOffset, 8); n++;
99 XtSetArg(args[n], XmNwidth, xs); n++;
100 XtSetArg(args[n], XmNheight, ys); n++;
101 XtSetArg(args[n], XmNscrollingPolicy, XmAUTOMATIC); n++;
102 scroll = XtCreateWidget("scroll", xmScrolledWindowWidgetClass,
103 form, args, n);
104
105 n = 0;
106 XtSetArg(args[n], XmNwidth, xs-4); n++;
107 XtSetArg(args[n], XmNheight, ys-4); n++;
108 mainmenu.yearcal = XtCreateWidget("yearcal", xmDrawingAreaWidgetClass,
109 scroll, args, n);
110 XtAddCallback(mainmenu.yearcal, XmNinputCallback, (XtCallbackProc)
111 year_cal_callback, (XtPointer)NULL);
112 XtAddCallback(mainmenu.yearcal, XmNexposeCallback, (XtCallbackProc)
113 year_cal_callback, (XtPointer)NULL);
114 XtManageChild(mainmenu.yearcal);
115 XtManageChild(scroll);
116 XtManageChild(form);
117
118 if (!parent) {
119 XtPopup(shell, XtGrabNone);
120 closewindow = XmInternAtom(display, "WM_DELETE_WINDOW", False);
121 XmAddWMProtocolCallback(shell, closewindow, (XtCallbackProc)
122 done_callback, (XtPointer)shell);
123 }
124 }
125
126
127 /*-------------------------------------------------- callbacks --------------*/
128 /*
129 * All of these routines are direct X callbacks.
130 */
131
132 /*ARGSUSED*/
done_callback(UNUSED Widget widget,UNUSED int item,UNUSED XmToggleButtonCallbackStruct * data)133 static void done_callback(
134 UNUSED Widget widget,
135 UNUSED int item,
136 UNUSED XmToggleButtonCallbackStruct*data)
137 {
138 if (parent_form)
139 create_view('m');
140 else
141 destroy_year_menu();
142 }
143
144
145 /*ARGSUSED*/
year_cal_callback(UNUSED Widget w,UNUSED int data,XmDrawingAreaCallbackStruct * info)146 static void year_cal_callback(
147 UNUSED Widget w,
148 UNUSED int data,
149 XmDrawingAreaCallbackStruct *info)
150 {
151 int view;
152
153 if (info->reason == XmCR_INPUT && info->event->xany.type==ButtonPress){
154 if ((view = clicked_year_calendar(info->event->xbutton.x,
155 info->event->xbutton.y))) {
156 if (parent_form)
157 create_view(view == 'Q' ? 'm' : view);
158 if (view == 'Q')
159 destroy_year_menu();
160 }
161 } else if (info->reason == XmCR_EXPOSE) {
162 XEvent dummy;
163 Region region = XCreateRegion();
164 XtAddExposureToRegion(info->event, region);
165 while (XCheckWindowEvent(display, info->window, ExposureMask,
166 &dummy))
167 XtAddExposureToRegion(&dummy, region);
168 draw_year_calendar(region);
169 }
170 }
171