Release 970720
Sat Jul 19 13:03:01 1997 Alexandre Julliard <julliard@lrc.epfl.ch>
* [tools/build.c] [include/stackframe.h]
Save the complete %ebp register in CallFrom16; fixes a crash with
LabView reported by Andreas Mohr.
* [loader/main.c]
Avoid executing a built-in DLL.
* [controls/static.c]
Converted static window procedure to Win32.
* [windows/message.c] [windows/queue.c] [include/queue.h]
Hacked SendMessage functions to support inter-task messages with
SendMessage32A/W.
Sun Jul 13 16:55:35 1997 Bernhard Rosenkraenzer <bero@bero-online.ml.org>
* [ipc/bit_array.c]
Don't use bitops.h in Linux 2.1.x (these versions do not return
the previous state for clear_bit and set_bit)
* [ipc/shm_main_blk.c]
Adapt to GLIBC's ipc_perm structure.
* [memory/ldt.c]
Include <asm/unistd.h> on Linux/GLIBC systems (required for
_syscall3).
Wed Jul 9 23:53:19 1997 David A. Cuthbert <dacut@henry.ece.cmu.edu>
* [include/options.h] [files/profile.c]
Added PROFILE_GetWineIniBool and PROFILE_EnumerateWineIniSection.
* [include/sysmetrics.h] [include/windows.h] [windows/sysmetrics.c]
All sysmetrics moved to array (no more constant macros). Added
MOUSEWHEELPRESENT metric.
* [include/bitmap.h] [objects/oembitmap.c]
Added OBM_Init() (see also loader/main.c) and more support for Win95
bitmaps; added size info to OEM bitmaps.
* [include/graphics.h] [windows/graphics.h]
Added GRAPH_DrawGenericReliefRect.
* [loader/main.c]
Added TWEAK_Init() and TWEAK_CheckConfiguration() calls (the
latter checks for invalid entries in wine.conf).
* [include/debug.h] [include/stddebug.h] [include/nonclient.h]
[include/tweak.h] [controls/menu.c] [misc/tweak.c]
[objects/gdiobj.c] [windows/syscolor.c] [windows/nonclient.c]
[BUGS] [documentation/win95look]
Added tweaks for Windows 95 interface support. See
documentation/win95look for more information.
* [controls/edit.c]
Fixed EDIT_MoveHome bug.
* [misc/ver.c]
Changed name of dprintf_ver_string to ver_dstring to fix
problem with tools/make_debug utility.
Wed Jul 9 21:31:54 1997 Marcus Meissner <msmeissn@cip.informatik.uni-erlangen.de>
* [objects/dib.c]
Don't use palettes with dibs with biBitCount > 8.
* [misc/ole2nls.c][misc/ver.c]
IsValidLocale, EnumSystemLocales fixed (winhlp32.exe works)
Some VerLanguage coded moved to ole2nls.c, some cleanups.
* [multimedia/mcistring.c]
Fixed "capabilities <dev> device type" crash (cool.exe).
* [misc/main.c]
SystemParametersInfo*: added stub option 41
(GETNONCLIENTMETRICS), duplicated some stuff away from SPI16
that writes 32bit vars.(one COMCTL32.DLL crash, freecell.exe)
Tue Jul 8 22:40:53 1997 Morten Welinder <terra@diku.dk>
* [if1632/shell32.spec]
Use Windows 95's ordinals. Help wanted, inquire within.
Mon Jul 7 11:20:36 1997 Philippe De Muyter <phdm@info.ucl.ac.be>
* [if1632/relay.c] [if1632/user.spec] [if1632/kernel.spec]
[tools/build-spec.txt] [tools/build.c]
Added type 'segstr' (segmented pointer to null-terminated string)
to .spec files.
* [windows/user.c] [if1632/user.spec]
ExitWindowsExec stub function added.
Mon Jul 7 01:18:25 1997 U. Bonnes <bon@elektron.ikp.physik.th-darmstadt.de>
* [files/file.c] [include/winbase.h] [if1632/kernel32.spec]
Implement MoveFileEx32, some enhancement for Movefile32.
Sat Jul 5 18:13:48 1997 Bruce Milner <Bruce.Milner@genetics.utah.edu.
* [files/file.c] [if1632/kernel32.spec] [include/winerror.h]
[msdos/int21.c] [win32/file.c]
Add LockFile/UnlockFile implementation.
Add back in int21 func(0x5c) Record locking functions.
* [files/file.c]
Fixed bug with OF_REOPEN in FILE_DoOpenFile.
Fri Jul 4 12:00:00 1997 Henrik Olsen <Henrik.Olsen@iaeste.dk>
* [misc/ole2nls.c] [programs/progman/Da.rc] [programs/winhelp/Da.rc]
[resources/sysres_Da.rc]
Added/updated Danish language support.
Thu Jul 3 13:04:20 1997 Claus Fischer <fischer@iue.tuwien.ac.at>
* [files/dos_fs.c]
Properly implemented DOSFS_UnixTimeToFileTime and
DOSFS_FileTimeToUnixTime.
* [documentation/wine.texinfo]
First version of texinfo documentation.
diff --git a/misc/Makefile.in b/misc/Makefile.in
index 08b87e1..8677044 100644
--- a/misc/Makefile.in
+++ b/misc/Makefile.in
@@ -32,6 +32,7 @@
stress.c \
system.c \
toolhelp.c \
+ tweak.c \
ver.c \
w32sys.c \
winsock.c \
@@ -44,3 +45,4 @@
@MAKE_RULES@
### Dependencies:
+
diff --git a/misc/comm.c b/misc/comm.c
index df5b7c4..36d3f7e 100644
--- a/misc/comm.c
+++ b/misc/comm.c
@@ -21,7 +21,7 @@
#include <errno.h>
#include <ctype.h>
#include <sys/stat.h>
-#if defined(__NetBSD__) || defined(__FreeBSD__)
+#if defined(__NetBSD__) || defined(__FreeBSD__) || defined(__OpenBSD__)
#include <sys/filio.h>
#endif
#include <sys/ioctl.h>
diff --git a/misc/main.c b/misc/main.c
index 84ab9cf..01cc321 100644
--- a/misc/main.c
+++ b/misc/main.c
@@ -932,7 +932,117 @@
BOOL32 SystemParametersInfo32A( UINT32 uAction, UINT32 uParam,
LPVOID lpvParam, UINT32 fuWinIni )
{
- return SystemParametersInfo16(uAction,uParam,lpvParam,fuWinIni);
+ int timeout, temp;
+ XKeyboardState keyboard_state;
+
+ switch (uAction) {
+ case SPI_GETBEEP:
+ XGetKeyboardControl(display, &keyboard_state);
+ if (keyboard_state.bell_percent == 0)
+ *(BOOL32 *) lpvParam = FALSE;
+ else
+ *(BOOL32 *) lpvParam = TRUE;
+ break;
+
+ case SPI_GETBORDER:
+ *(INT32 *)lpvParam = GetSystemMetrics32( SM_CXFRAME );
+ break;
+
+ case SPI_GETFASTTASKSWITCH:
+ if ( GetProfileInt32A( "windows", "CoolSwitch", 1 ) == 1 )
+ *(BOOL32 *) lpvParam = TRUE;
+ else
+ *(BOOL32 *) lpvParam = FALSE;
+ break;
+
+ case SPI_GETGRIDGRANULARITY:
+ *(INT32*)lpvParam=GetProfileInt32A("desktop","GridGranularity",1);
+ break;
+
+ case SPI_GETICONTITLEWRAP:
+ *(BOOL32*)lpvParam=GetProfileInt32A("desktop","IconTitleWrap",TRUE);
+ break;
+
+ case SPI_GETKEYBOARDDELAY:
+ *(INT32*)lpvParam=GetProfileInt32A("keyboard","KeyboardDelay",1);
+ break;
+
+ case SPI_GETKEYBOARDSPEED:
+ *(DWORD*)lpvParam=GetProfileInt32A("keyboard","KeyboardSpeed",30);
+ break;
+
+ case SPI_GETMENUDROPALIGNMENT:
+ *(BOOL32*)lpvParam=GetSystemMetrics32(SM_MENUDROPALIGNMENT); /* XXX check this */
+ break;
+
+ case SPI_GETSCREENSAVEACTIVE:
+ if ( GetProfileInt32A( "windows", "ScreenSaveActive", 1 ) == 1 )
+ *(BOOL32*)lpvParam = TRUE;
+ else
+ *(BOOL32*)lpvParam = FALSE;
+ break;
+
+ case SPI_GETSCREENSAVETIMEOUT:
+ /* FIXME GetProfileInt( "windows", "ScreenSaveTimeout", 300 ); */
+ XGetScreenSaver(display, &timeout, &temp,&temp,&temp);
+ *(INT32 *) lpvParam = timeout * 1000;
+ break;
+
+ case SPI_ICONHORIZONTALSPACING:
+ /* FIXME Get/SetProfileInt */
+ if (lpvParam == NULL)
+ /*SetSystemMetrics( SM_CXICONSPACING, uParam )*/ ;
+ else
+ *(INT32*)lpvParam=GetSystemMetrics32(SM_CXICONSPACING);
+ break;
+
+ case SPI_ICONVERTICALSPACING:
+ /* FIXME Get/SetProfileInt */
+ if (lpvParam == NULL)
+ /*SetSystemMetrics( SM_CYICONSPACING, uParam )*/ ;
+ else
+ *(INT32*)lpvParam=GetSystemMetrics32(SM_CYICONSPACING);
+ break;
+
+ case SPI_GETICONTITLELOGFONT: {
+ LPLOGFONT32A lpLogFont = (LPLOGFONT32A)lpvParam;
+
+ GetProfileString32A("Desktop", "IconTitleFaceName", "Helvetica",
+ lpLogFont->lfFaceName, LF_FACESIZE );
+ lpLogFont->lfHeight = -GetProfileInt32A("Desktop","IconTitleSize", 8);
+
+ lpLogFont->lfWidth = 0;
+ lpLogFont->lfEscapement = lpLogFont->lfOrientation = 0;
+ lpLogFont->lfWeight = FW_NORMAL;
+ lpLogFont->lfItalic = FALSE;
+ lpLogFont->lfStrikeOut = FALSE;
+ lpLogFont->lfUnderline = FALSE;
+ lpLogFont->lfCharSet = ANSI_CHARSET;
+ lpLogFont->lfOutPrecision = OUT_DEFAULT_PRECIS;
+ lpLogFont->lfClipPrecision = CLIP_DEFAULT_PRECIS;
+ lpLogFont->lfPitchAndFamily = DEFAULT_PITCH | FF_SWISS;
+ break;
+ }
+ case SPI_GETWORKAREA:
+ SetRect32( (RECT32 *)lpvParam, 0, 0,
+ GetSystemMetrics32( SM_CXSCREEN ),
+ GetSystemMetrics32( SM_CYSCREEN )
+ );
+ break;
+ case SPI_GETNONCLIENTMETRICS: {
+ /* FIXME: implement correctly */
+ LPNONCLIENTMETRICS32A lpnm=(LPNONCLIENTMETRICS32A)lpvParam;
+
+ SystemParametersInfo32A(SPI_GETICONTITLELOGFONT,0,(LPVOID)&(lpnm->lfCaptionFont),0);
+ SystemParametersInfo32A(SPI_GETICONTITLELOGFONT,0,(LPVOID)&(lpnm->lfMenuFont),0);
+ SystemParametersInfo32A(SPI_GETICONTITLELOGFONT,0,(LPVOID)&(lpnm->lfStatusFont),0);
+ SystemParametersInfo32A(SPI_GETICONTITLELOGFONT,0,(LPVOID)&(lpnm->lfMessageFont),0);
+ break;
+ }
+ default:
+ return SystemParametersInfo16(uAction,uParam,lpvParam,fuWinIni);
+ }
+ return TRUE;
}
@@ -1080,6 +1190,16 @@
lpLogFont->lfPitchAndFamily = DEFAULT_PITCH | FF_SWISS;
break;
}
+ case SPI_GETNONCLIENTMETRICS: {
+ /* FIXME: implement correctly */
+ LPNONCLIENTMETRICS16 lpnm=(LPNONCLIENTMETRICS16)lpvParam;
+
+ SystemParametersInfo16(SPI_GETICONTITLELOGFONT,0,(LPVOID)&(lpnm->lfCaptionFont),0);
+ SystemParametersInfo16(SPI_GETICONTITLELOGFONT,0,(LPVOID)&(lpnm->lfMenuFont),0);
+ SystemParametersInfo16(SPI_GETICONTITLELOGFONT,0,(LPVOID)&(lpnm->lfStatusFont),0);
+ SystemParametersInfo16(SPI_GETICONTITLELOGFONT,0,(LPVOID)&(lpnm->lfMessageFont),0);
+ break;
+ }
case SPI_LANGDRIVER:
case SPI_SETBORDER:
@@ -1153,6 +1273,16 @@
lpLogFont->lfPitchAndFamily = DEFAULT_PITCH | FF_SWISS;
}
break;
+ case SPI_GETNONCLIENTMETRICS: {
+ /* FIXME: implement correctly */
+ LPNONCLIENTMETRICS32W lpnm=(LPNONCLIENTMETRICS32W)lpvParam;
+
+ SystemParametersInfo32W(SPI_GETICONTITLELOGFONT,0,(LPVOID)&(lpnm->lfCaptionFont),0);
+ SystemParametersInfo32W(SPI_GETICONTITLELOGFONT,0,(LPVOID)&(lpnm->lfMenuFont),0);
+ SystemParametersInfo32W(SPI_GETICONTITLELOGFONT,0,(LPVOID)&(lpnm->lfStatusFont),0);
+ SystemParametersInfo32W(SPI_GETICONTITLELOGFONT,0,(LPVOID)&(lpnm->lfMessageFont),0);
+ break;
+ }
default:
return SystemParametersInfo32A(uAction,uParam,lpvParam,fuWinIni);
diff --git a/misc/ole2nls.c b/misc/ole2nls.c
index ea6975d..53ad95ee 100644
--- a/misc/ole2nls.c
+++ b/misc/ole2nls.c
@@ -12,6 +12,8 @@
#include "ole.h"
#include "options.h"
#include "winnls.h"
+#include "winreg.h"
+#include "winerror.h"
#include "stddebug.h"
#include "debug.h"
@@ -126,6 +128,58 @@
{NULL,0},
};
+const struct map_lcid2str {
+ LCID langid;
+ const char *langname;
+} languages[]={
+ {0x0401,"Arabisch"},
+ {0x0402,"Bulgarisch"},
+ {0x0403,"Katalanisch"},
+ {0x0404,"Traditionales Chinesisch"},
+ {0x0405,"Tschecisch"},
+ {0x0406,"Ddnisch"},
+ {0x0407,"Deutsch"},
+ {0x0408,"Griechisch"},
+ {0x0409,"Amerikanisches Englisch"},
+ {0x040A,"Kastilisches Spanisch"},
+ {0x040B,"Finnisch"},
+ {0x040C,"Franzvsisch"},
+ {0x040D,"Hebrdisch"},
+ {0x040E,"Ungarisch"},
+ {0x040F,"Isldndisch"},
+ {0x0410,"Italienisch"},
+ {0x0411,"Japanisch"},
+ {0x0412,"Koreanisch"},
+ {0x0413,"Niederldndisch"},
+ {0x0414,"Norwegisch-Bokmal"},
+ {0x0415,"Polnisch"},
+ {0x0416,"Brasilianisches Portugiesisch"},
+ {0x0417,"Rdtoromanisch"},
+ {0x0418,"Rumdnisch"},
+ {0x0419,"Russisch"},
+ {0x041A,"Kroatoserbisch (lateinisch)"},
+ {0x041B,"Slowenisch"},
+ {0x041C,"Albanisch"},
+ {0x041D,"Schwedisch"},
+ {0x041E,"Thai"},
+ {0x041F,"T|rkisch"},
+ {0x0420,"Urdu"},
+ {0x0421,"Bahasa"},
+ {0x0804,"Vereinfachtes Chinesisch"},
+ {0x0807,"Schweizerdeutsch"},
+ {0x0809,"Britisches Englisch"},
+ {0x080A,"Mexikanisches Spanisch"},
+ {0x080C,"Belgisches Franzvsisch"},
+ {0x0810,"Schweizerisches Italienisch"},
+ {0x0813,"Belgisches Niederldndisch"},
+ {0x0814,"Norgwegisch-Nynorsk"},
+ {0x0816,"Portugiesisch"},
+ {0x081A,"Serbokratisch (kyrillisch)"},
+ {0x0C1C,"Kanadisches Franzvsisch"},
+ {0x100C,"Schweizerisches Franzvsisch"},
+ {0x0000,"Unbekannt"},
+};
+
/***********************************************************************
* GetUserDefaultLCID (OLE2NLS.1)
*/
@@ -195,12 +249,17 @@
* GetLocaleInfoA (OLE2NLS.5)
* Is the last parameter really WORD for Win16?
*/
-int GetLocaleInfoA(DWORD lcid,DWORD LCType,LPSTR buf,WORD len)
+INT16 GetLocaleInfo16(LCID lcid,LCTYPE LCType,LPSTR buf,INT16 len)
+{
+ return GetLocaleInfo32A(lcid,LCType,buf,len);
+}
+
+INT32 GetLocaleInfo32A(LCID lcid,LCTYPE LCType,LPSTR buf,INT32 len)
{
char *retString;
int found,i;
- dprintf_ole(stddeb,"GetLocaleInfoA(%8lX,%8lX,%p,%4X)\n",
+ dprintf_ole(stddeb,"GetLocaleInfo32A(%8lX,%8lX,%p,%4X)\n",
lcid,LCType,buf,len);
/* As an option, we could obtain the value from win.ini.
This would not match the Wine compile-time option.
@@ -358,7 +417,7 @@
case LANG_Da:
switch (LCType) {
-/* LOCVAL(LOCALE_ILANGUAGE,"9") */
+LOCVAL(LOCALE_ILANGUAGE,"6")
LOCVAL(LOCALE_SLANGUAGE,"Dansk")
LOCVAL(LOCALE_SENGLANGUAGE,"Danish")
LOCVAL(LOCALE_SABBREVLANGNAME,"dan")
@@ -366,9 +425,9 @@
LOCVAL(LOCALE_ICOUNTRY,"45")
LOCVAL(LOCALE_SCOUNTRY,"Danmark")
LOCVAL(LOCALE_SENGCOUNTRY,"Denmark")
-LOCVAL(LOCALE_SABBREVCTRYNAME,"Da")
+LOCVAL(LOCALE_SABBREVCTRYNAME,"DK")
LOCVAL(LOCALE_SNATIVECTRYNAME,"Danmark")
-/* LOCVAL(LOCALE_IDEFAULTLANGUAGE,"9") */
+LOCVAL(LOCALE_IDEFAULTLANGUAGE,"6")
LOCVAL(LOCALE_IDEFAULTCOUNTRY,"45")
/* LOCVAL(LOCALE_IDEFAULTCODEPAGE) */
/* LOCVAL(LOCALE_IDEFAULTANSICODEPAGE) */
@@ -403,8 +462,8 @@
LOCVAL(LOCALE_ITLZERO,"1")
/* LOCVAL(LOCALE_IDAYLZERO) */
/* LOCVAL(LOCALE_IMONLZERO) */
-/* LOCVAL(LOCALE_S1159) */
-/* LOCVAL(LOCALE_S2359) */
+LOCVAL(LOCALE_S1159, "")
+LOCVAL(LOCALE_S2359, "")
/* LOCVAL(LOCALE_ICALENDARTYPE) */
/* LOCVAL(LOCALE_IOPTIONALCALENDAR) */
/* LOCVAL(LOCALE_IFIRSTDAYOFWEEK) */
@@ -449,14 +508,14 @@
LOCVAL(LOCALE_SABBREVMONTHNAME11,"Nov")
LOCVAL(LOCALE_SABBREVMONTHNAME12,"Dec")
LOCVAL(LOCALE_SABBREVMONTHNAME13,"")
-/* LOCVAL(LOCALE_SPOSITIVESIGN) */
-/* LOCVAL(LOCALE_SNEGATIVESIGN) */
-/* LOCVAL(LOCALE_IPOSSIGNPOSN) */
-/* LOCVAL(LOCALE_INEGSIGNPOSN) */
-/* LOCVAL(LOCALE_IPOSSYMPRECEDES) */
-/* LOCVAL(LOCALE_IPOSSEPBYSPACE) */
-/* LOCVAL(LOCALE_INEGSYMPRECEDES) */
-/* LOCVAL(LOCALE_INEGSEPBYSPACE) */
+LOCVAL(LOCALE_SPOSITIVESIGN, "")
+LOCVAL(LOCALE_SNEGATIVESIGN, "-")
+LOCVAL(LOCALE_IPOSSIGNPOSN, "3")
+LOCVAL(LOCALE_INEGSIGNPOSN, "3")
+LOCVAL(LOCALE_IPOSSYMPRECEDES, "1")
+LOCVAL(LOCALE_IPOSSEPBYSPACE, "0")
+LOCVAL(LOCALE_INEGSYMPRECEDES, "1")
+LOCVAL(LOCALE_INEGSEPBYSPACE, "0")
default: found=0;break;
}
break; /* LANG(Da) */
@@ -1639,12 +1698,12 @@
*/
INT32 GetLocaleInfo32W(LCID lcid,LCTYPE LCType,LPWSTR wbuf,INT32 len)
{
- int i;
- LPSTR abuf = (LPSTR) wbuf;
- INT32 n = GetLocaleInfoA(lcid, LCType, abuf, len);
+ LPSTR abuf = (LPSTR)HeapAlloc(GetProcessHeap(),0,len);
+
+ INT32 n = GetLocaleInfo32A(lcid, LCType, abuf, len);
if (wbuf)
- for (i = n; i > 0; --i)
- wbuf[i] = abuf[i];
+ lstrcpynAtoW(wbuf,abuf,len);
+ HeapFree(GetProcessHeap(),0,abuf);
return n;
}
@@ -1728,14 +1787,9 @@
/***********************************************************************
* IsValidLocale (KERNEL32.361)
*/
-BOOL32 IsValidLocale(DWORD lcid,DWORD flags) {
- int i;
-
- i=0;
- while (locale_name2id[i].name!=NULL)
- if (locale_name2id[i].id == lcid)
- return TRUE;
- return FALSE;
+BOOL32 IsValidLocale(LCID lcid,DWORD flags) {
+ /* we support ANY language. Well, at least say that...*/
+ return TRUE;
}
/***********************************************************************
@@ -1745,14 +1799,34 @@
{
int i;
BOOL32 ret;
+ WCHAR buffer[200];
+ HKEY xhkey;
dprintf_win32(stddeb,"EnumSystemLocales32W(%p,%08lx)\n",
lpfnLocaleEnum,flags );
+ /* see if we can reuse the Win95 registry entries.... */
+ if (ERROR_SUCCESS==RegOpenKey32A(HKEY_LOCAL_MACHINE,"\\System\\CurrentControlSet\\control\\Nls\\Locale\\",&xhkey)) {
+ i=0;
+ while (1) {
+ if (ERROR_SUCCESS!=RegEnumKey32W(xhkey,i,buffer,sizeof(buffer)))
+ break;
+ if (!lpfnLocaleEnum(buffer))
+ break;
+ i++;
+ }
+ RegCloseKey(xhkey);
+ return TRUE;
+ }
+
i=0;
- while (locale_name2id[i].name!=NULL)
+ while (languages[i].langname!=NULL)
{
- LPWSTR cp = HEAP_strdupAtoW( GetProcessHeap(), 0,
- locale_name2id[i].name );
+ LPWSTR cp;
+ char xbuffer[10];
+
+ sprintf(xbuffer,"%08lx",(DWORD)languages[i].langid);
+
+ cp = HEAP_strdupAtoW( GetProcessHeap(), 0, xbuffer );
ret = lpfnLocaleEnum(cp);
HeapFree( GetProcessHeap(), 0, cp );
if (!ret) break;
@@ -1767,13 +1841,28 @@
BOOL32
EnumSystemLocales32A(LOCALE_ENUMPROC32A lpfnLocaleEnum,DWORD flags) {
int i;
+ CHAR buffer[200];
+ HKEY xhkey;
dprintf_win32(stddeb,"EnumSystemLocales32A(%p,%08lx)\n",
lpfnLocaleEnum,flags
);
+ if (ERROR_SUCCESS==RegOpenKey32A(HKEY_LOCAL_MACHINE,"\\System\\CurrentControlSet\\control\\Nls\\Locale\\",&xhkey)) {
+ i=0;
+ while (1) {
+ if (ERROR_SUCCESS!=RegEnumKey32A(xhkey,i,buffer,sizeof(buffer)))
+ break;
+ if (!lpfnLocaleEnum(buffer))
+ break;
+ i++;
+ }
+ RegCloseKey(xhkey);
+ return TRUE;
+ }
i=0;
- while (locale_name2id[i].name!=NULL) {
- if (!lpfnLocaleEnum(locale_name2id[i].name))
+ while (languages[i].langname!=NULL) {
+ sprintf(buffer,"%08lx",(DWORD)languages[i].langid);
+ if (!lpfnLocaleEnum(buffer))
break;
i++;
}
@@ -1821,7 +1910,9 @@
if (isspace(src[i])) chartype[i]|=C1_SPACE;
if (ispunct(src[i])) chartype[i]|=C1_PUNCT;
if (iscntrl(src[i])) chartype[i]|=C1_CNTRL;
- if (isblank(src[i])) chartype[i]|=C1_BLANK;
+/* FIXME: isblank() is a GNU extension */
+/* if (isblank(src[i])) chartype[i]|=C1_BLANK; */
+ if ((src[i] == ' ') || (src[i] == '\t')) chartype[i]|=C1_BLANK;
/* C1_XDIGIT */
}
return TRUE;
@@ -1869,3 +1960,60 @@
}
return TRUE;
}
+
+/* VerLanguageName [VER.10] */
+DWORD
+VerLanguageName16(UINT16 langid,LPSTR langname,UINT16 langnamelen) {
+ int i;
+ char *buf;
+
+ dprintf_ver(stddeb,"VerLanguageName(%d,%p,%d)\n",langid,langname,langnamelen);
+ /* First, check \System\CurrentControlSet\control\Nls\Locale\<langid>
+ * from the registry.
+ */
+ buf=(char*)malloc(strlen("\\System\\CurrentControlSet\\control\\Nls\\Locale\\")+9);
+ sprintf(buf,"\\System\\CurrentControlSet\\control\\Nls\\Locale\\%08x",langid);
+ if (ERROR_SUCCESS==RegQueryValue16(HKEY_LOCAL_MACHINE,buf,langname,(LPDWORD)&langnamelen)) {
+ langname[langnamelen-1]='\0';
+ return langnamelen;
+ }
+ /* if that fails, use the interal table */
+ for (i=0;languages[i].langid!=0;i++)
+ if (langid==languages[i].langid)
+ break;
+ strncpy(langname,languages[i].langname,langnamelen);
+ langname[langnamelen-1]='\0';
+ return strlen(languages[i].langname);
+}
+
+/* VerLanguageNameA [VERSION.9] */
+DWORD
+VerLanguageName32A(UINT32 langid,LPSTR langname,UINT32 langnamelen) {
+ return VerLanguageName16(langid,langname,langnamelen);
+}
+
+/* VerLanguageNameW [VERSION.10] */
+DWORD
+VerLanguageName32W(UINT32 langid,LPWSTR langname,UINT32 langnamelen) {
+ int i;
+ char buffer[80];
+ LPWSTR keyname;
+
+ /* First, check \System\CurrentControlSet\control\Nls\Locale\<langid>
+ * from the registry.
+ */
+ sprintf(buffer,"\\System\\CurrentControlSet\\control\\Nls\\Locale\\%08x",langid);
+ keyname = HEAP_strdupAtoW( GetProcessHeap(), 0, buffer );
+ if (ERROR_SUCCESS==RegQueryValue32W(HKEY_LOCAL_MACHINE,keyname,langname,(LPDWORD)&langnamelen)) {
+ HeapFree( GetProcessHeap(), 0, keyname );
+ return langnamelen;
+ }
+ HeapFree( GetProcessHeap(), 0, keyname );
+ /* if that fails, use the interal table */
+ for (i=0;languages[i].langid!=0;i++)
+ if (langid==languages[i].langid)
+ break;
+ lstrcpyAtoW( langname, languages[i].langname );
+ return strlen(languages[i].langname); /* same as strlenW(langname); */
+}
+
diff --git a/misc/tweak.c b/misc/tweak.c
new file mode 100644
index 0000000..a9118d5
--- /dev/null
+++ b/misc/tweak.c
@@ -0,0 +1,456 @@
+/******************************************************************************
+ *
+ * tweak.c
+ *
+ * Windows 95 style interface tweaks.
+ * Copyright (c) 1997 Dave Cuthbert.
+ *
+ * FIXME: This file is, unfortunately, aptly named: the method of
+ * displaying Win95 style windows is a tweak. Lots of stuff does not yet
+ * work -- and probably never will unless some of this code is
+ * incorporated into the mainstream Wine code.
+ *
+ * DEVELOPERS, PLEASE NOTE: Before delving into the mainstream code and
+ * altering it, consider how your changes will affect the Win3.1 interface
+ * (which has taken a major effort to create!). After you make any sort of
+ * non-trivial change, *test* the Wine code running in Win3.1 mode! The
+ * object here is to make it so that the person who tests the latest version
+ * of Wine without adding the tweaks into wine.conf notices nothing out of
+ * the ordinary.
+ *
+ * Revision history
+ * 03-Jul-1997 Dave Cuthbert (dacut@ece.cmu.edu)
+ * Original implementation.
+ *
+ *****************************************************************************/
+
+#include <stdio.h>
+#include <malloc.h>
+#include <X11/Xlib.h>
+#include <string.h>
+#include "dc.h"
+#include "debug.h"
+#include "graphics.h"
+#include "options.h"
+#include "stackframe.h"
+#include "syscolor.h"
+#include "tweak.h"
+#include "windows.h"
+
+/* Parameters for windows/nonclient.c */
+extern int NC_CaptionLeftNudge;
+extern int NC_CaptionTopNudge;
+extern int NC_SysControlNudge;
+extern int NC_MaxControlNudge;
+extern int NC_MinControlNudge;
+extern UINT32 NC_CaptionTextFlags;
+extern HBRUSH32 NC_WinHighlight95;
+extern HBRUSH32 NC_WinShadow95;
+
+/* Parameters for controls/menu.c */
+extern UINT32 MENU_BarItemTopNudge;
+extern UINT32 MENU_BarItemLeftNudge;
+extern UINT32 MENU_ItemTopNudge;
+extern UINT32 MENU_ItemLeftNudge;
+extern UINT32 MENU_HighlightTopNudge;
+extern UINT32 MENU_HighlightLeftNudge;
+extern UINT32 MENU_HighlightBottomNudge;
+extern UINT32 MENU_HighlightRightNudge;
+
+/* General options */
+HPEN32 TWEAK_PenFF95;
+HPEN32 TWEAK_PenE095;
+HPEN32 TWEAK_PenC095;
+HPEN32 TWEAK_Pen8095;
+HPEN32 TWEAK_Pen0095;
+
+#if defined(WIN_95_LOOK)
+int TWEAK_Win95Look = 1;
+#else
+int TWEAK_Win95Look = 0;
+#endif
+
+int TWEAK_WineInitialized = 0;
+
+
+/******************************************************************************
+ *
+ * int TWEAK_MenuInit()
+ *
+ * Initializes the Win95 tweaks to the menu code. See controls/menu.c.
+ * Return value indicates success (non-zero) or failure.
+ *
+ * Revision history
+ * 06-Jul-1997 Dave Cuthbert (dacut@ece.cmu.edu)
+ * Original implementation.
+ *
+ *****************************************************************************/
+
+static int TWEAK_MenuInit()
+{
+ MENU_BarItemTopNudge =
+ PROFILE_GetWineIniInt("Tweak.Layout", "MenuBarItemTopNudge", 0);
+ MENU_BarItemLeftNudge =
+ PROFILE_GetWineIniInt("Tweak.Layout", "MenuBarItemLeftNudge", 0);
+ MENU_ItemTopNudge =
+ PROFILE_GetWineIniInt("Tweak.Layout", "MenuItemTopNudge", 0);
+ MENU_ItemLeftNudge =
+ PROFILE_GetWineIniInt("Tweak.Layout", "MenuItemLeftNudge", 0);
+ MENU_HighlightTopNudge =
+ PROFILE_GetWineIniInt("Tweak.Layout", "MenuHighlightTopNudge", 0);
+ MENU_HighlightLeftNudge =
+ PROFILE_GetWineIniInt("Tweak.Layout", "MenuHighlightLeftNudge", 0);
+ MENU_HighlightBottomNudge =
+ PROFILE_GetWineIniInt("Tweak.Layout", "MenuHighlightBottomNudge", 0);
+ MENU_HighlightRightNudge =
+ PROFILE_GetWineIniInt("Tweak.Layout", "MenuHighlightRightNudge", 0);
+
+ return 1;
+}
+
+
+/******************************************************************************
+ *
+ * int TWEAK_NonClientInit()
+ *
+ * Initializes the Win95 tweaks to the non-client drawing functions. See
+ * windows/nonclient.c. Return value indicates success (non-zero) or
+ * failure.
+ *
+ * Revision history
+ * 05-Jul-1997 Dave Cuthbert (dacut@ece.cmu.edu)
+ * Original implementation.
+ *
+ *****************************************************************************/
+
+static int TWEAK_NonClientInit()
+{
+ char key_value[2];
+
+ NC_CaptionLeftNudge =
+ PROFILE_GetWineIniInt("Tweak.Layout", "CaptionLeftNudge", 0);
+ NC_CaptionTopNudge =
+ PROFILE_GetWineIniInt("Tweak.Layout", "CaptionTopNudge", 0);
+ NC_SysControlNudge =
+ PROFILE_GetWineIniInt("Tweak.Layout", "SysControlNudge", 0);
+ NC_MaxControlNudge =
+ PROFILE_GetWineIniInt("Tweak.Layout", "MaxControlNudge", 0);
+ NC_MinControlNudge =
+ PROFILE_GetWineIniInt("Tweak.Layout", "MinControlNudge", 0);
+
+ NC_WinHighlight95 = CreateSolidBrush32(RGB(0xc0, 0xc0, 0xc0));
+ NC_WinShadow95 = CreateSolidBrush32(RGB(0x00, 0x00, 0x00));
+
+ NC_CaptionTextFlags = DT_SINGLELINE | DT_VCENTER | DT_NOPREFIX;
+
+ PROFILE_GetWineIniString("Tweak.Layout", "CaptionAlignment",
+ TWEAK_Win95Look ? "l" : "c", key_value, 2);
+
+ switch(key_value[0]) {
+ case 'l':
+ case 'L':
+ NC_CaptionTextFlags |= DT_LEFT;
+ break;
+
+ case 'r':
+ case 'R':
+ NC_CaptionTextFlags |= DT_RIGHT;
+ break;
+
+ default:
+ NC_CaptionTextFlags |= DT_CENTER;
+ }
+
+ return 1;
+}
+
+
+/******************************************************************************
+ *
+ * int TWEAK_VarInit()
+ *
+ * Initializes the miscellaneous variables which are used in the tweak
+ * routines. Return value is non-zero on success.
+ *
+ * Revision history
+ * 07-Jul-1997 Dave Cuthbert (dacut@ece.cmu.edu)
+ * Original implementation.
+ *
+ *****************************************************************************/
+
+static int TWEAK_VarInit()
+{
+ TWEAK_Win95Look = PROFILE_GetWineIniBool("Tweak.Layout", "Win95Look", 0);
+
+ /* FIXME: Each color should really occupy a single entry in the wine.conf
+ file, but I couldn't settle on a good (intuitive!) format. */
+
+ TWEAK_PenFF95 = CreatePen32(
+ PS_SOLID, 1,
+ RGB(PROFILE_GetWineIniInt("Tweak.Colors", "PenFF95.Red", 0xff),
+ PROFILE_GetWineIniInt("Tweak.Colors", "PenFF95.Grn", 0xff),
+ PROFILE_GetWineIniInt("Tweak.Colors", "PenFF95.Blu", 0xff)));
+ TWEAK_PenE095 = CreatePen32(
+ PS_SOLID, 1,
+ RGB(PROFILE_GetWineIniInt("Tweak.Colors", "PenE095.Red", 0xe0),
+ PROFILE_GetWineIniInt("Tweak.Colors", "PenE095.Grn", 0xe0),
+ PROFILE_GetWineIniInt("Tweak.Colors", "PenE095.Blu", 0xe0)));
+ TWEAK_PenC095 = CreatePen32(
+ PS_SOLID, 1,
+ RGB(PROFILE_GetWineIniInt("Tweak.Colors", "PenC095.Red", 0xc0),
+ PROFILE_GetWineIniInt("Tweak.Colors", "PenC095.Grn", 0xc0),
+ PROFILE_GetWineIniInt("Tweak.Colors", "PenC095.Blu", 0xc0)));
+ TWEAK_Pen8095 = CreatePen32(
+ PS_SOLID, 1,
+ RGB(PROFILE_GetWineIniInt("Tweak.Colors", "Pen8095.Red", 0x80),
+ PROFILE_GetWineIniInt("Tweak.Colors", "Pen8095.Grn", 0x80),
+ PROFILE_GetWineIniInt("Tweak.Colors", "Pen8095.Blu", 0x80)));
+ TWEAK_Pen0095 = CreatePen32(
+ PS_SOLID, 1,
+ RGB(PROFILE_GetWineIniInt("Tweak.Colors", "Pen0095.Red", 0x00),
+ PROFILE_GetWineIniInt("Tweak.Colors", "Pen0095.Grn", 0x00),
+ PROFILE_GetWineIniInt("Tweak.Colors", "Pen0095.Blu", 0x00)));
+
+ dprintf_tweak(stddeb, "TWEAK_VarInit: Using %s look and feel.\n",
+ TWEAK_Win95Look ? "Win95" : "Win3.1");
+ return 1;
+}
+
+
+/******************************************************************************
+ *
+ * int TWEAK_Init()
+ *
+ * Does the full initialization of the Win95 tweak subsystem. Return value
+ * indicates success. Called by loader/main.c's MAIN_Init().
+ *
+ * Revision history
+ * 05-Jul-1997 Dave Cuthbert (dacut@ece.cmu.edu)
+ * Original implementation.
+ *
+ *****************************************************************************/
+
+int TWEAK_Init()
+{
+ TWEAK_VarInit();
+ TWEAK_NonClientInit();
+ TWEAK_MenuInit();
+ return 1;
+}
+
+
+/******************************************************************************
+ *
+ * int TWEAK_CheckOldFonts()
+ *
+ * Examines wine.conf for old/invalid font entries and recommend changes to
+ * the user.
+ *
+ * Revision history
+ * 05-Jul-1997 Dave Cuthbert (dacut@ece.cmu.edu)
+ * Original implementation.
+ *
+ *****************************************************************************/
+
+static void TWEAK_CheckOldFontsCallback(char const *, char const *, void *);
+
+static char const *fontmsgprologue =
+"Wine warning:\n"
+" The following entries in the [fonts] section of the wine.conf file are\n"
+" obsolete or invalid:\n";
+
+static char const *fontmsgepilogue =
+" These entries should be eliminated or updated.\n"
+" See the documentation/fonts file for more information.\n";
+
+static int TWEAK_CheckOldFonts()
+{
+ int found = 0;
+
+ PROFILE_EnumerateWineIniSection("Fonts", &TWEAK_CheckOldFontsCallback,
+ (void *)&found);
+ if(found)
+ fprintf(stderr, fontmsgepilogue);
+
+ return 1;
+}
+
+static void TWEAK_CheckOldFontsCallback(
+ char const *key,
+ char const *value,
+ void *found)
+{
+ /* Ignore any keys that start with potential comment characters "'", '#',
+ or ';'. */
+ if(key[0] == '\'' || key[0] == '#' || key[0] == ';' || key[0] == '\0')
+ return;
+
+ /* Make sure this is a valid key */
+ if(strncasecmp(key, "Alias", 5) == 0 ||
+ strcasecmp(key, "Default") == 0) {
+
+ /* Valid key; make sure the value doesn't contain a wildcard */
+ if(strchr(value, '*')) {
+ if(*(int *)found == 0) {
+ fprintf(stderr, fontmsgprologue);
+ ++*(int *)found;
+ }
+
+ fprintf(stderr, " %s=%s [no wildcards allowed]\n", key, value);
+ }
+ }
+ else {
+ /* Not a valid key */
+ if(*(int *)found == 0) {
+ fprintf(stderr, fontmsgprologue);
+ ++*(int *)found;
+ }
+
+ fprintf(stderr, " %s=%s [obsolete]\n", key, value);
+ }
+
+ return;
+}
+
+
+/******************************************************************************
+ *
+ * int TWEAK_CheckConfiguration()
+ *
+ * Examines wine.conf for old/bad entries and recommends changes to the user.
+ *
+ * Revision history
+ * 05-Jul-1997 Dave Cuthbert (dacut@ece.cmu.edu)
+ * Original implementation.
+ *
+ *****************************************************************************/
+
+int TWEAK_CheckConfiguration()
+{
+ TWEAK_CheckOldFonts();
+ return 1;
+}
+
+
+
+/******************************************************************************
+ *
+ * Tweak graphic subsystem.
+ *
+ *****************************************************************************/
+
+/******************************************************************************
+ *
+ * void TWEAK_DrawReliefRect95(
+ * HDC32 hdc, // Device context on which to draw
+ * RECT32 const *rect ) // Rectangle to use
+ *
+ * Draws the double-bordered Win95-style relief rectangle.
+ *
+ * Bugs
+ * There are some checks missing from this function. Perhaps the
+ * SelectObject32 calls should be examined? Hasn't failed on me (yet).
+ *
+ * Should I really be calling X functions directly from here? It is
+ * an optimization, but should I be optimizing alpha code? Probably
+ * not.
+ *
+ * Revision history
+ * 08-Jul-1997 Dave Cuthbert (dacut@ece.cmu.edu)
+ * Original implementation.
+ *
+ *****************************************************************************/
+
+void TWEAK_DrawReliefRect95(
+ HDC32 hdc,
+ RECT32 const *rect )
+{
+ DC *dc;
+ HPEN32 prevpen;
+
+ if((dc = (DC *)GDI_GetObjPtr(hdc, DC_MAGIC))) {
+
+ /* Draw the top/left lines first */
+ prevpen = SelectObject32(hdc, TWEAK_PenE095);
+ DC_SetupGCForPen(dc);
+ XDrawLine(display, dc->u.x.drawable, dc->u.x.gc, rect->left, rect->top,
+ rect->right - 1, rect->top);
+ XDrawLine(display, dc->u.x.drawable, dc->u.x.gc, rect->left, rect->top,
+ rect->left, rect->bottom - 1);
+
+ SelectObject32(hdc, TWEAK_PenFF95);
+ DC_SetupGCForPen(dc);
+ XDrawLine(display, dc->u.x.drawable, dc->u.x.gc, rect->left + 1,
+ rect->top + 1, rect->right - 2, rect->top + 1);
+ XDrawLine(display, dc->u.x.drawable, dc->u.x.gc, rect->left + 1,
+ rect->top + 1, rect->left + 1, rect->bottom - 2);
+
+
+ /* Now the bottom/right lines */
+ SelectObject32(hdc, TWEAK_Pen0095);
+ DC_SetupGCForPen(dc);
+ XDrawLine(display, dc->u.x.drawable, dc->u.x.gc, rect->left,
+ rect->bottom - 1, rect->right - 1, rect->bottom - 1);
+ XDrawLine(display, dc->u.x.drawable, dc->u.x.gc, rect->right - 1,
+ rect->top, rect->right - 1, rect->bottom - 1);
+
+ SelectObject32(hdc, TWEAK_Pen8095);
+ DC_SetupGCForPen(dc);
+ XDrawLine(display, dc->u.x.drawable, dc->u.x.gc, rect->left + 1,
+ rect->bottom - 2, rect->right - 2, rect->bottom - 2);
+ XDrawLine(display, dc->u.x.drawable, dc->u.x.gc, rect->right - 2,
+ rect->top + 1, rect->right - 2, rect->bottom - 2);
+
+ SelectObject32(hdc, prevpen);
+ }
+
+ return;
+}
+
+
+/******************************************************************************
+ *
+ * void TWEAK_DrawMenuSeparator95(
+ * HDC32 hdc, // Device context on which to draw
+ * UINT32 xc1, // Left x-coordinate
+ * UINT32 yc, // Y-coordinate of the LOWER line
+ * UINT32 xc2 ) // Right x-coordinate
+ *
+ * Draws the menu separator bar Win 95 style.
+ *
+ * Bugs
+ * Same as those for DrawReliefRect95.
+ *
+ * Revision history
+ * 08-Jul-1997 Dave Cuthbert (dacut@ece.cmu.edu)
+ * Original implementation.
+ *
+ *****************************************************************************/
+
+void TWEAK_DrawMenuSeparator95(
+ HDC32 hdc,
+ UINT32 xc1,
+ UINT32 yc,
+ UINT32 xc2 )
+{
+ DC *dc;
+ HPEN32 prevpen;
+
+ if((dc = (DC *)GDI_GetObjPtr(hdc, DC_MAGIC))) {
+
+ /* Draw the top line */
+ prevpen = SelectObject32(hdc, TWEAK_Pen8095);
+ DC_SetupGCForPen(dc);
+ XDrawLine(display, dc->u.x.drawable, dc->u.x.gc, xc1, yc - 1, xc2,
+ yc - 1);
+
+ /* And the bottom line */
+ SelectObject32(hdc, TWEAK_PenFF95);
+ DC_SetupGCForPen(dc);
+ XDrawLine(display, dc->u.x.drawable, dc->u.x.gc, xc1, yc, xc2, yc);
+
+ SelectObject32(hdc, prevpen);
+ }
+
+ return;
+}
diff --git a/misc/ver.c b/misc/ver.c
index 70690b8..51b9089 100644
--- a/misc/ver.c
+++ b/misc/ver.c
@@ -27,7 +27,7 @@
/******************************************************************************
*
- * void dprintf_ver_string(
+ * void ver_dstring(
* char const * prologue,
* char const * teststring,
* char const * epilogue )
@@ -39,11 +39,14 @@
*
* Revision history
* 30-May-1997 Dave Cuthbert (dacut@ece.cmu.edu)
- * Original implementation
+ * Original implementation as dprintf[_]ver_string
+ * 05-Jul-1997 Dave Cuthbert (dacut@ece.cmu.edu)
+ * Fixed problem that caused bug with tools/make_debug -- renaming
+ * this function should fix the problem.
*
*****************************************************************************/
-static void dprintf_ver_string(
+static void ver_dstring(
char const * prologue,
char const * teststring,
char const * epilogue )
@@ -557,9 +560,9 @@
else
dprintf_ver(stddeb, "\n");
- dprintf_ver_string("\tlpszFilename = ", lpszFilename, "\n");
- dprintf_ver_string("\tlpszWinDir = ", lpszWinDir, "\n");
- dprintf_ver_string("\tlpszAppDir = ", lpszAppDir, "\n");
+ ver_dstring("\tlpszFilename = ", lpszFilename, "\n");
+ ver_dstring("\tlpszWinDir = ", lpszWinDir, "\n");
+ ver_dstring("\tlpszAppDir = ", lpszAppDir, "\n");
dprintf_ver(stddeb, "\tlpszCurDir = %p\n", lpszCurDir);
if(lpuCurDirLen)
@@ -674,14 +677,14 @@
dprintf_ver(stddeb, ")");
}
- dprintf_ver_string("\n\t(Exit) lpszCurDir = ", lpszCurDir, "\n");
+ ver_dstring("\n\t(Exit) lpszCurDir = ", lpszCurDir, "\n");
if(lpuCurDirLen)
dprintf_ver(stddeb, "\t(Exit) lpuCurDirLen = %p (%u)\n",
lpuCurDirLen, *lpuCurDirLen);
else
dprintf_ver(stddeb, "\t(Exit) lpuCurDirLen = (null)\n");
- dprintf_ver_string("\t(Exit) lpszDestDir = ", lpszDestDir, "\n");
+ ver_dstring("\t(Exit) lpszDestDir = ", lpszDestDir, "\n");
if(lpuDestDirLen)
dprintf_ver(stddeb, "\t(Exit) lpuDestDirLen = %p (%u)\n",
lpuDestDirLen, *lpuDestDirLen);
@@ -972,114 +975,6 @@
return ret;
}
-/* FIXME: This table should, of course, be language dependend */
-static const struct map_id2str {
- UINT16 langid;
- const char *langname;
-} languages[]={
- {0x0401,"Arabisch"},
- {0x0402,"Bulgarisch"},
- {0x0403,"Katalanisch"},
- {0x0404,"Traditionales Chinesisch"},
- {0x0405,"Tschecisch"},
- {0x0406,"Dänisch"},
- {0x0407,"Deutsch"},
- {0x0408,"Griechisch"},
- {0x0409,"Amerikanisches Englisch"},
- {0x040A,"Kastilisches Spanisch"},
- {0x040B,"Finnisch"},
- {0x040C,"Französisch"},
- {0x040D,"Hebräisch"},
- {0x040E,"Ungarisch"},
- {0x040F,"Isländisch"},
- {0x0410,"Italienisch"},
- {0x0411,"Japanisch"},
- {0x0412,"Koreanisch"},
- {0x0413,"Niederländisch"},
- {0x0414,"Norwegisch-Bokmal"},
- {0x0415,"Polnisch"},
- {0x0416,"Brasilianisches Portugiesisch"},
- {0x0417,"Rätoromanisch"},
- {0x0418,"Rumänisch"},
- {0x0419,"Russisch"},
- {0x041A,"Kroatoserbisch (lateinisch)"},
- {0x041B,"Slowenisch"},
- {0x041C,"Albanisch"},
- {0x041D,"Schwedisch"},
- {0x041E,"Thai"},
- {0x041F,"Türkisch"},
- {0x0420,"Urdu"},
- {0x0421,"Bahasa"},
- {0x0804,"Vereinfachtes Chinesisch"},
- {0x0807,"Schweizerdeutsch"},
- {0x0809,"Britisches Englisch"},
- {0x080A,"Mexikanisches Spanisch"},
- {0x080C,"Belgisches Französisch"},
- {0x0810,"Schweizerisches Italienisch"},
- {0x0813,"Belgisches Niederländisch"},
- {0x0814,"Norgwegisch-Nynorsk"},
- {0x0816,"Portugiesisch"},
- {0x081A,"Serbokratisch (kyrillisch)"},
- {0x0C1C,"Kanadisches Französisch"},
- {0x100C,"Schweizerisches Französisch"},
- {0x0000,"Unbekannt"},
-};
-
-/* VerLanguageName [VER.10] */
-DWORD
-VerLanguageName16(UINT16 langid,LPSTR langname,UINT16 langnamelen) {
- int i;
- char *buf;
-
- dprintf_ver(stddeb,"VerLanguageName(%d,%p,%d)\n",langid,langname,langnamelen);
- /* First, check \System\CurrentControlSet\control\Nls\Locale\<langid>
- * from the registry.
- */
- buf=(char*)malloc(strlen("\\System\\CurrentControlSet\\control\\Nls\\Locale\\")+9);
- sprintf(buf,"\\System\\CurrentControlSet\\control\\Nls\\Locale\\%08x",langid);
- if (ERROR_SUCCESS==RegQueryValue16(HKEY_LOCAL_MACHINE,buf,langname,(LPDWORD)&langnamelen)) {
- langname[langnamelen-1]='\0';
- return langnamelen;
- }
- /* if that fails, use the interal table */
- for (i=0;languages[i].langid!=0;i++)
- if (langid==languages[i].langid)
- break;
- strncpy(langname,languages[i].langname,langnamelen);
- langname[langnamelen-1]='\0';
- return strlen(languages[i].langname);
-}
-
-/* VerLanguageNameA [VERSION.9] */
-DWORD
-VerLanguageName32A(UINT32 langid,LPSTR langname,UINT32 langnamelen) {
- return VerLanguageName16(langid,langname,langnamelen);
-}
-
-/* VerLanguageNameW [VERSION.10] */
-DWORD
-VerLanguageName32W(UINT32 langid,LPWSTR langname,UINT32 langnamelen) {
- int i;
- char buffer[80];
- LPWSTR keyname;
-
- /* First, check \System\CurrentControlSet\control\Nls\Locale\<langid>
- * from the registry.
- */
- sprintf(buffer,"\\System\\CurrentControlSet\\control\\Nls\\Locale\\%08x",langid);
- keyname = HEAP_strdupAtoW( GetProcessHeap(), 0, buffer );
- if (ERROR_SUCCESS==RegQueryValue32W(HKEY_LOCAL_MACHINE,keyname,langname,(LPDWORD)&langnamelen)) {
- HeapFree( GetProcessHeap(), 0, keyname );
- return langnamelen;
- }
- HeapFree( GetProcessHeap(), 0, keyname );
- /* if that fails, use the interal table */
- for (i=0;languages[i].langid!=0;i++)
- if (langid==languages[i].langid)
- break;
- lstrcpyAtoW( langname, languages[i].langname );
- return strlen(languages[i].langname); /* same as strlenW(langname); */
-}
/* FIXME: UNICODE? */
struct db {
diff --git a/misc/winsock.c b/misc/winsock.c
index 7f4c314..e4ecd51 100644
--- a/misc/winsock.c
+++ b/misc/winsock.c
@@ -267,6 +267,8 @@
"SunOS",
#elif defined(__FreeBSD__)
"FreeBSD",
+ #elif defined(__OpenBSD__)
+ "OpenBSD/i386",
#else
"Unknown",
#endif