1/*-
2 * Copyright (c) 1996
3 *	Rob Zimmermann.  All rights reserved.
4 * Copyright (c) 1996
5 *	Keith Bostic.  All rights reserved.
6 *
7 * See the LICENSE file for redistribution information.
8 */
9
10#include "config.h"
11
12#include <sys/cdefs.h>
13#if 0
14#ifndef lint
15static const char sccsid[] = "Id: m_cde.c,v 8.11 2003/11/05 17:09:58 skimo Exp  (Berkeley) Date: 2003/11/05 17:09:58 ";
16#endif /* not lint */
17#else
18__RCSID("$NetBSD$");
19#endif
20
21#include <sys/types.h>
22#include <sys/queue.h>
23
24#include <X11/X.h>
25#include <X11/Xlib.h>
26#include <X11/Xatom.h>
27
28#include <bitstring.h>
29#include <stdio.h>
30
31#undef LOCK_SUCCESS
32#include "../common/common.h"
33#include "motif_extern.h"
34
35#if SelfTest
36#define	_TRACE( x )	printf x
37#else
38#define	_TRACE( x )
39#endif
40
41#define	Required	10
42#define	Useful		3
43#define	Present		(Required+Useful)
44
45static struct {
46    char	*name;
47    int		value;
48} Atoms[] = {
49    { "_VUE_SM_WINDOW_INFO",	Required,	/* "vue" */		},
50    { "_DT_SM_WINDOW_INFO",	Required,	/* "dtwm" */		},
51    { "_SUN_WM_PROTOCOLS",	Useful,		/* "olwm" */		},
52    { "_MOTIF_WM_INFO",		Useful,		/* "mwm/dtwm" */	},
53};
54
55/*
56 * is_cde --
57 *
58 * When running under CDE (or VUE on HPUX) applications should not define
59 * fallback colors (or fonts).  The only way to tell is to check the atoms
60 * attached to the server.  This routine does that.
61 *
62 * PUBLIC: int is_cde __P((Display *));
63 */
64int
65is_cde(Display *d)
66{
67    int			i, r, format;
68    unsigned long	nitems, remaining;
69    unsigned char	*prop;
70    Window		root = DefaultRootWindow( d );
71    Atom		atom, type;
72    int			retval = 0;
73
74    _TRACE( ( "Root window is 0x%x\n", root ) );
75
76    /* create our atoms */
77    for (i=0; i< (sizeof(Atoms)/sizeof(Atoms[0])); i++ ) {
78
79	atom = XInternAtom( d, Atoms[i].name, True );
80	if ( atom == None ) {
81	    _TRACE( ( "Atom \"%s\" does not exist\n", Atoms[i].name ) );
82	    continue;
83	}
84
85	/* what is the value of the atom? */
86	r = XGetWindowProperty( d,
87				root,
88				atom,
89				0,
90				1024,
91				False,			/* do not delete */
92				AnyPropertyType,	/* request type */
93				&type,			/* actual type */
94				&format,		/* byte size */
95				&nitems,		/* number of items */
96				&remaining,		/* anything left over? */
97				&prop			/* the data itself */
98				);
99	if ( r != Success ) {
100	    _TRACE( ( "Atom \"%s\" cannot be converted to string\n", Atoms[i].name ) );
101	    continue;
102	}
103
104	retval += Atoms[i].value;
105
106
107#if SelfTest
108	_TRACE( ( "Atom \"%s\"\n", Atoms[i].name ) );
109
110	switch ( type ) {
111	    case 0:
112		_TRACE( ( "\t does not exist on the root window\n", Atoms[i].name ) );
113
114	    case XA_ATOM:
115		for (j=0; j<nitems; j++) {
116		    name = XGetAtomName( d, ((Atom *) prop)[j] );
117		    _TRACE( ( "\t[%d] = \"%s\"\n", j, name ) );
118		    XFree( name );
119		}
120		break;
121
122	    case XA_STRING:
123		_TRACE( ( "\t is a string\n", Atoms[i].name ) );
124		break;
125
126	    default:
127		_TRACE( ( "\tunknown type %s\n", XGetAtomName( d, type ) ) );
128		break;
129	}
130#endif
131
132	/* done */
133	XFree( (caddr_t) prop );
134
135    }
136
137    _TRACE( ( "retval = %d\n", retval ) );
138    return retval >= Present;
139}
140
141#if SelfTest
142
143main () {
144    Display *d = XOpenDisplay( 0 );
145
146    if ( d == 0 )
147	printf ( "Could not open display\n" );
148    else {
149	printf ( "_vi_is_cde() == %d\n", _vi_is_cde( d ) );
150	XCloseDisplay( d );
151    }
152}
153#endif
154