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