Blame lib/Mrm/Mrmappl.c

Packit b099d7
/* 
Packit b099d7
 * Motif
Packit b099d7
 *
Packit b099d7
 * Copyright (c) 1987-2012, The Open Group. All rights reserved.
Packit b099d7
 *
Packit b099d7
 * These libraries and programs are free software; you can
Packit b099d7
 * redistribute them and/or modify them under the terms of the GNU
Packit b099d7
 * Lesser General Public License as published by the Free Software
Packit b099d7
 * Foundation; either version 2 of the License, or (at your option)
Packit b099d7
 * any later version.
Packit b099d7
 *
Packit b099d7
 * These libraries and programs are distributed in the hope that
Packit b099d7
 * they will be useful, but WITHOUT ANY WARRANTY; without even the
Packit b099d7
 * implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
Packit b099d7
 * PURPOSE. See the GNU Lesser General Public License for more
Packit b099d7
 * details.
Packit b099d7
 *
Packit b099d7
 * You should have received a copy of the GNU Lesser General Public
Packit b099d7
 * License along with these librararies and programs; if not, write
Packit b099d7
 * to the Free Software Foundation, Inc., 51 Franklin Street, Fifth
Packit b099d7
 * Floor, Boston, MA 02110-1301 USA
Packit b099d7
 */ 
Packit b099d7
/* 
Packit b099d7
 * HISTORY
Packit b099d7
 */ 
Packit b099d7
#ifdef HAVE_CONFIG_H
Packit b099d7
#include <config.h>
Packit b099d7
#endif
Packit b099d7
Packit b099d7
Packit b099d7
#ifdef REV_INFO
Packit b099d7
#ifndef lint
Packit b099d7
static char rcsid[] = "$XConsortium: Mrmappl.c /main/17 1996/11/13 13:59:58 drk $"
Packit b099d7
#endif
Packit b099d7
#endif
Packit b099d7
Packit b099d7
/*                                                                      *
Packit b099d7
 * (c) Copyright 1996 Hewlett-Packard Company                           *
Packit b099d7
 * (c) Copyright 1996 International Business Machines Corp.             *
Packit b099d7
 * (c) Copyright 1996 Sun Microsystems, Inc.                            *
Packit b099d7
 * (c) Copyright 1996 Novell, Inc.                                      *
Packit b099d7
 * (c) Copyright 1989, 1990, 1996 Digital Equipment Corporation.	*
Packit b099d7
 * (c) Copyright 1996 FUJITSU LIMITED.					*
Packit b099d7
 * (c) Copyright 1996 Hitachi.						*
Packit b099d7
 */
Packit b099d7
Packit b099d7
/*
Packit b099d7
 *++
Packit b099d7
 *  FACILITY:
Packit b099d7
 *
Packit b099d7
 *      UIL Resource Manager (URM):
Packit b099d7
 *
Packit b099d7
 *  ABSTRACT:
Packit b099d7
 *
Packit b099d7
 *	These are the top-level routines in URM normally accessible to
Packit b099d7
 *	and used by an application at runtime to access URM facilities.
Packit b099d7
 *
Packit b099d7
 *--
Packit b099d7
 */
Packit b099d7
Packit b099d7
Packit b099d7
/*
Packit b099d7
 *
Packit b099d7
 *  INCLUDE FILES
Packit b099d7
 *
Packit b099d7
 */
Packit b099d7
Packit b099d7
#include <Mrm/MrmAppl.h>
Packit b099d7
#include <Mrm/Mrm.h>
Packit b099d7
#include "MrmMsgI.h"
Packit b099d7
Packit b099d7
Packit b099d7
/*
Packit b099d7
 *
Packit b099d7
 *  TABLE OF CONTENTS
Packit b099d7
 *
Packit b099d7
 *	MrmOpenHierarchy		Open a hierarchy
Packit b099d7
 *
Packit b099d7
 *	MrmOpenHierarchyPerDisplay     	Open a hierarchy taking display arg
Packit b099d7
 *
Packit b099d7
 *	MrmOpenHierarchyFromBuffer	Open a hierarchy from a memory buffer
Packit b099d7
 *
Packit b099d7
 *	MrmCloseHierarchy		Close an open hierarchy
Packit b099d7
 *
Packit b099d7
 *	MrmRegisterClass		Register a widget class
Packit b099d7
 *
Packit b099d7
 *	MrmFetchInterfaceModule		Fetch widgets in an interface module
Packit b099d7
 *
Packit b099d7
 *	MrmFetchWidget			Fetch a widget
Packit b099d7
 *
Packit b099d7
 *	MrmFetchWidgetOverride		Fetch a widget, overriding name, args
Packit b099d7
 *
Packit b099d7
 *	MrmFetchSetValues		Do SetValues from UID literals
Packit b099d7
 *
Packit b099d7
 */
Packit b099d7
Packit b099d7
Packit b099d7

Packit b099d7
/*
Packit b099d7
 *++
Packit b099d7
 *
Packit b099d7
 *  PROCEDURE DESCRIPTION:
Packit b099d7
 *
Packit b099d7
 *	This routine allocates a hierarchy descriptor, and opens
Packit b099d7
 *	all the IDB files in the hierarchy. It initializes the
Packit b099d7
 *	optimized search lists in the hierarchy from the open files.
Packit b099d7
 *	All files are closed if there are any errors.
Packit b099d7
 *
Packit b099d7
 *  FORMAL PARAMETERS:
Packit b099d7
 *
Packit b099d7
 *	num_files		The number of files in the name list
Packit b099d7
 *	name_list		A list of the file names
Packit b099d7
 *	os_ext_list		A list of system-dependent ancillary
Packit b099d7
 *				structures corresponding to the files.
Packit b099d7
 *				This parameter may be NULL.
Packit b099d7
 *	hierarchy_id_return	To return the hierarchy id
Packit b099d7
 *
Packit b099d7
 *  IMPLICIT INPUTS:
Packit b099d7
 *
Packit b099d7
 *  IMPLICIT OUTPUTS:
Packit b099d7
 *
Packit b099d7
 *  FUNCTION VALUE:
Packit b099d7
 *
Packit b099d7
 *	MrmSUCCESS	operation succeeded
Packit b099d7
 *	MrmFAILURE	operation failed, no further reason
Packit b099d7
 *	Others		see UrmIdbOpenFileRead
Packit b099d7
 *
Packit b099d7
 *  SIDE EFFECTS:
Packit b099d7
 *
Packit b099d7
 *--
Packit b099d7
 */
