Mercurial > hg > xemacs-beta
diff src/glyphs-msw.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 | e804706bfb8c |
line wrap: on
line diff
--- a/src/glyphs-msw.c Mon Aug 13 11:19:22 2007 +0200 +++ b/src/glyphs-msw.c Mon Aug 13 11:20:41 2007 +0200 @@ -1,6 +1,6 @@ /* mswindows-specific glyph objects. - Copyright (C) 1998, 1999, 2000 Andy Piper. - + Copyright (C) 1998 Andy Piper. + This file is part of XEmacs. XEmacs is free software; you can redistribute it and/or modify it @@ -20,7 +20,7 @@ /* Synched up with: Not in FSF. */ -/* written by Andy Piper <andy@xemacs.org> plagiarising bits from +/* written by Andy Piper <andy@xemacs.org> plagerising bits from glyphs-x.c */ #include <config.h> @@ -53,44 +53,24 @@ #define WIDGET_GLYPH_SLOT 0 -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 (mswindows, xpm); -DEFINE_DEVICE_IIFORMAT (msprinter, xpm); #endif DEFINE_DEVICE_IIFORMAT (mswindows, xbm); -DEFINE_DEVICE_IIFORMAT (msprinter, xbm); #ifdef HAVE_XFACE DEFINE_DEVICE_IIFORMAT (mswindows, xface); -DEFINE_DEVICE_IIFORMAT (msprinter, xface); #endif -DECLARE_IMAGE_INSTANTIATOR_FORMAT (layout); -DEFINE_DEVICE_IIFORMAT (mswindows, native_layout); DEFINE_DEVICE_IIFORMAT (mswindows, button); -DEFINE_DEVICE_IIFORMAT (mswindows, edit_field); +DEFINE_DEVICE_IIFORMAT (mswindows, edit); +#if 0 +DEFINE_DEVICE_IIFORMAT (mswindows, group); +#endif DEFINE_DEVICE_IIFORMAT (mswindows, subwindow); DEFINE_DEVICE_IIFORMAT (mswindows, widget); DEFINE_DEVICE_IIFORMAT (mswindows, label); DEFINE_DEVICE_IIFORMAT (mswindows, scrollbar); -DEFINE_DEVICE_IIFORMAT (mswindows, combo_box); -DEFINE_DEVICE_IIFORMAT (mswindows, progress_gauge); -DEFINE_DEVICE_IIFORMAT (mswindows, tree_view); -DEFINE_DEVICE_IIFORMAT (mswindows, tab_control); +DEFINE_DEVICE_IIFORMAT (mswindows, combo); +DEFINE_DEVICE_IIFORMAT (mswindows, progress); DEFINE_IMAGE_INSTANTIATOR_FORMAT (bmp); Lisp_Object Qbmp; @@ -102,60 +82,13 @@ Lisp_Object Qmswindows_resource; static void -mswindows_initialize_dibitmap_image_instance (Lisp_Image_Instance *ii, - int slices, - enum image_instance_type type); +mswindows_initialize_dibitmap_image_instance (struct Lisp_Image_Instance *ii, + enum image_instance_type type); static void -mswindows_initialize_image_instance_mask (Lisp_Image_Instance* image, - HDC hcdc); - -/* - * Given device D, retrieve compatible device context. D can be either - * mswindows or an msprinter device. - */ -inline static HDC -get_device_compdc (struct device *d) -{ - if (DEVICE_MSWINDOWS_P (d)) - return DEVICE_MSWINDOWS_HCDC (d); - else - return DEVICE_MSPRINTER_HCDC (d); -} +mswindows_initialize_image_instance_mask (struct Lisp_Image_Instance* image, + struct frame* f); -/* - * Initialize image instance pixel sizes in II. For a display bitmap, - * these will be same as real bitmap sizes. For a printer bitmap, - * these will be scaled up so that the bitmap is proportionally enlarged - * when output to printer. Redisplay code takes care of scaling, to - * conserve memory we do not really scale bitmaps. Set the watermark - * only here. - * #### Add support for unscalable bitmaps. - */ -static void init_image_instance_geometry (Lisp_Image_Instance *ii) -{ - struct device *d = DOMAIN_XDEVICE (ii->domain); - - if (/* #### Scaleable && */ DEVICE_MSPRINTER_P (d)) - { - HDC printer_dc = DEVICE_MSPRINTER_HCDC (d); - HDC display_dc = CreateCompatibleDC (NULL); - IMAGE_INSTANCE_PIXMAP_WIDTH (ii) = - MulDiv (IMAGE_INSTANCE_MSWINDOWS_BITMAP_REAL_WIDTH (ii), - GetDeviceCaps (printer_dc, LOGPIXELSX), - GetDeviceCaps (display_dc, LOGPIXELSX)); - IMAGE_INSTANCE_PIXMAP_HEIGHT (ii) = - MulDiv (IMAGE_INSTANCE_MSWINDOWS_BITMAP_REAL_HEIGHT (ii), - GetDeviceCaps (printer_dc, LOGPIXELSY), - GetDeviceCaps (display_dc, LOGPIXELSY)); - } - else - { - IMAGE_INSTANCE_PIXMAP_WIDTH (ii) = - IMAGE_INSTANCE_MSWINDOWS_BITMAP_REAL_WIDTH (ii); - IMAGE_INSTANCE_PIXMAP_HEIGHT (ii) = - IMAGE_INSTANCE_MSWINDOWS_BITMAP_REAL_HEIGHT (ii); - } -} +COLORREF mswindows_string_to_color (CONST char *name); #define BPLINE(width) ((int)(~3UL & (unsigned long)((width) +3))) @@ -176,7 +109,7 @@ BITMAPINFO* bmp_info; unsigned char *ip, *dp; - if (GetDeviceCaps (get_device_compdc (d), BITSPIXEL) > 0) + if (DEVICE_MSWINDOWS_BITSPIXEL (d) > 0) { int bpline = BPLINE(width * 3); /* FIXME: we can do this because 24bpp implies no color table, once @@ -187,7 +120,7 @@ * structure - unless it has memory / color allocation implications * .... */ bmp_info=xnew_and_zero (BITMAPINFO); - + if (!bmp_info) { return NULL; @@ -195,7 +128,7 @@ bmp_info->bmiHeader.biBitCount=24; /* just RGB triples for now */ bmp_info->bmiHeader.biCompression=BI_RGB; /* just RGB triples for now */ - bmp_info->bmiHeader.biSizeImage=width*height*3; + bmp_info->bmiHeader.biSizeImage=width*height*3; /* bitmap data needs to be in blue, green, red triples - in that order, eimage is in RGB format so we need to convert */ @@ -231,7 +164,7 @@ /* use our quantize table to allocate the colors */ ncolors = qtable->num_active_colors; - bmp_info=(BITMAPINFO*)xmalloc_and_zero (sizeof(BITMAPINFOHEADER) + + bmp_info=(BITMAPINFO*)xmalloc_and_zero (sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD) * ncolors); if (!bmp_info) { @@ -241,12 +174,12 @@ colortbl=(RGBQUAD*)(((unsigned char*)bmp_info)+sizeof(BITMAPINFOHEADER)); - bmp_info->bmiHeader.biBitCount=8; - bmp_info->bmiHeader.biCompression=BI_RGB; + bmp_info->bmiHeader.biBitCount=8; + bmp_info->bmiHeader.biCompression=BI_RGB; bmp_info->bmiHeader.biSizeImage=bpline*height; - bmp_info->bmiHeader.biClrUsed=ncolors; - bmp_info->bmiHeader.biClrImportant=ncolors; - + bmp_info->bmiHeader.biClrUsed=ncolors; + bmp_info->bmiHeader.biClrImportant=ncolors; + *bmp_data = (unsigned char *) xmalloc_and_zero (bpline * height); *bit_count = bpline * height; @@ -256,39 +189,36 @@ xfree (bmp_info); return NULL; } - + /* build up an RGBQUAD colortable */ - for (i = 0; i < qtable->num_active_colors; i++) - { - colortbl[i].rgbRed = (BYTE) qtable->rm[i]; - colortbl[i].rgbGreen = (BYTE) qtable->gm[i]; - colortbl[i].rgbBlue = (BYTE) qtable->bm[i]; - colortbl[i].rgbReserved = 0; - } + for (i = 0; i < qtable->num_active_colors; i++) { + colortbl[i].rgbRed = (BYTE) qtable->rm[i]; + colortbl[i].rgbGreen = (BYTE) qtable->gm[i]; + colortbl[i].rgbBlue = (BYTE) qtable->bm[i]; + colortbl[i].rgbReserved = 0; + } /* now build up the data. picture has to be upside-down and back-to-front for msw bitmaps */ ip = pic; - for (i = height-1; i >= 0; i--) - { - dp = (*bmp_data) + (i * bpline); - for (j = 0; j < width; j++) - { - rd = *ip++; - gr = *ip++; - bl = *ip++; - *dp++ = QUANT_GET_COLOR (qtable,rd,gr,bl); - } + for (i = height-1; i >= 0; i--) { + dp = (*bmp_data) + (i * bpline); + for (j = 0; j < width; j++) { + rd = *ip++; + gr = *ip++; + bl = *ip++; + *dp++ = QUANT_GET_COLOR (qtable,rd,gr,bl); } + } xfree (qtable); - } + } /* fix up the standard stuff */ bmp_info->bmiHeader.biWidth=width; bmp_info->bmiHeader.biHeight=height; bmp_info->bmiHeader.biPlanes=1; bmp_info->bmiHeader.biSize=sizeof(BITMAPINFOHEADER); bmp_info->bmiHeader.biXPelsPerMeter=0; /* unless you know better */ - bmp_info->bmiHeader.biYPelsPerMeter=0; + bmp_info->bmiHeader.biYPelsPerMeter=0; return bmp_info; } @@ -312,7 +242,7 @@ (IS_DIRECTORY_SEP(XSTRING_BYTE (name, 2))))))) { if (!NILP (Ffile_readable_p (name))) - return Fexpand_file_name (name, Qnil); + return name; else return Qnil; } @@ -326,7 +256,7 @@ locate_file (temp, name, Qnil, &found, R_OK); UNGCPRO; } - + return found; } @@ -339,36 +269,45 @@ in the error message. */ static void -init_image_instance_from_dibitmap (Lisp_Image_Instance *ii, +init_image_instance_from_dibitmap (struct Lisp_Image_Instance *ii, BITMAPINFO *bmp_info, int dest_mask, void *bmp_data, int bmp_bits, - int slices, - Lisp_Object instantiator, + Lisp_Object instantiator, int x_hot, int y_hot, int create_mask) { - struct device *d = XDEVICE (IMAGE_INSTANCE_DEVICE (ii)); + Lisp_Object device = IMAGE_INSTANCE_DEVICE (ii); + struct device *d = XDEVICE (device); + struct frame *f; void* bmp_buf=0; - enum image_instance_type type; + int type; HBITMAP bitmap; HDC hdc; + if (!DEVICE_MSWINDOWS_P (d)) + signal_simple_error ("Not an mswindows device", device); + + if (NILP (DEVICE_SELECTED_FRAME (d))) + signal_simple_error ("No selected frame on mswindows device", device); + + f = XFRAME (DEVICE_SELECTED_FRAME (d)); + if (dest_mask & IMAGE_COLOR_PIXMAP_MASK) type = IMAGE_COLOR_PIXMAP; else if (dest_mask & IMAGE_POINTER_MASK) type = IMAGE_POINTER; - else + else incompatible_image_types (instantiator, dest_mask, IMAGE_COLOR_PIXMAP_MASK | IMAGE_POINTER_MASK); + hdc = FRAME_MSWINDOWS_CDC (f); - hdc = get_device_compdc (d); - bitmap = CreateDIBSection (hdc, - bmp_info, - DIB_RGB_COLORS, - &bmp_buf, - 0, 0); + bitmap=CreateDIBSection (hdc, + bmp_info, + DIB_RGB_COLORS, + &bmp_buf, + 0,0); if (!bitmap || !bmp_buf) signal_simple_error ("Unable to create bitmap", instantiator); @@ -376,29 +315,24 @@ /* copy in the actual bitmap */ memcpy (bmp_buf, bmp_data, bmp_bits); - mswindows_initialize_dibitmap_image_instance (ii, slices, type); + mswindows_initialize_dibitmap_image_instance (ii, type); IMAGE_INSTANCE_PIXMAP_FILENAME (ii) = find_keyword_in_vector (instantiator, Q_file); - /* Fixup a set of bitmaps. */ IMAGE_INSTANCE_MSWINDOWS_BITMAP (ii) = bitmap; - IMAGE_INSTANCE_MSWINDOWS_MASK (ii) = NULL; - IMAGE_INSTANCE_MSWINDOWS_BITMAP_REAL_WIDTH (ii) = - bmp_info->bmiHeader.biWidth; - IMAGE_INSTANCE_MSWINDOWS_BITMAP_REAL_HEIGHT (ii) = - bmp_info->bmiHeader.biHeight; - IMAGE_INSTANCE_PIXMAP_DEPTH (ii) = bmp_info->bmiHeader.biBitCount; + IMAGE_INSTANCE_PIXMAP_WIDTH (ii) = bmp_info->bmiHeader.biWidth; + IMAGE_INSTANCE_PIXMAP_HEIGHT (ii) = bmp_info->bmiHeader.biHeight; + IMAGE_INSTANCE_PIXMAP_DEPTH (ii) = bmp_info->bmiHeader.biBitCount; XSETINT (IMAGE_INSTANCE_PIXMAP_HOTSPOT_X (ii), x_hot); XSETINT (IMAGE_INSTANCE_PIXMAP_HOTSPOT_Y (ii), y_hot); - init_image_instance_geometry (ii); if (create_mask) { - mswindows_initialize_image_instance_mask (ii, hdc); + mswindows_initialize_image_instance_mask (ii, f); } - + if (type == IMAGE_POINTER) { mswindows_initialize_image_instance_icon(ii, TRUE); @@ -406,35 +340,9 @@ } static void -image_instance_add_dibitmap (Lisp_Image_Instance *ii, - BITMAPINFO *bmp_info, - void *bmp_data, - int bmp_bits, - int slice, - Lisp_Object instantiator) -{ - struct device *d = XDEVICE (IMAGE_INSTANCE_DEVICE (ii)); - void* bmp_buf=0; - - HBITMAP bitmap = CreateDIBSection (get_device_compdc (d), - bmp_info, - DIB_RGB_COLORS, - &bmp_buf, - 0,0); - - if (!bitmap || !bmp_buf) - signal_simple_error ("Unable to create bitmap", instantiator); - - /* copy in the actual bitmap */ - memcpy (bmp_buf, bmp_data, bmp_bits); - IMAGE_INSTANCE_MSWINDOWS_BITMAP_SLICE (ii, slice) = bitmap; -} - -static void -mswindows_init_image_instance_from_eimage (Lisp_Image_Instance *ii, +mswindows_init_image_instance_from_eimage (struct Lisp_Image_Instance *ii, int width, int height, - int slices, - unsigned char *eimage, + unsigned char *eimage, int dest_mask, Lisp_Object instantiator, Lisp_Object domain) @@ -444,86 +352,79 @@ unsigned char* bmp_data; int bmp_bits; COLORREF bkcolor; - int slice; - - CHECK_MSGDI_DEVICE (device); + + if (!DEVICE_MSWINDOWS_P (XDEVICE (device))) + signal_simple_error ("Not an mswindows device", device); /* this is a hack but MaskBlt and TransparentBlt are not supported on most windows variants */ - bkcolor = COLOR_INSTANCE_MSWINDOWS_COLOR + bkcolor = COLOR_INSTANCE_MSWINDOWS_COLOR (XCOLOR_INSTANCE (FACE_BACKGROUND (Vdefault_face, domain))); - for (slice = 0; slice < slices; slice++) + /* build a bitmap from the eimage */ + if (!(bmp_info=convert_EImage_to_DIBitmap (device, width, height, eimage, + &bmp_bits, &bmp_data))) { - /* build a bitmap from the eimage */ - if (!(bmp_info=convert_EImage_to_DIBitmap (device, width, height, - eimage + (width * height * 3 * slice), - &bmp_bits, &bmp_data))) - { - signal_simple_error ("EImage to DIBitmap conversion failed", - instantiator); - } + signal_simple_error ("EImage to DIBitmap conversion failed", + instantiator); + } - /* Now create the pixmap and set up the image instance */ - if (slice == 0) - init_image_instance_from_dibitmap (ii, bmp_info, dest_mask, - bmp_data, bmp_bits, slices, instantiator, - 0, 0, 0); - else - image_instance_add_dibitmap (ii, bmp_info, bmp_data, bmp_bits, slice, - instantiator); + /* Now create the pixmap and set up the image instance */ + init_image_instance_from_dibitmap (ii, bmp_info, dest_mask, + bmp_data, bmp_bits, instantiator, + 0, 0, 0); - xfree (bmp_info); - xfree (bmp_data); - } + xfree (bmp_info); + xfree (bmp_data); } -inline static void -set_mono_pixel (unsigned char* bits, - int bpline, int height, - int x, int y, int white) -{ - int i; - unsigned char bitnum; +static void set_mono_pixel ( unsigned char* bits, + int bpline, int height, + int x, int y, int white ) +{ + int index; + unsigned char bitnum; /* Find the byte on which this scanline begins */ - i = (height - y - 1) * bpline; + index = (height - y - 1) * bpline; /* Find the byte containing this pixel */ - i += (x >> 3); + index += (x >> 3); /* Which bit is it? */ - bitnum = (unsigned char) (7 - (x & 7)); - if (white) /* Turn it on */ - bits[i] |= (1 << bitnum); - else /* Turn it off */ - bits[i] &= ~(1 << bitnum); -} + bitnum = (unsigned char)( 7 - (x % 8) ); + if( white ) /* Turn it on */ + bits[index] |= (1<<bitnum); + else /* Turn it off */ + bits[index] &= ~(1<<bitnum); +} static void -mswindows_initialize_image_instance_mask (Lisp_Image_Instance* image, - HDC hcdc) +mswindows_initialize_image_instance_mask (struct Lisp_Image_Instance* image, + struct frame* f) { HBITMAP mask; HGDIOBJ old = NULL; - unsigned char *dibits, *and_bits; - BITMAPINFO *bmp_info = - (BITMAPINFO*) xmalloc_and_zero (sizeof (BITMAPINFO) + sizeof (RGBQUAD)); + HDC hcdc = FRAME_MSWINDOWS_CDC (f); + unsigned char* dibits; + BITMAPINFO* bmp_info = + xmalloc_and_zero (sizeof(BITMAPINFO) + sizeof(RGBQUAD)); int i, j; - int height = IMAGE_INSTANCE_MSWINDOWS_BITMAP_REAL_HEIGHT (image); - - int maskbpline = BPLINE ((IMAGE_INSTANCE_MSWINDOWS_BITMAP_REAL_WIDTH (image) + 7) / 8); - int bpline = BPLINE (IMAGE_INSTANCE_MSWINDOWS_BITMAP_REAL_WIDTH (image) * 3); + int height = IMAGE_INSTANCE_PIXMAP_HEIGHT (image); + + void* and_bits; + int maskbpline = BPLINE (((IMAGE_INSTANCE_PIXMAP_WIDTH (image)+7)/8)); + int bpline = BPLINE (IMAGE_INSTANCE_PIXMAP_WIDTH (image) * 3); if (!bmp_info) return; - bmp_info->bmiHeader.biWidth=IMAGE_INSTANCE_MSWINDOWS_BITMAP_REAL_WIDTH (image); + bmp_info->bmiHeader.biWidth=IMAGE_INSTANCE_PIXMAP_WIDTH (image); bmp_info->bmiHeader.biHeight = height; - bmp_info->bmiHeader.biPlanes = 1; + bmp_info->bmiHeader.biPlanes=1; bmp_info->bmiHeader.biSize=sizeof(BITMAPINFOHEADER); - bmp_info->bmiHeader.biBitCount = 1; - bmp_info->bmiHeader.biCompression = BI_RGB; - bmp_info->bmiHeader.biClrUsed = 2; - bmp_info->bmiHeader.biClrImportant = 2; - bmp_info->bmiHeader.biSizeImage = height * maskbpline; + bmp_info->bmiHeader.biBitCount=1; + bmp_info->bmiHeader.biCompression=BI_RGB; + bmp_info->bmiHeader.biClrUsed = 2; + bmp_info->bmiHeader.biClrImportant = 2; + bmp_info->bmiHeader.biSizeImage = height * maskbpline; bmp_info->bmiColors[0].rgbRed = 0; bmp_info->bmiColors[0].rgbGreen = 0; bmp_info->bmiColors[0].rgbBlue = 0; @@ -532,11 +433,11 @@ bmp_info->bmiColors[1].rgbGreen = 255; bmp_info->bmiColors[1].rgbBlue = 255; bmp_info->bmiColors[0].rgbReserved = 0; - - if (!(mask = CreateDIBSection (hcdc, + + if (!(mask = CreateDIBSection (hcdc, bmp_info, DIB_RGB_COLORS, - (void**)&and_bits, + &and_bits, 0,0))) { xfree (bmp_info); @@ -547,17 +448,17 @@ /* build up an in-memory set of bits to mess with */ xzero (*bmp_info); - bmp_info->bmiHeader.biWidth = IMAGE_INSTANCE_MSWINDOWS_BITMAP_REAL_WIDTH (image); + bmp_info->bmiHeader.biWidth=IMAGE_INSTANCE_PIXMAP_WIDTH (image); bmp_info->bmiHeader.biHeight = -height; - bmp_info->bmiHeader.biPlanes = 1; - bmp_info->bmiHeader.biSize = sizeof(BITMAPINFOHEADER); - bmp_info->bmiHeader.biBitCount = 24; - bmp_info->bmiHeader.biCompression = BI_RGB; - bmp_info->bmiHeader.biClrUsed = 0; - bmp_info->bmiHeader.biClrImportant = 0; + bmp_info->bmiHeader.biPlanes=1; + bmp_info->bmiHeader.biSize=sizeof(BITMAPINFOHEADER); + bmp_info->bmiHeader.biBitCount=24; + bmp_info->bmiHeader.biCompression=BI_RGB; + bmp_info->bmiHeader.biClrUsed = 0; + bmp_info->bmiHeader.biClrImportant = 0; bmp_info->bmiHeader.biSizeImage = height * bpline; - dibits = (unsigned char*) xmalloc_and_zero (bpline * height); + dibits = xmalloc_and_zero (bpline * height); if (GetDIBits (hcdc, IMAGE_INSTANCE_MSWINDOWS_BITMAP (image), 0, @@ -572,20 +473,20 @@ /* now set the colored bits in the mask and transparent ones to black in the original */ - for (i = 0; i < IMAGE_INSTANCE_MSWINDOWS_BITMAP_REAL_WIDTH (image); i++) - { - for (j=0; j<height; j++) - { + for(i=0; i<IMAGE_INSTANCE_PIXMAP_WIDTH (image); i++) + { + for(j=0; j<height; j++) + { unsigned char* idx = &dibits[j * bpline + i * 3]; - if (RGB (idx[2], idx[1], idx[0]) == transparent_color) - { + if( RGB (idx[2], idx[1], idx[0]) == transparent_color ) + { idx[0] = idx[1] = idx[2] = 0; - set_mono_pixel (and_bits, maskbpline, height, i, j, TRUE); + set_mono_pixel( and_bits, maskbpline, height, i, j, TRUE ); } - else - { - set_mono_pixel (and_bits, maskbpline, height, i, j, FALSE); + else + { + set_mono_pixel( and_bits, maskbpline, height, i, j, FALSE ); } } } @@ -600,14 +501,14 @@ xfree (bmp_info); xfree (dibits); - + SelectObject(hcdc, old); IMAGE_INSTANCE_MSWINDOWS_MASK (image) = mask; } void -mswindows_initialize_image_instance_icon (Lisp_Image_Instance* image, +mswindows_initialize_image_instance_icon (struct Lisp_Image_Instance* image, int cursor) { ICONINFO x_icon; @@ -618,32 +519,31 @@ x_icon.yHotspot=XINT (IMAGE_INSTANCE_PIXMAP_HOTSPOT_Y (image)); x_icon.hbmMask=IMAGE_INSTANCE_MSWINDOWS_MASK (image); x_icon.hbmColor=IMAGE_INSTANCE_MSWINDOWS_BITMAP (image); - + IMAGE_INSTANCE_MSWINDOWS_ICON (image)= CreateIconIndirect (&x_icon); } -static HBITMAP -create_resized_bitmap (HBITMAP curbmp, struct frame *f, - int curx, int cury, - int newx, int newy) +HBITMAP +mswindows_create_resized_bitmap (struct Lisp_Image_Instance* ii, + struct frame* f, + int newx, int newy) { HBITMAP newbmp; HGDIOBJ old1, old2; - - HDC hcdc = get_device_compdc (XDEVICE (FRAME_DEVICE (f))); - HDC hdcDst = CreateCompatibleDC (hcdc); - - old1 = SelectObject (hcdc, curbmp); - + HDC hcdc = FRAME_MSWINDOWS_CDC (f); + HDC hdcDst = CreateCompatibleDC (hcdc); + + old1 = SelectObject (hcdc, IMAGE_INSTANCE_MSWINDOWS_BITMAP (ii)); + newbmp = CreateCompatibleBitmap (hcdc, newx, newy); old2 = SelectObject (hdcDst, newbmp); - + if (!StretchBlt (hdcDst, 0, 0, newx, newy, - hcdc, 0, 0, - curx, - cury, + hcdc, 0, 0, + IMAGE_INSTANCE_PIXMAP_WIDTH (ii), + IMAGE_INSTANCE_PIXMAP_HEIGHT (ii), SRCCOPY)) { DeleteObject (newbmp); @@ -659,37 +559,45 @@ } HBITMAP -mswindows_create_resized_bitmap (Lisp_Image_Instance* ii, - struct frame* f, - int newx, int newy) -{ - return create_resized_bitmap (IMAGE_INSTANCE_MSWINDOWS_BITMAP (ii), - f, - IMAGE_INSTANCE_MSWINDOWS_BITMAP_REAL_WIDTH (ii), - IMAGE_INSTANCE_MSWINDOWS_BITMAP_REAL_HEIGHT (ii), - newx, newy); -} - -HBITMAP -mswindows_create_resized_mask (Lisp_Image_Instance* ii, +mswindows_create_resized_mask (struct Lisp_Image_Instance* ii, struct frame* f, int newx, int newy) { - if (IMAGE_INSTANCE_MSWINDOWS_MASK (ii) == NULL) - return NULL; + if (IMAGE_INSTANCE_MSWINDOWS_MASK (ii)) + { + HBITMAP newmask; + HGDIOBJ old1, old2; + HDC hcdc = FRAME_MSWINDOWS_CDC (f); + HDC hdcDst = CreateCompatibleDC (hcdc); + + old1 = SelectObject (hcdc, IMAGE_INSTANCE_MSWINDOWS_MASK (ii)); + newmask = CreateCompatibleBitmap(hcdc, newx, newy); + old2 = SelectObject (hdcDst, newmask); - return create_resized_bitmap (IMAGE_INSTANCE_MSWINDOWS_MASK (ii), - f, - IMAGE_INSTANCE_MSWINDOWS_BITMAP_REAL_WIDTH (ii), - IMAGE_INSTANCE_MSWINDOWS_BITMAP_REAL_HEIGHT (ii), - newx, newy); + if (!StretchBlt(hdcDst, 0, 0, newx, newy, + hcdc, 0, 0, + IMAGE_INSTANCE_PIXMAP_WIDTH (ii), + IMAGE_INSTANCE_PIXMAP_HEIGHT (ii), + SRCCOPY)) + { + DeleteObject (newmask); + DeleteDC (hdcDst); + return NULL; + } + + SelectObject (hdcDst, old2); + SelectObject (hcdc, old1); + + DeleteDC (hdcDst); + + return newmask; + } + + return NULL; } -#if 0 /* Currently unused */ -/* #### Warining: This function is not correct anymore with - resizable printer bitmaps. If you uncomment it, clean it. --kkm */ int -mswindows_resize_dibitmap_instance (Lisp_Image_Instance* ii, +mswindows_resize_dibitmap_instance (struct Lisp_Image_Instance* ii, struct frame* f, int newx, int newy) { @@ -698,7 +606,7 @@ if (!newbmp) return FALSE; - + if (IMAGE_INSTANCE_MSWINDOWS_BITMAP (ii)) DeleteObject (IMAGE_INSTANCE_MSWINDOWS_BITMAP (ii)); if (IMAGE_INSTANCE_MSWINDOWS_MASK (ii)) @@ -711,7 +619,6 @@ return TRUE; } -#endif /********************************************************************** * XPM * @@ -775,12 +682,10 @@ for (j=0; j<i; j++) { Lisp_Object cons = XCAR (results); - colortbl[j].color = + colortbl[j].color = COLOR_INSTANCE_MSWINDOWS_COLOR (XCOLOR_INSTANCE (XCDR (cons))); - TO_EXTERNAL_FORMAT (LISP_STRING, XCAR (cons), - C_STRING_ALLOCA, colortbl[j].name, - Qnative); + GET_C_STRING_OS_DATA_ALLOCA (XCAR (cons), colortbl[j].name); colortbl[j].name = xstrdup (colortbl[j].name); /* mustn't lose this when we return */ free_cons (XCONS (cons)); cons = results; @@ -790,7 +695,7 @@ return colortbl; } -static int xpm_to_eimage (Lisp_Object image, const Extbyte *buffer, +static int xpm_to_eimage (Lisp_Object image, CONST Extbyte *buffer, unsigned char** data, int* width, int* height, int* x_hot, int* y_hot, @@ -804,7 +709,7 @@ unsigned char* dptr; unsigned int* sptr; COLORREF color; /* the american spelling virus hits again .. */ - COLORREF* colortbl; + COLORREF* colortbl; xzero (xpmimage); xzero (xpminfo); @@ -830,15 +735,15 @@ default: { signal_double_file_error_2 ("Parsing pixmap data", - "unknown error", + "unknown error code", make_int (result), image); } } - + *width = xpmimage.width; *height = xpmimage.height; - maskbpline = BPLINE ((~7UL & (unsigned long)(*width + 7)) / 8); - + maskbpline = BPLINE (((~7UL & (unsigned long)(*width + 7)) / 8)); + *data = xnew_array_and_zero (unsigned char, *width * *height * 3); if (!*data) @@ -869,7 +774,7 @@ !strcasecmp (xpmimage.colorTable[i].symbolic,"None")) { *transp=TRUE; - colortbl[i]=transparent_color; + colortbl[i]=transparent_color; transp_idx=i; goto label_found_color; } @@ -894,7 +799,7 @@ if (!strcasecmp (xpmimage.colorTable[i].c_color,"None")) { *transp=TRUE; - colortbl[i]=transparent_color; + colortbl[i]=transparent_color; transp_idx=i; goto label_found_color; } @@ -905,14 +810,14 @@ mswindows_string_to_color (xpmimage.colorTable[i].c_color); goto label_found_color; } - + label_no_color: xfree (*data); xfree (colortbl); XpmFreeXpmImage (&xpmimage); XpmFreeXpmInfo (&xpminfo); return 0; - + label_found_color:; } @@ -944,9 +849,9 @@ Lisp_Object pointer_fg, Lisp_Object pointer_bg, int dest_mask, Lisp_Object domain) { - Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance); + struct Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance); Lisp_Object device = IMAGE_INSTANCE_DEVICE (ii); - const Extbyte *bytes; + CONST Extbyte *bytes; Extcount len; unsigned char *eimage; int width, height, x_hot, y_hot; @@ -955,18 +860,17 @@ int bmp_bits; int nsymbols=0, transp; struct color_symbol* color_symbols=NULL; - + Lisp_Object data = find_keyword_in_vector (instantiator, Q_data); Lisp_Object color_symbol_alist = find_keyword_in_vector (instantiator, Q_color_symbols); - CHECK_MSGDI_DEVICE (device); + if (!DEVICE_MSWINDOWS_P (XDEVICE (device))) + signal_simple_error ("Not an mswindows device", device); assert (!NILP (data)); - TO_EXTERNAL_FORMAT (LISP_STRING, data, - ALLOCA, (bytes, len), - Qbinary); + GET_STRING_BINARY_DATA_ALLOCA (data, bytes, len); /* in case we have color symbols */ color_symbols = extract_xpm_color_names (device, domain, @@ -976,10 +880,10 @@ if (!xpm_to_eimage (image_instance, bytes, &eimage, &width, &height, &x_hot, &y_hot, &transp, color_symbols, nsymbols)) { - signal_simple_error ("XPM to EImage conversion failed", + signal_simple_error ("XPM to EImage conversion failed", image_instance); } - + if (color_symbols) { while (nsymbols--) @@ -988,7 +892,7 @@ } xfree(color_symbols); } - + /* build a bitmap from the eimage */ if (!(bmp_info=convert_EImage_to_DIBitmap (device, width, height, eimage, &bmp_bits, &bmp_data))) @@ -1000,7 +904,7 @@ /* Now create the pixmap and set up the image instance */ init_image_instance_from_dibitmap (ii, bmp_info, dest_mask, - bmp_data, bmp_bits, 1, instantiator, + bmp_data, bmp_bits, instantiator, x_hot, y_hot, transp); xfree (bmp_info); @@ -1035,9 +939,9 @@ Lisp_Object pointer_fg, Lisp_Object pointer_bg, int dest_mask, Lisp_Object domain) { - Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance); + struct Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance); Lisp_Object device = IMAGE_INSTANCE_DEVICE (ii); - const Extbyte *bytes; + CONST Extbyte *bytes; Extcount len; BITMAPFILEHEADER* bmp_file_header; BITMAPINFO* bmp_info; @@ -1045,18 +949,17 @@ int bmp_bits; Lisp_Object data = find_keyword_in_vector (instantiator, Q_data); - CHECK_MSGDI_DEVICE (device); + if (!DEVICE_MSWINDOWS_P (XDEVICE (device))) + signal_simple_error ("Not an mswindows device", device); assert (!NILP (data)); - TO_EXTERNAL_FORMAT (LISP_STRING, data, - ALLOCA, (bytes, len), - Qbinary); - + GET_STRING_BINARY_DATA_ALLOCA (data, bytes, len); + /* Then slurp the image into memory, decoding along the way. The result is the image in a simple one-byte-per-pixel format. */ - + bmp_file_header=(BITMAPFILEHEADER*)bytes; bmp_info = (BITMAPINFO*)(bytes + sizeof(BITMAPFILEHEADER)); bmp_data = (Extbyte*)bytes + bmp_file_header->bfOffBits; @@ -1064,7 +967,7 @@ /* Now create the pixmap and set up the image instance */ init_image_instance_from_dibitmap (ii, bmp_info, dest_mask, - bmp_data, bmp_bits, 1, instantiator, + bmp_data, bmp_bits, instantiator, 0, 0, 0); } @@ -1076,9 +979,9 @@ static void mswindows_resource_validate (Lisp_Object instantiator) { - if ((NILP (find_keyword_in_vector (instantiator, Q_file)) + if ((NILP (find_keyword_in_vector (instantiator, Q_file)) && - NILP (find_keyword_in_vector (instantiator, Q_resource_id))) + NILP (find_keyword_in_vector (instantiator, Q_resource_id))) || NILP (find_keyword_in_vector (instantiator, Q_resource_type))) signal_simple_error ("Must supply :file, :resource-id and :resource-type", @@ -1095,7 +998,7 @@ GCPRO2 (file, alist); - file = potential_pixmap_file_instantiator (inst, Q_file, Q_data, + file = potential_pixmap_file_instantiator (inst, Q_file, Q_data, console_type); if (CONSP (file)) /* failure locating filename */ @@ -1126,7 +1029,7 @@ return IMAGE_POINTER_MASK | IMAGE_COLOR_PIXMAP_MASK; } -typedef struct +typedef struct { char *name; int resource_id; @@ -1140,12 +1043,10 @@ #define OIC_BANG 32515 #define OIC_NOTE 32516 #define OIC_WINLOGO 32517 -#if defined (CYGWIN) && CYGWIN_VERSION_DLL_MAJOR < 21 #define LR_SHARED 0x8000 #endif -#endif -static const resource_t bitmap_table[] = +static CONST resource_t bitmap_table[] = { /* bitmaps */ { "close", OBM_CLOSE }, @@ -1177,7 +1078,7 @@ {0} }; -static const resource_t cursor_table[] = +static CONST resource_t cursor_table[] = { /* cursors */ { "normal", OCR_NORMAL }, @@ -1196,7 +1097,7 @@ { 0 } }; -static const resource_t icon_table[] = +static CONST resource_t icon_table[] = { /* icons */ { "sample", OIC_SAMPLE }, @@ -1210,8 +1111,8 @@ static int resource_name_to_resource (Lisp_Object name, int type) { - const resource_t* res = (type == IMAGE_CURSOR ? cursor_table - : type == IMAGE_ICON ? icon_table + CONST resource_t* res = (type == IMAGE_CURSOR ? cursor_table + : type == IMAGE_ICON ? icon_table : bitmap_table); if (INTP (name)) @@ -1222,12 +1123,10 @@ { signal_simple_error ("invalid resource identifier", name); } - + do { Extbyte* nm=0; - TO_EXTERNAL_FORMAT (LISP_STRING, name, - C_STRING_ALLOCA, nm, - Qnative); + GET_C_STRING_OS_DATA_ALLOCA (name, nm); if (!strcasecmp ((char*)res->name, nm)) return res->resource_id; } while ((++res)->name); @@ -1252,25 +1151,26 @@ Lisp_Object pointer_fg, Lisp_Object pointer_bg, int dest_mask, Lisp_Object domain) { - Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance); + struct Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance); unsigned int type = 0; HANDLE himage = NULL; LPCTSTR resid=0; HINSTANCE hinst = NULL; ICONINFO iconinfo; - enum image_instance_type iitype; + int iitype=0; char* fname=0; Lisp_Object device = IMAGE_INSTANCE_DEVICE (ii); Lisp_Object file = find_keyword_in_vector (instantiator, Q_file); - Lisp_Object resource_type = find_keyword_in_vector (instantiator, + Lisp_Object resource_type = find_keyword_in_vector (instantiator, Q_resource_type); - Lisp_Object resource_id = find_keyword_in_vector (instantiator, + Lisp_Object resource_id = find_keyword_in_vector (instantiator, Q_resource_id); xzero (iconinfo); - CHECK_MSGDI_DEVICE (device); + if (!DEVICE_MSWINDOWS_P (XDEVICE (device))) + signal_simple_error ("Not an mswindows device", device); type = resource_symbol_to_type (resource_type); @@ -1278,7 +1178,7 @@ iitype = IMAGE_POINTER; else if (dest_mask & IMAGE_COLOR_PIXMAP_MASK) iitype = IMAGE_COLOR_PIXMAP; - else + else incompatible_image_types (instantiator, dest_mask, IMAGE_COLOR_PIXMAP_MASK | IMAGE_POINTER_MASK); @@ -1286,15 +1186,13 @@ if (!NILP (file)) { Extbyte* f=0; - TO_EXTERNAL_FORMAT (LISP_STRING, file, - C_STRING_ALLOCA, f, - Qfile_name); -#ifdef CYGWIN + GET_C_STRING_FILENAME_DATA_ALLOCA (file, f); +#ifdef __CYGWIN32__ CYGWIN_WIN32_PATH (f, fname); #else fname = f; #endif - + if (NILP (resource_id)) resid = (LPCTSTR)fname; else @@ -1303,21 +1201,19 @@ LOAD_LIBRARY_AS_DATAFILE); resid = MAKEINTRESOURCE (resource_name_to_resource (resource_id, type)); - + if (!resid) - TO_EXTERNAL_FORMAT (LISP_STRING, resource_id, - C_STRING_ALLOCA, resid, - Qnative); + GET_C_STRING_OS_DATA_ALLOCA (resource_id, resid); } } else if (!(resid = MAKEINTRESOURCE (resource_name_to_resource (resource_id, type)))) signal_simple_error ("Invalid resource identifier", resource_id); - + /* load the image */ if (!(himage = LoadImage (hinst, resid, type, 0, 0, - LR_CREATEDIBSECTION | LR_DEFAULTSIZE | - LR_SHARED | + LR_CREATEDIBSECTION | LR_DEFAULTSIZE | + LR_SHARED | (!NILP (file) ? LR_LOADFROMFILE : 0)))) { signal_simple_error ("Cannot load image", instantiator); @@ -1326,31 +1222,30 @@ if (hinst) FreeLibrary (hinst); - mswindows_initialize_dibitmap_image_instance (ii, 1, iitype); + mswindows_initialize_dibitmap_image_instance (ii, iitype); IMAGE_INSTANCE_PIXMAP_FILENAME (ii) = file; - IMAGE_INSTANCE_MSWINDOWS_BITMAP_REAL_WIDTH (ii) = + IMAGE_INSTANCE_PIXMAP_WIDTH (ii) = GetSystemMetrics (type == IMAGE_CURSOR ? SM_CXCURSOR : SM_CXICON); - IMAGE_INSTANCE_MSWINDOWS_BITMAP_REAL_HEIGHT (ii) = + IMAGE_INSTANCE_PIXMAP_HEIGHT (ii) = GetSystemMetrics (type == IMAGE_CURSOR ? SM_CYCURSOR : SM_CYICON); IMAGE_INSTANCE_PIXMAP_DEPTH (ii) = 1; - init_image_instance_geometry (ii); /* hey, we've got an icon type thing so we can reverse engineer the bitmap and mask */ if (type != IMAGE_BITMAP) { - GetIconInfo ((HICON)himage, &iconinfo); + GetIconInfo (himage, &iconinfo); IMAGE_INSTANCE_MSWINDOWS_BITMAP (ii) = iconinfo.hbmColor; IMAGE_INSTANCE_MSWINDOWS_MASK (ii) = iconinfo.hbmMask; XSETINT (IMAGE_INSTANCE_PIXMAP_HOTSPOT_X (ii), iconinfo.xHotspot); XSETINT (IMAGE_INSTANCE_PIXMAP_HOTSPOT_Y (ii), iconinfo.yHotspot); - IMAGE_INSTANCE_MSWINDOWS_ICON (ii) = (HICON) himage; + IMAGE_INSTANCE_MSWINDOWS_ICON (ii) = himage; } else { IMAGE_INSTANCE_MSWINDOWS_ICON (ii) = NULL; - IMAGE_INSTANCE_MSWINDOWS_BITMAP (ii) = (HBITMAP) himage; + IMAGE_INSTANCE_MSWINDOWS_BITMAP (ii) = himage; IMAGE_INSTANCE_MSWINDOWS_MASK (ii) = NULL; XSETINT (IMAGE_INSTANCE_PIXMAP_HOTSPOT_X (ii), 0); XSETINT (IMAGE_INSTANCE_PIXMAP_HOTSPOT_Y (ii), 0); @@ -1376,6 +1271,15 @@ signal_simple_error ("invalid resource identifier", data); } +void +check_valid_string_or_int (Lisp_Object data) +{ + if (!INTP (data)) + CHECK_STRING (data); + else + CHECK_INT (data); +} + /********************************************************************** * XBM * **********************************************************************/ @@ -1420,7 +1324,7 @@ * and return data * * Note that this file and ../X/XRdBitF.c look very similar.... Keep them - * that way (but don't use common source code so that people can have one + * that way (but don't use common source code so that people can have one * without the other). */ @@ -1444,8 +1348,7 @@ * Table index for the hex values. Initialized once, first time. * Used for translation value or delimiter significance lookup. */ -static void -initHexTable (void) +static void initHexTable() { /* * We build the table at run time for several reasons: @@ -1471,21 +1374,20 @@ hexTable[' '] = -1; hexTable[','] = -1; hexTable['}'] = -1; hexTable['\n'] = -1; hexTable['\t'] = -1; - + initialized = TRUE; } /* * read next hex value in the input stream, return -1 if EOF */ -static int -NextInt (FILE *fstream) +static int NextInt ( FILE *fstream ) { int ch; int value = 0; int gotone = 0; int done = 0; - + /* loop, accumulate hex value until find delimiter */ /* skip any initial delimiters found in read stream */ @@ -1514,9 +1416,11 @@ * its arguments won't have been touched. This routine should look as much * like the Xlib routine XReadBitmapfile as possible. */ -int read_bitmap_data (FILE* fstream, unsigned int *width, - unsigned int *height, unsigned char **datap, - int *x_hot, int *y_hot) +int read_bitmap_data (fstream, width, height, datap, x_hot, y_hot) + FILE *fstream; /* handle on file */ + unsigned int *width, *height; /* RETURNED */ + unsigned char **datap; /* RETURNED */ + int *x_hot, *y_hot; /* RETURNED */ { unsigned char *data = NULL; /* working variable */ char line[MAX_SIZE]; /* input line from file */ @@ -1564,7 +1468,7 @@ } continue; } - + if (sscanf(line, "static short %s = {", name_and_type) == 1) version10p = 1; else if (sscanf(line,"static unsigned char %s = {",name_and_type) == 1) @@ -1581,7 +1485,7 @@ if (strcmp("bits[]", type)) continue; - + if (!ww || !hh) RETURN (BitmapFileInvalid); @@ -1594,7 +1498,7 @@ size = bytes_per_line * hh; data = (unsigned char *) Xmalloc ((unsigned int) size); - if (!data) + if (!data) RETURN (BitmapNoMemory); if (version10p) { @@ -1613,7 +1517,7 @@ int bytes; for (bytes=0, ptr=data; bytes<size; bytes++, ptr++) { - if ((value = NextInt(fstream)) < 0) + if ((value = NextInt(fstream)) < 0) RETURN (BitmapFileInvalid); *ptr=value; } @@ -1636,7 +1540,7 @@ } -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) { @@ -1665,7 +1569,7 @@ padded to a multiple of 16. Scan lines are stored in increasing byte order from left to right, big-endian within a byte. 0 = black, 1 = white. */ -static HBITMAP +HBITMAP xbm_create_bitmap_from_data (HDC hdc, char *data, unsigned int width, unsigned int height, int mask, COLORREF fg, COLORREF bg) @@ -1676,21 +1580,21 @@ void *bmp_buf = 0; unsigned char *new_data, *new_offset; int i, j; - BITMAPINFO *bmp_info = - (BITMAPINFO*) xmalloc_and_zero (sizeof(BITMAPINFO) + sizeof(RGBQUAD)); + BITMAPINFO* bmp_info = + xmalloc_and_zero (sizeof(BITMAPINFO) + sizeof(RGBQUAD)); HBITMAP bitmap; if (!bmp_info) return NULL; - + new_data = (unsigned char *) xmalloc_and_zero (height * new_width); - + if (!new_data) { xfree (bmp_info); return NULL; } - + for (i=0; i<height; i++) { offset = data + i*old_width; @@ -1718,11 +1622,11 @@ bmp_info->bmiHeader.biHeight=-(LONG)height; bmp_info->bmiHeader.biPlanes=1; bmp_info->bmiHeader.biSize=sizeof(BITMAPINFOHEADER); - bmp_info->bmiHeader.biBitCount=1; + bmp_info->bmiHeader.biBitCount=1; bmp_info->bmiHeader.biCompression=BI_RGB; - bmp_info->bmiHeader.biClrUsed = 2; - bmp_info->bmiHeader.biClrImportant = 2; - bmp_info->bmiHeader.biSizeImage = height * new_width; + bmp_info->bmiHeader.biClrUsed = 2; + bmp_info->bmiHeader.biClrImportant = 2; + bmp_info->bmiHeader.biSizeImage = height * new_width; bmp_info->bmiColors[0].rgbRed = GetRValue (fg); bmp_info->bmiColors[0].rgbGreen = GetGValue (fg); bmp_info->bmiColors[0].rgbBlue = GetBValue (fg); @@ -1731,21 +1635,21 @@ bmp_info->bmiColors[1].rgbGreen = GetGValue (bg); bmp_info->bmiColors[1].rgbBlue = GetBValue (bg); bmp_info->bmiColors[1].rgbReserved = 0; - - bitmap = CreateDIBSection (hdc, + + bitmap = CreateDIBSection (hdc, bmp_info, DIB_RGB_COLORS, - &bmp_buf, + &bmp_buf, 0,0); xfree (bmp_info); - + if (!bitmap || !bmp_buf) { xfree (new_data); return NULL; } - + /* copy in the actual bitmap */ memcpy (bmp_buf, new_data, height * new_width); xfree (new_data); @@ -1757,10 +1661,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, @@ -1769,16 +1673,17 @@ Lisp_Object mask_filename) { Lisp_Object device = IMAGE_INSTANCE_DEVICE (ii); + struct frame* f = XFRAME (DEVICE_SELECTED_FRAME (XDEVICE (device))); Lisp_Object foreground = find_keyword_in_vector (instantiator, Q_foreground); Lisp_Object background = find_keyword_in_vector (instantiator, Q_background); enum image_instance_type type; COLORREF black = PALETTERGB (0,0,0); COLORREF white = PALETTERGB (255,255,255); - HDC hdc; + + HDC hdc = FRAME_MSWINDOWS_CDC (f); - CHECK_MSGDI_DEVICE (device); - - hdc = get_device_compdc (XDEVICE (device)); + if (!DEVICE_MSWINDOWS_P (XDEVICE (device))) + signal_simple_error ("Not an MS-Windows device", device); if ((dest_mask & IMAGE_MONO_PIXMAP_MASK) && (dest_mask & IMAGE_COLOR_PIXMAP_MASK)) @@ -1799,26 +1704,24 @@ IMAGE_MONO_PIXMAP_MASK | IMAGE_COLOR_PIXMAP_MASK | IMAGE_POINTER_MASK); - mswindows_initialize_dibitmap_image_instance (ii, 1, type); - + mswindows_initialize_dibitmap_image_instance (ii, type); + IMAGE_INSTANCE_PIXMAP_FILENAME (ii) = find_keyword_in_vector (instantiator, Q_file); - IMAGE_INSTANCE_MSWINDOWS_BITMAP_REAL_WIDTH (ii) = width; - IMAGE_INSTANCE_MSWINDOWS_BITMAP_REAL_HEIGHT (ii) = height; + IMAGE_INSTANCE_PIXMAP_WIDTH (ii) = width; + IMAGE_INSTANCE_PIXMAP_HEIGHT (ii) = height; IMAGE_INSTANCE_PIXMAP_DEPTH (ii) = 1; XSETINT (IMAGE_INSTANCE_PIXMAP_HOTSPOT_X (ii), 0); XSETINT (IMAGE_INSTANCE_PIXMAP_HOTSPOT_Y (ii), 0); - init_image_instance_geometry (ii); - IMAGE_INSTANCE_MSWINDOWS_MASK (ii) = mask ? mask : - xbm_create_bitmap_from_data (hdc, (Extbyte *) bits, width, height, + xbm_create_bitmap_from_data (hdc, (Extbyte *) bits, width, height, TRUE, black, white); switch (type) { case IMAGE_MONO_PIXMAP: - IMAGE_INSTANCE_MSWINDOWS_BITMAP (ii) = - xbm_create_bitmap_from_data (hdc, (Extbyte *) bits, width, height, + IMAGE_INSTANCE_MSWINDOWS_BITMAP (ii) = + xbm_create_bitmap_from_data (hdc, (Extbyte *) bits, width, height, FALSE, black, black); break; @@ -1846,8 +1749,8 @@ IMAGE_INSTANCE_PIXMAP_FG (ii) = foreground; IMAGE_INSTANCE_PIXMAP_BG (ii) = background; - IMAGE_INSTANCE_MSWINDOWS_BITMAP (ii) = - xbm_create_bitmap_from_data (hdc, (Extbyte *) bits, width, height, + IMAGE_INSTANCE_MSWINDOWS_BITMAP (ii) = + xbm_create_bitmap_from_data (hdc, (Extbyte *) bits, width, height, FALSE, fg, black); } break; @@ -1862,9 +1765,9 @@ if (NILP (background)) background = pointer_bg; - IMAGE_INSTANCE_PIXMAP_HOTSPOT_X (ii) = + IMAGE_INSTANCE_PIXMAP_HOTSPOT_X (ii) = find_keyword_in_vector (instantiator, Q_hotspot_x); - IMAGE_INSTANCE_PIXMAP_HOTSPOT_Y (ii) = + IMAGE_INSTANCE_PIXMAP_HOTSPOT_Y (ii) = find_keyword_in_vector (instantiator, Q_hotspot_y); IMAGE_INSTANCE_PIXMAP_FG (ii) = foreground; IMAGE_INSTANCE_PIXMAP_BG (ii) = background; @@ -1873,8 +1776,8 @@ if (COLOR_INSTANCEP (background)) bg = COLOR_INSTANCE_MSWINDOWS_COLOR (XCOLOR_INSTANCE (background)); - IMAGE_INSTANCE_MSWINDOWS_BITMAP (ii) = - xbm_create_bitmap_from_data (hdc, (Extbyte *) bits, width, height, + IMAGE_INSTANCE_MSWINDOWS_BITMAP (ii) = + xbm_create_bitmap_from_data (hdc, (Extbyte *) bits, width, height, TRUE, fg, black); mswindows_initialize_image_instance_icon (ii, TRUE); } @@ -1890,28 +1793,29 @@ 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); - HDC hdc = get_device_compdc (XDEVICE (IMAGE_INSTANCE_DEVICE (ii))); + struct Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance); + struct frame* f = XFRAME (DEVICE_SELECTED_FRAME + (XDEVICE (IMAGE_INSTANCE_DEVICE (ii)))); + HDC hdc = FRAME_MSWINDOWS_CDC (f); HBITMAP 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 = xbm_create_bitmap_from_data (hdc, - (unsigned char *) ext_data, - XINT (XCAR (mask_data)), - XINT (XCAR (XCDR (mask_data))), - FALSE, - PALETTERGB (0,0,0), - PALETTERGB (255,255,255)); + GET_C_STRING_BINARY_DATA_ALLOCA (XCAR (XCDR (XCDR (mask_data))), + gcc_may_you_rot_in_hell); + mask = + xbm_create_bitmap_from_data ( hdc, + (unsigned char *) + gcc_may_you_rot_in_hell, + XINT (XCAR (mask_data)), + XINT (XCAR (XCDR (mask_data))), FALSE, + PALETTERGB (0,0,0), + PALETTERGB (255,255,255)); } init_image_instance_from_xbm_inline (ii, width, height, bits, @@ -1922,23 +1826,22 @@ /* Instantiate method for XBM's. */ static void -mswindows_xbm_instantiate (Lisp_Object image_instance, +mswindows_xbm_instantiate (Lisp_Object image_instance, 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); - 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); } #ifdef HAVE_XFACE @@ -1973,14 +1876,12 @@ Lisp_Object data = find_keyword_in_vector (instantiator, Q_data); int i, stattis; char *p, *bits, *bp; - const char * volatile emsg = 0; - const char * volatile dstring; + 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, ':'))) { @@ -2036,7 +1937,7 @@ /************************************************************************/ static void -mswindows_print_image_instance (Lisp_Image_Instance *p, +mswindows_print_image_instance (struct Lisp_Image_Instance *p, Lisp_Object printcharfun, int escapeflag) { @@ -2047,12 +1948,12 @@ case IMAGE_MONO_PIXMAP: case IMAGE_COLOR_PIXMAP: case IMAGE_POINTER: - sprintf (buf, " (0x%lx", + sprintf (buf, " (0x%lx", (unsigned long) IMAGE_INSTANCE_MSWINDOWS_BITMAP (p)); write_c_string (buf, printcharfun); if (IMAGE_INSTANCE_MSWINDOWS_MASK (p)) { - sprintf (buf, "/0x%lx", + sprintf (buf, "/0x%lx", (unsigned long) IMAGE_INSTANCE_MSWINDOWS_MASK (p)); write_c_string (buf, printcharfun); } @@ -2064,49 +1965,24 @@ } } -#ifdef DEBUG_WIDGETS -extern int debug_widget_instances; -#endif - static void -mswindows_finalize_image_instance (Lisp_Image_Instance *p) +mswindows_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))) { - if (image_instance_type_to_mask (IMAGE_INSTANCE_TYPE (p)) - & (IMAGE_WIDGET_MASK | IMAGE_SUBWINDOW_MASK)) + if (IMAGE_INSTANCE_TYPE (p) == IMAGE_WIDGET + || + IMAGE_INSTANCE_TYPE (p) == IMAGE_SUBWINDOW) { -#ifdef DEBUG_WIDGETS - debug_widget_instances--; - stderr_out ("widget destroyed, %d left\n", debug_widget_instances); -#endif if (IMAGE_INSTANCE_SUBWINDOW_ID (p)) - { - DestroyWindow (WIDGET_INSTANCE_MSWINDOWS_HANDLE (p)); - DestroyWindow (IMAGE_INSTANCE_MSWINDOWS_CLIPWINDOW (p)); - IMAGE_INSTANCE_SUBWINDOW_ID (p) = 0; - } + DestroyWindow (WIDGET_INSTANCE_MSWINDOWS_HANDLE (p)); + IMAGE_INSTANCE_SUBWINDOW_ID (p) = 0; } else if (p->data) { - int i; - if (IMAGE_INSTANCE_PIXMAP_TIMEOUT (p)) - disable_glyph_animated_timeout (IMAGE_INSTANCE_PIXMAP_TIMEOUT (p)); - - if (IMAGE_INSTANCE_MSWINDOWS_BITMAP_SLICES (p)) - { - for (i = 0; i < IMAGE_INSTANCE_PIXMAP_MAXSLICE (p); i++) - { - if (IMAGE_INSTANCE_MSWINDOWS_BITMAP_SLICE (p, i)) - DeleteObject (IMAGE_INSTANCE_MSWINDOWS_BITMAP_SLICE (p, i)); - IMAGE_INSTANCE_MSWINDOWS_BITMAP_SLICE (p, i) = 0; - } - xfree (IMAGE_INSTANCE_MSWINDOWS_BITMAP_SLICES (p)); - IMAGE_INSTANCE_MSWINDOWS_BITMAP_SLICES (p) = 0; - } + if (IMAGE_INSTANCE_MSWINDOWS_BITMAP (p)) + DeleteObject (IMAGE_INSTANCE_MSWINDOWS_BITMAP (p)); + IMAGE_INSTANCE_MSWINDOWS_BITMAP (p) = 0; if (IMAGE_INSTANCE_MSWINDOWS_MASK (p)) DeleteObject (IMAGE_INSTANCE_MSWINDOWS_MASK (p)); IMAGE_INSTANCE_MSWINDOWS_MASK (p) = 0; @@ -2127,158 +2003,51 @@ /* subwindow and widget support */ /************************************************************************/ -static HFONT -mswindows_widget_hfont (Lisp_Image_Instance *p, - Lisp_Object domain) -{ - Lisp_Object face = IMAGE_INSTANCE_WIDGET_FACE (p); - int under = FACE_UNDERLINE_P (face, domain); - int strike = FACE_STRIKETHRU_P (face, domain); - Lisp_Object font = query_string_font (IMAGE_INSTANCE_WIDGET_TEXT (p), - face, domain); - - return mswindows_get_hfont (XFONT_INSTANCE (font), under, strike); -} - -static HDWP -begin_defer_window_pos (struct frame *f) -{ - if (FRAME_MSWINDOWS_DATA (f)->hdwp == 0) - FRAME_MSWINDOWS_DATA (f)->hdwp = BeginDeferWindowPos (10); - return FRAME_MSWINDOWS_DATA (f)->hdwp; -} - /* unmap the image if it is a widget. This is used by redisplay via redisplay_unmap_subwindows */ static void -mswindows_unmap_subwindow (Lisp_Image_Instance *p) +mswindows_unmap_subwindow (struct Lisp_Image_Instance *p) { if (IMAGE_INSTANCE_SUBWINDOW_ID (p)) { - struct frame *f = XFRAME (IMAGE_INSTANCE_FRAME (p)); - HDWP hdwp = begin_defer_window_pos (f); - HDWP new_hdwp; - new_hdwp = DeferWindowPos (hdwp, IMAGE_INSTANCE_MSWINDOWS_CLIPWINDOW (p), - NULL, - 0, 0, 0, 0, - SWP_HIDEWINDOW | SWP_NOACTIVATE | - SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER - /* Setting this flag causes the call to - DeferWindowPos to fail with - "Invalid parameter". I don't understand - why we bother to try and set this - anyway. -- ben */ - /* | SWP_NOSENDCHANGING */ - ); - if (!new_hdwp) - mswindows_output_last_error ("unmapping"); - else - hdwp = new_hdwp; - FRAME_MSWINDOWS_DATA (f)->hdwp = hdwp; - if (GetFocus() == WIDGET_INSTANCE_MSWINDOWS_HANDLE (p)) - SetFocus (GetParent (IMAGE_INSTANCE_MSWINDOWS_CLIPWINDOW (p))); + SetWindowPos (WIDGET_INSTANCE_MSWINDOWS_HANDLE (p), + NULL, + 0, 0, 0, 0, + SWP_HIDEWINDOW | SWP_NOMOVE | SWP_NOSIZE + | SWP_NOCOPYBITS | SWP_NOSENDCHANGING); } } /* map the subwindow. This is used by redisplay via redisplay_output_subwindow */ static void -mswindows_map_subwindow (Lisp_Image_Instance *p, int x, int y, - struct display_glyph_area* dga) +mswindows_map_subwindow (struct Lisp_Image_Instance *p, int x, int y) { - struct frame *f = XFRAME (IMAGE_INSTANCE_FRAME (p)); - HDWP hdwp = begin_defer_window_pos (f); - HDWP new_hdwp; - /* move the window before mapping it ... */ - SetWindowPos (IMAGE_INSTANCE_MSWINDOWS_CLIPWINDOW (p), - NULL, - x, y, dga->width, dga->height, - SWP_NOZORDER - | SWP_NOCOPYBITS | SWP_NOSENDCHANGING); - /* ... adjust the child ... */ - SetWindowPos (WIDGET_INSTANCE_MSWINDOWS_HANDLE (p), - NULL, - -dga->xoffset, -dga->yoffset, 0, 0, - SWP_NOZORDER | SWP_NOSIZE + /* ShowWindow (WIDGET_INSTANCE_MSWINDOWS_HANDLE (p), SW_SHOW);*/ + SetWindowPos (WIDGET_INSTANCE_MSWINDOWS_HANDLE (p), + NULL, + x, y, 0, 0, + SWP_NOZORDER | SWP_SHOWWINDOW | SWP_NOSIZE | SWP_NOCOPYBITS | SWP_NOSENDCHANGING); - /* ... now map it - we are not allowed to move it at the same time. */ - new_hdwp = DeferWindowPos (hdwp, IMAGE_INSTANCE_MSWINDOWS_CLIPWINDOW (p), - NULL, - 0, 0, 0, 0, - SWP_NOZORDER | SWP_NOSIZE | SWP_NOMOVE - | SWP_SHOWWINDOW - /* | SWP_NOCOPYBITS */ - /* Setting this flag causes the call to - DeferWindowPos to fail with - "Invalid parameter". I don't understand - why we bother to try and set this - anyway. -- ben */ - /* | SWP_NOSENDCHANGING */ - | SWP_NOACTIVATE); - if (!new_hdwp) - mswindows_output_last_error ("mapping"); - else - hdwp = new_hdwp; - FRAME_MSWINDOWS_DATA (f)->hdwp = hdwp; -} - -/* resize the subwindow instance */ -static void -mswindows_resize_subwindow (Lisp_Image_Instance* ii, int w, int h) -{ - /* Set the size of the control .... */ - if (!SetWindowPos (WIDGET_INSTANCE_MSWINDOWS_HANDLE (ii), - NULL, - 0, 0, w, h, - SWP_NOZORDER | SWP_NOMOVE - | SWP_NOCOPYBITS | SWP_NOSENDCHANGING)) - mswindows_output_last_error ("resizing"); -} - -/* Simply resize the window here. */ -static void -mswindows_update_subwindow (Lisp_Image_Instance *p) -{ - mswindows_resize_subwindow (p, - IMAGE_INSTANCE_WIDTH (p), - IMAGE_INSTANCE_HEIGHT (p)); } /* when you click on a widget you may activate another widget this needs to be checked and all appropriate widgets updated */ static void -mswindows_update_widget (Lisp_Image_Instance *p) +mswindows_update_subwindow (struct Lisp_Image_Instance *p) { - /* Possibly update the face font and colors. */ - if (!NILP (IMAGE_INSTANCE_WIDGET_TEXT (p)) - && (IMAGE_INSTANCE_WIDGET_FACE_CHANGED (p) - || XFRAME (IMAGE_INSTANCE_FRAME (p))->faces_changed - || IMAGE_INSTANCE_WIDGET_ITEMS_CHANGED (p))) + if (IMAGE_INSTANCE_TYPE (p) == IMAGE_WIDGET) { - /* set the widget font from the widget face */ - SendMessage (WIDGET_INSTANCE_MSWINDOWS_HANDLE (p), - WM_SETFONT, - (WPARAM) mswindows_widget_hfont - (p, IMAGE_INSTANCE_FRAME (p)), - MAKELPARAM (TRUE, 0)); - } - /* Possibly update the dimensions. */ - if (IMAGE_INSTANCE_SIZE_CHANGED (p)) - { - mswindows_resize_subwindow (p, - IMAGE_INSTANCE_WIDTH (p), - IMAGE_INSTANCE_HEIGHT (p)); - } - /* Possibly update the text in the widget. */ - if (IMAGE_INSTANCE_TEXT_CHANGED (p) - && !NILP (IMAGE_INSTANCE_WIDGET_TEXT (p))) - { - Extbyte* lparam=0; - TO_EXTERNAL_FORMAT (LISP_STRING, IMAGE_INSTANCE_WIDGET_TEXT (p), - C_STRING_ALLOCA, lparam, - Qnative); - SendMessage (WIDGET_INSTANCE_MSWINDOWS_HANDLE (p), - WM_SETTEXT, 0, (LPARAM)lparam); + /* buttons checked or otherwise */ + if ( EQ (IMAGE_INSTANCE_WIDGET_TYPE (p), Qbutton)) + { + if (gui_item_selected_p (&IMAGE_INSTANCE_WIDGET_ITEM (p))) + SendMessage (WIDGET_INSTANCE_MSWINDOWS_HANDLE (p), + BM_SETCHECK, (WPARAM)BST_CHECKED, 0); + else + SendMessage (WIDGET_INSTANCE_MSWINDOWS_HANDLE (p), + BM_SETCHECK, (WPARAM)BST_UNCHECKED, 0); + } } } @@ -2286,29 +2055,17 @@ callbacks. The hashtable is weak so deregistration is handled automatically */ static int -mswindows_register_gui_item (Lisp_Object image_instance, - Lisp_Object gui, Lisp_Object domain) -{ - Lisp_Object frame = DOMAIN_FRAME (domain); - struct frame* f = XFRAME (frame); - int id = gui_item_id_hash (FRAME_MSWINDOWS_WIDGET_HASH_TABLE2 (f), - gui, - WIDGET_GLYPH_SLOT); - Fputhash (make_int (id), image_instance, - FRAME_MSWINDOWS_WIDGET_HASH_TABLE1 (f)); - Fputhash (make_int (id), XGUI_ITEM (gui)->callback, - FRAME_MSWINDOWS_WIDGET_HASH_TABLE2 (f)); - Fputhash (make_int (id), XGUI_ITEM (gui)->callback_ex, - FRAME_MSWINDOWS_WIDGET_HASH_TABLE3 (f)); - return id; -} - -static int mswindows_register_widget_instance (Lisp_Object instance, Lisp_Object domain) { - return mswindows_register_gui_item (instance, - XIMAGE_INSTANCE_WIDGET_ITEM (instance), - domain); + Lisp_Object frame = FW_FRAME (domain); + struct frame* f = XFRAME (frame); + int id = gui_item_hash (FRAME_MSWINDOWS_WIDGET_HASH_TABLE (f), + &XIMAGE_INSTANCE_WIDGET_ITEM (instance), + WIDGET_GLYPH_SLOT); + Fputhash (make_int (id), + XIMAGE_INSTANCE_WIDGET_CALLBACK (instance), + FRAME_MSWINDOWS_WIDGET_HASH_TABLE (f)); + return id; } static void @@ -2316,49 +2073,31 @@ Lisp_Object pointer_fg, Lisp_Object pointer_bg, int dest_mask, Lisp_Object domain) { - 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); + struct device* d = XDEVICE (device); + Lisp_Object frame = FW_FRAME (domain); HWND wnd; - CHECK_MSWINDOWS_DEVICE (device); + if (!DEVICE_MSWINDOWS_P (d)) + signal_simple_error ("Not an mswindows device", device); /* have to set the type this late in case there is no device instantiation for a widget */ IMAGE_INSTANCE_TYPE (ii) = IMAGE_SUBWINDOW; - /* Allocate space for the clip window */ - ii->data = xnew_and_zero (struct mswindows_subwindow_data); - if ((IMAGE_INSTANCE_MSWINDOWS_CLIPWINDOW (ii) - = CreateWindowEx( - 0, /* EX flags */ - XEMACS_CONTROL_CLASS, - 0, /* text */ - WS_CLIPCHILDREN | WS_CLIPSIBLINGS | WS_CHILD, - 0, /* starting x position */ - 0, /* starting y position */ - IMAGE_INSTANCE_WIDGET_WIDTH (ii), - IMAGE_INSTANCE_WIDGET_HEIGHT (ii), - /* parent window */ - FRAME_MSWINDOWS_HANDLE (XFRAME (frame)), - NULL, /* No menu */ - NULL, /* must be null for this class */ - NULL)) == NULL) - signal_simple_error ("window creation failed with code", - make_int (GetLastError())); - - wnd = CreateWindow( "STATIC", + wnd = CreateWindow( "STATIC", "", - WS_CHILD, + WS_CHILD, 0, /* starting x position */ 0, /* starting y position */ IMAGE_INSTANCE_WIDGET_WIDTH (ii), IMAGE_INSTANCE_WIDGET_HEIGHT (ii), - IMAGE_INSTANCE_MSWINDOWS_CLIPWINDOW (ii), + FRAME_MSWINDOWS_HANDLE (XFRAME (frame)), /* parent window */ 0, - (HINSTANCE) + (HINSTANCE) GetWindowLong (FRAME_MSWINDOWS_HANDLE (XFRAME (frame)), - GWL_HINSTANCE), + GWL_HINSTANCE), NULL); SetWindowLong (wnd, GWL_USERDATA, (LONG)LISP_TO_VOID(image_instance)); @@ -2366,19 +2105,19 @@ } static int -mswindows_image_instance_equal (Lisp_Image_Instance *p1, - Lisp_Image_Instance *p2, int depth) +mswindows_image_instance_equal (struct Lisp_Image_Instance *p1, + struct Lisp_Image_Instance *p2, int depth) { switch (IMAGE_INSTANCE_TYPE (p1)) { case IMAGE_MONO_PIXMAP: case IMAGE_COLOR_PIXMAP: case IMAGE_POINTER: - if (IMAGE_INSTANCE_MSWINDOWS_BITMAP (p1) + if (IMAGE_INSTANCE_MSWINDOWS_BITMAP (p1) != IMAGE_INSTANCE_MSWINDOWS_BITMAP (p2)) return 0; break; - + default: break; } @@ -2387,7 +2126,7 @@ } static unsigned long -mswindows_image_instance_hash (Lisp_Image_Instance *p, int depth) +mswindows_image_instance_hash (struct Lisp_Image_Instance *p, int depth) { switch (IMAGE_INSTANCE_TYPE (p)) { @@ -2395,7 +2134,7 @@ case IMAGE_COLOR_PIXMAP: case IMAGE_POINTER: return (unsigned long) IMAGE_INSTANCE_MSWINDOWS_BITMAP (p); - + default: return 0; } @@ -2408,8 +2147,7 @@ methods are called. */ static void -mswindows_initialize_dibitmap_image_instance (Lisp_Image_Instance *ii, - int slices, +mswindows_initialize_dibitmap_image_instance (struct Lisp_Image_Instance *ii, enum image_instance_type type) { ii->data = xnew_and_zero (struct mswindows_image_instance_data); @@ -2420,126 +2158,93 @@ IMAGE_INSTANCE_PIXMAP_HOTSPOT_Y (ii) = Qnil; IMAGE_INSTANCE_PIXMAP_FG (ii) = Qnil; IMAGE_INSTANCE_PIXMAP_BG (ii) = Qnil; - IMAGE_INSTANCE_PIXMAP_MAXSLICE (ii) = slices; - IMAGE_INSTANCE_MSWINDOWS_BITMAP_SLICES (ii) = - xnew_array_and_zero (HBITMAP, slices); } -#ifdef HAVE_WIDGETS - /************************************************************************/ /* widgets */ /************************************************************************/ + static void mswindows_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* class, int flags, int exflags) + CONST char* class, int flags, int exflags) { - /* this function can call lisp */ - Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance); + struct Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance); +#if 0 + struct Lisp_Image_Instance *groupii = 0; + Lisp_Object group = find_keyword_in_vector (instantiator, Q_group); +#endif Lisp_Object device = IMAGE_INSTANCE_DEVICE (ii), style; - Lisp_Object frame = DOMAIN_FRAME (domain); + struct device* d = XDEVICE (device); + Lisp_Object frame = FW_FRAME (domain); Extbyte* nm=0; HWND wnd; int id = 0xffff; - Lisp_Object gui = IMAGE_INSTANCE_WIDGET_ITEM (ii); - Lisp_Gui_Item* pgui = XGUI_ITEM (gui); + struct gui_item* pgui = &IMAGE_INSTANCE_WIDGET_ITEM (ii); - CHECK_MSWINDOWS_DEVICE (device); - - if (!gui_item_active_p (gui)) + if (!DEVICE_MSWINDOWS_P (d)) + signal_simple_error ("Not an mswindows device", device); +#if 0 + /* if the user specified another glyph as a group pick up the + instance in our domain. */ + if (!NILP (group)) + { + if (SYMBOLP (group)) + group = XSYMBOL (group)->value; + group = glyph_image_instance (group, domain, ERROR_ME, 1); + groupii = XIMAGE_INSTANCE (group); + } +#endif + if (!gui_item_active_p (pgui)) flags |= WS_DISABLED; style = pgui->style; - if (!NILP (pgui->callback) || !NILP (pgui->callback_ex)) + if (!NILP (pgui->callback)) { id = mswindows_register_widget_instance (image_instance, domain); } - + /* have to set the type this late in case there is no device + instantiation for a widget */ + 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); - - /* allocate space for the clip window and then allocate the clip window */ - ii->data = xnew_and_zero (struct mswindows_subwindow_data); + GET_C_STRING_OS_DATA_ALLOCA (IMAGE_INSTANCE_WIDGET_TEXT (ii), nm); - if ((IMAGE_INSTANCE_MSWINDOWS_CLIPWINDOW (ii) - = CreateWindowEx( - WS_EX_CONTROLPARENT, /* EX flags */ - XEMACS_CONTROL_CLASS, - 0, /* text */ - WS_CLIPCHILDREN | WS_CLIPSIBLINGS | WS_CHILD, - 0, /* starting x position */ - 0, /* starting y position */ - IMAGE_INSTANCE_WIDGET_WIDTH (ii), - IMAGE_INSTANCE_WIDGET_HEIGHT (ii), - /* parent window */ - DOMAIN_MSWINDOWS_HANDLE (domain), - (HMENU)id, /* No menu */ - NULL, /* must be null for this class */ - NULL)) == NULL) - signal_simple_error ("window creation failed with code", - make_int (GetLastError())); - - if ((wnd = CreateWindowEx( - exflags /* | WS_EX_NOPARENTNOTIFY*/, - class, - nm, - flags | WS_CHILD | WS_VISIBLE, - 0, /* starting x position */ - 0, /* starting y position */ - IMAGE_INSTANCE_WIDGET_WIDTH (ii), - IMAGE_INSTANCE_WIDGET_HEIGHT (ii), - /* parent window */ - IMAGE_INSTANCE_MSWINDOWS_CLIPWINDOW (ii), - (HMENU)id, /* No menu */ - (HINSTANCE) - GetWindowLong - (FRAME_MSWINDOWS_HANDLE (XFRAME (frame)), - GWL_HINSTANCE), - NULL)) == NULL) - signal_simple_error ("window creation failed with code", - make_int (GetLastError())); + wnd = CreateWindowEx( + exflags /* | WS_EX_NOPARENTNOTIFY*/, + class, + nm, + flags | WS_CHILD, + 0, /* starting x position */ + 0, /* starting y position */ + IMAGE_INSTANCE_WIDGET_WIDTH (ii), + IMAGE_INSTANCE_WIDGET_HEIGHT (ii), + /* parent window */ + FRAME_MSWINDOWS_HANDLE (XFRAME (frame)), + (HMENU)id, /* No menu */ + (HINSTANCE) + GetWindowLong (FRAME_MSWINDOWS_HANDLE (XFRAME (frame)), + GWL_HINSTANCE), + NULL); IMAGE_INSTANCE_SUBWINDOW_ID (ii) = wnd; SetWindowLong (wnd, GWL_USERDATA, (LONG)LISP_TO_VOID(image_instance)); /* set the widget font from the widget face */ - if (!NILP (IMAGE_INSTANCE_WIDGET_TEXT (ii))) - SendMessage (wnd, WM_SETFONT, - (WPARAM) mswindows_widget_hfont (ii, domain), - MAKELPARAM (TRUE, 0)); -} - -/* Instantiate a native layout widget. */ -static void -mswindows_native_layout_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); - - mswindows_widget_instantiate (image_instance, instantiator, pointer_fg, - pointer_bg, dest_mask, domain, "STATIC", - /* Approximation to styles available with - an XEmacs layout. */ - EQ (IMAGE_INSTANCE_LAYOUT_BORDER (ii), - Qetched_in) || - EQ (IMAGE_INSTANCE_LAYOUT_BORDER (ii), - Qetched_out) || - GLYPHP (IMAGE_INSTANCE_LAYOUT_BORDER (ii)) - ? SS_ETCHEDFRAME : SS_SUNKEN, - 0); + SendMessage (wnd, WM_SETFONT, + (WPARAM)FONT_INSTANCE_MSWINDOWS_HFONT + (XFONT_INSTANCE (widget_face_font_info + (domain, + IMAGE_INSTANCE_WIDGET_FACE (ii), + 0, 0))), + MAKELPARAM (TRUE, 0)); } /* 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 image instances can have a + 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 @@ -2547,31 +2252,28 @@ Lisp_Object pointer_fg, Lisp_Object pointer_bg, int dest_mask, Lisp_Object domain) { - /* This function can call lisp */ - Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance); + struct Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance); HWND wnd; - int flags = WS_TABSTOP;/* BS_NOTIFY #### is needed to get exotic feedback - only. Since we seem to want nothing beyond BN_CLICK, - the style is perhaps not necessary -- kkm */ + int flags = BS_NOTIFY; Lisp_Object style; - Lisp_Object gui = IMAGE_INSTANCE_WIDGET_ITEM (ii); - Lisp_Gui_Item* pgui = XGUI_ITEM (gui); + struct gui_item* pgui = &IMAGE_INSTANCE_WIDGET_ITEM (ii); Lisp_Object glyph = find_keyword_in_vector (instantiator, Q_image); + if (!gui_item_active_p (pgui)) + flags |= WS_DISABLED; + if (!NILP (glyph)) { if (!IMAGE_INSTANCEP (glyph)) glyph = glyph_image_instance (glyph, domain, ERROR_ME, 1); if (IMAGE_INSTANCEP (glyph)) - flags |= XIMAGE_INSTANCE_MSWINDOWS_BITMAP (glyph) ? + flags |= XIMAGE_INSTANCE_MSWINDOWS_BITMAP (glyph) ? BS_BITMAP : BS_ICON; } style = pgui->style; - /* #### consider using the default face for radio and toggle - buttons. */ if (EQ (style, Qradio)) { flags |= BS_RADIOBUTTON; @@ -2581,282 +2283,75 @@ flags |= BS_AUTOCHECKBOX; } else - { - flags |= BS_DEFPUSHBUTTON; - } + flags |= BS_DEFPUSHBUTTON; mswindows_widget_instantiate (image_instance, instantiator, pointer_fg, - pointer_bg, dest_mask, domain, "BUTTON", - flags, 0); + pointer_bg, dest_mask, domain, "BUTTON", flags, + WS_EX_CONTROLPARENT); wnd = WIDGET_INSTANCE_MSWINDOWS_HANDLE (ii); /* set the checked state */ - if (gui_item_selected_p (gui)) - SendMessage (wnd, BM_SETCHECK, (WPARAM)BST_CHECKED, 0); + if (gui_item_selected_p (pgui)) + SendMessage (wnd, BM_SETCHECK, (WPARAM)BST_CHECKED, 0); else SendMessage (wnd, BM_SETCHECK, (WPARAM)BST_UNCHECKED, 0); /* add the image if one was given */ - if (!NILP (glyph) && IMAGE_INSTANCEP (glyph) - && - IMAGE_INSTANCE_PIXMAP_TYPE_P (XIMAGE_INSTANCE (glyph))) + if (!NILP (glyph) && IMAGE_INSTANCEP (glyph)) { - SendMessage (wnd, BM_SETIMAGE, - (WPARAM) (XIMAGE_INSTANCE_MSWINDOWS_BITMAP (glyph) ? + SendMessage (wnd, BM_SETIMAGE, + (WPARAM) (XIMAGE_INSTANCE_MSWINDOWS_BITMAP (glyph) ? IMAGE_BITMAP : IMAGE_ICON), - (XIMAGE_INSTANCE_MSWINDOWS_BITMAP (glyph) ? - (LPARAM) XIMAGE_INSTANCE_MSWINDOWS_BITMAP (glyph) : - (LPARAM) XIMAGE_INSTANCE_MSWINDOWS_ICON (glyph))); + (LPARAM) (XIMAGE_INSTANCE_MSWINDOWS_BITMAP (glyph) ? + XIMAGE_INSTANCE_MSWINDOWS_BITMAP (glyph) : + XIMAGE_INSTANCE_MSWINDOWS_ICON (glyph))); } } -/* Update the state of a button. */ -static void -mswindows_button_update (Lisp_Object image_instance) -{ - /* This function can GC if IN_REDISPLAY is false. */ - Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance); - - /* buttons checked or otherwise */ - if (gui_item_selected_p (IMAGE_INSTANCE_WIDGET_ITEM (ii))) - SendMessage (WIDGET_INSTANCE_MSWINDOWS_HANDLE (ii), - BM_SETCHECK, (WPARAM)BST_CHECKED, 0); - else - SendMessage (WIDGET_INSTANCE_MSWINDOWS_HANDLE (ii), - BM_SETCHECK, (WPARAM)BST_UNCHECKED, 0); -} - /* instantiate an edit control */ static void -mswindows_edit_field_instantiate (Lisp_Object image_instance, Lisp_Object instantiator, +mswindows_edit_instantiate (Lisp_Object image_instance, Lisp_Object instantiator, Lisp_Object pointer_fg, Lisp_Object pointer_bg, int dest_mask, Lisp_Object domain) { mswindows_widget_instantiate (image_instance, instantiator, pointer_fg, - pointer_bg, dest_mask, domain, "EDIT", + pointer_bg, dest_mask, domain, "EDIT", ES_LEFT | ES_AUTOHSCROLL | WS_TABSTOP - | WS_BORDER, WS_EX_CLIENTEDGE); + | WS_BORDER, + WS_EX_CLIENTEDGE | WS_EX_CONTROLPARENT); } -/* instantiate a progress gauge */ +/* instantiate an edit control */ static void -mswindows_progress_gauge_instantiate (Lisp_Object image_instance, Lisp_Object instantiator, +mswindows_progress_instantiate (Lisp_Object image_instance, Lisp_Object instantiator, Lisp_Object pointer_fg, Lisp_Object pointer_bg, int dest_mask, Lisp_Object domain) { HWND wnd; - Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance); + struct Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance); mswindows_widget_instantiate (image_instance, instantiator, pointer_fg, - pointer_bg, dest_mask, domain, PROGRESS_CLASS, - WS_BORDER | PBS_SMOOTH, WS_EX_CLIENTEDGE); + pointer_bg, dest_mask, domain, PROGRESS_CLASS, + WS_TABSTOP | WS_BORDER | PBS_SMOOTH, + WS_EX_CLIENTEDGE | WS_EX_CONTROLPARENT); wnd = WIDGET_INSTANCE_MSWINDOWS_HANDLE (ii); /* set the colors */ #ifdef PBS_SETBKCOLOR - SendMessage (wnd, PBS_SETBKCOLOR, 0, - (LPARAM) (COLOR_INSTANCE_MSWINDOWS_COLOR - (XCOLOR_INSTANCE - (FACE_BACKGROUND + SendMessage (wnd, PBS_SETBKCOLOR, 0, + (LPARAM) (COLOR_INSTANCE_MSWINDOWS_COLOR + (XCOLOR_INSTANCE + (FACE_BACKGROUND (XIMAGE_INSTANCE_WIDGET_FACE (ii), - XIMAGE_INSTANCE_FRAME (ii)))))); + XIMAGE_INSTANCE_SUBWINDOW_FRAME (ii)))))); #endif #ifdef PBS_SETBARCOLOR - SendMessage (wnd, PBS_SETBARCOLOR, 0, - (L:PARAM) (COLOR_INSTANCE_MSWINDOWS_COLOR - (XCOLOR_INSTANCE - (FACE_FOREGROUND + SendMessage (wnd, PBS_SETBARCOLOR, 0, + (L:PARAM) (COLOR_INSTANCE_MSWINDOWS_COLOR + (XCOLOR_INSTANCE + (FACE_FOREGROUND (XIMAGE_INSTANCE_WIDGET_FACE (ii), - XIMAGE_INSTANCE_FRAME (ii)))))); + XIMAGE_INSTANCE_SUBWINDOW_FRAME (ii)))))); #endif } -/* instantiate a tree view widget */ -static HTREEITEM add_tree_item (Lisp_Object image_instance, - HWND wnd, HTREEITEM parent, Lisp_Object item, - int children, Lisp_Object domain) -{ - TV_INSERTSTRUCT tvitem; - HTREEITEM ret; - - tvitem.hParent = parent; - tvitem.hInsertAfter = TVI_LAST; - tvitem.item.mask = TVIF_TEXT | TVIF_CHILDREN; - tvitem.item.cChildren = children; - - if (GUI_ITEMP (item)) - { - tvitem.item.lParam = mswindows_register_gui_item (image_instance, - item, domain); - tvitem.item.mask |= TVIF_PARAM; - TO_EXTERNAL_FORMAT (LISP_STRING, XGUI_ITEM (item)->name, - C_STRING_ALLOCA, tvitem.item.pszText, - Qnative); - } - else - TO_EXTERNAL_FORMAT (LISP_STRING, item, - C_STRING_ALLOCA, tvitem.item.pszText, - Qnative); - - tvitem.item.cchTextMax = strlen (tvitem.item.pszText); - - if ((ret = (HTREEITEM)SendMessage (wnd, TVM_INSERTITEM, - 0, (LPARAM)&tvitem)) == 0) - signal_simple_error ("error adding tree view entry", item); - - return ret; -} - -static void add_tree_item_list (Lisp_Object image_instance, - HWND wnd, HTREEITEM parent, Lisp_Object list, - Lisp_Object domain) -{ - Lisp_Object rest; - - /* get the first item */ - parent = add_tree_item (image_instance, wnd, parent, XCAR (list), TRUE, domain); - /* recursively add items to the tree view */ - LIST_LOOP (rest, XCDR (list)) - { - if (LISTP (XCAR (rest))) - add_tree_item_list (image_instance, wnd, parent, XCAR (rest), domain); - else - add_tree_item (image_instance, wnd, parent, XCAR (rest), FALSE, domain); - } -} - -static void -mswindows_tree_view_instantiate (Lisp_Object image_instance, Lisp_Object instantiator, - Lisp_Object pointer_fg, Lisp_Object pointer_bg, - int dest_mask, Lisp_Object domain) -{ - Lisp_Object rest; - HWND wnd; - HTREEITEM parent; - Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance); - mswindows_widget_instantiate (image_instance, instantiator, pointer_fg, - pointer_bg, dest_mask, domain, WC_TREEVIEW, - WS_TABSTOP | WS_BORDER | PBS_SMOOTH - | TVS_HASLINES | TVS_HASBUTTONS, - WS_EX_CLIENTEDGE); - - wnd = WIDGET_INSTANCE_MSWINDOWS_HANDLE (ii); - - /* define a root */ - parent = add_tree_item (image_instance, wnd, NULL, - XCAR (IMAGE_INSTANCE_WIDGET_ITEMS (ii)), - TRUE, domain); - - /* recursively add items to the tree view */ - /* add items to the tab */ - LIST_LOOP (rest, XCDR (IMAGE_INSTANCE_WIDGET_ITEMS (ii))) - { - if (LISTP (XCAR (rest))) - add_tree_item_list (image_instance, wnd, parent, XCAR (rest), domain); - else - add_tree_item (image_instance, wnd, parent, XCAR (rest), FALSE, domain); - } -} - -/* instantiate a tab control */ -static TC_ITEM* add_tab_item (Lisp_Object image_instance, - HWND wnd, Lisp_Object item, - Lisp_Object domain, int i) -{ - TC_ITEM tvitem, *ret; - - tvitem.mask = TCIF_TEXT; - - if (GUI_ITEMP (item)) - { - tvitem.lParam = mswindows_register_gui_item (image_instance, - item, domain); - tvitem.mask |= TCIF_PARAM; - TO_EXTERNAL_FORMAT (LISP_STRING, XGUI_ITEM (item)->name, - C_STRING_ALLOCA, tvitem.pszText, - Qnative); - } - else - { - CHECK_STRING (item); - TO_EXTERNAL_FORMAT (LISP_STRING, item, - C_STRING_ALLOCA, tvitem.pszText, - Qnative); - } - - tvitem.cchTextMax = strlen (tvitem.pszText); - - if ((ret = (TC_ITEM*)SendMessage (wnd, TCM_INSERTITEM, - i, (LPARAM)&tvitem)) < 0) - signal_simple_error ("error adding tab entry", item); - - return ret; -} - -static void -mswindows_tab_control_instantiate (Lisp_Object image_instance, Lisp_Object instantiator, - Lisp_Object pointer_fg, Lisp_Object pointer_bg, - int dest_mask, Lisp_Object domain) -{ - /* This function can call lisp */ - Lisp_Object rest; - HWND wnd; - int i = 0, selected = 0; - Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance); - Lisp_Object orient = find_keyword_in_vector (instantiator, Q_orientation); - unsigned int flags = WS_TABSTOP; - - if (EQ (orient, Qleft) || EQ (orient, Qright)) - { - flags |= TCS_VERTICAL | TCS_MULTILINE; - } - if (EQ (orient, Qright) || EQ (orient, Qbottom)) - { - flags |= TCS_BOTTOM; - } - - mswindows_widget_instantiate (image_instance, instantiator, pointer_fg, - pointer_bg, dest_mask, domain, WC_TABCONTROL, - /* borders don't suit tabs so well */ - flags, 0); - wnd = WIDGET_INSTANCE_MSWINDOWS_HANDLE (ii); - /* add items to the tab */ - LIST_LOOP (rest, XCDR (IMAGE_INSTANCE_WIDGET_ITEMS (ii))) - { - add_tab_item (image_instance, wnd, XCAR (rest), domain, i); - if (gui_item_selected_p (XCAR (rest))) - selected = i; - i++; - } - SendMessage (wnd, TCM_SETCURSEL, selected, 0); -} - -/* set the properties of a tab control */ -static void -mswindows_tab_control_update (Lisp_Object image_instance) -{ - /* This function can GC if IN_REDISPLAY is false. */ - Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance); - - if (IMAGE_INSTANCE_WIDGET_ITEMS_CHANGED (ii)) - { - HWND wnd = WIDGET_INSTANCE_MSWINDOWS_HANDLE (ii); - int i = 0, selected = 0; - Lisp_Object rest; - - /* delete the pre-existing items */ - SendMessage (wnd, TCM_DELETEALLITEMS, 0, 0); - - /* add items to the tab */ - LIST_LOOP (rest, XCDR (IMAGE_INSTANCE_WIDGET_PENDING_ITEMS (ii))) - { - add_tab_item (image_instance, wnd, XCAR (rest), - IMAGE_INSTANCE_FRAME (ii), i); - if (gui_item_selected_p (XCAR (rest))) - selected = i; - i++; - } - SendMessage (wnd, TCM_SETCURSEL, selected, 0); - } -} - /* instantiate a static control possible for putting other things in */ static void mswindows_label_instantiate (Lisp_Object image_instance, Lisp_Object instantiator, @@ -2864,10 +2359,24 @@ int dest_mask, Lisp_Object domain) { mswindows_widget_instantiate (image_instance, instantiator, pointer_fg, - pointer_bg, dest_mask, domain, "STATIC", + pointer_bg, dest_mask, domain, "STATIC", 0, WS_EX_STATICEDGE); } +#if 0 +/* instantiate a static control possible for putting other things in */ +static void +mswindows_group_instantiate (Lisp_Object image_instance, Lisp_Object instantiator, + Lisp_Object pointer_fg, Lisp_Object pointer_bg, + int dest_mask, Lisp_Object domain) +{ + mswindows_widget_instantiate (image_instance, instantiator, pointer_fg, + pointer_bg, dest_mask, domain, "BUTTON", + WS_GROUP | BS_GROUPBOX | WS_BORDER, + WS_EX_CLIENTEDGE ); +} +#endif + /* instantiate a scrollbar control */ static void mswindows_scrollbar_instantiate (Lisp_Object image_instance, Lisp_Object instantiator, @@ -2875,22 +2384,20 @@ int dest_mask, Lisp_Object domain) { mswindows_widget_instantiate (image_instance, instantiator, pointer_fg, - pointer_bg, dest_mask, domain, "SCROLLBAR", - WS_TABSTOP, WS_EX_CLIENTEDGE); + pointer_bg, dest_mask, domain, "SCROLLBAR", + 0, + WS_EX_CLIENTEDGE ); } /* instantiate a combo control */ static void -mswindows_combo_box_instantiate (Lisp_Object image_instance, Lisp_Object instantiator, +mswindows_combo_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); - HWND wnd; + struct Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance); + HANDLE wnd; Lisp_Object rest; - Lisp_Object data = Fplist_get (find_keyword_in_vector (instantiator, Q_properties), - Q_items, Qnil); - int len, height; /* Maybe ought to generalise this more but it may be very windows specific. In windows the window height of a combo box is the @@ -2898,38 +2405,23 @@ before creating the window and then reset it to a single line after the window is created so that redisplay does the right thing. */ - widget_instantiate (image_instance, instantiator, pointer_fg, - pointer_bg, dest_mask, domain); - - /* We now have everything right apart from the height. */ - default_face_font_info (domain, 0, 0, &height, 0, 0); - GET_LIST_LENGTH (data, len); - - height = (height + WIDGET_BORDER_HEIGHT * 2 ) * len; - IMAGE_INSTANCE_HEIGHT (ii) = height; - - /* Now create the widget. */ mswindows_widget_instantiate (image_instance, instantiator, pointer_fg, - pointer_bg, dest_mask, domain, "COMBOBOX", + pointer_bg, dest_mask, domain, "COMBOBOX", WS_BORDER | WS_TABSTOP | CBS_DROPDOWN - | CBS_AUTOHSCROLL + | CBS_AUTOHSCROLL | CBS_HASSTRINGS | WS_VSCROLL, - WS_EX_CLIENTEDGE); - /* Reset the height. layout will probably do this safely, but better make sure. */ - image_instance_layout (image_instance, - IMAGE_UNSPECIFIED_GEOMETRY, - IMAGE_UNSPECIFIED_GEOMETRY, - domain); - + WS_EX_CLIENTEDGE | WS_EX_CONTROLPARENT); + /* reset the height */ + widget_text_to_pixel_conversion (domain, + IMAGE_INSTANCE_WIDGET_FACE (ii), 1, 0, + &IMAGE_INSTANCE_SUBWINDOW_HEIGHT (ii), 0); wnd = WIDGET_INSTANCE_MSWINDOWS_HANDLE (ii); /* add items to the combo box */ SendMessage (wnd, CB_RESETCONTENT, 0, 0); LIST_LOOP (rest, Fplist_get (IMAGE_INSTANCE_WIDGET_PROPS (ii), Q_items, Qnil)) { Extbyte* lparam; - TO_EXTERNAL_FORMAT (LISP_STRING, XCAR (rest), - C_STRING_ALLOCA, lparam, - Qnative); + GET_C_STRING_OS_DATA_ALLOCA (XCAR (rest), lparam); if (SendMessage (wnd, CB_ADDSTRING, 0, (LPARAM)lparam) == CB_ERR) signal_simple_error ("error adding combo entries", instantiator); } @@ -2939,16 +2431,16 @@ static Lisp_Object mswindows_widget_property (Lisp_Object image_instance, Lisp_Object prop) { - Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance); - HWND wnd = WIDGET_INSTANCE_MSWINDOWS_HANDLE (ii); + struct Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance); + HANDLE wnd = WIDGET_INSTANCE_MSWINDOWS_HANDLE (ii); /* get the text from a control */ if (EQ (prop, Q_text)) { Extcount len = SendMessage (wnd, WM_GETTEXTLENGTH, 0, 0); - Extbyte *buf = (Extbyte*) alloca (len+1); - + Extbyte* buf =alloca (len+1); + SendMessage (wnd, WM_GETTEXT, (WPARAM)len+1, (LPARAM) buf); - return build_ext_string (buf, Qnative); + return build_ext_string (buf, FORMAT_OS); } return Qunbound; } @@ -2957,8 +2449,8 @@ static Lisp_Object mswindows_button_property (Lisp_Object image_instance, Lisp_Object prop) { - Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance); - HWND wnd = WIDGET_INSTANCE_MSWINDOWS_HANDLE (ii); + struct Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance); + HANDLE wnd = WIDGET_INSTANCE_MSWINDOWS_HANDLE (ii); /* check the state of a button */ if (EQ (prop, Q_selected)) { @@ -2972,68 +2464,58 @@ /* get properties of a combo box */ static Lisp_Object -mswindows_combo_box_property (Lisp_Object image_instance, Lisp_Object prop) +mswindows_combo_property (Lisp_Object image_instance, Lisp_Object prop) { - Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance); - HWND wnd = WIDGET_INSTANCE_MSWINDOWS_HANDLE (ii); + struct Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance); + HANDLE wnd = WIDGET_INSTANCE_MSWINDOWS_HANDLE (ii); /* get the text from a control */ if (EQ (prop, Q_text)) { long item = SendMessage (wnd, CB_GETCURSEL, 0, 0); Extcount len = SendMessage (wnd, CB_GETLBTEXTLEN, (WPARAM)item, 0); - Extbyte* buf = (Extbyte*) alloca (len+1); + Extbyte* buf = alloca (len+1); SendMessage (wnd, CB_GETLBTEXT, (WPARAM)item, (LPARAM)buf); - return build_ext_string (buf, Qnative); + return build_ext_string (buf, FORMAT_OS); + } + return Qunbound; +} + +/* set the properties of a control */ +static Lisp_Object +mswindows_widget_set_property (Lisp_Object image_instance, Lisp_Object prop, + Lisp_Object val) +{ + struct Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance); + + if (EQ (prop, Q_text)) + { + Extbyte* lparam=0; + CHECK_STRING (val); + GET_C_STRING_OS_DATA_ALLOCA (val, lparam); + SendMessage (WIDGET_INSTANCE_MSWINDOWS_HANDLE (ii), + WM_SETTEXT, 0, (LPARAM)lparam); + return Qt; } return Qunbound; } /* set the properties of a progres guage */ -static void -mswindows_progress_gauge_update (Lisp_Object image_instance) +static Lisp_Object +mswindows_progress_set_property (Lisp_Object image_instance, Lisp_Object prop, + Lisp_Object val) { - Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance); - - if (IMAGE_INSTANCE_WIDGET_ITEMS_CHANGED (ii)) + struct Lisp_Image_Instance *ii = XIMAGE_INSTANCE (image_instance); + + if (EQ (prop, Q_percent)) { - 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; -#ifdef DEBUG_WIDGET_OUTPUT - printf ("progress gauge displayed value on %p updated to %ld\n", - WIDGET_INSTANCE_MSWINDOWS_HANDLE (ii), - XINT(val)); -#endif CHECK_INT (val); SendMessage (WIDGET_INSTANCE_MSWINDOWS_HANDLE (ii), PBM_SETPOS, (WPARAM)XINT (val), 0); + return Qt; } + return Qunbound; } -LRESULT WINAPI -mswindows_control_wnd_proc (HWND hwnd, UINT msg, - WPARAM wParam, LPARAM lParam) -{ - switch (msg) - { - case WM_NOTIFY: - case WM_COMMAND: - case WM_CTLCOLORBTN: - case WM_CTLCOLORLISTBOX: - case WM_CTLCOLOREDIT: - case WM_CTLCOLORSTATIC: - case WM_CTLCOLORSCROLLBAR: - - return mswindows_wnd_proc (GetParent (hwnd), msg, wParam, lParam); - default: - return DefWindowProc (hwnd, msg, wParam, lParam); - } -} - -#endif /* HAVE_WIDGETS */ - /************************************************************************/ /* initialization */ @@ -3049,107 +2531,66 @@ void console_type_create_glyphs_mswindows (void) { - /* image methods - display */ + /* image methods */ + CONSOLE_HAS_METHOD (mswindows, print_image_instance); CONSOLE_HAS_METHOD (mswindows, finalize_image_instance); CONSOLE_HAS_METHOD (mswindows, unmap_subwindow); CONSOLE_HAS_METHOD (mswindows, map_subwindow); CONSOLE_HAS_METHOD (mswindows, update_subwindow); - CONSOLE_HAS_METHOD (mswindows, resize_subwindow); - CONSOLE_HAS_METHOD (mswindows, update_widget); CONSOLE_HAS_METHOD (mswindows, image_instance_equal); CONSOLE_HAS_METHOD (mswindows, image_instance_hash); CONSOLE_HAS_METHOD (mswindows, init_image_instance_from_eimage); CONSOLE_HAS_METHOD (mswindows, locate_pixmap_file); - - /* image methods - printer */ - CONSOLE_INHERITS_METHOD (msprinter, mswindows, print_image_instance); - CONSOLE_INHERITS_METHOD (msprinter, mswindows, finalize_image_instance); - CONSOLE_INHERITS_METHOD (msprinter, mswindows, image_instance_equal); - CONSOLE_INHERITS_METHOD (msprinter, mswindows, image_instance_hash); - CONSOLE_INHERITS_METHOD (msprinter, mswindows, init_image_instance_from_eimage); - CONSOLE_INHERITS_METHOD (msprinter, mswindows, locate_pixmap_file); } void image_instantiator_format_create_glyphs_mswindows (void) { - IIFORMAT_VALID_CONSOLE2 (mswindows, msprinter, nothing); - IIFORMAT_VALID_CONSOLE2 (mswindows, msprinter, string); - IIFORMAT_VALID_CONSOLE2 (mswindows, msprinter, formatted_string); - IIFORMAT_VALID_CONSOLE2 (mswindows, msprinter, inherit); /* image-instantiator types */ - INITIALIZE_DEVICE_IIFORMAT (mswindows, xbm); - INITIALIZE_DEVICE_IIFORMAT (msprinter, xbm); - IIFORMAT_HAS_DEVMETHOD (mswindows, xbm, instantiate); - IIFORMAT_INHERITS_DEVMETHOD (msprinter, mswindows, xbm, instantiate); #ifdef HAVE_XPM INITIALIZE_DEVICE_IIFORMAT (mswindows, xpm); - INITIALIZE_DEVICE_IIFORMAT (msprinter, xpm); IIFORMAT_HAS_DEVMETHOD (mswindows, xpm, instantiate); - IIFORMAT_INHERITS_DEVMETHOD (msprinter, mswindows, xpm, instantiate); #endif + INITIALIZE_DEVICE_IIFORMAT (mswindows, xbm); + IIFORMAT_HAS_DEVMETHOD (mswindows, xbm, instantiate); #ifdef HAVE_XFACE INITIALIZE_DEVICE_IIFORMAT (mswindows, xface); - INITIALIZE_DEVICE_IIFORMAT (msprinter, xface); IIFORMAT_HAS_DEVMETHOD (mswindows, xface, instantiate); - IIFORMAT_INHERITS_DEVMETHOD (msprinter, mswindows, xface, instantiate); -#endif -#ifdef HAVE_JPEG - IIFORMAT_VALID_CONSOLE2 (mswindows, msprinter, jpeg); -#endif -#ifdef HAVE_TIFF - IIFORMAT_VALID_CONSOLE2 (mswindows, msprinter, tiff); #endif -#ifdef HAVE_PNG - IIFORMAT_VALID_CONSOLE2 (mswindows, msprinter, png); -#endif -#ifdef HAVE_GIF - IIFORMAT_VALID_CONSOLE2 (mswindows, msprinter, gif); -#endif -#ifdef HAVE_WIDGETS - INITIALIZE_DEVICE_IIFORMAT (mswindows, widget); - IIFORMAT_HAS_DEVMETHOD (mswindows, widget, property); - /* layout widget */ - IIFORMAT_VALID_CONSOLE (mswindows, layout); - INITIALIZE_DEVICE_IIFORMAT (mswindows, native_layout); - IIFORMAT_HAS_DEVMETHOD (mswindows, native_layout, instantiate); - /* button widget */ INITIALIZE_DEVICE_IIFORMAT (mswindows, button); IIFORMAT_HAS_DEVMETHOD (mswindows, button, property); IIFORMAT_HAS_DEVMETHOD (mswindows, button, instantiate); - IIFORMAT_HAS_DEVMETHOD (mswindows, button, update); - /* edit-field widget */ - INITIALIZE_DEVICE_IIFORMAT (mswindows, edit_field); - IIFORMAT_HAS_DEVMETHOD (mswindows, edit_field, instantiate); - /* subwindow */ + + INITIALIZE_DEVICE_IIFORMAT (mswindows, edit); + IIFORMAT_HAS_DEVMETHOD (mswindows, edit, instantiate); + INITIALIZE_DEVICE_IIFORMAT (mswindows, subwindow); IIFORMAT_HAS_DEVMETHOD (mswindows, subwindow, instantiate); - /* label */ + + INITIALIZE_DEVICE_IIFORMAT (mswindows, widget); + IIFORMAT_HAS_DEVMETHOD (mswindows, widget, property); + IIFORMAT_HAS_DEVMETHOD (mswindows, widget, set_property); +#if 0 + INITIALIZE_DEVICE_IIFORMAT (mswindows, group); + IIFORMAT_HAS_DEVMETHOD (mswindows, group, instantiate); +#endif INITIALIZE_DEVICE_IIFORMAT (mswindows, label); IIFORMAT_HAS_DEVMETHOD (mswindows, label, instantiate); - /* combo box */ - INITIALIZE_DEVICE_IIFORMAT (mswindows, combo_box); - IIFORMAT_HAS_DEVMETHOD (mswindows, combo_box, property); - IIFORMAT_HAS_DEVMETHOD (mswindows, combo_box, instantiate); - /* scrollbar */ + + INITIALIZE_DEVICE_IIFORMAT (mswindows, combo); + IIFORMAT_HAS_DEVMETHOD (mswindows, combo, property); + IIFORMAT_HAS_DEVMETHOD (mswindows, combo, instantiate); + INITIALIZE_DEVICE_IIFORMAT (mswindows, scrollbar); IIFORMAT_HAS_DEVMETHOD (mswindows, scrollbar, instantiate); - /* progress gauge */ - INITIALIZE_DEVICE_IIFORMAT (mswindows, progress_gauge); - IIFORMAT_HAS_DEVMETHOD (mswindows, progress_gauge, update); - IIFORMAT_HAS_DEVMETHOD (mswindows, progress_gauge, instantiate); - /* tree view widget */ - INITIALIZE_DEVICE_IIFORMAT (mswindows, tree_view); - /* IIFORMAT_HAS_DEVMETHOD (mswindows, progress, set_property);*/ - IIFORMAT_HAS_DEVMETHOD (mswindows, tree_view, instantiate); - /* tab control widget */ - INITIALIZE_DEVICE_IIFORMAT (mswindows, tab_control); - IIFORMAT_HAS_DEVMETHOD (mswindows, tab_control, instantiate); - IIFORMAT_HAS_DEVMETHOD (mswindows, tab_control, update); -#endif - /* windows bitmap format */ + + INITIALIZE_DEVICE_IIFORMAT (mswindows, progress); + IIFORMAT_HAS_DEVMETHOD (mswindows, progress, set_property); + IIFORMAT_HAS_DEVMETHOD (mswindows, progress, instantiate); + INITIALIZE_IMAGE_INSTANTIATOR_FORMAT (bmp, "bmp"); + IIFORMAT_HAS_METHOD (bmp, validate); IIFORMAT_HAS_METHOD (bmp, normalize); IIFORMAT_HAS_METHOD (bmp, possible_dest_types); @@ -3157,9 +2598,7 @@ IIFORMAT_VALID_KEYWORD (bmp, Q_data, check_valid_string); IIFORMAT_VALID_KEYWORD (bmp, Q_file, check_valid_string); - IIFORMAT_VALID_CONSOLE2 (mswindows, msprinter, bmp); - /* mswindows resources */ INITIALIZE_IMAGE_INSTANTIATOR_FORMAT (mswindows_resource, "mswindows-resource"); @@ -3168,21 +2607,29 @@ IIFORMAT_HAS_METHOD (mswindows_resource, possible_dest_types); IIFORMAT_HAS_METHOD (mswindows_resource, instantiate); - IIFORMAT_VALID_KEYWORD (mswindows_resource, Q_resource_type, + IIFORMAT_VALID_KEYWORD (mswindows_resource, Q_resource_type, check_valid_resource_symbol); IIFORMAT_VALID_KEYWORD (mswindows_resource, Q_resource_id, check_valid_resource_id); IIFORMAT_VALID_KEYWORD (mswindows_resource, Q_file, check_valid_string); - IIFORMAT_VALID_CONSOLE2 (mswindows, msprinter, mswindows_resource); } void vars_of_glyphs_mswindows (void) { + Fprovide (Qbmp); + Fprovide (Qmswindows_resource); DEFVAR_LISP ("mswindows-bitmap-file-path", &Vmswindows_bitmap_file_path /* A list of the directories in which mswindows bitmap files may be found. This is used by the `make-image-instance' function. */ ); Vmswindows_bitmap_file_path = Qnil; + + Fprovide (Qbutton); + Fprovide (Qedit); + Fprovide (Qcombo); + Fprovide (Qscrollbar); + Fprovide (Qlabel); + Fprovide (Qprogress); } void