0023830: BRepExtrema_DistShapeShape does not find intersection of face with edge
[occt.git] / src / Xw / Xw_load_icons.cxx
CommitLineData
b311480e 1// Copyright (c) 1999-2012 OPEN CASCADE SAS
2//
3// The content of this file is subject to the Open CASCADE Technology Public
4// License Version 6.5 (the "License"). You may not use the content of this file
5// except in compliance with the License. Please obtain a copy of the License
6// at http://www.opencascade.org and read it completely before using this file.
7//
8// The Initial Developer of the Original Code is Open CASCADE S.A.S., having its
9// main offices at: 1, place des Freres Montgolfier, 78280 Guyancourt, France.
10//
11// The Original Code and all software distributed under the License is
12// distributed on an "AS IS" basis, without warranty of any kind, and the
13// Initial Developer hereby disclaims all such warranties, including without
14// limitation, any warranties of merchantability, fitness for a particular
15// purpose or non-infringement. Please see the License for the specific terms
16// and conditions governing the rights and limitations under the License.
17
7fd59977 18#define NO_PERF01 /*GG_160996
19// Mesure de performances sur l'iconification
20*/
21
22#define CTS17035 /*GG_191296
23// Chargement conditionnel des icones
24// Syntaxe:
25// #ifdef code cond value
26// code : DEPTH,CLASS or SCREEN_SIZE
27// cond : > ou >= ou < ou <= ou == ou !=
28// value: valeur entiere ou real fonction du code
29// #else
30// #endif
31*/
32
33#define QUANTIFY /*GG_180297
34// Charger dynamiquement les icones au fur et a mesure
35// de leur utilisation
36*/
37
38#define PRO16753 /* GG 261198
39// 1) Don't free pname because this pointer is a
40// static address in Xw_get_filename() space.
41// 2) Increments nicons value in Xw_load_icons
42// 3) Flush pixmap filling (XPutImage) before returning.
43*/
44
45#ifdef HAVE_CONFIG_H
46# include <config.h>
47#endif
48
49#include <Xw_Extension.h>
50#ifdef PERF01
51# ifdef HAVE_TIME_H
52# include <time.h>
53# endif
54#endif
55
56 /* ifdef then trace on */
57#ifdef TRACE
58#define TRACE_LOAD_ICONS
59#define TRACE_SAVE_ICONS
60#define TRACE_CLEAR_ICONS
61#define TRACE_SHOW_ICONS
62#define TRACE_SAVE_ICONS
63#define TRACE_GET_ICON_PIXMAP
64#define TRACE_CREATE_ICON_PIXMAP
65#define TRACE_GET_ICON_SIZE
66#define TRACE_GET_ICON_NAME
67#define TRACE_GET_ICON
68#define TRACE_PUT_ICON
69#define TRACE_PUT_ICON_NAME
70#define TRACE_PUT_WINDOW_ICON
71#define TRACE_DEL_ICON
72#endif
73
74/*
75 int Xw_load_icons (awindow,dirname):
76 XW_EXT_WINDOW *awindow
77 char *dirname Icon File Directory name
78
79 LOAD Icons File directory
80
81 NOTE : Icons File must be ".ifd" postfixed file and contains
82 the sets of icons to be loaded in the IconBox
83 Each Icon is a complete filename of type ".xwd" followed
84 bye the icon-name .
85
86 e.g :
87
88 Sample.ifd is my Icons File directory and contains :
89
90 chrono.xwd 'chrono'
91 $DIRICON/clock.xwd 'montre'
92 /usr/users/gg/XWD/toys.xwd 'toys'
93
94
95 returns 0 if something is failed.
96 returns the number of loaded icons if successfull.
97
98 int Xw_save_icons (awindow):
99 XW_EXT_WINDOW *awindow
100
101 SAVE just created Icons in corresponding .xwd files.
102
103 returns 0 if something is failed.
104 returns the number of saved icons if successfull.
105
106 STATUS Xw_show_icons (awindow):
107 XW_EXT_WINDOW *awindow
108
109 SHOW Icons to the Screen
110
111 Returns ERROR if IconBox is Empty
112 Returns SUCCESS if successfull
113
114 int Xw_clear_icons (awindow,dirname):
115 XW_EXT_WINDOW *awindow
116 char *dirname Icon File Directory name
117
118 CLEAR the corresponding "dirname" Icons in the IconBox
119 or ALL icons if dirname is NULL
120 or ALL Added icons if dirname is ""
121
122 Returns 0 if nothing has been cleared
123 Returns the cleared icons number if successfull
124
125
126 static XW_EXT_ICON* Xw_put_icon (awindow,iconname):
127 XW_EXT_WINDOW *awindow
128 char *iconname Icon name
129
130 ADD an Icon in the IconBox but DON'T load it.
131
132 Returns Icon Ext Address if Successfull
133 Returns NULL if Icon don't exist
134
135 static XW_EXT_ICON* Xw_get_icon (awindow,iconname):
136 XW_EXT_WINDOW *awindow
137 char *iconname Icon name
138
139 GET the Image associated to the Icon in the IconBox
140
141 Returns Icon Ext Address if Successfull
142 Returns NULL if Icon don't exist
143
144 STATUS Xw_put_window_icon (awindow,fwindow,iconname,width,height):
145 XW_EXT_WINDOW *awindow
146 XW_EXT_WINDOW *fwindow
147 char *iconname Icon name
148 int width,height Icon size
149
150 ADD an Icon of size width,height in the IconBox
151 from the Full Window background fwindow
152
153 Returns ERROR if name is wrong
154 Returns SUCCESS if successfull
155
156 Aspect_Handle Xw_get_icon_pixmap (awindow,width,height,iconname):
157 XW_EXT_WINDOW *awindow
158 int width,height Pixmap Size
159 char *iconname Icon name
160
161 GET the Pixmap associated to the Icon in the IconBox
162
163 Returns Pixmap Xid if Successfull
164 Returns NULL if Icon don't exist
165
166 Xw_STATUS Xw_get_icon_size (awindow,iconname,width,height):
167 XW_EXT_WINDOW *awindow
168 char *iconname Icon name
169 int *width,*height Returned Pixmap Size
170
171 GET the Pixmap associated to the Icon in the IconBox
172
173 Returns ERROR if Iconname is not Known
174 Returns SUCCES if Successfull
175
176 char* Xw_get_icon_name (awindow,index):
177 XW_EXT_WINDOW *awindow
178 int index Icon Index >1 & <= IconNumber
179
180 GET the Icon Name from the IconBox Index
181
182 Returns IconName if Successfull
183 Returns NULL if Index is wrong
184*/
185
186#include <string.h>
187
188static char ShowIconBox = 'U' ;
189
190#ifdef CTS17035
191#define IFD_CODE_UNKNOWN 0
192#define IFD_CODE_DEPTH 1
193#define IFD_CODE_CLASS 2
194#define IFD_CODE_SCREEN_SIZE 3
195static int ifd_code = IFD_CODE_UNKNOWN;
196#define IFD_COND_UNKNOWN 0
197#define IFD_COND_EQUAL 1
198#define IFD_COND_GREATER 2
199#define IFD_COND_LESS 3
200#define IFD_COND_GREATER_OR_EQUAL 4
201#define IFD_COND_LESS_OR_EQUAL 5
202#define IFD_COND_NOT_EQUAL 6
203#define IFD_COND_SKIP 7
204#define IFD_COND_KEEP 8
205static int ifd_cond = IFD_COND_UNKNOWN;
206static int ifd_ivalue = 0;
207static float ifd_rvalue = 0.;
208static char ifd_svalue[256];
209#endif
210
211// Unused :
212#ifdef DEB
213#ifdef XW_PROTOTYPE
214static int Strcmp(char* cs1,char* cs2) /* For optimization */
215#else
216static int Strcmp(cs1,cs2) /* For optimization */
217char *cs1,*cs2;
218#endif
219{
220union {
221 int *i;
222 char *c;
223} u1,u2;
224int i,n = max(strlen(cs1),strlen(cs2))/sizeof(int);
225
226 u1.c = cs1; u2.c = cs2;
227
228 for( i=0 ; i<n ; i++,u1.i++,u2.i++ ) {
229 if( *u1.i != *u2.i ) break;
230 }
231
232 if( *u1.i && *u2.i && (i<n) ) {
233 for( i=0 ; (unsigned int ) i < sizeof(int) ; i++,u1.c++,u2.c++ ) {
234 if( *u1.c != *u2.c ) return True;
235 else if( !*u1.c ) return False;
236 }
237 }
238 return False;
239}
240#endif
241
242#ifdef XW_PROTOTYPE
243static XW_EXT_ICON* Xw_put_icon(XW_EXT_WINDOW* awindow,char* iconname);
244static XW_EXT_ICON* Xw_get_icon(XW_EXT_WINDOW* awindow,char* iconname);
245static XW_STATUS Xw_del_icon(XW_EXT_WINDOW* awindow,char* iconname);
246static Aspect_Handle Xw_create_icon_pixmap (XW_EXT_WINDOW* awindow,int width,int height,XW_EXT_IMAGEDATA *pimage);
247#else
248static XW_EXT_ICON* Xw_put_icon();
249static XW_EXT_ICON* Xw_get_icon();
250static XW_STATUS Xw_del_icon();
251static Aspect_Handle Xw_create_icon_pixmap();
252#endif /*XW_PROTOTYPE*/
253
254#ifdef XW_PROTOTYPE
255int Xw_load_icons (void *awindow,char *dirname)
256#else
257int Xw_load_icons (awindow,dirname)
258void *awindow;
259char *dirname ;
260#endif /*XW_PROTOTYPE*/
261{
262XW_EXT_WINDOW *pwindow = (XW_EXT_WINDOW*)awindow;
263XW_EXT_ICON *piconinfo;
264int status ;
265//Window window ;
266FILE *ficon = NULL;
267char *pname,filename[80],iconname[80],lf ;
268int skip,index,nicons = 0 ;
269float r,g,b,wsize,hsize,ssize ;
270
271 if( !Xw_isdefine_window(pwindow) ) {
272 /*ERROR*Bad EXT_WINDOW Address*/
273 Xw_set_error(24,"Xw_load_icons",pwindow) ;
274 return (0) ;
275 }
276
277 if( Xw_get_env("Xw_SHOW_ICONBOX",ifd_svalue,sizeof(ifd_svalue)) ){
278 if( (int)strlen(ifd_svalue) > 0 ) {
279 ShowIconBox = ifd_svalue[0] ;
280 }
281 printf( " Xw_SHOW_ICONBOX is '%c'\n",ShowIconBox) ;
282 }
283
284 status = Xw_get_color_name(_COLORMAP,"Green",&r,&g,&b) ;
285
286 if( status ) {
287 status = Xw_get_color_index(_COLORMAP,r,g,b,&index) ;
288 if( status ) Xw_set_line_attrib(pwindow,index,0,0,XW_REPLACE) ;
289 }
290
291 status = Xw_get_color_name(_COLORMAP,"White",&r,&g,&b) ;
292
293 if( status ) {
294 status = Xw_get_color_index(_COLORMAP,r,g,b,&index) ;
295 if( status ) Xw_set_text_attrib(pwindow,index,0,0,XW_REPLACE) ;
296 }
297
298 pname = Xw_get_filename(dirname,"ifd") ;
299
300 if( pname ) ficon = fopen(pname,"r") ;
301
302 if( !ficon ) {
303 /*ERROR*Bad ICON File Directory Name */
304 Xw_set_error(100,"Xw_load_icons",pname) ;
305 return (0) ;
306 }
307
308#ifndef PRO16753
309 Xw_free(pname) ;
310#endif
311 /* READ Icon File Directory */
312 while( !feof(ficon) ) {
313 skip = False ;
314 status = fscanf(ficon,"%s%c",filename,&lf) ;
315 if( filename[0] == '#' ) {
316#ifdef CTS17035
317 char code[80],cond[80],value[80];
318 code[0] = cond[0] = value[0] = '\0';
319 if( !strncmp(filename,"#if",3) ) {
320 status = fscanf(ficon,"%s%c",code,&lf) ;
321 if( lf != '\n' ) status = fscanf(ficon,"%s%c",cond,&lf) ;
322 if( lf != '\n' ) status = fscanf(ficon,"%s%c",value,&lf) ;
323#ifdef TRACE
324 if( Xw_get_trace() )
325 printf(" #ifdef '%s' '%s' '%s'\n",code,cond,value);
326#endif
327 ifd_code = IFD_CODE_UNKNOWN;
328 ifd_cond = IFD_COND_UNKNOWN;
329 ifd_ivalue = 0;
330 ifd_rvalue = 0.;
331 ifd_svalue[0] = '\0';
332 if( !strcmp(code,"DEPTH") ) {
333 ifd_code = IFD_CODE_DEPTH;
334 } else if( !strcmp(code,"CLASS") ) {
335 ifd_code = IFD_CODE_CLASS;
336 } else if( !strcmp(code,"SCREEN_SIZE") ) {
337 ifd_code = IFD_CODE_SCREEN_SIZE;
338 }
339 if( !strcmp(cond,">") ) {
340 ifd_cond = IFD_COND_GREATER;
341 } else if( !strcmp(cond,">=") ) {
342 ifd_cond = IFD_COND_GREATER_OR_EQUAL;
343 } else if( !strcmp(cond,"<") ) {
344 ifd_cond = IFD_COND_LESS;
345 } else if( !strcmp(cond,"<=") ) {
346 ifd_cond = IFD_COND_LESS_OR_EQUAL;
347 } else if( !strcmp(cond,"==") ) {
348 ifd_cond = IFD_COND_EQUAL;
349 } else if( !strcmp(cond,"!=") ) {
350 ifd_cond = IFD_COND_NOT_EQUAL;
351 }
352 switch (ifd_code) {
353 case IFD_CODE_DEPTH:
354 sscanf(value,"%d",&ifd_ivalue);
355 switch (ifd_cond) {
356 case IFD_COND_GREATER:
357 if( _DEPTH > ifd_ivalue ) ifd_cond = IFD_COND_KEEP;
358 else ifd_cond = IFD_COND_SKIP;
359 break;
360 case IFD_COND_GREATER_OR_EQUAL:
361 if( _DEPTH >= ifd_ivalue ) ifd_cond = IFD_COND_KEEP;
362 else ifd_cond = IFD_COND_SKIP;
363 break;
364 case IFD_COND_LESS:
365 if( _DEPTH < ifd_ivalue ) ifd_cond = IFD_COND_KEEP;
366 else ifd_cond = IFD_COND_SKIP;
367 break;
368 case IFD_COND_LESS_OR_EQUAL:
369 if( _DEPTH <= ifd_ivalue ) ifd_cond = IFD_COND_KEEP;
370 else ifd_cond = IFD_COND_SKIP;
371 break;
372 case IFD_COND_EQUAL:
373 if( _DEPTH == ifd_ivalue ) ifd_cond = IFD_COND_KEEP;
374 else ifd_cond = IFD_COND_SKIP;
375 break;
376 case IFD_COND_NOT_EQUAL:
377 if( _DEPTH != ifd_ivalue ) ifd_cond = IFD_COND_KEEP;
378 else ifd_cond = IFD_COND_SKIP;
379 break;
380 default:
381 fprintf(stderr,"*Xw_load_icons.Unrecognize key cond '%s'\n",cond);
382 ifd_cond = IFD_COND_SKIP;
383 }
384 break;
385 case IFD_CODE_CLASS:
386 sscanf(value,"%s",&ifd_svalue[0]);
387 ifd_ivalue = 0;
388 if( !strcmp(ifd_svalue,"PseudoColor") )
389 ifd_ivalue = PseudoColor;
390 else if( !strcmp(ifd_svalue,"TrueColor") )
391 ifd_ivalue = TrueColor;
392 switch (ifd_cond) {
393 case IFD_COND_EQUAL:
394 if( _CLASS == ifd_ivalue ) ifd_cond = IFD_COND_KEEP;
395 else ifd_cond = IFD_COND_SKIP;
396 break;
397 case IFD_COND_NOT_EQUAL:
398 if( _CLASS != ifd_ivalue ) ifd_cond = IFD_COND_KEEP;
399 else ifd_cond = IFD_COND_SKIP;
400 break;
401 default:
402 fprintf(stderr,"*Xw_load_icons.Unrecognize key cond '%s'\n",cond);
403 ifd_cond = IFD_COND_SKIP;
404 }
405 break;
406 case IFD_CODE_SCREEN_SIZE:
407 sscanf(value,"%f",&ifd_rvalue);
408 wsize = (float) WidthMMOfScreen(_SCREEN)/25.4;
409 hsize = (float) HeightMMOfScreen(_SCREEN)/25.4;
410 ssize = sqrt(wsize*wsize + hsize*hsize);
411 switch (ifd_cond) {
412 case IFD_COND_GREATER:
413 if( ssize > ifd_rvalue ) ifd_cond = IFD_COND_KEEP;
414 else ifd_cond = IFD_COND_SKIP;
415 break;
416 case IFD_COND_GREATER_OR_EQUAL:
417 if( ssize >= ifd_rvalue ) ifd_cond = IFD_COND_KEEP;
418 else ifd_cond = IFD_COND_SKIP;
419 break;
420 case IFD_COND_LESS:
421 if( ssize < ifd_rvalue ) ifd_cond = IFD_COND_KEEP;
422 else ifd_cond = IFD_COND_SKIP;
423 break;
424 case IFD_COND_LESS_OR_EQUAL:
425 if( ssize <= ifd_rvalue ) ifd_cond = IFD_COND_KEEP;
426 else ifd_cond = IFD_COND_SKIP;
427 break;
428 case IFD_COND_EQUAL:
429 if( ssize == ifd_rvalue ) ifd_cond = IFD_COND_KEEP;
430 else ifd_cond = IFD_COND_SKIP;
431 break;
432 case IFD_COND_NOT_EQUAL:
433 if( ssize != ifd_rvalue ) ifd_cond = IFD_COND_KEEP;
434 else ifd_cond = IFD_COND_SKIP;
435 break;
436 default:
437 fprintf(stderr,"*Xw_load_icons.Unrecognize key cond '%s'\n",cond);
438 ifd_cond = IFD_COND_SKIP;
439 }
440 break;
441 default:
442 fprintf(stderr,"*Xw_load_icons.Unrecognize key code '%s'\n",code);
443 ifd_cond = IFD_COND_SKIP;
444 }
445 } else if( !strncmp(filename,"#else",5) ) {
446#ifdef TRACE
447 if( Xw_get_trace() )
448 printf(" #else\n");
449#endif
450 switch (ifd_cond) {
451 case IFD_COND_UNKNOWN:
452 break;
453 case IFD_COND_SKIP:
454 ifd_cond = IFD_COND_KEEP;
455 break;
456 case IFD_COND_KEEP:
457 ifd_cond = IFD_COND_SKIP;
458 break;
459 }
460 } else if( !strncmp(filename,"#endif",6) ) {
461#ifdef TRACE
462 if( Xw_get_trace() )
463 printf(" #endif\n");
464#endif
465 ifd_code = IFD_CODE_UNKNOWN;
466 ifd_cond = IFD_COND_UNKNOWN;
467 ifd_ivalue = 0;
468 ifd_rvalue = 0.;
469 ifd_svalue[0] = '\0';
470 }
471#endif
472 while( lf != '\n' ) status = fscanf(ficon,"%c",&lf) ;
473 skip = True ;
474 } else if( lf != '\n' ) {
475#ifdef CTS17035
476 if( ifd_cond == IFD_COND_SKIP ) skip = True;
477#endif
478 status = fscanf(ficon,"%s%c",iconname,&lf) ;
479 while( lf != '\n' ) status = fscanf(ficon,"%c",&lf) ;
480 if( iconname[0] == '#' ) {
481 fprintf(stderr,"*Xw_load_icons*Unimplemented Default Icon Name %s\n",
482 filename);
483 }
484 } else {
485 skip = True ;
486 }
487
488 if( ferror(ficon) ) break ;
489
490 if( skip ) continue ;
491 piconinfo = Xw_put_icon (pwindow,iconname) ;
492 if( piconinfo ) {
493 piconinfo->pfile = (char*) strdup(filename);
494#ifdef PRO16753
495 nicons++;
496#endif
497 }
498 }
499
500 fclose(ficon) ;
501
502
503#ifdef TRACE_LOAD_ICONS
504if( Xw_get_trace() ) {
505 printf (" %d = Xw_load_icons(%lx,'%s')\n",nicons,(long ) pwindow,dirname);
506}
507#endif
508
509 return (nicons);
510}
511
512#ifdef XW_PROTOTYPE
513static XW_EXT_ICON* Xw_put_icon(XW_EXT_WINDOW* pwindow,char* iconname)
514#else
515static XW_EXT_ICON* Xw_put_icon(pwindow,iconname)
516XW_EXT_WINDOW *pwindow ;
517char *iconname ;
518#endif /*XW_PROTOTYPE*/
519{
520XW_EXT_ICON *piconinfo ;
521
522 piconinfo = (XW_EXT_ICON*) Xw_malloc(sizeof(XW_EXT_ICON)) ;
523
524 if( piconinfo ) {
525 piconinfo->type = ICON_TYPE ;
526 piconinfo->pname = (char*) strdup(iconname);
527 piconinfo->pfile = NULL;
528 piconinfo->pimage = NULL ;
529 piconinfo->pixmap = 0 ;
530 piconinfo->update = 0 ;
531 piconinfo->link = pwindow->other;
532 pwindow->other = piconinfo;
533 } else {
534 /*ERROR*EXT_ICON allocation failed*/
535 Xw_set_error(101,"Xw_put_icon",NULL) ;
536 return (NULL) ;
537 }
538
539#ifdef TRACE_PUT_ICON_NAME
540if( Xw_get_trace() > 1 ) {
541 printf (" %lx = Xw_put_icon(%lx,'%s')\n",(long ) piconinfo,(long ) pwindow,iconname);
542}
543#endif
544
545 return (piconinfo) ;
546
547}
548
549#ifdef XW_PROTOTYPE
550static XW_EXT_ICON* Xw_get_icon(XW_EXT_WINDOW* pwindow,char* iconname)
551#else
552static XW_EXT_ICON* Xw_get_icon(pwindow,iconname)
553XW_EXT_WINDOW *pwindow ;
554char *iconname ;
555#endif /*XW_PROTOTYPE*/
556{
557XW_EXT_ICON *piconinfo ;
558
559 for( piconinfo=(XW_EXT_ICON*) pwindow->other ; piconinfo ;
560 piconinfo=(XW_EXT_ICON*) piconinfo->link ) {
561 if( !strcmp(piconinfo->pname,iconname) ) break;
562 }
563
564#ifdef TRACE_GET_ICON
565if( Xw_get_trace() > 1 ) {
566 printf (" %lx = Xw_get_icon(%lx,'%s')\n",(long ) piconinfo,(long ) pwindow,iconname);
567}
568#endif
569
570 return (piconinfo) ;
571
572}
573
574#ifdef XW_PROTOTYPE
575static XW_STATUS Xw_del_icon(XW_EXT_WINDOW* pwindow,char* iconname)
576#else
577static XW_STATUS Xw_del_icon(pwindow,iconname)
578XW_EXT_WINDOW *pwindow ;
579char *iconname ;
580#endif /*XW_PROTOTYPE*/
581{
582XW_EXT_ICON *piconinfo,*qiconinfo = (XW_EXT_ICON*) pwindow->other ;
583XW_STATUS status = XW_SUCCESS;
584
585 for( piconinfo=qiconinfo ; piconinfo ;
586 qiconinfo=piconinfo,piconinfo=(XW_EXT_ICON*) piconinfo->link ) {
587 if( !strcmp(piconinfo->pname,iconname) ) break;
588 }
589
590 if( piconinfo ) {
591 if( piconinfo == qiconinfo ) {
592 pwindow->other = piconinfo->link;
593 } else {
594 qiconinfo->link = piconinfo->link;
595 }
596 if( piconinfo->pname ) Xw_free(piconinfo->pname);
597 if( piconinfo->pfile ) Xw_free(piconinfo->pfile);
598 if( piconinfo->pixmap ) XFreePixmap(_DISPLAY,piconinfo->pixmap);
599 if( piconinfo->pimage ) Xw_close_image(piconinfo->pimage);
600 Xw_free(piconinfo);
601 } else {
602 status = XW_ERROR;
603 }
604
605#ifdef TRACE_DEL_ICON
606if( Xw_get_trace() > 1 ) {
607 printf (" %d = Xw_get_icon(%lx,'%s')\n",status,(long ) pwindow,iconname);
608}
609#endif
610
611 return (status) ;
612
613}
614
615#ifdef XW_PROTOTYPE
616XW_STATUS Xw_put_window_icon(void* awindow,void *fwindow,char* iconname,int width,int height)
617#else
618XW_STATUS Xw_put_window_icon(awindow,fwindow,iconname,width,height)
619void *awindow ;
620void *fwindow ;
621char *iconname ;
622int width;
623int height;
624#endif /*XW_PROTOTYPE*/
625{
626XW_EXT_WINDOW *pwindow = (XW_EXT_WINDOW*)awindow ;
627XW_EXT_WINDOW *qwindow = (XW_EXT_WINDOW*)fwindow ;
628XW_EXT_DISPLAY *pdisplay;
629XW_EXT_IMAGEDATA *pimage ;
630XW_EXT_ICON *piconinfo = NULL;
631XW_WINDOWSTATE state ;
632XW_STATUS status ;
633//int iimage,iwidth,iheight,wxc,wyc,wwidth,wheight ;
634int iwidth,iheight,wxc,wyc,wwidth,wheight ;
635float xi,yi ;
636//unsigned long bpixel = 0;
637#ifdef PERF01
638time_t t_start,t_finish;
639#endif
640
641 if( !Xw_isdefine_window(pwindow) ) {
642 /*ERROR*Bad EXT_WINDOW Address*/
643 Xw_set_error(24,"Xw_put_window_icon",pwindow) ;
644 return (XW_ERROR) ;
645 }
646
647 if( !Xw_isdefine_window(qwindow) ) {
648 /*ERROR*Bad EXT_WINDOW Address*/
649 Xw_set_error(24,"Xw_put_window_icon",qwindow) ;
650 return (XW_ERROR) ;
651 }
652
653 piconinfo = Xw_get_icon(pwindow,iconname) ;
654
655 if( piconinfo ) { /* Take the same place for the new icon */
656 if( piconinfo->pimage ) Xw_close_image(piconinfo->pimage);
657// piconinfo->pimage = NULL;
658 piconinfo->pimage = 0;
659 if( piconinfo->pixmap ) XFreePixmap(_DISPLAY,piconinfo->pixmap);
660// piconinfo->pixmap = NULL;
661 piconinfo->pixmap = 0;
662 } else {
663 piconinfo = Xw_put_icon(pwindow,iconname) ;
664 if( !piconinfo ) {
665 return (XW_ERROR) ;
666 }
667 }
668
669 pdisplay = pwindow->connexion;
670 if( width <= 0 ) width = _DWIDTH;
671 if( height <= 0 ) height = _DHEIGHT;
672
673 state = Xw_get_window_position(qwindow,
674 &wxc,&wyc,&wwidth,&wheight) ;
675
676 status = Xw_get_window_pixelcoord(qwindow,wwidth/2,wheight/2,&xi,&yi) ;
677
678#ifdef PERF01
679 time(&t_start);
680#endif
681 pimage = (XW_EXT_IMAGEDATA*) Xw_get_image (qwindow,NULL,(int)xi,(int)yi,wwidth,wheight) ;
682
683 if( !pimage || !_IIMAGE ) {
684 Xw_del_icon(pwindow,iconname) ;
685 return (XW_ERROR) ;
686 }
687#ifdef PERF01
688 time(&t_finish);
689 printf(" Image CAPTURE time is %lf\n",difftime(t_finish,t_start));
690#endif
691
692 status = XW_SUCCESS ;
693 piconinfo->pimage = pimage;
694 piconinfo->update = True;
695 iwidth = _IIMAGE->width ;
696 iheight = _IIMAGE->height ;
697 if( iwidth > width || iheight > width ) { /* ZOOM Icon */
698 float zoom = (float)min(width,height)/(float)max(iwidth,iheight) ;
699#ifdef PERF01
700 time(&t_start);
701#endif
702 status = Xw_zoom_image(pimage,zoom) ;
703 if( _ZIMAGE && (_ZIMAGE != _IIMAGE) ) {
704 XDestroyImage(_IIMAGE);
705 pimage->zoom = 1.;
706 _IIMAGE = _ZIMAGE;
707 _ZIMAGE = NULL;
708 }
709
710#ifdef PERF01
711 time(&t_finish);
712 printf(" Image ZOOM time is %lf\n",difftime(t_finish,t_start));
713#endif
714 }
715
716#ifdef PERF01
717 time(&t_start);
718#endif
719 status = Xw_convert_image(pwindow,pimage,NULL,0) ;
720#ifdef PERF01
721 time(&t_finish);
722 printf(" Image CONVERT time is %lf\n",difftime(t_finish,t_start));
723#endif
724 if( !status ) {
725 Xw_del_icon(pwindow,iconname) ;
726 Xw_set_error(114,"Xw_put_window_icon",NULL) ;
727 return (XW_ERROR) ;
728 }
729
730 if( ShowIconBox == 'Y' ) Xw_show_icons(pwindow) ;
731
732#ifdef TRACE_PUT_WINDOW_ICON
733if( Xw_get_trace() ) {
734 printf (" %d = Xw_put_window_icons(%lx,%lx,'%s',%d,%d)\n",
735 status,(long ) awindow,(long ) qwindow,iconname,width,height);
736}
737#endif
738
739 return (status) ;
740}
741
742#ifdef XW_PROTOTYPE
743XW_STATUS Xw_show_icons (void* awindow)
744#else
745XW_STATUS Xw_show_icons (awindow)
746void *awindow ;
747#endif /*XW_PROTOTYPE*/
748{
749XW_EXT_WINDOW *pwindow = (XW_EXT_WINDOW*)awindow ;
750XW_EXT_IMAGEDATA *pimage;
751XW_EXT_ICON *piconinfo ;
752//XW_WINDOWSTATE state ;
753XW_STATUS status ;
754float xi,yi,tw,th,x0,y0,iw,ih ;
755//int i,j,n,wxc,wyc,wsize,wxi,wyi,nimage = 0,maximagewidth = 0,maximageheight = 0 ;
756int i,j,wxc,wyc,wsize,wxi,wyi,nimage = 0,maximagewidth = 0,maximageheight = 0 ;
757
758 if( !Xw_isdefine_window(pwindow) ) {
759 /*ERROR*Bad EXT_WINDOW Address*/
760 Xw_set_error(25,"Xw_show_icons",pwindow) ;
761 return (XW_ERROR) ;
762 }
763
764 /* Compute IconBox Size */
765 for( piconinfo=(XW_EXT_ICON*) pwindow->other ; piconinfo ;
766 piconinfo=(XW_EXT_ICON*) piconinfo->link ) {
767 if(( pimage = piconinfo->pimage )) {
768 nimage++;
769 maximagewidth = max(maximagewidth,_IIMAGE->width);
770 maximageheight = max(maximageheight,_IIMAGE->height);
771 }
772 }
773
774 if( !nimage ) {
775 /*ERROR*EMPTY IconBox*/
776 Xw_set_error(102,"Xw_show_icons",0) ;
777 return (XW_ERROR) ;
778 }
779
780
781 {
782 int wwidth,wheight,usize = 1+(int)sqrt((double)nimage-1) ;
783 XW_WINDOWSTATE state ;
784
785 state = Xw_get_window_position(pwindow,
786 &wxc,&wyc,&wwidth,&wheight) ;
787 wsize = min(wwidth,wheight)/max(maximagewidth,maximageheight) ;
788
789 if( usize > wsize ) { /* Grows IconBox */
790 wsize = usize ;
791 status = Xw_set_window_position(pwindow,
792 wxc,wyc,wsize*maximagewidth,wsize*maximageheight) ;
793 Xw_resize_window(pwindow) ;
794 }
795 }
796
797 /* POP and erase IconBox */
798 status = Xw_set_window_state(pwindow,XW_POP) ;
799
800 status = Xw_erase_window(pwindow) ;
801
802 nimage = 0 ;
803 for( piconinfo=(XW_EXT_ICON*) pwindow->other ; piconinfo ;
804 piconinfo=(XW_EXT_ICON*) piconinfo->link ) {
805 if(( pimage = piconinfo->pimage )) {
806 i = nimage%wsize ; j = nimage/wsize ;
807 wxi = i*maximagewidth+maximagewidth/2 ;
808 wyi = j*maximageheight+maximageheight/2 ;
809 status = Xw_get_window_pixelcoord(pwindow,wxi,wyi,&xi,&yi) ;
810 Xw_draw_image(pwindow,piconinfo->pimage,xi,yi) ;
811 Xw_get_text_size(pwindow,0,piconinfo->pname,&tw,&th,&x0,&y0) ;
812 Xw_draw_text(pwindow,xi-tw/2.,yi-th/2.,piconinfo->pname,0.,0) ;
813 iw = Xw_get_window_pixelvalue(pwindow,_IIMAGE->width) ;
814 ih = Xw_get_window_pixelvalue(pwindow,_IIMAGE->height) ;
815 Xw_begin_line(pwindow,5) ;
816 Xw_line_point(pwindow,xi-iw/2.,yi-ih/2.) ;
817 Xw_line_point(pwindow,xi-iw/2.,yi+ih/2.) ;
818 Xw_line_point(pwindow,xi+iw/2.,yi+ih/2.) ;
819 Xw_line_point(pwindow,xi+iw/2.,yi-ih/2.) ;
820 Xw_line_point(pwindow,xi-iw/2.,yi-ih/2.) ;
821 Xw_close_line(pwindow) ;
822 }
823 }
824
825 Xw_flush(pwindow,False) ;
826
827#ifdef TRACE_SHOW_ICONS
828if( Xw_get_trace() ) {
829 printf (" Xw_show_icons(%lx)\n",(long ) awindow);
830}
831#endif
832
833 return (XW_SUCCESS) ;
834}
835
836#ifdef XW_PROTOTYPE
837int Xw_save_icons (void* awindow)
838#else
839int Xw_save_icons (awindow)
840void *awindow ;
841#endif /*XW_PROTOTYPE*/
842{
843XW_EXT_WINDOW *pwindow = (XW_EXT_WINDOW*)awindow ;
844//XW_EXT_IMAGEDATA *pimage ;
845//XW_EXT_IMAGE *pimaglist ;
846XW_EXT_ICON *piconinfo ;
847//int n,nimage = 0 ;
848int nimage = 0 ;
849//XW_STATUS status;
850
851 if( !Xw_isdefine_window(pwindow) ) {
852 /*ERROR*Bad EXT_WINDOW Address*/
853 Xw_set_error(25,"Xw_save_icons",pwindow) ;
854 return (0) ;
855 }
856
857 for( piconinfo=(XW_EXT_ICON*) pwindow->other ; piconinfo ;
858 piconinfo=(XW_EXT_ICON*) piconinfo->link ) {
859 if( piconinfo->pimage && piconinfo->update ) {
860 if( Xw_save_image(pwindow,piconinfo->pimage,piconinfo->pname) ) {
861 nimage++;
862 piconinfo->update = False;
863 }
864 }
865 }
866
867#ifdef TRACE_SAVE_ICONS
868if( Xw_get_trace() ) {
869 printf (" %d = Xw_save_icons(%lx)\n",nimage,(long ) awindow);
870}
871#endif
872
873 return (nimage) ;
874}
875
876#ifdef XW_PROTOTYPE
877int Xw_clear_icons (void* awindow,char *dirname)
878#else
879int Xw_clear_icons (awindow,dirname)
880void *awindow ;
881char *dirname;
882#endif /*XW_PROTOTYPE*/
883{
884XW_EXT_WINDOW *pwindow = (XW_EXT_WINDOW*)awindow ;
885XW_EXT_ICON *piconinfo,*qiconinfo ;
886int status ;
887FILE *ficon = NULL;
888char *pname,filename[256],iconname[80],lf ;
889//int n,f,skip,nicons = 0 ;
890int skip,nicons = 0 ;
891
892 if( !Xw_isdefine_window(pwindow) ) {
893 /*ERROR*Bad EXT_WINDOW Address*/
894 Xw_set_error(24,"Xw_clear_icons",pwindow) ;
895 return (0) ;
896 }
897
898 if( dirname && (int)strlen(dirname) > 0 ) {
899
900 pname = Xw_get_filename(dirname,"ifd") ;
901
902 if( pname ) ficon = fopen(pname,"r") ;
903
904 if( !ficon ) {
905 /*ERROR*Bad ICON File Directory Name */
906 Xw_set_error(100,"Xw_clear_icons",pname) ;
907 return (0) ;
908 }
909
910#ifndef PRO16753
911 Xw_free(pname) ;
912#endif
913 /* READ Icon File Directory */
914 while( !feof(ficon) ) {
915 skip = False ;
916 status = fscanf(ficon,"%s%c",filename,&lf) ;
917 if( filename[0] == '#' ) {
918 while( lf != '\n' ) status = fscanf(ficon,"%c",&lf) ;
919 skip = True ;
920 } else if( lf != '\n' ) {
921 status = fscanf(ficon,"%s%c",iconname,&lf) ;
922 while( lf != '\n' ) status = fscanf(ficon,"%c",&lf) ;
923 if( iconname[0] == '#' ) {
924 fprintf(stderr,"*Xw_load_icons*Unimplemented Default Icon Name %s\n",
925 filename);
926 }
927 } else {
928 skip = True ;
929 }
930
931 if( ferror(ficon) ) break ;
932
933 if( skip ) continue ;
934
935 Xw_del_icon(pwindow,iconname);
936
937 }
938
939 fclose(ficon) ;
940 } else if( pwindow->other ) {
941 for( piconinfo=(XW_EXT_ICON*) pwindow->other ; piconinfo ;
942 piconinfo=qiconinfo ) {
943 qiconinfo = (XW_EXT_ICON*) piconinfo->link;
944 nicons++;
945 if( piconinfo->pname ) Xw_free(piconinfo->pname);
946 if( piconinfo->pfile ) Xw_free(piconinfo->pfile);
947 if( piconinfo->pixmap ) XFreePixmap(_DISPLAY,piconinfo->pixmap);
948 if( piconinfo->pimage ) Xw_close_image(piconinfo->pimage);
949 Xw_free(piconinfo);
950 }
951 pwindow->other = NULL;
952 }
953
954 if( nicons && ShowIconBox == 'Y' ) Xw_show_icons(pwindow) ;
955
956#ifdef TRACE_CLEAR_ICONS
957if( Xw_get_trace() ) {
958 if( dirname )
959 printf (" %d = Xw_clear_icons(%lx,'%s')\n",nicons,(long ) awindow,dirname);
960 else
961 printf (" %d = Xw_clear_icons(%lx,NULL)\n",nicons,(long ) awindow);
962}
963#endif
964
965 return (nicons) ;
966}
967
968#ifdef XW_PROTOTYPE
969static Aspect_Handle Xw_create_icon_pixmap (XW_EXT_WINDOW* pwindow,int width,int height,XW_EXT_IMAGEDATA *pimage)
970#else
971static Aspect_Handle Xw_create_icon_pixmap ( pwindow,width,height,pimage)
972XW_EXT_WINDOW* pwindow ;
973int width ;
974int height ;
975XW_EXT_IMAGEDATA *pimage;
976#endif /*XW_PROTOTYPE*/
977{
978XImage *pximage = (_ZIMAGE) ? _ZIMAGE : _IIMAGE ;
979Pixmap pixmap ;
980int iwidth = pximage->width ;
981int iheight = pximage->height ;
982int wx,wy,ix,iy ;
983int error,gravity ;
984char *serror;
985
986 if( width == 0 ) width = iwidth ;
987 wx = (width - iwidth)/2 ; ix = 0 ;
988 if( wx < 0 ) {
989 ix = -wx ; wx = 0 ; iwidth = width ;
990 }
991
992 if( height == 0 ) height = iheight ;
993 wy = (height - iheight)/2 ; iy = 0 ;
994 if( wy < 0 ) {
995 iy = -wy ; wy = 0 ; iheight = height ;
996 }
997
998 Xw_print_error();
999 if( !Xw_get_trace() ) Xw_set_synchronize(_DISPLAY,True) ;
1000 pixmap = XCreatePixmap(_DISPLAY,_WINDOW,width,height,_DEPTH) ;
1001 if( !Xw_get_trace() ) Xw_set_synchronize(_DISPLAY,False) ;
1002
1003 serror = Xw_get_error(&error,&gravity);
1004 if( !pixmap || (error > 1000) ) {
1005 Xw_set_error(104,"Xw_create_icon_pixmap",0) ;
1006 return (0) ;
1007 }
1008
1009 if( wx > 0 || wy > 0 ) {
1010 XFillRectangle(_DISPLAY,pixmap,pwindow->qgwind.gccopy,
1011 0,0,width,height) ;
1012 }
1013
1014 XPutImage(_DISPLAY,pixmap,pwindow->qgwind.gccopy,
1015 pximage,ix,iy,wx,wy,iwidth,iheight) ;
1016
1017#ifdef PRO16753
1018 XFlush(_DISPLAY);
1019#endif
1020
1021
1022#ifdef TRACE_CREATE_ICON_PIXMAP
1023if( Xw_get_trace() ) {
1024 printf (" %lx = Xw_create_icon_pixmap(%lx,%d,%d,%lx)\n",
1025 (long ) pixmap,(long ) pwindow,width,height,(long ) pimage);
1026}
1027#endif
1028
1029 return pixmap ;
1030}
1031
1032#ifdef XW_PROTOTYPE
1033Aspect_Handle Xw_get_icon_pixmap (void* awindow,int width,int height,char* filename)
1034#else
1035Aspect_Handle Xw_get_icon_pixmap ( awindow,width,height,filename)
1036void* awindow ;
1037int width ;
1038int height ;
1039char* filename ;
1040#endif /*XW_PROTOTYPE*/
1041{
1042XW_EXT_WINDOW *pwindow = (XW_EXT_WINDOW*)awindow ;
1043XW_EXT_ICON *piconinfo ;
1044//XW_STATUS status ;
1045char iconname[256];
1046char *piconname = filename;
1047
1048 if( !Xw_isdefine_window(pwindow) ) {
1049 /*ERROR*Bad EXT_WINDOW Address*/
1050 Xw_set_error(24,"Xw_get_icon_pixmap",pwindow) ;
1051 return (0) ;
1052 }
1053
1054 if( !filename || (int)strlen(filename) <= 0 ) {
1055 /*ERROR*Bad Icon Name*/
1056 Xw_set_error(103,"Xw_get_icon_pixmap",filename) ;
1057 return (0) ;
1058 }
1059 /* Get icon directly from the file */
1060 if( filename[0] == '/' || filename[0] == '$' ) {
1061 char *ps1 = strrchr(filename,'/');
1062 char *ps2 = strrchr(filename,'.');
1063 if( !ps1 ) {
1064 /*ERROR*Bad Icon Name*/
1065 Xw_set_error(103,"Xw_get_icon_pixmap",filename) ;
1066 return (0) ;
1067 }
1068 ps1++;
1069 if( ps2 ) {
1070 int n = min(256,ps2-ps1);
1071 strncpy(iconname,filename,n);
1072 } else {
1073 strcpy(iconname,ps1);
1074 }
1075 piconname = iconname;
1076 }
1077
1078 if( !(piconinfo = Xw_get_icon(pwindow,piconname)) ) {
1079 /* Add a new icon in icon-box */
1080 piconinfo = Xw_put_icon(pwindow,piconname);
1081 if( piconinfo ) {
1082 piconinfo->pfile = (char*) strdup(filename);
1083 } else {
1084 return 0;
1085 }
1086 }
1087
1088 if( !piconinfo->pixmap ) {
1089 XW_EXT_IMAGEDATA *pimage;
1090 if( !piconinfo->pimage ) {
1091 piconinfo->pimage = (XW_EXT_IMAGEDATA*)
1092 Xw_load_image (pwindow,NULL,piconinfo->pfile) ;
1093 }
1094
1095 if(( pimage = piconinfo->pimage )) {
1096 XImage *pximage = (_ZIMAGE) ? _ZIMAGE : _IIMAGE ;
1097 if( width == 0 ) width = pximage->width ;
1098 if( height == 0 ) height = pximage->height ;
1099 piconinfo->pixmap =
1100 Xw_create_icon_pixmap(pwindow,width,height,piconinfo->pimage) ;
1101 }
1102 }
1103
1104#ifdef TRACE_GET_ICON_PIXMAP
1105if( Xw_get_trace() ) {
1106 printf (" %lx = Xw_get_icon_pixmap(%lx,%d,%d,'%s')\n",
1107 (long ) piconinfo->pixmap,(long ) awindow,width,height,filename);
1108}
1109#endif
1110
1111 return (piconinfo->pixmap) ;
1112}
1113
1114#ifdef XW_PROTOTYPE
1115XW_STATUS Xw_get_icon_size (void* awindow,char* iconname,int *width,int *height)
1116#else
1117XW_STATUS Xw_get_icon_size ( awindow,iconname,width,height)
1118void* awindow ;
1119char* iconname ;
1120int *width ;
1121int *height ;
1122#endif /*XW_PROTOTYPE*/
1123{
1124XW_EXT_WINDOW *pwindow = (XW_EXT_WINDOW*)awindow ;
1125XW_EXT_ICON *piconinfo ;
1126XW_EXT_IMAGEDATA *pimage ;
1127
1128 if( !Xw_isdefine_window(pwindow) ) {
1129 /*ERROR*Bad EXT_WINDOW Address*/
1130 Xw_set_error(24,"Xw_get_icon_size",pwindow) ;
1131 return (XW_ERROR) ;
1132 }
1133
1134 *width = *height = 0;
1135
1136 if(( piconinfo = Xw_get_icon(pwindow,iconname) )) {
1137 if( !piconinfo->pimage ) {
1138 piconinfo->pimage = (XW_EXT_IMAGEDATA*)
1139 Xw_load_image (pwindow,NULL,piconinfo->pfile) ;
1140 }
1141
1142 if(( pimage = piconinfo->pimage )) {
1143 *width = _IIMAGE->width ;
1144 *height = _IIMAGE->height ;
1145 } else {
1146 return (XW_ERROR) ;
1147 }
1148 } else {
1149 /*ERROR*Bad Icon Name*/
1150 Xw_set_error(103,"Xw_get_icon_size",iconname) ;
1151 return (XW_ERROR) ;
1152 }
1153
1154#ifdef TRACE_GET_ICON_PIXMAP
1155if( Xw_get_trace() ) {
1156 printf (" Xw_get_icon_size(%lx,'%s',%d,%d)\n",
1157 (long ) awindow,iconname,*width,*height);
1158}
1159#endif
1160
1161 return (XW_SUCCESS) ;
1162}
1163
1164#ifdef XW_PROTOTYPE
1165char* Xw_get_icon_name (void* awindow,int index)
1166#else
1167char* Xw_get_icon_name ( awindow,index)
1168void* awindow ;
1169int index ;
1170#endif /*XW_PROTOTYPE*/
1171{
1172XW_EXT_WINDOW *pwindow = (XW_EXT_WINDOW*)awindow ;
1173XW_EXT_ICON *piconinfo ;
1174char *iconname ;
1175int n ;
1176
1177 if( !Xw_isdefine_window(pwindow) ) {
1178 /*ERROR*Bad EXT_WINDOW Address*/
1179 Xw_set_error(24,"Xw_get_icon_name",pwindow) ;
1180 return (NULL) ;
1181 }
1182
1183 for( n=1,piconinfo=(XW_EXT_ICON*) pwindow->other ; piconinfo ;
1184 piconinfo = (XW_EXT_ICON*) piconinfo->link,n++ ) {
1185 if( n == index ) break;
1186 }
1187
1188 if( !piconinfo ) {
1189 /*ERROR*Bad Icon index*/
1190 Xw_set_error(106,"Xw_get_icon_name",&index) ;
1191 return (NULL) ;
1192 }
1193
1194 iconname = piconinfo->pname ;
1195
1196#ifdef TRACE_GET_ICON_NAME
1197if( Xw_get_trace() ) {
1198 printf (" '%s' = Xw_get_icon_name(%lx,%d)\n",iconname,(long ) awindow,index);
1199}
1200#endif
1201
1202 return (iconname) ;
1203}