Release 0.2.0

Tue Jul 13 20:31:31 1993  Bob Amstadt  (bob at pooh)

	* [global.c]
	Completed global memory pool API

Sun Jul 11 16:59:52 1993  Alexandre Julliard

	* [message.c] [user.c] [user.spec] [windows.h]
	Added emulation of Windows message queue.

Thu Jul  8 19:29:27 1993  Bob Amstadt  (bob at pooh)

	* [build.c] Original by Bob Amstadt
	* [callback.c] Original by Bob Amstadt, updates by 
	Alexandre Julliard
	* [dump.c] Original by Bob Amstadt
	* [global.c] Original by Bob Amstadt
	* [heap.c] Original by Bob Amstadt
	* [kernel.c] Original by Bob Amstadt
	* [ldt.c] Original by Bob Amstadt
	* [ldtlib.c] Original by Bob Amstadt
	* [relay.c] Original by Bob Amstadt
	* [resource.c] Original by Bob Amstadt, updates by 
	Alexandre Juliard
	* [selector.c] Original by Bob Amstadt, updates by Eric Youngdale
	* [user.c] Original by Bob Amstadt
	* [wine.c] Original by Bob Amstadt, updates by Eric Youngdale and
	Alexandre Julliard
	* [wintcl.c] Original by Regents of the University of California,
	updates by Peter MacDonald and Alexandre Julliard
	* [callback.h] Original by Bob Amstadt
	* [dlls.h] Original by Bob Amstadt
	* [heap.h] Original by Bob Amstadt
	* [neexe.h] Original by Bob Amstadt
	* [prototypes.h] Original by Bob Amstadt, updates by 
	Eric Youngdale
	* [segmem.h] Original by Bob Amstadt
	* [tkInt.h] Original by Regents of the University of California
	* [windows.h] Original by Peter MacDonald, updates by 
	Alexandre Julliard and Bob Amstadt
	* [wine.h] Original by Eric Youngdale
	* [kernel.spec] Original by Bob Amstadt, updates by 
	Alexandre Julliard
	* [gdi.spec] Original by Bob Amstadt, updates by 
	Alexandre Julliard
	* [shell.spec] Original by Bob Amstadt
	* [unixlib.spec] Original by Bob Amstadt
	* [user.spec] Original by Bob Amstadt, updates by Alexandre Julliard
	* [win87em.spec] Original by Bob Amstadt
	* [Windows.tcl] Original by Peter MacDonald, updates by 
	Alexandre Julliard
	* [build-spec.txt] Original by Bob Amstadt
	* [if1632.S] Original by Bob Amstadt, updates by Eric Youngdale
