TODO for golem
==============

- changes for plugin callbacks: right now when I want to tell all plugins about something,
  I loop through the entire list of loaded plugins and check for a function pointer in
  each one for that callback.  For something like the anim_birth callback (which is hackish
  btw, but that's a differnt subject), there's probably going to be only one plugin with a
  handler for it.  So I'm going to change out the plugin stuff to avoid unneccesary compares
  by having lists for each callback, also eliminating the need to have plugin_t's have as
  much overhead as they do (4bytes per callback).  This idea not yet fleshed out, and will
  probably wait a week or two while I do other stuffs.

- draw_zoomrects is still in the main golem code, along with winbox stuff; the winbox stuff
  must temporarily remain there until some later date when it will be hookable by plugins
  (see above), but there will probably need to be a default built into the main golem
  binary always.

- windows are getting KeyRelease events on keybindings

- freeing of workspace_t's

- all-visible style focusing is broken for 1 screen displays, and potentially for
  other situations; I'm on a 1 screen box for the next two days so I'll fix it when
  I get back to my main machine

- snapping to edges while moving

- allow a dgroup to inheirt from one or more other dgroups

- do title text colors on a per-dgroup basis; perhaps even depending on if it's focus or unfocused.
  - do render extension for title text

- window gravity stuff

- optimize the reshaping when clients are resized.  you don't need to be reshaping things on the TOP
  or LEFT that have type set to NEAR, etc, unless something is overlapping it like a FULL
  - partially done; being temporarily postponed because it's only noticable when you are running
    golem across a network; for instance to a xterminal, etc.  However, it is a goal for golem to
    work well in those conditions and thus this must be done at some point.
  - shaped decor units with type of DA_FULL are unusable.  this _must_ be fixed

- stacking support, keep on top or on bottom windows, and so forth
  - using XRestackWindows

- info windows to give geometry during resize/move.

- serious Xinerama support
  o Xinerama-aware zoom
  o Xinerama-aware placement
  o Nonplaced windows that would go across mons get placed on one mon

+ plugins
  @ plugin loader via dlopen
  o a mechanism for plugins to export apis to other plugins; so a "library" plugin
    can be loaded to provide functions for doing something that several other
    plugins would wish to use
  o plugin management plugin, to load/unload other plugins.
    - this could be semi-problematic because all the plugin parameters are
      freed after rcfile parsing.  At first I'll probably just allow
      unloading and viewing which ones are loaded...this entire idea may
      just be rolled into the following plugin:
  o ipc controlability plugin
    - plugin to allow external programs to send X ICCCM messages to the
      windowmanager to make it do stuff.  to the user this would mean
      the possibility of a shell-like program that has commands that
      tell the window manager to do stuff (a la eesh from Enlightenment).
  @ WM_CLASS-based defaults plugin
  @ root window pixmap setting plugin: to allow a theme forplug to do root window bgs
    - the wait_complete option is broken
  + gnome-compliance plugin
    o _WIN_LAYER
    o _WIN_STATE
    o _WIN_HINTS
    o _WIN_APP_STATE
    o _WIN_EXPANDED_SIZE
    o _WIN_ICONS
    o _WIN_WORKSPACE_NAMES
    @ _WIN_WORKSPACE
    @ _WIN_WORKSPACE_COUNT
    @ _WIN_AREA_COUNT
    @ _WIN_AREA
    @ _WIN_CLIENT_LIST
    @ _WIN_DESKTOP_BUTTON_PROXY
  @ rewrite menus as a plugin
    - not finished, needs some fixup, color setting, bg pixmap
  o circular menus plugin
  @ a 'dock' plugin (the pier)
  @ animations for zooming/iconification, moved into plugin
    - need support for animations to have option things.  like how fast it should
      go, or how many frames, and the like.
  @ maybe a pager
    - need some theming forplug stuff, and some other params for stuff like which
      button does what
  o maybe an iconbox
  @ some nifty eyecandy on startup plugin (ala E)
    - quite simple for now
  o manpages for plugins, with explainations of parameters

+ Key Bindings
  @ Iconification
  @ Zoom
  @ Delete
  @ Workspace Switching
  @ Run Command
  + Focus Cycling (types for multi-screen)
    @ Workspace based cycling
    @ Screen based cycling
    @ All visible windows cycling

+ Placement types
  @ No Placement
  @ Smart
  @ Random
  @ Pointer
  @ Interactivity on any type ("manual" can be done w/ this)

+ Focus types
  @ Click-to-focus
  @ Sloppy Focus
  @ Pointer Focus

Low Priority
============

- Eventually I need the whole colormap shit: I always use 24bit mode or 1bit mode so it's really
  not gonna happen until I'm good and bored.
	http://www.tigr.net/afterstep/X/xlib/color/

- shading windows.  this is a really useless thing if you have workspaces...but it looks pretty
  cool, so I'll add it at some point.

Eyecandish things
=================

- window birth animations
  @ line drawings
  o opaque

- window death animations
  @ line drawings
    - this is really lame right now
  o opaque

- line drawing styles
  @ traditional (box w/ two lines each way)
  o technical

- on resize use XChangeActivePointerGrab to change the cursor based on which edges are bound

- _maybe_ some sort of mouse cursor customization stuff, nothing as fancy as what E does, but
  perhaps something.

Other things
============

- synthetic configure notifys are supposed to sends the border width requested; and the
  coords are to be adjusted for the _requested_ border width.  icccm page 31.  I see no
  reason to do this, but I see a reason not to: aterm will put it's transparent bg ofset
  by that pixel border width it requests.  which is _not_ desired behavior.  Maybe I'm
  misreading the ICCCM here??

