Blame src/StrToCurs.c

Packit Service 2b1f13
/*
Packit Service 2b1f13
Packit Service 2b1f13
Copyright 1987, 1988, 1998  The Open Group
Packit Service 2b1f13
Packit Service 2b1f13
Permission to use, copy, modify, distribute, and sell this software and its
Packit Service 2b1f13
documentation for any purpose is hereby granted without fee, provided that
Packit Service 2b1f13
the above copyright notice appear in all copies and that both that
Packit Service 2b1f13
copyright notice and this permission notice appear in supporting
Packit Service 2b1f13
documentation.
Packit Service 2b1f13
Packit Service 2b1f13
The above copyright notice and this permission notice shall be included in
Packit Service 2b1f13
all copies or substantial portions of the Software.
Packit Service 2b1f13
Packit Service 2b1f13
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
Packit Service 2b1f13
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
Packit Service 2b1f13
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE
Packit Service 2b1f13
OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
Packit Service 2b1f13
AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
Packit Service 2b1f13
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Packit Service 2b1f13
Packit Service 2b1f13
Except as contained in this notice, the name of The Open Group shall not be
Packit Service 2b1f13
used in advertising or otherwise to promote the sale, use or other dealings
Packit Service 2b1f13
in this Software without prior written authorization from The Open Group.
Packit Service 2b1f13
Packit Service 2b1f13
*/
Packit Service 2b1f13
Packit Service 2b1f13
/***********************************************************
Packit Service 2b1f13
Packit Service 2b1f13
Copyright 1987, 1988 by Digital Equipment Corporation, Maynard, Massachusetts.
Packit Service 2b1f13
Packit Service 2b1f13
                        All Rights Reserved
Packit Service 2b1f13
Packit Service 2b1f13
Permission to use, copy, modify, and distribute this software and its
Packit Service 2b1f13
documentation for any purpose and without fee is hereby granted,
Packit Service 2b1f13
provided that the above copyright notice appear in all copies and that
Packit Service 2b1f13
both that copyright notice and this permission notice appear in
Packit Service 2b1f13
supporting documentation, and that the name of Digital not be
Packit Service 2b1f13
used in advertising or publicity pertaining to distribution of the
Packit Service 2b1f13
software without specific, written prior permission.
Packit Service 2b1f13
Packit Service 2b1f13
DIGITAL DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING
Packit Service 2b1f13
ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL
Packit Service 2b1f13
DIGITAL BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR
Packit Service 2b1f13
ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS,
Packit Service 2b1f13
WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION,
Packit Service 2b1f13
ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
Packit Service 2b1f13
SOFTWARE.
Packit Service 2b1f13
Packit Service 2b1f13
******************************************************************/
Packit Service 2b1f13
Packit Service 2b1f13
#ifdef HAVE_CONFIG_H
Packit Service 2b1f13
#include <config.h>
Packit Service 2b1f13
#endif
Packit Service 2b1f13
#include	<X11/Intrinsic.h>
Packit Service 2b1f13
#include	<X11/StringDefs.h>
Packit Service 2b1f13
#include	<X11/Xmu/Converters.h>
Packit Service 2b1f13
#include	<X11/Xmu/Drawing.h>
Packit Service 2b1f13
#include	<X11/Xmu/CurUtil.h>
Packit Service 2b1f13
#include	<X11/Xmu/CharSet.h>
Packit Service 2b1f13
Packit Service 2b1f13
#include <stdlib.h>
Packit Service 2b1f13
Packit Service 2b1f13
#ifdef _POSIX_SOURCE
Packit Service 2b1f13
#include <limits.h>
Packit Service 2b1f13
#else
Packit Service 2b1f13
#define _POSIX_SOURCE
Packit Service 2b1f13
#include <limits.h>
Packit Service 2b1f13
#undef _POSIX_SOURCE
Packit Service 2b1f13
#endif
Packit Service 2b1f13
Packit Service 2b1f13
#ifndef PATH_MAX
Packit Service 2b1f13
#ifdef WIN32
Packit Service 2b1f13
#define PATH_MAX 512
Packit Service 2b1f13
#else
Packit Service 2b1f13
#include <sys/param.h>
Packit Service 2b1f13
#endif
Packit Service 2b1f13
#ifndef PATH_MAX
Packit Service 2b1f13
#ifdef MAXPATHLEN
Packit Service 2b1f13
#define PATH_MAX MAXPATHLEN
Packit Service 2b1f13
#else
Packit Service 2b1f13
#define PATH_MAX 1024
Packit Service 2b1f13
#endif
Packit Service 2b1f13
#endif
Packit Service 2b1f13
#endif /* PATH_MAX */
Packit Service 2b1f13
Packit Service 2b1f13
/* Kludge source to avoid encountering broken shared library linkers
Packit Service 2b1f13
   which insist on resolving references unused by the application,
Packit Service 2b1f13
   and broken object file formats that don't correctly distinguish
Packit Service 2b1f13
   references to procedures from references to data.
Packit Service 2b1f13
 */
