Release 961201

Sat Nov 30 19:21:17 1996  Alexandre Julliard  <julliard@lrc.epfl.ch>

	* [configure]
	Re-generated with autoconf 2.11. Let me know if you have
	problems.

	* [controls/listbox.c] [controls/oldlbox.c]
	Listboxes rewritten from scratch. Moved old code still used by
	comboboxes to oldlbox.c

	* [misc/registry.c]
	Use temporary file when saving registry.

	* [windows/dialog.c]
	Implemented Win32 version of DlgDirList() and DlgDirListComboBox().

	* [windows/winproc.c]
	Added translation for listbox Win32 messages.

Sat Nov 30 21:00:00 Alex Korobka <alex@trantor.pharm.sunysb.edu>

	* [controls/widgets.c] [controls/button.c]
	Fixed some incompatibilities with CTL3D DLL.

	* [windows/dialog.c]
	Made dialog windows fit into the desktop.

	* [misc/winsock.c] [misc/winsock_async.c]
	New Winsock engine.

	* [windows/message.c]
	GetMessage() fixes.

	* [windows/queue.c] [windows/hook.c] [windows/win.c]
	SetMessageQueue() fixes.

Fri Nov 29 10:25:12 1996  Slaven Rezic  <eserte@cs.tu-berlin.de>

	* [objects/text.c]
	DrawText16(): Fixed return value.

Tue Nov 26 14:47:09 1996  Marcus Meissner <msmeissn@cip.informatik.uni-erlangen.de>

	* [files/profile.c] [*/*]
	Added Win32 profile functions, updated to new naming standard.

	* [objects/font.c] [if1632/thunk.c] [include/windows.h]
	Added EnumFonts32*, EnumFontFamiliesEx*, changed prototypes and
	structures.

	* [misc/ole2nls.c] [if1632/thunk.c]
	Added EnumSystemLocales() (winhelp.exe).

	* [misc/registry.c]
	Added Windows 3.1 registry loader supplied by Tor Sjxwall, tor@sn.no

	* [win32/file.c]
	Partially fixed CreateFileMapping(), added UnmapViewOfFile().

Sat Nov 23 23:36:05 1996  Ronan Waide  <waider@waider.ie>

	* [misc/shell.c]
	Fixed some FIXMEs relating to ShellExec() and FindExecutable().

	* [misc/main.c]
	Implemented a few more of the SystemParametersInfo() cases.

Tue Nov 19 01:24:34 1996  Philippe De Muyter  <phdm@info.ucl.ac.be>

	* [include/keyboard.h]
	New file, new macro WINE_VKEY_MAPPINGS (using code taken from event.c).

	* [include/windows.h]
	New [VK_A, VK_Z] and [VK_0, VK9] macros.

	* [misc/keyboard.c]
	Fixes in KeyTable and ToAscii.

	* [objects/font.c]
	FONT_init : Give default value for MSWIN "system" font.
	FONT_MatchFont : Do not try every size of a font family if the
	family does not exist.

	* [windows/event.c]
	lastEventChar hack removed.
	KeyStateTable replaced by InputKeyStateTable (maintained in event.c)
	and QueueKeyStateTable (maintained in message.c).
	EVENT_key : Corrections to the extended bit setting.

	* [windows/message.c] [windows/keyboard.c]
	Implementation of a new QueueKeyStateTable : table of key states
	valid when messages are retrieved by GetMessage or PeekMessage,
	and valid for TranslateMessage.
	TranslateMessage : Convert WM*KEY messages using QueueKeyStateTable
	and ToAscii.
	
Mon Nov 18 16:59:01 1996  Robert Pouliot <krynos@clic.net>

	* [graphics/Makefile.in] [graphics/wing.c]
	  [if1632/wing.spec]
	Some functions for WinG support, mostly empty stubs.

	* [misc/crtdll.c] [if1632/crtdll.spec]
	Many functions added to CRTDLL, mostly calls to Unix C library.
diff --git a/loader/main.c b/loader/main.c
index ada2934..8cac976 100644
--- a/loader/main.c
+++ b/loader/main.c
@@ -149,11 +149,11 @@
     if (!KERN32_Init()) return 0;
 
       /* Create system message queue */
-    queueSize = GetProfileInt( "windows", "TypeAhead", 120 );
+    queueSize = GetProfileInt32A( "windows", "TypeAhead", 120 );
     if (!QUEUE_CreateSysMsgQueue( queueSize )) return 0;
 
     /* Set double click time */
-    SetDoubleClickTime( GetProfileInt( "windows", "DoubleClickSpeed", 452 ) );
+    SetDoubleClickTime( GetProfileInt32A("windows","DoubleClickSpeed",452) );
 
     return 1;
 }