diff --git a/event.c b/event.c
new file mode 100644
index 0000000..6e65f29
--- /dev/null
+++ b/event.c
@@ -0,0 +1,188 @@
+/*
+ * X events handling functions
+ *
+ * Copyright 1993 Alexandre Julliard
+ */
+
+static char Copyright[] = "Copyright  Alexandre Julliard, 1993";
+
+#include <X11/Intrinsic.h>
+#include <X11/StringDefs.h>
+#include <X11/Core.h>
+
+#include "windows.h"
+
+
+#define NB_BUTTONS      3     /* Windows can handle 3 buttons */
+#define DBLCLICK_TIME   300   /* Max. time for a double click (milliseconds) */
+
+
+  /* Event handlers */
+static void EVENT_expose();
+static void EVENT_key();
+static void EVENT_mouse_motion();
+static void EVENT_mouse_button();
+
+
+/***********************************************************************
+ *           EVENT_AddHandlers
+ *
+ * Add the event handlers to the given window
+ */
+void EVENT_AddHandlers( Widget w, int hwnd )
+{
+    XtAddEventHandler(w, ExposureMask, FALSE,
+		      EVENT_expose, (XtPointer)hwnd );
+    XtAddEventHandler(w, KeyPressMask | KeyReleaseMask, FALSE, 
+		      EVENT_key, (XtPointer)hwnd );
+    XtAddEventHandler(w, PointerMotionMask, FALSE,
+		      EVENT_mouse_motion, (XtPointer)hwnd );
+    XtAddEventHandler(w, ButtonPressMask | ButtonReleaseMask, FALSE,
+		      EVENT_mouse_button, (XtPointer)hwnd );
+}
+
+
+/***********************************************************************
+ *           EVENT_RemoveHandlers
+ *
+ * Remove the event handlers of the given window
+ */
+void EVENT_RemoveHandlers( Widget w, int hwnd )
+{
+    XtRemoveEventHandler(w, ExposureMask, FALSE,
+			 EVENT_expose, (XtPointer)hwnd );
+    XtRemoveEventHandler(w, KeyPressMask | KeyReleaseMask, FALSE, 
+			 EVENT_key, (XtPointer)hwnd );
+    XtRemoveEventHandler(w, PointerMotionMask, FALSE,
+			 EVENT_mouse_motion, (XtPointer)hwnd );
+    XtRemoveEventHandler(w, ButtonPressMask | ButtonReleaseMask, FALSE,
+			 EVENT_mouse_button, (XtPointer)hwnd );
+}
+
+
+/***********************************************************************
+ *           EVENT_XStateToKeyState
+ *
+ * Translate a X event state (Button1Mask, ShiftMask, etc...) to
+ * a Windows key state (MK_SHIFT, MK_CONTROL, etc...)
+ */
+static WORD EVENT_XStateToKeyState( int state )
+{
+    int kstate = 0;
+    
+    if (state & Button1Mask) kstate |= MK_LBUTTON;
+    if (state & Button2Mask) kstate |= MK_MBUTTON;
+    if (state & Button3Mask) kstate |= MK_RBUTTON;
+    if (state & ShiftMask)   kstate |= MK_SHIFT;
+    if (state & ControlMask) kstate |= MK_CONTROL;
+    return kstate;
+}
+
+
+/***********************************************************************
+ *           EVENT_expose
+ *
+ * Handle a X expose event
+ */
+static void EVENT_expose( Widget w, int hwnd, XEvent *event,
+			  Boolean *cont_dispatch )
+{
+    MSG msg;
+    XExposeEvent * expEvt = (XExposeEvent *)expEvt;
+    
+    msg.hwnd    = hwnd;
+    msg.message = WM_PAINT;
+    msg.wParam  = 0;
+    msg.lParam  = 0;
+    msg.time = 0;
+    msg.pt.x = 0;
+    msg.pt.y = 0;
+            
+    MSG_AddMsg( &msg, 0 );
+}
+
+
+/***********************************************************************
+ *           EVENT_key
+ *
+ * Handle a X key event
+ */
+static void EVENT_key( Widget w, int hwnd, XKeyEvent *event,
+		       Boolean *cont_dispatch )
+{
+    MSG msg;
+    
+    msg.hwnd    = hwnd;
+    msg.message = (event->type == KeyRelease) ? WM_KEYUP : WM_KEYDOWN;
+    msg.wParam  = 0;
+    msg.lParam  = (event->x & 0xffff) | (event->y << 16);
+    msg.time = event->time;
+    msg.pt.x = event->x & 0xffff;
+    msg.pt.y = event->y & 0xffff;
+    
+    MSG_AddMsg( &msg );    
+}
+
+
+/***********************************************************************
+ *           EVENT_mouse_motion
+ *
+ * Handle a X mouse motion event
+ */
+static void EVENT_mouse_motion( Widget w, int hwnd, XMotionEvent *event, 
+			        Boolean *cont_dispatch )
+{
+    MSG msg;
+    
+    msg.hwnd    = hwnd;
+    msg.message = WM_MOUSEMOVE;
+    msg.wParam  = EVENT_XStateToKeyState( event->state );
+    msg.lParam  = (event->x & 0xffff) | (event->y << 16);
+    msg.time = event->time;
+    msg.pt.x = event->x & 0xffff;
+    msg.pt.y = event->y & 0xffff;
+    
+    MSG_AddMsg( &msg );    
+}
+
+
+/***********************************************************************
+ *           EVENT_mouse_button
+ *
+ * Handle a X mouse button event
+ */
+static void EVENT_mouse_button( Widget w, int hwnd, XButtonEvent *event,
+			        Boolean *cont_dispatch )
+{
+    static WORD messages[3][NB_BUTTONS] = 
+    {
+	{ WM_LBUTTONDOWN, WM_MBUTTONDOWN, WM_RBUTTONDOWN },
+	{ WM_LBUTTONUP, WM_MBUTTONUP, WM_RBUTTONUP },
+        { WM_LBUTTONDBLCLK, WM_MBUTTONDBLCLK, WM_RBUTTONDBLCLK }
+    };
+    static unsigned long lastClickTime[NB_BUTTONS] = { 0, 0, 0 };
+        
+    MSG msg;
+    int buttonNum, prevTime, type;
+    
+    buttonNum = event->button-1;
+    if (buttonNum >= NB_BUTTONS) return;
+    if (event->type == ButtonRelease) type = 1;
+    else
+    {  /* Check if double-click */
+	prevTime = lastClickTime[buttonNum];
+	lastClickTime[buttonNum] = event->time;
+	type = (event->time - prevTime < DBLCLICK_TIME) ? 2 : 0;
+    }	
+    
+    msg.hwnd    = hwnd;
+    msg.message = messages[type][buttonNum];
+    msg.wParam  = EVENT_XStateToKeyState( event->state );
+    msg.lParam  = (event->x & 0xffff) | (event->y << 16);
+    msg.time = event->time;
+    msg.pt.x = event->x & 0xffff;
+    msg.pt.y = event->y & 0xffff;
+
+    MSG_AddMsg( &msg );    
+}
+