Packit Service 2b1f13
#if defined(SVR4)
Packit Service 2b1f13
#define XMU_KLUDGE
Packit Service 2b1f13
#endif
Packit Service 2b1f13
Packit Service 2b1f13
/*
Packit Service 2b1f13
 * XmuConvertStringToCursor:
Packit Service 2b1f13
 *
Packit Service 2b1f13
 * allows String to specify a standard cursor name (from cursorfont.h), a
Packit Service 2b1f13
 * font name and glyph index of the form "FONT fontname index [[font] index]",
Packit Service 2b1f13
 * or a bitmap file name (absolute, or relative to the global resource
Packit Service 2b1f13
 * bitmapFilePath, class BitmapFilePath).  If the resource is not
Packit Service 2b1f13
 * defined, the default value is the build symbol BITMAPDIR.
Packit Service 2b1f13
 *
Packit Service 2b1f13
 * shares lots of code with XmuCvtStringToPixmap, but unfortunately
Packit Service 2b1f13
 * can't use it as the hotspot info is lost.
Packit Service 2b1f13
 *
Packit Service 2b1f13
 * To use, include the following in your ClassInitialize procedure:
Packit Service 2b1f13
Packit Service 2b1f13
static XtConvertArgRec screenConvertArg[] = {
Packit Service 2b1f13
    {XtBaseOffset, (XtPointer) XtOffsetOf(WidgetRec, core.screen),
Packit Service 2b1f13
     sizeof(Screen *)}
Packit Service 2b1f13
};
Packit Service 2b1f13
Packit Service 2b1f13
    XtAddConverter(XtRString, XtRCursor, XmuCvtStringToCursor,
Packit Service 2b1f13
		   screenConvertArg, XtNumber(screenConvertArg));
Packit Service 2b1f13
 *
Packit Service 2b1f13
 */
Packit Service 2b1f13
Packit Service 2b1f13
#define	done(address, type) \
Packit Service 2b1f13
	{ (*toVal).size = sizeof(type); (*toVal).addr = (XPointer) address; }
Packit Service 2b1f13
Packit Service 2b1f13
#define FONTSPECIFIER		"FONT "
Packit Service 2b1f13
Packit Service 2b1f13
/*ARGSUSED*/
Packit Service 2b1f13
void
Packit Service 2b1f13
XmuCvtStringToCursor(XrmValuePtr args, Cardinal *num_args,
Packit Service 2b1f13
		     XrmValuePtr fromVal, XrmValuePtr toVal)
