Commit | Line | Data |
---|---|---|
ee78dc32 GV |
1 | /* Emulate the X Resource Manager through the registry. |
2 | Copyright (C) 1990, 1993, 1994 Free Software Foundation. | |
3 | ||
3b7ad313 EN |
4 | This file is part of GNU Emacs. |
5 | ||
6 | GNU Emacs is free software; you can redistribute it and/or modify | |
ee78dc32 GV |
7 | it under the terms of the GNU General Public License as published by |
8 | the Free Software Foundation; either version 2, or (at your option) | |
9 | any later version. | |
10 | ||
3b7ad313 | 11 | GNU Emacs is distributed in the hope that it will be useful, |
ee78dc32 GV |
12 | but WITHOUT ANY WARRANTY; without even the implied warranty of |
13 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
14 | GNU General Public License for more details. | |
15 | ||
16 | You should have received a copy of the GNU General Public License | |
3b7ad313 EN |
17 | along with GNU Emacs; see the file COPYING. If not, write to |
18 | the Free Software Foundation, Inc., 59 Temple Place - Suite 330, | |
19 | Boston, MA 02111-1307, USA. */ | |
ee78dc32 GV |
20 | |
21 | /* Written by Kevin Gallo */ | |
22 | ||
23 | #include <config.h> | |
24 | #include "lisp.h" | |
25 | #include "w32term.h" | |
26 | #include "blockinput.h" | |
27 | ||
28 | #include <stdio.h> | |
29 | #include <string.h> | |
30 | ||
f79eea00 | 31 | #define REG_ROOT "SOFTWARE\\GNU\\Emacs" |
ee78dc32 | 32 | |
c9029fe5 JB |
33 | static char * |
34 | w32_get_rdb_resource (rdb, resource) | |
35 | char *rdb; | |
36 | char *resource; | |
37 | { | |
38 | char *value = rdb; | |
39 | int len = strlen (resource); | |
40 | ||
41 | while (*value) | |
42 | { | |
43 | /* Comparison is case-insensitive because registry searches are too. */ | |
44 | if ((strnicmp (value, resource, len) == 0) && (value[len] == ':')) | |
45 | return xstrdup (&value[len + 1]); | |
46 | ||
47 | value = strchr (value, '\0') + 1; | |
48 | } | |
49 | ||
50 | return NULL; | |
51 | } | |
52 | ||
177c0ea7 | 53 | LPBYTE |
fbd6baed | 54 | w32_get_string_resource (name, class, dwexptype) |
ee78dc32 GV |
55 | char *name, *class; |
56 | DWORD dwexptype; | |
57 | { | |
58 | LPBYTE lpvalue = NULL; | |
59 | HKEY hrootkey = NULL; | |
60 | DWORD dwType; | |
61 | DWORD cbData; | |
62 | BOOL ok = FALSE; | |
49fb6381 | 63 | HKEY hive = HKEY_CURRENT_USER; |
177c0ea7 | 64 | |
49fb6381 AI |
65 | trykey: |
66 | ||
ee78dc32 | 67 | BLOCK_INPUT; |
177c0ea7 | 68 | |
49fb6381 AI |
69 | /* Check both the current user and the local machine to see if we have |
70 | any resources */ | |
71 | ||
72 | if (RegOpenKeyEx (hive, REG_ROOT, 0, KEY_READ, &hrootkey) == ERROR_SUCCESS) | |
ee78dc32 GV |
73 | { |
74 | char *keyname; | |
177c0ea7 | 75 | |
ee78dc32 GV |
76 | if (RegQueryValueEx (hrootkey, name, NULL, &dwType, NULL, &cbData) == ERROR_SUCCESS |
77 | && dwType == dwexptype) | |
78 | { | |
79 | keyname = name; | |
177c0ea7 | 80 | } |
ee78dc32 GV |
81 | else if (RegQueryValueEx (hrootkey, class, NULL, &dwType, NULL, &cbData) == ERROR_SUCCESS |
82 | && dwType == dwexptype) | |
83 | { | |
84 | keyname = class; | |
85 | } | |
86 | else | |
87 | { | |
88 | keyname = NULL; | |
89 | } | |
177c0ea7 | 90 | |
ee78dc32 GV |
91 | ok = (keyname |
92 | && (lpvalue = (LPBYTE) xmalloc (cbData)) != NULL | |
93 | && RegQueryValueEx (hrootkey, keyname, NULL, NULL, lpvalue, &cbData) == ERROR_SUCCESS); | |
177c0ea7 | 94 | |
ee78dc32 GV |
95 | RegCloseKey (hrootkey); |
96 | } | |
177c0ea7 | 97 | |
ee78dc32 | 98 | UNBLOCK_INPUT; |
177c0ea7 JB |
99 | |
100 | if (!ok) | |
ee78dc32 | 101 | { |
49fb6381 AI |
102 | if (lpvalue) |
103 | { | |
104 | xfree (lpvalue); | |
105 | lpvalue = NULL; | |
106 | } | |
107 | if (hive == HKEY_CURRENT_USER) | |
108 | { | |
109 | hive = HKEY_LOCAL_MACHINE; | |
110 | goto trykey; | |
111 | } | |
ee78dc32 | 112 | return (NULL); |
177c0ea7 | 113 | } |
49fb6381 | 114 | return (lpvalue); |
ee78dc32 GV |
115 | } |
116 | ||
117 | /* Retrieve the string resource specified by NAME with CLASS from | |
118 | database RDB. */ | |
119 | ||
120 | char * | |
121 | x_get_string_resource (rdb, name, class) | |
c9029fe5 | 122 | char *rdb; |
ee78dc32 GV |
123 | char *name, *class; |
124 | { | |
c9029fe5 JB |
125 | if (rdb) |
126 | { | |
127 | char *resource; | |
128 | ||
129 | if (resource = w32_get_rdb_resource (rdb, name)) | |
130 | return resource; | |
131 | if (resource = w32_get_rdb_resource (rdb, class)) | |
132 | return resource; | |
133 | } | |
134 | ||
fbd6baed | 135 | return (w32_get_string_resource (name, class, REG_SZ)); |
ee78dc32 | 136 | } |