KERNEL MODULE
=============

...

GDI MODULE
==========

...

USER MODULE
===========

USER implements windowing and messaging subsystems. It also 
contains code for common controls and for other miscellaneous 
stuff (rectangles, clipboard, WNet, etc). Wine USER code is 
located in windows/, controls/, and misc/ directories.

1. Windowing subsystem

   windows/win.c
   windows/winpos.c

   Windows are arranged into parent/child hierarchy with one
   common ancestor for all windows (desktop window). Each window
   structure contains a pointer to the immediate ancestor (parent 
   window if WS_CHILD style bit is set), a pointer to the sibling 
   (returned by GetWindow(..., GW_NEXT)), a pointer to the owner 
   window (set only for popup window if it was created with valid 
   hwndParent parameter), and a pointer to the first child
   window (GetWindow(.., GW_CHILD)). All popup and non-child windows
   are therefore placed in the first level of this hierarchy and their
   ancestor link (wnd->parent) points to the desktop window.

   Desktop window			- root window
    |     \      `-.
    |      \        `-.
   popup -> wnd1  ->  wnd2		- top level windows    
    |       \   `-.      `-.
    |        \     `-.      `-.
   child1  child2 -> child3  child4     - child windows
  
   Horizontal arrows denote sibling relationship, vertical lines
   - ancestor/child. To summarize, all windows with the same immediate 
   ancestor are sibling windows, all windows which do not have desktop 
   as their immediate ancestor are child windows. Popup windows behave
   as topmost top-level windows unless they are owned. In this case the
   only requirement is that they must precede their owners in the top-level 
   sibling list (they are not topmost). Child windows are confined to the
   client area of their parent windows (client area is where window gets
   to do its own drawing, non-client area consists of caption, menu, borders,
   intrinsic scrollbars, and minimize/maximize/close/help buttons). 
  
   Another fairly important concept is "z-order". It is derived from
   the ancestor/child hierarchy and is used to determine "above/below"
   relationship. For instance, in the example above, z-order is
   child1->popup->child2->child3->wnd1->child4->wnd2->desktop. Current 
   active window ("foreground window" in Win32) is moved to the front
   of z-order unless its top-level ancestor owns popup windows.

   All these issues are dealt with (or supposed to be) in 
   windows/winpos.c

   Wine specifics: in default and managed mode each top-level window
   gets its own X counterpart with desktop window being basically a 
   fake stub. In desktop mode, however, only desktop window has an X
   window associated with it.