Packit Service 2b1f13
{
Packit Service 2b1f13
    static Cursor cursor;		/* static for cvt magic */
Packit Service 2b1f13
    char *name = (char *)fromVal->addr;
Packit Service 2b1f13
    Screen *screen;
Packit Service 2b1f13
    register int i;
Packit Service 2b1f13
    char maskname[PATH_MAX];
Packit Service 2b1f13
    Pixmap source, mask = 0;
Packit Service 2b1f13
    /* XXX - make fg/bg resources */
Packit Service 2b1f13
    static XColor bgColor = {0, 0xffff, 0xffff, 0xffff};
Packit Service 2b1f13
    static XColor fgColor = {0, 0, 0, 0};
Packit Service 2b1f13
    int xhot, yhot;
Packit Service 2b1f13
    int len;
Packit Service 2b1f13
Packit Service 2b1f13
Packit Service 2b1f13
    if (*num_args != 1)
Packit Service 2b1f13
     XtErrorMsg("wrongParameters","cvtStringToCursor","XtToolkitError",
Packit Service 2b1f13
             "String to cursor conversion needs screen argument",
Packit Service 2b1f13
              (String *)NULL, (Cardinal *)NULL);
Packit Service 2b1f13
Packit Service 2b1f13
    if (XmuCompareISOLatin1(name, "None") == 0)
Packit Service 2b1f13
      {
Packit Service 2b1f13
	cursor = None;
Packit Service 2b1f13
	done(&cursor, Cursor);
Packit Service 2b1f13
	return;
Packit Service 2b1f13
      }
Packit Service 2b1f13
Packit Service 2b1f13
    screen = *((Screen **) args[0].addr);
Packit Service 2b1f13
Packit Service 2b1f13
    if (0 == strncmp(FONTSPECIFIER, name, strlen(FONTSPECIFIER))) {
Packit Service 2b1f13
	char source_name[PATH_MAX], mask_name[PATH_MAX];
Packit Service 2b1f13
	int source_char, mask_char, fields = 0;
Packit Service 2b1f13
	Font source_font, mask_font;
Packit Service 2b1f13
	XrmValue fromString, toFont;
Packit Service 2b1f13
	XrmValue cvtArg;
Packit Service 2b1f13
	Boolean success;
Packit Service 2b1f13
	Display *dpy = DisplayOfScreen(screen);
Packit Service 2b1f13
	char *strspec = NULL;
Packit Service 2b1f13
	int strspeclen;
Packit Service 2b1f13
#ifdef XMU_KLUDGE
Packit Service 2b1f13
	Cardinal num;
Packit Service 2b1f13
#endif
Packit Service 2b1f13
Packit Service 2b1f13
	strspeclen = strlen("FONT %s %d %s %d") + 21;
Packit Service 2b1f13
	strspec = XtMalloc(strspeclen);
Packit Service 2b1f13
	if (strspec != NULL) {
Packit Service 2b1f13
	    snprintf(strspec, strspeclen, "FONT %%%lds %%d %%%lds %%d",
Packit Service 2b1f13
		     (unsigned long)sizeof(source_name) - 1,
Packit Service 2b1f13
		     (unsigned long)sizeof(mask_name) - 1);
Packit Service 2b1f13
	    fields = sscanf(name, strspec,
Packit Service 2b1f13
			    source_name, &source_char,
Packit Service 2b1f13
			    mask_name, &mask_char);
Packit Service 2b1f13
	    XtFree(strspec);
Packit Service 2b1f13
	}
Packit Service 2b1f13
	if (fields < 2) {
Packit Service 2b1f13
	    XtStringConversionWarning(name, XtRCursor);
Packit Service 2b1f13
	    return;
Packit Service 2b1f13
	}
Packit Service 2b1f13
Packit Service 2b1f13
	fromString.addr = source_name;
Packit Service 2b1f13
	fromString.size = strlen(source_name) + 1;
Packit Service 2b1f13
	toFont.addr = (XPointer) &source_font;
Packit Service 2b1f13
	toFont.size = sizeof(Font);
Packit Service 2b1f13
	cvtArg.addr = (XPointer) &dp;;
Packit Service 2b1f13
	cvtArg.size = sizeof(Display *);
Packit Service 2b1f13
	/* XXX using display of screen argument as message display */
Packit Service 2b1f13
#ifdef XMU_KLUDGE
Packit Service 2b1f13
	/* XXX Sacrifice caching */
Packit Service 2b1f13
	num = 1;
Packit Service 2b1f13
	success = XtCvtStringToFont(dpy, &cvtArg, &num, &fromString, &toFont,
Packit Service 2b1f13
				    NULL);
Packit Service 2b1f13
#else
Packit Service 2b1f13
	success = XtCallConverter(dpy, XtCvtStringToFont, &cvtArg,
Packit Service 2b1f13
				  (Cardinal)1, &fromString, &toFont, NULL);
Packit Service 2b1f13
#endif
Packit Service 2b1f13
	if (!success) {
Packit Service 2b1f13
	    XtStringConversionWarning(name, XtRCursor);
Packit Service 2b1f13
	    return;
Packit Service 2b1f13
	}
Packit Service 2b1f13
Packit Service 2b1f13
	switch (fields) {
Packit Service 2b1f13
	  case 2:		/* defaulted mask font & char */
Packit Service 2b1f13
	    mask_font = source_font;
Packit Service 2b1f13
	    mask_char = source_char;
Packit Service 2b1f13
	    break;
Packit Service 2b1f13
Packit Service 2b1f13
	  case 3:		/* defaulted mask font */
Packit Service 2b1f13
	    mask_font = source_font;
Packit Service 2b1f13
	    mask_char = atoi(mask_name);
Packit Service 2b1f13
	    break;
Packit Service 2b1f13
Packit Service 2b1f13
	  case 4:		/* specified mask font & char */
Packit Service 2b1f13
	    fromString.addr = mask_name;
Packit Service 2b1f13
	    fromString.size = strlen(mask_name) + 1;
Packit Service 2b1f13
	    toFont.addr = (XPointer) &mask_font;
Packit Service 2b1f13
	    toFont.size = sizeof(Font);
Packit Service 2b1f13
	    /* XXX using display of screen argument as message display */
Packit Service 2b1f13
#ifdef XMU_KLUDGE
Packit Service 2b1f13
	    /* XXX Sacrifice caching */
Packit Service 2b1f13
	    num = 1;
Packit Service 2b1f13
	    success = XtCvtStringToFont(dpy, &cvtArg, &num, &fromString,
Packit Service 2b1f13
					&toFont, NULL);
Packit Service 2b1f13
#else
Packit Service 2b1f13
	    success = XtCallConverter(dpy, XtCvtStringToFont, &cvtArg,
Packit Service 2b1f13
				      (Cardinal)1, &fromString, &toFont, NULL);
Packit Service 2b1f13
#endif
Packit Service 2b1f13
	    if (!success) {
Packit Service 2b1f13
		XtStringConversionWarning(name, XtRCursor);
Packit Service 2b1f13
		return;
Packit Service 2b1f13
	    }
Packit Service 2b1f13
	}
Packit Service 2b1f13
Packit Service 2b1f13
	cursor = XCreateGlyphCursor( DisplayOfScreen(screen), source_font,
Packit Service 2b1f13
				     mask_font, source_char, mask_char,
Packit Service 2b1f13
				     &fgColor, &bgColor );
Packit Service 2b1f13
	done(&cursor, Cursor);
Packit Service 2b1f13
	return;
Packit Service 2b1f13
    }
Packit Service 2b1f13
Packit Service 2b1f13
    i = XmuCursorNameToIndex (name);
Packit Service 2b1f13
    if (i != -1) {
Packit Service 2b1f13
	cursor = XCreateFontCursor (DisplayOfScreen(screen), i);
Packit Service 2b1f13
	done(&cursor, Cursor);
Packit Service 2b1f13
	return;
Packit Service 2b1f13
    }
Packit Service 2b1f13
Packit Service 2b1f13
    if ((source = XmuLocateBitmapFile (screen, name,
Packit Service 2b1f13
				       maskname, (sizeof maskname) - 4,
Packit Service 2b1f13
				       NULL, NULL, &xhot, &yhot)) == None) {
Packit Service 2b1f13
	XtStringConversionWarning (name, XtRCursor);
Packit Service 2b1f13
	cursor = None;
Packit Service 2b1f13
	done(&cursor, Cursor);
Packit Service 2b1f13
	return;
Packit Service 2b1f13
    }
Packit Service 2b1f13
    len = strlen (maskname);
Packit Service 2b1f13
    for (i = 0; i < 2; i++) {
Packit Service 2b1f13
	strcpy (maskname + len, i == 0 ? "Mask" : "msk");
Packit Service 2b1f13
	if ((mask = XmuLocateBitmapFile (screen, maskname, NULL, 0,
Packit Service 2b1f13
					 NULL, NULL, NULL, NULL)) != None)
Packit Service 2b1f13
	  break;
Packit Service 2b1f13
    }
Packit Service 2b1f13
Packit Service 2b1f13
    cursor = XCreatePixmapCursor( DisplayOfScreen(screen), source, mask,
Packit Service 2b1f13
				  &fgColor, &bgColor, xhot, yhot );
Packit Service 2b1f13
    XFreePixmap( DisplayOfScreen(screen), source );
Packit Service 2b1f13
    if (mask != None) XFreePixmap( DisplayOfScreen(screen), mask );
Packit Service 2b1f13
Packit Service 2b1f13
    done(&cursor, Cursor);
Packit Service 2b1f13
}
Packit Service 2b1f13
Packit Service 2b1f13
#define	new_done(type, value) \
Packit Service 2b1f13
	{							\
Packit Service 2b1f13
	    if (toVal->addr != NULL) {				\
Packit Service 2b1f13
		if (toVal->size < sizeof(type)) {		\
Packit Service 2b1f13
		    toVal->size = sizeof(type);			\
Packit Service 2b1f13
		    return False;				\
Packit Service 2b1f13
		}						\
Packit Service 2b1f13
		*(type*)(toVal->addr) = (value);		\
Packit Service 2b1f13
	    }							\
Packit Service 2b1f13
	    else {						\
Packit Service 2b1f13
		static type static_val;				\
Packit Service 2b1f13
		static_val = (value);				\
Packit Service 2b1f13
		toVal->addr = (XPointer)&static_val;		\
Packit Service 2b1f13
	    }							\
Packit Service 2b1f13
	    toVal->size = sizeof(type);				\
Packit Service 2b1f13
	    return True;					\
Packit Service 2b1f13
	}
