Mercurial > hg > xemacs-beta
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); |