2. Visible region, clipping region and update region

   windows/dce.c
   windows/winpos.c
   windows/painting.c

    ________________________
   |_________               |  A and B are child windows of C
   |    A    |______        | 
   |         |      |       |
   |---------'      |       |
   |   |      B     |       |
   |   |            |       |
   |   `------------'       |
   |                   C    |
   `------------------------'

   Visible region determines which part of the window is not obscured
   by other windows. If a window has the WS_CLIPCHILDREN style then all
   areas below its children are considered invisible. Similarily, if
   the WS_CLIPSIBLINGS bit is in effect then all areas obscured by its
   siblings are invisible. Child windows are always clipped by the 
   boundaries of their parent windows.

   B has a WS_CLIPSIBLINGS style:
   .          ______ 
   :         |      |
   |   ,-----'      |
   |   |      B     | - visible region of B
   |   |            |
   :   `------------'
    
   When the program requests a display context (DC) for a window it 
   can specify an optional clipping region that further restricts the 
   area where the graphics output can appear. This area is calculated 
   as an intersection of the visible region and a clipping region. 

   Program asked for a DC with a clipping region:
          ______
      ,--|--.   |     .    ,--. 
   ,--+--'  |   |     :   _:  |
   |  |   B |   |  => |  |    | - DC region where the painting will
   |  |     |   |     |  |    |   be visible
   `--|-----|---'     :  `----'
      `-----'

   When the window manager detects that some part of the window 
   became visible it adds this area to the update region of this
   window and then generates WM_ERASEBKGND and WM_PAINT messages. 
   In addition, WM_NCPAINT message is sent when the uncovered area 
   intersects a nonclient part of the window. Application must reply 
   to the WM_PAINT message by calling BeginPaint()/EndPaint() pair of
   functions. BeginPaint() returns a DC that uses accumulated update 
   region as a clipping region. This operation cleans up invalidated
   area and the window will not receive another WM_PAINT until the
   window manager creates a new update region.

   A was moved to the left:
    ________________________       ...          / C update region
   |______                  |     :      .___ /
   | A    |_________        |  => |   ...|___|..
   |      |         |       |     |   :  |   |
   |------'         |       |     |   :  '---' 
   |   |      B     |       |     |   :      \
   |   |            |       |     :            \
   |   `------------'       |                    B update region
   |                   C    |
   `------------------------'


   Windows maintains a display context cache consisting of entries that 
   include DC itself, window to which it belongs, and an optional clipping 
   region (visible region is stored in the DC itself). When an API call 
   changes the state of the window tree, window manager has to go through 
   the DC cache to recalculate visible regions for entries whose windows 
   were involved in the operation. DC entries (DCE) can be either private
   to the window, or private to the window class, or shared between all 
   windows. Windows 3.1 limits the number of shared DCEs to 5. 

3. Messaging subsystem

   windows/queue.c
   windows/message.c

   Each Windows task/thread has its own message queue - this is where
   it gets messages from. Messages can be generated on the fly
   (WM_PAINT, WM_NCPAINT, WM_TIMER), they can be created by the system
   (hardware messages), they can be posted by other tasks/threads
   (PostMessage), or they can be sent by other tasks/threads (SendMessage).
   
   Message priority:

   First the system looks for sent messages, then for posted messages,
   then for hardware messages, then it checks if the queue has the
   "dirty window" bit set, and, finally, it checks for expired
   timers. See windows/message.c.

   From all these different types of messages, only posted messages go
   directly into the private message queue. System messages (even in
   Win95) are first collected in the system message queue and then
   they either sit there until Get/PeekMessage gets to process them
   or, as in Win95, if system queue is getting clobbered, a special
   thread ("raw input thread") assigns them to the private
   queues. Sent messages are queued separately and the sender sleeps
   until it gets a reply. Special messages are generated on the fly
   depending on the window/queue state. If the window update region is
   not empty, the system sets the QS_PAINT bit in the owning queue and
   eventually this window receives a WM_PAINT message (WM_NCPAINT too
   if the update region intersects with the non-client area). A timer
   event is raised when one of the queue timers expire. Depending on
   the timer parameters DispatchMessage either calls the callback
   function or the window procedure. If there are no messages pending
   the task/thread sleeps until messages appear.

   There are several tricky moments (open for discussion) - 

    a) System message order has to be honored and messages should be
       processed within correct task/thread context. Therefore when
       Get/PeekMessage encounters unassigned system message and this
       message appears not to be for the current task/thread it should
       either skip it (or get rid of it by moving it into the private
       message queue of the target task/thread - Win95, AFAIK) and
       look further or roll back and then yield until this message
       gets processed when system switches to the correct context
       (Win16). In the first case we lose correct message ordering, in
       the second case we have the infamous synchronous system message
       queue. Here is a post to one of the OS/2 newsgroup I found to
       be relevant:

	" Here's the problem in a nutshell, and there is no good solution.
	Every possible solution creates a different problem.

	With a windowing system, events can go to many different windows.
	Most are sent by applications or by the OS when things relating to
	that window happen (like repainting, timers, etc.)

	Mouse input events go to the window you click on (unless some window
	captures the mouse).

	So far, no problem.  Whenever an event happens, you put a message on
	the target window's message queue.  Every process has a message
	queue.  If the process queue fills up, the messages back up onto the
	system queue.

	This is the first cause of apps hanging the GUI.  If an app doesn't
	handle messages and they back up into the system queue, other apps
	can't get any more messages.  The reason is that the next message in
	line can't go anywhere, and the system won't skip over it.
	
	This can be fixed by making apps have bigger private message queues.
	The SIQ fix does this.  PMQSIZE does this for systems without the SIQ
	fix.  Applications can also request large queues on their own.

	Another source of the problem, however, happens when you include
	keyboard events.  When you press a key, there's no easy way to know
	what window the keystroke message should be delivered to.

	Most windowing systems use a concept known as "focus".  The window
	with focus gets all incoming keyboard messages.  Focus can be changed
	from window to window by apps or by users clicking on winodws.

	This is the second source of the problem.  Suppose window A has focus.
	You click on window B and start typing before the window gets focus.
	Where should the keystrokes go?  On the one hand, they should go to A
	until the focus actually changes to B.  On the other hand, you
	probably want the keystrokes to go to B, since you clicked there
	first.

	OS/2's solution is that when a focus-changing event happens (like
	clicking on a window), OS/2 holds all messages in the system queue
	until the focus change actually happens.  This way, subsequent
	keystrokes go to the window you clicked on, even if it takes a while
	for that window to get focus.

	The downside is that if the window takes a real long time to get focus
	(maybe it's not handling events, or maybe the window losing focus
	isn't handling events), everything backs up in the system queue and
	the system appears hung.

	There are a few solutions to this problem.

	One is to make focus policy asynchronous.  That is, focus changing has
	absolutely nothing to do with the keyboard.  If you click on a window
	and start typing before the focus actually changes, the keystrokes go
	to the first window until focus changes, then they go to the second.
	This is what X-windows does.

	Another is what NT does.  When focus changes, keyboard events are held
	in the system message queue, but other events are allowed through.
	This is "asynchronous" because the messages in the system queue are
	delivered to the application queues in a different order from that
	with which they were posted.  If a bad app won't handle the "lose
	focus" message, it's of no consequence - the app receiving focus will
	get its "gain focus" message, and the keystrokes will go to it.

	The NT solution also takes care of the application queue filling up
	problem.  Since the system delivers messages asynchronously, messages
	waiting in the system queue will just sit there and the rest of the
	messages will be delivered to their apps.

	The OS/2 SIQ solution is this:  When a focus-changing event happens,
	in addition to blocking further messages from the application queues,
	a timer is started.  When the timer goes off, if the focus change has
	not yet happened, the bad app has its focus taken away and all
	messages targetted at that window are skipped.  When the bad app
	finally handles the focus change message, OS/2 will detect this and
	stop skipping its messages.


	As for the pros and cons:

	The X-windows solution is probably the easiest.  The problem is that
	users generally don't like having to wait for the focus to change
	before they start typing.  On many occasions, you can type and the
	characters end up in the wrong window because something (usually heavy
	system load) is preventing the focus change from happening in a timely
	manner.
	
	The NT solution seems pretty nice, but making the system message queue
	asynchronous can cause similar problems to the X-windows problem.
	Since messages can be delivered out of order, programs must not assume
	that two messages posted in a particular order will be delivered in
	that same order.  This can break legacy apps, but since Win32 always
	had an asynchronous queue, it is fair to simply tell app designers
	"don't do that".  It's harder to tell app designers something like
	that on OS/2 - they'll complain "you changed the rules and our apps
	are breaking."
	
	The OS/2 solution's problem is that nothing happens until you try to
	change window focus, and then wait for the timeout.  Until then, the
	bad app is not detected and nothing is done." (by David Charlap)
	

    b) Intertask/interthread SendMessage. The system has to inform the
       target queue about the forthcoming message, then it has to carry 
       out the context switch and wait until the result is available.  
       Win16 stores necessary parameters in the queue structure and then 
       calls DirectedYield() function.  However, in Win32 there could be 
       several messages pending sent by preemptively executing threads, 
       and in this case SendMessage has to build some sort of message 
       queue for sent messages. Another issue is what to do with messages 
       sent to the sender when it is blocked inside its own SendMessage. 


