4. decide which way to use run loop (See ALTERNATIVE_RUN_LOOP in openbox.m).

GNUstep window protocol

1. XSizeHints - XSetWMNormalHints() - window
2. XWMHints - XSetWMHints() - APP_ROOT - window
3. MwmHints ("_MOTIF_WM_HINTS") - XChangeProperty(), window
4. XClassHint - XSetClassHint() - APP_ROOT, window
5. - XSetWMName() - APP_ROOT, window
6. - XSetWMIconName() - APP_ROOT, window
7. - XSetCommand() - APP_ROOT
8. - XSetWMClientMachine() - APP_ROOT
9. GNUstepWMAttributes ("_GNUSTEP_WM_ATTR") - XChangeProperty() - APP_ROOT, window
10. ("_NET_WM_PID") - XChangeProperty() - APP_ROOT.
11. ("_NET_WM_ICON") - XChangeProperty() - window
12. - XSetWindowBackground() - window

Bugs

6. Need to port AZStartup again, and non-intrusive window adding in AZStacking.
5. For application which cannot save itself (like xterm),
   openbox save the state for them.
   If state is saved before, then application is closed,
   then logout without save state, openbox will still try to save state.
   And because the application is closed, no state is actually saved.
   But session manager still remember these applications are saved
   for the first time and try to open it when login.
   So they will be opened without state from openbox.
4. Session doesn't work because when Azalea starts,
   the environment is not set by GNUstep.sh yet.
2. While change number of desktop without reconfigure,
   it will crash while trying to switch desktop through menu syste.
   No problem to switch via keyboard.
   (This is a bug from openbox. It crashes in [AZScreen -updateDesktopNames]).
