summaryrefslogtreecommitdiff
path: root/mail/xpbiff/files/LocPixmap.c
diff options
context:
space:
mode:
Diffstat (limited to 'mail/xpbiff/files/LocPixmap.c')
-rw-r--r--mail/xpbiff/files/LocPixmap.c242
1 files changed, 242 insertions, 0 deletions
diff --git a/mail/xpbiff/files/LocPixmap.c b/mail/xpbiff/files/LocPixmap.c
new file mode 100644
index 000000000000..7c89f3b5d32f
--- /dev/null
+++ b/mail/xpbiff/files/LocPixmap.c
@@ -0,0 +1,242 @@
+/* Change for xpbiff by Yoshikazu Yamamoto(y-yamamt@ics.es.osaka-u.ac.jp) at Oct 19, 1993 */
+
+/* * Last edited: Sep 17 14:39 1991 (mallet) */
+/*
+ * $FreeBSD$
+ *
+ * Copyright 1991 Lionel Mallet
+ *
+ * Permission to use, copy, modify, and distribute this software and its
+ * documentation for any purpose and without fee is hereby granted, provided
+ * that the above copyright notice appear in all copies and that both that
+ * copyright notice and this permission notice appear in supporting
+ * documentation, and that the name of Lionel MALLET not be used in advertising
+ * or publicity pertaining to distribution of the software without specific,
+ * written prior permission. Lionel MALLET makes no representations about the
+ * suitability of this software for any purpose. It is provided "as is"
+ * without express or implied warranty.
+ *
+ * Lionel MALLET DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS
+ * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS, IN NO EVENT SHALL Lionel MALLET BE LIABLE FOR ANY SPECIAL,
+ * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER
+ * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
+ * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR
+ * IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ *
+ * Author: Lionel Mallet - SIMULOG
+ */
+
+#include <X11/Xlib.h>
+#include <X11/Xresource.h>
+#include <X11/Xutil.h>
+#include <X11/StringDefs.h>
+#include <sys/param.h> /* get MAXPATHLEN if possible */
+#ifndef MAXPATHLEN
+#define MAXPATHLEN 256
+#endif
+
+#include <X11/Xmu/CvtCache.h>
+#include <X11/xpm.h>
+#include <X11/Xmu/Drawing.h>
+
+
+/*
+ * LocatePixmapFile - read a pixmap file using the normal defaults
+ */
+
+static char **split_path_string();
+
+Pixmap LocatePixmapFile (screen, name, srcname, srcnamelen,
+ widthp, heightp, mask)
+ Screen *screen;
+ char *name;
+ char *srcname; /* RETURN */
+ int srcnamelen;
+ int *widthp, *heightp; /* RETURN */
+ Pixmap *mask; /* RETURN */
+{
+ Display *dpy = DisplayOfScreen (screen);
+ Window root = RootWindowOfScreen (screen);
+ Bool try_plain_name = True;
+ XmuCvtCache *cache = _XmuCCLookupDisplay (dpy);
+ char **file_paths;
+ char filename[MAXPATHLEN];
+ unsigned int width, height;
+ int xhot, yhot;
+ int i;
+
+
+ /*
+ * look in cache for pixmap path
+ */
+ if (cache) {
+ if (!cache->string_to_bitmap.bitmapFilePath) {
+ XrmName xrm_name[2];
+ XrmClass xrm_class[2];
+ XrmRepresentation rep_type;
+ XrmValue value;
+
+ xrm_name[0] = XrmStringToName ("bitmapFilePath");
+ xrm_name[1] = NULL;
+ xrm_class[0] = XrmStringToClass ("BitmapFilePath");
+ xrm_class[1] = NULL;
+ /*
+ * XXX - warning, derefing Display * until XDisplayDatabase
+ */
+ if (!XrmGetDatabase(dpy)) {
+ /* what a hack; need to initialize dpy->db */
+ (void) XGetDefault (dpy, "", "");
+ }
+ if (XrmQGetResource (XrmGetDatabase(dpy), xrm_name, xrm_class,
+ &rep_type, &value) &&
+ rep_type == XrmStringToQuark(XtRString)) {
+ cache->string_to_bitmap.bitmapFilePath =
+ split_path_string (value.addr);
+ }
+ }
+ file_paths = cache->string_to_bitmap.bitmapFilePath;
+ }
+
+
+ /*
+ * Search order:
+ * 1. name if it begins with / or ./
+ * 2. "each prefix in file_paths"/name
+ * 3. BITMAPDIR/name
+ * 4. name if didn't begin with / or .
+ */
+
+#ifndef BITMAPDIR
+#define BITMAPDIR "/usr/include/X11/bitmaps"
+#endif
+
+ for (i = 1; i <= 4; i++) {
+ char *fn = filename;
+ Pixmap pixmap;
+ XpmAttributes attributes;
+ unsigned char *data;
+
+ switch (i) {
+ case 1:
+ if (!(name[0] == '/' || (name[0] == '.') && name[1] == '/'))
+ continue;
+ fn = name;
+ try_plain_name = False;
+ break;
+ case 2:
+ if (file_paths && *file_paths) {
+ sprintf (filename, "%s/%s", *file_paths, name);
+ file_paths++;
+ i--;
+ break;
+ }
+ continue;
+ case 3:
+ sprintf (filename, "%s/%s", BITMAPDIR, name);
+ break;
+ case 4:
+ if (!try_plain_name) continue;
+ fn = name;
+ break;
+ }
+
+ data = NULL;
+ pixmap = None;
+ if (XmuReadBitmapDataFromFile (fn, &width, &height, &data,
+ &xhot, &yhot) == BitmapSuccess) {
+ pixmap = XCreatePixmapFromBitmapData (dpy, root, (char *) data,
+ width, height,
+ (unsigned long) 1,
+ (unsigned long) 0,
+ (unsigned int) 1);
+ XFree ((char *)data);
+ if (pixmap != None) {
+ if (widthp) *widthp = (int)width;
+ if (heightp) *heightp = (int)height;
+ if (srcname && srcnamelen > 0) {
+ strncpy (srcname, fn, srcnamelen - 1);
+ srcname[srcnamelen - 1] = '\0';
+ }
+ *mask = None;
+ return pixmap;
+ }
+ }
+ attributes.visual = DefaultVisualOfScreen (screen);
+ attributes.colormap = DefaultColormapOfScreen (screen);
+ attributes.depth = DefaultDepthOfScreen (screen);
+ attributes.colorsymbols = (ColorSymbol *)NULL;
+ attributes.numsymbols = 0;
+ attributes.valuemask = XpmVisual | XpmColormap | XpmDepth;
+ if (pixmap == None &&
+ XpmReadPixmapFile (dpy, root, fn, &pixmap, mask,
+ &attributes) == XpmPixmapSuccess) {
+ if (widthp) *widthp = (int)attributes.width;
+ if (heightp) *heightp = (int)attributes.height;
+ if (srcname && srcnamelen > 0) {
+ strncpy (srcname, fn, srcnamelen - 1);
+ srcname[srcnamelen - 1] = '\0';
+ }
+ XpmFreeAttributes(&attributes);
+ return pixmap;
+ }
+ }
+ *mask = None;
+ return None;
+}
+
+
+/*
+ * split_path_string - split a colon-separated list into its constituent
+ * parts; to release, free list[0] and list.
+ */
+static char **split_path_string (src)
+ register char *src;
+{
+ int nelems = 1;
+ register char *dst;
+ char **elemlist, **elem;
+
+ /* count the number of elements */
+ for (dst = src; *dst; dst++) if (*dst == ':') nelems++;
+
+ /* get memory for everything */
+ dst = (char *) malloc (dst - src + 1);
+ if (!dst) return NULL;
+ elemlist = (char **) calloc ((nelems + 1), sizeof (char *));
+ if (!elemlist) {
+ free (dst);
+ return NULL;
+ }
+
+ /* copy to new list and walk up nulling colons and setting list pointers */
+ strcpy (dst, src);
+ for (elem = elemlist, src = dst; *src; src++) {
+ if (*src == ':') {
+ *elem++ = dst;
+ *src = '\0';
+ dst = src + 1;
+ }
+ }
+ *elem = dst;
+
+ return elemlist;
+}
+
+/*
+void _XmuStringToBitmapInitCache (c)
+ register XmuCvtCache *c;
+{
+ c->string_to_bitmap.bitmapFilePath = NULL;
+}
+
+void _XmuStringToBitmapFreeCache (c)
+ register XmuCvtCache *c;
+{
+ if (c->string_to_bitmap.bitmapFilePath) {
+ if (c->string_to_bitmap.bitmapFilePath[0])
+ free (c->string_to_bitmap.bitmapFilePath[0]);
+ free ((char *) (c->string_to_bitmap.bitmapFilePath));
+ }
+}
+*/