comparison src/glyphs-x.c @ 424:11054d720c21 r21-2-20

Import from CVS: tag r21-2-20
author cvs
date Mon, 13 Aug 2007 11:26:11 +0200
parents 95016f13131a
children
comparison
equal deleted inserted replaced
423:28d9c139be4c 424:11054d720c21
38 Pointer/icon overhaul, more restructuring by Ben Wing for 19.14 38 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 39 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 40 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 41 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 42 TIFF code by Jareth Hein for 21.0
43 GIF/JPEG/PNG/TIFF code moved to new glyph-eimage.c for 21.0 43 GIF/JPEG/PNG/TIFF code moved to new glyph-eimage.c by Andy Piper for 21.0
44 Subwindow and Widget support by Andy Piper for 21.2
44 45
45 TODO: 46 TODO:
46 Convert images.el to C and stick it in here? 47 Convert images.el to C and stick it in here?
47 */ 48 */
48 49
50 #include "lisp.h" 51 #include "lisp.h"
51 #include "lstream.h" 52 #include "lstream.h"
52 #include "console-x.h" 53 #include "console-x.h"
53 #include "glyphs-x.h" 54 #include "glyphs-x.h"
54 #include "objects-x.h" 55 #include "objects-x.h"
56 #ifdef HAVE_WIDGETS
55 #include "gui-x.h" 57 #include "gui-x.h"
58 #endif
56 #include "xmu.h" 59 #include "xmu.h"
57 60
58 #include "buffer.h" 61 #include "buffer.h"
59 #include "window.h" 62 #include "window.h"
60 #include "frame.h" 63 #include "frame.h"
71 74
72 #ifdef FILE_CODING 75 #ifdef FILE_CODING
73 #include "file-coding.h" 76 #include "file-coding.h"
74 #endif 77 #endif
75 78
76 #ifdef LWLIB_USES_MOTIF 79 #ifdef LWLIB_WIDGETS_MOTIF
77 #include <Xm/Xm.h> 80 #include <Xm/Xm.h>
78 #endif 81 #endif
79 #include <X11/IntrinsicP.h> 82 #include <X11/IntrinsicP.h>
80 83
81 #if INTBITS == 32 84 #if INTBITS == 32
92 95
93 DECLARE_IMAGE_INSTANTIATOR_FORMAT (nothing); 96 DECLARE_IMAGE_INSTANTIATOR_FORMAT (nothing);
94 DECLARE_IMAGE_INSTANTIATOR_FORMAT (string); 97 DECLARE_IMAGE_INSTANTIATOR_FORMAT (string);
95 DECLARE_IMAGE_INSTANTIATOR_FORMAT (formatted_string); 98 DECLARE_IMAGE_INSTANTIATOR_FORMAT (formatted_string);
96 DECLARE_IMAGE_INSTANTIATOR_FORMAT (inherit); 99 DECLARE_IMAGE_INSTANTIATOR_FORMAT (inherit);
100 DECLARE_IMAGE_INSTANTIATOR_FORMAT (layout);
97 #ifdef HAVE_JPEG 101 #ifdef HAVE_JPEG
98 DECLARE_IMAGE_INSTANTIATOR_FORMAT (jpeg); 102 DECLARE_IMAGE_INSTANTIATOR_FORMAT (jpeg);
99 #endif 103 #endif
100 #ifdef HAVE_TIFF 104 #ifdef HAVE_TIFF
101 DECLARE_IMAGE_INSTANTIATOR_FORMAT (tiff); 105 DECLARE_IMAGE_INSTANTIATOR_FORMAT (tiff);
120 124
121 DEFINE_IMAGE_INSTANTIATOR_FORMAT (font); 125 DEFINE_IMAGE_INSTANTIATOR_FORMAT (font);
122 126
123 DEFINE_IMAGE_INSTANTIATOR_FORMAT (autodetect); 127 DEFINE_IMAGE_INSTANTIATOR_FORMAT (autodetect);
124 128
129 #ifdef HAVE_WIDGETS
125 DEFINE_DEVICE_IIFORMAT (x, widget); 130 DEFINE_DEVICE_IIFORMAT (x, widget);
126 DEFINE_DEVICE_IIFORMAT (x, button); 131 DEFINE_DEVICE_IIFORMAT (x, button);
127 DEFINE_DEVICE_IIFORMAT (x, progress_gauge); 132 DEFINE_DEVICE_IIFORMAT (x, progress_gauge);
128 DEFINE_DEVICE_IIFORMAT (x, edit_field); 133 DEFINE_DEVICE_IIFORMAT (x, edit_field);
134 #if defined (LWLIB_WIDGETS_MOTIF) && XmVERSION > 1
129 DEFINE_DEVICE_IIFORMAT (x, combo_box); 135 DEFINE_DEVICE_IIFORMAT (x, combo_box);
136 #endif
137 DEFINE_DEVICE_IIFORMAT (x, tab_control);
138 DEFINE_DEVICE_IIFORMAT (x, label);
139 #endif
130 140
131 static void cursor_font_instantiate (Lisp_Object image_instance, 141 static void cursor_font_instantiate (Lisp_Object image_instance,
132 Lisp_Object instantiator, 142 Lisp_Object instantiator,
133 Lisp_Object pointer_fg, 143 Lisp_Object pointer_fg,
134 Lisp_Object pointer_bg, 144 Lisp_Object pointer_bg,
135 int dest_mask, 145 int dest_mask,
136 Lisp_Object domain); 146 Lisp_Object domain);
147
148 #ifdef HAVE_WIDGETS
149 static void
150 update_widget_face (struct Lisp_Image_Instance* ii, Lisp_Object domain);
151 #endif
137 152
138 #include "bitmaps.h" 153 #include "bitmaps.h"
139 154
140 155
141 /************************************************************************/ 156 /************************************************************************/
355 default: 370 default:
356 break; 371 break;
357 } 372 }
358 } 373 }
359 374
375 #ifdef DEBUG_WIDGETS
376 extern int debug_widget_instances;
377 #endif
378
360 static void 379 static void
361 x_finalize_image_instance (struct Lisp_Image_Instance *p) 380 x_finalize_image_instance (struct Lisp_Image_Instance *p)
362 { 381 {
363 if (!p->data) 382 if (!p->data)
364 return; 383 return;
369 388
370 if (IMAGE_INSTANCE_TYPE (p) == IMAGE_WIDGET) 389 if (IMAGE_INSTANCE_TYPE (p) == IMAGE_WIDGET)
371 { 390 {
372 if (IMAGE_INSTANCE_SUBWINDOW_ID (p)) 391 if (IMAGE_INSTANCE_SUBWINDOW_ID (p))
373 { 392 {
374 XtUnmanageChild (IMAGE_INSTANCE_X_WIDGET_ID (p)); 393 #ifdef DEBUG_WIDGETS
375 XtDestroyWidget (IMAGE_INSTANCE_X_WIDGET_ID (p)); 394 debug_widget_instances--;
395 stderr_out ("widget destroyed, %d left\n", debug_widget_instances);
396 #endif
397 lw_destroy_widget (IMAGE_INSTANCE_X_WIDGET_ID (p));
398 lw_destroy_widget (IMAGE_INSTANCE_X_CLIPWIDGET (p));
376 IMAGE_INSTANCE_SUBWINDOW_ID (p) = 0; 399 IMAGE_INSTANCE_SUBWINDOW_ID (p) = 0;
377 } 400 }
378 } 401 }
379 else if (IMAGE_INSTANCE_TYPE (p) == IMAGE_SUBWINDOW) 402 else if (IMAGE_INSTANCE_TYPE (p) == IMAGE_SUBWINDOW)
380 { 403 {
382 XDestroyWindow (dpy, IMAGE_INSTANCE_X_SUBWINDOW_ID (p)); 405 XDestroyWindow (dpy, IMAGE_INSTANCE_X_SUBWINDOW_ID (p));
383 IMAGE_INSTANCE_SUBWINDOW_ID (p) = 0; 406 IMAGE_INSTANCE_SUBWINDOW_ID (p) = 0;
384 } 407 }
385 else 408 else
386 { 409 {
387 if (IMAGE_INSTANCE_X_PIXMAP (p)) 410 int i;
388 XFreePixmap (dpy, IMAGE_INSTANCE_X_PIXMAP (p)); 411 if (IMAGE_INSTANCE_PIXMAP_TIMEOUT (p))
412 disable_glyph_animated_timeout (IMAGE_INSTANCE_PIXMAP_TIMEOUT (p));
413
389 if (IMAGE_INSTANCE_X_MASK (p) && 414 if (IMAGE_INSTANCE_X_MASK (p) &&
390 IMAGE_INSTANCE_X_MASK (p) != IMAGE_INSTANCE_X_PIXMAP (p)) 415 IMAGE_INSTANCE_X_MASK (p) != IMAGE_INSTANCE_X_PIXMAP (p))
391 XFreePixmap (dpy, IMAGE_INSTANCE_X_MASK (p)); 416 XFreePixmap (dpy, IMAGE_INSTANCE_X_MASK (p));
392 IMAGE_INSTANCE_X_PIXMAP (p) = 0; 417 IMAGE_INSTANCE_PIXMAP_MASK (p) = 0;
393 IMAGE_INSTANCE_X_MASK (p) = 0;
394 418
419 if (IMAGE_INSTANCE_X_PIXMAP_SLICES (p))
420 {
421 for (i = 0; i < IMAGE_INSTANCE_PIXMAP_MAXSLICE (p); i++)
422 if (IMAGE_INSTANCE_X_PIXMAP_SLICE (p,i))
423 {
424 XFreePixmap (dpy, IMAGE_INSTANCE_X_PIXMAP_SLICE (p,i));
425 IMAGE_INSTANCE_X_PIXMAP_SLICE (p, i) = 0;
426 }
427 xfree (IMAGE_INSTANCE_X_PIXMAP_SLICES (p));
428 IMAGE_INSTANCE_X_PIXMAP_SLICES (p) = 0;
429 }
430
395 if (IMAGE_INSTANCE_X_CURSOR (p)) 431 if (IMAGE_INSTANCE_X_CURSOR (p))
396 { 432 {
397 XFreeCursor (dpy, IMAGE_INSTANCE_X_CURSOR (p)); 433 XFreeCursor (dpy, IMAGE_INSTANCE_X_CURSOR (p));
398 IMAGE_INSTANCE_X_CURSOR (p) = 0; 434 IMAGE_INSTANCE_X_CURSOR (p) = 0;
399 } 435 }
406 IMAGE_INSTANCE_X_NPIXELS (p), 0); 442 IMAGE_INSTANCE_X_NPIXELS (p), 0);
407 IMAGE_INSTANCE_X_NPIXELS (p) = 0; 443 IMAGE_INSTANCE_X_NPIXELS (p) = 0;
408 } 444 }
409 } 445 }
410 } 446 }
411 if (IMAGE_INSTANCE_X_PIXELS (p)) 447 /* You can sometimes have pixels without a live device. I forget
448 why, but that's why we free them here if we have a pixmap type
449 image instance. It probably means that we might also get a memory
450 leak with widgets. */
451 if (IMAGE_INSTANCE_TYPE (p) != IMAGE_WIDGET
452 && IMAGE_INSTANCE_TYPE (p) != IMAGE_SUBWINDOW
453 && IMAGE_INSTANCE_X_PIXELS (p))
412 { 454 {
413 xfree (IMAGE_INSTANCE_X_PIXELS (p)); 455 xfree (IMAGE_INSTANCE_X_PIXELS (p));
414 IMAGE_INSTANCE_X_PIXELS (p) = 0; 456 IMAGE_INSTANCE_X_PIXELS (p) = 0;
415 } 457 }
416 458
458 instance is already set -- this is the case when instantiate 500 instance is already set -- this is the case when instantiate
459 methods are called. */ 501 methods are called. */
460 502
461 static void 503 static void
462 x_initialize_pixmap_image_instance (struct Lisp_Image_Instance *ii, 504 x_initialize_pixmap_image_instance (struct Lisp_Image_Instance *ii,
505 int slices,
463 enum image_instance_type type) 506 enum image_instance_type type)
464 { 507 {
465 ii->data = xnew_and_zero (struct x_image_instance_data); 508 ii->data = xnew_and_zero (struct x_image_instance_data);
509 IMAGE_INSTANCE_PIXMAP_MAXSLICE (ii) = slices;
510 IMAGE_INSTANCE_X_PIXMAP_SLICES (ii) =
511 xnew_array_and_zero (Pixmap, slices);
466 IMAGE_INSTANCE_TYPE (ii) = type; 512 IMAGE_INSTANCE_TYPE (ii) = type;
467 IMAGE_INSTANCE_PIXMAP_FILENAME (ii) = Qnil; 513 IMAGE_INSTANCE_PIXMAP_FILENAME (ii) = Qnil;
468 IMAGE_INSTANCE_PIXMAP_MASK_FILENAME (ii) = Qnil; 514 IMAGE_INSTANCE_PIXMAP_MASK_FILENAME (ii) = Qnil;
469 IMAGE_INSTANCE_PIXMAP_HOTSPOT_X (ii) = Qnil; 515 IMAGE_INSTANCE_PIXMAP_HOTSPOT_X (ii) = Qnil;
470 IMAGE_INSTANCE_PIXMAP_HOTSPOT_Y (ii) = Qnil; 516 IMAGE_INSTANCE_PIXMAP_HOTSPOT_Y (ii) = Qnil;
779 XImage *ximage, 825 XImage *ximage,
780 int dest_mask, 826 int dest_mask,
781 Colormap cmap, 827 Colormap cmap,
782 unsigned long *pixels, 828 unsigned long *pixels,
783 int npixels, 829 int npixels,
830 int slices,
784 Lisp_Object instantiator) 831 Lisp_Object instantiator)
785 { 832 {
786 Lisp_Object device = IMAGE_INSTANCE_DEVICE (ii); 833 Lisp_Object device = IMAGE_INSTANCE_DEVICE (ii);
787 Display *dpy; 834 Display *dpy;
788 GC gc; 835 GC gc;
814 XPutImage (dpy, pixmap, gc, ximage, 0, 0, 0, 0, 861 XPutImage (dpy, pixmap, gc, ximage, 0, 0, 0, 0,
815 ximage->width, ximage->height); 862 ximage->width, ximage->height);
816 863
817 XFreeGC (dpy, gc); 864 XFreeGC (dpy, gc);
818 865
819 x_initialize_pixmap_image_instance (ii, IMAGE_COLOR_PIXMAP); 866 x_initialize_pixmap_image_instance (ii, slices, IMAGE_COLOR_PIXMAP);
820 867
821 IMAGE_INSTANCE_PIXMAP_FILENAME (ii) = 868 IMAGE_INSTANCE_PIXMAP_FILENAME (ii) =
822 find_keyword_in_vector (instantiator, Q_file); 869 find_keyword_in_vector (instantiator, Q_file);
823 870
871 /* Fixup a set of pixmaps. */
824 IMAGE_INSTANCE_X_PIXMAP (ii) = pixmap; 872 IMAGE_INSTANCE_X_PIXMAP (ii) = pixmap;
825 IMAGE_INSTANCE_X_MASK (ii) = 0; 873
874 IMAGE_INSTANCE_PIXMAP_MASK (ii) = 0;
826 IMAGE_INSTANCE_PIXMAP_WIDTH (ii) = ximage->width; 875 IMAGE_INSTANCE_PIXMAP_WIDTH (ii) = ximage->width;
827 IMAGE_INSTANCE_PIXMAP_HEIGHT (ii) = ximage->height; 876 IMAGE_INSTANCE_PIXMAP_HEIGHT (ii) = ximage->height;
828 IMAGE_INSTANCE_PIXMAP_DEPTH (ii) = ximage->depth; 877 IMAGE_INSTANCE_PIXMAP_DEPTH (ii) = ximage->depth;
829 IMAGE_INSTANCE_X_COLORMAP (ii) = cmap; 878 IMAGE_INSTANCE_X_COLORMAP (ii) = cmap;
830 IMAGE_INSTANCE_X_PIXELS (ii) = pixels; 879 IMAGE_INSTANCE_X_PIXELS (ii) = pixels;
831 IMAGE_INSTANCE_X_NPIXELS (ii) = npixels; 880 IMAGE_INSTANCE_X_NPIXELS (ii) = npixels;
832 } 881 }
833 882
834 static void 883 static void
884 image_instance_add_x_image (struct Lisp_Image_Instance *ii,
885 XImage *ximage,
886 int slice,
887 Lisp_Object instantiator)
888 {
889 Lisp_Object device = IMAGE_INSTANCE_DEVICE (ii);
890 Display *dpy;
891 GC gc;
892 Drawable d;
893 Pixmap pixmap;
894
895 dpy = DEVICE_X_DISPLAY (XDEVICE (device));
896 d = XtWindow(DEVICE_XT_APP_SHELL (XDEVICE (device)));
897
898 pixmap = XCreatePixmap (dpy, d, ximage->width,
899 ximage->height, ximage->depth);
900 if (!pixmap)
901 signal_simple_error ("Unable to create pixmap", instantiator);
902
903 gc = XCreateGC (dpy, pixmap, 0, NULL);
904 if (!gc)
905 {
906 XFreePixmap (dpy, pixmap);
907 signal_simple_error ("Unable to create GC", instantiator);
908 }
909
910 XPutImage (dpy, pixmap, gc, ximage, 0, 0, 0, 0,
911 ximage->width, ximage->height);
912
913 XFreeGC (dpy, gc);
914
915 IMAGE_INSTANCE_X_PIXMAP_SLICE (ii, slice) = pixmap;
916 }
917
918 static void
835 x_init_image_instance_from_eimage (struct Lisp_Image_Instance *ii, 919 x_init_image_instance_from_eimage (struct Lisp_Image_Instance *ii,
836 int width, int height, 920 int width, int height,
921 int slices,
837 unsigned char *eimage, 922 unsigned char *eimage,
838 int dest_mask, 923 int dest_mask,
839 Lisp_Object instantiator, 924 Lisp_Object instantiator,
840 Lisp_Object domain) 925 Lisp_Object domain)
841 { 926 {
842 Lisp_Object device = IMAGE_INSTANCE_DEVICE (ii); 927 Lisp_Object device = IMAGE_INSTANCE_DEVICE (ii);
843 Colormap cmap = DEVICE_X_COLORMAP (XDEVICE(device)); 928 Colormap cmap = DEVICE_X_COLORMAP (XDEVICE(device));
844 unsigned long *pixtbl = NULL; 929 unsigned long *pixtbl = NULL;
845 int npixels = 0; 930 int npixels = 0;
931 int slice;
846 XImage* ximage; 932 XImage* ximage;
847 933
848 ximage = convert_EImage_to_XImage (device, width, height, eimage, 934 for (slice = 0; slice < slices; slice++)
849 &pixtbl, &npixels); 935 {
850 if (!ximage) 936 ximage = convert_EImage_to_XImage (device, width, height,
851 { 937 eimage + (width * height * 3 * slice),
852 if (pixtbl) xfree (pixtbl); 938 &pixtbl, &npixels);
853 signal_image_error("EImage to XImage conversion failed", instantiator); 939 if (!ximage)
854 } 940 {
855 941 if (pixtbl) xfree (pixtbl);
856 /* Now create the pixmap and set up the image instance */ 942 signal_image_error("EImage to XImage conversion failed", instantiator);
857 init_image_instance_from_x_image (ii, ximage, dest_mask, 943 }
858 cmap, pixtbl, npixels, 944
859 instantiator); 945 /* Now create the pixmap and set up the image instance */
860 946 if (slice == 0)
861 if (ximage) 947 init_image_instance_from_x_image (ii, ximage, dest_mask,
862 { 948 cmap, pixtbl, npixels, slices,
863 if (ximage->data) 949 instantiator);
864 { 950 else
865 xfree (ximage->data); 951 image_instance_add_x_image (ii, ximage, slice, instantiator);
866 ximage->data = 0; 952
867 } 953 if (ximage)
868 XDestroyImage (ximage); 954 {
955 if (ximage->data)
956 {
957 xfree (ximage->data);
958 ximage->data = 0;
959 }
960 XDestroyImage (ximage);
961 ximage = 0;
962 }
869 } 963 }
870 } 964 }
871 965
872 int read_bitmap_data_from_file (CONST char *filename, unsigned int *width, 966 int read_bitmap_data_from_file (CONST char *filename, unsigned int *width,
873 unsigned int *height, unsigned char **datap, 967 unsigned int *height, unsigned char **datap,
938 else 1032 else
939 incompatible_image_types (instantiator, dest_mask, 1033 incompatible_image_types (instantiator, dest_mask,
940 IMAGE_MONO_PIXMAP_MASK | IMAGE_COLOR_PIXMAP_MASK 1034 IMAGE_MONO_PIXMAP_MASK | IMAGE_COLOR_PIXMAP_MASK
941 | IMAGE_POINTER_MASK); 1035 | IMAGE_POINTER_MASK);
942 1036
943 x_initialize_pixmap_image_instance (ii, type); 1037 x_initialize_pixmap_image_instance (ii, 1, type);
944 IMAGE_INSTANCE_PIXMAP_WIDTH (ii) = width; 1038 IMAGE_INSTANCE_PIXMAP_WIDTH (ii) = width;
945 IMAGE_INSTANCE_PIXMAP_HEIGHT (ii) = height; 1039 IMAGE_INSTANCE_PIXMAP_HEIGHT (ii) = height;
946 IMAGE_INSTANCE_PIXMAP_FILENAME (ii) = 1040 IMAGE_INSTANCE_PIXMAP_FILENAME (ii) =
947 find_keyword_in_vector (instantiator, Q_file); 1041 find_keyword_in_vector (instantiator, Q_file);
948 1042
1242 cmap = DEVICE_X_COLORMAP (XDEVICE(device)); 1336 cmap = DEVICE_X_COLORMAP (XDEVICE(device));
1243 depth = DEVICE_X_DEPTH (XDEVICE(device)); 1337 depth = DEVICE_X_DEPTH (XDEVICE(device));
1244 visual = DEVICE_X_VISUAL (XDEVICE(device)); 1338 visual = DEVICE_X_VISUAL (XDEVICE(device));
1245 #endif 1339 #endif
1246 1340
1247 x_initialize_pixmap_image_instance (ii, type); 1341 x_initialize_pixmap_image_instance (ii, 1, type);
1248 1342
1249 assert (!NILP (data)); 1343 assert (!NILP (data));
1250 1344
1251 retry: 1345 retry:
1252 1346
1352 } 1446 }
1353 else 1447 else
1354 pixels = NULL; 1448 pixels = NULL;
1355 1449
1356 IMAGE_INSTANCE_X_PIXMAP (ii) = pixmap; 1450 IMAGE_INSTANCE_X_PIXMAP (ii) = pixmap;
1357 IMAGE_INSTANCE_X_MASK (ii) = mask; 1451 IMAGE_INSTANCE_PIXMAP_MASK (ii) = (void*)mask;
1358 IMAGE_INSTANCE_X_COLORMAP (ii) = cmap; 1452 IMAGE_INSTANCE_X_COLORMAP (ii) = cmap;
1359 IMAGE_INSTANCE_X_PIXELS (ii) = pixels; 1453 IMAGE_INSTANCE_X_PIXELS (ii) = pixels;
1360 IMAGE_INSTANCE_X_NPIXELS (ii) = npixels; 1454 IMAGE_INSTANCE_X_NPIXELS (ii) = npixels;
1361 IMAGE_INSTANCE_PIXMAP_WIDTH (ii) = w; 1455 IMAGE_INSTANCE_PIXMAP_WIDTH (ii) = w;
1362 IMAGE_INSTANCE_PIXMAP_HEIGHT (ii) = h; 1456 IMAGE_INSTANCE_PIXMAP_HEIGHT (ii) = h;
1880 if (!mask) 1974 if (!mask)
1881 mask_char = 0; 1975 mask_char = 0;
1882 1976
1883 /* #### call XQueryTextExtents() and check_pointer_sizes() here. */ 1977 /* #### call XQueryTextExtents() and check_pointer_sizes() here. */
1884 1978
1885 x_initialize_pixmap_image_instance (ii, IMAGE_POINTER); 1979 x_initialize_pixmap_image_instance (ii, 1, IMAGE_POINTER);
1886 IMAGE_INSTANCE_X_CURSOR (ii) = 1980 IMAGE_INSTANCE_X_CURSOR (ii) =
1887 XCreateGlyphCursor (dpy, source, mask, source_char, mask_char, 1981 XCreateGlyphCursor (dpy, source, mask, source_char, mask_char,
1888 &fg, &bg); 1982 &fg, &bg);
1889 XIMAGE_INSTANCE_PIXMAP_FG (image_instance) = foreground; 1983 XIMAGE_INSTANCE_PIXMAP_FG (image_instance) = foreground;
1890 XIMAGE_INSTANCE_PIXMAP_BG (image_instance) = background; 1984 XIMAGE_INSTANCE_PIXMAP_BG (image_instance) = background;
1933 2027
1934 GET_C_STRING_FILENAME_DATA_ALLOCA (data, name_ext); 2028 GET_C_STRING_FILENAME_DATA_ALLOCA (data, name_ext);
1935 if ((i = XmuCursorNameToIndex (name_ext)) == -1) 2029 if ((i = XmuCursorNameToIndex (name_ext)) == -1)
1936 signal_simple_error ("Unrecognized cursor-font name", data); 2030 signal_simple_error ("Unrecognized cursor-font name", data);
1937 2031
1938 x_initialize_pixmap_image_instance (ii, IMAGE_POINTER); 2032 x_initialize_pixmap_image_instance (ii, 1, IMAGE_POINTER);
1939 IMAGE_INSTANCE_X_CURSOR (ii) = XCreateFontCursor (dpy, i); 2033 IMAGE_INSTANCE_X_CURSOR (ii) = XCreateFontCursor (dpy, i);
1940 foreground = find_keyword_in_vector (instantiator, Q_foreground); 2034 foreground = find_keyword_in_vector (instantiator, Q_foreground);
1941 if (NILP (foreground)) 2035 if (NILP (foreground))
1942 foreground = pointer_fg; 2036 foreground = pointer_fg;
1943 background = find_keyword_in_vector (instantiator, Q_background); 2037 background = find_keyword_in_vector (instantiator, Q_background);
1958 { 2052 {
1959 case IMAGE_MONO_PIXMAP: 2053 case IMAGE_MONO_PIXMAP:
1960 IMAGE_INSTANCE_TYPE (p) = IMAGE_COLOR_PIXMAP; 2054 IMAGE_INSTANCE_TYPE (p) = IMAGE_COLOR_PIXMAP;
1961 /* Make sure there aren't two pointers to the same mask, causing 2055 /* Make sure there aren't two pointers to the same mask, causing
1962 it to get freed twice. */ 2056 it to get freed twice. */
1963 IMAGE_INSTANCE_X_MASK (p) = 0; 2057 IMAGE_INSTANCE_PIXMAP_MASK (p) = 0;
1964 break; 2058 break;
1965 2059
1966 default: 2060 default:
1967 return 0; 2061 return 0;
1968 } 2062 }
2006 x_unmap_subwindow (struct Lisp_Image_Instance *p) 2100 x_unmap_subwindow (struct Lisp_Image_Instance *p)
2007 { 2101 {
2008 if (IMAGE_INSTANCE_TYPE (p) == IMAGE_SUBWINDOW) 2102 if (IMAGE_INSTANCE_TYPE (p) == IMAGE_SUBWINDOW)
2009 { 2103 {
2010 XUnmapWindow 2104 XUnmapWindow
2011 (DisplayOfScreen (IMAGE_INSTANCE_X_SUBWINDOW_SCREEN (p)), 2105 (IMAGE_INSTANCE_X_SUBWINDOW_DISPLAY (p),
2012 IMAGE_INSTANCE_X_SUBWINDOW_ID (p)); 2106 IMAGE_INSTANCE_X_CLIPWINDOW (p));
2013 } 2107 }
2014 else /* must be a widget */ 2108 else /* must be a widget */
2015 { 2109 {
2016 XtUnmapWidget (IMAGE_INSTANCE_X_WIDGET_ID (p)); 2110 XtUnmapWidget (IMAGE_INSTANCE_X_CLIPWIDGET (p));
2017 } 2111 }
2018 } 2112 }
2019 2113
2020 /* map the subwindow. This is used by redisplay via 2114 /* map the subwindow. This is used by redisplay via
2021 redisplay_output_subwindow */ 2115 redisplay_output_subwindow */
2022 static void 2116 static void
2023 x_map_subwindow (struct Lisp_Image_Instance *p, int x, int y) 2117 x_map_subwindow (struct Lisp_Image_Instance *p, int x, int y,
2118 struct display_glyph_area* dga)
2024 { 2119 {
2025 if (IMAGE_INSTANCE_TYPE (p) == IMAGE_SUBWINDOW) 2120 if (IMAGE_INSTANCE_TYPE (p) == IMAGE_SUBWINDOW)
2026 { 2121 {
2027 Window subwindow = IMAGE_INSTANCE_X_SUBWINDOW_ID (p); 2122 Window subwindow = IMAGE_INSTANCE_X_SUBWINDOW_ID (p);
2028 Screen* screen = IMAGE_INSTANCE_X_SUBWINDOW_SCREEN (p); 2123 XMoveResizeWindow (IMAGE_INSTANCE_X_SUBWINDOW_DISPLAY (p),
2029 XMapWindow (DisplayOfScreen (screen), subwindow); 2124 IMAGE_INSTANCE_X_CLIPWINDOW (p),
2030 XMoveWindow (DisplayOfScreen (screen), subwindow, x, y); 2125 x, y, dga->width, dga->height);
2126 XMoveWindow (IMAGE_INSTANCE_X_SUBWINDOW_DISPLAY (p),
2127 subwindow, -dga->xoffset, -dga->yoffset);
2128 XMapWindow (IMAGE_INSTANCE_X_SUBWINDOW_DISPLAY (p),
2129 IMAGE_INSTANCE_X_CLIPWINDOW (p));
2031 } 2130 }
2032 else /* must be a widget */ 2131 else /* must be a widget */
2033 { 2132 {
2034 XtMoveWidget (IMAGE_INSTANCE_X_WIDGET_ID (p), 2133 XtConfigureWidget (IMAGE_INSTANCE_X_CLIPWIDGET (p),
2035 x + IMAGE_INSTANCE_X_WIDGET_XOFFSET (p), 2134 x + IMAGE_INSTANCE_X_WIDGET_XOFFSET (p),
2036 y + IMAGE_INSTANCE_X_WIDGET_YOFFSET (p)); 2135 y + IMAGE_INSTANCE_X_WIDGET_YOFFSET (p),
2037 XtMapWidget (IMAGE_INSTANCE_X_WIDGET_ID (p)); 2136 dga->width, dga->height, 0);
2137 XtMoveWidget (IMAGE_INSTANCE_X_WIDGET_ID (p),
2138 -dga->xoffset, -dga->yoffset);
2139 XtMapWidget (IMAGE_INSTANCE_X_CLIPWIDGET (p));
2038 } 2140 }
2039 } 2141 }
2040 2142
2041 /* when you click on a widget you may activate another widget this 2143 /* when you click on a widget you may activate another widget this
2042 needs to be checked and all appropriate widgets updated */ 2144 needs to be checked and all appropriate widgets updated */
2043 static void 2145 static void
2044 x_update_subwindow (struct Lisp_Image_Instance *p) 2146 x_update_subwindow (struct Lisp_Image_Instance *p)
2045 { 2147 {
2148 #ifdef HAVE_WIDGETS
2046 if (IMAGE_INSTANCE_TYPE (p) == IMAGE_WIDGET) 2149 if (IMAGE_INSTANCE_TYPE (p) == IMAGE_WIDGET)
2047 { 2150 {
2048 widget_value* wv = xmalloc_widget_value (); 2151 Arg al[5];
2049 button_item_to_widget_value (IMAGE_INSTANCE_WIDGET_SINGLE_ITEM (p), 2152 widget_value* wv = gui_items_to_widget_values
2050 wv, 1, 1); 2153 (IMAGE_INSTANCE_WIDGET_ITEMS (p));
2154
2155 /* This seems ugly, but I'm not sure what else to do. */
2156 if (EQ (IMAGE_INSTANCE_WIDGET_TYPE (p), Qtab_control))
2157 {
2158 widget_value* cur = 0;
2159 /* Give each child label the correct foreground color. */
2160 Lisp_Object pixel = FACE_FOREGROUND
2161 (IMAGE_INSTANCE_WIDGET_FACE (p),
2162 IMAGE_INSTANCE_SUBWINDOW_FRAME (p));
2163 XColor fcolor = COLOR_INSTANCE_X_COLOR (XCOLOR_INSTANCE (pixel));
2164 XtSetArg (al [0], XtNtabForeground, fcolor.pixel);
2165
2166 for (cur = wv->contents; cur; cur = cur->next)
2167 {
2168 if (cur->value)
2169 {
2170 cur->nargs = 1;
2171 cur->args = al;
2172 }
2173 }
2174 }
2175
2176 /* now modify the widget */
2051 lw_modify_all_widgets (IMAGE_INSTANCE_X_WIDGET_LWID (p), 2177 lw_modify_all_widgets (IMAGE_INSTANCE_X_WIDGET_LWID (p),
2052 wv, 1); 2178 wv, True);
2053 } 2179 free_widget_value_tree (wv);
2180 /* update the colors and font */
2181 update_widget_face (p, IMAGE_INSTANCE_SUBWINDOW_FRAME (p));
2182 /* We have to do this otherwise Motif will unceremoniously
2183 resize us when the label gets set. */
2184 XtSetArg (al [0], XtNwidth, IMAGE_INSTANCE_WIDGET_WIDTH (p));
2185 XtSetArg (al [1], XtNheight, IMAGE_INSTANCE_WIDGET_HEIGHT (p));
2186 XtSetValues (IMAGE_INSTANCE_X_WIDGET_ID (p), al, 2);
2187 }
2188 #endif
2054 } 2189 }
2055 2190
2056 /* instantiate and x type subwindow */ 2191 /* instantiate and x type subwindow */
2057 static void 2192 static void
2058 x_subwindow_instantiate (Lisp_Object image_instance, Lisp_Object instantiator, 2193 x_subwindow_instantiate (Lisp_Object image_instance, Lisp_Object instantiator,
2083 pw = XtWindow (FRAME_X_TEXT_WIDGET (f)); 2218 pw = XtWindow (FRAME_X_TEXT_WIDGET (f));
2084 2219
2085 ii->data = xnew_and_zero (struct x_subwindow_data); 2220 ii->data = xnew_and_zero (struct x_subwindow_data);
2086 2221
2087 IMAGE_INSTANCE_X_SUBWINDOW_PARENT (ii) = pw; 2222 IMAGE_INSTANCE_X_SUBWINDOW_PARENT (ii) = pw;
2088 IMAGE_INSTANCE_X_SUBWINDOW_SCREEN (ii) = xs; 2223 IMAGE_INSTANCE_X_SUBWINDOW_DISPLAY (ii) = DisplayOfScreen (xs);
2089 2224
2090 xswa.backing_store = Always; 2225 xswa.backing_store = Always;
2091 valueMask |= CWBackingStore; 2226 valueMask |= CWBackingStore;
2092 xswa.colormap = DefaultColormapOfScreen (xs); 2227 xswa.colormap = DefaultColormapOfScreen (xs);
2093 valueMask |= CWColormap; 2228 valueMask |= CWColormap;
2094 2229
2095 win = XCreateWindow (dpy, pw, 0, 0, w, h, 0, CopyFromParent, 2230 /* Create a window for clipping */
2231 IMAGE_INSTANCE_X_CLIPWINDOW (ii) =
2232 XCreateWindow (dpy, pw, 0, 0, w, h, 0, CopyFromParent,
2233 InputOutput, CopyFromParent, valueMask,
2234 &xswa);
2235
2236 /* Now put the subwindow inside the clip window. */
2237 win = XCreateWindow (dpy, IMAGE_INSTANCE_X_CLIPWINDOW (ii),
2238 0, 0, w, h, 0, CopyFromParent,
2096 InputOutput, CopyFromParent, valueMask, 2239 InputOutput, CopyFromParent, valueMask,
2097 &xswa); 2240 &xswa);
2098 2241
2099 IMAGE_INSTANCE_SUBWINDOW_ID (ii) = (void*)win; 2242 IMAGE_INSTANCE_SUBWINDOW_ID (ii) = (void*)win;
2100 } 2243 }
2132 static void 2275 static void
2133 x_resize_subwindow (struct Lisp_Image_Instance* ii, int w, int h) 2276 x_resize_subwindow (struct Lisp_Image_Instance* ii, int w, int h)
2134 { 2277 {
2135 if (IMAGE_INSTANCE_TYPE (ii) == IMAGE_SUBWINDOW) 2278 if (IMAGE_INSTANCE_TYPE (ii) == IMAGE_SUBWINDOW)
2136 { 2279 {
2137 XResizeWindow (DisplayOfScreen (IMAGE_INSTANCE_X_SUBWINDOW_SCREEN (ii)), 2280 XResizeWindow (IMAGE_INSTANCE_X_SUBWINDOW_DISPLAY (ii),
2138 IMAGE_INSTANCE_X_SUBWINDOW_ID (ii), 2281 IMAGE_INSTANCE_X_SUBWINDOW_ID (ii),
2139 w, h); 2282 w, h);
2140 } 2283 }
2141 else /* must be a widget */ 2284 else /* must be a widget */
2142 { 2285 {
2143 Arg al[2]; 2286 Arg al[2];
2287
2288 if (!XtIsRealized (IMAGE_INSTANCE_X_WIDGET_ID (ii)))
2289 {
2290 Lisp_Object sw;
2291 XSETIMAGE_INSTANCE (sw, ii);
2292 signal_simple_error ("XEmacs bug: subwindow is not realized", sw);
2293 }
2294
2144 XtSetArg (al [0], XtNwidth, (Dimension)w); 2295 XtSetArg (al [0], XtNwidth, (Dimension)w);
2145 XtSetArg (al [1], XtNheight, (Dimension)h); 2296 XtSetArg (al [1], XtNheight, (Dimension)h);
2146 XtSetValues (IMAGE_INSTANCE_X_WIDGET_ID (ii), al, 2); 2297 XtSetValues (IMAGE_INSTANCE_X_WIDGET_ID (ii), al, 2);
2147 } 2298 }
2148 } 2299 }
2149 2300
2301
2302 #ifdef HAVE_WIDGETS
2303
2150 /************************************************************************/ 2304 /************************************************************************/
2151 /* widgets */ 2305 /* widgets */
2152 /************************************************************************/ 2306 /************************************************************************/
2307
2308 static void
2309 update_widget_face (struct Lisp_Image_Instance* ii, Lisp_Object domain)
2310 {
2311 Arg al[3];
2312 #ifdef LWLIB_WIDGETS_MOTIF
2313 XmFontList fontList;
2314 #endif
2315
2316 Lisp_Object pixel = FACE_FOREGROUND
2317 (IMAGE_INSTANCE_WIDGET_FACE (ii),
2318 IMAGE_INSTANCE_SUBWINDOW_FRAME (ii));
2319 XColor fcolor = COLOR_INSTANCE_X_COLOR (XCOLOR_INSTANCE (pixel));
2320 XColor bcolor;
2321
2322 pixel = FACE_BACKGROUND
2323 (IMAGE_INSTANCE_WIDGET_FACE (ii),
2324 IMAGE_INSTANCE_SUBWINDOW_FRAME (ii));
2325 bcolor = COLOR_INSTANCE_X_COLOR (XCOLOR_INSTANCE (pixel));
2326
2327 XtSetArg (al [0], XtNbackground, bcolor.pixel);
2328 XtSetArg (al [1], XtNforeground, fcolor.pixel);
2329
2330 #ifdef LWLIB_WIDGETS_MOTIF
2331 fontList = XmFontListCreate
2332 (FONT_INSTANCE_X_FONT
2333 (XFONT_INSTANCE (widget_face_font_info
2334 (domain, IMAGE_INSTANCE_WIDGET_FACE (ii),
2335 0, 0))), XmSTRING_DEFAULT_CHARSET);
2336 XtSetArg (al [2], XmNfontList, fontList );
2337 #else
2338 XtSetArg (al [2], XtNfont, (void*)FONT_INSTANCE_X_FONT
2339 (XFONT_INSTANCE (widget_face_font_info
2340 (domain,
2341 IMAGE_INSTANCE_WIDGET_FACE (ii),
2342 0, 0))));
2343 #endif
2344 XtSetValues (IMAGE_INSTANCE_X_WIDGET_ID (ii), al, 3);
2345 #ifdef LWLIB_WIDGETS_MOTIF
2346 XmFontListFree (fontList);
2347 #endif
2348 }
2153 2349
2154 static void 2350 static void
2155 x_widget_instantiate (Lisp_Object image_instance, Lisp_Object instantiator, 2351 x_widget_instantiate (Lisp_Object image_instance, Lisp_Object instantiator,
2156 Lisp_Object pointer_fg, Lisp_Object pointer_bg, 2352 Lisp_Object pointer_fg, Lisp_Object pointer_bg,
2157 int dest_mask, Lisp_Object domain, 2353 int dest_mask, Lisp_Object domain,
2160 struct Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance); 2356 struct Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance);
2161 Lisp_Object device = IMAGE_INSTANCE_DEVICE (ii), pixel; 2357 Lisp_Object device = IMAGE_INSTANCE_DEVICE (ii), pixel;
2162 struct device* d = XDEVICE (device); 2358 struct device* d = XDEVICE (device);
2163 Lisp_Object frame = FW_FRAME (domain); 2359 Lisp_Object frame = FW_FRAME (domain);
2164 struct frame* f = XFRAME (frame); 2360 struct frame* f = XFRAME (frame);
2165 XColor fcolor, bcolor; 2361 char* nm=0;
2166 Extbyte* nm=0;
2167 Widget wid; 2362 Widget wid;
2168 Arg al [32]; 2363 Arg al [32];
2169 int ac = 0; 2364 int ac = 0;
2170 int id = new_lwlib_id (); 2365 int id = new_lwlib_id ();
2171 #ifdef LWLIB_USES_MOTIF 2366 widget_value* clip_wv;
2172 XmFontList fontList; 2367 XColor fcolor, bcolor;
2173 #endif
2174 2368
2175 if (!DEVICE_X_P (d)) 2369 if (!DEVICE_X_P (d))
2176 signal_simple_error ("Not an mswindows device", device); 2370 signal_simple_error ("Not an X device", device);
2177 2371
2178 /* have to set the type this late in case there is no device 2372 /* have to set the type this late in case there is no device
2179 instantiation for a widget. But we can go ahead and do it without 2373 instantiation for a widget. But we can go ahead and do it without
2180 checking because there is always a generic instantiator. */ 2374 checking because there is always a generic instantiator. */
2181 IMAGE_INSTANCE_TYPE (ii) = IMAGE_WIDGET; 2375 IMAGE_INSTANCE_TYPE (ii) = IMAGE_WIDGET;
2183 if (!NILP (IMAGE_INSTANCE_WIDGET_TEXT (ii))) 2377 if (!NILP (IMAGE_INSTANCE_WIDGET_TEXT (ii)))
2184 GET_C_STRING_OS_DATA_ALLOCA (IMAGE_INSTANCE_WIDGET_TEXT (ii), nm); 2378 GET_C_STRING_OS_DATA_ALLOCA (IMAGE_INSTANCE_WIDGET_TEXT (ii), nm);
2185 2379
2186 ii->data = xnew_and_zero (struct x_subwindow_data); 2380 ii->data = xnew_and_zero (struct x_subwindow_data);
2187 2381
2382 /* Create a clip window to contain the subwidget. Incredibly the
2383 XEmacs manager seems to be the most appropriate widget for
2384 this. Nothing else is simple enough and yet does what is
2385 required. */
2386 clip_wv = xmalloc_widget_value ();
2387
2388 XtSetArg (al [ac], XtNresize, False); ac++;
2389 XtSetArg (al [ac], XtNwidth,
2390 (Dimension)IMAGE_INSTANCE_SUBWINDOW_WIDTH (ii)); ac++;
2391 XtSetArg (al [ac], XtNheight,
2392 (Dimension)IMAGE_INSTANCE_SUBWINDOW_HEIGHT (ii)); ac++;
2393
2394 clip_wv->enabled = True;
2395 clip_wv->nargs = ac;
2396 clip_wv->args = al;
2397 clip_wv->name = xstrdup ("clip-window");
2398 clip_wv->value = xstrdup ("clip-window");
2399
2400 IMAGE_INSTANCE_X_CLIPWIDGET (ii)
2401 = lw_create_widget ("clip-window", "clip-window", new_lwlib_id (),
2402 clip_wv, FRAME_X_CONTAINER_WIDGET (f),
2403 False, 0, 0, 0);
2404
2405 free_widget_value_tree (clip_wv);
2406
2188 /* copy any args we were given */ 2407 /* copy any args we were given */
2408 ac = 0;
2409
2189 if (wv->nargs) 2410 if (wv->nargs)
2190 lw_add_value_args_to_args (wv, al, &ac); 2411 lw_add_value_args_to_args (wv, al, &ac);
2191 2412
2192 /* add our own arguments */ 2413 /* Fixup the colors. We have to do this *before* the widget gets
2414 created so that Motif will fix up the shadow colors
2415 correctly. Once the widget is created Motif won't do this
2416 anymore...*/
2193 pixel = FACE_FOREGROUND 2417 pixel = FACE_FOREGROUND
2194 (IMAGE_INSTANCE_WIDGET_FACE (ii), 2418 (IMAGE_INSTANCE_WIDGET_FACE (ii),
2195 IMAGE_INSTANCE_SUBWINDOW_FRAME (ii)); 2419 IMAGE_INSTANCE_SUBWINDOW_FRAME (ii));
2196 fcolor = COLOR_INSTANCE_X_COLOR (XCOLOR_INSTANCE (pixel)); 2420 fcolor = COLOR_INSTANCE_X_COLOR (XCOLOR_INSTANCE (pixel));
2421
2197 pixel = FACE_BACKGROUND 2422 pixel = FACE_BACKGROUND
2198 (IMAGE_INSTANCE_WIDGET_FACE (ii), 2423 (IMAGE_INSTANCE_WIDGET_FACE (ii),
2199 IMAGE_INSTANCE_SUBWINDOW_FRAME (ii)); 2424 IMAGE_INSTANCE_SUBWINDOW_FRAME (ii));
2200 bcolor = COLOR_INSTANCE_X_COLOR (XCOLOR_INSTANCE (pixel)); 2425 bcolor = COLOR_INSTANCE_X_COLOR (XCOLOR_INSTANCE (pixel));
2201 2426
2202 XtSetArg (al [ac], XtNbackground, bcolor.pixel); ac++; 2427 XtSetArg (al [ac], XtNbackground, bcolor.pixel); ac++;
2203 XtSetArg (al [ac], XtNforeground, fcolor.pixel); ac++; 2428 XtSetArg (al [ac], XtNforeground, fcolor.pixel); ac++;
2204 #ifdef LWLIB_USES_MOTIF 2429 /* we cannot allow widgets to resize themselves */
2205 fontList = XmFontListCreate 2430 XtSetArg (al [ac], XtNresize, False); ac++;
2206 ((void*)FONT_INSTANCE_X_FONT 2431 XtSetArg (al [ac], XtNwidth,
2207 (XFONT_INSTANCE (widget_face_font_info 2432 (Dimension)IMAGE_INSTANCE_SUBWINDOW_WIDTH (ii)); ac++;
2208 (domain, IMAGE_INSTANCE_WIDGET_FACE (ii), 2433 XtSetArg (al [ac], XtNheight,
2209 0, 0))), XmSTRING_DEFAULT_CHARSET); 2434 (Dimension)IMAGE_INSTANCE_SUBWINDOW_HEIGHT (ii)); ac++;
2210 XtSetArg (al [ac], XmNfontList, fontList ); ac++;
2211 #else
2212 XtSetArg (al [ac], XtNfont, (void*)FONT_INSTANCE_X_FONT
2213 (XFONT_INSTANCE (widget_face_font_info
2214 (domain,
2215 IMAGE_INSTANCE_WIDGET_FACE (ii),
2216 0, 0)))); ac++;
2217 #endif
2218 2435
2219 wv->nargs = ac; 2436 wv->nargs = ac;
2220 wv->args = al; 2437 wv->args = al;
2221 2438
2222 wid = lw_create_widget (type, wv->name, id, wv, FRAME_X_CONTAINER_WIDGET (f), 2439 wid = lw_create_widget (type, wv->name, id, wv, IMAGE_INSTANCE_X_CLIPWIDGET (ii),
2223 False, 0, popup_selection_callback, 0); 2440 False, 0, popup_selection_callback, 0);
2224 2441
2442 IMAGE_INSTANCE_SUBWINDOW_ID (ii) = (void*)wid;
2225 IMAGE_INSTANCE_X_WIDGET_LWID (ii) = id; 2443 IMAGE_INSTANCE_X_WIDGET_LWID (ii) = id;
2226 #ifdef LWLIB_USES_MOTIF 2444
2227 XmFontListFree (fontList); 2445 /* update the font. */
2228 #endif 2446 update_widget_face (ii, domain);
2229 /* because the EmacsManager is the widgets parent we have to 2447
2230 offset the redisplay of the widget by the amount the text 2448 /* Resize the widget here so that the values do not get copied by
2231 widget is inside the manager. */ 2449 lwlib. */
2232 ac = 0; 2450 ac = 0;
2233 XtSetArg (al [ac], XtNwidth, 2451 XtSetArg (al [ac], XtNwidth,
2234 (Dimension)IMAGE_INSTANCE_SUBWINDOW_WIDTH (ii)); ac++; 2452 (Dimension)IMAGE_INSTANCE_SUBWINDOW_WIDTH (ii)); ac++;
2235 XtSetArg (al [ac], XtNheight, 2453 XtSetArg (al [ac], XtNheight,
2236 (Dimension)IMAGE_INSTANCE_SUBWINDOW_HEIGHT (ii)); ac++; 2454 (Dimension)IMAGE_INSTANCE_SUBWINDOW_HEIGHT (ii)); ac++;
2237 XtSetValues (wid, al, ac); 2455 XtSetValues (IMAGE_INSTANCE_X_WIDGET_ID (ii), al, ac);
2238 /* finally get offsets in the frame */ 2456 /* because the EmacsManager is the widgets parent we have to
2457 offset the redisplay of the widget by the amount the text
2458 widget is inside the manager. */
2239 ac = 0; 2459 ac = 0;
2240 XtSetArg (al [ac], XtNx, &IMAGE_INSTANCE_X_WIDGET_XOFFSET (ii)); ac++; 2460 XtSetArg (al [ac], XtNx, &IMAGE_INSTANCE_X_WIDGET_XOFFSET (ii)); ac++;
2241 XtSetArg (al [ac], XtNy, &IMAGE_INSTANCE_X_WIDGET_YOFFSET (ii)); ac++; 2461 XtSetArg (al [ac], XtNy, &IMAGE_INSTANCE_X_WIDGET_YOFFSET (ii)); ac++;
2242 XtGetValues (FRAME_X_TEXT_WIDGET (f), al, ac); 2462 XtGetValues (FRAME_X_TEXT_WIDGET (f), al, ac);
2243 2463
2244 IMAGE_INSTANCE_SUBWINDOW_ID (ii) = (void*)wid; 2464 XtMapWidget (wid);
2245 2465
2246 free_widget_value (wv); 2466 free_widget_value_tree (wv);
2247 } 2467 }
2248 2468
2249 static Lisp_Object 2469 static Lisp_Object
2250 x_widget_set_property (Lisp_Object image_instance, Lisp_Object prop, 2470 x_widget_set_property (Lisp_Object image_instance, Lisp_Object prop,
2251 Lisp_Object val) 2471 Lisp_Object val)
2252 { 2472 {
2253 struct Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance); 2473 struct Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance);
2254 2474
2255 if (EQ (prop, Q_text)) 2475 if (EQ (prop, Q_text))
2256 { 2476 {
2257 Extbyte* str=0; 2477 char* str;
2258 widget_value* wv = lw_get_all_values (IMAGE_INSTANCE_X_WIDGET_LWID (ii)); 2478 widget_value* wv = lw_get_all_values (IMAGE_INSTANCE_X_WIDGET_LWID (ii));
2259 CHECK_STRING (val); 2479 CHECK_STRING (val);
2260 GET_C_STRING_OS_DATA_ALLOCA (val, str); 2480 GET_C_STRING_OS_DATA_ALLOCA (val, str);
2261 wv->value = str; 2481 wv->value = str;
2262 lw_modify_all_widgets (IMAGE_INSTANCE_X_WIDGET_LWID (ii), wv, False); 2482 lw_modify_all_widgets (IMAGE_INSTANCE_X_WIDGET_LWID (ii), wv, False);
2263 return Qt; 2483 return Qt;
2264 } 2484 }
2485 /* Modify the face properties of the widget */
2486 if (EQ (prop, Q_face))
2487 {
2488 update_widget_face (ii, IMAGE_INSTANCE_SUBWINDOW_FRAME (ii));
2489 return Qt;
2490 }
2265 return Qunbound; 2491 return Qunbound;
2266 } 2492 }
2267 2493
2268 /* get properties of a control */ 2494 /* get properties of a control */
2269 static Lisp_Object 2495 static Lisp_Object
2309 /* add the image if one was given */ 2535 /* add the image if one was given */
2310 if (!NILP (glyph) && IMAGE_INSTANCEP (glyph)) 2536 if (!NILP (glyph) && IMAGE_INSTANCEP (glyph))
2311 { 2537 {
2312 Arg al [2]; 2538 Arg al [2];
2313 int ac =0; 2539 int ac =0;
2314 #ifdef LWLIB_USES_MOTIF 2540 #ifdef LWLIB_WIDGETS_MOTIF
2315 XtSetArg (al [ac], XmNlabelType, XmPIXMAP); ac++; 2541 XtSetArg (al [ac], XmNlabelType, XmPIXMAP); ac++;
2316 XtSetArg (al [ac], XmNlabelPixmap, XIMAGE_INSTANCE_X_PIXMAP (glyph));ac++; 2542 XtSetArg (al [ac], XmNlabelPixmap, XIMAGE_INSTANCE_X_PIXMAP (glyph));ac++;
2317 #else 2543 #else
2318 XtSetArg (al [ac], XtNpixmap, XIMAGE_INSTANCE_X_PIXMAP (glyph)); ac++; 2544 XtSetArg (al [ac], XtNpixmap, XIMAGE_INSTANCE_X_PIXMAP (glyph)); ac++;
2319 #endif 2545 #endif
2387 2613
2388 x_widget_instantiate (image_instance, instantiator, pointer_fg, 2614 x_widget_instantiate (image_instance, instantiator, pointer_fg,
2389 pointer_bg, dest_mask, domain, "text-field", wv); 2615 pointer_bg, dest_mask, domain, "text-field", wv);
2390 } 2616 }
2391 2617
2618 #if defined (LWLIB_WIDGETS_MOTIF) && XmVERSION > 1
2392 /* instantiate a combo control */ 2619 /* instantiate a combo control */
2393 static void 2620 static void
2394 x_combo_box_instantiate (Lisp_Object image_instance, Lisp_Object instantiator, 2621 x_combo_box_instantiate (Lisp_Object image_instance, Lisp_Object instantiator,
2395 Lisp_Object pointer_fg, Lisp_Object pointer_bg, 2622 Lisp_Object pointer_fg, Lisp_Object pointer_bg,
2396 int dest_mask, Lisp_Object domain) 2623 int dest_mask, Lisp_Object domain)
2397 { 2624 {
2398 struct Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance); 2625 struct Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance);
2399 Lisp_Object rest; 2626 widget_value * wv = 0;
2627 /* This is not done generically because of sizing problems under
2628 mswindows. */
2629 widget_instantiate_1 (image_instance, instantiator, pointer_fg,
2630 pointer_bg, dest_mask, domain, 1, 0, 0);
2631
2632 wv = gui_items_to_widget_values (IMAGE_INSTANCE_WIDGET_ITEMS (ii));
2633
2634 x_widget_instantiate (image_instance, instantiator, pointer_fg,
2635 pointer_bg, dest_mask, domain, "combo-box", wv);
2636 }
2637 #endif
2638
2639 static void
2640 x_tab_control_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 struct Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance);
2645 Arg al [1];
2646 XColor fcolor;
2647 Lisp_Object pixel;
2648 widget_value* cur;
2649
2650 widget_value * wv =
2651 gui_items_to_widget_values (IMAGE_INSTANCE_WIDGET_ITEMS (ii));
2652
2653 /* Give each child label the correct foreground color. */
2654 pixel = FACE_FOREGROUND
2655 (IMAGE_INSTANCE_WIDGET_FACE (ii),
2656 IMAGE_INSTANCE_SUBWINDOW_FRAME (ii));
2657 fcolor = COLOR_INSTANCE_X_COLOR (XCOLOR_INSTANCE (pixel));
2658 XtSetArg (al [0], XtNtabForeground, fcolor.pixel);
2659
2660 for (cur = wv->contents; cur; cur = cur->next)
2661 {
2662 if (cur->value)
2663 {
2664 cur->nargs = 1;
2665 cur->args = al;
2666 }
2667 }
2668
2669 x_widget_instantiate (image_instance, instantiator, pointer_fg,
2670 pointer_bg, dest_mask, domain, "tab-control", wv);
2671 }
2672
2673 /* set the properties of a tab control */
2674 static Lisp_Object
2675 x_tab_control_set_property (Lisp_Object image_instance, Lisp_Object prop,
2676 Lisp_Object val)
2677 {
2678 struct Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance);
2679
2680 if (EQ (prop, Q_items))
2681 {
2682 widget_value * wv = 0, *cur;
2683 Arg al [1];
2684 XColor fcolor;
2685 Lisp_Object pixel;
2686
2687 check_valid_item_list_1 (val);
2688
2689 IMAGE_INSTANCE_WIDGET_ITEMS (ii) =
2690 Fcons (XCAR (IMAGE_INSTANCE_WIDGET_ITEMS (ii)),
2691 parse_gui_item_tree_children (val));
2692
2693 wv = gui_items_to_widget_values (IMAGE_INSTANCE_WIDGET_ITEMS (ii));
2694
2695 /* Give each child label the correct foreground color. */
2696 pixel = FACE_FOREGROUND
2697 (IMAGE_INSTANCE_WIDGET_FACE (ii),
2698 IMAGE_INSTANCE_SUBWINDOW_FRAME (ii));
2699 fcolor = COLOR_INSTANCE_X_COLOR (XCOLOR_INSTANCE (pixel));
2700 XtSetArg (al [0], XtNtabForeground, fcolor.pixel);
2701
2702 for (cur = wv->contents; cur; cur = cur->next)
2703 {
2704 if (cur->value)
2705 {
2706 cur->nargs = 1;
2707 cur->args = al;
2708 }
2709 }
2710
2711 lw_modify_all_widgets (IMAGE_INSTANCE_X_WIDGET_LWID (ii), wv, True);
2712
2713 free_widget_value_tree (wv);
2714 return Qt;
2715 }
2716
2717 return Qunbound;
2718 }
2719
2720 /* instantiate a static control possible for putting other things in */
2721 static void
2722 x_label_instantiate (Lisp_Object image_instance, Lisp_Object instantiator,
2723 Lisp_Object pointer_fg, Lisp_Object pointer_bg,
2724 int dest_mask, Lisp_Object domain)
2725 {
2726 struct Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance);
2400 Lisp_Object gui = IMAGE_INSTANCE_WIDGET_ITEM (ii); 2727 Lisp_Object gui = IMAGE_INSTANCE_WIDGET_ITEM (ii);
2401 widget_value* wv = xmalloc_widget_value (); 2728 widget_value* wv = xmalloc_widget_value ();
2402 2729
2403 button_item_to_widget_value (gui, wv, 1, 1); 2730 button_item_to_widget_value (gui, wv, 1, 1);
2404 2731
2405 x_widget_instantiate (image_instance, instantiator, pointer_fg, 2732 x_widget_instantiate (image_instance, instantiator, pointer_fg,
2406 pointer_bg, dest_mask, domain, "combo-box", wv); 2733 pointer_bg, dest_mask, domain, "button", wv);
2407 /* add items to the combo box */ 2734 }
2408 LIST_LOOP (rest, Fplist_get (IMAGE_INSTANCE_WIDGET_PROPS (ii), Q_items, Qnil)) 2735 #endif /* HAVE_WIDGETS */
2409 {
2410 #if 0
2411 Extbyte* str;
2412 XmString xmstr;
2413 GET_C_STRING_OS_DATA_ALLOCA (XCAR (rest), str);
2414 xmstr = XmStringCreate (str, XmSTRING_DEFAULT_CHARSET);
2415 XmListAddItem (IMAGE_INSTANCE_X_WIDGET_ID (ii), xmstr, 0);
2416 XmStringFree (xmstr);
2417 #endif
2418 }
2419 }
2420 2736
2421 2737
2422 /************************************************************************/ 2738 /************************************************************************/
2423 /* initialization */ 2739 /* initialization */
2424 /************************************************************************/ 2740 /************************************************************************/
2452 void 2768 void
2453 image_instantiator_format_create_glyphs_x (void) 2769 image_instantiator_format_create_glyphs_x (void)
2454 { 2770 {
2455 IIFORMAT_VALID_CONSOLE (x, nothing); 2771 IIFORMAT_VALID_CONSOLE (x, nothing);
2456 IIFORMAT_VALID_CONSOLE (x, string); 2772 IIFORMAT_VALID_CONSOLE (x, string);
2773 IIFORMAT_VALID_CONSOLE (x, layout);
2457 IIFORMAT_VALID_CONSOLE (x, formatted_string); 2774 IIFORMAT_VALID_CONSOLE (x, formatted_string);
2458 IIFORMAT_VALID_CONSOLE (x, inherit); 2775 IIFORMAT_VALID_CONSOLE (x, inherit);
2459 #ifdef HAVE_XPM 2776 #ifdef HAVE_XPM
2460 INITIALIZE_DEVICE_IIFORMAT (x, xpm); 2777 INITIALIZE_DEVICE_IIFORMAT (x, xpm);
2461 IIFORMAT_HAS_DEVMETHOD (x, xpm, instantiate); 2778 IIFORMAT_HAS_DEVMETHOD (x, xpm, instantiate);
2475 INITIALIZE_DEVICE_IIFORMAT (x, xbm); 2792 INITIALIZE_DEVICE_IIFORMAT (x, xbm);
2476 IIFORMAT_HAS_DEVMETHOD (x, xbm, instantiate); 2793 IIFORMAT_HAS_DEVMETHOD (x, xbm, instantiate);
2477 2794
2478 INITIALIZE_DEVICE_IIFORMAT (x, subwindow); 2795 INITIALIZE_DEVICE_IIFORMAT (x, subwindow);
2479 IIFORMAT_HAS_DEVMETHOD (x, subwindow, instantiate); 2796 IIFORMAT_HAS_DEVMETHOD (x, subwindow, instantiate);
2480 #ifdef LWLIB_USES_MOTIF 2797 #ifdef HAVE_WIDGETS
2481 /* button widget */ 2798 /* button widget */
2482 INITIALIZE_DEVICE_IIFORMAT (x, button); 2799 INITIALIZE_DEVICE_IIFORMAT (x, button);
2483 IIFORMAT_HAS_DEVMETHOD (x, button, property); 2800 IIFORMAT_HAS_DEVMETHOD (x, button, property);
2484 IIFORMAT_HAS_DEVMETHOD (x, button, instantiate); 2801 IIFORMAT_HAS_DEVMETHOD (x, button, instantiate);
2485 2802
2491 IIFORMAT_HAS_DEVMETHOD (x, progress_gauge, set_property); 2808 IIFORMAT_HAS_DEVMETHOD (x, progress_gauge, set_property);
2492 IIFORMAT_HAS_DEVMETHOD (x, progress_gauge, instantiate); 2809 IIFORMAT_HAS_DEVMETHOD (x, progress_gauge, instantiate);
2493 /* text field */ 2810 /* text field */
2494 INITIALIZE_DEVICE_IIFORMAT (x, edit_field); 2811 INITIALIZE_DEVICE_IIFORMAT (x, edit_field);
2495 IIFORMAT_HAS_DEVMETHOD (x, edit_field, instantiate); 2812 IIFORMAT_HAS_DEVMETHOD (x, edit_field, instantiate);
2496 #if 0 /* XmVERSION > 1*/ 2813 #if defined (LWLIB_WIDGETS_MOTIF) && XmVERSION > 1
2497 /* combo box */ 2814 /* combo box */
2498 INITIALIZE_DEVICE_IIFORMAT (x, combo_box); 2815 INITIALIZE_DEVICE_IIFORMAT (x, combo_box);
2499 IIFORMAT_HAS_DEVMETHOD (x, combo_box, instantiate); 2816 IIFORMAT_HAS_DEVMETHOD (x, combo_box, instantiate);
2500 #endif 2817 IIFORMAT_HAS_SHARED_DEVMETHOD (x, combo_box, set_property, tab_control);
2818 #endif
2819 /* tab control widget */
2820 INITIALIZE_DEVICE_IIFORMAT (x, tab_control);
2821 IIFORMAT_HAS_DEVMETHOD (x, tab_control, instantiate);
2822 IIFORMAT_HAS_DEVMETHOD (x, tab_control, set_property);
2823 /* label */
2824 INITIALIZE_DEVICE_IIFORMAT (x, label);
2825 IIFORMAT_HAS_DEVMETHOD (x, label, instantiate);
2501 #endif 2826 #endif
2502 INITIALIZE_IMAGE_INSTANTIATOR_FORMAT (cursor_font, "cursor-font"); 2827 INITIALIZE_IMAGE_INSTANTIATOR_FORMAT (cursor_font, "cursor-font");
2503 IIFORMAT_VALID_CONSOLE (x, cursor_font); 2828 IIFORMAT_VALID_CONSOLE (x, cursor_font);
2504 2829
2505 IIFORMAT_HAS_METHOD (cursor_font, validate); 2830 IIFORMAT_HAS_METHOD (cursor_font, validate);