mirror of
https://github.com/Stichting-MINIX-Research-Foundation/xsrc.git
synced 2025-09-11 05:38:32 -04:00
343 lines
8.0 KiB
C
343 lines
8.0 KiB
C
/* $Xorg: CvtStdSel.c,v 1.4 2001/02/09 02:03:52 xorgcvs Exp $ */
|
|
|
|
/*
|
|
|
|
Copyright 1988, 1998 The Open Group
|
|
|
|
Permission to use, copy, modify, distribute, and sell this software and its
|
|
documentation for any purpose is hereby granted without fee, provided that
|
|
the above copyright notice appear in all copies and that both that
|
|
copyright notice and this permission notice appear in supporting
|
|
documentation.
|
|
|
|
The above copyright notice and this permission notice shall be included in
|
|
all copies or substantial portions of the Software.
|
|
|
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
OPEN GROUP BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
|
|
AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
|
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
|
|
Except as contained in this notice, the name of The Open Group shall not be
|
|
used in advertising or otherwise to promote the sale, use or other dealings
|
|
in this Software without prior written authorization from The Open Group.
|
|
|
|
*/
|
|
/* $XFree86: xc/lib/Xmu/CvtStdSel.c,v 3.20 2001/12/14 19:55:39 dawes Exp $ */
|
|
|
|
/*
|
|
* This file contains routines to handle common selection targets.
|
|
*
|
|
* Public entry points:
|
|
*
|
|
* XmuConvertStandardSelection() return a known selection
|
|
*/
|
|
|
|
#ifdef SYSVNET
|
|
#include <interlan/il_types.h>
|
|
#define __TYPES__ /* prevent #include <sys/types.h> in Xlib.h */
|
|
#include <interlan/netdb.h>
|
|
#include <interlan/socket.h>
|
|
#endif /* SYSVNET */
|
|
|
|
#include <X11/IntrinsicP.h>
|
|
#include <X11/Xatom.h>
|
|
#include <X11/ShellP.h>
|
|
#ifdef XTHREADS
|
|
#include <X11/Xthreads.h>
|
|
#endif
|
|
#include <stdio.h>
|
|
|
|
#ifndef SYSVNET
|
|
#ifdef WIN32
|
|
#include <X11/Xwinsock.h>
|
|
#define XOS_USE_MTSAFE_NETDBAPI
|
|
#else
|
|
#ifndef Lynx
|
|
#include <sys/socket.h>
|
|
#else
|
|
#include <sys/types.h>
|
|
#include <socket.h>
|
|
#endif
|
|
#define XOS_USE_XT_LOCKING
|
|
#endif
|
|
#define X_INCLUDE_NETDB_H
|
|
#include <X11/Xos_r.h>
|
|
#endif
|
|
|
|
#include <X11/Xos.h>
|
|
#include <stdlib.h>
|
|
#include "Atoms.h"
|
|
#include "StdSel.h"
|
|
#include "SysUtil.h"
|
|
#include <X11/Xfuncs.h>
|
|
|
|
#ifndef OS_NAME
|
|
#ifndef X_OS_FILE
|
|
#ifdef SYSV /* keep separate until makedepend fixed */
|
|
#define USE_UNAME
|
|
#endif
|
|
#ifdef SVR4
|
|
#define USE_UNAME
|
|
#endif
|
|
#ifdef ultrix
|
|
#define USE_UNAME
|
|
#endif
|
|
#ifdef CSRG_BASED
|
|
#define USE_UNAME
|
|
#endif
|
|
#endif /*X_OS_FILE*/
|
|
#ifdef USE_UNAME
|
|
#include <sys/utsname.h>
|
|
#endif
|
|
#endif
|
|
|
|
/*
|
|
* Prototypes
|
|
*/
|
|
static char *get_os_name(void);
|
|
static Bool isApplicationShell(Widget);
|
|
|
|
/*
|
|
* Implementation
|
|
*/
|
|
static char *
|
|
get_os_name(void)
|
|
{
|
|
#ifdef OS_NAME
|
|
return XtNewString(OS_NAME);
|
|
#else
|
|
FILE *f = NULL;
|
|
|
|
#ifdef USE_UNAME
|
|
struct utsname utss;
|
|
|
|
if (uname (&utss) == 0) {
|
|
char *os_name;
|
|
int len = strlen(utss.sysname) + 1;
|
|
#ifndef hpux /* because of hostname length crock */
|
|
len += 2 + strlen(utss.release);
|
|
#endif
|
|
os_name = XtMalloc (len);
|
|
strcpy (os_name, utss.sysname);
|
|
#ifndef hpux
|
|
strcat (os_name, " ");
|
|
strcat (os_name, utss.release);
|
|
#endif
|
|
return os_name;
|
|
}
|
|
#endif
|
|
|
|
#ifdef X_OS_FILE
|
|
f = fopen(X_OS_FILE, "r");
|
|
if (!f)
|
|
#endif
|
|
#ifdef MOTD_FILE
|
|
f = fopen(MOTD_FILE, "r");
|
|
#endif
|
|
if (f) {
|
|
char motd[512];
|
|
motd[0] = '\0';
|
|
(void) fgets(motd, 511, f);
|
|
fclose(f);
|
|
motd[511] = '\0';
|
|
if (motd[0] != '\0') {
|
|
int len = strlen(motd);
|
|
if (motd[len - 1] == '\n')
|
|
motd[len - 1] = '\0';
|
|
return XtNewString(motd);
|
|
}
|
|
}
|
|
|
|
#ifdef sun
|
|
return XtNewString("SunOS");
|
|
#else
|
|
# if !defined(SYSV) && (defined(CSRG_BASED) || defined(unix))
|
|
return XtNewString("BSD");
|
|
# else
|
|
return NULL;
|
|
# endif
|
|
#endif
|
|
|
|
#endif /*OS_NAME*/
|
|
}
|
|
|
|
/* This is a trick/kludge. To make shared libraries happier (linking
|
|
* against Xmu but not linking against Xt, and apparently even work
|
|
* as we desire on SVR4, we need to avoid an explicit data reference
|
|
* to applicationShellWidgetClass. XtIsTopLevelShell is known
|
|
* (implementation dependent assumption!) to use a bit flag. So we
|
|
* go that far. Then, we test whether it is an applicationShellWidget
|
|
* class by looking for an explicit class name. Seems pretty safe.
|
|
*/
|
|
static Bool
|
|
isApplicationShell(Widget w)
|
|
{
|
|
register WidgetClass c;
|
|
|
|
if (!XtIsTopLevelShell(w))
|
|
return False;
|
|
for (c = XtClass(w); c; c = c->core_class.superclass) {
|
|
if (!strcmp(c->core_class.class_name, "ApplicationShell"))
|
|
return True;
|
|
}
|
|
return False;
|
|
}
|
|
|
|
Boolean
|
|
XmuConvertStandardSelection(Widget w, Time time, Atom *selection, Atom *target,
|
|
Atom *type, XPointer *value,
|
|
unsigned long *length, int *format)
|
|
{
|
|
Display *d = XtDisplay(w);
|
|
if (*target == XA_TIMESTAMP(d)) {
|
|
*value = XtMalloc(4);
|
|
if (sizeof(long) == 4)
|
|
*(long*)*value = time;
|
|
else {
|
|
long temp = time;
|
|
(void) memmove((char*)*value, ((char*)&temp)+sizeof(long)-4, 4);
|
|
}
|
|
*type = XA_INTEGER;
|
|
*length = 1;
|
|
*format = 32;
|
|
return True;
|
|
}
|
|
if (*target == XA_HOSTNAME(d)) {
|
|
char hostname[1024];
|
|
hostname[0] = '\0';
|
|
*length = XmuGetHostname (hostname, sizeof hostname);
|
|
*value = XtNewString(hostname);
|
|
*type = XA_STRING;
|
|
*format = 8;
|
|
return True;
|
|
}
|
|
#if defined(TCPCONN)
|
|
if (*target == XA_IP_ADDRESS(d)) {
|
|
char hostname[1024];
|
|
#ifdef XTHREADS_NEEDS_BYNAMEPARAMS
|
|
_Xgethostbynameparams hparams;
|
|
#endif
|
|
struct hostent *hostp;
|
|
|
|
hostname[0] = '\0';
|
|
(void) XmuGetHostname (hostname, sizeof hostname);
|
|
|
|
if ((hostp = _XGethostbyname (hostname,hparams)) == NULL)
|
|
return False;
|
|
|
|
if (hostp->h_addrtype != AF_INET) return False;
|
|
*length = hostp->h_length;
|
|
*value = XtMalloc(*length);
|
|
(void) memmove (*value, hostp->h_addr, *length);
|
|
*type = XA_NET_ADDRESS(d);
|
|
*format = 8;
|
|
return True;
|
|
}
|
|
#endif
|
|
#ifdef DNETCONN
|
|
if (*target == XA_DECNET_ADDRESS(d)) {
|
|
return False; /* XXX niy */
|
|
}
|
|
#endif
|
|
if (*target == XA_USER(d)) {
|
|
char *name = (char*)getenv("USER");
|
|
if (name == NULL) return False;
|
|
*value = XtNewString(name);
|
|
*type = XA_STRING;
|
|
*length = strlen(name);
|
|
*format = 8;
|
|
return True;
|
|
}
|
|
if (*target == XA_CLASS(d)) {
|
|
Widget parent = XtParent(w);
|
|
char *class;
|
|
int len;
|
|
while (parent != NULL && !isApplicationShell(w)) {
|
|
w = parent;
|
|
parent = XtParent(w);
|
|
}
|
|
if (isApplicationShell(w))
|
|
class = ((ApplicationShellWidget) w)->application.class;
|
|
else
|
|
class = XtClass(w)->core_class.class_name;
|
|
*length = (len=strlen(w->core.name)) + strlen(class) + 2;
|
|
*value = XtMalloc(*length);
|
|
strcpy( (char*)*value, w->core.name );
|
|
strcpy( (char*)*value+len+1, class );
|
|
*type = XA_STRING;
|
|
*format = 8;
|
|
return True;
|
|
}
|
|
if (*target == XA_NAME(d)) {
|
|
Widget parent = XtParent(w);
|
|
|
|
while (parent != NULL && !XtIsWMShell(w)) {
|
|
w = parent;
|
|
parent = XtParent(w);
|
|
}
|
|
if (!XtIsWMShell(w)) return False;
|
|
*value = XtNewString( ((WMShellWidget) w)->wm.title );
|
|
*length = strlen(*value);
|
|
*type = XA_STRING;
|
|
*format = 8;
|
|
return True;
|
|
}
|
|
if (*target == XA_CLIENT_WINDOW(d)) {
|
|
Widget parent = XtParent(w);
|
|
while (parent != NULL) {
|
|
w = parent;
|
|
parent = XtParent(w);
|
|
}
|
|
*value = XtMalloc(sizeof(Window));
|
|
*(Window*)*value = w->core.window;
|
|
*type = XA_WINDOW;
|
|
*length = 1;
|
|
*format = 32;
|
|
return True;
|
|
}
|
|
if (*target == XA_OWNER_OS(d)) {
|
|
*value = get_os_name();
|
|
if (*value == NULL) return False;
|
|
*type = XA_STRING;
|
|
*length = strlen(*value);
|
|
*format = 8;
|
|
return True;
|
|
}
|
|
if (*target == XA_TARGETS(d)) {
|
|
#if defined(unix) && defined(DNETCONN)
|
|
# define NUM_TARGETS 9
|
|
#else
|
|
# if defined(unix) || defined(DNETCONN)
|
|
# define NUM_TARGETS 8
|
|
# else
|
|
# define NUM_TARGETS 7
|
|
# endif
|
|
#endif
|
|
Atom* std_targets = (Atom*)XtMalloc(NUM_TARGETS*sizeof(Atom));
|
|
int i = 0;
|
|
std_targets[i++] = XA_TIMESTAMP(d);
|
|
std_targets[i++] = XA_HOSTNAME(d);
|
|
std_targets[i++] = XA_IP_ADDRESS(d);
|
|
std_targets[i++] = XA_USER(d);
|
|
std_targets[i++] = XA_CLASS(d);
|
|
std_targets[i++] = XA_NAME(d);
|
|
std_targets[i++] = XA_CLIENT_WINDOW(d);
|
|
#ifdef unix
|
|
std_targets[i++] = XA_OWNER_OS(d);
|
|
#endif
|
|
#ifdef DNETCONN
|
|
std_targets[i++] = XA_DECNET_ADDRESS(d);
|
|
#endif
|
|
*value = (XPointer)std_targets;
|
|
*type = XA_ATOM;
|
|
*length = NUM_TARGETS;
|
|
*format = 32;
|
|
return True;
|
|
}
|
|
/* else */
|
|
return False;
|
|
}
|