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