Mercurial > hg > xemacs-beta
diff src/glyphs-x.c @ 412:697ef44129c6 r21-2-14
Import from CVS: tag r21-2-14
author | cvs |
---|---|
date | Mon, 13 Aug 2007 11:20:41 +0200 |
parents | de805c49cfc1 |
children | 41dbb7a9d5f2 |
line wrap: on
line diff
--- a/src/glyphs-x.c Mon Aug 13 11:19:22 2007 +0200 +++ b/src/glyphs-x.c Mon Aug 13 11:20:41 2007 +0200 @@ -4,7 +4,6 @@ Copyright (C) 1995 Tinker Systems Copyright (C) 1995, 1996 Ben Wing Copyright (C) 1995 Sun Microsystems - Copyright (C) 1999, 2000 Andy Piper This file is part of XEmacs. @@ -40,11 +39,9 @@ Many changes for color work and optimizations by Jareth Hein for 21.0 Switch of GIF/JPEG/PNG to new EImage intermediate code by Jareth Hein for 21.0 TIFF code by Jareth Hein for 21.0 - GIF/JPEG/PNG/TIFF code moved to new glyph-eimage.c by Andy Piper for 21.0 - Subwindow and Widget support by Andy Piper for 21.2 + GIF/JPEG/PNG/TIFF code moved to new glyph-eimage.c for 21.0 TODO: - Support the GrayScale, StaticColor and StaticGray visual classes. Convert images.el to C and stick it in here? */ @@ -54,9 +51,6 @@ #include "console-x.h" #include "glyphs-x.h" #include "objects-x.h" -#ifdef HAVE_WIDGETS -#include "gui-x.h" -#endif #include "xmu.h" #include "buffer.h" @@ -64,8 +58,6 @@ #include "frame.h" #include "insdel.h" #include "opaque.h" -#include "gui.h" -#include "faces.h" #include "imgproc.h" @@ -77,11 +69,6 @@ #include "file-coding.h" #endif -#ifdef LWLIB_WIDGETS_MOTIF -#include <Xm/Xm.h> -#endif -#include <X11/IntrinsicP.h> - #if INTBITS == 32 # define FOUR_BYTE_TYPE unsigned int #elif LONGBITS == 32 @@ -94,22 +81,6 @@ #define LISP_DEVICE_TO_X_SCREEN(dev) XDefaultScreenOfDisplay (DEVICE_X_DISPLAY (XDEVICE (dev))) -DECLARE_IMAGE_INSTANTIATOR_FORMAT (nothing); -DECLARE_IMAGE_INSTANTIATOR_FORMAT (string); -DECLARE_IMAGE_INSTANTIATOR_FORMAT (formatted_string); -DECLARE_IMAGE_INSTANTIATOR_FORMAT (inherit); -#ifdef HAVE_JPEG -DECLARE_IMAGE_INSTANTIATOR_FORMAT (jpeg); -#endif -#ifdef HAVE_TIFF -DECLARE_IMAGE_INSTANTIATOR_FORMAT (tiff); -#endif -#ifdef HAVE_PNG -DECLARE_IMAGE_INSTANTIATOR_FORMAT (png); -#endif -#ifdef HAVE_GIF -DECLARE_IMAGE_INSTANTIATOR_FORMAT (gif); -#endif #ifdef HAVE_XPM DEFINE_DEVICE_IIFORMAT (x, xpm); #endif @@ -126,20 +97,6 @@ DEFINE_IMAGE_INSTANTIATOR_FORMAT (autodetect); -#ifdef HAVE_WIDGETS -DECLARE_IMAGE_INSTANTIATOR_FORMAT (layout); -DEFINE_DEVICE_IIFORMAT (x, widget); -DEFINE_DEVICE_IIFORMAT (x, native_layout); -DEFINE_DEVICE_IIFORMAT (x, button); -DEFINE_DEVICE_IIFORMAT (x, progress_gauge); -DEFINE_DEVICE_IIFORMAT (x, edit_field); -#if defined (LWLIB_WIDGETS_MOTIF) && XmVERSION > 1 -DEFINE_DEVICE_IIFORMAT (x, combo_box); -#endif -DEFINE_DEVICE_IIFORMAT (x, tab_control); -DEFINE_DEVICE_IIFORMAT (x, label); -#endif - static void cursor_font_instantiate (Lisp_Object image_instance, Lisp_Object instantiator, Lisp_Object pointer_fg, @@ -147,15 +104,6 @@ int dest_mask, Lisp_Object domain); -#ifdef HAVE_WIDGETS -static void -update_widget_face (widget_value* wv, - Lisp_Image_Instance* ii, Lisp_Object domain); -static void -update_tab_widget_face (widget_value* wv, - Lisp_Image_Instance* ii, Lisp_Object domain); -#endif - #include "bitmaps.h" @@ -190,13 +138,6 @@ vis = DEVICE_X_VISUAL (XDEVICE(device)); depth = DEVICE_X_DEPTH(XDEVICE(device)); - if (vis->class == GrayScale || vis->class == StaticColor || - vis->class == StaticGray) - { - /* #### Implement me!!! */ - return NULL; - } - if (vis->class == PseudoColor) { /* Quantize the image and get a histogram while we're at it. @@ -234,7 +175,7 @@ *pixtbl = xnew_array (unsigned long, pixcount); *npixels = 0; - /* #### should implement a sort by popularity to assure proper allocation */ + /* ### should implement a sort by popularity to assure proper allocation */ n = *npixels; for (i = 0; i < qtable->num_active_colors; i++) { @@ -265,7 +206,7 @@ gr = *ip++; bl = *ip++; conv.val = pixarray[QUANT_GET_COLOR(qtable,rd,gr,bl)]; -#ifdef WORDS_BIGENDIAN +#if WORDS_BIGENDIAN if (outimg->byte_order == MSBFirst) for (q = 4-byte_cnt; q < 4; q++) *dp++ = conv.cp[q]; else @@ -340,7 +281,7 @@ bl = *ip++ >> (8 - bbits); conv.val = (rd << rshift) | (gr << gshift) | (bl << bshift); -#ifdef WORDS_BIGENDIAN +#if WORDS_BIGENDIAN if (outimg->byte_order == MSBFirst) for (q = 4-byte_cnt; q < 4; q++) *dp++ = conv.cp[q]; else @@ -360,7 +301,7 @@ static void -x_print_image_instance (Lisp_Image_Instance *p, +x_print_image_instance (struct Lisp_Image_Instance *p, Lisp_Object printcharfun, int escapeflag) { @@ -385,43 +326,19 @@ } } -#ifdef DEBUG_WIDGETS -extern int debug_widget_instances; -#endif - static void -x_finalize_image_instance (Lisp_Image_Instance *p) +x_finalize_image_instance (struct Lisp_Image_Instance *p) { if (!p->data) return; - if (DEVICE_LIVE_P (XDEVICE (IMAGE_INSTANCE_DEVICE (p)))) + if (DEVICE_LIVE_P (XDEVICE (p->device))) { - Display *dpy = DEVICE_X_DISPLAY - (XDEVICE (IMAGE_INSTANCE_DEVICE (p))); - if (0) - ; -#ifdef HAVE_WIDGETS - else if (IMAGE_INSTANCE_TYPE (p) == IMAGE_WIDGET) - { - if (IMAGE_INSTANCE_SUBWINDOW_ID (p)) - { -#ifdef DEBUG_WIDGETS - debug_widget_instances--; - stderr_out ("widget destroyed, %d left\n", debug_widget_instances); -#endif - lw_destroy_widget (IMAGE_INSTANCE_X_WIDGET_ID (p)); - lw_destroy_widget (IMAGE_INSTANCE_X_CLIPWIDGET (p)); + Display *dpy = DEVICE_X_DISPLAY (XDEVICE (p->device)); - /* We can release the callbacks again. */ - ungcpro_popup_callbacks (IMAGE_INSTANCE_X_WIDGET_LWID (p)); - - IMAGE_INSTANCE_X_WIDGET_ID (p) = 0; - IMAGE_INSTANCE_X_CLIPWIDGET (p) = 0; - } - } -#endif - else if (IMAGE_INSTANCE_TYPE (p) == IMAGE_SUBWINDOW) + if (IMAGE_INSTANCE_TYPE (p) == IMAGE_WIDGET + || + IMAGE_INSTANCE_TYPE (p) == IMAGE_SUBWINDOW) { if (IMAGE_INSTANCE_SUBWINDOW_ID (p)) XDestroyWindow (dpy, IMAGE_INSTANCE_X_SUBWINDOW_ID (p)); @@ -429,33 +346,20 @@ } else { - int i; - if (IMAGE_INSTANCE_PIXMAP_TIMEOUT (p)) - disable_glyph_animated_timeout (IMAGE_INSTANCE_PIXMAP_TIMEOUT (p)); - + if (IMAGE_INSTANCE_X_PIXMAP (p)) + XFreePixmap (dpy, IMAGE_INSTANCE_X_PIXMAP (p)); if (IMAGE_INSTANCE_X_MASK (p) && IMAGE_INSTANCE_X_MASK (p) != IMAGE_INSTANCE_X_PIXMAP (p)) XFreePixmap (dpy, IMAGE_INSTANCE_X_MASK (p)); - IMAGE_INSTANCE_PIXMAP_MASK (p) = 0; - - if (IMAGE_INSTANCE_X_PIXMAP_SLICES (p)) - { - for (i = 0; i < IMAGE_INSTANCE_PIXMAP_MAXSLICE (p); i++) - if (IMAGE_INSTANCE_X_PIXMAP_SLICE (p,i)) - { - XFreePixmap (dpy, IMAGE_INSTANCE_X_PIXMAP_SLICE (p,i)); - IMAGE_INSTANCE_X_PIXMAP_SLICE (p, i) = 0; - } - xfree (IMAGE_INSTANCE_X_PIXMAP_SLICES (p)); - IMAGE_INSTANCE_X_PIXMAP_SLICES (p) = 0; - } - + IMAGE_INSTANCE_X_PIXMAP (p) = 0; + IMAGE_INSTANCE_X_MASK (p) = 0; + if (IMAGE_INSTANCE_X_CURSOR (p)) { XFreeCursor (dpy, IMAGE_INSTANCE_X_CURSOR (p)); IMAGE_INSTANCE_X_CURSOR (p) = 0; } - + if (IMAGE_INSTANCE_X_NPIXELS (p) != 0) { XFreeColors (dpy, @@ -466,13 +370,7 @@ } } } - /* You can sometimes have pixels without a live device. I forget - why, but that's why we free them here if we have a pixmap type - image instance. It probably means that we might also get a memory - leak with widgets. */ - if (IMAGE_INSTANCE_TYPE (p) != IMAGE_WIDGET - && IMAGE_INSTANCE_TYPE (p) != IMAGE_SUBWINDOW - && IMAGE_INSTANCE_X_PIXELS (p)) + if (IMAGE_INSTANCE_X_PIXELS (p)) { xfree (IMAGE_INSTANCE_X_PIXELS (p)); IMAGE_INSTANCE_X_PIXELS (p) = 0; @@ -483,8 +381,8 @@ } static int -x_image_instance_equal (Lisp_Image_Instance *p1, - Lisp_Image_Instance *p2, int depth) +x_image_instance_equal (struct Lisp_Image_Instance *p1, + struct Lisp_Image_Instance *p2, int depth) { switch (IMAGE_INSTANCE_TYPE (p1)) { @@ -503,7 +401,7 @@ } static unsigned long -x_image_instance_hash (Lisp_Image_Instance *p, int depth) +x_image_instance_hash (struct Lisp_Image_Instance *p, int depth) { switch (IMAGE_INSTANCE_TYPE (p)) { @@ -523,14 +421,10 @@ methods are called. */ static void -x_initialize_pixmap_image_instance (Lisp_Image_Instance *ii, - int slices, +x_initialize_pixmap_image_instance (struct Lisp_Image_Instance *ii, enum image_instance_type type) { ii->data = xnew_and_zero (struct x_image_instance_data); - IMAGE_INSTANCE_PIXMAP_MAXSLICE (ii) = slices; - IMAGE_INSTANCE_X_PIXMAP_SLICES (ii) = - xnew_array_and_zero (Pixmap, slices); IMAGE_INSTANCE_TYPE (ii) = type; IMAGE_INSTANCE_PIXMAP_FILENAME (ii) = Qnil; IMAGE_INSTANCE_PIXMAP_MASK_FILENAME (ii) = Qnil; @@ -574,7 +468,7 @@ (XSTRING_BYTE (name, 2) == '/'))))) { if (!NILP (Ffile_readable_p (name))) - return Fexpand_file_name (name, Qnil); + return name; else return Qnil; } @@ -700,7 +594,7 @@ /* Get the data while doing the conversion */ while (1) { - ssize_t size_in_bytes = Lstream_read (istr, tempbuf, sizeof (tempbuf)); + int size_in_bytes = Lstream_read (istr, tempbuf, sizeof (tempbuf)); if (!size_in_bytes) break; /* It does seem the flushes are necessary... */ @@ -843,13 +737,12 @@ Use the same code as for `xpm'. */ static void -init_image_instance_from_x_image (Lisp_Image_Instance *ii, +init_image_instance_from_x_image (struct Lisp_Image_Instance *ii, XImage *ximage, int dest_mask, Colormap cmap, unsigned long *pixels, int npixels, - int slices, Lisp_Object instantiator) { Lisp_Object device = IMAGE_INSTANCE_DEVICE (ii); @@ -885,15 +778,13 @@ XFreeGC (dpy, gc); - x_initialize_pixmap_image_instance (ii, slices, IMAGE_COLOR_PIXMAP); + x_initialize_pixmap_image_instance (ii, IMAGE_COLOR_PIXMAP); IMAGE_INSTANCE_PIXMAP_FILENAME (ii) = find_keyword_in_vector (instantiator, Q_file); - /* Fixup a set of pixmaps. */ IMAGE_INSTANCE_X_PIXMAP (ii) = pixmap; - - IMAGE_INSTANCE_PIXMAP_MASK (ii) = 0; + IMAGE_INSTANCE_X_MASK (ii) = 0; IMAGE_INSTANCE_PIXMAP_WIDTH (ii) = ximage->width; IMAGE_INSTANCE_PIXMAP_HEIGHT (ii) = ximage->height; IMAGE_INSTANCE_PIXMAP_DEPTH (ii) = ximage->depth; @@ -903,44 +794,8 @@ } static void -image_instance_add_x_image (Lisp_Image_Instance *ii, - XImage *ximage, - int slice, - Lisp_Object instantiator) -{ - Lisp_Object device = IMAGE_INSTANCE_DEVICE (ii); - Display *dpy; - GC gc; - Drawable d; - Pixmap pixmap; - - dpy = DEVICE_X_DISPLAY (XDEVICE (device)); - d = XtWindow(DEVICE_XT_APP_SHELL (XDEVICE (device))); - - pixmap = XCreatePixmap (dpy, d, ximage->width, - ximage->height, ximage->depth); - if (!pixmap) - signal_simple_error ("Unable to create pixmap", instantiator); - - gc = XCreateGC (dpy, pixmap, 0, NULL); - if (!gc) - { - XFreePixmap (dpy, pixmap); - signal_simple_error ("Unable to create GC", instantiator); - } - - XPutImage (dpy, pixmap, gc, ximage, 0, 0, 0, 0, - ximage->width, ximage->height); - - XFreeGC (dpy, gc); - - IMAGE_INSTANCE_X_PIXMAP_SLICE (ii, slice) = pixmap; -} - -static void -x_init_image_instance_from_eimage (Lisp_Image_Instance *ii, +x_init_image_instance_from_eimage (struct Lisp_Image_Instance *ii, int width, int height, - int slices, unsigned char *eimage, int dest_mask, Lisp_Object instantiator, @@ -950,42 +805,33 @@ Colormap cmap = DEVICE_X_COLORMAP (XDEVICE(device)); unsigned long *pixtbl = NULL; int npixels = 0; - int slice; XImage* ximage; - for (slice = 0; slice < slices; slice++) + ximage = convert_EImage_to_XImage (device, width, height, eimage, + &pixtbl, &npixels); + if (!ximage) { - ximage = convert_EImage_to_XImage (device, width, height, - eimage + (width * height * 3 * slice), - &pixtbl, &npixels); - if (!ximage) - { - if (pixtbl) xfree (pixtbl); - signal_image_error("EImage to XImage conversion failed", instantiator); - } + if (pixtbl) xfree (pixtbl); + signal_image_error("EImage to XImage conversion failed", instantiator); + } - /* Now create the pixmap and set up the image instance */ - if (slice == 0) - init_image_instance_from_x_image (ii, ximage, dest_mask, - cmap, pixtbl, npixels, slices, - instantiator); - else - image_instance_add_x_image (ii, ximage, slice, instantiator); + /* Now create the pixmap and set up the image instance */ + init_image_instance_from_x_image (ii, ximage, dest_mask, + cmap, pixtbl, npixels, + instantiator); - if (ximage) - { - if (ximage->data) - { - xfree (ximage->data); - ximage->data = 0; - } - XDestroyImage (ximage); - ximage = 0; - } + if (ximage) + { + if (ximage->data) + { + xfree (ximage->data); + ximage->data = 0; + } + XDestroyImage (ximage); } } -int read_bitmap_data_from_file (const char *filename, unsigned int *width, +int read_bitmap_data_from_file (CONST char *filename, unsigned int *width, unsigned int *height, unsigned char **datap, int *x_hot, int *y_hot) { @@ -999,7 +845,7 @@ static Pixmap pixmap_from_xbm_inline (Lisp_Object device, int width, int height, /* Note that data is in ext-format! */ - const Extbyte *bits) + CONST Extbyte *bits) { return XCreatePixmapFromBitmapData (DEVICE_X_DISPLAY (XDEVICE(device)), XtWindow (DEVICE_XT_APP_SHELL (XDEVICE (device))), @@ -1011,10 +857,10 @@ image instance accordingly. */ static void -init_image_instance_from_xbm_inline (Lisp_Image_Instance *ii, +init_image_instance_from_xbm_inline (struct Lisp_Image_Instance *ii, int width, int height, /* Note that data is in ext-format! */ - const char *bits, + CONST char *bits, Lisp_Object instantiator, Lisp_Object pointer_fg, Lisp_Object pointer_bg, @@ -1056,7 +902,7 @@ IMAGE_MONO_PIXMAP_MASK | IMAGE_COLOR_PIXMAP_MASK | IMAGE_POINTER_MASK); - x_initialize_pixmap_image_instance (ii, 1, type); + x_initialize_pixmap_image_instance (ii, type); IMAGE_INSTANCE_PIXMAP_WIDTH (ii) = width; IMAGE_INSTANCE_PIXMAP_HEIGHT (ii) = height; IMAGE_INSTANCE_PIXMAP_FILENAME (ii) = @@ -1152,24 +998,24 @@ Lisp_Object pointer_fg, Lisp_Object pointer_bg, int dest_mask, int width, int height, /* Note that data is in ext-format! */ - const char *bits) + CONST char *bits) { Lisp_Object mask_data = find_keyword_in_vector (instantiator, Q_mask_data); Lisp_Object mask_file = find_keyword_in_vector (instantiator, Q_mask_file); - Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance); + struct Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance); Pixmap mask = 0; + CONST char *gcc_may_you_rot_in_hell; if (!NILP (mask_data)) { - const char *ext_data; - - TO_EXTERNAL_FORMAT (LISP_STRING, XCAR (XCDR (XCDR (mask_data))), - C_STRING_ALLOCA, ext_data, - Qbinary); - mask = pixmap_from_xbm_inline (IMAGE_INSTANCE_DEVICE (ii), - XINT (XCAR (mask_data)), - XINT (XCAR (XCDR (mask_data))), - (const unsigned char *) ext_data); + GET_C_STRING_BINARY_DATA_ALLOCA (XCAR (XCDR (XCDR (mask_data))), + gcc_may_you_rot_in_hell); + mask = + pixmap_from_xbm_inline (IMAGE_INSTANCE_DEVICE (ii), + XINT (XCAR (mask_data)), + XINT (XCAR (XCDR (mask_data))), + (CONST unsigned char *) + gcc_may_you_rot_in_hell); } init_image_instance_from_xbm_inline (ii, width, height, bits, @@ -1185,17 +1031,16 @@ int dest_mask, Lisp_Object domain) { Lisp_Object data = find_keyword_in_vector (instantiator, Q_data); - const char *ext_data; + CONST char *gcc_go_home; assert (!NILP (data)); - TO_EXTERNAL_FORMAT (LISP_STRING, XCAR (XCDR (XCDR (data))), - C_STRING_ALLOCA, ext_data, - Qbinary); + GET_C_STRING_BINARY_DATA_ALLOCA (XCAR (XCDR (XCDR (data))), + gcc_go_home); xbm_instantiate_1 (image_instance, instantiator, pointer_fg, pointer_bg, dest_mask, XINT (XCAR (data)), - XINT (XCAR (XCDR (data))), ext_data); + XINT (XCAR (XCDR (data))), gcc_go_home); } @@ -1299,11 +1144,11 @@ static void x_xpm_instantiate (Lisp_Object image_instance, Lisp_Object instantiator, - Lisp_Object pointer_fg, Lisp_Object pointer_bg, - int dest_mask, Lisp_Object domain) + Lisp_Object pointer_fg, Lisp_Object pointer_bg, + int dest_mask, Lisp_Object domain) { /* This function can GC */ - Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance); + struct Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance); Lisp_Object device = IMAGE_INSTANCE_DEVICE (ii); Lisp_Object data = find_keyword_in_vector (instantiator, Q_data); Display *dpy; @@ -1361,7 +1206,7 @@ visual = DEVICE_X_VISUAL (XDEVICE(device)); #endif - x_initialize_pixmap_image_instance (ii, 1, type); + x_initialize_pixmap_image_instance (ii, type); assert (!NILP (data)); @@ -1471,7 +1316,7 @@ pixels = NULL; IMAGE_INSTANCE_X_PIXMAP (ii) = pixmap; - IMAGE_INSTANCE_PIXMAP_MASK (ii) = (void*)mask; + IMAGE_INSTANCE_X_MASK (ii) = mask; IMAGE_INSTANCE_X_COLORMAP (ii) = cmap; IMAGE_INSTANCE_X_PIXELS (ii) = pixels; IMAGE_INSTANCE_X_NPIXELS (ii) = npixels; @@ -1670,16 +1515,13 @@ { Lisp_Object data = find_keyword_in_vector (instantiator, Q_data); int i, stattis; - char *bits, *bp; - const char *p; - const char * volatile emsg = 0; - const char * volatile dstring; + char *p, *bits, *bp; + CONST char * volatile emsg = 0; + CONST char * volatile dstring; assert (!NILP (data)); - TO_EXTERNAL_FORMAT (LISP_STRING, data, - C_STRING_ALLOCA, dstring, - Qbinary); + GET_C_STRING_BINARY_DATA_ALLOCA (data, dstring); if ((p = strchr (dstring, ':'))) { @@ -1743,7 +1585,7 @@ static Lisp_Object autodetect_normalize (Lisp_Object instantiator, - Lisp_Object console_type) + Lisp_Object console_type) { Lisp_Object file = find_keyword_in_vector (instantiator, Q_data); Lisp_Object filename = Qnil; @@ -1834,10 +1676,10 @@ static void autodetect_instantiate (Lisp_Object image_instance, - Lisp_Object instantiator, - Lisp_Object pointer_fg, - Lisp_Object pointer_bg, - int dest_mask, Lisp_Object domain) + Lisp_Object instantiator, + Lisp_Object pointer_fg, + Lisp_Object pointer_bg, + int dest_mask, Lisp_Object domain) { Lisp_Object data = find_keyword_in_vector (instantiator, Q_data); struct gcpro gcpro1, gcpro2, gcpro3; @@ -1850,10 +1692,8 @@ alist = tagged_vector_to_alist (instantiator); if (dest_mask & IMAGE_POINTER_MASK) { - const char *name_ext; - TO_EXTERNAL_FORMAT (LISP_STRING, data, - C_STRING_ALLOCA, name_ext, - Qfile_name); + CONST char *name_ext; + GET_C_STRING_FILENAME_DATA_ALLOCA (data, name_ext); if (XmuCursorNameToIndex (name_ext) != -1) { result = alist_to_tagged_vector (Qcursor_font, alist); @@ -1940,7 +1780,7 @@ { /* This function can GC */ Lisp_Object data = find_keyword_in_vector (instantiator, Q_data); - Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance); + struct Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance); Lisp_Object device = IMAGE_INSTANCE_DEVICE (ii); Display *dpy; XColor fg, bg; @@ -2004,7 +1844,7 @@ /* #### call XQueryTextExtents() and check_pointer_sizes() here. */ - x_initialize_pixmap_image_instance (ii, 1, IMAGE_POINTER); + x_initialize_pixmap_image_instance (ii, IMAGE_POINTER); IMAGE_INSTANCE_X_CURSOR (ii) = XCreateGlyphCursor (dpy, source, mask, source_char, mask_char, &fg, &bg); @@ -2038,11 +1878,11 @@ { /* This function can GC */ Lisp_Object data = find_keyword_in_vector (instantiator, Q_data); - Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance); + struct Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance); Lisp_Object device = IMAGE_INSTANCE_DEVICE (ii); Display *dpy; int i; - const char *name_ext; + CONST char *name_ext; Lisp_Object foreground, background; if (!DEVICE_X_P (XDEVICE (device))) @@ -2053,13 +1893,11 @@ if (!(dest_mask & IMAGE_POINTER_MASK)) incompatible_image_types (instantiator, dest_mask, IMAGE_POINTER_MASK); - TO_EXTERNAL_FORMAT (LISP_STRING, data, - C_STRING_ALLOCA, name_ext, - Qfile_name); + GET_C_STRING_FILENAME_DATA_ALLOCA (data, name_ext); if ((i = XmuCursorNameToIndex (name_ext)) == -1) signal_simple_error ("Unrecognized cursor-font name", data); - x_initialize_pixmap_image_instance (ii, 1, IMAGE_POINTER); + x_initialize_pixmap_image_instance (ii, IMAGE_POINTER); IMAGE_INSTANCE_X_CURSOR (ii) = XCreateFontCursor (dpy, i); foreground = find_keyword_in_vector (instantiator, Q_foreground); if (NILP (foreground)) @@ -2074,7 +1912,7 @@ x_colorize_image_instance (Lisp_Object image_instance, Lisp_Object foreground, Lisp_Object background) { - Lisp_Image_Instance *p; + struct Lisp_Image_Instance *p; p = XIMAGE_INSTANCE (image_instance); @@ -2084,7 +1922,7 @@ IMAGE_INSTANCE_TYPE (p) = IMAGE_COLOR_PIXMAP; /* Make sure there aren't two pointers to the same mask, causing it to get freed twice. */ - IMAGE_INSTANCE_PIXMAP_MASK (p) = 0; + IMAGE_INSTANCE_X_MASK (p) = 0; break; default: @@ -2127,145 +1965,21 @@ /* unmap the image if it is a widget. This is used by redisplay via redisplay_unmap_subwindows */ static void -x_unmap_subwindow (Lisp_Image_Instance *p) +x_unmap_subwindow (struct Lisp_Image_Instance *p) { - if (IMAGE_INSTANCE_TYPE (p) == IMAGE_SUBWINDOW) - { - XUnmapWindow - (IMAGE_INSTANCE_X_SUBWINDOW_DISPLAY (p), - IMAGE_INSTANCE_X_CLIPWINDOW (p)); - } - else /* must be a widget */ - { - XtUnmapWidget (IMAGE_INSTANCE_X_CLIPWIDGET (p)); - } + XUnmapWindow (DisplayOfScreen (IMAGE_INSTANCE_X_SUBWINDOW_SCREEN (p)), + IMAGE_INSTANCE_X_SUBWINDOW_ID (p)); } /* map the subwindow. This is used by redisplay via redisplay_output_subwindow */ static void -x_map_subwindow (Lisp_Image_Instance *p, int x, int y, - struct display_glyph_area* dga) -{ - if (IMAGE_INSTANCE_TYPE (p) == IMAGE_SUBWINDOW) - { - Window subwindow = IMAGE_INSTANCE_X_SUBWINDOW_ID (p); - XMoveResizeWindow (IMAGE_INSTANCE_X_SUBWINDOW_DISPLAY (p), - IMAGE_INSTANCE_X_CLIPWINDOW (p), - x, y, dga->width, dga->height); - XMoveWindow (IMAGE_INSTANCE_X_SUBWINDOW_DISPLAY (p), - subwindow, -dga->xoffset, -dga->yoffset); - XMapWindow (IMAGE_INSTANCE_X_SUBWINDOW_DISPLAY (p), - IMAGE_INSTANCE_X_CLIPWINDOW (p)); - } - else /* must be a widget */ - { - XtConfigureWidget (IMAGE_INSTANCE_X_CLIPWIDGET (p), - x + IMAGE_INSTANCE_X_WIDGET_XOFFSET (p), - y + IMAGE_INSTANCE_X_WIDGET_YOFFSET (p), - dga->width, dga->height, 0); - XtMoveWidget (IMAGE_INSTANCE_X_WIDGET_ID (p), - -dga->xoffset, -dga->yoffset); - XtMapWidget (IMAGE_INSTANCE_X_CLIPWIDGET (p)); - } -} - -/* when you click on a widget you may activate another widget this - needs to be checked and all appropriate widgets updated */ -static void -x_update_subwindow (Lisp_Image_Instance *p) -{ - /* Update the subwindow size if necessary. */ - if (IMAGE_INSTANCE_SIZE_CHANGED (p)) - { - XResizeWindow (IMAGE_INSTANCE_X_SUBWINDOW_DISPLAY (p), - IMAGE_INSTANCE_X_SUBWINDOW_ID (p), - IMAGE_INSTANCE_WIDTH (p), - IMAGE_INSTANCE_HEIGHT (p)); - } -} - -/* Update all attributes that have changed. Lwlib actually does most - of this for us. */ -static void -x_update_widget (Lisp_Image_Instance *p) +x_map_subwindow (struct Lisp_Image_Instance *p, int x, int y) { - /* This function can GC if IN_REDISPLAY is false. */ -#ifdef HAVE_WIDGETS - widget_value* wv = 0; - - /* First get the items if they have changed since this is a - structural change. As such it will nuke all added values so we - need to update most other things after the items have changed.*/ - if (IMAGE_INSTANCE_WIDGET_ITEMS_CHANGED (p)) - { - Lisp_Object image_instance; - - XSETIMAGE_INSTANCE (image_instance, p); - wv = gui_items_to_widget_values - (image_instance, IMAGE_INSTANCE_WIDGET_PENDING_ITEMS (p)); - wv->change = STRUCTURAL_CHANGE; - /* now modify the widget */ - lw_modify_all_widgets (IMAGE_INSTANCE_X_WIDGET_LWID (p), - wv, True); - free_widget_value_tree (wv); - } - - /* Now do non structural updates. */ - wv = lw_get_all_values (IMAGE_INSTANCE_X_WIDGET_LWID (p)); - - if (!wv) - return; - - /* Possibly update the colors and font */ - if (IMAGE_INSTANCE_WIDGET_FACE_CHANGED (p) - || - XFRAME (IMAGE_INSTANCE_FRAME (p))->faces_changed - || - IMAGE_INSTANCE_WIDGET_ITEMS_CHANGED (p)) - { - update_widget_face (wv, p, IMAGE_INSTANCE_FRAME (p)); - } - - /* Possibly update the text. */ - if (IMAGE_INSTANCE_TEXT_CHANGED (p)) - { - char* str; - Lisp_Object val = IMAGE_INSTANCE_WIDGET_TEXT (p); - TO_EXTERNAL_FORMAT (LISP_STRING, val, - C_STRING_ALLOCA, str, - Qnative); - wv->value = str; - } - - /* Possibly update the size. */ - if (IMAGE_INSTANCE_SIZE_CHANGED (p) - || - IMAGE_INSTANCE_WIDGET_ITEMS_CHANGED (p) - || - IMAGE_INSTANCE_TEXT_CHANGED (p)) - { - assert (IMAGE_INSTANCE_X_WIDGET_ID (p) && - IMAGE_INSTANCE_X_CLIPWIDGET (p)) ; - - if (IMAGE_INSTANCE_X_WIDGET_ID (p)->core.being_destroyed - || !XtIsManaged(IMAGE_INSTANCE_X_WIDGET_ID (p))) - { - Lisp_Object sw; - XSETIMAGE_INSTANCE (sw, p); - signal_simple_error ("XEmacs bug: subwindow is deleted", sw); - } - - lw_add_widget_value_arg (wv, XtNwidth, - (Dimension)IMAGE_INSTANCE_WIDTH (p)); - lw_add_widget_value_arg (wv, XtNheight, - (Dimension)IMAGE_INSTANCE_HEIGHT (p)); - } - - /* now modify the widget */ - lw_modify_all_widgets (IMAGE_INSTANCE_X_WIDGET_LWID (p), - wv, False); -#endif + XMapWindow (DisplayOfScreen (IMAGE_INSTANCE_X_SUBWINDOW_SCREEN (p)), + IMAGE_INSTANCE_X_SUBWINDOW_ID (p)); + XMoveWindow (DisplayOfScreen (IMAGE_INSTANCE_X_SUBWINDOW_SCREEN (p)), + IMAGE_INSTANCE_X_SUBWINDOW_ID (p), x, y); } /* instantiate and x type subwindow */ @@ -2275,17 +1989,17 @@ int dest_mask, Lisp_Object domain) { /* This function can GC */ - Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance); + struct Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance); Lisp_Object device = IMAGE_INSTANCE_DEVICE (ii); - Lisp_Object frame = DOMAIN_FRAME (domain); + Lisp_Object frame = FW_FRAME (domain); struct frame* f = XFRAME (frame); Display *dpy; Screen *xs; Window pw, win; XSetWindowAttributes xswa; Mask valueMask = 0; - unsigned int w = IMAGE_INSTANCE_WIDTH (ii), - h = IMAGE_INSTANCE_HEIGHT (ii); + unsigned int w = IMAGE_INSTANCE_SUBWINDOW_WIDTH (ii), + h = IMAGE_INSTANCE_SUBWINDOW_HEIGHT (ii); if (!DEVICE_X_P (XDEVICE (device))) signal_simple_error ("Not an X device", device); @@ -2293,32 +2007,28 @@ dpy = DEVICE_X_DISPLAY (XDEVICE (device)); xs = DefaultScreenOfDisplay (dpy); - IMAGE_INSTANCE_TYPE (ii) = IMAGE_SUBWINDOW; + if (dest_mask & IMAGE_SUBWINDOW_MASK) + IMAGE_INSTANCE_TYPE (ii) = IMAGE_SUBWINDOW; + else + incompatible_image_types (instantiator, dest_mask, + IMAGE_SUBWINDOW_MASK); pw = XtWindow (FRAME_X_TEXT_WIDGET (f)); ii->data = xnew_and_zero (struct x_subwindow_data); IMAGE_INSTANCE_X_SUBWINDOW_PARENT (ii) = pw; - IMAGE_INSTANCE_X_SUBWINDOW_DISPLAY (ii) = DisplayOfScreen (xs); + IMAGE_INSTANCE_X_SUBWINDOW_SCREEN (ii) = xs; xswa.backing_store = Always; valueMask |= CWBackingStore; xswa.colormap = DefaultColormapOfScreen (xs); valueMask |= CWColormap; - - /* Create a window for clipping */ - IMAGE_INSTANCE_X_CLIPWINDOW (ii) = - XCreateWindow (dpy, pw, 0, 0, w, h, 0, CopyFromParent, - InputOutput, CopyFromParent, valueMask, - &xswa); - - /* Now put the subwindow inside the clip window. */ - win = XCreateWindow (dpy, IMAGE_INSTANCE_X_CLIPWINDOW (ii), - 0, 0, w, h, 0, CopyFromParent, + + win = XCreateWindow (dpy, pw, 0, 0, w, h, 0, CopyFromParent, InputOutput, CopyFromParent, valueMask, &xswa); - + IMAGE_INSTANCE_SUBWINDOW_ID (ii) = (void*)win; } @@ -2331,7 +2041,7 @@ (subwindow, property, data)) { Atom property_atom; - Lisp_Subwindow *sw; + struct Lisp_Subwindow *sw; Display *dpy; CHECK_SUBWINDOW (subwindow); @@ -2352,416 +2062,14 @@ } #endif - -#ifdef HAVE_WIDGETS - -/************************************************************************/ -/* widgets */ -/************************************************************************/ - -static void -update_widget_face (widget_value* wv, Lisp_Image_Instance *ii, - Lisp_Object domain) -{ -#ifdef LWLIB_WIDGETS_MOTIF - XmFontList fontList; -#endif - /* Update the foreground. */ - Lisp_Object pixel = FACE_FOREGROUND - (IMAGE_INSTANCE_WIDGET_FACE (ii), - domain); - XColor fcolor = COLOR_INSTANCE_X_COLOR (XCOLOR_INSTANCE (pixel)), bcolor; - lw_add_widget_value_arg (wv, XtNforeground, fcolor.pixel); - - /* Update the background. */ - pixel = FACE_BACKGROUND (IMAGE_INSTANCE_WIDGET_FACE (ii), - domain); - bcolor = COLOR_INSTANCE_X_COLOR (XCOLOR_INSTANCE (pixel)); - lw_add_widget_value_arg (wv, XtNbackground, bcolor.pixel); - -#ifdef LWLIB_WIDGETS_MOTIF - fontList = XmFontListCreate - (FONT_INSTANCE_X_FONT - (XFONT_INSTANCE (query_string_font - (IMAGE_INSTANCE_WIDGET_TEXT (ii), - IMAGE_INSTANCE_WIDGET_FACE (ii), - domain))), XmSTRING_DEFAULT_CHARSET); - lw_add_widget_value_arg (wv, XmNfontList, (XtArgVal)fontList); -#endif - lw_add_widget_value_arg - (wv, XtNfont, (XtArgVal)FONT_INSTANCE_X_FONT - (XFONT_INSTANCE (query_string_font - (IMAGE_INSTANCE_WIDGET_TEXT (ii), - IMAGE_INSTANCE_WIDGET_FACE (ii), - domain)))); -} - -static void -update_tab_widget_face (widget_value* wv, Lisp_Image_Instance *ii, - Lisp_Object domain) -{ - if (wv->contents) - { - widget_value* val = wv->contents, *cur; - - /* Give each child label the correct foreground color. */ - Lisp_Object pixel = FACE_FOREGROUND - (IMAGE_INSTANCE_WIDGET_FACE (ii), - domain); - XColor fcolor = COLOR_INSTANCE_X_COLOR (XCOLOR_INSTANCE (pixel)); - lw_add_widget_value_arg (val, XtNtabForeground, fcolor.pixel); - - for (cur = val->next; cur; cur = cur->next) - { - if (cur->value) - { - lw_copy_widget_value_args (val, cur); - } - } - } -} - -static void -x_widget_instantiate (Lisp_Object image_instance, Lisp_Object instantiator, - Lisp_Object pointer_fg, Lisp_Object pointer_bg, - int dest_mask, Lisp_Object domain, - const char* type, widget_value* wv) +static void +x_resize_subwindow (struct Lisp_Image_Instance* ii, int w, int h) { - Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance); - Lisp_Object device = IMAGE_INSTANCE_DEVICE (ii), pixel; - struct device* d = XDEVICE (device); - Lisp_Object frame = DOMAIN_FRAME (domain); - struct frame* f = XFRAME (frame); - char* nm=0; - Widget wid; - Arg al [32]; - int ac = 0; - int id = new_lwlib_id (); - widget_value* clip_wv; - XColor fcolor, bcolor; - - if (!DEVICE_X_P (d)) - signal_simple_error ("Not an X device", device); - - /* have to set the type this late in case there is no device - instantiation for a widget. But we can go ahead and do it without - checking because there is always a generic instantiator. */ - IMAGE_INSTANCE_TYPE (ii) = IMAGE_WIDGET; - - if (!NILP (IMAGE_INSTANCE_WIDGET_TEXT (ii))) - TO_EXTERNAL_FORMAT (LISP_STRING, IMAGE_INSTANCE_WIDGET_TEXT (ii), - C_STRING_ALLOCA, nm, - Qnative); - - ii->data = xnew_and_zero (struct x_subwindow_data); - - /* Create a clip window to contain the subwidget. Incredibly the - XEmacs manager seems to be the most appropriate widget for - this. Nothing else is simple enough and yet does what is - required. */ - clip_wv = xmalloc_widget_value (); - - lw_add_widget_value_arg (clip_wv, XtNresize, False); - lw_add_widget_value_arg (clip_wv, XtNwidth, - (Dimension)IMAGE_INSTANCE_WIDTH (ii)); - lw_add_widget_value_arg (clip_wv, XtNheight, - (Dimension)IMAGE_INSTANCE_HEIGHT (ii)); - clip_wv->enabled = True; - - clip_wv->name = xstrdup ("clip-window"); - clip_wv->value = xstrdup ("clip-window"); - - IMAGE_INSTANCE_X_CLIPWIDGET (ii) - = lw_create_widget ("clip-window", "clip-window", new_lwlib_id (), - clip_wv, FRAME_X_CONTAINER_WIDGET (f), - False, 0, 0, 0); - - free_widget_value_tree (clip_wv); - - /* copy any args we were given */ - ac = 0; - lw_add_value_args_to_args (wv, al, &ac); - - /* Fixup the colors. We have to do this *before* the widget gets - created so that Motif will fix up the shadow colors - correctly. Once the widget is created Motif won't do this - anymore...*/ - pixel = FACE_FOREGROUND - (IMAGE_INSTANCE_WIDGET_FACE (ii), - IMAGE_INSTANCE_FRAME (ii)); - fcolor = COLOR_INSTANCE_X_COLOR (XCOLOR_INSTANCE (pixel)); - - pixel = FACE_BACKGROUND - (IMAGE_INSTANCE_WIDGET_FACE (ii), - IMAGE_INSTANCE_FRAME (ii)); - bcolor = COLOR_INSTANCE_X_COLOR (XCOLOR_INSTANCE (pixel)); - - lw_add_widget_value_arg (wv, XtNbackground, bcolor.pixel); - lw_add_widget_value_arg (wv, XtNforeground, fcolor.pixel); - /* we cannot allow widgets to resize themselves */ - lw_add_widget_value_arg (wv, XtNresize, False); - lw_add_widget_value_arg (wv, XtNwidth, - (Dimension)IMAGE_INSTANCE_WIDTH (ii)); - lw_add_widget_value_arg (wv, XtNheight, - (Dimension)IMAGE_INSTANCE_HEIGHT (ii)); - /* update the font. */ - update_widget_face (wv, ii, domain); - - wid = lw_create_widget (type, wv->name, id, wv, IMAGE_INSTANCE_X_CLIPWIDGET (ii), - False, 0, popup_selection_callback, 0); - - IMAGE_INSTANCE_SUBWINDOW_ID (ii) = (void*)wid; - IMAGE_INSTANCE_X_WIDGET_LWID (ii) = id; - /* because the EmacsManager is the widgets parent we have to - offset the redisplay of the widget by the amount the text - widget is inside the manager. */ - ac = 0; - XtSetArg (al [ac], XtNx, &IMAGE_INSTANCE_X_WIDGET_XOFFSET (ii)); ac++; - XtSetArg (al [ac], XtNy, &IMAGE_INSTANCE_X_WIDGET_YOFFSET (ii)); ac++; - XtGetValues (FRAME_X_TEXT_WIDGET (f), al, ac); - - XtSetMappedWhenManaged (wid, TRUE); - - free_widget_value_tree (wv); - /* A kludgy but simple way to make sure the callback for a widget - doesn't get deleted. */ - gcpro_popup_callbacks (id); -} - -/* get properties of a control */ -static Lisp_Object -x_widget_property (Lisp_Object image_instance, Lisp_Object prop) -{ - Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance); - /* get the text from a control */ - if (EQ (prop, Q_text)) - { - widget_value* wv = lw_get_all_values (IMAGE_INSTANCE_X_WIDGET_LWID (ii)); - return build_ext_string (wv->value, Qnative); - } - return Qunbound; -} - -/* Instantiate a layout control for putting other widgets in. */ -static void -x_native_layout_instantiate (Lisp_Object image_instance, Lisp_Object instantiator, - Lisp_Object pointer_fg, Lisp_Object pointer_bg, - int dest_mask, Lisp_Object domain) -{ - x_widget_instantiate (image_instance, instantiator, pointer_fg, - pointer_bg, dest_mask, domain, "layout", 0); + XResizeWindow (DisplayOfScreen (IMAGE_INSTANCE_X_SUBWINDOW_SCREEN (ii)), + IMAGE_INSTANCE_X_SUBWINDOW_ID (ii), + w, h); } -/* Instantiate a button widget. Unfortunately instantiated widgets are - particular to a frame since they need to have a parent. It's not - like images where you just select the image into the context you - want to display it in and BitBlt it. So images instances can have a - many-to-one relationship with things you see, whereas widgets can - only be one-to-one (i.e. per frame) */ -static void -x_button_instantiate (Lisp_Object image_instance, Lisp_Object instantiator, - Lisp_Object pointer_fg, Lisp_Object pointer_bg, - int dest_mask, Lisp_Object domain) -{ - Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance); - Lisp_Object gui = IMAGE_INSTANCE_WIDGET_ITEM (ii); - Lisp_Object glyph = find_keyword_in_vector (instantiator, Q_image); - widget_value* wv = gui_items_to_widget_values (image_instance, gui); - - if (!NILP (glyph)) - { - if (!IMAGE_INSTANCEP (glyph)) - glyph = glyph_image_instance (glyph, domain, ERROR_ME, 1); - } - - x_widget_instantiate (image_instance, instantiator, pointer_fg, - pointer_bg, dest_mask, domain, "button", wv); - - /* add the image if one was given */ - if (!NILP (glyph) && IMAGE_INSTANCEP (glyph) - && IMAGE_INSTANCE_PIXMAP_TYPE_P (XIMAGE_INSTANCE (glyph))) - { - Arg al [2]; - int ac =0; -#ifdef LWLIB_WIDGETS_MOTIF - XtSetArg (al [ac], XmNlabelType, XmPIXMAP); ac++; - XtSetArg (al [ac], XmNlabelPixmap, XIMAGE_INSTANCE_X_PIXMAP (glyph));ac++; -#else - XtSetArg (al [ac], XtNpixmap, XIMAGE_INSTANCE_X_PIXMAP (glyph)); ac++; -#endif - XtSetValues (IMAGE_INSTANCE_X_WIDGET_ID (ii), al, ac); - } -} - -/* Update a button's clicked state. - - #### This is overkill, but it works. Right now this causes all - button instances to flash for some reason buried deep in lwlib. In - theory this should be the Right Thing to do since lwlib should only - merge in changed values - and if nothing has changed then nothing - should get done. This may be because of the args stuff, - i.e. although the arg contents may be the same the args look - different and so are re-applied to the widget. */ -static void -x_button_update (Lisp_Object image_instance) -{ - /* This function can GC if IN_REDISPLAY is false. */ - Lisp_Image_Instance *p = XIMAGE_INSTANCE (image_instance); - widget_value* wv = - gui_items_to_widget_values (image_instance, - IMAGE_INSTANCE_WIDGET_ITEMS (p)); - - /* now modify the widget */ - lw_modify_all_widgets (IMAGE_INSTANCE_X_WIDGET_LWID (p), - wv, True); - free_widget_value_tree (wv); -} - -/* get properties of a button */ -static Lisp_Object -x_button_property (Lisp_Object image_instance, Lisp_Object prop) -{ - Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance); - /* check the state of a button */ - if (EQ (prop, Q_selected)) - { - widget_value* wv = lw_get_all_values (IMAGE_INSTANCE_X_WIDGET_LWID (ii)); - - if (wv->selected) - return Qt; - else - return Qnil; - } - return Qunbound; -} - -/* instantiate a progress gauge */ -static void -x_progress_gauge_instantiate (Lisp_Object image_instance, Lisp_Object instantiator, - Lisp_Object pointer_fg, Lisp_Object pointer_bg, - int dest_mask, Lisp_Object domain) -{ - Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance); - Lisp_Object gui = IMAGE_INSTANCE_WIDGET_ITEM (ii); - widget_value* wv = gui_items_to_widget_values (image_instance, gui); - - x_widget_instantiate (image_instance, instantiator, pointer_fg, - pointer_bg, dest_mask, domain, "progress", wv); -} - -/* set the properties of a progres guage */ -static void -x_progress_gauge_update (Lisp_Object image_instance) -{ - Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance); - - if (IMAGE_INSTANCE_WIDGET_ITEMS_CHANGED (ii)) - { - Arg al [1]; - Lisp_Object val; -#ifdef ERROR_CHECK_GLYPHS - assert (GUI_ITEMP (IMAGE_INSTANCE_WIDGET_PENDING_ITEMS (ii))); -#endif - val = XGUI_ITEM (IMAGE_INSTANCE_WIDGET_PENDING_ITEMS (ii))->value; - XtSetArg (al[0], XtNvalue, XINT (val)); - XtSetValues (IMAGE_INSTANCE_X_WIDGET_ID (ii), al, 1); - } -} - -/* instantiate an edit control */ -static void -x_edit_field_instantiate (Lisp_Object image_instance, Lisp_Object instantiator, - Lisp_Object pointer_fg, Lisp_Object pointer_bg, - int dest_mask, Lisp_Object domain) -{ - Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance); - Lisp_Object gui = IMAGE_INSTANCE_WIDGET_ITEM (ii); - widget_value* wv = gui_items_to_widget_values (image_instance, gui); - - x_widget_instantiate (image_instance, instantiator, pointer_fg, - pointer_bg, dest_mask, domain, "text-field", wv); -} - -#if defined (LWLIB_WIDGETS_MOTIF) && XmVERSION > 1 -/* instantiate a combo control */ -static void -x_combo_box_instantiate (Lisp_Object image_instance, Lisp_Object instantiator, - Lisp_Object pointer_fg, Lisp_Object pointer_bg, - int dest_mask, Lisp_Object domain) -{ - Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance); - widget_value * wv = 0; - /* This is not done generically because of sizing problems under - mswindows. */ - widget_instantiate (image_instance, instantiator, pointer_fg, - pointer_bg, dest_mask, domain); - - wv = gui_items_to_widget_values (image_instance, - IMAGE_INSTANCE_WIDGET_ITEMS (ii)); - - x_widget_instantiate (image_instance, instantiator, pointer_fg, - pointer_bg, dest_mask, domain, "combo-box", wv); -} -#endif - -static void -x_tab_control_instantiate (Lisp_Object image_instance, Lisp_Object instantiator, - Lisp_Object pointer_fg, Lisp_Object pointer_bg, - int dest_mask, Lisp_Object domain) -{ - Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance); - widget_value * wv = - gui_items_to_widget_values (image_instance, - IMAGE_INSTANCE_WIDGET_ITEMS (ii)); - - update_tab_widget_face (wv, ii, - IMAGE_INSTANCE_FRAME (ii)); - - x_widget_instantiate (image_instance, instantiator, pointer_fg, - pointer_bg, dest_mask, domain, "tab-control", wv); -} - -/* set the properties of a tab control */ -static void -x_tab_control_update (Lisp_Object image_instance) -{ - Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance); - - /* Possibly update the face. */ - if (IMAGE_INSTANCE_WIDGET_FACE_CHANGED (ii) - || - XFRAME (IMAGE_INSTANCE_FRAME (ii))->faces_changed - || - IMAGE_INSTANCE_WIDGET_ITEMS_CHANGED (ii)) - { - widget_value* wv = lw_get_all_values (IMAGE_INSTANCE_X_WIDGET_LWID (ii)); - - /* #### I don't know why this can occur. */ - if (!wv) - return; - - update_tab_widget_face (wv, ii, - IMAGE_INSTANCE_FRAME (ii)); - - lw_modify_all_widgets (IMAGE_INSTANCE_X_WIDGET_LWID (ii), wv, True); - } -} - -/* instantiate a static control possible for putting other things in */ -static void -x_label_instantiate (Lisp_Object image_instance, Lisp_Object instantiator, - Lisp_Object pointer_fg, Lisp_Object pointer_bg, - int dest_mask, Lisp_Object domain) -{ - Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance); - Lisp_Object gui = IMAGE_INSTANCE_WIDGET_ITEM (ii); - widget_value* wv = gui_items_to_widget_values (image_instance, gui); - - x_widget_instantiate (image_instance, instantiator, pointer_fg, - pointer_bg, dest_mask, domain, "button", wv); -} -#endif /* HAVE_WIDGETS */ - /************************************************************************/ /* initialization */ @@ -2789,76 +2097,23 @@ CONSOLE_HAS_METHOD (x, locate_pixmap_file); CONSOLE_HAS_METHOD (x, unmap_subwindow); CONSOLE_HAS_METHOD (x, map_subwindow); - CONSOLE_HAS_METHOD (x, update_widget); - CONSOLE_HAS_METHOD (x, update_subwindow); + CONSOLE_HAS_METHOD (x, resize_subwindow); } void image_instantiator_format_create_glyphs_x (void) { - IIFORMAT_VALID_CONSOLE (x, nothing); - IIFORMAT_VALID_CONSOLE (x, string); -#ifdef HAVE_WIDGETS - IIFORMAT_VALID_CONSOLE (x, layout); -#endif - IIFORMAT_VALID_CONSOLE (x, formatted_string); - IIFORMAT_VALID_CONSOLE (x, inherit); #ifdef HAVE_XPM INITIALIZE_DEVICE_IIFORMAT (x, xpm); IIFORMAT_HAS_DEVMETHOD (x, xpm, instantiate); #endif -#ifdef HAVE_JPEG - IIFORMAT_VALID_CONSOLE (x, jpeg); -#endif -#ifdef HAVE_TIFF - IIFORMAT_VALID_CONSOLE (x, tiff); -#endif -#ifdef HAVE_PNG - IIFORMAT_VALID_CONSOLE (x, png); -#endif -#ifdef HAVE_GIF - IIFORMAT_VALID_CONSOLE (x, gif); -#endif INITIALIZE_DEVICE_IIFORMAT (x, xbm); IIFORMAT_HAS_DEVMETHOD (x, xbm, instantiate); INITIALIZE_DEVICE_IIFORMAT (x, subwindow); IIFORMAT_HAS_DEVMETHOD (x, subwindow, instantiate); -#ifdef HAVE_WIDGETS - /* layout widget */ - INITIALIZE_DEVICE_IIFORMAT (x, native_layout); - IIFORMAT_HAS_DEVMETHOD (x, native_layout, instantiate); - /* button widget */ - INITIALIZE_DEVICE_IIFORMAT (x, button); - IIFORMAT_HAS_DEVMETHOD (x, button, property); - IIFORMAT_HAS_DEVMETHOD (x, button, instantiate); - IIFORMAT_HAS_DEVMETHOD (x, button, update); - /* general widget methods. */ - INITIALIZE_DEVICE_IIFORMAT (x, widget); - IIFORMAT_HAS_DEVMETHOD (x, widget, property); - /* progress gauge */ - INITIALIZE_DEVICE_IIFORMAT (x, progress_gauge); - IIFORMAT_HAS_DEVMETHOD (x, progress_gauge, update); - IIFORMAT_HAS_DEVMETHOD (x, progress_gauge, instantiate); - /* text field */ - INITIALIZE_DEVICE_IIFORMAT (x, edit_field); - IIFORMAT_HAS_DEVMETHOD (x, edit_field, instantiate); -#if defined (LWLIB_WIDGETS_MOTIF) && XmVERSION > 1 - /* combo box */ - INITIALIZE_DEVICE_IIFORMAT (x, combo_box); - IIFORMAT_HAS_DEVMETHOD (x, combo_box, instantiate); - IIFORMAT_HAS_SHARED_DEVMETHOD (x, combo_box, update, tab_control); -#endif - /* tab control widget */ - INITIALIZE_DEVICE_IIFORMAT (x, tab_control); - IIFORMAT_HAS_DEVMETHOD (x, tab_control, instantiate); - IIFORMAT_HAS_DEVMETHOD (x, tab_control, update); - /* label */ - INITIALIZE_DEVICE_IIFORMAT (x, label); - IIFORMAT_HAS_DEVMETHOD (x, label, instantiate); -#endif + INITIALIZE_IMAGE_INSTANTIATOR_FORMAT (cursor_font, "cursor-font"); - IIFORMAT_VALID_CONSOLE (x, cursor_font); IIFORMAT_HAS_METHOD (cursor_font, validate); IIFORMAT_HAS_METHOD (cursor_font, possible_dest_types); @@ -2873,7 +2128,6 @@ IIFORMAT_HAS_METHOD (font, validate); IIFORMAT_HAS_METHOD (font, possible_dest_types); IIFORMAT_HAS_METHOD (font, instantiate); - IIFORMAT_VALID_CONSOLE (x, font); IIFORMAT_VALID_KEYWORD (font, Q_data, check_valid_string); IIFORMAT_VALID_KEYWORD (font, Q_foreground, check_valid_string); @@ -2891,7 +2145,6 @@ IIFORMAT_HAS_METHOD (autodetect, normalize); IIFORMAT_HAS_METHOD (autodetect, possible_dest_types); IIFORMAT_HAS_METHOD (autodetect, instantiate); - IIFORMAT_VALID_CONSOLE (x, autodetect); IIFORMAT_VALID_KEYWORD (autodetect, Q_data, check_valid_string); } @@ -2919,7 +2172,7 @@ make_int (name##_height), \ make_ext_string (name##_bits, \ sizeof (name##_bits), \ - Qbinary))), \ + FORMAT_BINARY))), \ Qglobal, Qx, Qnil) BUILD_GLYPH_INST (Vtruncation_glyph, truncator);