Packit Service 2b1f13
Packit Service 2b1f13
/*	Function Name: XmuCvtStringToColorCursor
Packit Service 2b1f13
 *	Description: Converts a string into a colored cursor.
Packit Service 2b1f13
 *	Arguments: dpy
Packit Service 2b1f13
 *		   args - an argument list (see below).
Packit Service 2b1f13
 *                 num_args - number of elements in the argument list.
Packit Service 2b1f13
 *                 fromVal - value to convert from.
Packit Service 2b1f13
 *                 toVal - value to convert to.
Packit Service 2b1f13
 *		   data
Packit Service 2b1f13
 *	Returns:   True or False
Packit Service 2b1f13
 */
Packit Service 2b1f13
Packit Service 2b1f13
/*ARGSUSED*/
Packit Service 2b1f13
Boolean
Packit Service 2b1f13
XmuCvtStringToColorCursor(Display *dpy, XrmValuePtr args, Cardinal *num_args,
Packit Service 2b1f13
			  XrmValuePtr fromVal, XrmValuePtr toVal,
Packit Service 2b1f13
			  XtPointer *converter_data)
Packit Service 2b1f13
{
Packit Service 2b1f13
    Cursor cursor;
Packit Service 2b1f13
    Screen *screen;
Packit Service 2b1f13
    Pixel fg, bg;
Packit Service 2b1f13
    Colormap c_map;
Packit Service 2b1f13
    XColor colors[2];
Packit Service 2b1f13
    Cardinal number;
Packit Service 2b1f13
    XrmValue ret_val;
Packit Service 2b1f13
Packit Service 2b1f13
    if (*num_args != 4) {
Packit Service 2b1f13
	XtAppWarningMsg(XtDisplayToApplicationContext(dpy),
Packit Service 2b1f13
	    "wrongParameters","cvtStringToColorCursor","XmuError",
Packit Service 2b1f13
            "String to color cursor conversion needs four arguments",
Packit Service 2b1f13
	    (String *)NULL, (Cardinal *)NULL);
Packit Service 2b1f13
	return False;
Packit Service 2b1f13
    }
Packit Service 2b1f13
Packit Service 2b1f13
    screen = *((Screen **) args[0].addr);
Packit Service 2b1f13
    fg = *((Pixel *) args[1].addr);
Packit Service 2b1f13
    bg = *((Pixel *) args[2].addr);
Packit Service 2b1f13
    c_map = *((Colormap *) args[3].addr);
Packit Service 2b1f13
Packit Service 2b1f13
    number = 1;
Packit Service 2b1f13
    XmuCvtStringToCursor(args, &number, fromVal, &ret_val);
Packit Service 2b1f13
Packit Service 2b1f13
    cursor = *((Cursor *) ret_val.addr);
Packit Service 2b1f13
Packit Service 2b1f13
    if (cursor == None || (fg == BlackPixelOfScreen(screen)
Packit Service 2b1f13
			   && bg == WhitePixelOfScreen(screen)))
Packit Service 2b1f13
	new_done(Cursor, cursor);
Packit Service 2b1f13
Packit Service 2b1f13
    colors[0].pixel = fg;
Packit Service 2b1f13
    colors[1].pixel = bg;
Packit Service 2b1f13
Packit Service 2b1f13
    XQueryColors (dpy, c_map, colors, 2);
Packit Service 2b1f13
    XRecolorCursor(dpy, cursor, colors, colors + 1);
Packit Service 2b1f13
    new_done(Cursor, cursor);
Packit Service 2b1f13
}
Packit Service 2b1f13
Packit Service 2b1f13
Packit Service 2b1f13