diff --git a/loader/module.c b/loader/module.c
index 5707003..3866137 100644
--- a/loader/module.c
+++ b/loader/module.c
@@ -1290,6 +1290,7 @@
 {
     NE_MODULE *pModule;
 
+    if (!hModule) hModule = GetCurrentTask();
     hModule = GetExePtr( hModule );  /* In case we were passed an hInstance */
     if (!(pModule = MODULE_GetPtr( hModule ))) return 0;
     lstrcpyn32A( lpFileName, NE_MODULE_NAME(pModule), nSize );
@@ -1407,7 +1408,8 @@
 	{
 	    /* Check that the original file name did not have a suffix */
 	    p = strrchr(filename, '.');
-	    if (!p || (strchr(p, '/') && strchr(p, '\\')))
+	    /* if there is a '.', check if either \ OR / follow */
+	    if (!p || strchr(p, '/') || strchr(p, '\\'))
             {
                 p = filename + strlen(filename);
                 strcpy( p, ".exe" );
diff --git a/loader/signal.c b/loader/signal.c
index 8474223..d9238e3 100644
--- a/loader/signal.c
+++ b/loader/signal.c
@@ -124,14 +124,14 @@
 /**********************************************************************
  *		SIGNAL_SetHandler
  */
-static void SIGNAL_SetHandler( int sig, void (*func)() )
+static void SIGNAL_SetHandler( int sig, void (*func)(), int flags )
 {
     int ret;
     struct sigaction sig_act;
 
 #ifdef linux
     sig_act.sa_handler = func;
-    sig_act.sa_flags = SA_RESTART | SA_NOMASK;
+    sig_act.sa_flags = SA_RESTART | (flags) ? SA_NOMASK : 0;
     /* Point to the top of the stack, minus 4 just in case, and make
        it aligned  */
     sig_act.sa_restorer = 
@@ -165,6 +165,7 @@
 }
 
 extern void stop_wait(int a);
+extern void WINSOCK_sigio(int a);
 
 
 /**********************************************************************
@@ -204,18 +205,19 @@
     }
 #endif  /* __svr4__ || _SCO_DS */
     
-    SIGNAL_SetHandler( SIGALRM, (void (*)())wine_timer );
-    SIGNAL_SetHandler( SIGSEGV, (void (*)())SIGNAL_fault );
-    SIGNAL_SetHandler( SIGILL,  (void (*)())SIGNAL_fault );
-    SIGNAL_SetHandler( SIGFPE,  (void (*)())SIGNAL_fault );
-    SIGNAL_SetHandler( SIGTRAP, (void (*)())SIGNAL_trap ); /* debugger */
-    SIGNAL_SetHandler( SIGHUP,  (void (*)())SIGNAL_trap ); /* forced break */
+    SIGNAL_SetHandler( SIGALRM, (void (*)())wine_timer, 1);
+    SIGNAL_SetHandler( SIGSEGV, (void (*)())SIGNAL_fault, 1);
+    SIGNAL_SetHandler( SIGILL,  (void (*)())SIGNAL_fault, 1);
+    SIGNAL_SetHandler( SIGFPE,  (void (*)())SIGNAL_fault, 1);
+    SIGNAL_SetHandler( SIGTRAP, (void (*)())SIGNAL_trap, 1); 	/* debugger */
+    SIGNAL_SetHandler( SIGHUP,  (void (*)())SIGNAL_trap, 1); 	/* forced break */
 #ifdef SIGBUS
-    SIGNAL_SetHandler( SIGBUS,  (void (*)())SIGNAL_fault );
+    SIGNAL_SetHandler( SIGBUS,  (void (*)())SIGNAL_fault, 1);
 #endif
 #ifdef CONFIG_IPC
-    SIGNAL_SetHandler( SIGUSR2, (void (*)())stop_wait ); /* For IPC */
+    SIGNAL_SetHandler( SIGUSR2, (void (*)())stop_wait, 1); 	/* For IPC */
 #endif
+    SIGNAL_SetHandler( SIGIO,   (void (*)())WINSOCK_sigio, 0); 
     return TRUE;
 }
 
@@ -239,4 +241,19 @@
     setitimer(ITIMER_REAL, &vt_timer, NULL);
 }
 
+/**********************************************************************
+ *              SIGNAL_MaskAsyncEvents
+ */
+void SIGNAL_MaskAsyncEvents( BOOL32 flag )
+{
+  sigset_t 	set;
+  sigemptyset(&set);
+  sigaddset(&set, SIGIO);
+  sigaddset(&set, SIGUSR1);
+#ifdef CONFIG_IPC
+  sigaddset(&set, SIGUSR2);
+#endif
+  sigprocmask( (flag) ? SIG_BLOCK : SIG_UNBLOCK , &set, NULL);
+}
+
 #endif /* ifndef WINELIB */
diff --git a/loader/task.c b/loader/task.c
index 97b2ac3..d55e252 100644
--- a/loader/task.c
+++ b/loader/task.c
@@ -67,6 +67,7 @@
 #endif
 
 static HGLOBAL16 TASK_CreateDOSEnvironment(void);
+static void	 TASK_YieldToSystem(TDB*);
 
 /***********************************************************************
  *           TASK_Init
@@ -514,7 +515,7 @@
 
       /* Get the compatibility flags */
 
-    pTask->compat_flags = GetProfileInt( "Compatibility", name, 0 );
+    pTask->compat_flags = GetProfileInt32A( "Compatibility", name, 0 );
 
       /* Allocate a code segment alias for the TDB */
 
@@ -685,11 +686,22 @@
 
     /* Remove the task from the list to be sure we never switch back to it */
     TASK_UnlinkTask( hCurrentTask );
-    
+    if( nTaskCount )
+    {
+        TDB* p = (TDB *)GlobalLock16( hFirstTask );
+        while( p )
+        {
+            if( p->hYieldTo == hCurrentTask ) p->hYieldTo = 0;
+            p = (TDB *)GlobalLock16( p->hNext );
+        }
+    }
+
     hTaskToKill = hCurrentTask;
     hLockedTask = 0;
 
-    Yield();
+    pTask->nEvents = 0;
+    TASK_YieldToSystem(pTask);
+
     /* We should never return from this Yield() */
 
     fprintf(stderr,"Return of the living dead %04x!!!\n", hCurrentTask);
@@ -753,8 +765,9 @@
         /* check for DirectedYield() */
 
         hTask = pOldTask->hYieldTo;
-        if (!(pNewTask = (TDB *)GlobalLock16( hTask )) || !pNewTask->nEvents)
-            hTask = 0;
+        pNewTask = (TDB *)GlobalLock16( hTask );
+        if( !pNewTask || !pNewTask->nEvents) hTask = 0;
+        pOldTask->hYieldTo = 0;
     }
 
     /* extract hardware events only! */