comparison src/glyphs-x.c @ 412:697ef44129c6 r21-2-14

Import from CVS: tag r21-2-14
author cvs
date Mon, 13 Aug 2007 11:20:41 +0200
parents de805c49cfc1
children 41dbb7a9d5f2
comparison
equal deleted inserted replaced
411:12e008d41344 412:697ef44129c6
2 Copyright (C) 1993, 1994 Free Software Foundation, Inc. 2 Copyright (C) 1993, 1994 Free Software Foundation, Inc.
3 Copyright (C) 1995 Board of Trustees, University of Illinois. 3 Copyright (C) 1995 Board of Trustees, University of Illinois.
4 Copyright (C) 1995 Tinker Systems 4 Copyright (C) 1995 Tinker Systems
5 Copyright (C) 1995, 1996 Ben Wing 5 Copyright (C) 1995, 1996 Ben Wing
6 Copyright (C) 1995 Sun Microsystems 6 Copyright (C) 1995 Sun Microsystems
7 Copyright (C) 1999, 2000 Andy Piper
8 7
9 This file is part of XEmacs. 8 This file is part of XEmacs.
10 9
11 XEmacs is free software; you can redistribute it and/or modify it 10 XEmacs is free software; you can redistribute it and/or modify it
12 under the terms of the GNU General Public License as published by the 11 under the terms of the GNU General Public License as published by the
38 Pointer/icon overhaul, more restructuring by Ben Wing for 19.14 37 Pointer/icon overhaul, more restructuring by Ben Wing for 19.14
39 GIF support changed to external GIFlib 3.1 by Jareth Hein for 21.0 38 GIF support changed to external GIFlib 3.1 by Jareth Hein for 21.0
40 Many changes for color work and optimizations by Jareth Hein for 21.0 39 Many changes for color work and optimizations by Jareth Hein for 21.0
41 Switch of GIF/JPEG/PNG to new EImage intermediate code by Jareth Hein for 21.0 40 Switch of GIF/JPEG/PNG to new EImage intermediate code by Jareth Hein for 21.0
42 TIFF code by Jareth Hein for 21.0 41 TIFF code by Jareth Hein for 21.0
43 GIF/JPEG/PNG/TIFF code moved to new glyph-eimage.c by Andy Piper for 21.0 42 GIF/JPEG/PNG/TIFF code moved to new glyph-eimage.c for 21.0
44 Subwindow and Widget support by Andy Piper for 21.2
45 43
46 TODO: 44 TODO:
47 Support the GrayScale, StaticColor and StaticGray visual classes.
48 Convert images.el to C and stick it in here? 45 Convert images.el to C and stick it in here?
49 */ 46 */
50 47
51 #include <config.h> 48 #include <config.h>
52 #include "lisp.h" 49 #include "lisp.h"
53 #include "lstream.h" 50 #include "lstream.h"
54 #include "console-x.h" 51 #include "console-x.h"
55 #include "glyphs-x.h" 52 #include "glyphs-x.h"
56 #include "objects-x.h" 53 #include "objects-x.h"
57 #ifdef HAVE_WIDGETS
58 #include "gui-x.h"
59 #endif
60 #include "xmu.h" 54 #include "xmu.h"
61 55
62 #include "buffer.h" 56 #include "buffer.h"
63 #include "window.h" 57 #include "window.h"
64 #include "frame.h" 58 #include "frame.h"
65 #include "insdel.h" 59 #include "insdel.h"
66 #include "opaque.h" 60 #include "opaque.h"
67 #include "gui.h"
68 #include "faces.h"
69 61
70 #include "imgproc.h" 62 #include "imgproc.h"
71 63
72 #include "sysfile.h" 64 #include "sysfile.h"
73 65
74 #include <setjmp.h> 66 #include <setjmp.h>
75 67
76 #ifdef FILE_CODING 68 #ifdef FILE_CODING
77 #include "file-coding.h" 69 #include "file-coding.h"
78 #endif 70 #endif
79
80 #ifdef LWLIB_WIDGETS_MOTIF
81 #include <Xm/Xm.h>
82 #endif
83 #include <X11/IntrinsicP.h>
84 71
85 #if INTBITS == 32 72 #if INTBITS == 32
86 # define FOUR_BYTE_TYPE unsigned int 73 # define FOUR_BYTE_TYPE unsigned int
87 #elif LONGBITS == 32 74 #elif LONGBITS == 32
88 # define FOUR_BYTE_TYPE unsigned long 75 # define FOUR_BYTE_TYPE unsigned long
92 #error What kind of strange-ass system are we running on? 79 #error What kind of strange-ass system are we running on?
93 #endif 80 #endif
94 81
95 #define LISP_DEVICE_TO_X_SCREEN(dev) XDefaultScreenOfDisplay (DEVICE_X_DISPLAY (XDEVICE (dev))) 82 #define LISP_DEVICE_TO_X_SCREEN(dev) XDefaultScreenOfDisplay (DEVICE_X_DISPLAY (XDEVICE (dev)))
96 83
97 DECLARE_IMAGE_INSTANTIATOR_FORMAT (nothing);
98 DECLARE_IMAGE_INSTANTIATOR_FORMAT (string);
99 DECLARE_IMAGE_INSTANTIATOR_FORMAT (formatted_string);
100 DECLARE_IMAGE_INSTANTIATOR_FORMAT (inherit);
101 #ifdef HAVE_JPEG
102 DECLARE_IMAGE_INSTANTIATOR_FORMAT (jpeg);
103 #endif
104 #ifdef HAVE_TIFF
105 DECLARE_IMAGE_INSTANTIATOR_FORMAT (tiff);
106 #endif
107 #ifdef HAVE_PNG
108 DECLARE_IMAGE_INSTANTIATOR_FORMAT (png);
109 #endif
110 #ifdef HAVE_GIF
111 DECLARE_IMAGE_INSTANTIATOR_FORMAT (gif);
112 #endif
113 #ifdef HAVE_XPM 84 #ifdef HAVE_XPM
114 DEFINE_DEVICE_IIFORMAT (x, xpm); 85 DEFINE_DEVICE_IIFORMAT (x, xpm);
115 #endif 86 #endif
116 DEFINE_DEVICE_IIFORMAT (x, xbm); 87 DEFINE_DEVICE_IIFORMAT (x, xbm);
117 DEFINE_DEVICE_IIFORMAT (x, subwindow); 88 DEFINE_DEVICE_IIFORMAT (x, subwindow);
123 Lisp_Object Qcursor_font; 94 Lisp_Object Qcursor_font;
124 95
125 DEFINE_IMAGE_INSTANTIATOR_FORMAT (font); 96 DEFINE_IMAGE_INSTANTIATOR_FORMAT (font);
126 97
127 DEFINE_IMAGE_INSTANTIATOR_FORMAT (autodetect); 98 DEFINE_IMAGE_INSTANTIATOR_FORMAT (autodetect);
128
129 #ifdef HAVE_WIDGETS
130 DECLARE_IMAGE_INSTANTIATOR_FORMAT (layout);
131 DEFINE_DEVICE_IIFORMAT (x, widget);
132 DEFINE_DEVICE_IIFORMAT (x, native_layout);
133 DEFINE_DEVICE_IIFORMAT (x, button);
134 DEFINE_DEVICE_IIFORMAT (x, progress_gauge);
135 DEFINE_DEVICE_IIFORMAT (x, edit_field);
136 #if defined (LWLIB_WIDGETS_MOTIF) && XmVERSION > 1
137 DEFINE_DEVICE_IIFORMAT (x, combo_box);
138 #endif
139 DEFINE_DEVICE_IIFORMAT (x, tab_control);
140 DEFINE_DEVICE_IIFORMAT (x, label);
141 #endif
142 99
143 static void cursor_font_instantiate (Lisp_Object image_instance, 100 static void cursor_font_instantiate (Lisp_Object image_instance,
144 Lisp_Object instantiator, 101 Lisp_Object instantiator,
145 Lisp_Object pointer_fg, 102 Lisp_Object pointer_fg,
146 Lisp_Object pointer_bg, 103 Lisp_Object pointer_bg,
147 int dest_mask, 104 int dest_mask,
148 Lisp_Object domain); 105 Lisp_Object domain);
149
150 #ifdef HAVE_WIDGETS
151 static void
152 update_widget_face (widget_value* wv,
153 Lisp_Image_Instance* ii, Lisp_Object domain);
154 static void
155 update_tab_widget_face (widget_value* wv,
156 Lisp_Image_Instance* ii, Lisp_Object domain);
157 #endif
158 106
159 #include "bitmaps.h" 107 #include "bitmaps.h"
160 108
161 109
162 /************************************************************************/ 110 /************************************************************************/
188 dpy = DEVICE_X_DISPLAY (XDEVICE (device)); 136 dpy = DEVICE_X_DISPLAY (XDEVICE (device));
189 cmap = DEVICE_X_COLORMAP (XDEVICE(device)); 137 cmap = DEVICE_X_COLORMAP (XDEVICE(device));
190 vis = DEVICE_X_VISUAL (XDEVICE(device)); 138 vis = DEVICE_X_VISUAL (XDEVICE(device));
191 depth = DEVICE_X_DEPTH(XDEVICE(device)); 139 depth = DEVICE_X_DEPTH(XDEVICE(device));
192 140
193 if (vis->class == GrayScale || vis->class == StaticColor ||
194 vis->class == StaticGray)
195 {
196 /* #### Implement me!!! */
197 return NULL;
198 }
199
200 if (vis->class == PseudoColor) 141 if (vis->class == PseudoColor)
201 { 142 {
202 /* Quantize the image and get a histogram while we're at it. 143 /* Quantize the image and get a histogram while we're at it.
203 Do this first to save memory */ 144 Do this first to save memory */
204 qtable = build_EImage_quantable(pic, width, height, 256); 145 qtable = build_EImage_quantable(pic, width, height, 256);
232 /* use our quantize table to allocate the colors */ 173 /* use our quantize table to allocate the colors */
233 pixcount = 32; 174 pixcount = 32;
234 *pixtbl = xnew_array (unsigned long, pixcount); 175 *pixtbl = xnew_array (unsigned long, pixcount);
235 *npixels = 0; 176 *npixels = 0;
236 177
237 /* #### should implement a sort by popularity to assure proper allocation */ 178 /* ### should implement a sort by popularity to assure proper allocation */
238 n = *npixels; 179 n = *npixels;
239 for (i = 0; i < qtable->num_active_colors; i++) 180 for (i = 0; i < qtable->num_active_colors; i++)
240 { 181 {
241 XColor color; 182 XColor color;
242 int res; 183 int res;
263 { 204 {
264 rd = *ip++; 205 rd = *ip++;
265 gr = *ip++; 206 gr = *ip++;
266 bl = *ip++; 207 bl = *ip++;
267 conv.val = pixarray[QUANT_GET_COLOR(qtable,rd,gr,bl)]; 208 conv.val = pixarray[QUANT_GET_COLOR(qtable,rd,gr,bl)];
268 #ifdef WORDS_BIGENDIAN 209 #if WORDS_BIGENDIAN
269 if (outimg->byte_order == MSBFirst) 210 if (outimg->byte_order == MSBFirst)
270 for (q = 4-byte_cnt; q < 4; q++) *dp++ = conv.cp[q]; 211 for (q = 4-byte_cnt; q < 4; q++) *dp++ = conv.cp[q];
271 else 212 else
272 for (q = 3; q >= 4-byte_cnt; q--) *dp++ = conv.cp[q]; 213 for (q = 3; q >= 4-byte_cnt; q--) *dp++ = conv.cp[q];
273 #else 214 #else
338 bl = *ip++ << (bbits - 8); 279 bl = *ip++ << (bbits - 8);
339 else 280 else
340 bl = *ip++ >> (8 - bbits); 281 bl = *ip++ >> (8 - bbits);
341 282
342 conv.val = (rd << rshift) | (gr << gshift) | (bl << bshift); 283 conv.val = (rd << rshift) | (gr << gshift) | (bl << bshift);
343 #ifdef WORDS_BIGENDIAN 284 #if WORDS_BIGENDIAN
344 if (outimg->byte_order == MSBFirst) 285 if (outimg->byte_order == MSBFirst)
345 for (q = 4-byte_cnt; q < 4; q++) *dp++ = conv.cp[q]; 286 for (q = 4-byte_cnt; q < 4; q++) *dp++ = conv.cp[q];
346 else 287 else
347 for (q = 3; q >= 4-byte_cnt; q--) *dp++ = conv.cp[q]; 288 for (q = 3; q >= 4-byte_cnt; q--) *dp++ = conv.cp[q];
348 #else 289 #else
358 } 299 }
359 300
360 301
361 302
362 static void 303 static void
363 x_print_image_instance (Lisp_Image_Instance *p, 304 x_print_image_instance (struct Lisp_Image_Instance *p,
364 Lisp_Object printcharfun, 305 Lisp_Object printcharfun,
365 int escapeflag) 306 int escapeflag)
366 { 307 {
367 char buf[100]; 308 char buf[100];
368 309
383 default: 324 default:
384 break; 325 break;
385 } 326 }
386 } 327 }
387 328
388 #ifdef DEBUG_WIDGETS 329 static void
389 extern int debug_widget_instances; 330 x_finalize_image_instance (struct Lisp_Image_Instance *p)
390 #endif
391
392 static void
393 x_finalize_image_instance (Lisp_Image_Instance *p)
394 { 331 {
395 if (!p->data) 332 if (!p->data)
396 return; 333 return;
397 334
398 if (DEVICE_LIVE_P (XDEVICE (IMAGE_INSTANCE_DEVICE (p)))) 335 if (DEVICE_LIVE_P (XDEVICE (p->device)))
399 { 336 {
400 Display *dpy = DEVICE_X_DISPLAY 337 Display *dpy = DEVICE_X_DISPLAY (XDEVICE (p->device));
401 (XDEVICE (IMAGE_INSTANCE_DEVICE (p))); 338
402 if (0) 339 if (IMAGE_INSTANCE_TYPE (p) == IMAGE_WIDGET
403 ; 340 ||
404 #ifdef HAVE_WIDGETS 341 IMAGE_INSTANCE_TYPE (p) == IMAGE_SUBWINDOW)
405 else if (IMAGE_INSTANCE_TYPE (p) == IMAGE_WIDGET)
406 {
407 if (IMAGE_INSTANCE_SUBWINDOW_ID (p))
408 {
409 #ifdef DEBUG_WIDGETS
410 debug_widget_instances--;
411 stderr_out ("widget destroyed, %d left\n", debug_widget_instances);
412 #endif
413 lw_destroy_widget (IMAGE_INSTANCE_X_WIDGET_ID (p));
414 lw_destroy_widget (IMAGE_INSTANCE_X_CLIPWIDGET (p));
415
416 /* We can release the callbacks again. */
417 ungcpro_popup_callbacks (IMAGE_INSTANCE_X_WIDGET_LWID (p));
418
419 IMAGE_INSTANCE_X_WIDGET_ID (p) = 0;
420 IMAGE_INSTANCE_X_CLIPWIDGET (p) = 0;
421 }
422 }
423 #endif
424 else if (IMAGE_INSTANCE_TYPE (p) == IMAGE_SUBWINDOW)
425 { 342 {
426 if (IMAGE_INSTANCE_SUBWINDOW_ID (p)) 343 if (IMAGE_INSTANCE_SUBWINDOW_ID (p))
427 XDestroyWindow (dpy, IMAGE_INSTANCE_X_SUBWINDOW_ID (p)); 344 XDestroyWindow (dpy, IMAGE_INSTANCE_X_SUBWINDOW_ID (p));
428 IMAGE_INSTANCE_SUBWINDOW_ID (p) = 0; 345 IMAGE_INSTANCE_SUBWINDOW_ID (p) = 0;
429 } 346 }
430 else 347 else
431 { 348 {
432 int i; 349 if (IMAGE_INSTANCE_X_PIXMAP (p))
433 if (IMAGE_INSTANCE_PIXMAP_TIMEOUT (p)) 350 XFreePixmap (dpy, IMAGE_INSTANCE_X_PIXMAP (p));
434 disable_glyph_animated_timeout (IMAGE_INSTANCE_PIXMAP_TIMEOUT (p));
435
436 if (IMAGE_INSTANCE_X_MASK (p) && 351 if (IMAGE_INSTANCE_X_MASK (p) &&
437 IMAGE_INSTANCE_X_MASK (p) != IMAGE_INSTANCE_X_PIXMAP (p)) 352 IMAGE_INSTANCE_X_MASK (p) != IMAGE_INSTANCE_X_PIXMAP (p))
438 XFreePixmap (dpy, IMAGE_INSTANCE_X_MASK (p)); 353 XFreePixmap (dpy, IMAGE_INSTANCE_X_MASK (p));
439 IMAGE_INSTANCE_PIXMAP_MASK (p) = 0; 354 IMAGE_INSTANCE_X_PIXMAP (p) = 0;
440 355 IMAGE_INSTANCE_X_MASK (p) = 0;
441 if (IMAGE_INSTANCE_X_PIXMAP_SLICES (p)) 356
442 {
443 for (i = 0; i < IMAGE_INSTANCE_PIXMAP_MAXSLICE (p); i++)
444 if (IMAGE_INSTANCE_X_PIXMAP_SLICE (p,i))
445 {
446 XFreePixmap (dpy, IMAGE_INSTANCE_X_PIXMAP_SLICE (p,i));
447 IMAGE_INSTANCE_X_PIXMAP_SLICE (p, i) = 0;
448 }
449 xfree (IMAGE_INSTANCE_X_PIXMAP_SLICES (p));
450 IMAGE_INSTANCE_X_PIXMAP_SLICES (p) = 0;
451 }
452
453 if (IMAGE_INSTANCE_X_CURSOR (p)) 357 if (IMAGE_INSTANCE_X_CURSOR (p))
454 { 358 {
455 XFreeCursor (dpy, IMAGE_INSTANCE_X_CURSOR (p)); 359 XFreeCursor (dpy, IMAGE_INSTANCE_X_CURSOR (p));
456 IMAGE_INSTANCE_X_CURSOR (p) = 0; 360 IMAGE_INSTANCE_X_CURSOR (p) = 0;
457 } 361 }
458 362
459 if (IMAGE_INSTANCE_X_NPIXELS (p) != 0) 363 if (IMAGE_INSTANCE_X_NPIXELS (p) != 0)
460 { 364 {
461 XFreeColors (dpy, 365 XFreeColors (dpy,
462 IMAGE_INSTANCE_X_COLORMAP (p), 366 IMAGE_INSTANCE_X_COLORMAP (p),
463 IMAGE_INSTANCE_X_PIXELS (p), 367 IMAGE_INSTANCE_X_PIXELS (p),
464 IMAGE_INSTANCE_X_NPIXELS (p), 0); 368 IMAGE_INSTANCE_X_NPIXELS (p), 0);
465 IMAGE_INSTANCE_X_NPIXELS (p) = 0; 369 IMAGE_INSTANCE_X_NPIXELS (p) = 0;
466 } 370 }
467 } 371 }
468 } 372 }
469 /* You can sometimes have pixels without a live device. I forget 373 if (IMAGE_INSTANCE_X_PIXELS (p))
470 why, but that's why we free them here if we have a pixmap type
471 image instance. It probably means that we might also get a memory
472 leak with widgets. */
473 if (IMAGE_INSTANCE_TYPE (p) != IMAGE_WIDGET
474 && IMAGE_INSTANCE_TYPE (p) != IMAGE_SUBWINDOW
475 && IMAGE_INSTANCE_X_PIXELS (p))
476 { 374 {
477 xfree (IMAGE_INSTANCE_X_PIXELS (p)); 375 xfree (IMAGE_INSTANCE_X_PIXELS (p));
478 IMAGE_INSTANCE_X_PIXELS (p) = 0; 376 IMAGE_INSTANCE_X_PIXELS (p) = 0;
479 } 377 }
480 378
481 xfree (p->data); 379 xfree (p->data);
482 p->data = 0; 380 p->data = 0;
483 } 381 }
484 382
485 static int 383 static int
486 x_image_instance_equal (Lisp_Image_Instance *p1, 384 x_image_instance_equal (struct Lisp_Image_Instance *p1,
487 Lisp_Image_Instance *p2, int depth) 385 struct Lisp_Image_Instance *p2, int depth)
488 { 386 {
489 switch (IMAGE_INSTANCE_TYPE (p1)) 387 switch (IMAGE_INSTANCE_TYPE (p1))
490 { 388 {
491 case IMAGE_MONO_PIXMAP: 389 case IMAGE_MONO_PIXMAP:
492 case IMAGE_COLOR_PIXMAP: 390 case IMAGE_COLOR_PIXMAP:
501 399
502 return 1; 400 return 1;
503 } 401 }
504 402
505 static unsigned long 403 static unsigned long
506 x_image_instance_hash (Lisp_Image_Instance *p, int depth) 404 x_image_instance_hash (struct Lisp_Image_Instance *p, int depth)
507 { 405 {
508 switch (IMAGE_INSTANCE_TYPE (p)) 406 switch (IMAGE_INSTANCE_TYPE (p))
509 { 407 {
510 case IMAGE_MONO_PIXMAP: 408 case IMAGE_MONO_PIXMAP:
511 case IMAGE_COLOR_PIXMAP: 409 case IMAGE_COLOR_PIXMAP:
521 method. It is assumed that the device slot within the image 419 method. It is assumed that the device slot within the image
522 instance is already set -- this is the case when instantiate 420 instance is already set -- this is the case when instantiate
523 methods are called. */ 421 methods are called. */
524 422
525 static void 423 static void
526 x_initialize_pixmap_image_instance (Lisp_Image_Instance *ii, 424 x_initialize_pixmap_image_instance (struct Lisp_Image_Instance *ii,
527 int slices,
528 enum image_instance_type type) 425 enum image_instance_type type)
529 { 426 {
530 ii->data = xnew_and_zero (struct x_image_instance_data); 427 ii->data = xnew_and_zero (struct x_image_instance_data);
531 IMAGE_INSTANCE_PIXMAP_MAXSLICE (ii) = slices;
532 IMAGE_INSTANCE_X_PIXMAP_SLICES (ii) =
533 xnew_array_and_zero (Pixmap, slices);
534 IMAGE_INSTANCE_TYPE (ii) = type; 428 IMAGE_INSTANCE_TYPE (ii) = type;
535 IMAGE_INSTANCE_PIXMAP_FILENAME (ii) = Qnil; 429 IMAGE_INSTANCE_PIXMAP_FILENAME (ii) = Qnil;
536 IMAGE_INSTANCE_PIXMAP_MASK_FILENAME (ii) = Qnil; 430 IMAGE_INSTANCE_PIXMAP_MASK_FILENAME (ii) = Qnil;
537 IMAGE_INSTANCE_PIXMAP_HOTSPOT_X (ii) = Qnil; 431 IMAGE_INSTANCE_PIXMAP_HOTSPOT_X (ii) = Qnil;
538 IMAGE_INSTANCE_PIXMAP_HOTSPOT_Y (ii) = Qnil; 432 IMAGE_INSTANCE_PIXMAP_HOTSPOT_Y (ii) = Qnil;
572 (XSTRING_BYTE (name, 1) == '/' || 466 (XSTRING_BYTE (name, 1) == '/' ||
573 (XSTRING_BYTE (name, 1) == '.' && 467 (XSTRING_BYTE (name, 1) == '.' &&
574 (XSTRING_BYTE (name, 2) == '/'))))) 468 (XSTRING_BYTE (name, 2) == '/')))))
575 { 469 {
576 if (!NILP (Ffile_readable_p (name))) 470 if (!NILP (Ffile_readable_p (name)))
577 return Fexpand_file_name (name, Qnil); 471 return name;
578 else 472 else
579 return Qnil; 473 return Qnil;
580 } 474 }
581 475
582 if (NILP (Vdefault_x_device)) 476 if (NILP (Vdefault_x_device))
698 #endif 592 #endif
699 593
700 /* Get the data while doing the conversion */ 594 /* Get the data while doing the conversion */
701 while (1) 595 while (1)
702 { 596 {
703 ssize_t size_in_bytes = Lstream_read (istr, tempbuf, sizeof (tempbuf)); 597 int size_in_bytes = Lstream_read (istr, tempbuf, sizeof (tempbuf));
704 if (!size_in_bytes) 598 if (!size_in_bytes)
705 break; 599 break;
706 /* It does seem the flushes are necessary... */ 600 /* It does seem the flushes are necessary... */
707 #ifdef FILE_CODING 601 #ifdef FILE_CODING
708 Lstream_write (costr, tempbuf, size_in_bytes); 602 Lstream_write (costr, tempbuf, size_in_bytes);
841 735
842 #### This should be able to handle conversion into `pointer'. 736 #### This should be able to handle conversion into `pointer'.
843 Use the same code as for `xpm'. */ 737 Use the same code as for `xpm'. */
844 738
845 static void 739 static void
846 init_image_instance_from_x_image (Lisp_Image_Instance *ii, 740 init_image_instance_from_x_image (struct Lisp_Image_Instance *ii,
847 XImage *ximage, 741 XImage *ximage,
848 int dest_mask, 742 int dest_mask,
849 Colormap cmap, 743 Colormap cmap,
850 unsigned long *pixels, 744 unsigned long *pixels,
851 int npixels, 745 int npixels,
852 int slices,
853 Lisp_Object instantiator) 746 Lisp_Object instantiator)
854 { 747 {
855 Lisp_Object device = IMAGE_INSTANCE_DEVICE (ii); 748 Lisp_Object device = IMAGE_INSTANCE_DEVICE (ii);
856 Display *dpy; 749 Display *dpy;
857 GC gc; 750 GC gc;
883 XPutImage (dpy, pixmap, gc, ximage, 0, 0, 0, 0, 776 XPutImage (dpy, pixmap, gc, ximage, 0, 0, 0, 0,
884 ximage->width, ximage->height); 777 ximage->width, ximage->height);
885 778
886 XFreeGC (dpy, gc); 779 XFreeGC (dpy, gc);
887 780
888 x_initialize_pixmap_image_instance (ii, slices, IMAGE_COLOR_PIXMAP); 781 x_initialize_pixmap_image_instance (ii, IMAGE_COLOR_PIXMAP);
889 782
890 IMAGE_INSTANCE_PIXMAP_FILENAME (ii) = 783 IMAGE_INSTANCE_PIXMAP_FILENAME (ii) =
891 find_keyword_in_vector (instantiator, Q_file); 784 find_keyword_in_vector (instantiator, Q_file);
892 785
893 /* Fixup a set of pixmaps. */
894 IMAGE_INSTANCE_X_PIXMAP (ii) = pixmap; 786 IMAGE_INSTANCE_X_PIXMAP (ii) = pixmap;
895 787 IMAGE_INSTANCE_X_MASK (ii) = 0;
896 IMAGE_INSTANCE_PIXMAP_MASK (ii) = 0;
897 IMAGE_INSTANCE_PIXMAP_WIDTH (ii) = ximage->width; 788 IMAGE_INSTANCE_PIXMAP_WIDTH (ii) = ximage->width;
898 IMAGE_INSTANCE_PIXMAP_HEIGHT (ii) = ximage->height; 789 IMAGE_INSTANCE_PIXMAP_HEIGHT (ii) = ximage->height;
899 IMAGE_INSTANCE_PIXMAP_DEPTH (ii) = ximage->depth; 790 IMAGE_INSTANCE_PIXMAP_DEPTH (ii) = ximage->depth;
900 IMAGE_INSTANCE_X_COLORMAP (ii) = cmap; 791 IMAGE_INSTANCE_X_COLORMAP (ii) = cmap;
901 IMAGE_INSTANCE_X_PIXELS (ii) = pixels; 792 IMAGE_INSTANCE_X_PIXELS (ii) = pixels;
902 IMAGE_INSTANCE_X_NPIXELS (ii) = npixels; 793 IMAGE_INSTANCE_X_NPIXELS (ii) = npixels;
903 } 794 }
904 795
905 static void 796 static void
906 image_instance_add_x_image (Lisp_Image_Instance *ii, 797 x_init_image_instance_from_eimage (struct Lisp_Image_Instance *ii,
907 XImage *ximage,
908 int slice,
909 Lisp_Object instantiator)
910 {
911 Lisp_Object device = IMAGE_INSTANCE_DEVICE (ii);
912 Display *dpy;
913 GC gc;
914 Drawable d;
915 Pixmap pixmap;
916
917 dpy = DEVICE_X_DISPLAY (XDEVICE (device));
918 d = XtWindow(DEVICE_XT_APP_SHELL (XDEVICE (device)));
919
920 pixmap = XCreatePixmap (dpy, d, ximage->width,
921 ximage->height, ximage->depth);
922 if (!pixmap)
923 signal_simple_error ("Unable to create pixmap", instantiator);
924
925 gc = XCreateGC (dpy, pixmap, 0, NULL);
926 if (!gc)
927 {
928 XFreePixmap (dpy, pixmap);
929 signal_simple_error ("Unable to create GC", instantiator);
930 }
931
932 XPutImage (dpy, pixmap, gc, ximage, 0, 0, 0, 0,
933 ximage->width, ximage->height);
934
935 XFreeGC (dpy, gc);
936
937 IMAGE_INSTANCE_X_PIXMAP_SLICE (ii, slice) = pixmap;
938 }
939
940 static void
941 x_init_image_instance_from_eimage (Lisp_Image_Instance *ii,
942 int width, int height, 798 int width, int height,
943 int slices,
944 unsigned char *eimage, 799 unsigned char *eimage,
945 int dest_mask, 800 int dest_mask,
946 Lisp_Object instantiator, 801 Lisp_Object instantiator,
947 Lisp_Object domain) 802 Lisp_Object domain)
948 { 803 {
949 Lisp_Object device = IMAGE_INSTANCE_DEVICE (ii); 804 Lisp_Object device = IMAGE_INSTANCE_DEVICE (ii);
950 Colormap cmap = DEVICE_X_COLORMAP (XDEVICE(device)); 805 Colormap cmap = DEVICE_X_COLORMAP (XDEVICE(device));
951 unsigned long *pixtbl = NULL; 806 unsigned long *pixtbl = NULL;
952 int npixels = 0; 807 int npixels = 0;
953 int slice;
954 XImage* ximage; 808 XImage* ximage;
955 809
956 for (slice = 0; slice < slices; slice++) 810 ximage = convert_EImage_to_XImage (device, width, height, eimage,
957 { 811 &pixtbl, &npixels);
958 ximage = convert_EImage_to_XImage (device, width, height, 812 if (!ximage)
959 eimage + (width * height * 3 * slice), 813 {
960 &pixtbl, &npixels); 814 if (pixtbl) xfree (pixtbl);
961 if (!ximage) 815 signal_image_error("EImage to XImage conversion failed", instantiator);
962 { 816 }
963 if (pixtbl) xfree (pixtbl); 817
964 signal_image_error("EImage to XImage conversion failed", instantiator); 818 /* Now create the pixmap and set up the image instance */
965 } 819 init_image_instance_from_x_image (ii, ximage, dest_mask,
966 820 cmap, pixtbl, npixels,
967 /* Now create the pixmap and set up the image instance */ 821 instantiator);
968 if (slice == 0) 822
969 init_image_instance_from_x_image (ii, ximage, dest_mask, 823 if (ximage)
970 cmap, pixtbl, npixels, slices, 824 {
971 instantiator); 825 if (ximage->data)
972 else 826 {
973 image_instance_add_x_image (ii, ximage, slice, instantiator); 827 xfree (ximage->data);
974 828 ximage->data = 0;
975 if (ximage) 829 }
976 { 830 XDestroyImage (ximage);
977 if (ximage->data) 831 }
978 { 832 }
979 xfree (ximage->data); 833
980 ximage->data = 0; 834 int read_bitmap_data_from_file (CONST char *filename, unsigned int *width,
981 }
982 XDestroyImage (ximage);
983 ximage = 0;
984 }
985 }
986 }
987
988 int read_bitmap_data_from_file (const char *filename, unsigned int *width,
989 unsigned int *height, unsigned char **datap, 835 unsigned int *height, unsigned char **datap,
990 int *x_hot, int *y_hot) 836 int *x_hot, int *y_hot)
991 { 837 {
992 return XmuReadBitmapDataFromFile (filename, width, height, 838 return XmuReadBitmapDataFromFile (filename, width, height,
993 datap, x_hot, y_hot); 839 datap, x_hot, y_hot);
997 corresponding X object. */ 843 corresponding X object. */
998 844
999 static Pixmap 845 static Pixmap
1000 pixmap_from_xbm_inline (Lisp_Object device, int width, int height, 846 pixmap_from_xbm_inline (Lisp_Object device, int width, int height,
1001 /* Note that data is in ext-format! */ 847 /* Note that data is in ext-format! */
1002 const Extbyte *bits) 848 CONST Extbyte *bits)
1003 { 849 {
1004 return XCreatePixmapFromBitmapData (DEVICE_X_DISPLAY (XDEVICE(device)), 850 return XCreatePixmapFromBitmapData (DEVICE_X_DISPLAY (XDEVICE(device)),
1005 XtWindow (DEVICE_XT_APP_SHELL (XDEVICE (device))), 851 XtWindow (DEVICE_XT_APP_SHELL (XDEVICE (device))),
1006 (char *) bits, width, height, 852 (char *) bits, width, height,
1007 1, 0, 1); 853 1, 0, 1);
1009 855
1010 /* Given inline data for a mono pixmap, initialize the given 856 /* Given inline data for a mono pixmap, initialize the given
1011 image instance accordingly. */ 857 image instance accordingly. */
1012 858
1013 static void 859 static void
1014 init_image_instance_from_xbm_inline (Lisp_Image_Instance *ii, 860 init_image_instance_from_xbm_inline (struct Lisp_Image_Instance *ii,
1015 int width, int height, 861 int width, int height,
1016 /* Note that data is in ext-format! */ 862 /* Note that data is in ext-format! */
1017 const char *bits, 863 CONST char *bits,
1018 Lisp_Object instantiator, 864 Lisp_Object instantiator,
1019 Lisp_Object pointer_fg, 865 Lisp_Object pointer_fg,
1020 Lisp_Object pointer_bg, 866 Lisp_Object pointer_bg,
1021 int dest_mask, 867 int dest_mask,
1022 Pixmap mask, 868 Pixmap mask,
1054 else 900 else
1055 incompatible_image_types (instantiator, dest_mask, 901 incompatible_image_types (instantiator, dest_mask,
1056 IMAGE_MONO_PIXMAP_MASK | IMAGE_COLOR_PIXMAP_MASK 902 IMAGE_MONO_PIXMAP_MASK | IMAGE_COLOR_PIXMAP_MASK
1057 | IMAGE_POINTER_MASK); 903 | IMAGE_POINTER_MASK);
1058 904
1059 x_initialize_pixmap_image_instance (ii, 1, type); 905 x_initialize_pixmap_image_instance (ii, type);
1060 IMAGE_INSTANCE_PIXMAP_WIDTH (ii) = width; 906 IMAGE_INSTANCE_PIXMAP_WIDTH (ii) = width;
1061 IMAGE_INSTANCE_PIXMAP_HEIGHT (ii) = height; 907 IMAGE_INSTANCE_PIXMAP_HEIGHT (ii) = height;
1062 IMAGE_INSTANCE_PIXMAP_FILENAME (ii) = 908 IMAGE_INSTANCE_PIXMAP_FILENAME (ii) =
1063 find_keyword_in_vector (instantiator, Q_file); 909 find_keyword_in_vector (instantiator, Q_file);
1064 910
1150 static void 996 static void
1151 xbm_instantiate_1 (Lisp_Object image_instance, Lisp_Object instantiator, 997 xbm_instantiate_1 (Lisp_Object image_instance, Lisp_Object instantiator,
1152 Lisp_Object pointer_fg, Lisp_Object pointer_bg, 998 Lisp_Object pointer_fg, Lisp_Object pointer_bg,
1153 int dest_mask, int width, int height, 999 int dest_mask, int width, int height,
1154 /* Note that data is in ext-format! */ 1000 /* Note that data is in ext-format! */
1155 const char *bits) 1001 CONST char *bits)
1156 { 1002 {
1157 Lisp_Object mask_data = find_keyword_in_vector (instantiator, Q_mask_data); 1003 Lisp_Object mask_data = find_keyword_in_vector (instantiator, Q_mask_data);
1158 Lisp_Object mask_file = find_keyword_in_vector (instantiator, Q_mask_file); 1004 Lisp_Object mask_file = find_keyword_in_vector (instantiator, Q_mask_file);
1159 Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance); 1005 struct Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance);
1160 Pixmap mask = 0; 1006 Pixmap mask = 0;
1007 CONST char *gcc_may_you_rot_in_hell;
1161 1008
1162 if (!NILP (mask_data)) 1009 if (!NILP (mask_data))
1163 { 1010 {
1164 const char *ext_data; 1011 GET_C_STRING_BINARY_DATA_ALLOCA (XCAR (XCDR (XCDR (mask_data))),
1165 1012 gcc_may_you_rot_in_hell);
1166 TO_EXTERNAL_FORMAT (LISP_STRING, XCAR (XCDR (XCDR (mask_data))), 1013 mask =
1167 C_STRING_ALLOCA, ext_data, 1014 pixmap_from_xbm_inline (IMAGE_INSTANCE_DEVICE (ii),
1168 Qbinary); 1015 XINT (XCAR (mask_data)),
1169 mask = pixmap_from_xbm_inline (IMAGE_INSTANCE_DEVICE (ii), 1016 XINT (XCAR (XCDR (mask_data))),
1170 XINT (XCAR (mask_data)), 1017 (CONST unsigned char *)
1171 XINT (XCAR (XCDR (mask_data))), 1018 gcc_may_you_rot_in_hell);
1172 (const unsigned char *) ext_data);
1173 } 1019 }
1174 1020
1175 init_image_instance_from_xbm_inline (ii, width, height, bits, 1021 init_image_instance_from_xbm_inline (ii, width, height, bits,
1176 instantiator, pointer_fg, pointer_bg, 1022 instantiator, pointer_fg, pointer_bg,
1177 dest_mask, mask, mask_file); 1023 dest_mask, mask, mask_file);
1183 x_xbm_instantiate (Lisp_Object image_instance, Lisp_Object instantiator, 1029 x_xbm_instantiate (Lisp_Object image_instance, Lisp_Object instantiator,
1184 Lisp_Object pointer_fg, Lisp_Object pointer_bg, 1030 Lisp_Object pointer_fg, Lisp_Object pointer_bg,
1185 int dest_mask, Lisp_Object domain) 1031 int dest_mask, Lisp_Object domain)
1186 { 1032 {
1187 Lisp_Object data = find_keyword_in_vector (instantiator, Q_data); 1033 Lisp_Object data = find_keyword_in_vector (instantiator, Q_data);
1188 const char *ext_data; 1034 CONST char *gcc_go_home;
1189 1035
1190 assert (!NILP (data)); 1036 assert (!NILP (data));
1191 1037
1192 TO_EXTERNAL_FORMAT (LISP_STRING, XCAR (XCDR (XCDR (data))), 1038 GET_C_STRING_BINARY_DATA_ALLOCA (XCAR (XCDR (XCDR (data))),
1193 C_STRING_ALLOCA, ext_data, 1039 gcc_go_home);
1194 Qbinary);
1195 1040
1196 xbm_instantiate_1 (image_instance, instantiator, pointer_fg, 1041 xbm_instantiate_1 (image_instance, instantiator, pointer_fg,
1197 pointer_bg, dest_mask, XINT (XCAR (data)), 1042 pointer_bg, dest_mask, XINT (XCAR (data)),
1198 XINT (XCAR (XCDR (data))), ext_data); 1043 XINT (XCAR (XCDR (data))), gcc_go_home);
1199 } 1044 }
1200 1045
1201 1046
1202 #ifdef HAVE_XPM 1047 #ifdef HAVE_XPM
1203 1048
1297 XpmFreeAttributes (xpmattrs); 1142 XpmFreeAttributes (xpmattrs);
1298 } 1143 }
1299 1144
1300 static void 1145 static void
1301 x_xpm_instantiate (Lisp_Object image_instance, Lisp_Object instantiator, 1146 x_xpm_instantiate (Lisp_Object image_instance, Lisp_Object instantiator,
1302 Lisp_Object pointer_fg, Lisp_Object pointer_bg, 1147 Lisp_Object pointer_fg, Lisp_Object pointer_bg,
1303 int dest_mask, Lisp_Object domain) 1148 int dest_mask, Lisp_Object domain)
1304 { 1149 {
1305 /* This function can GC */ 1150 /* This function can GC */
1306 Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance); 1151 struct Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance);
1307 Lisp_Object device = IMAGE_INSTANCE_DEVICE (ii); 1152 Lisp_Object device = IMAGE_INSTANCE_DEVICE (ii);
1308 Lisp_Object data = find_keyword_in_vector (instantiator, Q_data); 1153 Lisp_Object data = find_keyword_in_vector (instantiator, Q_data);
1309 Display *dpy; 1154 Display *dpy;
1310 Screen *xs; 1155 Screen *xs;
1311 Colormap cmap; 1156 Colormap cmap;
1359 cmap = DEVICE_X_COLORMAP (XDEVICE(device)); 1204 cmap = DEVICE_X_COLORMAP (XDEVICE(device));
1360 depth = DEVICE_X_DEPTH (XDEVICE(device)); 1205 depth = DEVICE_X_DEPTH (XDEVICE(device));
1361 visual = DEVICE_X_VISUAL (XDEVICE(device)); 1206 visual = DEVICE_X_VISUAL (XDEVICE(device));
1362 #endif 1207 #endif
1363 1208
1364 x_initialize_pixmap_image_instance (ii, 1, type); 1209 x_initialize_pixmap_image_instance (ii, type);
1365 1210
1366 assert (!NILP (data)); 1211 assert (!NILP (data));
1367 1212
1368 retry: 1213 retry:
1369 1214
1469 } 1314 }
1470 else 1315 else
1471 pixels = NULL; 1316 pixels = NULL;
1472 1317
1473 IMAGE_INSTANCE_X_PIXMAP (ii) = pixmap; 1318 IMAGE_INSTANCE_X_PIXMAP (ii) = pixmap;
1474 IMAGE_INSTANCE_PIXMAP_MASK (ii) = (void*)mask; 1319 IMAGE_INSTANCE_X_MASK (ii) = mask;
1475 IMAGE_INSTANCE_X_COLORMAP (ii) = cmap; 1320 IMAGE_INSTANCE_X_COLORMAP (ii) = cmap;
1476 IMAGE_INSTANCE_X_PIXELS (ii) = pixels; 1321 IMAGE_INSTANCE_X_PIXELS (ii) = pixels;
1477 IMAGE_INSTANCE_X_NPIXELS (ii) = npixels; 1322 IMAGE_INSTANCE_X_NPIXELS (ii) = npixels;
1478 IMAGE_INSTANCE_PIXMAP_WIDTH (ii) = w; 1323 IMAGE_INSTANCE_PIXMAP_WIDTH (ii) = w;
1479 IMAGE_INSTANCE_PIXMAP_HEIGHT (ii) = h; 1324 IMAGE_INSTANCE_PIXMAP_HEIGHT (ii) = h;
1668 Lisp_Object pointer_fg, Lisp_Object pointer_bg, 1513 Lisp_Object pointer_fg, Lisp_Object pointer_bg,
1669 int dest_mask, Lisp_Object domain) 1514 int dest_mask, Lisp_Object domain)
1670 { 1515 {
1671 Lisp_Object data = find_keyword_in_vector (instantiator, Q_data); 1516 Lisp_Object data = find_keyword_in_vector (instantiator, Q_data);
1672 int i, stattis; 1517 int i, stattis;
1673 char *bits, *bp; 1518 char *p, *bits, *bp;
1674 const char *p; 1519 CONST char * volatile emsg = 0;
1675 const char * volatile emsg = 0; 1520 CONST char * volatile dstring;
1676 const char * volatile dstring;
1677 1521
1678 assert (!NILP (data)); 1522 assert (!NILP (data));
1679 1523
1680 TO_EXTERNAL_FORMAT (LISP_STRING, data, 1524 GET_C_STRING_BINARY_DATA_ALLOCA (data, dstring);
1681 C_STRING_ALLOCA, dstring,
1682 Qbinary);
1683 1525
1684 if ((p = strchr (dstring, ':'))) 1526 if ((p = strchr (dstring, ':')))
1685 { 1527 {
1686 dstring = p + 1; 1528 dstring = p + 1;
1687 } 1529 }
1741 data_must_be_present (instantiator); 1583 data_must_be_present (instantiator);
1742 } 1584 }
1743 1585
1744 static Lisp_Object 1586 static Lisp_Object
1745 autodetect_normalize (Lisp_Object instantiator, 1587 autodetect_normalize (Lisp_Object instantiator,
1746 Lisp_Object console_type) 1588 Lisp_Object console_type)
1747 { 1589 {
1748 Lisp_Object file = find_keyword_in_vector (instantiator, Q_data); 1590 Lisp_Object file = find_keyword_in_vector (instantiator, Q_data);
1749 Lisp_Object filename = Qnil; 1591 Lisp_Object filename = Qnil;
1750 Lisp_Object data = Qnil; 1592 Lisp_Object data = Qnil;
1751 struct gcpro gcpro1, gcpro2, gcpro3; 1593 struct gcpro gcpro1, gcpro2, gcpro3;
1832 IMAGE_TEXT_MASK; 1674 IMAGE_TEXT_MASK;
1833 } 1675 }
1834 1676
1835 static void 1677 static void
1836 autodetect_instantiate (Lisp_Object image_instance, 1678 autodetect_instantiate (Lisp_Object image_instance,
1837 Lisp_Object instantiator, 1679 Lisp_Object instantiator,
1838 Lisp_Object pointer_fg, 1680 Lisp_Object pointer_fg,
1839 Lisp_Object pointer_bg, 1681 Lisp_Object pointer_bg,
1840 int dest_mask, Lisp_Object domain) 1682 int dest_mask, Lisp_Object domain)
1841 { 1683 {
1842 Lisp_Object data = find_keyword_in_vector (instantiator, Q_data); 1684 Lisp_Object data = find_keyword_in_vector (instantiator, Q_data);
1843 struct gcpro gcpro1, gcpro2, gcpro3; 1685 struct gcpro gcpro1, gcpro2, gcpro3;
1844 Lisp_Object alist = Qnil; 1686 Lisp_Object alist = Qnil;
1845 Lisp_Object result = Qnil; 1687 Lisp_Object result = Qnil;
1848 GCPRO3 (data, alist, result); 1690 GCPRO3 (data, alist, result);
1849 1691
1850 alist = tagged_vector_to_alist (instantiator); 1692 alist = tagged_vector_to_alist (instantiator);
1851 if (dest_mask & IMAGE_POINTER_MASK) 1693 if (dest_mask & IMAGE_POINTER_MASK)
1852 { 1694 {
1853 const char *name_ext; 1695 CONST char *name_ext;
1854 TO_EXTERNAL_FORMAT (LISP_STRING, data, 1696 GET_C_STRING_FILENAME_DATA_ALLOCA (data, name_ext);
1855 C_STRING_ALLOCA, name_ext,
1856 Qfile_name);
1857 if (XmuCursorNameToIndex (name_ext) != -1) 1697 if (XmuCursorNameToIndex (name_ext) != -1)
1858 { 1698 {
1859 result = alist_to_tagged_vector (Qcursor_font, alist); 1699 result = alist_to_tagged_vector (Qcursor_font, alist);
1860 is_cursor_font = 1; 1700 is_cursor_font = 1;
1861 } 1701 }
1938 Lisp_Object pointer_fg, Lisp_Object pointer_bg, 1778 Lisp_Object pointer_fg, Lisp_Object pointer_bg,
1939 int dest_mask, Lisp_Object domain) 1779 int dest_mask, Lisp_Object domain)
1940 { 1780 {
1941 /* This function can GC */ 1781 /* This function can GC */
1942 Lisp_Object data = find_keyword_in_vector (instantiator, Q_data); 1782 Lisp_Object data = find_keyword_in_vector (instantiator, Q_data);
1943 Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance); 1783 struct Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance);
1944 Lisp_Object device = IMAGE_INSTANCE_DEVICE (ii); 1784 Lisp_Object device = IMAGE_INSTANCE_DEVICE (ii);
1945 Display *dpy; 1785 Display *dpy;
1946 XColor fg, bg; 1786 XColor fg, bg;
1947 Font source, mask; 1787 Font source, mask;
1948 char source_name[MAXPATHLEN], mask_name[MAXPATHLEN], dummy; 1788 char source_name[MAXPATHLEN], mask_name[MAXPATHLEN], dummy;
2002 if (!mask) 1842 if (!mask)
2003 mask_char = 0; 1843 mask_char = 0;
2004 1844
2005 /* #### call XQueryTextExtents() and check_pointer_sizes() here. */ 1845 /* #### call XQueryTextExtents() and check_pointer_sizes() here. */
2006 1846
2007 x_initialize_pixmap_image_instance (ii, 1, IMAGE_POINTER); 1847 x_initialize_pixmap_image_instance (ii, IMAGE_POINTER);
2008 IMAGE_INSTANCE_X_CURSOR (ii) = 1848 IMAGE_INSTANCE_X_CURSOR (ii) =
2009 XCreateGlyphCursor (dpy, source, mask, source_char, mask_char, 1849 XCreateGlyphCursor (dpy, source, mask, source_char, mask_char,
2010 &fg, &bg); 1850 &fg, &bg);
2011 XIMAGE_INSTANCE_PIXMAP_FG (image_instance) = foreground; 1851 XIMAGE_INSTANCE_PIXMAP_FG (image_instance) = foreground;
2012 XIMAGE_INSTANCE_PIXMAP_BG (image_instance) = background; 1852 XIMAGE_INSTANCE_PIXMAP_BG (image_instance) = background;
2036 Lisp_Object pointer_fg, Lisp_Object pointer_bg, 1876 Lisp_Object pointer_fg, Lisp_Object pointer_bg,
2037 int dest_mask, Lisp_Object domain) 1877 int dest_mask, Lisp_Object domain)
2038 { 1878 {
2039 /* This function can GC */ 1879 /* This function can GC */
2040 Lisp_Object data = find_keyword_in_vector (instantiator, Q_data); 1880 Lisp_Object data = find_keyword_in_vector (instantiator, Q_data);
2041 Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance); 1881 struct Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance);
2042 Lisp_Object device = IMAGE_INSTANCE_DEVICE (ii); 1882 Lisp_Object device = IMAGE_INSTANCE_DEVICE (ii);
2043 Display *dpy; 1883 Display *dpy;
2044 int i; 1884 int i;
2045 const char *name_ext; 1885 CONST char *name_ext;
2046 Lisp_Object foreground, background; 1886 Lisp_Object foreground, background;
2047 1887
2048 if (!DEVICE_X_P (XDEVICE (device))) 1888 if (!DEVICE_X_P (XDEVICE (device)))
2049 signal_simple_error ("Not an X device", device); 1889 signal_simple_error ("Not an X device", device);
2050 1890
2051 dpy = DEVICE_X_DISPLAY (XDEVICE (device)); 1891 dpy = DEVICE_X_DISPLAY (XDEVICE (device));
2052 1892
2053 if (!(dest_mask & IMAGE_POINTER_MASK)) 1893 if (!(dest_mask & IMAGE_POINTER_MASK))
2054 incompatible_image_types (instantiator, dest_mask, IMAGE_POINTER_MASK); 1894 incompatible_image_types (instantiator, dest_mask, IMAGE_POINTER_MASK);
2055 1895
2056 TO_EXTERNAL_FORMAT (LISP_STRING, data, 1896 GET_C_STRING_FILENAME_DATA_ALLOCA (data, name_ext);
2057 C_STRING_ALLOCA, name_ext,
2058 Qfile_name);
2059 if ((i = XmuCursorNameToIndex (name_ext)) == -1) 1897 if ((i = XmuCursorNameToIndex (name_ext)) == -1)
2060 signal_simple_error ("Unrecognized cursor-font name", data); 1898 signal_simple_error ("Unrecognized cursor-font name", data);
2061 1899
2062 x_initialize_pixmap_image_instance (ii, 1, IMAGE_POINTER); 1900 x_initialize_pixmap_image_instance (ii, IMAGE_POINTER);
2063 IMAGE_INSTANCE_X_CURSOR (ii) = XCreateFontCursor (dpy, i); 1901 IMAGE_INSTANCE_X_CURSOR (ii) = XCreateFontCursor (dpy, i);
2064 foreground = find_keyword_in_vector (instantiator, Q_foreground); 1902 foreground = find_keyword_in_vector (instantiator, Q_foreground);
2065 if (NILP (foreground)) 1903 if (NILP (foreground))
2066 foreground = pointer_fg; 1904 foreground = pointer_fg;
2067 background = find_keyword_in_vector (instantiator, Q_background); 1905 background = find_keyword_in_vector (instantiator, Q_background);
2072 1910
2073 static int 1911 static int
2074 x_colorize_image_instance (Lisp_Object image_instance, 1912 x_colorize_image_instance (Lisp_Object image_instance,
2075 Lisp_Object foreground, Lisp_Object background) 1913 Lisp_Object foreground, Lisp_Object background)
2076 { 1914 {
2077 Lisp_Image_Instance *p; 1915 struct Lisp_Image_Instance *p;
2078 1916
2079 p = XIMAGE_INSTANCE (image_instance); 1917 p = XIMAGE_INSTANCE (image_instance);
2080 1918
2081 switch (IMAGE_INSTANCE_TYPE (p)) 1919 switch (IMAGE_INSTANCE_TYPE (p))
2082 { 1920 {
2083 case IMAGE_MONO_PIXMAP: 1921 case IMAGE_MONO_PIXMAP:
2084 IMAGE_INSTANCE_TYPE (p) = IMAGE_COLOR_PIXMAP; 1922 IMAGE_INSTANCE_TYPE (p) = IMAGE_COLOR_PIXMAP;
2085 /* Make sure there aren't two pointers to the same mask, causing 1923 /* Make sure there aren't two pointers to the same mask, causing
2086 it to get freed twice. */ 1924 it to get freed twice. */
2087 IMAGE_INSTANCE_PIXMAP_MASK (p) = 0; 1925 IMAGE_INSTANCE_X_MASK (p) = 0;
2088 break; 1926 break;
2089 1927
2090 default: 1928 default:
2091 return 0; 1929 return 0;
2092 } 1930 }
2125 /************************************************************************/ 1963 /************************************************************************/
2126 1964
2127 /* unmap the image if it is a widget. This is used by redisplay via 1965 /* unmap the image if it is a widget. This is used by redisplay via
2128 redisplay_unmap_subwindows */ 1966 redisplay_unmap_subwindows */
2129 static void 1967 static void
2130 x_unmap_subwindow (Lisp_Image_Instance *p) 1968 x_unmap_subwindow (struct Lisp_Image_Instance *p)
2131 { 1969 {
2132 if (IMAGE_INSTANCE_TYPE (p) == IMAGE_SUBWINDOW) 1970 XUnmapWindow (DisplayOfScreen (IMAGE_INSTANCE_X_SUBWINDOW_SCREEN (p)),
2133 { 1971 IMAGE_INSTANCE_X_SUBWINDOW_ID (p));
2134 XUnmapWindow
2135 (IMAGE_INSTANCE_X_SUBWINDOW_DISPLAY (p),
2136 IMAGE_INSTANCE_X_CLIPWINDOW (p));
2137 }
2138 else /* must be a widget */
2139 {
2140 XtUnmapWidget (IMAGE_INSTANCE_X_CLIPWIDGET (p));
2141 }
2142 } 1972 }
2143 1973
2144 /* map the subwindow. This is used by redisplay via 1974 /* map the subwindow. This is used by redisplay via
2145 redisplay_output_subwindow */ 1975 redisplay_output_subwindow */
2146 static void 1976 static void
2147 x_map_subwindow (Lisp_Image_Instance *p, int x, int y, 1977 x_map_subwindow (struct Lisp_Image_Instance *p, int x, int y)
2148 struct display_glyph_area* dga) 1978 {
2149 { 1979 XMapWindow (DisplayOfScreen (IMAGE_INSTANCE_X_SUBWINDOW_SCREEN (p)),
2150 if (IMAGE_INSTANCE_TYPE (p) == IMAGE_SUBWINDOW) 1980 IMAGE_INSTANCE_X_SUBWINDOW_ID (p));
2151 { 1981 XMoveWindow (DisplayOfScreen (IMAGE_INSTANCE_X_SUBWINDOW_SCREEN (p)),
2152 Window subwindow = IMAGE_INSTANCE_X_SUBWINDOW_ID (p); 1982 IMAGE_INSTANCE_X_SUBWINDOW_ID (p), x, y);
2153 XMoveResizeWindow (IMAGE_INSTANCE_X_SUBWINDOW_DISPLAY (p),
2154 IMAGE_INSTANCE_X_CLIPWINDOW (p),
2155 x, y, dga->width, dga->height);
2156 XMoveWindow (IMAGE_INSTANCE_X_SUBWINDOW_DISPLAY (p),
2157 subwindow, -dga->xoffset, -dga->yoffset);
2158 XMapWindow (IMAGE_INSTANCE_X_SUBWINDOW_DISPLAY (p),
2159 IMAGE_INSTANCE_X_CLIPWINDOW (p));
2160 }
2161 else /* must be a widget */
2162 {
2163 XtConfigureWidget (IMAGE_INSTANCE_X_CLIPWIDGET (p),
2164 x + IMAGE_INSTANCE_X_WIDGET_XOFFSET (p),
2165 y + IMAGE_INSTANCE_X_WIDGET_YOFFSET (p),
2166 dga->width, dga->height, 0);
2167 XtMoveWidget (IMAGE_INSTANCE_X_WIDGET_ID (p),
2168 -dga->xoffset, -dga->yoffset);
2169 XtMapWidget (IMAGE_INSTANCE_X_CLIPWIDGET (p));
2170 }
2171 }
2172
2173 /* when you click on a widget you may activate another widget this
2174 needs to be checked and all appropriate widgets updated */
2175 static void
2176 x_update_subwindow (Lisp_Image_Instance *p)
2177 {
2178 /* Update the subwindow size if necessary. */
2179 if (IMAGE_INSTANCE_SIZE_CHANGED (p))
2180 {
2181 XResizeWindow (IMAGE_INSTANCE_X_SUBWINDOW_DISPLAY (p),
2182 IMAGE_INSTANCE_X_SUBWINDOW_ID (p),
2183 IMAGE_INSTANCE_WIDTH (p),
2184 IMAGE_INSTANCE_HEIGHT (p));
2185 }
2186 }
2187
2188 /* Update all attributes that have changed. Lwlib actually does most
2189 of this for us. */
2190 static void
2191 x_update_widget (Lisp_Image_Instance *p)
2192 {
2193 /* This function can GC if IN_REDISPLAY is false. */
2194 #ifdef HAVE_WIDGETS
2195 widget_value* wv = 0;
2196
2197 /* First get the items if they have changed since this is a
2198 structural change. As such it will nuke all added values so we
2199 need to update most other things after the items have changed.*/
2200 if (IMAGE_INSTANCE_WIDGET_ITEMS_CHANGED (p))
2201 {
2202 Lisp_Object image_instance;
2203
2204 XSETIMAGE_INSTANCE (image_instance, p);
2205 wv = gui_items_to_widget_values
2206 (image_instance, IMAGE_INSTANCE_WIDGET_PENDING_ITEMS (p));
2207 wv->change = STRUCTURAL_CHANGE;
2208 /* now modify the widget */
2209 lw_modify_all_widgets (IMAGE_INSTANCE_X_WIDGET_LWID (p),
2210 wv, True);
2211 free_widget_value_tree (wv);
2212 }
2213
2214 /* Now do non structural updates. */
2215 wv = lw_get_all_values (IMAGE_INSTANCE_X_WIDGET_LWID (p));
2216
2217 if (!wv)
2218 return;
2219
2220 /* Possibly update the colors and font */
2221 if (IMAGE_INSTANCE_WIDGET_FACE_CHANGED (p)
2222 ||
2223 XFRAME (IMAGE_INSTANCE_FRAME (p))->faces_changed
2224 ||
2225 IMAGE_INSTANCE_WIDGET_ITEMS_CHANGED (p))
2226 {
2227 update_widget_face (wv, p, IMAGE_INSTANCE_FRAME (p));
2228 }
2229
2230 /* Possibly update the text. */
2231 if (IMAGE_INSTANCE_TEXT_CHANGED (p))
2232 {
2233 char* str;
2234 Lisp_Object val = IMAGE_INSTANCE_WIDGET_TEXT (p);
2235 TO_EXTERNAL_FORMAT (LISP_STRING, val,
2236 C_STRING_ALLOCA, str,
2237 Qnative);
2238 wv->value = str;
2239 }
2240
2241 /* Possibly update the size. */
2242 if (IMAGE_INSTANCE_SIZE_CHANGED (p)
2243 ||
2244 IMAGE_INSTANCE_WIDGET_ITEMS_CHANGED (p)
2245 ||
2246 IMAGE_INSTANCE_TEXT_CHANGED (p))
2247 {
2248 assert (IMAGE_INSTANCE_X_WIDGET_ID (p) &&
2249 IMAGE_INSTANCE_X_CLIPWIDGET (p)) ;
2250
2251 if (IMAGE_INSTANCE_X_WIDGET_ID (p)->core.being_destroyed
2252 || !XtIsManaged(IMAGE_INSTANCE_X_WIDGET_ID (p)))
2253 {
2254 Lisp_Object sw;
2255 XSETIMAGE_INSTANCE (sw, p);
2256 signal_simple_error ("XEmacs bug: subwindow is deleted", sw);
2257 }
2258
2259 lw_add_widget_value_arg (wv, XtNwidth,
2260 (Dimension)IMAGE_INSTANCE_WIDTH (p));
2261 lw_add_widget_value_arg (wv, XtNheight,
2262 (Dimension)IMAGE_INSTANCE_HEIGHT (p));
2263 }
2264
2265 /* now modify the widget */
2266 lw_modify_all_widgets (IMAGE_INSTANCE_X_WIDGET_LWID (p),
2267 wv, False);
2268 #endif
2269 } 1983 }
2270 1984
2271 /* instantiate and x type subwindow */ 1985 /* instantiate and x type subwindow */
2272 static void 1986 static void
2273 x_subwindow_instantiate (Lisp_Object image_instance, Lisp_Object instantiator, 1987 x_subwindow_instantiate (Lisp_Object image_instance, Lisp_Object instantiator,
2274 Lisp_Object pointer_fg, Lisp_Object pointer_bg, 1988 Lisp_Object pointer_fg, Lisp_Object pointer_bg,
2275 int dest_mask, Lisp_Object domain) 1989 int dest_mask, Lisp_Object domain)
2276 { 1990 {
2277 /* This function can GC */ 1991 /* This function can GC */
2278 Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance); 1992 struct Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance);
2279 Lisp_Object device = IMAGE_INSTANCE_DEVICE (ii); 1993 Lisp_Object device = IMAGE_INSTANCE_DEVICE (ii);
2280 Lisp_Object frame = DOMAIN_FRAME (domain); 1994 Lisp_Object frame = FW_FRAME (domain);
2281 struct frame* f = XFRAME (frame); 1995 struct frame* f = XFRAME (frame);
2282 Display *dpy; 1996 Display *dpy;
2283 Screen *xs; 1997 Screen *xs;
2284 Window pw, win; 1998 Window pw, win;
2285 XSetWindowAttributes xswa; 1999 XSetWindowAttributes xswa;
2286 Mask valueMask = 0; 2000 Mask valueMask = 0;
2287 unsigned int w = IMAGE_INSTANCE_WIDTH (ii), 2001 unsigned int w = IMAGE_INSTANCE_SUBWINDOW_WIDTH (ii),
2288 h = IMAGE_INSTANCE_HEIGHT (ii); 2002 h = IMAGE_INSTANCE_SUBWINDOW_HEIGHT (ii);
2289 2003
2290 if (!DEVICE_X_P (XDEVICE (device))) 2004 if (!DEVICE_X_P (XDEVICE (device)))
2291 signal_simple_error ("Not an X device", device); 2005 signal_simple_error ("Not an X device", device);
2292 2006
2293 dpy = DEVICE_X_DISPLAY (XDEVICE (device)); 2007 dpy = DEVICE_X_DISPLAY (XDEVICE (device));
2294 xs = DefaultScreenOfDisplay (dpy); 2008 xs = DefaultScreenOfDisplay (dpy);
2295 2009
2296 IMAGE_INSTANCE_TYPE (ii) = IMAGE_SUBWINDOW; 2010 if (dest_mask & IMAGE_SUBWINDOW_MASK)
2011 IMAGE_INSTANCE_TYPE (ii) = IMAGE_SUBWINDOW;
2012 else
2013 incompatible_image_types (instantiator, dest_mask,
2014 IMAGE_SUBWINDOW_MASK);
2297 2015
2298 pw = XtWindow (FRAME_X_TEXT_WIDGET (f)); 2016 pw = XtWindow (FRAME_X_TEXT_WIDGET (f));
2299 2017
2300 ii->data = xnew_and_zero (struct x_subwindow_data); 2018 ii->data = xnew_and_zero (struct x_subwindow_data);
2301 2019
2302 IMAGE_INSTANCE_X_SUBWINDOW_PARENT (ii) = pw; 2020 IMAGE_INSTANCE_X_SUBWINDOW_PARENT (ii) = pw;
2303 IMAGE_INSTANCE_X_SUBWINDOW_DISPLAY (ii) = DisplayOfScreen (xs); 2021 IMAGE_INSTANCE_X_SUBWINDOW_SCREEN (ii) = xs;
2304 2022
2305 xswa.backing_store = Always; 2023 xswa.backing_store = Always;
2306 valueMask |= CWBackingStore; 2024 valueMask |= CWBackingStore;
2307 xswa.colormap = DefaultColormapOfScreen (xs); 2025 xswa.colormap = DefaultColormapOfScreen (xs);
2308 valueMask |= CWColormap; 2026 valueMask |= CWColormap;
2309 2027
2310 /* Create a window for clipping */ 2028 win = XCreateWindow (dpy, pw, 0, 0, w, h, 0, CopyFromParent,
2311 IMAGE_INSTANCE_X_CLIPWINDOW (ii) =
2312 XCreateWindow (dpy, pw, 0, 0, w, h, 0, CopyFromParent,
2313 InputOutput, CopyFromParent, valueMask,
2314 &xswa);
2315
2316 /* Now put the subwindow inside the clip window. */
2317 win = XCreateWindow (dpy, IMAGE_INSTANCE_X_CLIPWINDOW (ii),
2318 0, 0, w, h, 0, CopyFromParent,
2319 InputOutput, CopyFromParent, valueMask, 2029 InputOutput, CopyFromParent, valueMask,
2320 &xswa); 2030 &xswa);
2321 2031
2322 IMAGE_INSTANCE_SUBWINDOW_ID (ii) = (void*)win; 2032 IMAGE_INSTANCE_SUBWINDOW_ID (ii) = (void*)win;
2323 } 2033 }
2324 2034
2325 #if 0 2035 #if 0
2326 /* #### Should this function exist? If there's any doubt I'm not implementing it --andyp */ 2036 /* #### Should this function exist? If there's any doubt I'm not implementing it --andyp */
2329 Subwindows are not currently implemented. 2039 Subwindows are not currently implemented.
2330 */ 2040 */
2331 (subwindow, property, data)) 2041 (subwindow, property, data))
2332 { 2042 {
2333 Atom property_atom; 2043 Atom property_atom;
2334 Lisp_Subwindow *sw; 2044 struct Lisp_Subwindow *sw;
2335 Display *dpy; 2045 Display *dpy;
2336 2046
2337 CHECK_SUBWINDOW (subwindow); 2047 CHECK_SUBWINDOW (subwindow);
2338 CHECK_STRING (property); 2048 CHECK_STRING (property);
2339 CHECK_STRING (data); 2049 CHECK_STRING (data);
2350 2060
2351 return property; 2061 return property;
2352 } 2062 }
2353 #endif 2063 #endif
2354 2064
2355 2065 static void
2356 #ifdef HAVE_WIDGETS 2066 x_resize_subwindow (struct Lisp_Image_Instance* ii, int w, int h)
2357 2067 {
2358 /************************************************************************/ 2068 XResizeWindow (DisplayOfScreen (IMAGE_INSTANCE_X_SUBWINDOW_SCREEN (ii)),
2359 /* widgets */ 2069 IMAGE_INSTANCE_X_SUBWINDOW_ID (ii),
2360 /************************************************************************/ 2070 w, h);
2361 2071 }
2362 static void
2363 update_widget_face (widget_value* wv, Lisp_Image_Instance *ii,
2364 Lisp_Object domain)
2365 {
2366 #ifdef LWLIB_WIDGETS_MOTIF
2367 XmFontList fontList;
2368 #endif
2369 /* Update the foreground. */
2370 Lisp_Object pixel = FACE_FOREGROUND
2371 (IMAGE_INSTANCE_WIDGET_FACE (ii),
2372 domain);
2373 XColor fcolor = COLOR_INSTANCE_X_COLOR (XCOLOR_INSTANCE (pixel)), bcolor;
2374 lw_add_widget_value_arg (wv, XtNforeground, fcolor.pixel);
2375
2376 /* Update the background. */
2377 pixel = FACE_BACKGROUND (IMAGE_INSTANCE_WIDGET_FACE (ii),
2378 domain);
2379 bcolor = COLOR_INSTANCE_X_COLOR (XCOLOR_INSTANCE (pixel));
2380 lw_add_widget_value_arg (wv, XtNbackground, bcolor.pixel);
2381
2382 #ifdef LWLIB_WIDGETS_MOTIF
2383 fontList = XmFontListCreate
2384 (FONT_INSTANCE_X_FONT
2385 (XFONT_INSTANCE (query_string_font
2386 (IMAGE_INSTANCE_WIDGET_TEXT (ii),
2387 IMAGE_INSTANCE_WIDGET_FACE (ii),
2388 domain))), XmSTRING_DEFAULT_CHARSET);
2389 lw_add_widget_value_arg (wv, XmNfontList, (XtArgVal)fontList);
2390 #endif
2391 lw_add_widget_value_arg
2392 (wv, XtNfont, (XtArgVal)FONT_INSTANCE_X_FONT
2393 (XFONT_INSTANCE (query_string_font
2394 (IMAGE_INSTANCE_WIDGET_TEXT (ii),
2395 IMAGE_INSTANCE_WIDGET_FACE (ii),
2396 domain))));
2397 }
2398
2399 static void
2400 update_tab_widget_face (widget_value* wv, Lisp_Image_Instance *ii,
2401 Lisp_Object domain)
2402 {
2403 if (wv->contents)
2404 {
2405 widget_value* val = wv->contents, *cur;
2406
2407 /* Give each child label the correct foreground color. */
2408 Lisp_Object pixel = FACE_FOREGROUND
2409 (IMAGE_INSTANCE_WIDGET_FACE (ii),
2410 domain);
2411 XColor fcolor = COLOR_INSTANCE_X_COLOR (XCOLOR_INSTANCE (pixel));
2412 lw_add_widget_value_arg (val, XtNtabForeground, fcolor.pixel);
2413
2414 for (cur = val->next; cur; cur = cur->next)
2415 {
2416 if (cur->value)
2417 {
2418 lw_copy_widget_value_args (val, cur);
2419 }
2420 }
2421 }
2422 }
2423
2424 static void
2425 x_widget_instantiate (Lisp_Object image_instance, Lisp_Object instantiator,
2426 Lisp_Object pointer_fg, Lisp_Object pointer_bg,
2427 int dest_mask, Lisp_Object domain,
2428 const char* type, widget_value* wv)
2429 {
2430 Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance);
2431 Lisp_Object device = IMAGE_INSTANCE_DEVICE (ii), pixel;
2432 struct device* d = XDEVICE (device);
2433 Lisp_Object frame = DOMAIN_FRAME (domain);
2434 struct frame* f = XFRAME (frame);
2435 char* nm=0;
2436 Widget wid;
2437 Arg al [32];
2438 int ac = 0;
2439 int id = new_lwlib_id ();
2440 widget_value* clip_wv;
2441 XColor fcolor, bcolor;
2442
2443 if (!DEVICE_X_P (d))
2444 signal_simple_error ("Not an X device", device);
2445
2446 /* have to set the type this late in case there is no device
2447 instantiation for a widget. But we can go ahead and do it without
2448 checking because there is always a generic instantiator. */
2449 IMAGE_INSTANCE_TYPE (ii) = IMAGE_WIDGET;
2450
2451 if (!NILP (IMAGE_INSTANCE_WIDGET_TEXT (ii)))
2452 TO_EXTERNAL_FORMAT (LISP_STRING, IMAGE_INSTANCE_WIDGET_TEXT (ii),
2453 C_STRING_ALLOCA, nm,
2454 Qnative);
2455
2456 ii->data = xnew_and_zero (struct x_subwindow_data);
2457
2458 /* Create a clip window to contain the subwidget. Incredibly the
2459 XEmacs manager seems to be the most appropriate widget for
2460 this. Nothing else is simple enough and yet does what is
2461 required. */
2462 clip_wv = xmalloc_widget_value ();
2463
2464 lw_add_widget_value_arg (clip_wv, XtNresize, False);
2465 lw_add_widget_value_arg (clip_wv, XtNwidth,
2466 (Dimension)IMAGE_INSTANCE_WIDTH (ii));
2467 lw_add_widget_value_arg (clip_wv, XtNheight,
2468 (Dimension)IMAGE_INSTANCE_HEIGHT (ii));
2469 clip_wv->enabled = True;
2470
2471 clip_wv->name = xstrdup ("clip-window");
2472 clip_wv->value = xstrdup ("clip-window");
2473
2474 IMAGE_INSTANCE_X_CLIPWIDGET (ii)
2475 = lw_create_widget ("clip-window", "clip-window", new_lwlib_id (),
2476 clip_wv, FRAME_X_CONTAINER_WIDGET (f),
2477 False, 0, 0, 0);
2478
2479 free_widget_value_tree (clip_wv);
2480
2481 /* copy any args we were given */
2482 ac = 0;
2483 lw_add_value_args_to_args (wv, al, &ac);
2484
2485 /* Fixup the colors. We have to do this *before* the widget gets
2486 created so that Motif will fix up the shadow colors
2487 correctly. Once the widget is created Motif won't do this
2488 anymore...*/
2489 pixel = FACE_FOREGROUND
2490 (IMAGE_INSTANCE_WIDGET_FACE (ii),
2491 IMAGE_INSTANCE_FRAME (ii));
2492 fcolor = COLOR_INSTANCE_X_COLOR (XCOLOR_INSTANCE (pixel));
2493
2494 pixel = FACE_BACKGROUND
2495 (IMAGE_INSTANCE_WIDGET_FACE (ii),
2496 IMAGE_INSTANCE_FRAME (ii));
2497 bcolor = COLOR_INSTANCE_X_COLOR (XCOLOR_INSTANCE (pixel));
2498
2499 lw_add_widget_value_arg (wv, XtNbackground, bcolor.pixel);
2500 lw_add_widget_value_arg (wv, XtNforeground, fcolor.pixel);
2501 /* we cannot allow widgets to resize themselves */
2502 lw_add_widget_value_arg (wv, XtNresize, False);
2503 lw_add_widget_value_arg (wv, XtNwidth,
2504 (Dimension)IMAGE_INSTANCE_WIDTH (ii));
2505 lw_add_widget_value_arg (wv, XtNheight,
2506 (Dimension)IMAGE_INSTANCE_HEIGHT (ii));
2507 /* update the font. */
2508 update_widget_face (wv, ii, domain);
2509
2510 wid = lw_create_widget (type, wv->name, id, wv, IMAGE_INSTANCE_X_CLIPWIDGET (ii),
2511 False, 0, popup_selection_callback, 0);
2512
2513 IMAGE_INSTANCE_SUBWINDOW_ID (ii) = (void*)wid;
2514 IMAGE_INSTANCE_X_WIDGET_LWID (ii) = id;
2515 /* because the EmacsManager is the widgets parent we have to
2516 offset the redisplay of the widget by the amount the text
2517 widget is inside the manager. */
2518 ac = 0;
2519 XtSetArg (al [ac], XtNx, &IMAGE_INSTANCE_X_WIDGET_XOFFSET (ii)); ac++;
2520 XtSetArg (al [ac], XtNy, &IMAGE_INSTANCE_X_WIDGET_YOFFSET (ii)); ac++;
2521 XtGetValues (FRAME_X_TEXT_WIDGET (f), al, ac);
2522
2523 XtSetMappedWhenManaged (wid, TRUE);
2524
2525 free_widget_value_tree (wv);
2526 /* A kludgy but simple way to make sure the callback for a widget
2527 doesn't get deleted. */
2528 gcpro_popup_callbacks (id);
2529 }
2530
2531 /* get properties of a control */
2532 static Lisp_Object
2533 x_widget_property (Lisp_Object image_instance, Lisp_Object prop)
2534 {
2535 Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance);
2536 /* get the text from a control */
2537 if (EQ (prop, Q_text))
2538 {
2539 widget_value* wv = lw_get_all_values (IMAGE_INSTANCE_X_WIDGET_LWID (ii));
2540 return build_ext_string (wv->value, Qnative);
2541 }
2542 return Qunbound;
2543 }
2544
2545 /* Instantiate a layout control for putting other widgets in. */
2546 static void
2547 x_native_layout_instantiate (Lisp_Object image_instance, Lisp_Object instantiator,
2548 Lisp_Object pointer_fg, Lisp_Object pointer_bg,
2549 int dest_mask, Lisp_Object domain)
2550 {
2551 x_widget_instantiate (image_instance, instantiator, pointer_fg,
2552 pointer_bg, dest_mask, domain, "layout", 0);
2553 }
2554
2555 /* Instantiate a button widget. Unfortunately instantiated widgets are
2556 particular to a frame since they need to have a parent. It's not
2557 like images where you just select the image into the context you
2558 want to display it in and BitBlt it. So images instances can have a
2559 many-to-one relationship with things you see, whereas widgets can
2560 only be one-to-one (i.e. per frame) */
2561 static void
2562 x_button_instantiate (Lisp_Object image_instance, Lisp_Object instantiator,
2563 Lisp_Object pointer_fg, Lisp_Object pointer_bg,
2564 int dest_mask, Lisp_Object domain)
2565 {
2566 Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance);
2567 Lisp_Object gui = IMAGE_INSTANCE_WIDGET_ITEM (ii);
2568 Lisp_Object glyph = find_keyword_in_vector (instantiator, Q_image);
2569 widget_value* wv = gui_items_to_widget_values (image_instance, gui);
2570
2571 if (!NILP (glyph))
2572 {
2573 if (!IMAGE_INSTANCEP (glyph))
2574 glyph = glyph_image_instance (glyph, domain, ERROR_ME, 1);
2575 }
2576
2577 x_widget_instantiate (image_instance, instantiator, pointer_fg,
2578 pointer_bg, dest_mask, domain, "button", wv);
2579
2580 /* add the image if one was given */
2581 if (!NILP (glyph) && IMAGE_INSTANCEP (glyph)
2582 && IMAGE_INSTANCE_PIXMAP_TYPE_P (XIMAGE_INSTANCE (glyph)))
2583 {
2584 Arg al [2];
2585 int ac =0;
2586 #ifdef LWLIB_WIDGETS_MOTIF
2587 XtSetArg (al [ac], XmNlabelType, XmPIXMAP); ac++;
2588 XtSetArg (al [ac], XmNlabelPixmap, XIMAGE_INSTANCE_X_PIXMAP (glyph));ac++;
2589 #else
2590 XtSetArg (al [ac], XtNpixmap, XIMAGE_INSTANCE_X_PIXMAP (glyph)); ac++;
2591 #endif
2592 XtSetValues (IMAGE_INSTANCE_X_WIDGET_ID (ii), al, ac);
2593 }
2594 }
2595
2596 /* Update a button's clicked state.
2597
2598 #### This is overkill, but it works. Right now this causes all
2599 button instances to flash for some reason buried deep in lwlib. In
2600 theory this should be the Right Thing to do since lwlib should only
2601 merge in changed values - and if nothing has changed then nothing
2602 should get done. This may be because of the args stuff,
2603 i.e. although the arg contents may be the same the args look
2604 different and so are re-applied to the widget. */
2605 static void
2606 x_button_update (Lisp_Object image_instance)
2607 {
2608 /* This function can GC if IN_REDISPLAY is false. */
2609 Lisp_Image_Instance *p = XIMAGE_INSTANCE (image_instance);
2610 widget_value* wv =
2611 gui_items_to_widget_values (image_instance,
2612 IMAGE_INSTANCE_WIDGET_ITEMS (p));
2613
2614 /* now modify the widget */
2615 lw_modify_all_widgets (IMAGE_INSTANCE_X_WIDGET_LWID (p),
2616 wv, True);
2617 free_widget_value_tree (wv);
2618 }
2619
2620 /* get properties of a button */
2621 static Lisp_Object
2622 x_button_property (Lisp_Object image_instance, Lisp_Object prop)
2623 {
2624 Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance);
2625 /* check the state of a button */
2626 if (EQ (prop, Q_selected))
2627 {
2628 widget_value* wv = lw_get_all_values (IMAGE_INSTANCE_X_WIDGET_LWID (ii));
2629
2630 if (wv->selected)
2631 return Qt;
2632 else
2633 return Qnil;
2634 }
2635 return Qunbound;
2636 }
2637
2638 /* instantiate a progress gauge */
2639 static void
2640 x_progress_gauge_instantiate (Lisp_Object image_instance, Lisp_Object instantiator,
2641 Lisp_Object pointer_fg, Lisp_Object pointer_bg,
2642 int dest_mask, Lisp_Object domain)
2643 {
2644 Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance);
2645 Lisp_Object gui = IMAGE_INSTANCE_WIDGET_ITEM (ii);
2646 widget_value* wv = gui_items_to_widget_values (image_instance, gui);
2647
2648 x_widget_instantiate (image_instance, instantiator, pointer_fg,
2649 pointer_bg, dest_mask, domain, "progress", wv);
2650 }
2651
2652 /* set the properties of a progres guage */
2653 static void
2654 x_progress_gauge_update (Lisp_Object image_instance)
2655 {
2656 Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance);
2657
2658 if (IMAGE_INSTANCE_WIDGET_ITEMS_CHANGED (ii))
2659 {
2660 Arg al [1];
2661 Lisp_Object val;
2662 #ifdef ERROR_CHECK_GLYPHS
2663 assert (GUI_ITEMP (IMAGE_INSTANCE_WIDGET_PENDING_ITEMS (ii)));
2664 #endif
2665 val = XGUI_ITEM (IMAGE_INSTANCE_WIDGET_PENDING_ITEMS (ii))->value;
2666 XtSetArg (al[0], XtNvalue, XINT (val));
2667 XtSetValues (IMAGE_INSTANCE_X_WIDGET_ID (ii), al, 1);
2668 }
2669 }
2670
2671 /* instantiate an edit control */
2672 static void
2673 x_edit_field_instantiate (Lisp_Object image_instance, Lisp_Object instantiator,
2674 Lisp_Object pointer_fg, Lisp_Object pointer_bg,
2675 int dest_mask, Lisp_Object domain)
2676 {
2677 Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance);
2678 Lisp_Object gui = IMAGE_INSTANCE_WIDGET_ITEM (ii);
2679 widget_value* wv = gui_items_to_widget_values (image_instance, gui);
2680
2681 x_widget_instantiate (image_instance, instantiator, pointer_fg,
2682 pointer_bg, dest_mask, domain, "text-field", wv);
2683 }
2684
2685 #if defined (LWLIB_WIDGETS_MOTIF) && XmVERSION > 1
2686 /* instantiate a combo control */
2687 static void
2688 x_combo_box_instantiate (Lisp_Object image_instance, Lisp_Object instantiator,
2689 Lisp_Object pointer_fg, Lisp_Object pointer_bg,
2690 int dest_mask, Lisp_Object domain)
2691 {
2692 Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance);
2693 widget_value * wv = 0;
2694 /* This is not done generically because of sizing problems under
2695 mswindows. */
2696 widget_instantiate (image_instance, instantiator, pointer_fg,
2697 pointer_bg, dest_mask, domain);
2698
2699 wv = gui_items_to_widget_values (image_instance,
2700 IMAGE_INSTANCE_WIDGET_ITEMS (ii));
2701
2702 x_widget_instantiate (image_instance, instantiator, pointer_fg,
2703 pointer_bg, dest_mask, domain, "combo-box", wv);
2704 }
2705 #endif
2706
2707 static void
2708 x_tab_control_instantiate (Lisp_Object image_instance, Lisp_Object instantiator,
2709 Lisp_Object pointer_fg, Lisp_Object pointer_bg,
2710 int dest_mask, Lisp_Object domain)
2711 {
2712 Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance);
2713 widget_value * wv =
2714 gui_items_to_widget_values (image_instance,
2715 IMAGE_INSTANCE_WIDGET_ITEMS (ii));
2716
2717 update_tab_widget_face (wv, ii,
2718 IMAGE_INSTANCE_FRAME (ii));
2719
2720 x_widget_instantiate (image_instance, instantiator, pointer_fg,
2721 pointer_bg, dest_mask, domain, "tab-control", wv);
2722 }
2723
2724 /* set the properties of a tab control */
2725 static void
2726 x_tab_control_update (Lisp_Object image_instance)
2727 {
2728 Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance);
2729
2730 /* Possibly update the face. */
2731 if (IMAGE_INSTANCE_WIDGET_FACE_CHANGED (ii)
2732 ||
2733 XFRAME (IMAGE_INSTANCE_FRAME (ii))->faces_changed
2734 ||
2735 IMAGE_INSTANCE_WIDGET_ITEMS_CHANGED (ii))
2736 {
2737 widget_value* wv = lw_get_all_values (IMAGE_INSTANCE_X_WIDGET_LWID (ii));
2738
2739 /* #### I don't know why this can occur. */
2740 if (!wv)
2741 return;
2742
2743 update_tab_widget_face (wv, ii,
2744 IMAGE_INSTANCE_FRAME (ii));
2745
2746 lw_modify_all_widgets (IMAGE_INSTANCE_X_WIDGET_LWID (ii), wv, True);
2747 }
2748 }
2749
2750 /* instantiate a static control possible for putting other things in */
2751 static void
2752 x_label_instantiate (Lisp_Object image_instance, Lisp_Object instantiator,
2753 Lisp_Object pointer_fg, Lisp_Object pointer_bg,
2754 int dest_mask, Lisp_Object domain)
2755 {
2756 Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance);
2757 Lisp_Object gui = IMAGE_INSTANCE_WIDGET_ITEM (ii);
2758 widget_value* wv = gui_items_to_widget_values (image_instance, gui);
2759
2760 x_widget_instantiate (image_instance, instantiator, pointer_fg,
2761 pointer_bg, dest_mask, domain, "button", wv);
2762 }
2763 #endif /* HAVE_WIDGETS */
2764 2072
2765 2073
2766 /************************************************************************/ 2074 /************************************************************************/
2767 /* initialization */ 2075 /* initialization */
2768 /************************************************************************/ 2076 /************************************************************************/
2787 CONSOLE_HAS_METHOD (x, colorize_image_instance); 2095 CONSOLE_HAS_METHOD (x, colorize_image_instance);
2788 CONSOLE_HAS_METHOD (x, init_image_instance_from_eimage); 2096 CONSOLE_HAS_METHOD (x, init_image_instance_from_eimage);
2789 CONSOLE_HAS_METHOD (x, locate_pixmap_file); 2097 CONSOLE_HAS_METHOD (x, locate_pixmap_file);
2790 CONSOLE_HAS_METHOD (x, unmap_subwindow); 2098 CONSOLE_HAS_METHOD (x, unmap_subwindow);
2791 CONSOLE_HAS_METHOD (x, map_subwindow); 2099 CONSOLE_HAS_METHOD (x, map_subwindow);
2792 CONSOLE_HAS_METHOD (x, update_widget); 2100 CONSOLE_HAS_METHOD (x, resize_subwindow);
2793 CONSOLE_HAS_METHOD (x, update_subwindow);
2794 } 2101 }
2795 2102
2796 void 2103 void
2797 image_instantiator_format_create_glyphs_x (void) 2104 image_instantiator_format_create_glyphs_x (void)
2798 { 2105 {
2799 IIFORMAT_VALID_CONSOLE (x, nothing);
2800 IIFORMAT_VALID_CONSOLE (x, string);
2801 #ifdef HAVE_WIDGETS
2802 IIFORMAT_VALID_CONSOLE (x, layout);
2803 #endif
2804 IIFORMAT_VALID_CONSOLE (x, formatted_string);
2805 IIFORMAT_VALID_CONSOLE (x, inherit);
2806 #ifdef HAVE_XPM 2106 #ifdef HAVE_XPM
2807 INITIALIZE_DEVICE_IIFORMAT (x, xpm); 2107 INITIALIZE_DEVICE_IIFORMAT (x, xpm);
2808 IIFORMAT_HAS_DEVMETHOD (x, xpm, instantiate); 2108 IIFORMAT_HAS_DEVMETHOD (x, xpm, instantiate);
2809 #endif 2109 #endif
2810 #ifdef HAVE_JPEG
2811 IIFORMAT_VALID_CONSOLE (x, jpeg);
2812 #endif
2813 #ifdef HAVE_TIFF
2814 IIFORMAT_VALID_CONSOLE (x, tiff);
2815 #endif
2816 #ifdef HAVE_PNG
2817 IIFORMAT_VALID_CONSOLE (x, png);
2818 #endif
2819 #ifdef HAVE_GIF
2820 IIFORMAT_VALID_CONSOLE (x, gif);
2821 #endif
2822 INITIALIZE_DEVICE_IIFORMAT (x, xbm); 2110 INITIALIZE_DEVICE_IIFORMAT (x, xbm);
2823 IIFORMAT_HAS_DEVMETHOD (x, xbm, instantiate); 2111 IIFORMAT_HAS_DEVMETHOD (x, xbm, instantiate);
2824 2112
2825 INITIALIZE_DEVICE_IIFORMAT (x, subwindow); 2113 INITIALIZE_DEVICE_IIFORMAT (x, subwindow);
2826 IIFORMAT_HAS_DEVMETHOD (x, subwindow, instantiate); 2114 IIFORMAT_HAS_DEVMETHOD (x, subwindow, instantiate);
2827 #ifdef HAVE_WIDGETS 2115
2828 /* layout widget */
2829 INITIALIZE_DEVICE_IIFORMAT (x, native_layout);
2830 IIFORMAT_HAS_DEVMETHOD (x, native_layout, instantiate);
2831 /* button widget */
2832 INITIALIZE_DEVICE_IIFORMAT (x, button);
2833 IIFORMAT_HAS_DEVMETHOD (x, button, property);
2834 IIFORMAT_HAS_DEVMETHOD (x, button, instantiate);
2835 IIFORMAT_HAS_DEVMETHOD (x, button, update);
2836 /* general widget methods. */
2837 INITIALIZE_DEVICE_IIFORMAT (x, widget);
2838 IIFORMAT_HAS_DEVMETHOD (x, widget, property);
2839 /* progress gauge */
2840 INITIALIZE_DEVICE_IIFORMAT (x, progress_gauge);
2841 IIFORMAT_HAS_DEVMETHOD (x, progress_gauge, update);
2842 IIFORMAT_HAS_DEVMETHOD (x, progress_gauge, instantiate);
2843 /* text field */
2844 INITIALIZE_DEVICE_IIFORMAT (x, edit_field);
2845 IIFORMAT_HAS_DEVMETHOD (x, edit_field, instantiate);
2846 #if defined (LWLIB_WIDGETS_MOTIF) && XmVERSION > 1
2847 /* combo box */
2848 INITIALIZE_DEVICE_IIFORMAT (x, combo_box);
2849 IIFORMAT_HAS_DEVMETHOD (x, combo_box, instantiate);
2850 IIFORMAT_HAS_SHARED_DEVMETHOD (x, combo_box, update, tab_control);
2851 #endif
2852 /* tab control widget */
2853 INITIALIZE_DEVICE_IIFORMAT (x, tab_control);
2854 IIFORMAT_HAS_DEVMETHOD (x, tab_control, instantiate);
2855 IIFORMAT_HAS_DEVMETHOD (x, tab_control, update);
2856 /* label */
2857 INITIALIZE_DEVICE_IIFORMAT (x, label);
2858 IIFORMAT_HAS_DEVMETHOD (x, label, instantiate);
2859 #endif
2860 INITIALIZE_IMAGE_INSTANTIATOR_FORMAT (cursor_font, "cursor-font"); 2116 INITIALIZE_IMAGE_INSTANTIATOR_FORMAT (cursor_font, "cursor-font");
2861 IIFORMAT_VALID_CONSOLE (x, cursor_font);
2862 2117
2863 IIFORMAT_HAS_METHOD (cursor_font, validate); 2118 IIFORMAT_HAS_METHOD (cursor_font, validate);
2864 IIFORMAT_HAS_METHOD (cursor_font, possible_dest_types); 2119 IIFORMAT_HAS_METHOD (cursor_font, possible_dest_types);
2865 IIFORMAT_HAS_METHOD (cursor_font, instantiate); 2120 IIFORMAT_HAS_METHOD (cursor_font, instantiate);
2866 2121
2871 INITIALIZE_IMAGE_INSTANTIATOR_FORMAT (font, "font"); 2126 INITIALIZE_IMAGE_INSTANTIATOR_FORMAT (font, "font");
2872 2127
2873 IIFORMAT_HAS_METHOD (font, validate); 2128 IIFORMAT_HAS_METHOD (font, validate);
2874 IIFORMAT_HAS_METHOD (font, possible_dest_types); 2129 IIFORMAT_HAS_METHOD (font, possible_dest_types);
2875 IIFORMAT_HAS_METHOD (font, instantiate); 2130 IIFORMAT_HAS_METHOD (font, instantiate);
2876 IIFORMAT_VALID_CONSOLE (x, font);
2877 2131
2878 IIFORMAT_VALID_KEYWORD (font, Q_data, check_valid_string); 2132 IIFORMAT_VALID_KEYWORD (font, Q_data, check_valid_string);
2879 IIFORMAT_VALID_KEYWORD (font, Q_foreground, check_valid_string); 2133 IIFORMAT_VALID_KEYWORD (font, Q_foreground, check_valid_string);
2880 IIFORMAT_VALID_KEYWORD (font, Q_background, check_valid_string); 2134 IIFORMAT_VALID_KEYWORD (font, Q_background, check_valid_string);
2881 2135
2889 2143
2890 IIFORMAT_HAS_METHOD (autodetect, validate); 2144 IIFORMAT_HAS_METHOD (autodetect, validate);
2891 IIFORMAT_HAS_METHOD (autodetect, normalize); 2145 IIFORMAT_HAS_METHOD (autodetect, normalize);
2892 IIFORMAT_HAS_METHOD (autodetect, possible_dest_types); 2146 IIFORMAT_HAS_METHOD (autodetect, possible_dest_types);
2893 IIFORMAT_HAS_METHOD (autodetect, instantiate); 2147 IIFORMAT_HAS_METHOD (autodetect, instantiate);
2894 IIFORMAT_VALID_CONSOLE (x, autodetect);
2895 2148
2896 IIFORMAT_VALID_KEYWORD (autodetect, Q_data, check_valid_string); 2149 IIFORMAT_VALID_KEYWORD (autodetect, Q_data, check_valid_string);
2897 } 2150 }
2898 2151
2899 void 2152 void
2917 vector3 (Qxbm, Q_data, \ 2170 vector3 (Qxbm, Q_data, \
2918 list3 (make_int (name##_width), \ 2171 list3 (make_int (name##_width), \
2919 make_int (name##_height), \ 2172 make_int (name##_height), \
2920 make_ext_string (name##_bits, \ 2173 make_ext_string (name##_bits, \
2921 sizeof (name##_bits), \ 2174 sizeof (name##_bits), \
2922 Qbinary))), \ 2175 FORMAT_BINARY))), \
2923 Qglobal, Qx, Qnil) 2176 Qglobal, Qx, Qnil)
2924 2177
2925 BUILD_GLYPH_INST (Vtruncation_glyph, truncator); 2178 BUILD_GLYPH_INST (Vtruncation_glyph, truncator);
2926 BUILD_GLYPH_INST (Vcontinuation_glyph, continuer); 2179 BUILD_GLYPH_INST (Vcontinuation_glyph, continuer);
2927 BUILD_GLYPH_INST (Vxemacs_logo, xemacs); 2180 BUILD_GLYPH_INST (Vxemacs_logo, xemacs);