xosview  1.23
About: xosview is an X Windows based system monitor (cpu, memory, swap and network usage; interrupt and serial activities; load average).
  Fossies Dox: xosview-1.23.tar.gz  ("unofficial" and yet experimental doxygen-generated source code documentation)  

Xrm.cc
Go to the documentation of this file.
1 //
2 // Copyright (c) 1994, 1995, 2006, 2008 by Mike Romberg ( mike.romberg@noaa.gov )
3 //
4 // This file may be distributed under terms of the GPL
5 //
6 
7 #include "Xrm.h"
8 #include "Xrmcommandline.h"
9 #include <string.h>
10 #include <stdlib.h>
11 #include <stdio.h> // For snprintf().
12 #include <ctype.h>
13 #include <unistd.h> // for access(), etc. BCG
14 #include <iostream>
15 
16 extern char *defaultXResourceString;
17 
18 
19 bool Xrm::_initialized = false;
20 
21 Xrm::Xrm(const char *instanceName, int argc, char **argv){
22  std::cerr << " Error: This constructor is not supported yet." << std::endl;
23  exit (-1);
24  _db = NULL;
25  _class = _instance = NULLQUARK;
26  getDisplayName(argc, argv);
27 
28  (void) instanceName;
29  // End unsupported constructor. !!!!!!!! BCG
30 }
31 
32 Xrm::Xrm(const char *className, const char *instanceName){
33  XrmInitialize ();
34 
35  // Initialize everything to NULL.
36  _db = NULL;
37  _class = _instance = NULLQUARK;
38 
39  // init the _instance and _class Quarks
40  _instance = XrmStringToQuark(instanceName);
42 }
43 
44 const char*
45 Xrm::getDisplayName (int argc, char** argv)
46 {
47  (void) argc; // Avoid gcc warnings.
48  // See if '-display foo:0' is on the command line, and return it if it is.
49  char** argp;
50 
51  for (argp = argv; (*argp != NULL) &&
52  (strncasecmp (*argp, "-display", 9)); argp++)
53  ; // Don't do anything.
54 
55  // If we found -display and the next word exists...
56  if (*argp && *(++argp))
57  _display_name = *argp;
58  else
59  _display_name = "";
60  return _display_name;
61  // An empty display string means use the DISPLAY environment variable.
62 }
63 
64 const char *Xrm::getResource(const char *rname) const{
65  char frn[1024], fcn[1024];
66  snprintf(frn, 1024, "%s.%s", instanceName(), rname);
67  snprintf(fcn, 1024, "%s.%s", className(), rname);
68 
69  XrmValue val;
70  val.addr = NULL;
71  char *type;
72  XrmGetResource(_db, frn, fcn, &type, &val);
73  // This case here is a hack, because we are currently moving from
74  // always making the instance name be "xosview" to allowing
75  // user-specified ones. And unfortunately, the class name is
76  // XOsview, and not xosview, so our old defaults (xosview.font)
77  // will not be found when searching for XOsview.font. bgrayson Dec. 1996
78  if (!val.addr)
79  {
80  // Let's try with a non-uppercased class name.
81  char fcn_lower[1024];
82  strncpy(fcn_lower, className(), 1024);
83  char *p = fcn_lower;
84  while (p && *p)
85  {
86  *p = tolower(*p);
87  p++;
88  }
89  snprintf(fcn, 1024, "%s.%s", fcn_lower, rname);
90  XrmGetResource(_db, frn, fcn, &type, &val);
91  }
92 
93  return val.addr;
94 }
95 
97  XrmDestroyDatabase(_db);
98 }
99 
100 //---------------------------------------------------------------------
101 // This function uses XrmParseCommand, and updates argc and argv through it.
102 void Xrm::loadAndMergeResources(int& argc, char** argv, Display* display){
103 
104  // init the database if it needs it
105  if (!_initialized){
106  XrmInitialize();
107  _initialized = true;
108  }
109  else
110  {
111  std::cerr << "Error: Xrm:loadAndMergeResources() called twice!" << std::endl;
112  exit (-1);
113  }
114  // This is ugly code. According to X and Xt rules, many files need
115  // to be checked for resource settings. Since we aren't (yet) using
116  // Xt or any other package, we need to do all of these checks
117  // individually. BCG
118 // =========== BEGIN X Resource lookup and merging ==========
119 
120 // This all needs to be done in the proper order:
121 /*
122 Listed from weakest to strongest:
123  (from code-builtin-resources) (Stored in the string in defaultstring.h)
124  app-defaults
125  XOSView (from XAPPLRESDIR directory)
126  from RESOURCE_MANAGER property on server (reads .Xdefaults if needed)
127  from file specified in XENVIRONMENT
128  from command line (i.e., handled with XrmParseCommand)
129 */
130 
131  // Get resources from the various resource files
132 
133  // Put the default, compile-time options as the lowest priority.
134  _db = XrmGetStringDatabase (defaultXResourceString);
135 
136  // Merge in the system resource database.
137  char rfilename[2048];
138  int result;
139  const int rlen = sizeof rfilename;
140 
141  // Get the app-defaults
142  result = snprintf(rfilename, sizeof rfilename, "/etc/X11/app-defaults/%s",
143  XrmQuarkToString(_class));
144  if (result >= 0 && result < rlen)
145  XrmCombineFileDatabase (rfilename, &_db, 1);
146  result = snprintf(rfilename, sizeof rfilename, "/usr/lib/X11/app-defaults/%s",
147  XrmQuarkToString(_class));
148  if (result >= 0 && result < rlen)
149  XrmCombineFileDatabase (rfilename, &_db, 1);
150  result = snprintf(rfilename, sizeof rfilename, "/usr/X11R6/lib/X11/app-defaults/%s",
151  XrmQuarkToString(_class));
152  if (result >= 0 && result < rlen)
153  XrmCombineFileDatabase (rfilename, &_db, 1);
154  result = snprintf(rfilename, sizeof rfilename, "/usr/share/X11/app-defaults/%s",
155  XrmQuarkToString(_class));
156  if (result >= 0 && result < rlen)
157  XrmCombineFileDatabase (rfilename, &_db, 1);
158  // Try a few more, for SunOS/Solaris folks.
159  result = snprintf(rfilename, sizeof rfilename, "/usr/openwin/lib/X11/app-defaults/%s",
160  XrmQuarkToString(_class));
161  if (result >= 0 && result < rlen)
162  XrmCombineFileDatabase (rfilename, &_db, 1);
163  result = snprintf(rfilename, sizeof rfilename, "/usr/local/X11R6/lib/X11/app-defaults/%s",
164  XrmQuarkToString(_class));
165  if (result >= 0 && result < rlen)
166  XrmCombineFileDatabase (rfilename, &_db, 1);
167 
168  // Now, check for an XOSView file in the XAPPLRESDIR directory...
169  char* xappdir = getenv ("XAPPLRESDIR");
170  if (xappdir != NULL)
171  {
172  char xappfile[1024];
173  snprintf (xappfile, 1024, "%s/%s", xappdir, className());
174  // this did not work for XAPPLRESDIR
175  //if (!access (xappfile, X_OK | R_OK))
176  if (!access (xappfile, R_OK))
177  {
178  XrmCombineFileDatabase (xappfile, &_db, 1);
179  }
180  }
181 
182  // Now, check the display's RESOURCE_MANAGER property...
183  char* displayString = XResourceManagerString (display);
184  if (displayString != NULL)
185  {
186  XrmDatabase displayrdb = XrmGetStringDatabase (displayString);
187  XrmMergeDatabases (displayrdb, &_db); // Destroys displayrdb when done.
188  }
189 
190  // And check this screen of the display...
191  char* screenString =
192  XScreenResourceString (DefaultScreenOfDisplay(display));
193  if (screenString != NULL)
194  {
195  XrmDatabase screenrdb = XrmGetStringDatabase (screenString);
196  XrmMergeDatabases (screenrdb, &_db); // Destroys screenrdb when done.
197  }
198 
199  // Now, check for a user resource file, and merge it in if there is one...
200  if ( getenv( "HOME" ) != NULL ){
201  char userrfilename[1024];
202  char *home = getenv("HOME");
203  snprintf(userrfilename, 1024, "%s/.Xdefaults", home);
204  // User file overrides system (_db).
205  XrmCombineFileDatabase (userrfilename, &_db, 1);
206  }
207 
208  // Second-to-last, parse any resource file specified in the
209  // environment variable XENVIRONMENT.
210  char* xenvfile;
211  if ((xenvfile = getenv ("XENVIRONMENT")) != NULL)
212  {
213  // The XENVIRONMENT file overrides all of the above.
214  XrmCombineFileDatabase (xenvfile, &_db, 1);
215  }
216  // Command-line resources override system and user defaults.
217  XrmDatabase cmdlineRdb_ = NULL;
218  XrmParseCommand (&cmdlineRdb_, options, NUM_OPTIONS, instanceName(),
219  &argc, argv);
220  XrmCombineDatabase (cmdlineRdb_, &_db, 1); // Keeps cmdlineRdb_ around.
221 // =========== END X Resource lookup and merging ==========
222 }
223 
224 void Xrm::initClassName(const char* name){
225  char className[256];
226  strncpy(className, name, 255); // Avoid evil people out there...
227 
228  className[0] = toupper(className[0]);
229  if (className[0] == 'X')
230  className[1] = toupper(className[1]);
231 
232  _class = XrmStringToQuark(className);
233 }
234 
235 
236 
237 //------------ Some debugging functions follow. -----------------------
238 inline std::ostream &operator<<(std::ostream &os, const XrmBinding &b){
239  switch (b){
240  case XrmBindTightly:
241  return os << ".";
242  case XrmBindLoosely:
243  return os << "*";
244  default:
245  std::cerr <<"std::ostream operator<<(std::ostream &, const XrmBinding &) : "
246  <<"Unknown XrmBinding!";
247  return os;
248  }
249 
250  return os;
251 }
252 
253 std::ostream &Xrm::dump(std::ostream &os) const {
254  os <<"--- Xrm --- class: " <<XrmQuarkToString(_class)
255  <<", instance: " <<XrmQuarkToString(_instance) <<"\n";
256 
257  XrmName names[] = { _instance, NULLQUARK };
258  XrmClass classes[] = { _class, NULLQUARK };
259 
260  XrmEnumerateDatabase(_db, names, classes, XrmEnumAllLevels, enumCB,
261  (XPointer)&os);
262 
263  return os;
264 }
265 
266 Bool Xrm::enumCB(XrmDatabase *, XrmBindingList bindings,
267  XrmQuarkList quarks, XrmRepresentation *type,
268  XrmValue *value, XPointer closure) {
269 
270  std::ostream *os = (std::ostream *)closure;
271  (void) type; // Avoid gcc warnings.
272 
273  //std::cerr <<"type = " <<XrmQuarkToString(*type) <<std::endl;
274 
275  int i = 0;
276  while (quarks[i] != NULLQUARK){
277  *os <<bindings[i] <<XrmQuarkToString(quarks[i]);
278  i++;
279  }
280  *os <<": " <<value->addr <<"\n";
281 
282  return False;
283 }
char * defaultXResourceString
std::ostream & operator<<(std::ostream &os, const XrmBinding &b)
Definition: Xrm.cc:238
static const int NUM_OPTIONS
static XrmOptionDescRec options[]
Definition: Xrmcommandline.h:6
const char * _display_name
Definition: Xrm.h:33
~Xrm()
Definition: Xrm.cc:96
XrmDatabase _db
Definition: Xrm.h:31
void initClassName(const char *className)
Definition: Xrm.cc:224
const char * getResource(const char *rname) const
Definition: Xrm.cc:64
const char * instanceName(void) const
Definition: Xrm.h:22
const char * className(void) const
Definition: Xrm.h:21
const char * getDisplayName(int argc, char **argv)
Definition: Xrm.cc:45
XrmClass _instance
Definition: Xrm.h:32
std::ostream & dump(std::ostream &os) const
Definition: Xrm.cc:253
XrmClass _class
Definition: Xrm.h:32
Xrm(const char *className, const char *instanceName)
Definition: Xrm.cc:32
void loadAndMergeResources(int &argc, char **argv, Display *display)
Definition: Xrm.cc:102
static Bool enumCB(XrmDatabase *, XrmBindingList bindings, XrmQuarkList quarks, XrmRepresentation *type, XrmValue *value, XPointer closure)
Definition: Xrm.cc:266
static bool _initialized
Definition: Xrm.h:41