cc51f2b4ef9ee7c567b0173a8fd8305c1c9a9a15
[openafs.git] / src / gtx / lightobject.c
1 /*
2  * Copyright 2000, International Business Machines Corporation and others.
3  * All Rights Reserved.
4  *
5  * This software has been released under the terms of the IBM Public
6  * License.  For details, see the LICENSE file in the top-level source
7  * directory or online at http://www.openafs.org/dl/license10.html
8  */
9
10 /*
11  * Description:
12  *      Implementation of the gator light object.
13  *
14  *------------------------------------------------------------------------*/
15
16 #include <afsconfig.h>
17 #include <afs/param.h>
18
19 #include <roken.h>
20
21 #include "gtxlightobj.h"        /*Interface for this module */
22
23 /*Externally-advertised array of light onode operations*/
24 struct onodeops gator_light_ops = {
25     gator_light_destroy,
26     gator_light_display,
27     gator_light_release
28 };
29
30 static char mn[] = "gator_lightobject"; /*Module name */
31
32 /*------------------------------------------------------------------------
33  * gator_light_create
34  *
35  * Description:
36  *      Create a gator light object.
37  *
38  * Arguments:
39  *      struct onode *light_onp : Ptr to the light onode to fill out.
40  *      struct onode_createparams *params : Generic ptr to creation
41  *          parameters.
42  *
43  * Returns:
44  *      Zero if successful,
45  *      Error value otherwise.
46  *
47  * Environment:
48  *      The base onode fields have already been set.  Lights are turned
49  *      off at creation.
50  *
51  * Side Effects:
52  *      Creates and initializes the light private data area, including
53  *      a window string-drawing parameter structure.  These areas are
54  *      garbage-collected upon failure.
55  *------------------------------------------------------------------------*/
56
57 int
58 gator_light_create(struct onode *light_onp, struct onode_createparams *params)
59 {                               /*gator_light_create */
60
61     static char rn[] = "gator_light_create";    /*Routine name */
62     struct gator_light_crparams *light_params;  /*My specific creation params */
63     struct gator_lightobj *light_data;  /*Ptr to private data */
64     struct gwin_strparams *light_strparams;     /*Light label params */
65
66     light_params = (struct gator_light_crparams *)params;
67     if (objects_debug) {
68         fprintf(stderr, "[%s:%s] Private data passed to light object:\n", mn,
69                 rn);
70         fprintf(stderr,
71                 "\tAppearance: %d, flashfreq: %d, label at offset (%d, %d): '%s'\n",
72                 light_params->appearance, light_params->flashfreq,
73                 light_params->label_x, light_params->label_y,
74                 light_params->label);
75     }
76
77     /*
78      * Allocate the private data area, including the lower-level
79      * structure, then fill it in.
80      */
81     light_data =
82         (struct gator_lightobj *)malloc(sizeof(struct gator_lightobj));
83     if (light_data == (struct gator_lightobj *)0) {
84         fprintf(stderr,
85                 "[%s:%s] Can't allocate %" AFS_SIZET_FMT " bytes for light object private data region, errno is %d\n",
86                 mn, rn, sizeof(struct gator_lightobj), errno);
87         return (errno);
88     }
89
90     light_strparams =
91         (struct gwin_strparams *)malloc(sizeof(struct gwin_strparams));
92     if (light_strparams == (struct gwin_strparams *)0) {
93         fprintf(stderr,
94                 "[%s:%s] Can't allocate %" AFS_SIZET_FMT " bytes for light object label in private data region, errno is %d\n",
95                 mn, rn, sizeof(struct gwin_strparams), errno);
96         free(light_data);
97         return (errno);
98     }
99
100     /*
101      * Now that we have the private structures allocated, set them up.
102      */
103     light_data->setting = 0;
104     light_data->appearance = light_params->appearance;
105     light_data->flashfreq = light_params->flashfreq;
106     light_data->lasttoggletime = 0;
107     strcpy(light_data->label, light_params->label);
108
109     light_strparams->x = light_onp->o_x + light_params->label_x;
110     light_strparams->y = light_onp->o_y + light_params->label_y;
111     light_strparams->s = light_data->label;
112     light_strparams->highlight = 0;
113     light_data->llrock = (int *)light_strparams;
114
115     /*
116      * Attach the private data to the onode, then return the happy news.
117      */
118     light_onp->o_data = (int *)light_data;
119     return (0);
120
121 }                               /*gator_light_create */
122
123 /*------------------------------------------------------------------------
124  * gator_light_destroy
125  *
126  * Description:
127  *      Destroy a gator light object.
128  *
129  * Arguments:
130  *      struct onode *onp : Ptr to the light onode to delete.
131  *
132  * Returns:
133  *      0: Success
134  *      Error value otherwise.
135  *
136  * Environment:
137  *      Nothing interesting.
138  *
139  * Side Effects:
140  *      As advertised.
141  *------------------------------------------------------------------------*/
142
143 int
144 gator_light_destroy(struct onode *onp)
145 {                               /*gator_light_destroy */
146
147     /*
148      * For now, this is a no-op.
149      */
150     return (0);
151
152 }                               /*gator_light_destroy */
153
154 /*------------------------------------------------------------------------
155  * gator_light_display
156  *
157  * Description:
158  *      Display/redraw a gator light object.
159  *
160  * Arguments:
161  *      struct onode *onp: Ptr to the light onode to display.
162  *
163  * Returns:
164  *      0: Success
165  *      Error value otherwise.
166  *
167  * Environment:
168  *      Light objects have a pointer to string-drawing params in the
169  *      lower-level rock, with the proper highlighting set according
170  *      to whether the light is on or off, so we just have to draw
171  *      that string to get the proper effect.
172  *
173  * Side Effects:
174  *      As advertised.
175  *------------------------------------------------------------------------*/
176
177 int
178 gator_light_display(struct onode *onp)
179 {                               /*gator_light_display */
180
181     static char rn[] = "gator_light_display";   /*Routine name */
182     struct gator_lightobj *light_data;  /*Ptr to light obj data */
183     struct gwin_strparams *label_strparams;     /*String-drawing params */
184
185     /*
186      * Draw the label, with proper highlighting depending on whether
187      * the light is on.
188      */
189     light_data = (struct gator_lightobj *)(onp->o_data);
190     label_strparams = (struct gwin_strparams *)(light_data->llrock);
191     if (objects_debug)
192         fprintf(stderr, "[%s:%s] Printing out light label '%s' at (%d, %d)\n",
193                 mn, rn, label_strparams->s, label_strparams->x,
194                 label_strparams->y);
195     WOP_DRAWSTRING(onp->o_window, label_strparams);
196     return (0);
197
198 }                               /*gator_light_display */
199
200 /*------------------------------------------------------------------------
201  * gator_light_release
202  *
203  * Description:
204  *      Drop the refcount on a gator light object.
205  *
206  * Arguments:
207  *      struct onode *onp : Ptr to the onode whose refcount is
208  *                                   to be dropped.
209  *
210  * Returns:
211  *      0: Success
212  *      Error value otherwise.
213  *
214  * Environment:
215  *      Nothing interesting.
216  *
217  * Side Effects:
218  *      As advertised.
219  *------------------------------------------------------------------------*/
220
221 int
222 gator_light_release(struct onode *onp)
223 {                               /*gator_light_release */
224
225     /*
226      * For now, this is a no-op.
227      */
228     return (0);
229
230 }                               /*gator_light_release */
231
232 /*------------------------------------------------------------------------
233  * gator_light_set
234  *
235  * Description:
236  *      Set the value of the given gator light object.
237  *
238  * Arguments:
239  *        struct onode *onp : Ptr to the light onode to be set.
240  *        int setting       : Non-zero for ``on'', zero for ``off''.
241  *
242  * Returns:
243  *      0: Success
244  *      Error value otherwise.
245  *
246  * Environment:
247  *      We need to set not only the setting field, but the lower-
248  *      level structure stored in the rock must have its highlight
249  *      field set correctly.
250  *
251  * Side Effects:
252  *      Does NOT redisplay the light object.
253  *------------------------------------------------------------------------*/
254
255 int
256 gator_light_set(struct onode *onp, int setting)
257 {                               /*gator_light_set */
258
259     static char rn[] = "gator_light_set";       /*Routine name */
260     struct gator_lightobj *light_data;  /*Ptr to light obj data */
261     struct gwin_strparams *label_strparams;     /*String-drawing params */
262
263     /*
264      * Set the object correctly, then set the highlight field in
265      * the lower-level rock.
266      */
267     light_data = (struct gator_lightobj *)(onp->o_data);
268     label_strparams = (struct gwin_strparams *)(light_data->llrock);
269     if (objects_debug)
270         fprintf(stderr, "[%s:%s] Setting light object at %p to %d (%s)", mn,
271                 rn, onp, setting, (setting ? "ON" : "OFF"));
272     light_data->setting = setting;
273     label_strparams->highlight = setting;
274
275     return (0);
276
277 }                               /*gator_light_set */