Merge branch 'linux1'
[oweals/cde.git] / cde / programs / dtmail / MotifApp / BusyPixmap.C
1 /*
2  * CDE - Common Desktop Environment
3  *
4  * Copyright (c) 1993-2012, The Open Group. All rights reserved.
5  *
6  * These libraries and programs are free software; you can
7  * redistribute them and/or modify them under the terms of the GNU
8  * Lesser General Public License as published by the Free Software
9  * Foundation; either version 2 of the License, or (at your option)
10  * any later version.
11  *
12  * These libraries and programs are distributed in the hope that
13  * they will be useful, but WITHOUT ANY WARRANTY; without even the
14  * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
15  * PURPOSE. See the GNU Lesser General Public License for more
16  * details.
17  *
18  * You should have received a copy of the GNU Lesser General Public
19  * License along with these librararies and programs; if not, write
20  * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth
21  * Floor, Boston, MA 02110-1301 USA
22  */
23 /* $XConsortium: BusyPixmap.C /main/3 1996/04/21 19:32:02 drk $ */
24 /*
25  *+SNOTICE
26  *
27  *      RESTRICTED CONFIDENTIAL INFORMATION:
28  *      
29  *      The information in this document is subject to special
30  *      restrictions in a confidential disclosure agreement bertween
31  *      HP, IBM, Sun, USL, SCO and Univel.  Do not distribute this
32  *      document outside HP, IBM, Sun, USL, SCO, or Univel wihtout
33  *      Sun's specific written approval.  This documment and all copies
34  *      and derivative works thereof must be returned or destroyed at
35  *      Sun's request.
36  *
37  *      Copyright 1993 Sun Microsystems, Inc.  All rights reserved.
38  *
39  *+ENOTICE
40  */
41
42 ///////////////////////////////////////////////////////////////////////////////
43 //////////////////////////////////////////////////////////////////////////////
44 //         This example code is from the book:
45 //
46 //           Object-Oriented Programming with C++ and OSF/Motif
47 //         by
48 //           Douglas Young
49 //           Prentice Hall, 1992
50 //           ISBN 0-13-630252-1 
51 //
52 //         Copyright 1991 by Prentice Hall
53 //         All Rights Reserved
54 //
55 //  Permission to use, copy, modify, and distribute this software for 
56 //  any purpose except publication and without fee is hereby granted, provided 
57 //  that the above copyright notice appear in all copies of the software.
58 ///////////////////////////////////////////////////////////////////////////////
59 //////////////////////////////////////////////////////////////////////////////
60
61
62 ///////////////////////////////////////////////////
63 // BusyPixmap.C
64 ///////////////////////////////////////////////////
65 #include "BusyPixmap.h"
66 #include <Xm/Xm.h>
67
68 #define NUMPIXMAPS  8
69 #define PIXMAPSIZE  50
70
71 BusyPixmap::BusyPixmap ( Widget w ) : 
72         PixmapCycler ( NUMPIXMAPS, PIXMAPSIZE, PIXMAPSIZE )
73 {
74     _w = w;
75 }
76
77 void BusyPixmap::createPixmaps()
78 {
79     int angle, delta, i;
80     XGCValues  gcv;
81     
82     // Create a graphics context used to draw each pixmap,
83     // based on the colors of the given widget
84     
85     XtVaGetValues ( _w, 
86                    XmNforeground, &gcv.foreground,
87                    XmNbackground, &gcv.background,
88                    NULL );
89     
90     _gc = XtGetGC ( _w,  GCForeground | GCBackground, &gcv );
91     
92     // Create a second GC used to fill the pixmap with
93     // the background color of the widget
94     
95     XtVaGetValues ( _w, 
96                    XmNforeground, &gcv.background,
97                    XmNbackground, &gcv.foreground,
98                    NULL );
99     
100     _inverseGC = XtGetGC ( _w,  GCForeground | GCBackground, &gcv );
101     
102     // Define the starting increment, and a slice of the pie.
103     // The size of the pie slice depends on the number of pixmaps
104     // to be created.
105     
106     angle = 360;
107     delta = 360 / NUMPIXMAPS;
108     
109     for ( i = 0; i < NUMPIXMAPS; i++)
110     {
111         // Create a pixmap for each slice of the pie. X measures
112         // counterclockwise, so subtract the size of each slice
113         // so the sequence moves clockwise.
114         
115         _pixmapList[i] = createBusyPixmap ( angle, delta ); 
116         angle -= delta;
117     }
118     
119     // Release the GCs after all pixmaps have been created
120     
121     XtReleaseGC ( _w, _gc );
122     XtReleaseGC ( _w, _inverseGC );
123 }
124
125 Pixmap BusyPixmap::createBusyPixmap ( int    start, 
126                                      int    end )
127 {
128     Pixmap    pm;
129     const int margin = 1;
130     
131     // Create a pixmap. Use the root window used by the widget,
132     // because the widget may not be realized, or may be a gadget
133     
134     pm = XCreatePixmap ( XtDisplay ( _w ), 
135                         RootWindowOfScreen ( XtScreen ( _w ) ),
136                         _width, _height,
137                         DefaultDepthOfScreen ( XtScreen ( _w ) ) );
138     
139     // Pixmaps have to be cleared by filling them with a background color
140     
141     XFillRectangle ( XtDisplay ( _w ), 
142                     pm, 
143                     _inverseGC, 
144                     0, 0, _width, _height );
145     
146     // Draw a complete circle just inside the bounds of the pxmap
147     
148     XDrawArc ( XtDisplay ( _w ), 
149               pm,
150               _gc, 
151               margin, margin, 
152               _width - 2 * margin, 
153               _height - 2 * margin, 
154               0, 360 * 64 );
155     
156     // Draw the pie slice as a solid color
157     
158     XFillArc ( XtDisplay ( _w ), 
159               pm,
160               _gc, 
161               margin, margin, 
162               _width - 2 * margin, 
163               _height - 2 * margin, 
164               start * 64, end * 64 );
165     
166     return pm;
167 }