Release 0.3.0
Fri Sep 3 11:52:18 1993 Bob Amstadt
* [windows/timer.c]
Changed to use CallWindowProc() rather directly calling callback.
* [windows/event.c]
Implemented SetCapture() and ReleaseCapture()
* [windows/keyboard.c]
Created stub for GetKeyState()
* [objects/linedda.c]
Created stub for LineDDA()
* [if1632/callback.c]
Created callback handler for LineDDA callback procedure.
* [if1632/callback.c]
Created FreeProcInstance()
Fri Sep 3 08:36:52 1993 David Metcalfe
* [loader/signal.c]
Patch to and code for INT 1A
Thu Sep 2 00:31:54 1993 Alexandre Julliard
* [objects/font.c] [objects/text.c]
More text support: implemented justification and underlining.
* [windows/clipping.c] [objects/clipping.c]
Moved low-level clipping functions to objects/clipping.c.
* [windows/clipping.c] [windows/event.c] [windows/message.c]
Implemented window update regions.
* [windows/dc.c] [objects/dcvalues.c]
Moved some device-independent DC functions to objects/dcvalues.c.
* [windows/graphics.c]
Implemented InvertRect() and GetPixel().
Sat Aug 28 08:40:23 1993 Eric Youngdale
* [include/neexe.h] [loader/wine.c]
Added code to handle relocation type 4.
* [loader/signal.h] [loader/wine.c] [loader/selector.c]
Added support for dos interrupts.
Thu 26 Aug 19:15:00 1993 Eric Youngdale
* [loader/selector.c]
Fixed bug dealing with loading DLLs.
Thu Aug 26 19:22:40 1993 Alexandre Julliard
* [include/gdi.h] [objects/font.c] [windows/dc.c]
Beginning of real font support.
* [windows/graphics.c]
Implemented PatBlt().
* [memory/global.c]
Corrected a bug with linked list handling in GlobalAlloc().
* [objects/bitmap.c]
Corrected a bug in BITMAP_SelectObject().
Tue Aug 24 19:22:40 1993 David Metcalfe
* [controls/Command*] [controls/Label*] [controls[MenuButto*]
[controls/SmeMenuButt*]
Change code to support & as a special character in menu item text.
Tue Aug 24 19:22:40 1993 Alexandre Julliard
* [include/gdi.h] [windows/dc.c]
Heavily modified the DC structure for better device-independence.
* [objects/bitmap.c]
Implemented bitmap dimensions.
* [windows/dc.c] [windows/dce.c]
Implemented DC state saving and restoring.
* [windows/dc.c]
Implemented ROP mode.
* [windows/graphics.c]
Implemented FillRect().
Mon Aug 23 22:08:34 1993 Bob Amstadt (bob at pooh)
* [misc/xt.c]
Fixed bug in InvalidateRect(). Solitaire attempted to
clear window before it was realized.
* [loader/resource.c]
Began rewrite of LoadBitmap().
* [loader/wine.c]
Fixed code which set Argv and Argc global variables.
* [loader/selector.c]
Added code to set up command line arguments.
* [include/neexe.h]
Fixed error in PSP structure.
Tue Aug 17 20:41:12 1993 Alexandre Julliard
* [include/gdi.h] [windows/dc.c]
Implemented device capabilities.
* [objects/region.c]
Implemented EqualRgn() and CombineRgn().
* [windows/clipping.c]
Implemented Save/RestoreVisRgn().
* [windows/graphics.c]
Implemented PaintRgn() and FillRgn().
* [windows/mapping.c]
Implemented mapping modes.
Tue Aug 10 14:07:38 1993 Alexandre Julliard
* [if1632/user.spec] [misc/rect.c]
Implemented rectangle API functions.
* [if1632/gdi.spec] [include/gdi.h] [objects/region.c]
Implemented regions.
* [windows/class.c]
Corrected a typo in UnregisterClass().
* [windows/clipping.c] [windows/dc.c]
Implemented DC clipping and visible region.
Tue Aug 10 20:57:56 1993 Bob Amstadt (bob at pooh)
* [controls/menu.c] [windows/win.c]
SetMenu(), GetMenu(), CheckMenuItem() implemented
Thu Aug 5 22:33:22 1993 Bob Amstadt (bob at pooh)
* [controls/menu.c] [windows/win.c]
Many improvements menus. LoadMenu() should work.
Wed Aug 4 14:55:36 1993 Alexandre Julliard
* [objects/dib.c]
Started the implementation of device-independent bitmaps.
* [objects/bitmap.c]
Added support for multiple bitmap depths.
* [objects/brush.c]
Implemented pattern brushes.
* [windows/dc.c] [windows/graphics.c]
Implemented some GDI graphics primitives.
Tue Aug 3 21:16:47 1993 Bob Amstadt (bob at pooh)
* [controls/menu.c] [windows/win.c] [include/menu.h]
Code to load class menus from executable file.
* [if1632/user.spec]
Fixed specification of SendMessage() and PostMessage.
Mon Jul 26 21:53:24 1993 Alexandre Julliard
* [if1632/call.S]
Corrected a bug in KERNEL_InitTask().
* [include/windows.h]
Added a lot of constants.
* [loader/selector.c]
Corrected a bug in segment allocation in CreateSelectors().
* [objects/bitmap.c]
Implemented SelectObject() for bitmaps.
* [objects/brush.c]
Implemented hatched brushes and SelectObject().
* [objects/gdiobj.c]
Removed linked list (not needed).
* [objects/palette.c]
Implemented system palette creation and misc. palette API functions.
* [windows/timer.c]
Implemented timers.
* [windows/dc.c]
Implemented memory device contexts.
Tue Jul 20 10:38:59 1993 Bob Amstadt (bob at pooh)
* [dos.c]
Split DOS3Call() out of kernel.c. Added support for get date
and time functions.
* [call.S]
Added function ReturnFromRegisterFunc() to allow DOS calls
to return values in registers.
* [regfunc.h]
Macros to access registers saved on stack.
Tue Jul 20 10:38:59 1993 Alexandre Julliard
* [win.c]
Corrected allocation of the WM_CREATE data structure.
* [dce.c] [dce.h]
Implemented DCE handling.
* [bitmap.c] [brush.c] [dc.c] [font.c] [gdi.h] [gdi.spec]
[gdiobj.c] [palette.c] [pen.c]
Implemented the GDI objects data structures and allocation.
* [windows.h]
Added several structures and constants for GDI objects.
Mon Jul 19 12:51:10 1993 Bob Amstadt (bob at pooh)
* [ldtlib.c]
Modified system calls to match Linus' new interface for
the LDT modification.
* [win.c]
Fixed bug with WM_CREATE message.
* [heap.c] [kernel.spec]
Completed local heap allocation functions.
* [global.c]
Created function GlobalQuickAlloc() for easy allocation from DLLs
diff --git a/windows/class.c b/windows/class.c
new file mode 100644
index 0000000..2cb42ec
--- /dev/null
+++ b/windows/class.c
@@ -0,0 +1,187 @@
+/*
+ * Window classes functions
+ *
+ * Copyright 1993 Alexandre Julliard
+ */
+
+static char Copyright[] = "Copyright Alexandre Julliard, 1993";
+
+#include "class.h"
+#include "user.h"
+#include "win.h"
+
+
+static HCLASS firstClass = 0;
+
+
+/***********************************************************************
+ * CLASS_FindClassByName
+ *
+ * Return a handle and a pointer to the class.
+ */
+HCLASS CLASS_FindClassByName( char * name, CLASS **ptr )
+{
+ HCLASS class = firstClass;
+ while(class)
+ {
+ *ptr = (CLASS *) USER_HEAP_ADDR(class);
+ if (!strcmp( (*ptr)->wc.lpszClassName, name )) return class;
+ class = (*ptr)->hNext;
+ }
+ return 0;
+}
+
+/***********************************************************************
+ * CLASS_FindClassPtr
+ *
+ * Return a pointer to the CLASS structure corresponding to a HCLASS.
+ */
+CLASS * CLASS_FindClassPtr( HCLASS hclass )
+{
+ CLASS * ptr;
+
+ if (!hclass) return NULL;
+ ptr = (CLASS *) USER_HEAP_ADDR( hclass );
+ if (ptr->wMagic != CLASS_MAGIC) return NULL;
+ return ptr;
+}
+
+
+/***********************************************************************
+ * RegisterClass (USER.57)
+ */
+ATOM RegisterClass( LPWNDCLASS class )
+{
+ CLASS * newClass;
+ HCLASS handle;
+
+#ifdef DEBUG_CLASS
+ printf( "RegisterClass: wndproc=%08x hinst=%d name='%s'\n",
+ class->lpfnWndProc, class->hInstance, class->lpszClassName );
+#endif
+
+ handle = USER_HEAP_ALLOC( GMEM_MOVEABLE, sizeof(CLASS)+class->cbClsExtra );
+ if (!handle) return 0;
+ newClass = (CLASS *) USER_HEAP_ADDR( handle );
+ newClass->hNext = firstClass;
+ newClass->wMagic = CLASS_MAGIC;
+ newClass->atomName = handle; /* Should be an atom */
+ newClass->hDCE = 0; /* Should allocate a DCE if needed */
+ newClass->cWindows = 0;
+ newClass->wc = *class;
+
+ /* Class name should also be set to zero. For now we need the
+ * name because we don't have atoms.
+ */
+ newClass->wc.lpszClassName = (char *)malloc(strlen(class->lpszClassName)+1);
+ strcpy( newClass->wc.lpszClassName, class->lpszClassName );
+
+ if (class->cbClsExtra) memset( newClass->wExtra, 0, class->cbClsExtra );
+
+ firstClass = handle;
+ return handle; /* Should be an atom */
+}
+
+
+/***********************************************************************
+ * UnregisterClass (USER.403)
+ */
+BOOL UnregisterClass( LPSTR className, HANDLE instance )
+{
+ HANDLE class, next, prevClass;
+ CLASS * classPtr, * prevClassPtr;
+
+ /* Check if we can remove this class */
+ class = CLASS_FindClassByName( className, &classPtr );
+ if (!class) return FALSE;
+ if ((classPtr->wc.hInstance != instance) || (classPtr->cWindows > 0))
+ return FALSE;
+
+ /* Remove the class from the linked list */
+ if (firstClass == class) firstClass = classPtr->hNext;
+ else
+ {
+ for (prevClass = firstClass; prevClass; prevClass=prevClassPtr->hNext)
+ {
+ prevClassPtr = (CLASS *) USER_HEAP_ADDR(prevClass);
+ if (prevClassPtr->hNext == class) break;
+ }
+ if (!prevClass)
+ {
+ printf( "ERROR: Class list corrupted\n" );
+ return FALSE;
+ }
+ prevClassPtr->hNext = classPtr->hNext;
+ }
+
+ USER_HEAP_FREE( class );
+ return TRUE;
+}
+
+
+/***********************************************************************
+ * GetClassWord (USER.129)
+ */
+WORD GetClassWord( HWND hwnd, short offset )
+{
+ return (WORD)GetClassLong( hwnd, offset );
+}
+
+
+/***********************************************************************
+ * SetClassWord (USER.130)
+ */
+WORD SetClassWord( HWND hwnd, short offset, WORD newval )
+{
+ CLASS * classPtr;
+ WND * wndPtr;
+ WORD retval = 0;
+
+ if (!(wndPtr = WIN_FindWndPtr( hwnd ))) return 0;
+ if ((classPtr = CLASS_FindClassPtr( wndPtr->hClass )))
+ {
+ WORD * ptr = (WORD *)(((char *)classPtr->wExtra) + offset);
+ retval = *ptr;
+ *ptr = newval;
+ }
+ GlobalUnlock( hwnd );
+ return retval;
+}
+
+
+/***********************************************************************
+ * GetClassLong (USER.131)
+ */
+LONG GetClassLong( HWND hwnd, short offset )
+{
+ CLASS * classPtr;
+ WND * wndPtr;
+ LONG retval = 0;
+
+ if (!(wndPtr = WIN_FindWndPtr( hwnd ))) return 0;
+ if ((classPtr = CLASS_FindClassPtr( wndPtr->hClass )))
+ retval = *(LONG *)(((char *)classPtr->wExtra) + offset);
+ GlobalUnlock( hwnd );
+ return retval;
+}
+
+
+/***********************************************************************
+ * SetClassLong (USER.132)
+ */
+LONG SetClassLong( HWND hwnd, short offset, LONG newval )
+{
+ CLASS * classPtr;
+ WND * wndPtr;
+ LONG retval = 0;
+
+ if (!(wndPtr = WIN_FindWndPtr( hwnd ))) return 0;
+ if ((classPtr = CLASS_FindClassPtr( wndPtr->hClass )))
+ {
+ LONG * ptr = (LONG *)(((char *)classPtr->wExtra) + offset);
+ retval = *ptr;
+ *ptr = newval;
+ }
+ GlobalUnlock( hwnd );
+ return retval;
+}