This file gives some information about the code in edit.c. If you want to change, add, or fix code, please read this text. If you're not interested in doing actual work on edit.c only C & D will be of interest to you. A) basic policy B) special functions C) not implemented D) known bugs A) Basic Policy The code has been made in such a way, that functions try to call other (documented) functions if that is sufficient. This might sometimes not be the most efficient way, but it keeps the code clear. This way I tried to keep the number of functions that rely on the internal EDITSTATE structure as low as possible. For instance EDIT_WM_Cut() simply calls EDIT_WM_Copy() and EDIT_WM_Clear(). The latter two are well documented message handlers, so as long as they are right EDIT_WM_Cut() will never have to change again. Example: The best thing to do, when you want to know the offset of line 3, is calling EDIT_EM_LineIndex(). Again this is a well documented message handler. Don't look at es->LineDefs[2].offset. It would just be another reference to the internal structure, and that would make it more difficult to change things. Refer to EDIT_WM_???? and EDIT_EM_????? functions as much as possible. The WND * pointer is used internally whenever possible. Although it is not the real HWND, it improves performance enough to use it. All displaying is done by invalidating regions / rects. Only EDIT_EM_LineScroll() uses direct painting. This way things become much faster. Although sometimes the response time might appear to be slow, it would be much slower even, when everything would be painted instantly. This is especially true for scrollbar tracking and selection changes.. B) Special functions The edit control needs to use local heap memory because applications may rely on EM_GETHANDLE. This is bad, but it can't be helped, we have to live with that. For this reason there is a nice EDIT_GetPointer() function, which locks the heap buffer *only once*, no matter how often it is called. Only at the end of the message handler EDIT_ReleasePointer() is called. You don't have to worry about unlocking the heap. Calling EDIT_GetPointer() is very fast if the buffer is already locked. This way, the buffer gets locked / unlock only once every message, although EDIT_GetPointer() may actually have been called a hundred times. Only when the actual HLOCAL is needed (for example to ReAlloc), a call to EDIT_ReleasePointer() is needed. Look for instance in EDIT_MakeFit(). This brings us to EDIT_MakeFit(). It automatically re-allocates the buffer if the size parameter > buffersize. If everything is successful TRUE is returned, otherwise FALSE. Only when the buffer contents may grow you need to call EDIT_MakeFit(). Currently this is only in EDIT_ReplaceSel() and EDIT_WM_SetText(). EDIT_BuildLineDefs() is the most important function in edit.c. It builds the internal EDITSTATE structure. As soon as text *might* have changed, or when the appearance of the text on the screen *might* have changed, call this function ! This includes changes of screen size, change of the font, clipboard actions, etc. etc. Most other functions that rely on EDITSTATE, rely on the stuff this function builds. C) Not Implemented - ES_PASSWORD - ES_CENTER - ES_RIGHT - EM_SETRECT - EM_SETRECTNP - EM_FMTLINES - ES_AUTOVSCROLL (every multi line *is* auto vscroll) - ES_AUTOHSCROLL (multi line can be yes or no, but single line only yes) - WM_UNDO (=EM_UNDO) - EM_CANUNDO - EM_SCROLL (scrolling works, but this appears to be an undocumented message) - ES_LOWERCASE - ES_UPPERCASE - ES_OEMCONVERT - ES_WANTRETURN - probably much, MUCH more I encountered several undocumented messages, or message parameters. EditWndProc() reports any unknown message with an id > WM_USER. D) Known bugs. - Scrolling is weird, sometimes. The current code makes the scrollbar of Notepad work, but the scrollbar code itself is broken. Currently the scroll code of edit.c is *not* according to specs. Instead, it is according to the broken scrollbar code. If that gets fixed, this should be fixed, too. - The clipboard is broken. Whenever things go wrong with cut/copy/paste, it is probably the clipboard that messes up things, not edit.c. - Turning on WordWrap with Notepad leaves part of the horizontal scrollbar visible (problem with WM_ERASEBKGND ???). I am still very actively changing things. Especially I am working on Undo capabilities. If you want to do things, other than bug fixes, please mail me so we can synchronize. Frans van Dorsselaer dorssel@rulhm1.LeidenUniv.nl