|
Packit Service |
2b1f13 |
/*
|
|
Packit Service |
2b1f13 |
|
|
Packit Service |
2b1f13 |
Copyright 1989, 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 |
* Author: Jim Fulton, MIT X Consortium
|
|
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/Xlib.h>
|
|
Packit Service |
2b1f13 |
#include <stdlib.h>
|
|
Packit Service |
2b1f13 |
#include <string.h>
|
|
Packit Service |
2b1f13 |
#include <X11/Xresource.h>
|
|
Packit Service |
2b1f13 |
#include <X11/Xutil.h>
|
|
Packit Service |
2b1f13 |
#include <X11/Xmu/CvtCache.h>
|
|
Packit Service |
2b1f13 |
#include <X11/Xmu/Drawing.h>
|
|
Packit Service |
2b1f13 |
#include <X11/Xmu/SysUtil.h>
|
|
Packit Service |
2b1f13 |
|
|
Packit Service |
2b1f13 |
#ifndef X_NOT_POSIX
|
|
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 |
#endif /* X_NOT_POSIX */
|
|
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 |
/*
|
|
Packit Service |
2b1f13 |
* Prototypes
|
|
Packit Service |
2b1f13 |
*/
|
|
Packit Service |
2b1f13 |
static char **split_path_string(char*);
|
|
Packit Service |
2b1f13 |
|
|
Packit Service |
2b1f13 |
/*
|
|
Packit Service |
2b1f13 |
* XmuLocateBitmapFile - read a bitmap file using the normal defaults
|
|
Packit Service |
2b1f13 |
*/
|
|
Packit Service |
2b1f13 |
|
|
Packit Service |
2b1f13 |
Pixmap
|
|
Packit Service |
2b1f13 |
XmuLocateBitmapFile(Screen *screen, _Xconst char *name, char *srcname,
|
|
Packit Service |
2b1f13 |
int srcnamelen, int *widthp, int *heightp,
|
|
Packit Service |
2b1f13 |
int *xhotp, int *yhotp)
|
|
Packit Service |
2b1f13 |
{
|
|
Packit Service |
2b1f13 |
return XmuLocatePixmapFile (screen, name,
|
|
Packit Service |
2b1f13 |
(unsigned long) 1, (unsigned long) 0,
|
|
Packit Service |
2b1f13 |
(unsigned int) 1, srcname, srcnamelen,
|
|
Packit Service |
2b1f13 |
widthp, heightp, xhotp, yhotp);
|
|
Packit Service |
2b1f13 |
}
|
|
Packit Service |
2b1f13 |
|
|
Packit Service |
2b1f13 |
|
|
Packit Service |
2b1f13 |
/*
|
|
Packit Service |
2b1f13 |
* version that reads pixmap data as well as bitmap data
|
|
Packit Service |
2b1f13 |
*/
|
|
Packit Service |
2b1f13 |
Pixmap
|
|
Packit Service |
2b1f13 |
XmuLocatePixmapFile(Screen *screen, _Xconst char *name,
|
|
Packit Service |
2b1f13 |
unsigned long fore, unsigned long back,
|
|
Packit Service |
2b1f13 |
unsigned int depth,
|
|
Packit Service |
2b1f13 |
char *srcname, int srcnamelen,
|
|
Packit Service |
2b1f13 |
int *widthp, int *heightp, int *xhotp, int *yhotp)
|
|
Packit Service |
2b1f13 |
{
|
|
Packit Service |
2b1f13 |
|
|
Packit Service |
2b1f13 |
#ifndef BITMAPDIR
|
|
Packit Service |
2b1f13 |
#define BITMAPDIR "/usr/include/X11/bitmaps"
|
|
Packit Service |
2b1f13 |
#endif
|
|
Packit Service |
2b1f13 |
|
|
Packit Service |
2b1f13 |
Display *dpy = DisplayOfScreen (screen);
|
|
Packit Service |
2b1f13 |
Window root = RootWindowOfScreen (screen);
|
|
Packit Service |
2b1f13 |
Bool try_plain_name = True;
|
|
Packit Service |
2b1f13 |
XmuCvtCache *cache = _XmuCCLookupDisplay (dpy);
|
|
Packit Service |
2b1f13 |
char **file_paths = (char **) NULL;
|
|
Packit Service |
2b1f13 |
char filename[PATH_MAX];
|
|
Packit Service |
2b1f13 |
#if 0
|
|
Packit Service |
2b1f13 |
char* bitmapdir = BITMAPDIR;
|
|
Packit Service |
2b1f13 |
#endif
|
|
Packit Service |
2b1f13 |
unsigned int width, height;
|
|
Packit Service |
2b1f13 |
int xhot, yhot;
|
|
Packit Service |
2b1f13 |
int i;
|
|
Packit Service |
2b1f13 |
|
|
Packit Service |
2b1f13 |
/*
|
|
Packit Service |
2b1f13 |
* look in cache for bitmap path
|
|
Packit Service |
2b1f13 |
*/
|
|
Packit Service |
2b1f13 |
if (cache) {
|
|
Packit Service |
2b1f13 |
if (!cache->string_to_bitmap.bitmapFilePath) {
|
|
Packit Service |
2b1f13 |
XrmName xrm_name[2];
|
|
Packit Service |
2b1f13 |
XrmClass xrm_class[2];
|
|
Packit Service |
2b1f13 |
XrmRepresentation rep_type;
|
|
Packit Service |
2b1f13 |
XrmValue value;
|
|
Packit Service |
2b1f13 |
|
|
Packit Service |
2b1f13 |
xrm_name[0] = XrmPermStringToQuark ("bitmapFilePath");
|
|
Packit Service |
2b1f13 |
xrm_name[1] = NULLQUARK;
|
|
Packit Service |
2b1f13 |
xrm_class[0] = XrmPermStringToQuark ("BitmapFilePath");
|
|
Packit Service |
2b1f13 |
xrm_class[1] = NULLQUARK;
|
|
Packit Service |
2b1f13 |
if (!XrmGetDatabase(dpy)) {
|
|
Packit Service |
2b1f13 |
/* what a hack; need to initialize it */
|
|
Packit Service |
2b1f13 |
(void) XGetDefault (dpy, "", "");
|
|
Packit Service |
2b1f13 |
}
|
|
Packit Service |
2b1f13 |
if (XrmQGetResource (XrmGetDatabase(dpy), xrm_name, xrm_class,
|
|
Packit Service |
2b1f13 |
&rep_type, &value) &&
|
|
Packit Service |
2b1f13 |
rep_type == XrmPermStringToQuark("String")) {
|
|
Packit Service |
2b1f13 |
cache->string_to_bitmap.bitmapFilePath =
|
|
Packit Service |
2b1f13 |
split_path_string (value.addr);
|
|
Packit Service |
2b1f13 |
}
|
|
Packit Service |
2b1f13 |
}
|
|
Packit Service |
2b1f13 |
file_paths = cache->string_to_bitmap.bitmapFilePath;
|
|
Packit Service |
2b1f13 |
}
|
|
Packit Service |
2b1f13 |
|
|
Packit Service |
2b1f13 |
/*
|
|
Packit Service |
2b1f13 |
* Search order:
|
|
Packit Service |
2b1f13 |
* 1. name if it begins with / or ./
|
|
Packit Service |
2b1f13 |
* 2. "each prefix in file_paths"/name
|
|
Packit Service |
2b1f13 |
* 3. BITMAPDIR/name
|
|
Packit Service |
2b1f13 |
* 4. name if didn't begin with / or .
|
|
Packit Service |
2b1f13 |
*/
|
|
Packit Service |
2b1f13 |
|
|
Packit Service |
2b1f13 |
for (i = 1; i <= 4; i++) {
|
|
Packit Service |
2b1f13 |
const char *fn = filename;
|
|
Packit Service |
2b1f13 |
Pixmap pixmap;
|
|
Packit Service |
2b1f13 |
unsigned char *data;
|
|
Packit Service |
2b1f13 |
|
|
Packit Service |
2b1f13 |
switch (i) {
|
|
Packit Service |
2b1f13 |
case 1:
|
|
Packit Service |
2b1f13 |
if (!(name[0] == '/' || ((name[0] == '.') && name[1] == '/')))
|
|
Packit Service |
2b1f13 |
continue;
|
|
Packit Service |
2b1f13 |
fn = name;
|
|
Packit Service |
2b1f13 |
try_plain_name = False;
|
|
Packit Service |
2b1f13 |
break;
|
|
Packit Service |
2b1f13 |
case 2:
|
|
Packit Service |
2b1f13 |
if (file_paths && *file_paths) {
|
|
Packit Service |
2b1f13 |
XmuSnprintf(filename, sizeof(filename),
|
|
Packit Service |
2b1f13 |
"%s/%s", *file_paths, name);
|
|
Packit Service |
2b1f13 |
file_paths++;
|
|
Packit Service |
2b1f13 |
i--;
|
|
Packit Service |
2b1f13 |
break;
|
|
Packit Service |
2b1f13 |
}
|
|
Packit Service |
2b1f13 |
continue;
|
|
Packit Service |
2b1f13 |
case 3:
|
|
Packit Service |
2b1f13 |
XmuSnprintf(filename, sizeof(filename), "%s/%s", BITMAPDIR, name);
|
|
Packit Service |
2b1f13 |
break;
|
|
Packit Service |
2b1f13 |
case 4:
|
|
Packit Service |
2b1f13 |
if (!try_plain_name) continue;
|
|
Packit Service |
2b1f13 |
fn = name;
|
|
Packit Service |
2b1f13 |
break;
|
|
Packit Service |
2b1f13 |
}
|
|
Packit Service |
2b1f13 |
|
|
Packit Service |
2b1f13 |
data = NULL;
|
|
Packit Service |
2b1f13 |
pixmap = None;
|
|
Packit Service |
2b1f13 |
if (XmuReadBitmapDataFromFile (fn, &width, &height, &data,
|
|
Packit Service |
2b1f13 |
&xhot, &yhot) == BitmapSuccess) {
|
|
Packit Service |
2b1f13 |
pixmap = XCreatePixmapFromBitmapData (dpy, root, (char *) data,
|
|
Packit Service |
2b1f13 |
width, height,
|
|
Packit Service |
2b1f13 |
fore, back, depth);
|
|
Packit Service |
2b1f13 |
XFree ((char *)data);
|
|
Packit Service |
2b1f13 |
}
|
|
Packit Service |
2b1f13 |
|
|
Packit Service |
2b1f13 |
if (pixmap) {
|
|
Packit Service |
2b1f13 |
if (widthp) *widthp = (int)width;
|
|
Packit Service |
2b1f13 |
if (heightp) *heightp = (int)height;
|
|
Packit Service |
2b1f13 |
if (xhotp) *xhotp = xhot;
|
|
Packit Service |
2b1f13 |
if (yhotp) *yhotp = yhot;
|
|
Packit Service |
2b1f13 |
if (srcname && srcnamelen > 0) {
|
|
Packit Service |
2b1f13 |
strncpy (srcname, fn, srcnamelen - 1);
|
|
Packit Service |
2b1f13 |
srcname[srcnamelen - 1] = '\0';
|
|
Packit Service |
2b1f13 |
}
|
|
Packit Service |
2b1f13 |
return pixmap;
|
|
Packit Service |
2b1f13 |
}
|
|
Packit Service |
2b1f13 |
}
|
|
Packit Service |
2b1f13 |
|
|
Packit Service |
2b1f13 |
return None;
|
|
Packit Service |
2b1f13 |
}
|
|
Packit Service |
2b1f13 |
|
|
Packit Service |
2b1f13 |
|
|
Packit Service |
2b1f13 |
/*
|
|
Packit Service |
2b1f13 |
* split_path_string - split a colon-separated list into its constituent
|
|
Packit Service |
2b1f13 |
* parts; to release, free list[0] and list.
|
|
Packit Service |
2b1f13 |
*/
|
|
Packit Service |
2b1f13 |
static char **
|
|
Packit Service |
2b1f13 |
split_path_string(register char *src)
|
|
Packit Service |
2b1f13 |
{
|
|
Packit Service |
2b1f13 |
int nelems = 1;
|
|
Packit Service |
2b1f13 |
register char *dst;
|
|
Packit Service |
2b1f13 |
char **elemlist, **elem;
|
|
Packit Service |
2b1f13 |
|
|
Packit Service |
2b1f13 |
/* count the number of elements */
|
|
Packit Service |
2b1f13 |
for (dst = src; *dst; dst++) if (*dst == ':') nelems++;
|
|
Packit Service |
2b1f13 |
|
|
Packit Service |
2b1f13 |
/* get memory for everything */
|
|
Packit Service |
2b1f13 |
dst = (char *) malloc (dst - src + 1);
|
|
Packit Service |
2b1f13 |
if (!dst) return NULL;
|
|
Packit Service |
2b1f13 |
elemlist = (char **) calloc ((nelems + 1), sizeof (char *));
|
|
Packit Service |
2b1f13 |
if (!elemlist) {
|
|
Packit Service |
2b1f13 |
free (dst);
|
|
Packit Service |
2b1f13 |
return NULL;
|
|
Packit Service |
2b1f13 |
}
|
|
Packit Service |
2b1f13 |
|
|
Packit Service |
2b1f13 |
/* copy to new list and walk up nulling colons and setting list pointers */
|
|
Packit Service |
2b1f13 |
strcpy (dst, src);
|
|
Packit Service |
2b1f13 |
for (elem = elemlist, src = dst; *src; src++) {
|
|
Packit Service |
2b1f13 |
if (*src == ':') {
|
|
Packit Service |
2b1f13 |
*elem++ = dst;
|
|
Packit Service |
2b1f13 |
*src = '\0';
|
|
Packit Service |
2b1f13 |
dst = src + 1;
|
|
Packit Service |
2b1f13 |
}
|
|
Packit Service |
2b1f13 |
}
|
|
Packit Service |
2b1f13 |
*elem = dst;
|
|
Packit Service |
2b1f13 |
|
|
Packit Service |
2b1f13 |
return elemlist;
|
|
Packit Service |
2b1f13 |
}
|
|
Packit Service |
2b1f13 |
|
|
Packit Service |
2b1f13 |
|
|
Packit Service |
2b1f13 |
void
|
|
Packit Service |
2b1f13 |
_XmuStringToBitmapInitCache(register XmuCvtCache *c)
|
|
Packit Service |
2b1f13 |
{
|
|
Packit Service |
2b1f13 |
c->string_to_bitmap.bitmapFilePath = NULL;
|
|
Packit Service |
2b1f13 |
}
|
|
Packit Service |
2b1f13 |
|
|
Packit Service |
2b1f13 |
void
|
|
Packit Service |
2b1f13 |
_XmuStringToBitmapFreeCache(register XmuCvtCache *c)
|
|
Packit Service |
2b1f13 |
{
|
|
Packit Service |
2b1f13 |
if (c->string_to_bitmap.bitmapFilePath) {
|
|
Packit Service |
2b1f13 |
if (c->string_to_bitmap.bitmapFilePath[0])
|
|
Packit Service |
2b1f13 |
free (c->string_to_bitmap.bitmapFilePath[0]);
|
|
Packit Service |
2b1f13 |
free ((char *) (c->string_to_bitmap.bitmapFilePath));
|
|
Packit Service |
2b1f13 |
}
|
|
Packit Service |
2b1f13 |
}
|