goals: openbox3 is supposed to be a wm shell, in that it offers a window management core, and you are able to make it look however you want by writing theme engines. versioning: im kinda thinking of openbox3 as being a product on its own, and then future additions to it going as 3.x, instead of the crazy fast number system we've adhered to so far. openbox4 would be an entirely new product as well. Maybe not to the extent that 3 will be, but significantly different. If we ever even got to that point, 3.x could live forever! :) source heirarchy: openbox3/ rules/ architechture/platform specific Makefile rules po/ translations into every language known to man, even klingon! libob3/ classes which wrap obtool functionality, this is our toolkit (builds a separate .la) src/ the window manager util/ utility classes/functions (Rect, itostring, etc) engines/ abstract interface and common code for the engines simple/ initial testbed. renders a simple hardcoded decroation style blackbox/ renders blackbox themes (bsetroot/bsetbg in here? no. fuck that) gl/ renders insane gl themes pixmap/ renders some sort of pixmap themes. a less generic name might be nice. (?) sawfish/ renders sawfish themes (?) gfxcore/ base gfx stuff for all to use (BColor, etc) gl/ code for drawing gl stuff pixmap/ code for drawing pixmaps coding practices: braces for if's/etc's shall go like this: if () { } but, braces for funtions/classes/structs shall go like this: class foo { } and void func() { } thou shalt not 'cvs commit' without reading your 'cvs diff' first indentation: 2 spaces (NO TABS). just like the ob2 format. use const everywhere. pass pointer variables to functions as const. we will be using doxygen to build documentation for the source code. *every* function must have a doxygen comment for it. misc: the libob external header(s) and the engine interface header need to be installed to the system include/ dir make sure that obtools can render things with the current engine! im going to write our own configure script! see if that works out. It will use the rules directory to support all these fun platforms. use GNU gettext for translation/nls support. See: http://www.gnu.org/manual/gettext/html_chapter/gettext_10.html#SEC141 for its config, it will use $prefix/share/openbox/rc3 and ~/.openbox/rc3 unsigned is the DEVIL. we will use signed variables EVERYWHERE. Xlib unsigned's should be converted to a signed long. If int isn't big enough for your data, than use a long. src: everything will be event based. When you tell ob3 to add a workspace, it will simply send the client message the same way an external app does. This way there is only 1 code path for any process, not one for internally and one for externally generated actions. fuck workspace classes. all windows will exist in a screen list, and any per- workspace processing can be done by checking each window's workspace() value. in each screen, have a list of the windows on the currently visible workspace. This is updated when the workspace changes, or when windows are moved between workspaces. do we provide a callback interface from the plugins for when they catch mouse input on the decorations? we should make some way to make mouse input std across engines dockapp support as good as wmaker click-drag menus like wmaker/pwm/etc allow for 'session management' of a sort. let the wm remember a window's position/size/other attributes if they are saved by the user (window menu or something). this is especially important for dockapps to be cool on shutdown, first try to close each window with a normal close message. there should be a timeout for this, and then kill it hard after the timeout/with a dialog/whatever. This should be a separate option from normal exit, and it should not do this from catching a signal. for FocusIn/Out and Enter/LeaveNotify events, dont act on them immediately. Rather, save which window's focused/entered until the queue is empty, then if the focused/entered window has changed, act on it. This will be mad fast. Do the same for changing workspaces. keybindings. inside. final. god damn. i dont need 2 copies of the window manager running, one just grabbing keys. mouse gestures! resizing modes (support one of these) old style like now but without the server grab old style like now but creating windows which show the bars so no grab is needed opaque mode opaque mode where the frame resizes, and the client is resized aferwards (i dont like this) menus should have a most-recently or most-frequently chosen items section. engines: each engine builds as a separate .so library. they are opened by the src/ and libob/ code. engines will be passed any number of screens, and must deal with them all with a single instance. engines must get events for most everything so they can be cool you can run a different engine on each screen (most people wont want GL on their second screen without accel!) engines are responsible for creating all of the appropriate decor windows engines must tell the wm how big the decorations are at all times and keep it updated for things like gravity. all engines will have to inherit from an abstract interface defined in the engines/ dir. there will be 2 abstact interfaces. the "lower power" mode, and the "full power mode". The engines must each inherit from both interfaces for the window manager and obtools to work. normally, an engine would setup the root window, window borders, timers, etc for everything involved in decorating windows. But also, it needs to be able to run in a slimmed mode that mostly consists of paintSurface() (the same way the menus are painted probably!). This would then be used by client apps like obtoolbar. These 2 modes are the "low power" and "full power" interfaces described above. tool engine: FillSurface DrawBitmap (button pictures, such as X) main engine: DecorateWindow etc :)