Packit b099d7
Packit b099d7
Cardinal 
Packit b099d7
MrmOpenHierarchy (
Packit b099d7
#if NeedWidePrototypes
Packit b099d7
		  int			num_files,
Packit b099d7
#else
Packit b099d7
		  MrmCount		num_files,
Packit b099d7
#endif
Packit b099d7
		  String		*name_list,
Packit b099d7
		  MrmOsOpenParamPtr	*os_ext_list,
Packit b099d7
		  MrmHierarchy		*hierarchy_id_return)
Packit b099d7
{
Packit b099d7
Packit b099d7
  /*
Packit b099d7
   *  Local variables
Packit b099d7
   */
Packit b099d7
  Cardinal result;
Packit b099d7
Packit b099d7
  _MrmProcessLock();
Packit b099d7
  result = Urm__OpenHierarchy
Packit b099d7
    (num_files, name_list, os_ext_list, hierarchy_id_return, FALSE, NULL);
Packit b099d7
  _MrmProcessUnlock();
Packit b099d7
Packit b099d7
  return result;
Packit b099d7
}
Packit b099d7
Packit b099d7

Packit b099d7
/*
Packit b099d7
 *++
Packit b099d7
 *
Packit b099d7
 *  PROCEDURE DESCRIPTION:
Packit b099d7
 *
Packit b099d7
 *	This routine allocates a hierarchy descriptor, and opens
Packit b099d7
 *	all the IDB files in the hierarchy. It initializes the
Packit b099d7
 *	optimized search lists in the hierarchy from the open files.
Packit b099d7
 *	All files are closed if there are any errors.
Packit b099d7
 *
Packit b099d7
 *  FORMAL PARAMETERS:
Packit b099d7
 *
Packit b099d7
 *	display			The Display to be passed to XtResolvePathname
Packit b099d7
 *	num_files		The number of files in the name list
Packit b099d7
 *	name_list		A list of the file names
Packit b099d7
 *	os_ext_list		A list of system-dependent ancillary
Packit b099d7
 *				structures corresponding to the files.
Packit b099d7
 *				This parameter may be NULL.
Packit b099d7
 *	hierarchy_id_return	To return the hierarchy id
Packit b099d7
 *
Packit b099d7
 *  IMPLICIT INPUTS:
Packit b099d7
 *
Packit b099d7
 *  IMPLICIT OUTPUTS:
Packit b099d7
 *
Packit b099d7
 *  FUNCTION VALUE:
Packit b099d7
 *
Packit b099d7
 *	MrmSUCCESS	operation succeeded
Packit b099d7
 *	MrmFAILURE	operation failed, no further reason
Packit b099d7
 *	Others		see UrmIdbOpenFileRead
Packit b099d7
 *
Packit b099d7
 *  SIDE EFFECTS:
Packit b099d7
 *
Packit b099d7
 *--
Packit b099d7
 */
Packit b099d7
Packit b099d7
Cardinal 
Packit b099d7
MrmOpenHierarchyPerDisplay (Display		*display,
Packit b099d7
#if NeedWidePrototypes
Packit b099d7
			    int			num_files,
Packit b099d7
#else
Packit b099d7
			    MrmCount		num_files,
Packit b099d7
#endif
Packit b099d7
			    String		*name_list,
Packit b099d7
			    MrmOsOpenParamPtr	*os_ext_list,
Packit b099d7
			    MrmHierarchy	*hierarchy_id_return)
