1/* Emulate the X Resource Manager through the registry.
2   Copyright (C) 1990, 1993, 1994, 2001, 2002, 2003, 2004,
3                 2005, 2006, 2007  Free Software Foundation, Inc.
4
5This file is part of GNU Emacs.
6
7GNU Emacs is free software; you can redistribute it and/or modify
8it under the terms of the GNU General Public License as published by
9the Free Software Foundation; either version 2, or (at your option)
10any later version.
11
12GNU Emacs is distributed in the hope that it will be useful,
13but WITHOUT ANY WARRANTY; without even the implied warranty of
14MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15GNU General Public License for more details.
16
17You should have received a copy of the GNU General Public License
18along with GNU Emacs; see the file COPYING.  If not, write to
19the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
20Boston, MA 02110-1301, USA.  */
21
22/* Written by Kevin Gallo */
23
24#include <config.h>
25#include "lisp.h"
26#include "w32term.h"
27#include "blockinput.h"
28
29#include <stdio.h>
30#include <string.h>
31
32#define REG_ROOT "SOFTWARE\\GNU\\Emacs"
33
34/* Default system colors from the Display Control Panel settings.  */
35#define SYSTEM_DEFAULT_RESOURCES                          \
36  "emacs.foreground:SystemWindowText\0"			  \
37  "emacs.background:SystemWindow\0"                       \
38  "emacs.tooltip.attributeForeground:SystemInfoText\0"    \
39  "emacs.tooltip.attributeBackground:SystemInfoWindow\0"  \
40  "emacs.tool-bar.attributeForeground:SystemButtonText\0" \
41  "emacs.tool-bar.attributeBackground:SystemButtonFace\0" \
42  "emacs.menu.attributeForeground:SystemMenuText\0"       \
43  "emacs.menu.attributeBackground:SystemMenu\0"           \
44  "emacs.scroll-bar.attributeForeground:SystemScrollbar"
45
46/* Other possibilities for default faces:
47
48  region: Could use SystemHilight, but interferes with our ability to
49  see most syntax highlighting through the region face.
50
51  modeline: Could use System(In)ActiveTitle, gradient versions (not
52  supported on 95 and NT), but modeline is more like a status bar
53  really (which don't appear to be configurable in Windows).
54
55  highlight: Could use SystemHotTrackingColor, but it is not supported
56  on Windows 95 or NT, and other apps only seem to use it for menus
57  anyway.
58
59*/
60
61static char *
62w32_get_rdb_resource (rdb, resource)
63     char *rdb;
64     char *resource;
65{
66  char *value = rdb;
67  int len = strlen (resource);
68
69  while (*value)
70    {
71      /* Comparison is case-insensitive because registry searches are too.  */
72      if ((strnicmp (value, resource, len) == 0) && (value[len] == ':'))
73        return xstrdup (&value[len + 1]);
74
75      value = strchr (value, '\0') + 1;
76    }
77
78  return NULL;
79}
80
81LPBYTE
82w32_get_string_resource (name, class, dwexptype)
83     char *name, *class;
84     DWORD dwexptype;
85{
86  LPBYTE lpvalue = NULL;
87  HKEY hrootkey = NULL;
88  DWORD dwType;
89  DWORD cbData;
90  BOOL ok = FALSE;
91  HKEY hive = HKEY_CURRENT_USER;
92
93 trykey:
94
95  BLOCK_INPUT;
96
97  /* Check both the current user and the local machine to see if we have
98     any resources */
99
100  if (RegOpenKeyEx (hive, REG_ROOT, 0, KEY_READ, &hrootkey) == ERROR_SUCCESS)
101    {
102      char *keyname;
103
104      if (RegQueryValueEx (hrootkey, name, NULL, &dwType, NULL, &cbData) == ERROR_SUCCESS
105	  && dwType == dwexptype)
106	{
107	  keyname = name;
108	}
109      else if (RegQueryValueEx (hrootkey, class, NULL, &dwType, NULL, &cbData) == ERROR_SUCCESS
110	       && dwType == dwexptype)
111	{
112	  keyname = class;
113	}
114      else
115	{
116	  keyname = NULL;
117	}
118
119      ok = (keyname
120	    && (lpvalue = (LPBYTE) xmalloc (cbData)) != NULL
121	    && RegQueryValueEx (hrootkey, keyname, NULL, NULL, lpvalue, &cbData) == ERROR_SUCCESS);
122
123      RegCloseKey (hrootkey);
124    }
125
126  UNBLOCK_INPUT;
127
128  if (!ok)
129    {
130      if (lpvalue)
131	{
132	  xfree (lpvalue);
133	  lpvalue = NULL;
134	}
135      if (hive == HKEY_CURRENT_USER)
136	{
137	  hive = HKEY_LOCAL_MACHINE;
138	  goto trykey;
139	}
140
141      /* Check if there are Windows specific defaults defined.  */
142      return w32_get_rdb_resource (SYSTEM_DEFAULT_RESOURCES, name);
143    }
144  return (lpvalue);
145}
146
147/* Retrieve the string resource specified by NAME with CLASS from
148   database RDB. */
149
150char *
151x_get_string_resource (rdb, name, class)
152     XrmDatabase rdb;
153     char *name, *class;
154{
155  if (rdb)
156    {
157      char *resource;
158
159      if (resource = w32_get_rdb_resource (rdb, name))
160        return resource;
161      if (resource = w32_get_rdb_resource (rdb, class))
162        return resource;
163    }
164
165  return (w32_get_string_resource (name, class, REG_SZ));
166}
167
168/* arch-tag: 755fce25-42d7-4acb-874f-2fb42336823d
169   (do not change this comment) */
170