1 /*
2  *  This file is part of XForms.
3  *
4  *  XForms is free software; you can redistribute it and/or modify it
5  *  under the terms of the GNU Lesser General Public License as
6  *  published by the Free Software Foundation; either version 2.1, or
7  *  (at your option) any later version.
8  *
9  *  XForms is distributed in the hope that it will be useful, but
10  *  WITHOUT ANY WARRANTY; without even the implied warranty of
11  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  *  Lesser General Public License for more details.
13  *
14  *  You should have received a copy of the GNU Lesser General Public
15  *  License along with XForms; see the file COPYING.  If not, write to
16  *  the Free Software Foundation, 59 Temple Place - Suite 330, Boston,
17  *  MA 02111-1307, USA.
18  */
19 
20 
21 /**
22  * \file demo27.c
23  *
24  * This demo shows the use of event callbacks and form callbacks.
25  * purposesly mixed form callback, object callback and event callback
26  * to show the flexibility of Forms Library's event handling (and
27  * test if they actually work together).
28  *
29  *  This file is part of xforms package
30  *  T.C. Zhao and M. Overmars
31  */
32 
33 #ifdef HAVE_CONFIG_H
34 #include "config.h"
35 #endif
36 
37 #include <stdio.h>
38 #include <stdlib.h>
39 #include "include/forms.h"
40 
41 Window  main_win;
42 
43 
44 /*------------ Color Part --------------------*/
45 
46 FL_FORM *colorform;
47 FL_OBJECT *redsl,
48           *greensl,
49           *bluesl, *colorobj;
50 
51 int r = 128,
52     g = 128,
53     b = 128;
54 
55 
56 /***************************************
57  * color form callback routine
58  ***************************************/
59 
60 void
color_callback(FL_OBJECT * obj FL_UNUSED_ARG,void * d FL_UNUSED_ARG)61 color_callback( FL_OBJECT * obj  FL_UNUSED_ARG,
62                 void      * d    FL_UNUSED_ARG )
63 {
64     r = 255 * fl_get_slider_value( redsl   );
65     g = 255 * fl_get_slider_value( greensl );
66     b = 255 * fl_get_slider_value( bluesl  );
67 
68     fl_mapcolor( FL_FREE_COL1, r, g, b );
69     fl_redraw_object( colorobj );
70 }
71 
72 
73 /***************************************
74  ***************************************/
75 
76 void
create_colorform(void)77 create_colorform( void )
78 {
79     FL_OBJECT *obj;
80 
81     if ( colorform )
82       return;
83 
84     colorform = fl_bgn_form( FL_NO_BOX, 315, 190 );
85 
86     fl_add_box( FL_UP_BOX, 0, 0, 315, 190, "" );
87 
88     bluesl = obj = fl_add_slider( FL_HOR_SLIDER, 20, 25, 220, 35, "" );
89     fl_set_object_color( obj, FL_COL1, FL_BLUE );
90 
91     redsl = obj = fl_add_slider( FL_HOR_SLIDER, 20, 135, 220, 35, "" );
92     fl_set_object_color( obj, FL_COL1, FL_RED );
93 
94     greensl = obj = fl_add_slider( FL_HOR_SLIDER, 20, 80, 220, 35, "" );
95     fl_set_object_color( obj, FL_COL1, FL_GREEN );
96 
97     colorobj = obj = fl_add_box( FL_BORDER_BOX, 250, 25, 50, 145, "" );
98     fl_set_object_color( obj, FL_FREE_COL1, FL_FREE_COL1 );
99 
100     fl_end_form( );
101 }
102 
103 
104 /***************************************
105  * initializes the color part
106  ***************************************/
107 
108 void
init_colorpart(void)109 init_colorpart( void )
110 {
111     create_colorform( );
112     fl_set_form_callback( colorform, color_callback, 0 );
113     fl_set_form_position( colorform, 20, -300 - colorform->h );
114     fl_show_form( colorform, FL_PLACE_GEOMETRY, FL_TRANSIENT, "Color" );
115     fl_mapcolor( FL_FREE_COL1,r,g,b );
116     fl_redraw_object( colorobj );
117 }
118 
119 
120 /*--------------- Control Part -------------------*/
121 
122 FL_FORM * controlform;
123 FL_OBJECT * squareobj,
124           * exitobj,
125           * sizeobj;
126 
127 int curobj = 1,
128     cursize = 20;
129 
130 
131 /***************************************
132  ***************************************/
133 
134 void
select_object(FL_OBJECT * ob FL_UNUSED_ARG,long which)135 select_object( FL_OBJECT * ob  FL_UNUSED_ARG,
136                long        which )
137 {
138     curobj = which;
139 }
140 
141 
142 void clearit( FL_OBJECT *, long );
143 
144 
145 /***************************************
146  * control form callback routine
147  ***************************************/
148 
149 void
control_callback(FL_OBJECT * obj,void * d FL_UNUSED_ARG)150 control_callback( FL_OBJECT * obj,
151                   void      * d  FL_UNUSED_ARG )
152 {
153    if ( obj == sizeobj )
154        cursize = 40 * fl_get_slider_value( sizeobj );
155    else if ( obj == exitobj )
156    {
157        fl_finish( );
158        exit( 0 );
159    }
160 }
161 
162 
163 /***************************************
164  ***************************************/
165 
166 void
create_controlform(void)167 create_controlform( void )
168 {
169     FL_OBJECT *obj;
170 
171     controlform = fl_bgn_form( FL_UP_BOX, 260, 230 );
172 
173     fl_bgn_group( );
174 
175     squareobj = obj = fl_add_button( FL_RADIO_BUTTON, 20, 150, 60, 60,
176                                      "@square" );
177     fl_set_object_lcolor( obj, FL_YELLOW );
178     fl_set_object_callback( obj, select_object, 1 );
179 
180     obj = fl_add_button( FL_RADIO_BUTTON, 20, 90, 60, 60, "@circle" );
181     fl_set_object_lcolor( obj, FL_YELLOW );
182     fl_set_object_callback( obj, select_object, 2 );
183 
184     obj = fl_add_button( FL_RADIO_BUTTON, 20, 30, 60, 60, "@8>" );
185     fl_set_object_lcolor( obj, FL_YELLOW );
186     fl_set_object_callback( obj, select_object, 3 );
187 
188     fl_end_group( );
189 
190     exitobj = fl_add_button( FL_NORMAL_BUTTON, 160, 30, 80, 30, "Exit" );
191 
192     obj = fl_add_button( FL_NORMAL_BUTTON, 160, 180, 80, 30, "Clear" );
193     fl_set_object_callback( obj, clearit, 0 );
194 
195     sizeobj = fl_add_slider( FL_VERT_SLIDER, 100, 30, 40, 180, "size" );
196     fl_set_slider_bounds( sizeobj, 0.025, 1.0 );
197 
198     fl_end_form( );
199 }
200 
201 
202 /***************************************
203  * initializes the control part
204  ***************************************/
205 
206 void
init_controlpart(void)207 init_controlpart( void )
208 {
209     create_controlform( );
210     fl_set_form_callback( controlform, control_callback, 0 );
211     fl_set_button( squareobj, 1 );
212     fl_set_form_geometry( controlform, 20, -controlform->h - 40,
213                           controlform->w, controlform->h );
214     fl_show_form( controlform, FL_PLACE_SIZE, FL_TRANSIENT, "Control" );
215 }
216 
217 
218 /*--------------- Main part -------------------*/
219 
220 typedef struct{
221     int type,
222         r,
223         g,
224         b,
225         x,
226         y,
227         size;
228 } OBJ;
229 
230 OBJ ob[ 10000 ];
231 int onumb = 0;
232 
233 
234 /***************************************
235  ***************************************/
236 
237 void
drawit(OBJ * obj)238 drawit( OBJ * obj )
239 {
240     fl_winset( main_win );
241     fl_mapcolor( FL_FREE_COL1, obj->r, obj->g, obj->b );
242 
243     if ( obj->type == 1 )
244         fl_rectf( obj->x - obj->size, obj->y - obj->size,
245                   2 * obj->size, 2 * obj->size, FL_FREE_COL1 );
246     else if ( obj->type == 2 )
247         fl_circf( obj->x, obj->y, obj->size, FL_FREE_COL1 );
248     else if ( obj->type == 3 )
249     {
250         FL_POINT point[ 3 ];
251 
252         point[ 0 ].x = obj->x - obj->size;
253         point[ 0 ].y = obj->y + obj->size;
254         point[ 1 ].x = obj->x + obj->size;
255         point[ 1 ].y = obj->y + obj->size;
256         point[ 2 ].x = obj->x;
257         point[ 2 ].y = obj->y - obj->size;
258         fl_polyf( point, 3, FL_FREE_COL1 );
259     }
260 }
261 
262 
263 /***************************************
264  * draws a particular object
265  ***************************************/
266 
267 void
drawobject(void)268 drawobject( void )
269 {
270     FL_Coord x0,
271              y0;
272     unsigned int km;
273     OBJ *cur_obj = ob + onumb;
274 
275     fl_get_win_mouse( main_win, &x0, &y0, &km );
276     cur_obj->x = x0 ;
277     cur_obj->y = y0 ;
278     cur_obj->r = r;
279     cur_obj->g = g;
280     cur_obj->b = b;
281     cur_obj->type = curobj;
282     cur_obj->size = cursize;
283     drawit( cur_obj );
284     onumb++;
285 }
286 
287 
288 /***************************************
289  ***************************************/
290 
291 void
redrawit(void)292 redrawit( void )
293 {
294    int i;
295 
296    XClearWindow( fl_display, main_win );
297    for ( i = 0; i < onumb; i++ )
298        drawit( ob + i );
299 }
300 
301 
302 
303 /***************************************
304  ***************************************/
305 
306 void
clearit(FL_OBJECT * ob FL_UNUSED_ARG,long data FL_UNUSED_ARG)307 clearit( FL_OBJECT * ob    FL_UNUSED_ARG,
308          long        data  FL_UNUSED_ARG )
309 {
310    onumb = 0;
311    redrawit( );
312 }
313 
314 
315 /***************************************
316  * Event callback routine
317  ***************************************/
318 
main_callback(XEvent * xev,void * p FL_UNUSED_ARG)319 int main_callback( XEvent * xev,
320                    void   * p    FL_UNUSED_ARG )
321 {
322     fl_winset( main_win );
323 
324     if ( xev->type == Expose )
325         redrawit( );
326     else if ( xev->type == ButtonPress )
327         drawobject( );
328     return 0;
329 }
330 
331 
332 /***************************************
333  ***************************************/
334 
335 void
init_mainpart(void)336 init_mainpart( void )
337 {
338     fl_pref_wingeometry( 400, 300, 400, 400 );
339     fl_pref_winsize( 400, 400 );
340     fl_winbackground( 0, fl_get_flcolor( FL_COL1 ) );
341     main_win = fl_winopen( "Drawing" );
342     fl_set_event_callback( main_callback, 0 );
343 }
344 
345 
346 /***************************************
347  ***************************************/
348 
349 int
main(int argc,char * argv[])350 main( int    argc,
351       char * argv[ ] )
352 {
353 
354     fl_initialize( &argc, argv, "FormDemo", 0, 0 );
355     init_colorpart( );
356     init_controlpart( );
357     init_mainpart( );
358     color_callback( colorobj, 0 );
359 
360     while ( fl_do_forms( ) )
361         /* empty */ ;
362 
363     return 0;
364 }
365 
366 
367 /*
368  * Local variables:
369  * tab-width: 4
370  * indent-tabs-mode: nil
371  * End:
372  */
373