#include <config.h>
#include "lisp.h"
#include "w32term.h"
#include "blockinput.h"
#include <stdio.h>
#include <string.h>
#define REG_ROOT "SOFTWARE\\GNU\\Emacs"
#define SYSTEM_DEFAULT_RESOURCES \
"emacs.foreground:SystemWindowText\0" \
"emacs.background:SystemWindow\0" \
"emacs.tooltip.attributeForeground:SystemInfoText\0" \
"emacs.tooltip.attributeBackground:SystemInfoWindow\0" \
"emacs.tool-bar.attributeForeground:SystemButtonText\0" \
"emacs.tool-bar.attributeBackground:SystemButtonFace\0" \
"emacs.menu.attributeForeground:SystemMenuText\0" \
"emacs.menu.attributeBackground:SystemMenu\0" \
"emacs.scroll-bar.attributeForeground:SystemScrollbar"
static char *
w32_get_rdb_resource (rdb, resource)
char *rdb;
char *resource;
{
char *value = rdb;
int len = strlen (resource);
while (*value)
{
if ((strnicmp (value, resource, len) == 0) && (value[len] == ':'))
return xstrdup (&value[len + 1]);
value = strchr (value, '\0') + 1;
}
return NULL;
}
LPBYTE
w32_get_string_resource (name, class, dwexptype)
char *name, *class;
DWORD dwexptype;
{
LPBYTE lpvalue = NULL;
HKEY hrootkey = NULL;
DWORD dwType;
DWORD cbData;
BOOL ok = FALSE;
HKEY hive = HKEY_CURRENT_USER;
trykey:
BLOCK_INPUT;
if (RegOpenKeyEx (hive, REG_ROOT, 0, KEY_READ, &hrootkey) == ERROR_SUCCESS)
{
char *keyname;
if (RegQueryValueEx (hrootkey, name, NULL, &dwType, NULL, &cbData) == ERROR_SUCCESS
&& dwType == dwexptype)
{
keyname = name;
}
else if (RegQueryValueEx (hrootkey, class, NULL, &dwType, NULL, &cbData) == ERROR_SUCCESS
&& dwType == dwexptype)
{
keyname = class;
}
else
{
keyname = NULL;
}
ok = (keyname
&& (lpvalue = (LPBYTE) xmalloc (cbData)) != NULL
&& RegQueryValueEx (hrootkey, keyname, NULL, NULL, lpvalue, &cbData) == ERROR_SUCCESS);
RegCloseKey (hrootkey);
}
UNBLOCK_INPUT;
if (!ok)
{
if (lpvalue)
{
xfree (lpvalue);
lpvalue = NULL;
}
if (hive == HKEY_CURRENT_USER)
{
hive = HKEY_LOCAL_MACHINE;
goto trykey;
}
return w32_get_rdb_resource (SYSTEM_DEFAULT_RESOURCES, name);
}
return (lpvalue);
}
char *
x_get_string_resource (rdb, name, class)
XrmDatabase rdb;
char *name, *class;
{
if (rdb)
{
char *resource;
if (resource = w32_get_rdb_resource (rdb, name))
return resource;
if (resource = w32_get_rdb_resource (rdb, class))
return resource;
}
return (w32_get_string_resource (name, class, REG_SZ));
}