Packit b099d7
{
Packit b099d7
Packit b099d7
  /*
Packit b099d7
   *  Local variables
Packit b099d7
   */
Packit b099d7
  MrmOsOpenParam	os_data;
Packit b099d7
  MrmOsOpenParamPtr	new_os_ext_list = &os_data;
Packit b099d7
  Cardinal		result;
Packit b099d7
Packit b099d7
  _MrmProcessLock();
Packit b099d7
 
Packit b099d7
  if (os_ext_list == NULL) 
Packit b099d7
    os_ext_list = (MrmOsOpenParamPtr *)&new_os_ext_list;
Packit b099d7
      
Packit b099d7
  (*os_ext_list)->display = display;
Packit b099d7
  
Packit b099d7
  result = Urm__OpenHierarchy(num_files, name_list, os_ext_list, 
Packit b099d7
			      hierarchy_id_return, FALSE, NULL);
Packit b099d7
  _MrmProcessUnlock();
Packit b099d7
  return result;
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7

Packit b099d7
/*
Packit b099d7
 *++
Packit b099d7
 *
Packit b099d7
 *  PROCEDURE DESCRIPTION:
Packit b099d7
 *
Packit b099d7
 *	MrmOpenHierarcyFromBuffer opens a buffer containing the
Packit b099d7
 *	memory image of a UID file.
Packit b099d7
 *
Packit b099d7
 *  FORMAL PARAMETERS:
Packit b099d7
 *
Packit b099d7
 *	hierarchy_id	ID of an open URM database hierarchy
Packit b099d7
 *
Packit b099d7
 *  IMPLICIT INPUTS:
Packit b099d7
 *
Packit b099d7
 *  IMPLICIT OUTPUTS:
Packit b099d7
 *
Packit b099d7
 *  FUNCTION VALUE:
Packit b099d7
 *
Packit b099d7
Packit b099d7
 *	MrmSUCCESS	operation succeeded
Packit b099d7
 *	MrmFAILURE	operation failed, no further reason
Packit b099d7
 *
Packit b099d7
 *  SIDE EFFECTS:
Packit b099d7
 *
Packit b099d7
 *--
Packit b099d7
 */
Packit b099d7
Packit b099d7
Cardinal
Packit b099d7
MrmOpenHierarchyFromBuffer (unsigned char	*uid_buffer,
Packit b099d7
			    MrmHierarchy	*hierarchy_id_return)
Packit b099d7
{
Packit b099d7
Packit b099d7
  /*
Packit b099d7
   *  Local variables
Packit b099d7
   */
Packit b099d7
  Cardinal		result;
Packit b099d7
Packit b099d7
  _MrmProcessLock();
Packit b099d7
  result = Urm__OpenHierarchy((MrmCount) 1, NULL, NULL, 
Packit b099d7
			      hierarchy_id_return, TRUE, uid_buffer);
Packit b099d7
  _MrmProcessUnlock();
Packit b099d7
  return result;
Packit b099d7
}
Packit b099d7

Packit b099d7
/*
Packit b099d7
 *++
Packit b099d7
 *
Packit b099d7
 *  PROCEDURE DESCRIPTION:
Packit b099d7
 *
Packit b099d7
 *	MrmCloseHierarchy closes a URM search hierarchy.
Packit b099d7
 *
Packit b099d7
 *  FORMAL PARAMETERS:
Packit b099d7
 *
Packit b099d7
 *	hierarchy_id	ID of an open URM database hierarchy
Packit b099d7
 *
Packit b099d7
 *  IMPLICIT INPUTS:
Packit b099d7
 *
Packit b099d7
 *  IMPLICIT OUTPUTS:
Packit b099d7
 *
Packit b099d7
 *  FUNCTION VALUE:
Packit b099d7
 *
Packit b099d7
Packit b099d7
 *	MrmSUCCESS	operation succeeded
Packit b099d7
 *	MrmFAILURE	operation failed, no further reason
Packit b099d7
 *
Packit b099d7
 *  SIDE EFFECTS:
Packit b099d7
 *
Packit b099d7
 *--
Packit b099d7
 */
Packit b099d7
Packit b099d7
Cardinal 
Packit b099d7
MrmCloseHierarchy (MrmHierarchy                hierarchy_id)
Packit b099d7
{
Packit b099d7
Packit b099d7
  /*
Packit b099d7
   *  Local variables
Packit b099d7
   */
Packit b099d7
  Cardinal		result;
Packit b099d7
Packit b099d7
  _MrmProcessLock();
Packit b099d7
  result = Urm__CloseHierarchy (hierarchy_id);
Packit b099d7
  _MrmProcessUnlock();
Packit b099d7
  return result;
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7

Packit b099d7
/*
Packit b099d7
 *++
Packit b099d7
 *
Packit b099d7
 *  PROCEDURE DESCRIPTION:
Packit b099d7
 *
Packit b099d7
 *	This routine registers a vector of names and associated values
Packit b099d7
 *	for access in URM. The values may be callback routines, pointers
Packit b099d7
 *	to user-defined data, or any other values. The information provided
Packit b099d7
 *	is used exactly as registered callback information is used.
Packit b099d7
 *
Packit b099d7
 *	The names in the list are case-sensitive, as usual. The list may
Packit b099d7
 *	either ordered or unordered; this routine will detect lexicographic
Packit b099d7
 *	ordering if it exists, and exploit it.
Packit b099d7
 *
Packit b099d7
 *	For details on callbacks in URM, consult XmRegisterMRMCallbacks.
Packit b099d7
 *
Packit b099d7
 *  FORMAL PARAMETERS:
Packit b099d7
 *
Packit b099d7
 *	reglist		A list of name/value pairs for the names to
Packit b099d7
 *			be registered. Each name is a case-sensitive
Packit b099d7
 *			nul-terminated ASCII string. Each value is
Packit b099d7
 *			a 32-bit quantity, interpreted as a procedure
Packit b099d7
 *			address if the name is a callback routine, and
Packit b099d7
 *			uninterpreted otherwise.
Packit b099d7
 *	num_reg		The number of entries in reglist.
Packit b099d7
 *
Packit b099d7
 *  IMPLICIT INPUTS:
Packit b099d7
 *
Packit b099d7
 *  IMPLICIT OUTPUTS:
Packit b099d7
 *
Packit b099d7
 *  FUNCTION VALUE:
Packit b099d7
 *
Packit b099d7
 *  SIDE EFFECTS:
Packit b099d7
 *
Packit b099d7
 *--
Packit b099d7
 */
Packit b099d7
Packit b099d7
Cardinal 
Packit b099d7
MrmRegisterNames (MrmRegisterArglist		reglist,
Packit b099d7
#if NeedWidePrototypes
Packit b099d7
		  int				num_reg
Packit b099d7
#else
Packit b099d7
		  MrmCount			num_reg
Packit b099d7
#endif 
Packit b099d7
		  )
Packit b099d7
{
Packit b099d7
Packit b099d7
  /*
Packit b099d7
   *  Local variables
Packit b099d7
   */
Packit b099d7
  Cardinal		result;		/* function result */
Packit b099d7
  String		*names;		/* vector of names */
Packit b099d7
  XtPointer		*values;	/* vector of values */
Packit b099d7
  int			ndx;		/* loop index */
Packit b099d7
Packit b099d7
Packit b099d7
  _MrmProcessLock();
Packit b099d7
  /*
Packit b099d7
   * Construct RegisterNames vectors, and call the WCI routine
Packit b099d7
   */
Packit b099d7
  names = (String *) XtMalloc (num_reg*sizeof(String));
Packit b099d7
  values = (XtPointer *) XtMalloc (num_reg*sizeof(XtPointer));
Packit b099d7
  for ( ndx=0 ; ndx
Packit b099d7
    {
Packit b099d7
      names[ndx] = reglist[ndx].name;
Packit b099d7
      values[ndx] = reglist[ndx].value;
Packit b099d7
    }
Packit b099d7
Packit b099d7
  result = Urm__WCI_RegisterNames (names, values, num_reg);
Packit b099d7
  XtFree ((char*)names);
Packit b099d7
  XtFree ((char*)values);
Packit b099d7
  _MrmProcessUnlock();
Packit b099d7
  return result;
Packit b099d7
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7

Packit b099d7
/*
Packit b099d7
 *++
Packit b099d7
 *
Packit b099d7
 *  PROCEDURE DESCRIPTION:
Packit b099d7
 *
Packit b099d7
 *	This routine registers a vector of names and associated values for
Packit b099d7
 *	access in URM within a specific hierarchy. It is similar to
Packit b099d7
 *	MrmRegisterNames, except that the names have scope only over the
Packit b099d7
 *	hierarchy rather than global scope. For information on the names
Packit b099d7
 *	and values, see MrmRegister Names.
Packit b099d7
 *
Packit b099d7
 *  FORMAL PARAMETERS:
Packit b099d7
 *
Packit b099d7
 *	hierarchy_id	An open hierarchy descriptor.
Packit b099d7
 *	reglist		A list of name/value pairs for the names to
Packit b099d7
 *			be registered. Each name is a case-sensitive
Packit b099d7
 *			nul-terminated ASCII string. Each value is
Packit b099d7
 *			a 32-bit quantity, interpreted as a procedure
Packit b099d7
 *			address if the name is a callback routine, and
Packit b099d7
 *			uninterpreted otherwise.
Packit b099d7
 *	num_reg		The number of entries in reglist.
Packit b099d7
 *
Packit b099d7
 *  IMPLICIT INPUTS:
Packit b099d7
 *
Packit b099d7
 *  IMPLICIT OUTPUTS:
Packit b099d7
 *
Packit b099d7
 *  FUNCTION VALUE:
Packit b099d7
 *
Packit b099d7
 *  SIDE EFFECTS:
Packit b099d7
 *
Packit b099d7
 *--
Packit b099d7
 */
Packit b099d7
Packit b099d7
Cardinal 
Packit b099d7
MrmRegisterNamesInHierarchy (MrmHierarchy		hierarchy_id,
Packit b099d7
			     MrmRegisterArglist		reglist,
Packit b099d7
#if NeedWidePrototypes
Packit b099d7
			     int		num_reg
Packit b099d7
#else
Packit b099d7
			     MrmCount			num_reg
Packit b099d7
#endif 
Packit b099d7
			     )
Packit b099d7
{
Packit b099d7
Packit b099d7
  /*
Packit b099d7
   *  Local variables
Packit b099d7
   */
Packit b099d7
  Cardinal		result;		/* function result */
Packit b099d7
  String		*names;		/* vector of names */
Packit b099d7
  XtPointer		*values;	/* vector of values */
Packit b099d7
  int			ndx;		/* loop index */
Packit b099d7
Packit b099d7
  _MrmProcessLock();
Packit b099d7
  /*
Packit b099d7
   * Construct RegisterNames vectors, and call the hierarchy routine
Packit b099d7
   */
Packit b099d7
  names = (String *) XtMalloc (num_reg*sizeof(String));
Packit b099d7
  values = (XtPointer *) XtMalloc (num_reg*sizeof(XtPointer));
Packit b099d7
  for ( ndx=0 ; ndx
Packit b099d7
    {
Packit b099d7
      names[ndx] = reglist[ndx].name;
Packit b099d7
      values[ndx] = reglist[ndx].value;
Packit b099d7
    }
Packit b099d7
Packit b099d7
  result = Urm__RegisterNamesInHierarchy
Packit b099d7
    (hierarchy_id, names, values, num_reg);
Packit b099d7
  XtFree ((char*)names);
Packit b099d7
  XtFree ((char*)values);
Packit b099d7
  _MrmProcessUnlock();
Packit b099d7
  return result;
Packit b099d7
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7

Packit b099d7
/*
Packit b099d7
 *++
Packit b099d7
 *
Packit b099d7
 *  PROCEDURE DESCRIPTION:
Packit b099d7
 *
Packit b099d7
 *	MrmFetchInterfaceModule fetches all the widgets defined in some
Packit b099d7
 *	interface module in the URM database hierarchy. Typically, each
Packit b099d7
 *	application has one or more modules which define its interface;
Packit b099d7
 *	each must be fetched in order to initialize all the widgets the
Packit b099d7
 *	application requires. Applications are not constrained to have all
Packit b099d7
 *	their widgets defined in a single module.
Packit b099d7
 *
Packit b099d7
 *	If the module defines a main window widget, MrmFetchInterfaceModule
Packit b099d7
 *	returns its id. If no main window widget is contained in the module,
Packit b099d7
 *	NULL is returned. No widgets are realized. The ids of widgets other
Packit b099d7
 *	than the main window may be obtained using creation callbacks.
Packit b099d7
 *
Packit b099d7
 *  FORMAL PARAMETERS:
Packit b099d7
 *
Packit b099d7
 *	hierarchy_id	Hierarchy containing interface definition
Packit b099d7
 *	module_name	Name of interface module defining top level of
Packit b099d7
 *			interface; by convention, this is usually the generic
Packit b099d7
 *			name of the application
Packit b099d7
 *	parent		The parent widget for the topmost widgets being
Packit b099d7
 *			fetched from the module. Usually the top-level
Packit b099d7
 *			widget.
Packit b099d7
 *	w_return	To return the widget id of the main window widget
Packit b099d7
 *			for the application
Packit b099d7
 *
Packit b099d7
 *  IMPLICIT INPUTS:
Packit b099d7
 *
Packit b099d7
 *  IMPLICIT OUTPUTS:
Packit b099d7
 *
Packit b099d7
 *  FUNCTION VALUE:
Packit b099d7
 *
Packit b099d7
 *	MrmSUCCESS	operation succeeded
Packit b099d7
 *	MrmNOT_FOUND	interface module or topmost widget not found
Packit b099d7
 *	MrmFAILURE	Couldn't complete initialization
Packit b099d7
 *
Packit b099d7
 *  SIDE EFFECTS:
Packit b099d7
 *
Packit b099d7
 *--
Packit b099d7
 */
Packit b099d7
Packit b099d7
/*ARGSUSED*/
Packit b099d7
Cardinal 
Packit b099d7
MrmFetchInterfaceModule (MrmHierarchy		hierarchy_id,
Packit b099d7
			 char			*module_name,
Packit b099d7
			 Widget			parent,
Packit b099d7
			 Widget			*w_return) /* unused */
Packit b099d7
Packit b099d7
{
Packit b099d7
Packit b099d7
  /*
Packit b099d7
   *  Local variables
Packit b099d7
   */
Packit b099d7
  Cardinal		result;		/* function results */
Packit b099d7
  URMResourceContextPtr	mod_context;	/* context containing module */
Packit b099d7
  RGMModuleDescPtr	modptr;		/* Interface module in context */
Packit b099d7
  int			ndx;		/* loop index */
Packit b099d7
  Widget		cur_w;		/* current widget id */
Packit b099d7
  MrmType		class;		/* current widget class */
Packit b099d7
  IDBFile		hfile_id;	/* file where module was found */
Packit b099d7
  _MrmWidgetToAppContext(parent);
Packit b099d7
Packit b099d7
  _MrmAppLock(app);
Packit b099d7
  _MrmProcessLock();
Packit b099d7
  /*
Packit b099d7
   * Validate the hierachy, then attempt to fetch the module.
Packit b099d7
   */
Packit b099d7
  if ( hierarchy_id == NULL )
Packit b099d7
    {
Packit b099d7
      result = Urm__UT_Error ("MrmFetchInterfaceModule", _MrmMMsg_0023,
Packit b099d7
			      NULL, NULL, MrmBAD_HIERARCHY);
Packit b099d7
      _MrmProcessUnlock();
Packit b099d7
      _MrmAppUnlock(app);
Packit b099d7
      return result;
Packit b099d7
    }
Packit b099d7
Packit b099d7
  if ( ! MrmHierarchyValid(hierarchy_id) )
Packit b099d7
    {
Packit b099d7
      result = Urm__UT_Error ("MrmFetchInterfaceModule", _MrmMMsg_0024,
Packit b099d7
			      NULL, NULL, MrmBAD_HIERARCHY);
Packit b099d7
      _MrmProcessUnlock();
Packit b099d7
      _MrmAppUnlock(app);
Packit b099d7
      return result;
Packit b099d7
    }
Packit b099d7
Packit b099d7
  result = UrmGetResourceContext (NULL, NULL, 0, &mod_context);
Packit b099d7
  if ( result != MrmSUCCESS ) 
Packit b099d7
    {
Packit b099d7
      _MrmProcessUnlock();
Packit b099d7
      _MrmAppUnlock(app);
Packit b099d7
      return result;
Packit b099d7
    }
Packit b099d7
Packit b099d7
  result = UrmIFMHGetModule (hierarchy_id, module_name, mod_context, &hfile_id);
Packit b099d7
  if ( result != MrmSUCCESS )
Packit b099d7
    {
Packit b099d7
      UrmFreeResourceContext (mod_context);
Packit b099d7
      _MrmProcessUnlock();
Packit b099d7
      _MrmAppUnlock(app);
Packit b099d7
      return result;
Packit b099d7
    }
Packit b099d7
Packit b099d7
  /*
Packit b099d7
   * We have the module. Loop through all the widgets it defines, and fetch
Packit b099d7
   * each one.
Packit b099d7
   */
Packit b099d7
  modptr = (RGMModuleDescPtr) UrmRCBuffer (mod_context);
Packit b099d7
  if ( ! UrmInterfaceModuleValid(modptr) )
Packit b099d7
    {
Packit b099d7
      UrmFreeResourceContext (mod_context);
Packit b099d7
      result = Urm__UT_Error ("MrmFetchInterfaceModule", _MrmMMsg_0025,
Packit b099d7
			      NULL, mod_context, MrmBAD_IF_MODULE);
Packit b099d7
      _MrmProcessUnlock();
Packit b099d7
      _MrmAppUnlock(app);
Packit b099d7
      return result;
Packit b099d7
    }
Packit b099d7
Packit b099d7
  for ( ndx=0 ; ndx<modptr->count ; ndx++ )
Packit b099d7
    {
Packit b099d7
      result = MrmFetchWidget (hierarchy_id, modptr->topmost[ndx].index,
Packit b099d7
			       parent, &cur_w, &class);
Packit b099d7
      if ( result != MrmSUCCESS )
Packit b099d7
        {
Packit b099d7
	  UrmFreeResourceContext (mod_context);
Packit b099d7
	  _MrmProcessUnlock();
Packit b099d7
	  _MrmAppUnlock(app);
Packit b099d7
	  return result;
Packit b099d7
        }
Packit b099d7
    }
Packit b099d7
Packit b099d7
  /*
Packit b099d7
   * successfully fetched all widgets
Packit b099d7
   */
Packit b099d7
  UrmFreeResourceContext (mod_context);
Packit b099d7
  _MrmProcessUnlock();
Packit b099d7
  _MrmAppUnlock(app);
Packit b099d7
  return MrmSUCCESS;
Packit b099d7
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7

Packit b099d7
/*
Packit b099d7
 *++
Packit b099d7
 *
Packit b099d7
 *  PROCEDURE DESCRIPTION:
Packit b099d7
 *
Packit b099d7
 *	MrmFetchWidget fetchs any indexed application widget. As usual in fetch
Packit b099d7
 *	operations, the fetched widget's subtree is also fetched. There are
Packit b099d7
 *	no constraints on this widget except that it must not also appear
Packit b099d7
 *	as the child of some widget within its own subtree, i.e. there must
Packit b099d7
 *	be no cycles in the subtree graph! MrmFetchWidget does not do a
Packit b099d7
 *	XtManageChild for the newly created widget.
Packit b099d7
 *
Packit b099d7
 *	The semantics of the URM database require that any widget which is to
Packit b099d7
 *	be fetched with MrmFetchWidget meet the following requirements:
Packit b099d7
 *
Packit b099d7
 *		o Not be referenced as the child of any widget in the database
Packit b099d7
 *
Packit b099d7
 *		o Be indexed
Packit b099d7
 *
Packit b099d7
 *	MrmFetchWidget replaces XmFetchTopmost, and is used to fetch
Packit b099d7
 *	topmost widgets where MrmFetchInterfaceModule is not used. A topmost
Packit b099d7
 *	widget is either the main window or any indexed widget whose parent is
Packit b099d7
 *	the top-level widget. MrmFetchWidget may be called at any time to fetch
Packit b099d7
 *	a widget which was not fetched at application startup. MrmFetchWidget
Packit b099d7
 *	determines if a widget has already been fetched by checking *w_return
Packit b099d7
 *	for a NULL value. Non-NULL values signify that the widget already
Packit b099d7
 *	has been fetched, and MrmFetchWidget no-ops. (If the toolkit ever
Packit b099d7
 *	supplies a validation routine for widgets, this will be used in
Packit b099d7
 *	place of a non-NULL check). Thus MrmFetchWidget may be used to
Packit b099d7
 *	defer fetching popup widgets until they are first referenced
Packit b099d7
 *	(presumably in a callback), and then fetching them once.
Packit b099d7
 *
Packit b099d7
 *	MrmFetchWidget may also be used to make multiple instances of a
Packit b099d7
 *	widget (and its subtree). In this case, the UID definition functions
Packit b099d7
 *	as a skeleton; there are no constraints on how many times a widget
Packit b099d7
 *	definition may be fetched. The only requirement is the *w_return be
Packit b099d7
 *	NULL on each call. This may be used to make multiple copies of
Packit b099d7
 *	a widget in e.g. a dialog box or menu (to construct a uniform form).
Packit b099d7
 *
Packit b099d7
 *	The index which identifies the widget must be known to the application
Packit b099d7
 *	via previous agreement.
Packit b099d7
 *	MrmFetchWidget will successfully fetch topmost widgets as long as the
Packit b099d7
 *	parent parameter is correct (the top-level widget), and this
Packit b099d7
 *	replaces XmFetchTopmost (which vanishes).
Packit b099d7
 *
Packit b099d7
 *  FORMAL PARAMETERS:
Packit b099d7
 *
Packit b099d7
 *	hierarchy_id	Hierarchy containing interface definition
Packit b099d7
 *	index		The index of the widget to fetch.
Packit b099d7
 *	parent		ID of the parent widget
Packit b099d7
 *	w_return	To return the widget id of the created widget.
Packit b099d7
 *			*w_return must be NULL or MrmFetchWidget no-ops.
Packit b099d7
 *	class_return	To return the code identifying the widget class.
Packit b099d7
 *			This is principally used to distinguish main window
Packit b099d7
 *			and other toolkit widgets. It will be one of the
Packit b099d7
 *			URMwc... codes defined in MRM.h. The code
Packit b099d7
 *			for a main window is URMwcMainWindow.
Packit b099d7
 *
Packit b099d7
 *  IMPLICIT INPUTS:
Packit b099d7
 *
Packit b099d7
 *  IMPLICIT OUTPUTS:
Packit b099d7
 *
Packit b099d7
 *  FUNCTION VALUE:
Packit b099d7
 *
Packit b099d7
 *	MrmSUCCESS	operation succeeded
Packit b099d7
 *	MrmNOT_FOUND	widget not found in database
Packit b099d7
 *	MrmFAILURE	operation failed, no further reason
Packit b099d7
 *
Packit b099d7
 *  SIDE EFFECTS:
Packit b099d7
 *
Packit b099d7
 *--
Packit b099d7
 */
Packit b099d7
Packit b099d7
Cardinal 
Packit b099d7
MrmFetchWidget (MrmHierarchy                hierarchy_id,
Packit b099d7
		String                      index,
Packit b099d7
		Widget                      parent,
Packit b099d7
		Widget                      *w_return,
Packit b099d7
		MrmType                     *class_return)
Packit b099d7
{
Packit b099d7
Packit b099d7
  return MrmFetchWidgetOverride (hierarchy_id, index, parent,
Packit b099d7
				 NULL, NULL, 0, w_return, class_return);
Packit b099d7
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7

Packit b099d7
/*
Packit b099d7
 *++
Packit b099d7
 *
Packit b099d7
 *  PROCEDURE DESCRIPTION:
Packit b099d7
 *
Packit b099d7
 *	This procedure is the extended version of MrmFetchWidget. It is
Packit b099d7
 *	identical to MrmFetchWidget in all respsects, except that it allows
Packit b099d7
 *	the caller to override the widget's name and any number of the
Packit b099d7
 *	arguments which would otherwise receive from the UID database or
Packit b099d7
 *	one of the defaulting mechanisms (i.e. the override is not limited
Packit b099d7
 *	to those arguments in the UID file).
Packit b099d7
 *
Packit b099d7
 *	The override parameters apply only to the widget fetched and returned
Packit b099d7
 *	by this procedure; its children (subtree) do not receive any override
Packit b099d7
 *	parameters.
Packit b099d7
 *
Packit b099d7
 *  FORMAL PARAMETERS:
Packit b099d7
 *
Packit b099d7
 *	hierarchy_id	Hierarchy containing interface definition
Packit b099d7
 *	index		The index of the widget to fetch.
Packit b099d7
 *	parent		ID of the parent widget
Packit b099d7
 *	ov_name		Name to override widget name (NULL for no override)
Packit b099d7
 *	ov_args		Override arglist, exactly as would be given to
Packit b099d7
 *			XtCreateWidget (conversion complete, etc). NULL
Packit b099d7
 *			for no override.
Packit b099d7
 *	ov_num_args	# args in ov_args; 0 for no override
Packit b099d7
 *	w_return	To return the widget id of the created widget.
Packit b099d7
 *			*w_return must be NULL or MrmFetchWidget no-ops.
Packit b099d7
 *	class_return	To return the code identifying the widget class.
Packit b099d7
 *			This is principally used to distinguish main window
Packit b099d7
 *			and other toolkit widgets. It will be one of the
Packit b099d7
 *			URMwc... codes defined in MRM.h. The code
Packit b099d7
 *			for a main window is URMwcMainWindow.
Packit b099d7
 *
Packit b099d7
 *  IMPLICIT INPUTS:
Packit b099d7
 *
Packit b099d7
 *  IMPLICIT OUTPUTS:
Packit b099d7
 *
Packit b099d7
 *  FUNCTION VALUE:
Packit b099d7
 *
Packit b099d7
 *	MrmSUCCESS	operation succeeded
Packit b099d7
 *	MrmNOT_FOUND	widget not found in database
Packit b099d7
 *	MrmFAILURE	operation failed, no further reason
Packit b099d7
 *
Packit b099d7
 *  SIDE EFFECTS:
Packit b099d7
 *
Packit b099d7
 *--
Packit b099d7
 */
Packit b099d7
Packit b099d7
Cardinal 
Packit b099d7
MrmFetchWidgetOverride (MrmHierarchy		hierarchy_id,
Packit b099d7
			String			index,
Packit b099d7
			Widget			parent,
Packit b099d7
			String			ov_name,
Packit b099d7
			ArgList			ov_args,
Packit b099d7
			Cardinal		ov_num_args,
Packit b099d7
			Widget			*w_return,
Packit b099d7
			MrmType			*class_return)
Packit b099d7
{
Packit b099d7
Packit b099d7
  /*
Packit b099d7
   *  Local variables
Packit b099d7
   */
Packit b099d7
  Cardinal		result;		/* function results */
Packit b099d7
  URMResourceContextPtr	w_context;	/* context containing widget */
Packit b099d7
  RGMWidgetRecordPtr	widgetrec;	/* widget record in context */
Packit b099d7
  IDBFile		hfile_id;	/* file in widget was found */
Packit b099d7
  URMResourceContextPtr	wref_ctx;	/* for widget references */
Packit b099d7
  URMSetValuesDescPtr	svlist = NULL;	/* list of SetValues descriptors */
Packit b099d7
  int			ndx ;		/* loop index */
Packit b099d7
  char			errmsg[300];
Packit b099d7
  _MrmWidgetToAppContext(parent);
Packit b099d7
Packit b099d7
  _MrmAppLock(app);
Packit b099d7
  _MrmProcessLock();
Packit b099d7
Packit b099d7
  /*
Packit b099d7
   * Validate the hierachy, then attempt to fetch the widget
Packit b099d7
   */
Packit b099d7
  if ( hierarchy_id == NULL )
Packit b099d7
    {
Packit b099d7
      result = Urm__UT_Error ("MrmFetchWidgetOverride", _MrmMMsg_0023,
Packit b099d7
			      NULL, NULL, MrmBAD_HIERARCHY);
Packit b099d7
      _MrmProcessUnlock();
Packit b099d7
      _MrmAppUnlock(app);
Packit b099d7
      return result;
Packit b099d7
    }
Packit b099d7
Packit b099d7
  if ( ! MrmHierarchyValid(hierarchy_id) )
Packit b099d7
    {
Packit b099d7
      result = Urm__UT_Error ("MrmFetchWidgetOverride", _MrmMMsg_0024,
Packit b099d7
			      NULL, NULL, MrmBAD_HIERARCHY);
Packit b099d7
      _MrmProcessUnlock();
Packit b099d7
      _MrmAppUnlock(app);
Packit b099d7
      return result;
Packit b099d7
    }
Packit b099d7
Packit b099d7
  result = UrmGetResourceContext (NULL, NULL, 300, &w_context);
Packit b099d7
  if ( result != MrmSUCCESS ) 
Packit b099d7
    {
Packit b099d7
      _MrmProcessUnlock();
Packit b099d7
      _MrmAppUnlock(app);
Packit b099d7
      return result;
Packit b099d7
    }
Packit b099d7
Packit b099d7
  result = UrmHGetWidget (hierarchy_id, index, w_context, &hfile_id);
Packit b099d7
  if ( result != MrmSUCCESS )
Packit b099d7
    {
Packit b099d7
      UrmFreeResourceContext (w_context);
Packit b099d7
      _MrmProcessUnlock();
Packit b099d7
      _MrmAppUnlock(app);
Packit b099d7
      return result;
Packit b099d7
    }
Packit b099d7
Packit b099d7
  /*
Packit b099d7
   * Validate the widget record, then set the class return. Then instantiate the
Packit b099d7
   * widget and its subtree.
Packit b099d7
   */
Packit b099d7
  widgetrec = (RGMWidgetRecordPtr) UrmRCBuffer (w_context);
Packit b099d7
  if ( ! UrmWRValid(widgetrec) )
Packit b099d7
    {
Packit b099d7
      UrmFreeResourceContext (w_context);
Packit b099d7
      result = Urm__UT_Error ("MrmFetchWidgetOverride", _MrmMMsg_0026,
Packit b099d7
			      NULL, w_context, MrmFAILURE);
Packit b099d7
      _MrmProcessUnlock();
Packit b099d7
      _MrmAppUnlock(app);
Packit b099d7
      return result;
Packit b099d7
    }
Packit b099d7
  /*
Packit b099d7
   * The following test breaks compatibility with the CDE1.0
Packit b099d7
   * version of Mrm and cannot be done for CDEnext.
Packit b099d7
   * 
Packit b099d7
   *   if (widgetrec->access == URMaPrivate)
Packit b099d7
   *     {
Packit b099d7
   *       UrmFreeResourceContext (w_context);
Packit b099d7
   *       sprintf(errmsg, _MrmMMsg_0119, index);
Packit b099d7
   *       result = Urm__UT_Error("MrmFetchWidgetOverride", errmsg,
Packit b099d7
   * 			     NULL, w_context, MrmFAILURE);
Packit b099d7
   *       _MrmProcessUnlock();
Packit b099d7
   *       _MrmAppUnlock(app);
Packit b099d7
   *       return result;
Packit b099d7
   *     }
Packit b099d7
   */
Packit b099d7
Packit b099d7
  *class_return = widgetrec->type;
Packit b099d7
Packit b099d7
  Urm__CW_InitWRef (&wref_ctx);
Packit b099d7
  result = UrmCreateWidgetTree (w_context, parent, hierarchy_id, hfile_id,
Packit b099d7
				ov_name, ov_args, ov_num_args,
Packit b099d7
				URMrIndex, index, 0L, MrmManageDefault, 
Packit b099d7
				(URMPointerListPtr *)&svlist, wref_ctx, 
Packit b099d7
				w_return);
Packit b099d7
  UrmFreeResourceContext (w_context);
Packit b099d7
  if ( result != MrmSUCCESS ) 
Packit b099d7
    {
Packit b099d7
      _MrmProcessUnlock();
Packit b099d7
      _MrmAppUnlock(app);
Packit b099d7
      return result;
Packit b099d7
    }
Packit b099d7
Packit b099d7
  /*
Packit b099d7
   * Free up resources
Packit b099d7
   */
Packit b099d7
  if ( svlist != NULL )
Packit b099d7
    {
Packit b099d7
      for ( ndx=0 ; ndx
Packit b099d7
        Urm__CW_FreeSetValuesDesc
Packit b099d7
	  ((URMSetValuesDescPtr)UrmPlistPtrN((URMPointerListPtr)svlist,ndx));
Packit b099d7
      UrmPlistFree ((URMPointerListPtr)svlist);
Packit b099d7
    }
Packit b099d7
  UrmFreeResourceContext (wref_ctx);
Packit b099d7
Packit b099d7
  /*
Packit b099d7
   * successfully initialized
Packit b099d7
   */
Packit b099d7
  _MrmProcessUnlock();
Packit b099d7
  _MrmAppUnlock(app);
Packit b099d7
  return MrmSUCCESS;
Packit b099d7
Packit b099d7
}
Packit b099d7
Packit b099d7
Packit b099d7

Packit b099d7
/*
Packit b099d7
 *++
Packit b099d7
 *
Packit b099d7
 *  PROCEDURE DESCRIPTION:
Packit b099d7
 *
Packit b099d7
 *	This routine does an XtSetValues on a widget, evaluating the values
Packit b099d7
 *	as public literal resource references resolvable from a URM
Packit b099d7
 *	hierarchy. Each literal is fetched from the hierarchy, and
Packit b099d7
 *	its value is fixed up and converted as required. This value is
Packit b099d7
 *	then placed in the arglist, and used as the actual value for
Packit b099d7
 *	an XtSetValues call. This routine allows a widget to be modified
Packit b099d7
 *	after creation using UID file values exactly as is done for creation
Packit b099d7
 *	values in MrmFetchWidget.
Packit b099d7
 *
Packit b099d7
 *	As in FetchWidget, each argument whose value can be evaluated from
Packit b099d7
 *	the UID hierarchy is set in the widget. Values which are not found
Packit b099d7
 *	or for which conversion errors occur are not modified.
Packit b099d7
 *
Packit b099d7
 *	Each entry in the arglist identifies an argument to be modified in
Packit b099d7
 *	the widget. The .name part identifies the tag, as usual (XmN...).
Packit b099d7
 *	the .value part must be a String whose values is the index of the
Packit b099d7
 *	literal. Thus
Packit b099d7
 *		args[n].name = "label"		(XmNlabel)
Packit b099d7
 *		args[n].value = "OK_button_label"
Packit b099d7
 *	would modify the label resource of the widget to have the value
Packit b099d7
 *	of the literal accessed by index 'OK_button_label' in the
Packit b099d7
 *	hierarchy.
Packit b099d7
 *
Packit b099d7
 *  FORMAL PARAMETERS:
Packit b099d7
 *
Packit b099d7
 *	hierarchy_id	URM hierarchy to be searched for literal definitions
Packit b099d7
 *	w		the widget to be modified
Packit b099d7
 *	args		An arglist specifying the widget arguments to be
Packit b099d7
 *			modified. The .name part of each argument must be
Packit b099d7
 *			the usual XmN... string identifying the argument
Packit b099d7
 *			(argument tag). The .value part must be a String
Packit b099d7
 *			giveing the index of the literal. All literals must
Packit b099d7
 *			be public literals accessed by index.
Packit b099d7
 *	num_args	the number of entries in args.
Packit b099d7
 *
Packit b099d7
 *  IMPLICIT INPUTS:
Packit b099d7
 *
Packit b099d7
 *  IMPLICIT OUTPUTS:
Packit b099d7
 *
Packit b099d7
 *  FUNCTION VALUE:
Packit b099d7
 *
Packit b099d7
 *  SIDE EFFECTS:
Packit b099d7
 *
Packit b099d7
 *--
Packit b099d7
 */
Packit b099d7
Packit b099d7
Cardinal 
Packit b099d7
MrmFetchSetValues (MrmHierarchy                hierarchy_id,
Packit b099d7
		   Widget                      w,
Packit b099d7
		   ArgList                     args,
Packit b099d7
		   Cardinal                    num_args)
Packit b099d7
{
Packit b099d7
Packit b099d7
  /*
Packit b099d7
   *  Local variables
Packit b099d7
   */
Packit b099d7
  Cardinal		result;
Packit b099d7
  _MrmWidgetToAppContext(w);
Packit b099d7
Packit b099d7
  _MrmAppLock(app);
Packit b099d7
  _MrmProcessLock();
Packit b099d7
Packit b099d7
  /*
Packit b099d7
   * Validate the hierachy, then attempt to modify the widget
Packit b099d7
   */
Packit b099d7
  if ( hierarchy_id == NULL )
Packit b099d7
    {
Packit b099d7
      result = Urm__UT_Error ("MrmFetchSetValues", _MrmMMsg_0023,
Packit b099d7
			      NULL, NULL, MrmBAD_HIERARCHY);
Packit b099d7
      _MrmProcessUnlock();
Packit b099d7
      _MrmAppUnlock(app);
Packit b099d7
      return result;
Packit b099d7
    }
Packit b099d7
Packit b099d7
  if ( ! MrmHierarchyValid(hierarchy_id) )
Packit b099d7
    {
Packit b099d7
      result = Urm__UT_Error ("MrmFetchSetValues", _MrmMMsg_0024,
Packit b099d7
			      NULL, NULL, MrmBAD_HIERARCHY);
Packit b099d7
      _MrmProcessUnlock();
Packit b099d7
      _MrmAppUnlock(app);
Packit b099d7
      return result;
Packit b099d7
    }
Packit b099d7
Packit b099d7
  result = UrmFetchSetValues (hierarchy_id, w, args, num_args);
Packit b099d7
  _MrmProcessUnlock();
Packit b099d7
  _MrmAppUnlock(app);
Packit b099d7
  return result;
Packit b099d7
}