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 | |
188 | static 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 |
195 | static 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 |
205 | static int ifd_cond = IFD_COND_UNKNOWN; |
206 | static int ifd_ivalue = 0; |
207 | static float ifd_rvalue = 0.; |
208 | static char ifd_svalue[256]; |
209 | #endif |
210 | |
211 | // Unused : |
212 | #ifdef DEB |
213 | #ifdef XW_PROTOTYPE |
214 | static int Strcmp(char* cs1,char* cs2) /* For optimization */ |
215 | #else |
216 | static int Strcmp(cs1,cs2) /* For optimization */ |
217 | char *cs1,*cs2; |
218 | #endif |
219 | { |
220 | union { |
221 | int *i; |
222 | char *c; |
223 | } u1,u2; |
224 | int 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 |
243 | static XW_EXT_ICON* Xw_put_icon(XW_EXT_WINDOW* awindow,char* iconname); |
244 | static XW_EXT_ICON* Xw_get_icon(XW_EXT_WINDOW* awindow,char* iconname); |
245 | static XW_STATUS Xw_del_icon(XW_EXT_WINDOW* awindow,char* iconname); |
246 | static Aspect_Handle Xw_create_icon_pixmap (XW_EXT_WINDOW* awindow,int width,int height,XW_EXT_IMAGEDATA *pimage); |
247 | #else |
248 | static XW_EXT_ICON* Xw_put_icon(); |
249 | static XW_EXT_ICON* Xw_get_icon(); |
250 | static XW_STATUS Xw_del_icon(); |
251 | static Aspect_Handle Xw_create_icon_pixmap(); |
252 | #endif /*XW_PROTOTYPE*/ |
253 | |
254 | #ifdef XW_PROTOTYPE |
255 | int Xw_load_icons (void *awindow,char *dirname) |
256 | #else |
257 | int Xw_load_icons (awindow,dirname) |
258 | void *awindow; |
259 | char *dirname ; |
260 | #endif /*XW_PROTOTYPE*/ |
261 | { |
262 | XW_EXT_WINDOW *pwindow = (XW_EXT_WINDOW*)awindow; |
263 | XW_EXT_ICON *piconinfo; |
264 | int status ; |
265 | //Window window ; |
266 | FILE *ficon = NULL; |
267 | char *pname,filename[80],iconname[80],lf ; |
268 | int skip,index,nicons = 0 ; |
269 | float 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 |
504 | if( 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 |
513 | static XW_EXT_ICON* Xw_put_icon(XW_EXT_WINDOW* pwindow,char* iconname) |
514 | #else |
515 | static XW_EXT_ICON* Xw_put_icon(pwindow,iconname) |
516 | XW_EXT_WINDOW *pwindow ; |
517 | char *iconname ; |
518 | #endif /*XW_PROTOTYPE*/ |
519 | { |
520 | XW_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 |
540 | if( 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 |
550 | static XW_EXT_ICON* Xw_get_icon(XW_EXT_WINDOW* pwindow,char* iconname) |
551 | #else |
552 | static XW_EXT_ICON* Xw_get_icon(pwindow,iconname) |
553 | XW_EXT_WINDOW *pwindow ; |
554 | char *iconname ; |
555 | #endif /*XW_PROTOTYPE*/ |
556 | { |
557 | XW_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 |
565 | if( 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 |
575 | static XW_STATUS Xw_del_icon(XW_EXT_WINDOW* pwindow,char* iconname) |
576 | #else |
577 | static XW_STATUS Xw_del_icon(pwindow,iconname) |
578 | XW_EXT_WINDOW *pwindow ; |
579 | char *iconname ; |
580 | #endif /*XW_PROTOTYPE*/ |
581 | { |
582 | XW_EXT_ICON *piconinfo,*qiconinfo = (XW_EXT_ICON*) pwindow->other ; |
583 | XW_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 |
606 | if( 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 |
616 | XW_STATUS Xw_put_window_icon(void* awindow,void *fwindow,char* iconname,int width,int height) |
617 | #else |
618 | XW_STATUS Xw_put_window_icon(awindow,fwindow,iconname,width,height) |
619 | void *awindow ; |
620 | void *fwindow ; |
621 | char *iconname ; |
622 | int width; |
623 | int height; |
624 | #endif /*XW_PROTOTYPE*/ |
625 | { |
626 | XW_EXT_WINDOW *pwindow = (XW_EXT_WINDOW*)awindow ; |
627 | XW_EXT_WINDOW *qwindow = (XW_EXT_WINDOW*)fwindow ; |
628 | XW_EXT_DISPLAY *pdisplay; |
629 | XW_EXT_IMAGEDATA *pimage ; |
630 | XW_EXT_ICON *piconinfo = NULL; |
631 | XW_WINDOWSTATE state ; |
632 | XW_STATUS status ; |
633 | //int iimage,iwidth,iheight,wxc,wyc,wwidth,wheight ; |
634 | int iwidth,iheight,wxc,wyc,wwidth,wheight ; |
635 | float xi,yi ; |
636 | //unsigned long bpixel = 0; |
637 | #ifdef PERF01 |
638 | time_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 |
733 | if( 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 |
743 | XW_STATUS Xw_show_icons (void* awindow) |
744 | #else |
745 | XW_STATUS Xw_show_icons (awindow) |
746 | void *awindow ; |
747 | #endif /*XW_PROTOTYPE*/ |
748 | { |
749 | XW_EXT_WINDOW *pwindow = (XW_EXT_WINDOW*)awindow ; |
750 | XW_EXT_IMAGEDATA *pimage; |
751 | XW_EXT_ICON *piconinfo ; |
752 | //XW_WINDOWSTATE state ; |
753 | XW_STATUS status ; |
754 | float xi,yi,tw,th,x0,y0,iw,ih ; |
755 | //int i,j,n,wxc,wyc,wsize,wxi,wyi,nimage = 0,maximagewidth = 0,maximageheight = 0 ; |
756 | int 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 |
828 | if( 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 |
837 | int Xw_save_icons (void* awindow) |
838 | #else |
839 | int Xw_save_icons (awindow) |
840 | void *awindow ; |
841 | #endif /*XW_PROTOTYPE*/ |
842 | { |
843 | XW_EXT_WINDOW *pwindow = (XW_EXT_WINDOW*)awindow ; |
844 | //XW_EXT_IMAGEDATA *pimage ; |
845 | //XW_EXT_IMAGE *pimaglist ; |
846 | XW_EXT_ICON *piconinfo ; |
847 | //int n,nimage = 0 ; |
848 | int 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 |
868 | if( 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 |
877 | int Xw_clear_icons (void* awindow,char *dirname) |
878 | #else |
879 | int Xw_clear_icons (awindow,dirname) |
880 | void *awindow ; |
881 | char *dirname; |
882 | #endif /*XW_PROTOTYPE*/ |
883 | { |
884 | XW_EXT_WINDOW *pwindow = (XW_EXT_WINDOW*)awindow ; |
885 | XW_EXT_ICON *piconinfo,*qiconinfo ; |
886 | int status ; |
887 | FILE *ficon = NULL; |
888 | char *pname,filename[256],iconname[80],lf ; |
889 | //int n,f,skip,nicons = 0 ; |
890 | int 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 |
957 | if( 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 |
969 | static Aspect_Handle Xw_create_icon_pixmap (XW_EXT_WINDOW* pwindow,int width,int height,XW_EXT_IMAGEDATA *pimage) |
970 | #else |
971 | static Aspect_Handle Xw_create_icon_pixmap ( pwindow,width,height,pimage) |
972 | XW_EXT_WINDOW* pwindow ; |
973 | int width ; |
974 | int height ; |
975 | XW_EXT_IMAGEDATA *pimage; |
976 | #endif /*XW_PROTOTYPE*/ |
977 | { |
978 | XImage *pximage = (_ZIMAGE) ? _ZIMAGE : _IIMAGE ; |
979 | Pixmap pixmap ; |
980 | int iwidth = pximage->width ; |
981 | int iheight = pximage->height ; |
982 | int wx,wy,ix,iy ; |
983 | int error,gravity ; |
984 | char *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 |
1023 | if( 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 |
1033 | Aspect_Handle Xw_get_icon_pixmap (void* awindow,int width,int height,char* filename) |
1034 | #else |
1035 | Aspect_Handle Xw_get_icon_pixmap ( awindow,width,height,filename) |
1036 | void* awindow ; |
1037 | int width ; |
1038 | int height ; |
1039 | char* filename ; |
1040 | #endif /*XW_PROTOTYPE*/ |
1041 | { |
1042 | XW_EXT_WINDOW *pwindow = (XW_EXT_WINDOW*)awindow ; |
1043 | XW_EXT_ICON *piconinfo ; |
1044 | //XW_STATUS status ; |
1045 | char iconname[256]; |
1046 | char *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 |
1105 | if( 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 |
1115 | XW_STATUS Xw_get_icon_size (void* awindow,char* iconname,int *width,int *height) |
1116 | #else |
1117 | XW_STATUS Xw_get_icon_size ( awindow,iconname,width,height) |
1118 | void* awindow ; |
1119 | char* iconname ; |
1120 | int *width ; |
1121 | int *height ; |
1122 | #endif /*XW_PROTOTYPE*/ |
1123 | { |
1124 | XW_EXT_WINDOW *pwindow = (XW_EXT_WINDOW*)awindow ; |
1125 | XW_EXT_ICON *piconinfo ; |
1126 | XW_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 |
1155 | if( 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 |
1165 | char* Xw_get_icon_name (void* awindow,int index) |
1166 | #else |
1167 | char* Xw_get_icon_name ( awindow,index) |
1168 | void* awindow ; |
1169 | int index ; |
1170 | #endif /*XW_PROTOTYPE*/ |
1171 | { |
1172 | XW_EXT_WINDOW *pwindow = (XW_EXT_WINDOW*)awindow ; |
1173 | XW_EXT_ICON *piconinfo ; |
1174 | char *iconname ; |
1175 | int 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 |
1197 | if( 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 | } |